Hey

Hey! How can I help you today?

Help me rule out this week timetable based on topics

Asking for Preferences

Psm and fmt revison week and it is 1sta ugust...so high yield based on ut

Asking for Preferences
Here's your PSM + FMT High-Yield Revision Timetable for the week of 1st August - 7th August, 7 days mixed, flexible slots:

πŸ“… PSM + FMT Revision Week | 1–7 August

Strategy: Heavy topics get morning slots (peak focus). Revision/MCQs in evening. Day 7 = full mock revision.

πŸ—“οΈ Day 1 - Friday, 1st Aug | PSM Heavy

SlotTopicFocus
MorningEpidemiologyStudy designs, Bias, RCT, Cohort, Case-control, Odds ratio, RR
AfternoonScreening & Levels of PreventionWilson's criteria, sensitivity/specificity, PPV/NPV
EveningMCQs + quick notesEpidemiology formulas

πŸ—“οΈ Day 2 - Saturday, 2nd Aug | PSM

SlotTopicFocus
MorningDemography & Vital StatisticsRates vs ratios, MMR, IMR, NMR, fertility rates, census
AfternoonNutritionPEM, vitamins, RDA, ICDS, mid-day meal, national programs
EveningEnvironment & WaterWater purification, chlorination, Imhoff tank, sewage

πŸ—“οΈ Day 3 - Sunday, 3rd Aug | PSM + FMT Start

SlotTopicFocus
MorningNational Health ProgramsNHM, RNTCP/NTEP, NVBDCP, RCH, UIP
AfternoonHealth Planning & AdministrationBhore committee, Alma Ata, PHC functions, Sub-centre norms
EveningFMT - Start: DeathManner vs cause vs mechanism, Somatic/molecular death, Rigor, Livor, Decomposition

πŸ—“οΈ Day 4 - Monday, 4th Aug | FMT Heavy

SlotTopicFocus
MorningWounds & InjuriesIncised, lacerated, contused, puncture, defence wounds, firearm wounds
AfternoonAsphyxial DeathsHanging, strangulation, drowning - signs and differentiation
EveningSexual Offences & POCSORape, examination, hymen, age estimation relevance

πŸ—“οΈ Day 5 - Tuesday, 5th Aug | FMT

SlotTopicFocus
MorningToxicology - Corrosives & IrritantsAcid/alkali injuries, DDT, Organophosphorus, atropine treatment
AfternoonToxicology - Narcotics, AlcoholEthanol metabolism, drunkenness, opium, cannabis, tolerance
EveningMedical JurisprudenceMCI/NMC, IPC sections (299, 300, 302, 319-323, 375), consent

πŸ—“οΈ Day 6 - Wednesday, 6th Aug | Mixed Revision

SlotTopicFocus
MorningPSM Weak AreasBiostatistics (mean/median/SD, normal distribution, tests), Occupational health
AfternoonFMT Weak AreasAge estimation (bone, teeth), Identification, DNA fingerprinting
EveningPrevious Year QuestionsSolve PYQs for both subjects

πŸ—“οΈ Day 7 - Thursday, 7th Aug | Full Mock Day

SlotTopicFocus
MorningPSM Full Rapid RevisionFlash through all notes/mnemonics
AfternoonFMT Full Rapid RevisionFlash through all notes/mnemonics
EveningMock Test (50 MCQs each)Timed practice, identify gaps

⭐ Top High-Yield Topics (Don't Skip)

PSM:
  • Epidemiological study designs + measures of association
  • IMR, MMR, TFR - definitions + India values
  • Vaccine cold chain, UIP schedule
  • PHC norms (population, staff, sub-centre)
  • Water quality standards + purification
  • Nutrition programs (ICDS, PEM classifications)
FMT:
  • Rigor mortis, Livor mortis timings
  • Hanging vs strangulation - signs
  • Organophosphorus poisoning + management
  • IPC sections (rape, hurt, murder, culpable homicide)
  • Wound classification
  • Age estimation (Gustafson's method, ossification)

Want me to add specific timings, or convert this into a downloadable PDF/Word timetable?

Create a PDF timetable with daily goals I can print

Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null && mkdir -p /home/daytona/workspace/psm-fmt-timetable

Writing File

~/psm-fmt-timetable/generate_timetable.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (
    SimpleDocTemplate, Table, TableStyle, Paragraph,
    Spacer, HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.pdfbase import pdfmetrics

output_path = "/home/daytona/workspace/psm-fmt-timetable/PSM_FMT_Revision_Timetable.pdf"

doc = SimpleDocTemplate(
    output_path,
    pagesize=A4,
    rightMargin=1.5*cm,
    leftMargin=1.5*cm,
    topMargin=1.5*cm,
    bottomMargin=1.5*cm
)

styles = getSampleStyleSheet()

# Custom styles
title_style = ParagraphStyle(
    'TitleStyle',
    parent=styles['Title'],
    fontSize=18,
    textColor=colors.HexColor('#1a3c5e'),
    spaceAfter=4,
    alignment=TA_CENTER,
    fontName='Helvetica-Bold'
)

subtitle_style = ParagraphStyle(
    'SubtitleStyle',
    parent=styles['Normal'],
    fontSize=10,
    textColor=colors.HexColor('#555555'),
    spaceAfter=2,
    alignment=TA_CENTER,
    fontName='Helvetica'
)

day_header_style = ParagraphStyle(
    'DayHeader',
    parent=styles['Normal'],
    fontSize=11,
    textColor=colors.white,
    fontName='Helvetica-Bold',
    alignment=TA_LEFT
)

slot_style = ParagraphStyle(
    'SlotStyle',
    parent=styles['Normal'],
    fontSize=8.5,
    textColor=colors.HexColor('#1a1a1a'),
    fontName='Helvetica-Bold',
    leading=12
)

topic_style = ParagraphStyle(
    'TopicStyle',
    parent=styles['Normal'],
    fontSize=8.5,
    textColor=colors.HexColor('#1a3c5e'),
    fontName='Helvetica-Bold',
    leading=12
)

focus_style = ParagraphStyle(
    'FocusStyle',
    parent=styles['Normal'],
    fontSize=7.5,
    textColor=colors.HexColor('#333333'),
    fontName='Helvetica',
    leading=11
)

goal_style = ParagraphStyle(
    'GoalStyle',
    parent=styles['Normal'],
    fontSize=8,
    textColor=colors.HexColor('#006400'),
    fontName='Helvetica-Bold',
    leading=11
)

section_title_style = ParagraphStyle(
    'SectionTitle',
    parent=styles['Normal'],
    fontSize=10,
    textColor=colors.HexColor('#1a3c5e'),
    fontName='Helvetica-Bold',
    spaceAfter=4,
    spaceBefore=8
)

# Color palette
PSM_COLOR   = colors.HexColor('#1a5276')   # deep blue for PSM
FMT_COLOR   = colors.HexColor('#922b21')   # deep red for FMT
MIX_COLOR   = colors.HexColor('#1e5f2a')   # dark green for mixed
MOCK_COLOR  = colors.HexColor('#4a235a')   # purple for mock day

LIGHT_PSM   = colors.HexColor('#d6eaf8')
LIGHT_FMT   = colors.HexColor('#fadbd8')
LIGHT_MIX   = colors.HexColor('#d5f5e3')
LIGHT_MOCK  = colors.HexColor('#e8daef')

ROW_ALT     = colors.HexColor('#f8f9fa')
ROW_WHITE   = colors.white

# ─────────────────────────────────────────────
# TIMETABLE DATA
# ─────────────────────────────────────────────
days = [
    {
        "date": "Day 1 - Friday, 1st August",
        "theme": "PSM HEAVY",
        "header_color": PSM_COLOR,
        "light_color": LIGHT_PSM,
        "daily_goal": "Master epidemiology study designs, association measures & screening parameters.",
        "slots": [
            ("πŸŒ… Morning", "Epidemiology",
             "Study designs (RCT, Cohort, Case-control, Cross-sectional)\nOdds Ratio, Relative Risk, Attributable Risk\nBias types, Confounding, Effect modification"),
            ("🌀 Afternoon", "Screening & Levels of Prevention",
             "Wilson's criteria for screening\nSensitivity, Specificity, PPV, NPV - calculations\nPrimary / Secondary / Tertiary prevention examples"),
            ("πŸŒ™ Evening", "MCQ Drill + Quick Notes",
             "30 MCQs on epidemiology & screening\nWrite 1-page formula sheet for all rates/ratios"),
        ]
    },
    {
        "date": "Day 2 - Saturday, 2nd August",
        "theme": "PSM - DEMOGRAPHY + NUTRITION",
        "header_color": PSM_COLOR,
        "light_color": LIGHT_PSM,
        "daily_goal": "Know all vital statistics definitions + values, and national nutrition programs cold.",
        "slots": [
            ("πŸŒ… Morning", "Demography & Vital Statistics",
             "IMR, NMR, PMR, MMR - definitions, formula, India values\nFertility rates (GFR, TFR, NRR)\nCensus 2011 key data, demographic cycle"),
            ("🌀 Afternoon", "Nutrition",
             "PEM - Kwashiorkor vs Marasmus, Gomez/IAP classification\nVitamins: A, D, B12, C deficiency diseases + RDA\nICDS scheme, Mid-Day Meal, POSHAN Abhiyan"),
            ("πŸŒ™ Evening", "Environment & Water",
             "Water purification methods, chlorination (breakpoint)\nIMHOFF tank, oxidation pond, sewage treatment\nNoise, air, radiation standards"),
        ]
    },
    {
        "date": "Day 3 - Sunday, 3rd August",
        "theme": "PSM PROGRAMS + FMT START",
        "header_color": MIX_COLOR,
        "light_color": LIGHT_MIX,
        "daily_goal": "Revise all national health programs + begin FMT with death & decomposition.",
        "slots": [
            ("πŸŒ… Morning", "National Health Programs",
             "NHM, RNTCP/NTEP (DOTS, categories)\nNVBDCP (Malaria, Filaria, Kala-azar, Dengue)\nUIP vaccine schedule, cold chain, RCH"),
            ("🌀 Afternoon", "Health Planning & Administration",
             "Bhore / Mudaliar / Alma-Ata / Srivastava committees\nPHC - population, staff, functions\nSub-centre norms, ASHA, ANM roles"),
            ("πŸŒ™ Evening (FMT)", "Death & Postmortem Changes",
             "Somatic vs molecular death; brain death criteria\nRigor mortis - timings, exceptions\nLivor mortis - differentiation from bruise\nDecomposition stages, Adipocere, Mummification"),
        ]
    },
    {
        "date": "Day 4 - Monday, 4th August",
        "theme": "FMT HEAVY",
        "header_color": FMT_COLOR,
        "light_color": LIGHT_FMT,
        "daily_goal": "Confidently differentiate wound types, asphyxia signs & medico-legal aspects of sexual offences.",
        "slots": [
            ("πŸŒ… Morning", "Wounds & Injuries",
             "Incised / Lacerated / Contused / Puncture wounds - features\nFirearm wounds: entry vs exit, range estimation\nDefence wounds, Patterned injuries, Age of bruise"),
            ("🌀 Afternoon", "Asphyxial Deaths",
             "Hanging vs Strangulation - signs, ligature marks\nThrottle, Burking, Smothering\nDrowning - wet vs dry, diatom test, Cafe-au-lait spots"),
            ("πŸŒ™ Evening", "Sexual Offences & POCSO",
             "Rape - IPC Sec 375/376, examination protocol\nHymen types, relevance in medico-legal cases\nAge estimation - Gustafson's method, ossification centres\nPOCSO Act key provisions"),
        ]
    },
    {
        "date": "Day 5 - Tuesday, 5th August",
        "theme": "FMT - TOXICOLOGY + JURISPRUDENCE",
        "header_color": FMT_COLOR,
        "light_color": LIGHT_FMT,
        "daily_goal": "Know OP poisoning management, alcohol metabolism, and key IPC sections for MCQs.",
        "slots": [
            ("πŸŒ… Morning", "Toxicology: Corrosives & Pesticides",
             "Acid (H2SO4, HCl, HNO3) vs Alkali injuries - features\nOrganophosphorus: mechanism (ChE inhibition), SLUDGE/DUMBELS\nAtropine + PAM treatment protocol\nDDT, Paraquat, Aluminium phosphide poisoning"),
            ("🌀 Afternoon", "Toxicology: Narcotics & Alcohol",
             "Ethanol: absorption, metabolism, Widmark formula\nDrunkenness stages, blood alcohol levels\nOpium / Morphine / Heroin - signs, Naloxone\nCannabis, Cocaine, LSD - features"),
            ("πŸŒ™ Evening", "Medical Jurisprudence & IPC",
             "IPC 299/300 - culpable homicide vs murder\nIPC 319-323 (hurt), 375 (rape), 304A (negligence)\nConsent types, age of consent\nNMC Act, professional misconduct, infamous conduct"),
        ]
    },
    {
        "date": "Day 6 - Wednesday, 6th August",
        "theme": "MIXED REVISION + PYQs",
        "header_color": MIX_COLOR,
        "light_color": LIGHT_MIX,
        "daily_goal": "Plug weak areas in PSM stats & FMT identification; solve minimum 60 PYQs.",
        "slots": [
            ("πŸŒ… Morning (PSM)", "Biostatistics & Occupational Health",
             "Mean, Median, Mode; SD, SE, variance\nNormal distribution, skewness\nStatistical tests: t-test, chi-square, ANOVA (indications)\nSilicosis, Byssinosis, Asbestosis, Miner's lung - occupational diseases"),
            ("🌀 Afternoon (FMT)", "Identification & Forensic Pathology",
             "Age estimation: teeth (eruption table), Gustafson's 6 criteria\nDNA fingerprinting, blood grouping (medico-legal use)\nFirearms: types, parts, classification\nExhumation, Inquest (Sec 174 CrPC vs Sec 176 CrPC)"),
            ("πŸŒ™ Evening", "Previous Year Questions",
             "Solve 30 PYQs PSM + 30 PYQs FMT\nMark weak topics for Day 7 rapid revision\nReview all mnemonics and formula sheet"),
        ]
    },
    {
        "date": "Day 7 - Thursday, 7th August",
        "theme": "FULL MOCK + RAPID REVISION",
        "header_color": MOCK_COLOR,
        "light_color": LIGHT_MOCK,
        "daily_goal": "Simulate exam conditions. Identify last-minute gaps. Consolidate all high-yield notes.",
        "slots": [
            ("πŸŒ… Morning", "PSM Rapid Revision",
             "Flash through all notes: Epidemiology formulas, National programs, Vital stats values\nRevise mnemonics, committee names, PHC norms\nQuick read of 1-page formula sheet"),
            ("🌀 Afternoon", "FMT Rapid Revision",
             "Flash through: Rigor/livor timings, Wound types, IPC sections\nOP poisoning steps, Alcohol levels, Gustafson's criteria\nAll medico-legal definitions"),
            ("πŸŒ™ Evening", "Mock Test (EXAM SIMULATION)",
             "50 MCQs PSM - timed (45 mins)\n50 MCQs FMT - timed (45 mins)\nScore, analyse, note mistakes\nSleep early - exam prep done!"),
        ]
    },
]

# ─────────────────────────────────────────────
# HIGH YIELD BOX DATA
# ─────────────────────────────────────────────
hyt_psm = [
    "Epidemiological study designs + OR, RR, AR formulas",
    "IMR, MMR, TFR, NRR - definitions + current India values",
    "Wilson's screening criteria; Sensitivity/Specificity/PPV/NPV",
    "UIP Vaccine schedule + cold chain (2-8Β°C, -20Β°C)",
    "PHC - population 30,000 + 6 sub-centres; Sub-centre 5,000",
    "RNTCP/NTEP - DOTS categories, drug regimens",
    "PEM classifications (Gomez / IAP / Waterlow)",
    "Water quality: E. coli 0/100ml, Chlorine residual 0.5 mg/L",
    "Bhore committee 1946 - short/long term recommendations",
    "Biostatistics - Type I/II error, p-value, confidence interval",
]

hyt_fmt = [
    "Rigor mortis: starts 2-6h, complete 12h, passes 36-48h",
    "Livor mortis: appears 1-2h, fixed 6-12h",
    "Hanging vs Strangulation - ligature mark direction",
    "OP poisoning: SLUDGE/DUMBELS + Atropine + PAM doses",
    "IPC 299 (CHN) vs 300 (Murder) - exceptions to murder",
    "IPC 375 - Rape definition + 376 punishments",
    "Gustafson's 6 criteria for dental age estimation",
    "Diatom test for drowning (gold standard)",
    "Alcohol: 30mg% = driving limit India; 80mg% = presumption",
    "DNA fingerprinting: RFLP, STR - medico-legal use",
]

# ─────────────────────────────────────────────
# BUILD PDF
# ─────────────────────────────────────────────
elements = []

# Title block
elements.append(Spacer(1, 0.3*cm))
elements.append(Paragraph("PSM + FMT REVISION TIMETABLE", title_style))
elements.append(Paragraph("1st August – 7th August 2026  |  High-Yield UT Exam Preparation", subtitle_style))
elements.append(Paragraph("MBBS  |  Preventive & Social Medicine + Forensic Medicine & Toxicology", subtitle_style))
elements.append(Spacer(1, 0.3*cm))
elements.append(HRFlowable(width="100%", thickness=2, color=colors.HexColor('#1a3c5e')))
elements.append(Spacer(1, 0.4*cm))

# LEGEND
legend_data = [
    [
        Paragraph("<font color='#1a5276'>β– </font> PSM Focus Day", focus_style),
        Paragraph("<font color='#922b21'>β– </font> FMT Focus Day", focus_style),
        Paragraph("<font color='#1e5f2a'>β– </font> Mixed Day", focus_style),
        Paragraph("<font color='#4a235a'>β– </font> Mock/Revision Day", focus_style),
    ]
]
legend_table = Table(legend_data, colWidths=[4.2*cm, 4.2*cm, 4.2*cm, 4.2*cm])
legend_table.setStyle(TableStyle([
    ('ALIGN', (0,0), (-1,-1), 'CENTER'),
    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ('BACKGROUND', (0,0), (0,0), LIGHT_PSM),
    ('BACKGROUND', (1,0), (1,0), LIGHT_FMT),
    ('BACKGROUND', (2,0), (2,0), LIGHT_MIX),
    ('BACKGROUND', (3,0), (3,0), LIGHT_MOCK),
    ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor('#cccccc')),
    ('INNERGRID', (0,0), (-1,-1), 0.5, colors.HexColor('#cccccc')),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
]))
elements.append(legend_table)
elements.append(Spacer(1, 0.5*cm))

# EACH DAY
for day in days:
    # Day header
    header_para = Paragraph(
        f"<font color='white'><b>  {day['date']}  |  {day['theme']}</b></font>",
        day_header_style
    )
    header_table = Table([[header_para]], colWidths=[17*cm])
    header_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), day['header_color']),
        ('TOPPADDING', (0,0), (-1,-1), 6),
        ('BOTTOMPADDING', (0,0), (-1,-1), 6),
        ('LEFTPADDING', (0,0), (-1,-1), 8),
        ('ROUNDEDCORNERS', [4, 4, 0, 0]),
    ]))
    elements.append(header_table)

    # Daily goal row
    goal_row = Table(
        [[Paragraph(f"🎯 Daily Goal: {day['daily_goal']}", goal_style)]],
        colWidths=[17*cm]
    )
    goal_row.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#eafaf1')),
        ('TOPPADDING', (0,0), (-1,-1), 5),
        ('BOTTOMPADDING', (0,0), (-1,-1), 5),
        ('LEFTPADDING', (0,0), (-1,-1), 8),
        ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor('#abebc6')),
    ]))
    elements.append(goal_row)

    # Slots table
    col_widths = [3*cm, 4.5*cm, 9.5*cm]
    table_data = [
        [
            Paragraph("<b>Slot</b>", slot_style),
            Paragraph("<b>Topic</b>", slot_style),
            Paragraph("<b>Focus Points</b>", slot_style),
        ]
    ]
    for i, (slot, topic, focus) in enumerate(day['slots']):
        bg = day['light_color'] if i % 2 == 0 else ROW_WHITE
        table_data.append([
            Paragraph(slot, slot_style),
            Paragraph(topic, topic_style),
            Paragraph(focus.replace('\n', '<br/>'), focus_style),
        ])

    t = Table(table_data, colWidths=col_widths)
    t.setStyle(TableStyle([
        # Header
        ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#2e4057')),
        ('TEXTCOLOR', (0,0), (-1,0), colors.white),
        ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
        ('FONTSIZE', (0,0), (-1,0), 8.5),
        # Alternating rows
        ('BACKGROUND', (0,1), (-1,1), day['light_color']),
        ('BACKGROUND', (0,2), (-1,2), ROW_WHITE),
        ('BACKGROUND', (0,3), (-1,3), day['light_color']),
        # Grid
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#cccccc')),
        ('VALIGN', (0,0), (-1,-1), 'TOP'),
        ('TOPPADDING', (0,0), (-1,-1), 5),
        ('BOTTOMPADDING', (0,0), (-1,-1), 6),
        ('LEFTPADDING', (0,0), (-1,-1), 6),
        ('RIGHTPADDING', (0,0), (-1,-1), 6),
    ]))
    elements.append(t)
    elements.append(Spacer(1, 0.5*cm))

# ─────────────────────────────────────────────
# HIGH YIELD SECTION
# ─────────────────────────────────────────────
elements.append(HRFlowable(width="100%", thickness=2, color=colors.HexColor('#1a3c5e')))
elements.append(Spacer(1, 0.3*cm))
elements.append(Paragraph("⭐  TOP HIGH-YIELD TOPICS  β€”  DON'T SKIP THESE!", section_title_style))
elements.append(Spacer(1, 0.2*cm))

# Two-column HYT table
hyt_rows = []
for i in range(max(len(hyt_psm), len(hyt_fmt))):
    left = Paragraph(f"βœ” {hyt_psm[i]}", focus_style) if i < len(hyt_psm) else Paragraph("", focus_style)
    right = Paragraph(f"βœ” {hyt_fmt[i]}", focus_style) if i < len(hyt_fmt) else Paragraph("", focus_style)
    hyt_rows.append([left, right])

hyt_header = [
    Paragraph("<b>PSM HIGH-YIELD</b>", ParagraphStyle('HH', parent=styles['Normal'], fontSize=9, textColor=colors.white, fontName='Helvetica-Bold')),
    Paragraph("<b>FMT HIGH-YIELD</b>", ParagraphStyle('HH', parent=styles['Normal'], fontSize=9, textColor=colors.white, fontName='Helvetica-Bold')),
]
hyt_table_data = [hyt_header] + hyt_rows

hyt_table = Table(hyt_table_data, colWidths=[8.5*cm, 8.5*cm])
hyt_style = [
    ('BACKGROUND', (0,0), (0,0), PSM_COLOR),
    ('BACKGROUND', (1,0), (1,0), FMT_COLOR),
    ('TEXTCOLOR', (0,0), (-1,0), colors.white),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#cccccc')),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 6),
    ('RIGHTPADDING', (0,0), (-1,-1), 6),
    ('FONTSIZE', (0,0), (-1,0), 9),
    ('ALIGN', (0,0), (-1,0), 'CENTER'),
]
for i in range(1, len(hyt_table_data)):
    bg = LIGHT_PSM if i % 2 == 1 else ROW_WHITE
    hyt_style.append(('BACKGROUND', (0,i), (0,i), bg))
    bg2 = LIGHT_FMT if i % 2 == 1 else ROW_WHITE
    hyt_style.append(('BACKGROUND', (1,i), (1,i), bg2))

hyt_table.setStyle(TableStyle(hyt_style))
elements.append(hyt_table)
elements.append(Spacer(1, 0.4*cm))

# Footer
elements.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor('#cccccc')))
footer_para = Paragraph(
    "Generated for UT Exam Revision  |  PSM + FMT  |  August 2026  |  Best of luck! πŸ€",
    ParagraphStyle('Footer', parent=styles['Normal'], fontSize=8, textColor=colors.HexColor('#888888'),
                   alignment=TA_CENTER, spaceBefore=6)
)
elements.append(footer_para)

# BUILD
doc.build(elements)
print(f"PDF created: {output_path}")
Running Command

cd /home/daytona/workspace/psm-fmt-timetable && python generate_timetable.py

Running Command

ls -lh /home/daytona/workspace/psm-fmt-timetable/PSM_FMT_Revision_Timetable.pdf

Your print-ready PDF is ready! πŸŽ‰

PSM FMT Revision Timetable

PDF Document Β· PDF

What's inside the PDF:
  • 7-day timetable (1st - 7th August) with color-coded days
    • Blue = PSM focus days
    • Red = FMT focus days
    • Green = Mixed days
    • Purple = Mock/Revision day
  • Each day has: a daily goal box + 3 slots (Morning / Afternoon / Evening) with detailed focus points
  • High-Yield cheat sheet at the end - 10 must-know topics each for PSM and FMT side by side
  • A4 size, clean layout - prints well on standard paper
Print it out and stick it somewhere visible. All the best for your UT exam! πŸ€

Sorry...but l thing is l have exams from 1st August and from today l want revision schedule...and today l have started health care delivery

Asking for Preferences
Writing File

~/psm-fmt-timetable/generate_18day.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (
    SimpleDocTemplate, Table, TableStyle, Paragraph,
    Spacer, HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT

output_path = "/home/daytona/workspace/psm-fmt-timetable/PSM_FMT_18Day_Revision_Schedule.pdf"

doc = SimpleDocTemplate(
    output_path,
    pagesize=A4,
    rightMargin=1.4*cm,
    leftMargin=1.4*cm,
    topMargin=1.4*cm,
    bottomMargin=1.4*cm
)

styles = getSampleStyleSheet()

def S(name, parent='Normal', **kwargs):
    return ParagraphStyle(name, parent=styles[parent], **kwargs)

title_s   = S('T', 'Title', fontSize=17, textColor=colors.HexColor('#1a3c5e'), alignment=TA_CENTER, fontName='Helvetica-Bold', spaceAfter=3)
sub_s     = S('Sub', fontSize=9, textColor=colors.HexColor('#555'), alignment=TA_CENTER, fontName='Helvetica', spaceAfter=2)
day_hdr_s = S('DH', fontSize=10, textColor=colors.white, fontName='Helvetica-Bold')
goal_s    = S('G', fontSize=8, textColor=colors.HexColor('#145a32'), fontName='Helvetica-Bold', leading=11)
slot_s    = S('SL', fontSize=8, textColor=colors.HexColor('#1a1a1a'), fontName='Helvetica-Bold', leading=11)
topic_s   = S('TP', fontSize=8, textColor=colors.HexColor('#1a3c5e'), fontName='Helvetica-Bold', leading=11)
focus_s   = S('F', fontSize=7.5, textColor=colors.HexColor('#2c3e50'), fontName='Helvetica', leading=10.5)
hy_s      = S('HY', fontSize=7.5, textColor=colors.HexColor('#2c3e50'), fontName='Helvetica', leading=10.5)
sec_s     = S('SEC', fontSize=11, textColor=colors.HexColor('#1a3c5e'), fontName='Helvetica-Bold', spaceBefore=8, spaceAfter=4)
note_s    = S('N', fontSize=7.5, textColor=colors.HexColor('#7d6608'), fontName='Helvetica-Oblique', leading=10)

# Colors
C_PSM    = colors.HexColor('#1a5276')
C_FMT    = colors.HexColor('#7b241c')
C_MIX    = colors.HexColor('#1e5f2a')
C_REV    = colors.HexColor('#4a235a')
C_MOCK   = colors.HexColor('#b7770d')

LC_PSM   = colors.HexColor('#d6eaf8')
LC_FMT   = colors.HexColor('#fadbd8')
LC_MIX   = colors.HexColor('#d5f5e3')
LC_REV   = colors.HexColor('#e8daef')
LC_MOCK  = colors.HexColor('#fef9e7')

W = 17*cm
COL = [2.8*cm, 4.2*cm, 10*cm]

# ─────────────────────────────────────────────────────────────
# 18-DAY SCHEDULE  (14 Jul – 31 Jul)
# Structure: PSM Days 1-10  (complete syllabus)
#            FMT Days 11-17 (complete syllabus)
#            Day 18 = Grand revision + mock
# ─────────────────────────────────────────────────────────────
schedule = [

  # ══════════════  PSM BLOCK  ══════════════
  {
    "day": 1, "date": "Tuesday, 14th July",
    "theme": "PSM – Health Care Delivery (TODAY'S START)",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Complete Health Care Delivery + Health System in India. Mark all national committees for quick recall.",
    "slots": [
      ("πŸŒ… Morning\n(In progress)", "Health Care Delivery",
       "Concepts: Health, disease, wellbeing (WHO def)\nLevels of health care (Primary / Secondary / Tertiary)\nReferral system, Healthcare financing in India\nNational Health Policy 2017 key points"),
      ("🌀 Afternoon", "Health System in India",
       "Subcentre, PHC, CHC – population norms & staff\nDistrict hospital functions\nPrivate sector role, PPP models\nAsha, ANM, MPW – roles and responsibilities"),
      ("πŸŒ™ Evening", "Committees & Revision",
       "Bhore (1946), Mudaliar (1962), Srivastava (1975), Alma Ata (1978)\nHankart & Bajaj committees\n20 MCQs on Health Care Delivery\nWrite 1 summary page"),
    ]
  },
  {
    "day": 2, "date": "Wednesday, 15th July",
    "theme": "PSM – Epidemiology I",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Master study designs + measures of disease frequency and association. These are guaranteed MCQ topics.",
    "slots": [
      ("πŸŒ… Morning", "Epidemiology Basics",
       "Definition, natural history of disease, iceberg phenomenon\nDescriptive epidemiology: Person, Place, Time\nSources of data: vital statistics, surveys, disease notification"),
      ("🌀 Afternoon", "Study Designs",
       "Case-control vs Cohort vs RCT vs Cross-sectional\nOdds Ratio, Relative Risk, Attributable Risk – formulas + examples\nPAR (Population Attributable Risk)\nBias: selection, information, confounding – how to control"),
      ("πŸŒ™ Evening", "Practice",
       "Construct 2x2 tables and calculate OR, RR\n25 MCQs on epidemiology\nRevise NNT, NNH formulas"),
    ]
  },
  {
    "day": 3, "date": "Thursday, 16th July",
    "theme": "PSM – Epidemiology II + Screening",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Fully understand screening criteria and statistical parameters β€” frequently asked as calculation MCQs.",
    "slots": [
      ("πŸŒ… Morning", "Screening",
       "Wilson & Jungner criteria (10 points)\nMass vs selective vs multiphasic screening\nSensitivity, Specificity, PPV, NPV – definitions + formulas\nLikelihood ratio, ROC curve concept"),
      ("🌀 Afternoon", "Outbreak Investigation + Surveillance",
       "Steps of outbreak investigation (WHO 10 steps)\nEpidemic curves: point source vs propagated\nActive vs passive surveillance\nNotifiable diseases in India"),
      ("πŸŒ™ Evening", "Biostatistics I",
       "Mean, Median, Mode – when to use which\nStandard Deviation vs Standard Error\nNormal distribution, skewness, kurtosis\n20 MCQs on screening + biostatistics"),
    ]
  },
  {
    "day": 4, "date": "Friday, 17th July",
    "theme": "PSM – Biostatistics + Research Methods",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Crack biostatistics – statistical tests, sampling, and study design are high-yield for theory + MCQ.",
    "slots": [
      ("πŸŒ… Morning", "Biostatistics II",
       "Hypothesis testing: null vs alternative\nType I error (Ξ±) vs Type II error (Ξ²), p-value, CI\nStatistical tests: t-test, chi-square, ANOVA – indications\nKaplan-Meier, Log-rank test (basic)"),
      ("🌀 Afternoon", "Sampling & Research Methods",
       "Probability: SRS, Systematic, Stratified, Cluster\nNon-probability: Convenience, Purposive, Snowball\nSample size calculation concept\nClinical trials: phase I–IV, blinding, randomisation"),
      ("πŸŒ™ Evening", "Revision + MCQs",
       "Revise Days 2–4 epidemiology + biostats\n30 MCQs (mixed epidemiology)\nPrepare mnemonic card for study designs"),
    ]
  },
  {
    "day": 5, "date": "Saturday, 18th July",
    "theme": "PSM – Demography & Vital Statistics",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Know every rate and ratio cold β€” their formulas, differences, and current India values.",
    "slots": [
      ("πŸŒ… Morning", "Fertility & Mortality Rates",
       "CBR, CDR, ASMR, ASFR, GFR, TFR, NRR, GRR\nIMR, NMR, PNMR, U5MR, MMR – definitions + formula\nIndia values 2020–24 (IMR ~27, MMR ~97, TFR ~2.0)\nDemographic cycle (phases I–IV)"),
      ("🌀 Afternoon", "Census & Population",
       "Census 2011: population, growth rate, sex ratio, literacy\nSample Registration System (SRS)\nCivil registration system\nPopulation pyramid types"),
      ("πŸŒ™ Evening", "Family Planning",
       "National Family Planning program history\nContraceptive methods: OCP, IUCD, MTP Act\nTerminal methods, spacing methods\n25 MCQs on demography"),
    ]
  },
  {
    "day": 6, "date": "Sunday, 19th July",
    "theme": "PSM – Nutrition",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "PEM classifications, vitamin deficiencies, and national nutrition schemes are always in exam papers.",
    "slots": [
      ("πŸŒ… Morning", "Protein Energy Malnutrition",
       "Kwashiorkor vs Marasmus – clinical features, differences\nGomez classification, IAP classification, Waterlow\nSAM vs MAM management (RUTF, F75/F100)\nMid-Upper Arm Circumference (MUAC) cutoffs"),
      ("🌀 Afternoon", "Vitamins & Minerals",
       "Vitamin A: deficiency stages, Bitot's spots, Xerophthalmia, dose\nVitamin D: rickets, osteomalacia, RDA\nIron deficiency anaemia: stages, Hb cutoffs\nIodine, Zinc, B12, C, B1, B2, B3 – deficiency diseases + food sources"),
      ("πŸŒ™ Evening", "Nutrition Programs",
       "ICDS – objective, beneficiaries, services ('6 services')\nPoshan Abhiyan / Mission Poshan 2.0\nMid-Day Meal scheme\nNational Iodine Deficiency Disorders Control Programme\n25 MCQs on nutrition"),
    ]
  },
  {
    "day": 7, "date": "Monday, 20th July",
    "theme": "PSM – Communicable Diseases I",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Respiratory and vaccine-preventable diseases: modes of transmission, incubation periods, control measures.",
    "slots": [
      ("πŸŒ… Morning", "Respiratory Infections",
       "Tuberculosis: NTEP/RNTCP – DOTS, categories, regimens (2HRZE/4HR)\nDrug resistance: MDR, XDR, pre-XDR definitions\nCOVID-19 epidemiology (brief)\nInfluenza: types, pandemic vs epidemic"),
      ("🌀 Afternoon", "Vaccine-Preventable Diseases",
       "Measles, Mumps, Rubella, Polio, Diphtheria\nIncubation periods + communicable periods\nSmallpox eradication timeline\nUIP vaccine schedule (complete) – age, route, dose, site"),
      ("πŸŒ™ Evening", "Cold Chain & Immunisation",
       "Cold chain equipment: ILR, deep freezer, ice-lined refrigerator\nStorage temperatures: OPV -20Β°C, others 2–8Β°C\nVaccine vial monitor (VVM)\n25 MCQs on communicable diseases"),
    ]
  },
  {
    "day": 8, "date": "Tuesday, 21st July",
    "theme": "PSM – Communicable Diseases II (Vector-borne + Others)",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Vector-borne diseases and their control are classic long-answer + MCQ topics.",
    "slots": [
      ("πŸŒ… Morning", "Vector-borne Diseases",
       "Malaria: lifecycle, species, drug treatment (ACT), Rapid Diagnostic Test\nDengue: serotypes, warning signs, NS1, DHF vs DSS\nFilariasis: MDA (DEC + Albendazole), Night Blood Survey\nKala-azar: Rk39 test, SSG treatment\nJapanese Encephalitis: vector, vaccine"),
      ("🌀 Afternoon", "Other Communicable Diseases",
       "HIV/AIDS: ICTC, PPTCT, ART eligibility, window period\nLeprosy: NLEP, types, MDT regimen (PB vs MB)\nCholera: El-Tor biotype, ORS formula, ring vaccination\nHepatitis A, B, C, E – transmission, prevention"),
      ("πŸŒ™ Evening", "NVBDCP + Revision",
       "NVBDCP programmes and targets\nRevise all vector names and control methods\n30 MCQs on vector-borne diseases"),
    ]
  },
  {
    "day": 9, "date": "Wednesday, 22nd July",
    "theme": "PSM – Environment Health + Occupational Health",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Water quality standards, purification methods, and occupational lung diseases are high-yield.",
    "slots": [
      ("πŸŒ… Morning", "Water & Sanitation",
       "WHO water quality standards (E. coli: 0/100ml)\nWater purification: sedimentation, coagulation, filtration, chlorination\nBreakpoint chlorination, Horrock's test\nSewage treatment: Imhoff tank, oxidation pond, trickling filter\nLatrine types: water seal, septic tank"),
      ("🌀 Afternoon", "Air & Environment",
       "Air pollutants: PM2.5, PM10, CO, NOx, SOx – health effects\nNoise pollution: WHO standards, NIHL\nRadiation: ionising vs non-ionising\nGlobal warming, ozone depletion, acid rain"),
      ("πŸŒ™ Evening", "Occupational Health",
       "Silicosis, Asbestosis, Byssinosis, Anthracosis – causative dust\nBerylliosis, Siderosis\nESI Act, Factories Act – provisions\nESI benefits, Workmen's Compensation Act\n25 MCQs on environment + occupational"),
    ]
  },
  {
    "day": 10, "date": "Thursday, 23rd July",
    "theme": "PSM – National Health Programs + PSM Revision",
    "hc": C_PSM, "lc": LC_PSM,
    "goal": "Memorise program names, target groups, and key interventions. Final PSM revision day.",
    "slots": [
      ("πŸŒ… Morning", "National Health Programs",
       "NHM: NRHM + NUHM, components, JSY, JSSK\nNPCDCS: diabetes, CVD, cancer, stroke\nNational Mental Health Programme\nNational Programme for Control of Blindness\nNational Programme for Elderly"),
      ("🌀 Afternoon", "RCH + Child Health Programs",
       "RCH II: components, ANC visits (minimum 4)\nNavjaat Shishu Suraksha Karyakram (NSSK)\nRashtriya Bal Swasthya Karyakram (RBSK)\nSAM treatment protocol, Vitamin A supplementation\nKangaroo Mother Care"),
      ("πŸŒ™ Evening", "PSM Grand Revision",
       "Quick flash through ALL PSM topics (Days 1–10)\nRevise all formula sheets and mnemonics\nSolve 40 mixed PSM PYQs\nIdentify weak topics to revisit on Day 17"),
    ]
  },

  # ══════════════  FMT BLOCK  ══════════════
  {
    "day": 11, "date": "Friday, 24th July",
    "theme": "FMT – Introduction + Death & Decomposition",
    "hc": C_FMT, "lc": LC_FMT,
    "goal": "Understand the signs of death, postmortem changes with timings, and their medico-legal significance.",
    "slots": [
      ("πŸŒ… Morning", "FMT Introduction & Forensic Pathology",
       "Scope of forensic medicine, types of autopsies\nManner vs Mechanism vs Cause of death\nBrain death criteria (Harvard criteria)\nSomatic vs Molecular death"),
      ("🌀 Afternoon", "Postmortem Changes",
       "Cooling of body: Henssge nomogram, Newton's law\nRigor mortis: starts 2–6h, complete 12h, passes 36–48h; exceptions\nLivor mortis (hypostasis): 1–2h, fixed 6–12h; vs bruise differentiation\nDecomposition: stages, putrefaction, Adipocere, Mummification"),
      ("πŸŒ™ Evening", "Inquest & Exhumation",
       "Sec 174 CrPC (Police inquest) vs Sec 176 (Magistrate inquest)\nCertification of death, MCCD form\nExhumation: procedure, medico-legal aspects\n20 MCQs on death & decomposition"),
    ]
  },
  {
    "day": 12, "date": "Saturday, 25th July",
    "theme": "FMT – Wounds & Injuries",
    "hc": C_FMT, "lc": LC_FMT,
    "goal": "Differentiate wound types accurately β€” a favourite for both MCQs and short answers.",
    "slots": [
      ("πŸŒ… Morning", "Mechanical Injuries",
       "Incised wound: features, defence wounds, hesitation cuts\nContused (lacerated) wound: features, bridging fibers\nPunctured wound: entry vs exit features\nChop wound, abrasion types (scratch, pressure, impact, friction)"),
      ("🌀 Afternoon", "Firearm Wounds",
       "Types of firearms: rifled vs smooth bore\nEntry vs Exit wound features\nContact / Close / Intermediate / Distant range – features\nBlackening, tattooing, singing, scorching zones\nSpent bullet, ricochet, bullet embolism"),
      ("πŸŒ™ Evening", "Age of Injuries + Head Injuries",
       "Age of bruise: colour changes (yellow = old, black = recent)\nSubdural, Extradural, Subarachnoid haemorrhage – differences\nCoup vs Contre-coup injury\nLacerations of brain\n25 MCQs on wounds"),
    ]
  },
  {
    "day": 13, "date": "Sunday, 26th July",
    "theme": "FMT – Asphyxia",
    "hc": C_FMT, "lc": LC_FMT,
    "goal": "Hanging vs strangulation vs drowning differences β€” a perennial long answer question.",
    "slots": [
      ("πŸŒ… Morning", "Hanging & Strangulation",
       "Hanging: typical vs atypical, judicial hanging\nLigature mark: oblique, above thyroid, non-continuous in hanging\nStrangulation: ligature vs manual (throttling)\nLigature mark: horizontal, below thyroid, continuous in strangulation\nPetechiae, fracture of hyoid"),
      ("🌀 Afternoon", "Drowning & Suffocation",
       "Drowning: wet vs dry drowning\nFresh vs saltwater drowning – lung changes\nDiatom test (best method), gettler test\nCafe-au-lait spots, washerwoman's hands, cutis anserina\nSmothering, Burking, Overlaying, Traumatic asphyxia"),
      ("πŸŒ™ Evening", "Revision + MCQs",
       "Draw comparison table: Hanging vs Strangulation vs Drowning\nRevise all asphyxia signs\n25 MCQs on asphyxia"),
    ]
  },
  {
    "day": 14, "date": "Monday, 27th July",
    "theme": "FMT – Sexual Offences + Identification",
    "hc": C_FMT, "lc": LC_FMT,
    "goal": "Know rape examination protocol, IPC sections, and all identification methods for exam questions.",
    "slots": [
      ("πŸŒ… Morning", "Sexual Offences",
       "Rape: IPC Sec 375 definition, Sec 376 punishment\nPOCSO Act – key age provisions, mandatory reporting\nExamination of victim: consent, DNA evidence, two-finger test controversy\nHymen types and medico-legal importance\nFalse allegations, recent vs old cases"),
      ("🌀 Afternoon", "Identification",
       "Primary (fingerprints, DNA, dental) vs Secondary identifiers\nGustafson's 6 criteria for dental age: Attrition, Periodontosis, Secondary dentine, Cementum apposition, Root resorption, Transparency\nDNA fingerprinting: RFLP, STR, Y-STR, mt-DNA uses\nOssification centres for age estimation (key ones)\nBlood grouping: ABO, Rh, Bombay phenotype"),
      ("πŸŒ™ Evening", "MCQs + Notes",
       "Revise IPC sections table (rape, hurt, murder, negligence)\n25 MCQs on sexual offences + identification"),
    ]
  },
  {
    "day": 15, "date": "Tuesday, 28th July",
    "theme": "FMT – Toxicology I (Corrosives + Pesticides)",
    "hc": C_FMT, "lc": LC_FMT,
    "goal": "OP poisoning management and acid/alkali injuries are the most asked toxicology topics in UT.",
    "slots": [
      ("πŸŒ… Morning", "Corrosive Poisons",
       "Mineral acids: H2SO4, HCl, HNO3 – specific features\nAlkali (NaOH, KOH): saponification, collar of Billroth\nOxalic acid: calcium oxalate crystals in urine\nCarbolic acid (Phenol): port-wine coloured urine, pulmonary oedema"),
      ("🌀 Afternoon", "Organophosphorus & Other Pesticides",
       "OP mechanism: irreversible AChE inhibition\nMuscarinic (SLUDGE/DUMBELS) + Nicotinic + CNS features\nAtropine dose + PAM (pralidoxime) – timing rule\nParaquat: delayed pulmonary fibrosis\nAluminium phosphide: phosphine gas, bread smell\nDDT: stored in fat, tremors"),
      ("πŸŒ™ Evening", "Heavy Metals + Snake Bite",
       "Lead: Burton's line, basophilic stippling, treatment (EDTA)\nArsenic: Mees lines, garlic odour, Aldrich-Mees\nMercury: Pink disease, Mad Hatter, Minamata\nSnake bite: haemotoxic vs neurotoxic, ASV\n25 MCQs on toxicology I"),
    ]
  },
  {
    "day": 16, "date": "Wednesday, 29th July",
    "theme": "FMT – Toxicology II + Medical Jurisprudence",
    "hc": C_FMT, "lc": LC_FMT,
    "goal": "Alcohol levels, drug of abuse features, and IPC sections must be memorised for short notes.",
    "slots": [
      ("πŸŒ… Morning", "Alcohol & Narcotics",
       "Ethanol: absorption, metabolism (ADH), Widmark formula\nBAC levels: 30 mg% = India driving limit, 80 mg% = legal presumption, 400 mg% = fatal\nAcute intoxication stages, hangover\nOpium / Morphine / Heroin: features, naloxone antidote\nCannabis (bhang, ganja, charas) – features, no antidote\nCocaine, Amphetamine, LSD – features"),
      ("🌀 Afternoon", "Medical Jurisprudence",
       "IPC 299 (CHN) vs IPC 300 (Murder) – exceptions\nIPC 302 punishment, IPC 304 (CHN punish), 304A (medical negligence)\nIPC 319–323 (hurt, grievous hurt)\nConsent: informed, implied, emergency; age of consent (18 yrs)\nConfidentiality exceptions: Tarasoff rule concept\nNMC Act – professional misconduct, infamous conduct"),
      ("πŸŒ™ Evening", "Special Situations in FMT",
       "Dowry death: IPC 304B, Sec 113B Evidence Act\nInfanticide: live birth vs stillbirth tests (hydrostatic test)\nMedical negligence: Bolam test, Res ipsa loquitur\n25 MCQs on toxicology II + jurisprudence"),
    ]
  },
  {
    "day": 17, "date": "Thursday, 30th July",
    "theme": "FULL REVISION DAY – PSM + FMT",
    "hc": C_REV, "lc": LC_REV,
    "goal": "Rapid flash through all 16 days. Re-read weak topics marked during the schedule. No new topics today.",
    "slots": [
      ("πŸŒ… Morning", "PSM Rapid Revision",
       "Epidemiology formulas sheet\nAll national health program key facts\nVital statistics values (IMR, MMR, TFR)\nPHC/subcentre norms, committee names\nVaccine cold chain temperatures\nNutrition: PEM classifications, vitamin deficiencies"),
      ("🌀 Afternoon", "FMT Rapid Revision",
       "Death changes: rigor/livor timings\nWound type differentials (comparison table)\nHanging vs Strangulation vs Drowning table\nOP poisoning: SLUDGE + management steps\nIPC sections summary table\nAlcohol BAC levels + Gustafson's criteria"),
      ("πŸŒ™ Evening", "Weak Topic Re-read + MCQ Drill",
       "Re-read all marked weak topics from Days 1–16\nSolve 50 mixed MCQs (PSM 25 + FMT 25)\nPrepare short notes for likely long-answer questions\nOrganise all formula/mnemonic sheets"),
    ]
  },
  {
    "day": 18, "date": "Friday, 31st July",
    "theme": "GRAND MOCK + FINAL PREP (Eve of Exam)",
    "hc": C_MOCK, "lc": LC_MOCK,
    "goal": "Simulate full exam. Spend evening consolidating, NOT reading new content. Sleep by 10 PM.",
    "slots": [
      ("πŸŒ… Morning", "Mock Exam – PSM",
       "10 MCQs + 2 Short notes + 1 Long answer (timed: 1.5 hrs)\nSuggested long answer: Epidemiological study designs / PHC\nSuggested short notes: MMR, Cold chain, Screening criteria"),
      ("🌀 Afternoon", "Mock Exam – FMT",
       "10 MCQs + 2 Short notes + 1 Long answer (timed: 1.5 hrs)\nSuggested long answer: Hanging vs Strangulation / OP Poisoning\nSuggested short notes: Rigor mortis, Gustafson's criteria"),
      ("πŸŒ™ Evening", "Last-Hour Revision",
       "Check answers – note errors only, do not re-read entire topic\nFlash through formula sheet + IPC sections table\nPrepare stationery, hall ticket, ID proof\nπŸŒ™ Sleep by 10 PM – rest is preparation too!"),
    ]
  },
]

# ──────────────────────────────────────────────────
# HIGH YIELD TABLES
# ──────────────────────────────────────────────────
hyt_psm = [
    ("Epidemiology study designs", "OR, RR, AR formulas + 2Γ—2 table"),
    ("Screening", "Wilson's 10 criteria + Sensitivity/Specificity/PPV/NPV"),
    ("IMR / MMR / TFR", "Formula + India current values"),
    ("PHC norms", "Pop 30,000; Sub-centre 5,000; CHC 80,000–1.2L"),
    ("UIP vaccine schedule", "Complete schedule by age + cold chain temps"),
    ("NTEP/RNTCP", "DOTS categories, drug regimens (2HRZE/4HR)"),
    ("PEM classification", "Gomez / IAP / Waterlow + SAM vs MAM"),
    ("National programs", "JSY, ICDS, NSSK, RBSK – beneficiaries & components"),
    ("Water standards", "E. coli 0/100ml; Residual Cl 0.5 mg/L"),
    ("Biostatistics", "Type I/II error, p-value, chi-square vs t-test indications"),
]

hyt_fmt = [
    ("Rigor mortis", "Starts 2–6h | Complete 12h | Resolves 36–48h"),
    ("Livor mortis", "Appears 1–2h | Fixed at 6–12h | vs bruise differences"),
    ("Hanging vs Strangulation", "Ligature direction, continuity, hyoid fracture"),
    ("Drowning", "Diatom test | Wet vs dry | Cafe-au-lait spots"),
    ("OP poisoning", "SLUDGE + Atropine (titrate) + PAM (within 24–48h)"),
    ("IPC 299 vs 300", "CHN vs Murder + 5 exceptions to murder"),
    ("Alcohol BAC levels", "30 mg% driving | 80 mg% legal | 400 mg% lethal"),
    ("Gustafson's 6 criteria", "APSRCT – Attrition, Periodontosis, Secondary dentine..."),
    ("IPC 375 / 376", "Rape definition + POCSO age provisions"),
    ("DNA fingerprinting", "RFLP, STR, Y-STR – which for what case"),
]

# ──────────────────────────────────────────────────
# BUILD
# ──────────────────────────────────────────────────
elements = []

# ── COVER / TITLE ──
elements.append(Spacer(1, 0.3*cm))
elements.append(Paragraph("PSM + FMT  COMPLETE REVISION SCHEDULE", title_s))
elements.append(Paragraph("14th July – 31st July 2026  |  18 Days  |  Exam from 1st August", sub_s))
elements.append(Paragraph("Mixed strategy: Full syllabus coverage + Extra focus on high-yield topics", sub_s))
elements.append(Spacer(1, 0.3*cm))
elements.append(HRFlowable(width="100%", thickness=2, color=C_PSM))
elements.append(Spacer(1, 0.3*cm))

# ── LEGEND ──
leg_data = [[
    Paragraph("<b><font color='#1a5276'>β–   PSM Days (1–10)</font></b>", focus_s),
    Paragraph("<b><font color='#7b241c'>β–   FMT Days (11–16)</font></b>", focus_s),
    Paragraph("<b><font color='#4a235a'>β–   Revision Day (17)</font></b>", focus_s),
    Paragraph("<b><font color='#b7770d'>β–   Grand Mock Day (18)</font></b>", focus_s),
]]
leg = Table(leg_data, colWidths=[4.25*cm]*4)
leg.setStyle(TableStyle([
    ('ALIGN', (0,0),(-1,-1),'CENTER'),
    ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
    ('BACKGROUND',(0,0),(0,0),LC_PSM),
    ('BACKGROUND',(1,0),(1,0),LC_FMT),
    ('BACKGROUND',(2,0),(2,0),LC_REV),
    ('BACKGROUND',(3,0),(3,0),LC_MOCK),
    ('BOX',(0,0),(-1,-1),0.5,colors.HexColor('#cccccc')),
    ('INNERGRID',(0,0),(-1,-1),0.5,colors.HexColor('#cccccc')),
    ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
]))
elements.append(leg)
elements.append(Spacer(1, 0.4*cm))

# ── OVERVIEW CALENDAR ──
elements.append(Paragraph("πŸ“…  18-DAY OVERVIEW CALENDAR", sec_s))
cal_header = [
    Paragraph("<b>Day</b>", slot_s),
    Paragraph("<b>Date</b>", slot_s),
    Paragraph("<b>Focus</b>", slot_s),
]
cal_data = [cal_header]
for d in schedule:
    theme_short = d['theme'].replace("PSM – ","").replace("FMT – ","")
    cal_data.append([
        Paragraph(f"<b>Day {d['day']}</b>", slot_s),
        Paragraph(d['date'].split(',')[0]+',\n'+d['date'].split(',')[1] if ',' in d['date'] else d['date'], focus_s),
        Paragraph(d['theme'], focus_s),
    ])
cal = Table(cal_data, colWidths=[1.5*cm, 3.5*cm, 12*cm])
cal_style = [
    ('BACKGROUND',(0,0),(-1,0),colors.HexColor('#2e4057')),
    ('TEXTCOLOR',(0,0),(-1,0),colors.white),
    ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'),
    ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#cccccc')),
    ('VALIGN',(0,0),(-1,-1),'TOP'),
    ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4),
    ('LEFTPADDING',(0,0),(-1,-1),5),('RIGHTPADDING',(0,0),(-1,-1),5),
    ('ALIGN',(0,0),(0,-1),'CENTER'),
]
for i,d in enumerate(schedule,1):
    bg = d['lc'] if i%2==1 else colors.white
    cal_style.append(('BACKGROUND',(0,i),(-1,i),bg))
cal.setStyle(TableStyle(cal_style))
elements.append(cal)
elements.append(Spacer(1,0.4*cm))
elements.append(HRFlowable(width="100%", thickness=1.5, color=colors.HexColor('#cccccc')))
elements.append(Spacer(1,0.3*cm))

# ── DAILY SCHEDULE PAGES ──
elements.append(Paragraph("πŸ“–  DAILY DETAILED SCHEDULE", sec_s))

for d in schedule:
    # Day header
    hdr = Paragraph(f"<font color='white'><b>  DAY {d['day']}  |  {d['date']}  |  {d['theme']}</b></font>", day_hdr_s)
    hdr_t = Table([[hdr]], colWidths=[W])
    hdr_t.setStyle(TableStyle([
        ('BACKGROUND',(0,0),(-1,-1),d['hc']),
        ('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6),
        ('LEFTPADDING',(0,0),(-1,-1),8),
    ]))

    # Goal
    goal_t = Table([[Paragraph(f"🎯  DAILY GOAL: {d['goal']}", goal_s)]], colWidths=[W])
    goal_t.setStyle(TableStyle([
        ('BACKGROUND',(0,0),(-1,-1),colors.HexColor('#eafaf1')),
        ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
        ('LEFTPADDING',(0,0),(-1,-1),8),
        ('BOX',(0,0),(-1,-1),0.5,colors.HexColor('#a9dfbf')),
    ]))

    # Slots
    rows = [[
        Paragraph("<b>Slot</b>", slot_s),
        Paragraph("<b>Topic</b>", slot_s),
        Paragraph("<b>Focus Points</b>", slot_s),
    ]]
    for i,(sl,tp,fp) in enumerate(d['slots']):
        bg = d['lc'] if i%2==0 else colors.white
        rows.append([
            Paragraph(sl.replace('\n','<br/>'), slot_s),
            Paragraph(tp, topic_s),
            Paragraph(fp.replace('\n','<br/>'), focus_s),
        ])
    slots_t = Table(rows, colWidths=COL)
    slots_t.setStyle(TableStyle([
        ('BACKGROUND',(0,0),(-1,0),colors.HexColor('#2e4057')),
        ('TEXTCOLOR',(0,0),(-1,0),colors.white),
        ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'),
        ('BACKGROUND',(0,1),(-1,1),d['lc']),
        ('BACKGROUND',(0,2),(-1,2),colors.white),
        ('BACKGROUND',(0,3),(-1,3),d['lc']),
        ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#cccccc')),
        ('VALIGN',(0,0),(-1,-1),'TOP'),
        ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),6),
        ('LEFTPADDING',(0,0),(-1,-1),6),('RIGHTPADDING',(0,0),(-1,-1),6),
    ]))

    elements.append(KeepTogether([hdr_t, goal_t, slots_t, Spacer(1,0.45*cm)]))

# ── HIGH YIELD SECTION ──
elements.append(HRFlowable(width="100%", thickness=2, color=C_PSM))
elements.append(Spacer(1,0.3*cm))
elements.append(Paragraph("⭐  HIGH-YIELD MASTER LIST  β€”  MUST KNOW COLD", sec_s))

hy_hdr = [
    Paragraph("<b>PSM TOPIC</b>", slot_s),
    Paragraph("<b>WHAT TO KNOW</b>", slot_s),
    Paragraph("<b>FMT TOPIC</b>", slot_s),
    Paragraph("<b>WHAT TO KNOW</b>", slot_s),
]
hy_rows = [hy_hdr]
for i in range(len(hyt_psm)):
    p_topic, p_what = hyt_psm[i]
    f_topic, f_what = hyt_fmt[i]
    bg = LC_PSM if i%2==0 else colors.white
    bg2 = LC_FMT if i%2==0 else colors.white
    hy_rows.append([
        Paragraph(p_topic, topic_s),
        Paragraph(p_what, focus_s),
        Paragraph(f_topic, topic_s),
        Paragraph(f_what, focus_s),
    ])

hy_t = Table(hy_rows, colWidths=[3.2*cm, 5.1*cm, 3.2*cm, 5.5*cm])
hy_ts = [
    ('BACKGROUND',(0,0),(1,0),C_PSM),
    ('BACKGROUND',(2,0),(3,0),C_FMT),
    ('TEXTCOLOR',(0,0),(-1,0),colors.white),
    ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'),
    ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#cccccc')),
    ('VALIGN',(0,0),(-1,-1),'TOP'),
    ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
    ('LEFTPADDING',(0,0),(-1,-1),5),('RIGHTPADDING',(0,0),(-1,-1),5),
    ('ALIGN',(0,0),(-1,0),'CENTER'),
]
for i in range(1, len(hy_rows)):
    hy_ts.append(('BACKGROUND',(0,i),(1,i), LC_PSM if i%2==1 else colors.white))
    hy_ts.append(('BACKGROUND',(2,i),(3,i), LC_FMT if i%2==1 else colors.white))
hy_t.setStyle(TableStyle(hy_ts))
elements.append(hy_t)
elements.append(Spacer(1,0.4*cm))

# ── TIPS BOX ──
tips = [
    "πŸ“Œ Study in 90-minute focused blocks with 15-min breaks (Pomodoro extended)",
    "πŸ“Œ After each topic: write 5 key points from memory before checking notes",
    "πŸ“Œ Evening MCQs are mandatory β€” passive reading without testing = low retention",
    "πŸ“Œ Use comparison tables for Hanging/Strangulation, OR/RR, Kwashiorkor/Marasmus",
    "πŸ“Œ Last 3 days (16–18): No new topics. Only revision + mock tests",
    "πŸ“Œ Day 17 evening: Prepare a 1-page cheat sheet of all formulas + IPC sections",
]
tips_data = [[Paragraph(t, note_s)] for t in tips]
tips_data.insert(0, [Paragraph("<b>πŸ’‘ STUDY STRATEGY TIPS</b>", goal_s)])
tips_t = Table(tips_data, colWidths=[W])
tips_t.setStyle(TableStyle([
    ('BACKGROUND',(0,0),(-1,0),colors.HexColor('#fef9e7')),
    ('BACKGROUND',(0,1),(-1,-1),colors.HexColor('#fffde7')),
    ('BOX',(0,0),(-1,-1),1,colors.HexColor('#f0c040')),
    ('INNERGRID',(0,0),(-1,-1),0.3,colors.HexColor('#f8e08e')),
    ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
    ('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),
]))
elements.append(tips_t)
elements.append(Spacer(1,0.3*cm))

# ── FOOTER ──
elements.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor('#cccccc')))
elements.append(Paragraph(
    "PSM + FMT  |  18-Day Revision Schedule  |  Exam 1st August 2026  |  You've got this! 🌟",
    S('Foot', fontSize=8, textColor=colors.HexColor('#888'), alignment=TA_CENTER, spaceBefore=5)
))

doc.build(elements)
print(f"βœ… PDF created: {output_path}")
Running Command

cd /home/daytona/workspace/psm-fmt-timetable && python generate_18day.py

Running Command

ls -lh /home/daytona/workspace/psm-fmt-timetable/PSM_FMT_18Day_Revision_Schedule.pdf

Your updated 18-day print-ready PDF is ready! πŸŽ‰

PSM FMT 18Day Revision Schedule

PDF Document Β· PDF


What's in the PDF:
Structure:
  • Days 1–10 (14–23 July) = PSM complete syllabus (blue)
  • Days 11–16 (24–29 July) = FMT complete syllabus (red)
  • Day 17 (30 July) = Full revision of both subjects (purple)
  • Day 18 (31 July) = Grand mock exam + final prep (gold)
Each day has:
  • A clear Daily Goal
  • 3 slots (Morning / Afternoon / Evening) with specific focus points
  • Evening MCQ drill built in every single day
Bonus pages:
  • 18-day overview calendar at the front
  • High-yield master table (PSM + FMT side by side)
  • Study strategy tips box
Today (Day 1) you're already on track - Health Care Delivery is exactly Day 1's morning slot. Just follow the evening slot now and you're on schedule. All the best! 🌟

I am used to study both subjects oeach day to avoid stress

Writing File

~/psm-fmt-timetable/generate_mixed.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (
    SimpleDocTemplate, Table, TableStyle, Paragraph,
    Spacer, HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT

output_path = "/home/daytona/workspace/psm-fmt-timetable/PSM_FMT_Mixed_18Day_Schedule.pdf"

doc = SimpleDocTemplate(
    output_path, pagesize=A4,
    rightMargin=1.3*cm, leftMargin=1.3*cm,
    topMargin=1.3*cm, bottomMargin=1.3*cm
)

styles = getSampleStyleSheet()
def S(name, **kw):
    return ParagraphStyle(name, parent=styles['Normal'], **kw)

title_s  = S('T',  fontSize=16, textColor=colors.HexColor('#1a3c5e'), alignment=TA_CENTER, fontName='Helvetica-Bold', spaceAfter=3)
sub_s    = S('SB', fontSize=9,  textColor=colors.HexColor('#555'),    alignment=TA_CENTER, fontName='Helvetica', spaceAfter=2)
dh_s     = S('DH', fontSize=10, textColor=colors.white, fontName='Helvetica-Bold')
goal_s   = S('G',  fontSize=8,  textColor=colors.HexColor('#145a32'), fontName='Helvetica-Bold', leading=11)
slot_s   = S('SL', fontSize=8,  textColor=colors.HexColor('#1a1a1a'), fontName='Helvetica-Bold', leading=11)
psm_s    = S('PS', fontSize=8,  textColor=colors.HexColor('#1a5276'), fontName='Helvetica-Bold', leading=11)
fmt_s    = S('FM', fontSize=8,  textColor=colors.HexColor('#7b241c'), fontName='Helvetica-Bold', leading=11)
focus_s  = S('F',  fontSize=7.5,textColor=colors.HexColor('#2c3e50'), fontName='Helvetica', leading=10.5)
sec_s    = S('SE', fontSize=11, textColor=colors.HexColor('#1a3c5e'), fontName='Helvetica-Bold', spaceBefore=6, spaceAfter=4)
note_s   = S('N',  fontSize=7.5,textColor=colors.HexColor('#7d6608'), fontName='Helvetica-Oblique', leading=10)
foot_s   = S('FT', fontSize=8,  textColor=colors.HexColor('#888'),    alignment=TA_CENTER, spaceBefore=5)
cal_s    = S('CA', fontSize=7.5,textColor=colors.HexColor('#2c3e50'), fontName='Helvetica', leading=10)

C_HDR  = colors.HexColor('#1a3c5e')   # unified header (dark navy)
C_MOK  = colors.HexColor('#b7770d')   # mock day
LC_PSM = colors.HexColor('#d6eaf8')
LC_FMT = colors.HexColor('#fadbd8')
LC_MOK = colors.HexColor('#fef9e7')
LC_REV = colors.HexColor('#e8daef')

W = 17.4*cm
COL = [2.6*cm, 1.5*cm, 4.8*cm, 8.5*cm]   # Slot | Sub | Topic | Focus

# ═══════════════════════════════════════════════════════════════
# 18-DAY MIXED SCHEDULE  (14 Jul – 31 Jul)
# Each day:  Morning = PSM topic,  Afternoon = FMT topic,
#            Evening = MCQs / revision of the day's topics
# Last 2 days = full revision + mock
# ═══════════════════════════════════════════════════════════════
schedule = [
  {
    "day":1,"date":"Tue, 14 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Health Care Delivery (PSM) + Death & Postmortem changes (FMT). Strong start β€” both are scoring topics.",
    "rows":[
      ("πŸŒ… Morning","PSM","Health Care Delivery",
       "Concepts of health/disease (WHO def) | Levels of care (primary/secondary/tertiary)\nReferral system | NHP 2017 key points | ASHA, ANM, MPW roles\nSubcentre (5,000 pop) | PHC (30,000) | CHC (80,000–1.2L) – staff & functions"),
      ("🌀 Afternoon","FMT","Death & Postmortem Changes",
       "Manner vs Cause vs Mechanism of death | Brain death criteria\nRigor mortis: starts 2–6h, complete 12h, resolves 36–48h; exceptions (cold, hot)\nLivor mortis: appears 1–2h, fixed 6–12h; differentiate from bruise\nDecomposition stages | Adipocere | Mummification | Cadaveric spasm"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "20 MCQs: 10 Health Care Delivery + 10 Death changes\nWrite summary: PHC norms table + Rigor timings\nMark weak points for Day 17 revision"),
    ]
  },
  {
    "day":2,"date":"Wed, 15 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Epidemiology study designs (PSM) + Wounds & Injuries (FMT). Two guaranteed exam topics.",
    "rows":[
      ("πŸŒ… Morning","PSM","Epidemiology I – Study Designs",
       "Descriptive (case report, cross-sectional) | Analytical (case-control, cohort)\nExperimental: RCT – blinding, randomisation, phases I–IV\nOdds Ratio, Relative Risk, Attributable Risk – 2Γ—2 table practice\nBias: selection, information, confounding – how to control"),
      ("🌀 Afternoon","FMT","Wounds & Injuries",
       "Incised wound: sharp edge, bleeds freely, regular margins, no bridging\nLacerated/contused: blunt force, irregular, bridging fibres present\nPunctured wound: entry > exit feature (except gunshot)\nAbrasion types: scratch, pressure, friction, impact\nChop wound | Defence wounds | Age of bruise (colour sequence)"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: study designs + wounds\nDraw 2Γ—2 table and calculate OR + RR from scratch\nMnemonics: study design hierarchy"),
    ]
  },
  {
    "day":3,"date":"Thu, 16 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Epidemiology measures + screening (PSM) + Firearm wounds (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","Epidemiology II + Screening",
       "OR vs RR vs AR vs PAR – formulas + interpretation\nWilson & Jungner 10 criteria for screening\nSensitivity, Specificity, PPV, NPV – formulas + effect of prevalence on PPV\nLikelihood ratio (+ve and –ve) | ROC curve concept | NNT, NNH"),
      ("🌀 Afternoon","FMT","Firearm Wounds",
       "Rifled vs smooth-bore firearms | Types: pistol, rifle, shotgun\nEntry wound: inverted, smaller, firm margins | Exit: everted, larger, ragged\nContact range: muzzle contusion, cruciform tear, blackening inside wound\nClose: blackening (fouling) | Intermediate: tattooing/stippling | Distant: wound only\nRicochet bullet | Bullet embolism | Spent bullet features"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: screening + firearm wounds\nPractice: calculate PPV at different prevalence values\nTable: contact vs close vs intermediate vs distant range features"),
    ]
  },
  {
    "day":4,"date":"Fri, 17 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Biostatistics (PSM) + Asphyxial deaths (FMT). Both are perennial exam favourites.",
    "rows":[
      ("πŸŒ… Morning","PSM","Biostatistics",
       "Mean, Median, Mode – when to use each | Normal distribution, skewness\nSD vs SE | Confidence interval (95% CI = mean Β± 1.96 SE)\nHypothesis: null vs alternative | Type I (Ξ±) error vs Type II (Ξ²) error | p-value\nTests: t-test (continuous), chi-square (categorical), ANOVA (>2 groups)\nSampling: SRS, systematic, stratified, cluster, convenience"),
      ("🌀 Afternoon","FMT","Asphyxial Deaths – Hanging & Strangulation",
       "Hanging: oblique ligature mark, above thyroid, non-continuous, dribbling of saliva\nJudicial hanging: fracture-dislocation C2–C3 (hangman's fracture)\nLigature strangulation: horizontal mark, below thyroid, continuous\nThrottling (manual): finger-nail marks, fracture of hyoid/thyroid cartilage\nPetechial haemorrhages in conjunctiva, face | Tardieu's spots"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: biostatistics + asphyxia\nWrite comparison table: Hanging vs Ligature strangulation vs Throttling\nRevise p-value + Type I/II error concept"),
    ]
  },
  {
    "day":5,"date":"Sat, 18 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Demography & Vital Statistics (PSM) + Drowning & Suffocation (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","Demography & Vital Statistics",
       "CBR, CDR | IMR (deaths <1yr/1000 LB) | NMR, PNMR, U5MR, MMR – formulas\nIndia 2024 values: IMR ~27, MMR ~97, TFR ~2.0, Literacy 74%\nGFR, TFR, NRR, GRR | Demographic cycle phases I–IV\nCensus 2011: 1.21B, sex ratio 940, decadal growth 17.7%\nSRS – purpose and methodology | Civil Registration System"),
      ("🌀 Afternoon","FMT","Drowning & Suffocation",
       "Drowning: wet (90%) vs dry (10%) – laryngospasm\nFresh water: hypotonic β†’ haemolysis, ↑K+, ↓Na+ | Salt water: hypertonic β†’ pulmonary oedema\nDiatom test: gold standard (hydrofluoric acid digestion)\nCafe-au-lait spots | Washerwoman's hands | Cutis anserina | Emphysema aquosum\nSmothering | Burking (smothering + compression) | Overlaying | Traumatic asphyxia"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: vital statistics + drowning\nMemorise India vital stats values (must-know for theory)\nDrowning: fresh vs salt water – comparison table"),
    ]
  },
  {
    "day":6,"date":"Sun, 19 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Nutrition (PSM) + Sexual Offences & POCSO (FMT). Both are high-scoring in UT.",
    "rows":[
      ("πŸŒ… Morning","PSM","Nutrition",
       "Kwashiorkor vs Marasmus – clinical features comparison table\nGomez classification (% expected weight) | IAP classification | Waterlow (stunting/wasting)\nSAM vs MAM – MUAC cutoffs (<11.5cm = SAM) | RUTF, F75, F100 protocol\nVitamin A: Bitot's spots, xerophthalmia stages (XN, X1A, X1B, X2, X3A/B) | Dose\nVitamin D: rickets signs | Iodine: goitre, cretinism | Iron: stages of deficiency"),
      ("🌀 Afternoon","FMT","Sexual Offences & POCSO",
       "Rape: IPC Sec 375 definition (7 circumstances) | Sec 376 punishment\nExamination: consent, two-doctor rule, DNA swab protocol, two-finger test controversy\nHymen: types (annular, fimbriated, cribriform, imperforate) | medico-legal significance\nPOCSO Act 2012: <18 yrs | Mandatory reporting | Sec 19 (duty to report)\nAge estimation relevance: Gustafson's 6 criteria | Ossification centres (key ones)"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: nutrition + sexual offences\nWrite: Kwashiorkor vs Marasmus table from memory\nRevise Gustafson's 6 criteria mnemonic: A-P-S-R-C-T"),
    ]
  },
  {
    "day":7,"date":"Mon, 20 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Communicable diseases I – respiratory & vaccine-preventable (PSM) + Identification (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","Communicable Diseases I",
       "TB/NTEP: DOTS, categories (Cat I/II/III), 2HRZE/4HR regimen, MDR/XDR definitions\nUIP vaccine schedule: complete table (BCG, OPV, Hep B, DPT, MMR, Td) – age, route, site, dose\nCold chain: ILR (2–8Β°C), deep freezer (βˆ’20Β°C), VVM types\nMeasles, Polio (types, eradication), Diphtheria – incubation + control"),
      ("🌀 Afternoon","FMT","Identification",
       "Primary identifiers: fingerprints (Galton's ridge patterns), DNA, dental records\nGustafson's 6 criteria: Attrition, Periodontosis, Secondary dentine, Root resorption, Cementum apposition, Transparency of root\nDNA fingerprinting: RFLP, STR (autosomal), Y-STR (paternity), mtDNA (maternity)\nOssification centres for age estimation: key bones + timings\nBlood grouping: ABO, Rh, Bombay phenotype (Oh) – medico-legal uses"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: vaccines + identification\nWrite UIP schedule from memory\nMnemonic for Gustafson's criteria: APSRCT"),
    ]
  },
  {
    "day":8,"date":"Tue, 21 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Vector-borne diseases (PSM) + Toxicology I – Corrosives & Pesticides (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","Communicable Diseases II – Vector-borne",
       "Malaria: Anopheles vector | P. falciparum (fatal) | ACT regimen | RDT\nDengue: Aedes aegypti | 4 serotypes | NS1 antigen | DHF vs DSS warning signs\nFilariasis: Culex | MDA (DEC + Albendazole) | Night Blood Survey\nKala-azar: sand fly | Rk39 test | Miltefosine treatment\nJE: Culex tritaeniorhynchus | vaccine\nLeprosy: NLEP | MDT (PB 6 months / MB 12 months)"),
      ("🌀 Afternoon","FMT","Toxicology I – Corrosives & Pesticides",
       "H2SO4 (vitriol): black leathery eschar, no penetration into stomach wall early\nHCl: grayish-white, pungent odour | HNO3: yellow (xanthoprotein reaction)\nAlkali: saponification, collar of Billroth (mucosa), slippery feel\nOP mechanism: irreversible AChE inhibition | SLUDGE/DUMBELS features\nAtropine: 2–4 mg IV, repeat till full atropinisation | PAM (pralidoxime): within 24–48h\nParaquat: delayed pulmonary fibrosis | AlPO4 (Aluminium phosphide): phosphine gas, bread smell"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: vector-borne + corrosives/pesticides\nOP poisoning management steps from memory\nVector-disease-drug table: all 5 diseases"),
    ]
  },
  {
    "day":9,"date":"Wed, 22 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Environment & Water (PSM) + Toxicology II – Heavy metals & alcohol (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","Environmental Health",
       "Water quality: E. coli 0/100 mL | Residual chlorine 0.5 mg/L | Turbidity <1 NTU\nPurification: sedimentation β†’ coagulation (alum) β†’ filtration β†’ chlorination\nBreakpoint chlorination | Horrocks test (field test for chlorine)\nSewage: Imhoff tank, oxidation pond, trickling filter, activated sludge\nLatrine types: water seal, septic tank, bore hole, ECOSAN\nNoise: >85 dB = NIHL | Air pollutants: PM2.5 (cardiovascular), CO (hemoglobin binding)"),
      ("🌀 Afternoon","FMT","Toxicology II – Heavy Metals & Alcohol",
       "Lead: Burton's line (gums), basophilic stippling (RBC), wrist drop, EDTA chelation\nArsenic: Mees lines (nails), garlic odour, rain-drop pigmentation, Marsh test\nMercury: Pink disease (acrodynia), Mad Hatter (CNS), Minamata disease\nEthanol: metabolism via ADH β†’ acetaldehyde β†’ acetate\nWidmark formula: BAC = A / (r Γ— W) | India driving limit: 30 mg% | Fatal: ~400 mg%\nStages of drunkenness: subclinical (10–50 mg%) β†’ excitement β†’ confusion β†’ stupor β†’ coma"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: environment + toxicology II\nWrite Widmark formula + BAC level stages from memory\nHeavy metal antidote table: Lead=EDTA, Arsenic=BAL, Mercury=BAL"),
    ]
  },
  {
    "day":10,"date":"Thu, 23 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Occupational health (PSM) + Toxicology III – Narcotics & Jurisprudence (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","Occupational Health",
       "Pneumoconiosis: Silicosis (quartz dust), Asbestosis (mesothelioma risk), Byssinosis (cotton), Anthracosis (coal)\nBerylliosis, Siderosis (iron), Stannosis (tin)\nESI Act: 6 benefits (medical, sickness, maternity, disablement, dependant, funeral)\nFactories Act: working hours, age restrictions, welfare provisions\nWorkmen's Compensation Act | Occupational exposure limits (TLV, PEL, STEL)"),
      ("🌀 Afternoon","FMT","Toxicology III – Narcotics & Medical Jurisprudence",
       "Opium/Morphine/Heroin: miosis, respiratory depression, naloxone antidote\nCannabis: cannabis psychosis, no specific antidote, conjunctival congestion\nCocaine: local anaesthetic, euphoria, nasal septum perforation\nAmphetamine: sympathomimetic | LSD: hallucinogen, chromosomal damage\nIPC 299 (CHN) vs 300 (Murder) – 5 exceptions to murder rule\nIPC 302 (murder punishment) | 304A (medical negligence) | 304B (dowry death)\nIPC 319–323 (hurt, grievous hurt) | Consent: informed, implied, emergency"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: occupational health + narcotics/jurisprudence\nIPC sections table: write all from memory\nDrug of abuse features: quick-recall table"),
    ]
  },
  {
    "day":11,"date":"Fri, 24 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"National Health Programs (PSM) + Head injuries & special FMT topics (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","National Health Programs I",
       "NHM: NRHM + NUHM components | JSY cash incentives (rural/urban/SC/ST)\nJSSK: free services for pregnant women & sick neonates\nRCH II: 4 ANC visits, TT, iron-folic acid, institutional delivery\nNTEP (TB) | NVBDCP targets | National Programme for Control of Blindness\nNational Mental Health Programme | NPCDCS (diabetes, CVD, cancer)"),
      ("🌀 Afternoon","FMT","Head Injuries & Special Topics",
       "Extradural haemorrhage: middle meningeal artery, lucid interval, lens-shaped on CT\nSubdural haemorrhage: bridging veins, crescent-shaped, elderly/alcoholics\nSubarachnoid haemorrhage: Berry aneurysm, 'thunderclap' headache\nCoup vs Contre-coup injury | Diffuse axonal injury\nInfanticide: live birth tests – hydrostatic test (lung float), Breslau's test, stomach float\nExhumation: procedure, fresh vs exhumed body differences\nInquest: Sec 174 CrPC (police) vs Sec 176 CrPC (magistrate)"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: national programs + head injuries\nHaemorrhage types – location, source, CT appearance table\nJSY cash amounts: BPL rural Rs.1400, urban Rs.1000"),
    ]
  },
  {
    "day":12,"date":"Sat, 25 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Maternal & Child Health + Family Planning (PSM) + Medico-legal special topics (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","MCH & Family Planning",
       "ANC: minimum 4 visits, content at each visit | NSSK (Navjaat Shishu Suraksha Karyakram)\nRBSK: 30 health conditions screened, DEIC management\nKangaroo Mother Care | IMNCI protocol\nContraceptives: OCP (mechanism, failure rate) | IUCD types (CuT 380A, LNG-IUS)\nMTP Act 1971 (amendment 2021): up to 20 weeks, 24 weeks in special cases\nTerminal methods: tubectomy (Pomeroy's), vasectomy (NSV)"),
      ("🌀 Afternoon","FMT","Medico-legal Special Topics",
       "Medical negligence: Bolam test, Res ipsa loquitur, contributory negligence\nConsumer Protection Act: applicability to medical services (Supreme Court 1995)\nInformed consent: elements, exceptions, documentation\nProfessional misconduct (NMC): infamous conduct categories\nDowry death: Sec 304B IPC + Sec 113B Evidence Act\nSexual harassment: POSH Act | Workplace violence against doctors"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: MCH/FP + medico-legal topics\nMTP Act amendments – gestational limits + conditions\nMedical negligence landmark cases: Jacob Mathew 2005"),
    ]
  },
  {
    "day":13,"date":"Sun, 26 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"HIV/AIDS + Other communicable diseases (PSM) + Thermal & chemical burns (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","HIV/AIDS & Other Communicable Diseases",
       "HIV: window period (22 days PCR / 45 days antibody) | ICTC/PPTCT services\nART eligibility: CD4 <200 (old) β†’ all regardless of CD4 (current treat-all policy)\nFirst line ART: TDF + 3TC + DTG\nCholera: El-Tor biotype, rice water stools, ORS formula (glucose 20g, NaCl 3.5g per L)\nHepatitis A/E: faeco-oral | Hep B: blood/sexual/perinatal | Hep C: blood-borne\nNational AIDS Control Programme (NACP) – current phase"),
      ("🌀 Afternoon","FMT","Burns & Thermal Injuries",
       "Rule of 9 (Wallace's rule): head 9%, each arm 9%, each leg 18%, trunk 36%, perineum 1%\nDepth: superficial (1st degree) | partial thickness (2nd) | full thickness (3rd)\nAntemortem vs postmortem burns – vital reaction, soot in airways\nPugilistic attitude (heat stiffening) | Heat stroke vs heat exhaustion\nElectrical burns: entry (small, charred) vs exit (larger) marks\nLightning: Lichtenberg figures (ferning pattern), keraunoparalysis"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: HIV/communicable + burns\nBSA calculation from burns using Rule of 9\nAntemortem vs postmortem burns – comparison table"),
    ]
  },
  {
    "day":14,"date":"Mon, 27 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Research methods + Outbreak investigation (PSM) + Toxicology review & antidotes (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","Research Methods & Outbreak Investigation",
       "Clinical trial phases I–IV | RCT: allocation concealment, CONSORT\nSystematic review vs meta-analysis | Forest plot, funnel plot, heterogeneity (IΒ²)\nSteps of outbreak investigation (10 steps): verify diagnosis β†’ case definition β†’ case count β†’ hypothesis β†’ test hypothesis β†’ control\nEpidemic curves: point source (narrow bell), propagated (multiple peaks)\nSurveillance: active vs passive | IDSP: P, L, S forms"),
      ("🌀 Afternoon","FMT","Toxicology Review – Antidotes & Special Poisons",
       "Antidote table: OP β†’ Atropine + PAM | Opioids β†’ Naloxone | CO β†’ O2\nLead β†’ EDTA | Arsenic/Mercury β†’ BAL (Dimercaprol) | Cyanide β†’ dicobalt edetate\nCarbolic acid (phenol): port-wine urine, pulmonary oedema, no emesis\nStrychnine: opisthotonus, 'Risus sardonicus', convulsions, conscious patient\nSnake bite: haemotoxic (Russell's viper) vs neurotoxic (krait, cobra) | ASV dosing\nMushroom (Amanita): muscarine β†’ atropine antidote"),
      ("πŸŒ™ Evening","MCQs","Revision + Drill",
       "25 MCQs: research methods + antidotes\nWrite antidote table from memory\nMeta-analysis concepts: Forest plot interpretation"),
    ]
  },
  {
    "day":15,"date":"Tue, 28 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Health programs + PSM wrap-up (PSM) + FMT rapid full review (FMT).",
    "rows":[
      ("πŸŒ… Morning","PSM","Health Planning & Administration + Wrap-up",
       "Five-Year Plans: 1st (1951) β†’ current NITI Aayog | Health sector priorities\nAlma-Ata 1978: PHC as strategy | Jakarta, Ottawa charters\nNational Health Mission targets | Ayushman Bharat (PMJAY) – Rs.5 lakh cover\nHPE (Health Promotion): Ottawa 5 action areas\nPSM weak topics rapid re-read based on marked areas"),
      ("🌀 Afternoon","FMT","FMT Comprehensive Review",
       "Rapid fire: Death changes β†’ Wounds β†’ Asphyxia β†’ Sexual offences β†’ Identification\nAll IPC sections: 299, 300, 302, 304A, 304B, 319–323, 375, 376\nAll toxicology antidotes + key features\nAll alcohol BAC levels\nGustafson's 6 criteria + DNA fingerprinting uses"),
      ("πŸŒ™ Evening","PYQs","Previous Year Questions",
       "Solve 15 PSM PYQs (long answers + short notes)\nSolve 15 FMT PYQs (long answers + short notes)\nModel answers for: Study designs | Hanging vs Strangulation | OP poisoning"),
    ]
  },
  {
    "day":16,"date":"Wed, 29 Jul","hc":C_HDR,"lc":colors.HexColor('#eaf4fb'),
    "goal":"Full-day PYQ practice + targeted weak topic revision for both subjects.",
    "rows":[
      ("πŸŒ… Morning","PSM","PSM PYQ + Weak Topics",
       "Solve 20 MCQs on weakest PSM chapter (from marked notes)\nWrite model answer: Epidemiological study designs (8-mark answer)\nWrite short note: MMR in India / Cold chain / Wilson's screening criteria"),
      ("🌀 Afternoon","FMT","FMT PYQ + Weak Topics",
       "Solve 20 MCQs on weakest FMT chapter (from marked notes)\nWrite model answer: Hanging vs Strangulation (8-mark answer)\nWrite short note: Rigor mortis / Gustafson's criteria / OP poisoning management"),
      ("πŸŒ™ Evening","Revision","Consolidation",
       "Re-read all comparison tables made over 16 days\nPrepare 1-page cheat sheet: formulas + IPC sections + vital stats values\nOrganise all summary notes for Day 17 flash revision"),
    ]
  },
  {
    "day":17,"date":"Thu, 30 Jul","hc":colors.HexColor('#4a235a'),"lc":LC_REV,
    "goal":"FULL RAPID REVISION DAY β€” Flash through all topics. No new content. Use only your summary sheets.",
    "rows":[
      ("πŸŒ… Morning","PSM","PSM Flash Revision",
       "Epidemiology: formulas sheet | Study designs hierarchy\nVital stats: all rates, India values | PHC/Subcentre norms\nVaccine schedule + cold chain temps | National programs key facts\nNutrition: PEM table, vitamin deficiencies | Biostatistics: test indications"),
      ("🌀 Afternoon","FMT","FMT Flash Revision",
       "Death: rigor + livor timings (memorise exactly)\nWounds: incised vs lacerated vs puncture – 3 differences each\nHanging vs strangulation vs throttling – comparison table\nOP: SLUDGE + atropine + PAM rule | Alcohol: BAC level stages\nIPC sections table | Gustafson's 6 criteria | DNA tests uses"),
      ("πŸŒ™ Evening","MCQs","50-Question Mixed Mock",
       "25 PSM MCQs + 25 FMT MCQs – timed (40 minutes)\nScore and analyse errors\nNote 3 most common mistake areas β†’ re-read those tonight ONLY"),
    ]
  },
  {
    "day":18,"date":"Fri, 31 Jul","hc":C_MOK,"lc":LC_MOK,
    "goal":"EXAM EVE β€” Mock exam in morning. Light revision in afternoon. Rest in evening. Sleep by 10 PM.",
    "rows":[
      ("πŸŒ… Morning","PSM","PSM Mock Exam (Timed)",
       "10 MCQs + 1 Long answer (30 marks) + 2 Short notes (10 marks each) β†’ 1.5 hrs\nSuggested LA: Epidemiological study designs OR Primary Health Care\nSuggested SN: MMR in India | Sensitivity & Specificity"),
      ("🌀 Afternoon","FMT","FMT Mock Exam (Timed)",
       "10 MCQs + 1 Long answer (30 marks) + 2 Short notes (10 marks each) β†’ 1.5 hrs\nSuggested LA: Hanging vs Strangulation OR OP Poisoning management\nSuggested SN: Rigor mortis | Gustafson's 6 criteria"),
      ("πŸŒ™ Evening","REST","Final Prep & Sleep",
       "Check mock answers – note errors ONLY (don't re-read full topics)\nFlash the 1-page cheat sheet (formulas + IPC sections) ONCE\nPrepare: Hall ticket, ID proof, stationery, water bottle\nπŸŒ™ SLEEP BY 10 PM β€” rest is the final preparation"),
    ]
  },
]

# ═══════════════════════════════════
# BUILD PDF
# ═══════════════════════════════════
elements = []

# Title
elements.append(Spacer(1, 0.2*cm))
elements.append(Paragraph("PSM + FMT  |  18-DAY MIXED REVISION SCHEDULE", title_s))
elements.append(Paragraph("14th July – 31st July 2026  |  Exam begins 1st August  |  Both subjects studied EVERY day", sub_s))
elements.append(Paragraph("Full syllabus coverage with high-yield focus  |  3 slots/day: PSM Morning | FMT Afternoon | MCQs Evening", sub_s))
elements.append(Spacer(1, 0.3*cm))
elements.append(HRFlowable(width="100%", thickness=2, color=C_HDR))
elements.append(Spacer(1, 0.3*cm))

# Strategy note
strat = Table([[Paragraph(
    "πŸ“Œ  Strategy: PSM covers topics progressively Days 1–15 | FMT covers topics progressively Days 1–14 | "
    "Days 15–16 = PYQ practice | Day 17 = Full rapid revision | Day 18 = Mock exam + rest", note_s
)]], colWidths=[W])
strat.setStyle(TableStyle([
    ('BACKGROUND',(0,0),(-1,-1),colors.HexColor('#fef9e7')),
    ('BOX',(0,0),(-1,-1),1,colors.HexColor('#f0c040')),
    ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
    ('LEFTPADDING',(0,0),(-1,-1),8),
]))
elements.append(strat)
elements.append(Spacer(1, 0.4*cm))

# ── OVERVIEW CALENDAR ──
elements.append(Paragraph("πŸ“…  18-DAY AT-A-GLANCE CALENDAR", sec_s))

cal_hdr = [
    Paragraph("<b>Day</b>", slot_s),
    Paragraph("<b>Date</b>", slot_s),
    Paragraph("<b>PSM Topic (Morning)</b>", psm_s),
    Paragraph("<b>FMT Topic (Afternoon)</b>", fmt_s),
]
cal_rows = [cal_hdr]
for d in schedule:
    psm_topic = d['rows'][0][2] if len(d['rows']) > 0 else "-"
    fmt_topic = d['rows'][1][2] if len(d['rows']) > 1 else "-"
    cal_rows.append([
        Paragraph(f"<b>{d['day']}</b>", cal_s),
        Paragraph(d['date'], cal_s),
        Paragraph(psm_topic, cal_s),
        Paragraph(fmt_topic, cal_s),
    ])

cal = Table(cal_rows, colWidths=[1.2*cm, 2.5*cm, 6.8*cm, 6.9*cm])
cal_ts = [
    ('BACKGROUND',(0,0),(-1,0),colors.HexColor('#2e4057')),
    ('TEXTCOLOR',(0,0),(-1,0),colors.white),
    ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'),
    ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#cccccc')),
    ('VALIGN',(0,0),(-1,-1),'TOP'),
    ('TOPPADDING',(0,0),(-1,-1),3),('BOTTOMPADDING',(0,0),(-1,-1),3),
    ('LEFTPADDING',(0,0),(-1,-1),4),('RIGHTPADDING',(0,0),(-1,-1),4),
    ('ALIGN',(0,0),(0,-1),'CENTER'),
    ('FONTSIZE',(0,0),(-1,0),8),
]
for i,d in enumerate(schedule,1):
    cal_ts.append(('BACKGROUND',(2,i),(2,i), LC_PSM if i%2==1 else colors.HexColor('#eaf4fb')))
    cal_ts.append(('BACKGROUND',(3,i),(3,i), LC_FMT if i%2==1 else colors.HexColor('#fff5f5')))
    if d['day'] == 17:
        cal_ts.append(('BACKGROUND',(0,i),(-1,i), LC_REV))
    if d['day'] == 18:
        cal_ts.append(('BACKGROUND',(0,i),(-1,i), LC_MOK))
cal.setStyle(TableStyle(cal_ts))
elements.append(cal)
elements.append(Spacer(1,0.4*cm))
elements.append(HRFlowable(width="100%", thickness=1.5, color=colors.HexColor('#bbbbbb')))
elements.append(Spacer(1,0.3*cm))

# ── DAILY DETAIL ──
elements.append(Paragraph("πŸ“–  DAILY DETAILED SCHEDULE", sec_s))

for d in schedule:
    # Header
    hdr = Paragraph(f"<font color='white'><b>  DAY {d['day']}  |  {d['date']}  |  Both PSM + FMT</b></font>", dh_s)
    hdr_t = Table([[hdr]], colWidths=[W])
    hdr_t.setStyle(TableStyle([
        ('BACKGROUND',(0,0),(-1,-1),d['hc']),
        ('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6),
        ('LEFTPADDING',(0,0),(-1,-1),8),
    ]))

    # Goal
    goal_t = Table([[Paragraph(f"🎯  {d['goal']}", goal_s)]], colWidths=[W])
    goal_t.setStyle(TableStyle([
        ('BACKGROUND',(0,0),(-1,-1),colors.HexColor('#eafaf1')),
        ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
        ('LEFTPADDING',(0,0),(-1,-1),8),
        ('BOX',(0,0),(-1,-1),0.5,colors.HexColor('#a9dfbf')),
    ]))

    # Slot rows
    rows = [[
        Paragraph("<b>Slot</b>", slot_s),
        Paragraph("<b>Subj</b>", slot_s),
        Paragraph("<b>Topic</b>", slot_s),
        Paragraph("<b>Focus Points</b>", slot_s),
    ]]
    for i, (sl, subj, tp, fp) in enumerate(d['rows']):
        subj_style = psm_s if subj == "PSM" else (fmt_s if subj == "FMT" else slot_s)
        if subj == "PSM":
            row_bg = LC_PSM
        elif subj == "FMT":
            row_bg = LC_FMT
        elif subj in ("MCQs","PYQs"):
            row_bg = colors.HexColor('#f0f0f0')
        else:
            row_bg = d['lc']
        rows.append([
            Paragraph(sl.replace('\n','<br/>'), slot_s),
            Paragraph(f"<b>{subj}</b>", subj_style),
            Paragraph(tp, subj_style),
            Paragraph(fp.replace('\n','<br/>'), focus_s),
        ])

    slots_t = Table(rows, colWidths=COL)
    slots_ts = [
        ('BACKGROUND',(0,0),(-1,0),colors.HexColor('#2e4057')),
        ('TEXTCOLOR',(0,0),(-1,0),colors.white),
        ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'),
        ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#cccccc')),
        ('VALIGN',(0,0),(-1,-1),'TOP'),
        ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),6),
        ('LEFTPADDING',(0,0),(-1,-1),5),('RIGHTPADDING',(0,0),(-1,-1),5),
        ('ALIGN',(1,0),(1,-1),'CENTER'),
    ]
    for i, (sl, subj, tp, fp) in enumerate(d['rows'], 1):
        if subj == "PSM":
            bg = LC_PSM
        elif subj == "FMT":
            bg = LC_FMT
        else:
            bg = colors.HexColor('#f0f0f0')
        slots_ts.append(('BACKGROUND',(0,i),(-1,i), bg))
    slots_t.setStyle(TableStyle(slots_ts))

    elements.append(KeepTogether([hdr_t, goal_t, slots_t, Spacer(1, 0.45*cm)]))

# ── HIGH YIELD ──
elements.append(HRFlowable(width="100%", thickness=2, color=C_HDR))
elements.append(Spacer(1,0.3*cm))
elements.append(Paragraph("⭐  HIGH-YIELD MASTER LIST  β€”  BOTH SUBJECTS", sec_s))

hyt_psm = [
    ("Epidemiology study designs","OR, RR, AR formulas + 2Γ—2 table construction"),
    ("Screening","Wilson's 10 criteria | Sensitivity/Specificity/PPV/NPV formulas"),
    ("IMR / MMR / TFR","Formulas + India 2024 values (IMR 27, MMR 97, TFR 2.0)"),
    ("PHC norms","Population 30,000 | Sub-centre 5,000 | CHC 80,000–1.2 lakh"),
    ("UIP vaccine schedule","Full age-wise schedule + cold chain temperatures"),
    ("NTEP","DOTS categories | 2HRZE/4HR regimen | MDR/XDR definitions"),
    ("PEM classification","Gomez / IAP / Waterlow | SAM vs MAM | MUAC cutoffs"),
    ("ICDS programme","6 services | Beneficiaries | Age group 0–6 years"),
    ("Water quality standards","E. coli 0/100 mL | Residual Cl 0.5 mg/L | pH 6.5–8.5"),
    ("Biostatistics","Type I/II error | p-value | t-test vs chi-square indications"),
]
hyt_fmt = [
    ("Rigor mortis","Starts 2–6h | Complete 12h | Resolves 36–48h | Exceptions"),
    ("Livor mortis","Appears 1–2h | Fixed 6–12h | How to differentiate from bruise"),
    ("Hanging vs Strangulation","Ligature direction, continuity, hyoid, petechiae"),
    ("Drowning","Diatom test (gold standard) | Wet vs dry | Fresh vs salt water"),
    ("OP poisoning","SLUDGE + Atropine (full atropinisation) + PAM within 24–48h"),
    ("IPC 299 vs 300","CHN vs Murder + all 5 exceptions to murder"),
    ("Alcohol BAC levels","30 mg%=drive limit | 80 mg%=legal presumption | 400 mg%=lethal"),
    ("Gustafson's 6 criteria","APSRCT: Attrition, Periodontosis, Secondary dentine, Root resorption, Cementum, Transparency"),
    ("IPC 375 / 376 + POCSO","Rape definition | POCSO age (<18) | Sec 19 mandatory reporting"),
    ("DNA fingerprinting","RFLP, STR, Y-STR, mtDNA – which test for which scenario"),
]
hy_hdr = [
    Paragraph("<b>PSM TOPIC</b>", slot_s),
    Paragraph("<b>KEY POINT</b>", slot_s),
    Paragraph("<b>FMT TOPIC</b>", slot_s),
    Paragraph("<b>KEY POINT</b>", slot_s),
]
hy_rows = [hy_hdr]
for i,(pt,pw),(ft,fw) in zip(range(len(hyt_psm)), hyt_psm, hyt_fmt):
    hy_rows.append([
        Paragraph(pt, psm_s), Paragraph(pw, focus_s),
        Paragraph(ft, fmt_s), Paragraph(fw, focus_s),
    ])
hy_t = Table(hy_rows, colWidths=[3.0*cm, 5.7*cm, 3.0*cm, 5.7*cm])
hy_ts = [
    ('BACKGROUND',(0,0),(1,0),colors.HexColor('#1a5276')),
    ('BACKGROUND',(2,0),(3,0),colors.HexColor('#7b241c')),
    ('TEXTCOLOR',(0,0),(-1,0),colors.white),
    ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'),
    ('GRID',(0,0),(-1,-1),0.5,colors.HexColor('#cccccc')),
    ('VALIGN',(0,0),(-1,-1),'TOP'),
    ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
    ('LEFTPADDING',(0,0),(-1,-1),5),('RIGHTPADDING',(0,0),(-1,-1),5),
    ('ALIGN',(0,0),(-1,0),'CENTER'),
]
for i in range(1,len(hy_rows)):
    hy_ts.append(('BACKGROUND',(0,i),(1,i), LC_PSM if i%2==1 else colors.HexColor('#eaf4fb')))
    hy_ts.append(('BACKGROUND',(2,i),(3,i), LC_FMT if i%2==1 else colors.HexColor('#fff5f5')))
hy_t.setStyle(TableStyle(hy_ts))
elements.append(hy_t)
elements.append(Spacer(1,0.4*cm))

# Tips
tips = [
    "πŸ“Œ Every morning = PSM  |  Every afternoon = FMT  |  Every evening = MCQ drill (non-negotiable)",
    "πŸ“Œ After studying each slot: close notes and write 5 key points from memory β€” highest retention method",
    "πŸ“Œ Mark weak topics in red as you go; revisit them on Days 15–16",
    "πŸ“Œ Days 17–18: ZERO new topics. Only revision, mock tests, and rest",
    "πŸ“Œ Day 18 evening: Prepare stationery + hall ticket the night before. Sleep by 10 PM",
    "πŸ“Œ Use comparison tables (Hanging/Strangulation, OR/RR, Kwashiorkor/Marasmus) β€” they save exam time",
]
tips_d = [[Paragraph("<b>πŸ’‘ STUDY STRATEGY REMINDERS</b>", goal_s)]] + [[Paragraph(t, note_s)] for t in tips]
tips_t = Table(tips_d, colWidths=[W])
tips_t.setStyle(TableStyle([
    ('BACKGROUND',(0,0),(-1,0),colors.HexColor('#fef9e7')),
    ('BACKGROUND',(0,1),(-1,-1),colors.HexColor('#fffde7')),
    ('BOX',(0,0),(-1,-1),1,colors.HexColor('#f0c040')),
    ('INNERGRID',(0,0),(-1,-1),0.3,colors.HexColor('#f8e08e')),
    ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
    ('LEFTPADDING',(0,0),(-1,-1),8),
]))
elements.append(tips_t)
elements.append(Spacer(1,0.3*cm))

elements.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor('#cccccc')))
elements.append(Paragraph(
    "PSM + FMT  |  Mixed 18-Day Revision  |  Exam 1st August 2026  |  Consistent effort beats cramming. You've got this! 🌟",
    foot_s
))

doc.build(elements)
print(f"βœ… PDF ready: {output_path}")
Running Command

cd /home/daytona/workspace/psm-fmt-timetable && python generate_mixed.py

Running Command

ls -lh /home/daytona/workspace/psm-fmt-timetable/PSM_FMT_Mixed_18Day_Schedule.pdf

Here's your updated PDF with both subjects every single day! πŸŽ‰

PSM FMT Mixed 18Day Schedule

PDF Document Β· PDF


The new structure (every day):
SlotSubjectWhat
πŸŒ… MorningPSM (blue)New PSM topic with full focus points
🌀 AfternoonFMT (red)New FMT topic with full focus points
πŸŒ™ EveningMCQs25 MCQs covering that day's two topics
How topics are spread:
  • PSM topics run Days 1–15 (Health Care β†’ Epidemiology β†’ Biostatistics β†’ Demography β†’ Nutrition β†’ Communicable diseases β†’ Environment β†’ Occupational β†’ Programs β†’ PYQs)
  • FMT topics run Days 1–14 (Death β†’ Wounds β†’ Firearms β†’ Asphyxia β†’ Drowning β†’ Sexual offences β†’ Identification β†’ Toxicology β†’ Jurisprudence β†’ Review β†’ PYQs)
  • Day 16 = PYQ practice both subjects
  • Day 17 = Full rapid flash revision
  • Day 18 = Mock exam + rest (exam eve)
Today (Day 1) you're already on it - Health Care Delivery is your morning slot. Finish the evening MCQs and you're exactly on track. All the best! 🌟
This is a shared conversation. Sign in to Orris to start your own chat.