Hey, I'm in currently MBBS third year, and from 3rd of August, I have my university exam of third prof, which contain PSM and FMT, and I want you to make a schedule for my study plan. And I also wanna do gym. And one to two-hour outing.

Asking for Preferences
Here is your personalized study schedule:

📅 MBBS 3rd Prof Exam Study Plan

Exam Date: August 3, 2026 | Today: July 14, 2026 | Days Available: 20 days Subjects: PSM (Community Medicine) + FMT (Forensic Medicine) - equal weightage

⏰ Daily Time Structure

TimeActivity
5:30 AMWake up, freshen up, light breakfast
6:00 - 6:45 AMQuick revision / flashcards (previous day's topics)
7:00 - 9:00 AMGYM
9:00 - 9:30 AMShower + Breakfast
9:30 AM - 1:00 PMStudy Block 1 - Subject A (3.5 hrs)
1:00 - 2:00 PMLunch + Rest
2:00 - 5:30 PMStudy Block 2 - Subject B (3.5 hrs)
5:30 - 7:00 PMOuting / Break (1.5 hrs)
7:00 - 7:30 PMLight snack + freshen up
7:30 - 9:30 PMStudy Block 3 - Mixed revision / PYQs (2 hrs)
9:30 - 10:00 PMWind down, plan next day
10:00 PMSleep
Total study: ~9 hours/day | Gym: 2 hrs | Outing: 1.5 hrs

📚 20-Day Subject Plan

PSM Topics to Cover

  1. Epidemiology (basics, study designs, bias, screening)
  2. Biostatistics (all formulae, sampling, tests)
  3. Communicable diseases (IHR, vaccines, national programs)
  4. Non-communicable diseases (CVD, cancer, diabetes)
  5. Environment & occupational health
  6. Maternal & child health (MCH, RCH, immunization schedule)
  7. Nutrition (deficiency diseases, PEM, programs)
  8. Health planning & management (5-year plans, NHM, NRHM)
  9. Demography (Census, vital statistics, indicators)
  10. International health organizations (WHO, UNICEF, programs)

FMT Topics to Cover

  1. Forensic thanatology (death changes, autopsy)
  2. Forensic pathology (injuries - sharp, blunt, firearm)
  3. Asphyxial deaths (hanging, drowning, suffocation)
  4. Sexual offences & POCSO
  5. Medical jurisprudence (MCI, consent, negligence)
  6. Forensic toxicology (poisons - corrosive, metallic, organic)
  7. Forensic serology & DNA
  8. Identification (age, sex, stature, race)
  9. Bloodstain patterns & wound ballistics
  10. IPC sections (important ones - 299, 300, 302, 376, etc.)

📆 Week-by-Week Breakdown

Week 1 (July 14-20) - Foundation & High-Yield Topics

DayMorning Block (PSM)Afternoon Block (FMT)Evening Revision
Tue Jul 14Epidemiology basicsThanatology (death changes)PYQs on both
Wed Jul 15Epidemiology - study designsForensic pathology - injuriesShort notes
Thu Jul 16Biostatistics (formulae + sampling)Asphyxial deathsStats PYQs
Fri Jul 17Biostatistics (tests of significance)Sexual offences + POCSOFMT PYQs
Sat Jul 18Communicable diseases (IHR, surveillance)Medical jurisprudenceMixed PYQs
Sun Jul 19National programs (EPI, malaria, TB)Consent, negligence, MCIWeekly test (self)
Mon Jul 20REVISION DAY - Week 1 PSMREVISION DAY - Week 1 FMTWeak area focus

Week 2 (July 21-27) - Completing Syllabus

DayMorning Block (PSM)Afternoon Block (FMT)Evening Revision
Tue Jul 21Environment & occupational healthToxicology - corrosive poisonsShort notes
Wed Jul 22MCH, RCH, immunization scheduleToxicology - metallic poisonsToxicology PYQs
Thu Jul 23Nutrition (PEM, deficiencies)Toxicology - organic/misc poisonsNutrition PYQs
Fri Jul 24Health planning (NHM, NRHM, plans)Forensic serology + DNAAdmin PYQs
Sat Jul 25Demography (census, indicators)Identification (age, sex, stature)Demography PYQs
Sun Jul 26International health orgs + miscIPC sections + wound ballisticsMixed PYQs
Mon Jul 27REVISION DAY - Week 2 PSMREVISION DAY - Week 2 FMTSelf-test

Week 3 (July 28 - Aug 2) - Intensive Revision & PYQs

DayFocus
Tue Jul 28Full PSM revision - Epidemiology + Biostatistics (high-yield)
Wed Jul 29Full FMT revision - Thanatology + Injuries + Asphyxia
Thu Jul 30PSM - Programs, nutrition, demography + Mock MCQs
Fri Jul 31FMT - Toxicology + Jurisprudence + IPC sections
Sat Aug 1Full-length mock paper: PSM + FMT (3 hr timed test)
Sun Aug 2Light revision only - only formulae, IPC sections, key stats. Rest by 9 PM.
Mon Aug 3EXAM DAY 🎯

📝 Study Tips for This Schedule

For PSM:
  • Make a single A4 cheat sheet for all biostatistics formulae - review every morning
  • National program facts (year started, target groups, doses) are very high-yield
  • Park's textbook + IAPSM notes for quick revision
  • Draw flow charts for epidemiological study designs
For FMT:
  • Make mnemonics for IPC sections - they come every exam
  • Toxicology: group poisons by mechanism, not by name
  • Checklists for autopsy findings of each type of death
  • Modi/Reddy textbook for standard references
General:
  • Use the 6 AM slot for flashcard revision - only review, no new content
  • Every Sunday = mandatory self-assessment with PYQs
  • Keep phone out of the study room during blocks
  • The outing is non-negotiable - it prevents burnout

🔑 High-Yield Topics (Last 3 Days Mandatory)

PSM: Herd immunity threshold formula, sensitivity/specificity/PPV/NPV, immunization schedule, MMR/IMR/TFR calculations, disease notification, NHM structure
FMT: Rigor mortis timeline, drowning diatom test, Tardieu spots, heat stiffening vs rigor, GSR (firearm), virginity examination findings, IPC 299/300/302/304/304A/375/376

Good luck! You have 20 days - that's enough time to cover everything well if you stick to this structure. The key is not skipping the revision days on Sundays and Monday of Week 1 and 2.

Create a printable PDF summary of high-yield PSM & FMT topics

Reading File
Running Command

mkdir -p /home/daytona/workspace/mbbs-study && ls /home/daytona/workspace/

Writing File

~/mbbs-study/generate_pdf.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, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem

OUTPUT = "/home/daytona/workspace/mbbs-study/HighYield_PSM_FMT.pdf"

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    rightMargin=1.8*cm,
    leftMargin=1.8*cm,
    topMargin=2*cm,
    bottomMargin=2*cm,
)

W, H = A4

# ── Colour palette ──────────────────────────────────────────────
PSM_DARK   = colors.HexColor("#1a5276")   # deep blue
PSM_LIGHT  = colors.HexColor("#d6eaf8")   # light blue
FMT_DARK   = colors.HexColor("#7b241c")   # deep red
FMT_LIGHT  = colors.HexColor("#fadbd8")   # light red
GOLD       = colors.HexColor("#f0b000")
GREY_BG    = colors.HexColor("#f4f6f7")
BLACK      = colors.black
WHITE      = colors.white

base = getSampleStyleSheet()

def style(name, **kw):
    s = ParagraphStyle(name, **kw)
    return s

# ── Styles ───────────────────────────────────────────────────────
TITLE = style("Title2", fontName="Helvetica-Bold", fontSize=22,
              textColor=WHITE, alignment=TA_CENTER, spaceAfter=4)
SUBTITLE = style("Subtitle2", fontName="Helvetica", fontSize=11,
                 textColor=WHITE, alignment=TA_CENTER, spaceAfter=2)
DATE_S = style("Date", fontName="Helvetica-Oblique", fontSize=9,
               textColor=GOLD, alignment=TA_CENTER, spaceAfter=0)

SEC_HEAD = style("SecHead", fontName="Helvetica-Bold", fontSize=13,
                 textColor=WHITE, alignment=TA_LEFT,
                 leftIndent=6, spaceAfter=0, spaceBefore=6)

TOPIC_HEAD = style("TopicHead", fontName="Helvetica-Bold", fontSize=10,
                   textColor=PSM_DARK, spaceBefore=5, spaceAfter=1)
TOPIC_HEAD_FMT = style("TopicHeadFMT", fontName="Helvetica-Bold", fontSize=10,
                       textColor=FMT_DARK, spaceBefore=5, spaceAfter=1)

BODY = style("Body2", fontName="Helvetica", fontSize=8.5,
             leading=13, spaceAfter=1, leftIndent=10)
BODY_B = style("BodyB", fontName="Helvetica-Bold", fontSize=8.5,
               leading=13, spaceAfter=1, leftIndent=10)

NOTE = style("Note", fontName="Helvetica-Oblique", fontSize=8,
             textColor=colors.HexColor("#555555"), leftIndent=10, spaceAfter=2)

FORMULA = style("Formula", fontName="Courier-Bold", fontSize=8.5,
                backColor=colors.HexColor("#eaf4fb"),
                borderPadding=(3, 6, 3, 6), leftIndent=10,
                spaceBefore=2, spaceAfter=4)

FOOTER_S = style("Footer", fontName="Helvetica-Oblique", fontSize=7,
                 textColor=colors.grey, alignment=TA_CENTER)

def add_footer(canvas, doc):
    canvas.saveState()
    canvas.setFont("Helvetica-Oblique", 7)
    canvas.setFillColor(colors.grey)
    canvas.drawCentredString(W/2, 1.1*cm, f"High-Yield PSM & FMT Summary  |  3rd Prof MBBS  |  Exam: August 3, 2026  |  Page {doc.page}")
    canvas.restoreState()

def section_banner(text, color):
    tbl = Table([[Paragraph(text, SEC_HEAD)]], colWidths=[W - 3.6*cm])
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), color),
        ("ROWBACKGROUNDS", (0,0), (-1,-1), [color]),
        ("TOPPADDING", (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING", (0,0), (-1,-1), 8),
        ("ROUNDEDCORNERS", [4, 4, 4, 4]),
    ]))
    return tbl

def topic_box(title, items, head_style, bg_color, border_color):
    """Renders a titled box with bullet items."""
    header = Table([[Paragraph(title, head_style)]], colWidths=[W - 3.6*cm])
    header.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), bg_color),
        ("TOPPADDING", (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING", (0,0), (-1,-1), 8),
        ("LINEBELOW", (0,0), (-1,-1), 0.5, border_color),
    ]))
    rows = [[Paragraph(f"• {i}", BODY)] for i in items]
    body = Table(rows, colWidths=[W - 3.6*cm])
    body.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), GREY_BG),
        ("TOPPADDING", (0,0), (-1,-1), 2),
        ("BOTTOMPADDING", (0,0), (-1,-1), 2),
        ("LEFTPADDING", (0,0), (-1,-1), 10),
        ("LINEAFTER", (0,0), (0,-1), 2, border_color),
    ]))
    return KeepTogether([header, body, Spacer(1, 4)])

def two_col_table(data_left, data_right, head_l, head_r, bg_l, bg_r, border_l, border_r):
    """Two side-by-side topic boxes."""
    col = (W - 3.6*cm) / 2 - 4

    def build_col(title, items, hs, bg, bc):
        rows = [[Paragraph(title, hs)]]
        for i in items:
            rows.append([Paragraph(f"• {i}", BODY)])
        t = Table(rows, colWidths=[col])
        t.setStyle(TableStyle([
            ("BACKGROUND", (0,0), (0,0), bg),
            ("BACKGROUND", (0,1), (-1,-1), GREY_BG),
            ("TOPPADDING", (0,0), (-1,-1), 3),
            ("BOTTOMPADDING", (0,0), (-1,-1), 2),
            ("LEFTPADDING", (0,0), (-1,-1), 6),
            ("LINEAFTER", (0,0), (0,-1), 1.5, bc),
            ("LINEBELOW", (0,0), (0,0), 0.5, bc),
        ]))
        return t

    left = build_col(head_l, data_left, TOPIC_HEAD if bg_l==PSM_LIGHT else TOPIC_HEAD_FMT, bg_l, border_l)
    right = build_col(head_r, data_right, TOPIC_HEAD_FMT if bg_r==FMT_LIGHT else TOPIC_HEAD, bg_r, border_r)

    outer = Table([[left, right]], colWidths=[col+4, col+4])
    outer.setStyle(TableStyle([
        ("VALIGN", (0,0), (-1,-1), "TOP"),
        ("LEFTPADDING", (0,0), (-1,-1), 0),
        ("RIGHTPADDING", (0,0), (-1,-1), 0),
    ]))
    return KeepTogether([outer, Spacer(1, 6)])

# ════════════════════════════════════════════════════════════════
# CONTENT
# ════════════════════════════════════════════════════════════════
story = []

# ── COVER BLOCK ──────────────────────────────────────────────────
cover_data = [[
    Paragraph("HIGH-YIELD SUMMARY", TITLE),
    Paragraph("PSM (Community Medicine)  &  FMT (Forensic Medicine)", SUBTITLE),
    Paragraph("3rd Prof MBBS  |  Exam: August 3, 2026", DATE_S),
]]
cover_tbl = Table(cover_data, colWidths=[W - 3.6*cm])
cover_tbl.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), PSM_DARK),
    ("TOPPADDING", (0,0), (-1,-1), 14),
    ("BOTTOMPADDING", (0,0), (-1,-1), 14),
    ("LEFTPADDING", (0,0), (-1,-1), 12),
    ("ROUNDEDCORNERS", [6, 6, 6, 6]),
]))
story.append(cover_tbl)
story.append(Spacer(1, 10))
story.append(HRFlowable(width="100%", thickness=2, color=GOLD))
story.append(Spacer(1, 8))

# ════════════════════════════════════════════════════
# SECTION 1: PSM
# ════════════════════════════════════════════════════
story.append(section_banner("📘  SECTION 1: PSM — Community Medicine", PSM_DARK))
story.append(Spacer(1, 6))

# 1. Epidemiology
story.append(topic_box(
    "1. EPIDEMIOLOGY — Study Designs & Key Concepts",
    [
        "Case-Control: Odds Ratio (OR) = (a×d)/(b×c)  |  Retrospective, starts from disease",
        "Cohort: Relative Risk (RR) = (a/(a+b)) ÷ (c/(c+d))  |  Prospective, starts from exposure",
        "RCT: Gold standard for causation. Double-blind > single-blind",
        "Cross-sectional: Prevalence study. Snapshot. Cannot determine causality",
        "Ecological: Group-level data. Ecological fallacy risk",
        "Berkson's bias: hospital-based case-control. Neyman bias: prevalent vs incident cases",
        "Attributable Risk (AR) = Incidence in exposed − Incidence in unexposed",
        "PAR% = (Total incidence − Unexposed incidence) / Total incidence × 100",
        "Hill's criteria of causation: Strength, Consistency, Specificity, Temporality (MOST IMPORTANT), Biological gradient, Plausibility, Coherence, Experiment, Analogy",
        "Screening criteria (Wilson & Jungner): Important problem, natural history known, detectable early stage, accepted treatment, suitable test",
        "Validity: Sensitivity (TP/TP+FN), Specificity (TN/TN+FP), PPV, NPV",
        "Shifting cut-off → ↑Sensitivity = ↓Specificity. ROC curve: AUC = 1 is perfect",
    ],
    TOPIC_HEAD, PSM_LIGHT, PSM_DARK
))

# 2. Biostatistics
story.append(topic_box(
    "2. BIOSTATISTICS — Formulae & Tests",
    [
        "Mean: Σx/n  |  Median: middle value  |  Mode: most frequent",
        "SD: measures spread around mean  |  SE = SD/√n",
        "Normal distribution: Mean±1SD = 68.2%, ±2SD = 95.4%, ±3SD = 99.7%",
        "Null hypothesis (H₀): No difference. P<0.05 = reject H₀ (statistically significant)",
        "Type I error (α): Rejecting true H₀  |  Type II error (β): Accepting false H₀",
        "Power = 1−β. Increase by ↑ sample size",
        "t-test: Compare means of 2 groups (parametric)  |  ANOVA: >2 groups",
        "Chi-square (χ²): Compare proportions / categorical data (non-parametric)",
        "Mann-Whitney U: Non-parametric alternative to t-test",
        "Correlation (r): −1 to +1. Pearson (parametric), Spearman (non-parametric)",
        "Sampling methods: Simple random, Stratified, Systematic, Cluster, Multistage, Purposive",
        "Confidence Interval (95% CI): Mean ± 1.96 × SE",
        "NNT = 1/ARR  |  NNH = 1/ARI  |  ARR = CER − EER",
    ],
    TOPIC_HEAD, PSM_LIGHT, PSM_DARK
))

# 3. Communicable Diseases
story.append(topic_box(
    "3. COMMUNICABLE DISEASES & NATIONAL PROGRAMS",
    [
        "Herd immunity threshold = 1 − 1/R₀. Measles R₀≈15 → need 95% coverage",
        "IHR 2005: Public Health Emergency of International Concern (PHEIC). 4 diseases: Smallpox, Polio, SARS, New influenza subtype (mandatory notify) + cholera, plague, yellow fever",
        "Notifiable diseases in India: Cholera, Plague, Yellow Fever, Smallpox (eradicated), Polio",
        "RNTCP/NTEP: DOTS strategy. Cat I (new): 2HRZE/4HR. Cat II (retreatment): 2HRZES/HRZE/5HRE",
        "NVBDCP: Malaria (Plasmodium falciparum — severe), Dengue, Filaria, Kala-azar, JE",
        "Malaria: API (Annual Parasite Incidence) = Positive slides / population × 1000",
        "Dengue: NS1 antigen Day 1-5, IgM Day 5+. Tourniquet test +ve ≥10 petechiae/in²",
        "NACP (HIV/AIDS): ICTC, ART centres, PPTCT. CD4 <200 = AIDS defining",
        "Universal Immunization Programme (UIP): BCG (birth), OPV (0,6,10,14 wks + boosters), DPT, Hep B, IPV, Rota, PCV, MR, JE, DT, TT",
        "Pulse Polio: OPV 0, 6 weeks, 3 months, 18 months, 5 years",
        "Cold chain: +2°C to +8°C (vaccines). Freeze-sensitive: DPT, Hep B, TT (NOT in freezer)",
        "VVM (Vaccine Vial Monitor): Square inside circle. If square = circle or darker → discard",
    ],
    TOPIC_HEAD, PSM_LIGHT, PSM_DARK
))

# 4. MCH & Nutrition
story.append(two_col_table(
    data_left=[
        "MMR = Maternal deaths / Live births × 100,000",
        "IMR = Infant deaths (<1yr) / Live births × 100",
        "NMR = Neonatal deaths (<28d) / Live births × 100",
        "U5MR = Deaths <5yrs / Live births × 1000",
        "TFR = Total Fertility Rate (replacement = 2.1)",
        "GFR = Live births / Women 15-44 yrs × 1000",
        "RCH Program: ANC (min 4 visits), TT2 doses, IFA 100 tabs",
        "JSSK: Free delivery + 7 days stay. JSY: Cash incentive",
        "PMSMA: 9th of every month. High-risk ANC",
        "LSAS training for EmOC at CHC level",
    ],
    data_right=[
        "PEM: Kwashiorkor (protein ↓, edema, moon face) vs Marasmus (calories ↓, wasting)",
        "MUAC <11.5cm = SAM in children 6-59 months",
        "Vit A: Night blindness → Xerophthalmia → Keratomalacia. Bitot's spots (X1B)",
        "Vit A supplementation: 1 lakh IU at 9 months with measles vaccine",
        "Iron deficiency: Most common nutritional deficiency worldwide",
        "Iodine deficiency: Goitre, cretinism. Iodine in salt ≥15 ppm at consumption",
        "Vit D deficiency: Rickets (children), Osteomalacia (adults)",
        "ICDS: 6 services for 0-6 yrs, pregnant & lactating mothers",
        "Mid-Day Meal: School-going 6-14 yrs. 450 kcal, 12g protein (primary)",
        "Nutritional rehabilitation: F75 → F100 therapeutic feeds in SAM",
    ],
    head_l="4A. MCH & REPRODUCTIVE HEALTH", head_r="4B. NUTRITION",
    bg_l=PSM_LIGHT, bg_r=PSM_LIGHT, border_l=PSM_DARK, border_r=PSM_DARK
))

# 5. Environment & Demography
story.append(topic_box(
    "5. ENVIRONMENT, DEMOGRAPHY & HEALTH PLANNING",
    [
        "BOD (Biochemical Oxygen Demand): Indicator of organic pollution in water. Higher BOD = more pollution",
        "Drinking water standards: Coliform count = 0/100 mL (treated). E. coli = 0/100 mL",
        "Chlorination: Residual chlorine 0.5 mg/L after 1 hr contact. Break-point chlorination",
        "Air pollution: PM2.5 most harmful (penetrates alveoli). NAAQS standards",
        "Silicosis: Most disabling pneumoconiosis. Silica dust. Eggshell calcification on X-ray",
        "Noise: >85 dB(A) for 8 hrs → NIHL. Audiometry: 4000 Hz dip first",
        "Census 2011: Population 121 crore. Sex ratio 943/1000. Literacy 74%. Decadal growth 17.7%",
        "Demographic transition: India in Stage 3 (low birth + declining death rates)",
        "Health Planning: 12th FYP (2012-17) focus: Universal Health Coverage",
        "NHM (2013): NRHM + NUHM. District Health Action Plans. ASHA: 1 per 1000 population",
        "ASHA incentives: ₹600 for institutional delivery (JSY). ₹300 for ANC registration",
        "Levels of care: SC (5000 pop rural), PHC (30,000), CHC (120,000/FRU), DH",
        "IPHS norms: CHC must have O&G, Medicine, Surgery, Paediatrics (4 specialists)",
    ],
    TOPIC_HEAD, PSM_LIGHT, PSM_DARK
))

story.append(PageBreak())

# ════════════════════════════════════════════════════
# SECTION 2: FMT
# ════════════════════════════════════════════════════
story.append(section_banner("📕  SECTION 2: FMT — Forensic Medicine & Toxicology", FMT_DARK))
story.append(Spacer(1, 6))

# 1. Thanatology
story.append(topic_box(
    "1. THANATOLOGY — Signs & Changes After Death",
    [
        "Pallor mortis: Immediately after death — pallor due to capillary drainage",
        "Algor mortis: Body cools ~1°C/hr (Henssge nomogram). Influenced by environment, clothing, obesity",
        "Rigor mortis: ATP depletion → myosin-actin locking. Starts 2-6 hrs, complete 12 hrs, passes 48-72 hrs. Nysten's law: jaw → neck → trunk → limbs (descending order)",
        "Cadaveric spasm (instantaneous rigor): Sudden death under extreme emotion/exertion. No relaxation phase. Medico-legal: article found in hand = was held at time of death",
        "Heat stiffening: Coagulation of muscle proteins. External cause (fire). Pugilistic attitude",
        "Cold stiffening: Freezing of tissues. Disappears on rewarming (unlike rigor)",
        "Livor mortis (hypostasis): Starts 2-4 hrs, fixed 8-12 hrs. Bright red = CO poisoning / cold. Cherry red = CO. Pink/lavender = drowning",
        "Decomposition: Putrefaction (bacteria). Green discolouration iliac fossa first (caecum richest bacteria). Marbling: putrefaction of blood vessels. Adipocere = saponification (fatty tissue, moist). Mummification = desiccation (dry hot environment)",
        "Autopsy: Medicolegal (commissioned by magistrate) vs Clinical. PM report: description of injuries → opinion → cause of death",
        "Brain death: Irreversible cessation of all brain functions including brainstem. 2 doctors, 6 hr interval, Transplantation of Human Organs Act 1994",
    ],
    TOPIC_HEAD_FMT, FMT_LIGHT, FMT_DARK
))

# 2. Injuries
story.append(topic_box(
    "2. FORENSIC PATHOLOGY — Injuries & Wounds",
    [
        "Abrasion: Outermost layer skin only. Brush/graze/pressure. Indicates direction, site of impact",
        "Contusion (Bruise): Extravasation of blood. Age: 0-2 days (reddish) → 2-5 days (blue-black) → 5-7 days (greenish) → 7-14 days (yellowish) → disappears",
        "Laceration: Tearing of tissues by blunt force. Irregular edges, hair bulbs intact in wound, bridging strands",
        "Incised wound: Sharp weapon. Clean cut edges, no bridging. Deeper than long",
        "Stab wound: Pointed weapon. Depth > length. Hilt mark if full penetration",
        "Chop wound: Heavy sharp weapon (dao/axe). Features of incised + lacerated wound",
        "Defense injuries: Palms, forearms, hands — victim defending against attack",
        "Entry vs Exit (GSW): Entry — inverted, smaller, abrasion collar. Exit — everted, larger, no abrasion collar, irregular",
        "Contact GSW: Muzzle imprint, star-shaped laceration, blackening, tattooing, singeing (all in contact)",
        "Tattooing/Stippling: Unburnt gunpowder — cannot be wiped off. Within 60 cm range",
        "Blackening/Smudging: Soot — can be wiped off. Very close range",
        "Firearm wounds: Rifled > smooth bore. Bullet mushrooming on impact",
    ],
    TOPIC_HEAD_FMT, FMT_LIGHT, FMT_DARK
))

# 3. Asphyxia + Sexual
story.append(two_col_table(
    data_left=[
        "Classic signs: TBL (Tardieu spots/petechiae, Bloating/cyanosis, Liquidity of blood)",
        "Hanging: Semi-suspension possible. Ligature mark oblique, pale, parchment. Mugging = Throttling",
        "Strangulation (manual): Ligature mark horizontal, complete. Fracture hyoid/thyroid cartilage",
        "Throttling: Fingernail marks. Hyoid fracture common",
        "Drowning: Diatom test (gold standard). Frothy fluid in airways. Washerwoman hands",
        "Dry drowning: 10-15%. Laryngeal spasm → no water in lungs",
        "Café coronary: Bolus food → vagal inhibition → sudden death",
        "Smothering: Mouth/nose covered. Lacerations on inner lips",
        "CO poisoning: Cherry-red discolouration. COHb >50% lethal",
        "Traumatic asphyxia: Compression of chest/abdomen. Masque écchymotique",
    ],
    data_right=[
        "Age of consent (POCSO): 18 years",
        "Statutory rape: Consensual sex with girl <18 yrs = rape (IPC 376)",
        "Hymen types: Annular, Crescentic, Cribriform, Imperforate. NOT diagnostic of virginity",
        "Fresh hymenal tear: Before healing (within 72 hrs). Bleeds on touch",
        "Vaginal swab: Within 72-96 hrs ideally. Spermatozoa survive 72 hrs in vagina",
        "Two-finger test: ABOLISHED by SC 2022 (re-traumatizing, unreliable)",
        "Male rape (IPC 377): Unnatural offences. Now includes male victims",
        "POCSO 2012: Penetrative, aggravated, non-penetrative, sexual harassment of <18",
        "DNA profiling: STR analysis. Identifying sexual assault perpetrator",
        "Victim examination: Should be done with consent, female doctor preferable",
    ],
    head_l="3A. ASPHYXIAL DEATHS", head_r="3B. SEXUAL OFFENCES",
    bg_l=FMT_LIGHT, bg_r=FMT_LIGHT, border_l=FMT_DARK, border_r=FMT_DARK
))

# 4. Jurisprudence + IPC
story.append(topic_box(
    "4. MEDICAL JURISPRUDENCE & IPC SECTIONS",
    [
        "IPC 299: Culpable homicide (intention/knowledge but not murder degree)",
        "IPC 300: Murder (4 clauses — intention to cause death, grievous hurt sufficient, knowledge imminently dangerous)",
        "IPC 302: Punishment for murder — death or life imprisonment",
        "IPC 304: Culpable homicide not amounting to murder. 304A: Causing death by negligence (doctor cases)",
        "IPC 319: Hurt | IPC 320: Grievous hurt (8 types — emasculation, loss of eye/ear/limb, fracture, burn, permanent disfiguration, impairment of sense/mind)",
        "IPC 375/376: Rape/punishment for rape. IPC 376D: Gang rape",
        "IPC 312: Causing miscarriage (illegal abortion). IPC 313: Miscarriage without consent",
        "MTP Act 1971: Legal abortion up to 20 weeks (up to 24 weeks in special categories since 2021 amendment)",
        "CrPC 174: Police inquest. CrPC 176: Magistrate's inquest (unnatural deaths, custodial deaths)",
        "Consent: Informed, voluntary, competent. Age of consent for medical procedure = 12 yrs (general), 18 yrs (sterilization)",
        "Professional negligence: Duty, Dereliction, Direct causation, Damage (4 D's)",
        "Bolam's test: Standard of reasonable doctor. Bolitho modification (UK)",
        "Dying declaration: Statement by dying person. Recorded by magistrate > doctor. No oath needed. Section 32 Indian Evidence Act",
        "IMC Act 1956 / NMC Act 2020: Replaced MCI with NMC. Ethics, registration, punishment for misconduct",
    ],
    TOPIC_HEAD_FMT, FMT_LIGHT, FMT_DARK
))

# 5. Toxicology
story.append(topic_box(
    "5. FORENSIC TOXICOLOGY — Key Poisons",
    [
        "Corrosive poisons — Strong acids (H₂SO₄, HCl, HNO₃): Burns mouth, esophagus, stomach. H₂SO₄ = charring, HNO₃ = yellow staining (xanthoproteic), HCl = white staining",
        "Carbolic acid (Phenol): Characteristic smell, white staining → turns red. Anaesthetic effect on mucosa",
        "Strong alkalis (NaOH, KOH): Soapy, soft, whitish mucosa. 'Soap-like' appearance",
        "Metallic poisons — Arsenic: Garlic odour, Reinsch test +ve, Marsh test (gold standard). Rice water stools. Mees lines (nails)",
        "Mercury: Metallic taste, salivation, stomatitis. Acrodynia (pink disease in children). Minamata disease",
        "Lead: Anaemia, Burton's line (blue-black gum line), wrist/foot drop, encephalopathy. Basophilic stippling of RBC",
        "Copper: Wilson's disease (KF rings). Acute: green vomit, haemolysis",
        "Phosphorus (Yellow): Garlic odour, luminescent vomit in dark. Hepatic failure. Matchstick/firecracker poisoning",
        "Organophosphates (OP): Irreversible AChE inhibition. SLUDGE: Salivation, Lacrimation, Urination, Defecation, GI cramps, Emesis. Treatment: Atropine + PAM (pralidoxime)",
        "Dhatura (Atropine-like): ANTICHOLINERGIC — Dry as bone, Red as beet, Blind as bat, Mad as hatter, Hot as hare. Scopolamine = hyoscine (truth serum)",
        "Aconite: Most toxic part = root. Tingling numbness. Cardiac arrhythmias",
        "Cocaine: Erythroxylocon coca. Nasal septal perforation. Crack = freebase. Local anaesthetic + vasoconstrictor",
        "Alcohol: Widmark formula: BAC = A / (r × W). Legal limit driving = 30 mg/100 mL blood (India)",
        "Cyanide: Bitter almond smell. Brick red lividity. Treatment: Amyl nitrite + Na thiosulfate",
    ],
    TOPIC_HEAD_FMT, FMT_LIGHT, FMT_DARK
))

# 6. Identification
story.append(topic_box(
    "6. FORENSIC IDENTIFICATION & SEROLOGY",
    [
        "Sex determination: Pelvis most reliable. Sciatic notch >90° = female. Sub-pubic angle female (>80°) vs male (<70°)",
        "Age from teeth: Eruption times. Gustafson's method (6 features: attrition, secondary dentin, cementum, root resorption, transparency, root length). Lamendin method",
        "Age from bone: Epiphyseal fusion. Medial clavicle last to fuse = 25-31 years",
        "Stature: Pearson's formula. Height = 2 × knee height − 0.1 (quick estimate)",
        "Dactylography (fingerprints): Henry system (8 types: arch, tented arch, radial/ulnar loop, whorl, composite, central pocket, lateral pocket, twin loop)",
        "Superimposition (skull-face): Reconstruction technique",
        "ABO blood group system: Forensic — victim/accused identification. Secretors (78%) have ABO antigens in secretions (saliva, semen, urine)",
        "DNA fingerprinting: RFLP (old) → STR (current). Mitochondrial DNA from hair shaft (no nucleus)",
        "Bite mark analysis: Odontology. Compared with dental casts. US v Castro — DNA admissibility",
        "GSR (Gunshot Residue): Pb, Ba, Sb. SEM-EDX analysis. Within 6 hrs of firing",
    ],
    TOPIC_HEAD_FMT, FMT_LIGHT, FMT_DARK
))

story.append(Spacer(1, 8))
story.append(HRFlowable(width="100%", thickness=1.5, color=GOLD))
story.append(Spacer(1, 6))

# ── QUICK REFERENCE BOX ────────────────────────────────────────
qr_data = [
    [Paragraph("<b>PSM QUICK NUMBERS</b>", style("QRH", fontName="Helvetica-Bold", fontSize=9, textColor=PSM_DARK)),
     Paragraph("<b>FMT QUICK NUMBERS</b>", style("QRH2", fontName="Helvetica-Bold", fontSize=9, textColor=FMT_DARK))],
    [
        Paragraph(
            "• India Population (2011): 121 crore<br/>"
            "• Sex ratio: 943 females/1000 males<br/>"
            "• Literacy: 74% (Male 82%, Female 65%)<br/>"
            "• IMR (2020): ~27/1000 live births<br/>"
            "• MMR (2018-20): 97/100,000 live births<br/>"
            "• TFR (2020): 2.0 (at replacement)<br/>"
            "• Life expectancy: 69.7 yrs (M:68, F:71)<br/>"
            "• ASHA ratio: 1 per 1000 rural population<br/>"
            "• Sub-centre: 5000 rural / 3000 tribal pop<br/>"
            "• PHC: 30,000 rural / 20,000 tribal pop<br/>"
            "• CHC: 1,20,000 pop / 30 bed hospital",
            BODY),
        Paragraph(
            "• Rigor mortis onset: 2-6 hrs, complete: 12 hrs<br/>"
            "• Rigor mortis passes: 48-72 hrs<br/>"
            "• Livor mortis fixed: 8-12 hrs after death<br/>"
            "• Algor mortis: ~1°C/hr cooling<br/>"
            "• Sperm viability vagina: up to 72 hrs<br/>"
            "• Blood alcohol legal limit: 30 mg/100 mL<br/>"
            "• Age of consent (POCSO): 18 years<br/>"
            "• MTP Act legal limit: 20 weeks (24 wks special)<br/>"
            "• Minimum age for medical consent: 12 yrs<br/>"
            "• CrPC 174 = Police inquest<br/>"
            "• CrPC 176 = Magistrate inquest",
            BODY),
    ]
]
qr_tbl = Table(qr_data, colWidths=[(W - 3.6*cm)/2, (W - 3.6*cm)/2])
qr_tbl.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (0,0), PSM_LIGHT),
    ("BACKGROUND", (1,0), (1,0), FMT_LIGHT),
    ("BACKGROUND", (0,1), (0,1), GREY_BG),
    ("BACKGROUND", (1,1), (1,1), GREY_BG),
    ("TOPPADDING", (0,0), (-1,-1), 5),
    ("BOTTOMPADDING", (0,0), (-1,-1), 5),
    ("LEFTPADDING", (0,0), (-1,-1), 8),
    ("BOX", (0,0), (0,-1), 1, PSM_DARK),
    ("BOX", (1,0), (1,-1), 1, FMT_DARK),
    ("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(KeepTogether([
    Paragraph("⚡  QUICK REFERENCE NUMBERS", style("QRT", fontName="Helvetica-Bold", fontSize=11,
              textColor=colors.HexColor("#333333"), spaceBefore=4, spaceAfter=4)),
    qr_tbl
]))

story.append(Spacer(1, 10))
story.append(Paragraph(
    "Prepared for 3rd Prof MBBS University Examination — August 2026. Study hard, stay consistent. Good luck! 🎯",
    style("FinalNote", fontName="Helvetica-Oblique", fontSize=8,
          textColor=colors.grey, alignment=TA_CENTER)
))

# ── BUILD ─────────────────────────────────────────────────────────
doc.build(story, onFirstPage=add_footer, onLaterPages=add_footer)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/mbbs-study && python generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/mbbs-study/HighYield_PSM_FMT.pdf

Your printable PDF is ready! Download it here:

HighYield PSM FMT

PDF Document · PDF


What's inside the PDF (A4, print-ready, 2 pages):
PSM Section (Blue theme):
  • Epidemiology - study designs, OR/RR/AR formulae, Hill's criteria, screening (Wilson & Jungner)
  • Biostatistics - all key formulae, p-value, Type I/II errors, sampling methods, CI formula
  • Communicable diseases - herd immunity formula, IHR 2005, RNTCP, NVBDCP, UIP schedule, VVM
  • MCH & Nutrition - MMR/IMR/TFR formulae, RCH, PEM (Kwashiorkor vs Marasmus), Vit A/Iron/Iodine
  • Environment & Demography - BOD, chlorination, Census 2011 key figures, NHM, ASHA norms
FMT Section (Red theme):
  • Thanatology - Rigor/livor/algor mortis timelines, Nysten's law, decomposition types
  • Injuries - Abrasion, contusion age estimation, GSW entry vs exit, tattooing vs blackening
  • Asphyxia + Sexual offences - Tardieu spots, drowning diatom test, POCSO, two-finger test abolition
  • Medical jurisprudence - All key IPC sections (299, 300, 302, 304A, 375/376), MTP Act, consent age
  • Toxicology - OP (SLUDGE + treatment), Dhatura (anticholinergic signs), arsenic/lead/mercury, cyanide
  • Identification - Gustafson's 6 features, fingerprint types, ABO secretors, DNA STR
Quick Reference box at the bottom with all key numerical figures from both subjects - great to read the night before!

These are the important topics list add these too

Reading File
Running Command

python3 -c " import pdfplumber files = { 'FMT': '/home/daytona/workspace/attachments/b7ffc254-60e7-4f04-9e3f-8c89ee73a07b/fmt imp topic wise.pdf', '3rd_yr': '/home/daytona/workspace/attachments/b7ffc254-60e7-4f04-9e3f-8c89ee73a07b/3rd yr Imp. Topic.pdf', 'PSM': '/home/daytona/workspace/attachments/b7ffc254-60e7-4f04-9e3f-8c89ee73a07b/PSM Important (New).pdf', } for label, path in files.items(): print(f'\n========== {label} ==========') with pdfplumber.open(path) as pdf: for i, page in enumerate(pdf.pages): text = page.extract_text() if text: print(f'--- Page {i+1} ---') print(text) " 2>&1

Running Command

python3 -c " import subprocess, os # Convert PDFs to images then OCR files = { 'FMT': '/home/daytona/workspace/attachments/b7ffc254-60e7-4f04-9e3f-8c89ee73a07b/fmt imp topic wise.pdf', 'PSM': '/home/daytona/workspace/attachments/b7ffc254-60e7-4f04-9e3f-8c89ee73a07b/PSM Important (New).pdf', } for label, path in files.items(): print(f'=== {label}: pages ===') result = subprocess.run(['pdfinfo', path], capture_output=True, text=True) print(result.stdout[:300]) " 2>&1

Running Command

# OCR both scanned PDFs using tesseract via pdftoppm + tesseract OUT=/home/daytona/workspace/mbbs-study/ocr_out mkdir -p $OUT # FMT pdftoppm -r 200 "/home/daytona/workspace/attachments/b7ffc254-60e7-4f04-9e3f-8c89ee73a07b/fmt imp topic wise.pdf" $OUT/fmt_page echo "FMT pages extracted: $(ls $OUT/fmt_page*.ppm 2>/dev/null | wc -l)" # PSM pdftoppm -r 200 "/home/daytona/workspace/attachments/b7ffc254-60e7-4f04-9e3f-8c89ee73a07b/PSM Important (New).pdf" $OUT/psm_page echo "PSM pages extracted: $(ls $OUT/psm_page*.ppm 2>/dev/null | wc -l)"

Running Command

OUT=/home/daytona/workspace/mbbs-study/ocr_out echo "========== FMT OCR ==========" for f in $(ls $OUT/fmt_page*.ppm | sort); do echo "--- $(basename $f) ---" tesseract $f stdout 2>/dev/null done echo "" echo "========== PSM OCR ==========" for f in $(ls $OUT/psm_page*.ppm | sort); do echo "--- $(basename $f) ---" tesseract $f stdout 2>/dev/null done

Writing File

~/mbbs-study/generate_pdf_v2.py

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

OUTPUT = "/home/daytona/workspace/mbbs-study/HighYield_PSM_FMT_v2.pdf"

W, H = A4

PSM_DARK   = colors.HexColor("#1a5276")
PSM_LIGHT  = colors.HexColor("#d6eaf8")
FMT_DARK   = colors.HexColor("#7b241c")
FMT_LIGHT  = colors.HexColor("#fadbd8")
GOLD       = colors.HexColor("#f0b000")
GREY_BG    = colors.HexColor("#f4f6f7")
ORANGE_D   = colors.HexColor("#784212")
ORANGE_L   = colors.HexColor("#fdebd0")
GREEN_D    = colors.HexColor("#1e8449")
GREEN_L    = colors.HexColor("#d5f5e3")
WHITE      = colors.white

def S(name, **kw):
    return ParagraphStyle(name, **kw)

TITLE   = S("T", fontName="Helvetica-Bold",   fontSize=20, textColor=WHITE,    alignment=TA_CENTER, spaceAfter=3)
SUB     = S("S", fontName="Helvetica",         fontSize=10, textColor=WHITE,    alignment=TA_CENTER, spaceAfter=2)
DATST   = S("D", fontName="Helvetica-Oblique", fontSize=8,  textColor=GOLD,     alignment=TA_CENTER)
SHEAD   = S("SH",fontName="Helvetica-Bold",    fontSize=12, textColor=WHITE,    alignment=TA_LEFT,   leftIndent=6)
THEAD   = S("TH",fontName="Helvetica-Bold",    fontSize=9,  textColor=PSM_DARK, spaceBefore=4)
THEAD_F = S("TF",fontName="Helvetica-Bold",    fontSize=9,  textColor=FMT_DARK, spaceBefore=4)
THEAD_O = S("TO",fontName="Helvetica-Bold",    fontSize=9,  textColor=ORANGE_D, spaceBefore=4)
THEAD_G = S("TG",fontName="Helvetica-Bold",    fontSize=9,  textColor=GREEN_D,  spaceBefore=4)
BODY    = S("B", fontName="Helvetica",         fontSize=8,  leading=12, spaceAfter=1, leftIndent=8)
BODYB   = S("BB",fontName="Helvetica-Bold",    fontSize=8,  leading=12, spaceAfter=1, leftIndent=8)
IMPNOTE = S("IN",fontName="Helvetica-Bold",    fontSize=7.5,textColor=colors.HexColor("#c0392b"), leftIndent=8)
FNOTE   = S("FN",fontName="Helvetica-Oblique", fontSize=6.5,textColor=colors.grey, alignment=TA_CENTER)

CW = W - 3.6*cm   # usable content width

def footer(canvas, doc):
    canvas.saveState()
    canvas.setFont("Helvetica-Oblique", 6.5)
    canvas.setFillColor(colors.grey)
    canvas.drawCentredString(W/2, 1.0*cm,
        f"High-Yield PSM & FMT  |  3rd Prof MBBS  |  Exam: August 3, 2026  |  Page {doc.page}")
    canvas.restoreState()

def banner(text, color):
    t = Table([[Paragraph(text, SHEAD)]], colWidths=[CW])
    t.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(-1,-1),color),
        ("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
        ("LEFTPADDING",(0,0),(-1,-1),8),
    ]))
    return t

def box(title, items, hstyle, bg, border, star_items=None):
    """Titled bullet box. star_items = list of indices that are exam-starred."""
    star_items = star_items or []
    hdr = Table([[Paragraph(title, hstyle)]], colWidths=[CW])
    hdr.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(-1,-1),bg),
        ("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
        ("LEFTPADDING",(0,0),(-1,-1),8),
        ("LINEBELOW",(0,0),(-1,-1),0.5,border),
    ]))
    rows = []
    for i, item in enumerate(items):
        style = IMPNOTE if i in star_items else BODY
        bullet = "★ " if i in star_items else "• "
        rows.append([Paragraph(f"{bullet}{item}", style)])
    bdy = Table(rows, colWidths=[CW])
    bdy.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(-1,-1),GREY_BG),
        ("TOPPADDING",(0,0),(-1,-1),2),("BOTTOMPADDING",(0,0),(-1,-1),2),
        ("LEFTPADDING",(0,0),(-1,-1),8),
        ("LINEAFTER",(0,0),(0,-1),1.5,border),
    ]))
    return KeepTogether([hdr, bdy, Spacer(1,4)])

def two_col(left_title, left_items, right_title, right_items,
            lhs, lhbg, lhbc, rhs, rhbg, rhbc,
            l_stars=None, r_stars=None):
    l_stars = l_stars or []
    r_stars = r_stars or []
    col = CW / 2 - 3

    def build(title, items, hs, bg, bc, stars):
        hrow = [Paragraph(title, hs)]
        rows = [hrow]
        for i, item in enumerate(items):
            st = IMPNOTE if i in stars else BODY
            bullet = "★ " if i in stars else "• "
            rows.append([Paragraph(f"{bullet}{item}", st)])
        t = Table(rows, colWidths=[col])
        t.setStyle(TableStyle([
            ("BACKGROUND",(0,0),(0,0),bg),
            ("BACKGROUND",(0,1),(-1,-1),GREY_BG),
            ("TOPPADDING",(0,0),(-1,-1),2),("BOTTOMPADDING",(0,0),(-1,-1),2),
            ("LEFTPADDING",(0,0),(-1,-1),6),
            ("LINEAFTER",(0,0),(0,-1),1.5,bc),
            ("LINEBELOW",(0,0),(0,0),0.5,bc),
        ]))
        return t

    L = build(left_title, left_items, lhs, lhbg, lhbc, l_stars)
    R = build(right_title, right_items, rhs, rhbg, rhbc, r_stars)
    outer = Table([[L, R]], colWidths=[col+3, col+3])
    outer.setStyle(TableStyle([
        ("VALIGN",(0,0),(-1,-1),"TOP"),
        ("LEFTPADDING",(0,0),(-1,-1),0),
        ("RIGHTPADDING",(0,0),(-1,-1),0),
    ]))
    return KeepTogether([outer, Spacer(1,5)])

# ═══════════════════════════════════════════════════════════
story = []

doc = SimpleDocTemplate(OUTPUT, pagesize=A4,
    rightMargin=1.8*cm, leftMargin=1.8*cm,
    topMargin=1.8*cm, bottomMargin=1.8*cm)

# COVER
cover = Table([[
    Paragraph("HIGH-YIELD SUMMARY  +  EXAM TOPIC LIST", TITLE),
    Paragraph("PSM (Community Medicine)  &amp;  FMT (Forensic Medicine)", SUB),
    Paragraph("3rd Prof MBBS  |  Exam: August 3, 2026  |  ★ = Your Exam Important Topics", DATST),
]], colWidths=[CW])
cover.setStyle(TableStyle([
    ("BACKGROUND",(0,0),(-1,-1),PSM_DARK),
    ("TOPPADDING",(0,0),(-1,-1),12),("BOTTOMPADDING",(0,0),(-1,-1),12),
    ("LEFTPADDING",(0,0),(-1,-1),10),
]))
story += [cover, Spacer(1,8), HRFlowable(width="100%",thickness=2,color=GOLD), Spacer(1,6)]

# ══════════════════════════════════════════════════════
# PSM SECTION
# ══════════════════════════════════════════════════════
story.append(banner("📘  SECTION 1: PSM — Community Medicine", PSM_DARK))
story.append(Spacer(1,5))

# 1. Health & Disease / Epidemiology Fundamentals
story.append(box(
    "1. HEALTH, DISEASE & EPIDEMIOLOGY FUNDAMENTALS",
    [
        "Define Health (WHO 1948) — complete physical, mental, social well-being, not merely absence of disease",
        "PQLI (Physical Quality of Life Index) = Infant mortality + Life expectancy at age 1 + Basic literacy (avg of 3)",
        "Health indicators: MMR, IMR, U5MR, TFR, life expectancy, PQLI, HDI",
        "Spectrum of disease / Iceberg phenomenon — tip = clinical cases, submerged = subclinical + carriers",
        "Levels of prevention: Primordial (before risk factors), Primary (↓ incidence), Secondary (↓ prevalence), Tertiary (↓ disability)",
        "Modes of intervention: Health promotion, Specific protection, Early diagnosis & treatment, Disability limitation, Rehabilitation",
        "Epidemiological triad: Agent + Host + Environment. Web of causation (MacMahon)",
        "Natural history of disease: Susceptible → Presymptomatic → Clinical → Outcome",
        "SDG Goal 3: Good Health & Well-being by 2030. MDG Goal 4,5,6 = child mortality, maternal health, diseases",
        "Define Epidemiology (Last's dictionary): 'study of distribution and determinants of health-related states'",
        "Aims of epidemiology: Describe, explain, predict, control",
        "Descriptive epidemiology: Person, Place, Time",
        "Epidemic curve: helps identify source (point vs propagated)",
        "Case-control study: OR = (a×d)/(b×c). Retrospective, starts from disease. Berkson's bias",
        "Cohort study: RR = (a/(a+b)) / (c/(c+d)). Prospective. Neyman bias",
        "RCT: Gold standard for causation. Steps: PICO, randomization, blinding, ITT analysis",
        "Diff b/w case-control & cohort: direction, time, measure of association (OR vs RR)",
        "Mortality indicators: CDR, ASDR, SMR, IMR, MMR, NMR, PMR",
        "Quarantine (well contacts) vs Isolation (sick persons)",
        "Herd immunity threshold = 1 − 1/R₀",
        "Epidemic investigation: steps — confirm, describe (time/place/person), hypothesize, test, control",
        "Common source vs propagated epidemic",
    ],
    THEAD, PSM_LIGHT, PSM_DARK,
    star_items=[4, 5, 13, 14, 15, 19, 20]
))

# 2. Screening + Biostatistics
story.append(box(
    "2. SCREENING & BIOSTATISTICS",
    [
        "Define screening. Wilson & Jungner criteria (10 points). Types: mass, selective, multiphasic",
        "Screening vs Diagnostic test: screening = suspect, diagnostic = confirm",
        "Lead time bias: screening appears to increase survival without changing natural history",
        "Sensitivity = TP/(TP+FN) — ability to detect true positives (rule OUT disease)",
        "Specificity = TN/(TN+FP) — ability to detect true negatives (rule IN disease)",
        "PPV = TP/(TP+FP). NPV = TN/(TN+FN). Affected by prevalence",
        "Shifting cut-off: ↑sensitivity = ↓specificity (inverse relationship). ROC curve: AUC=1 = perfect",
        "Sampling methods: Simple random, Stratified, Systematic (every kth), Cluster, Multistage, Purposive",
        "Diff b/w stratified & simple random sampling",
        "Normal distribution: Mean±1SD=68.2%, ±2SD=95.4%, ±3SD=99.7%",
        "Standard deviation: spread around mean. SE = SD/√n. 95% CI = Mean ± 1.96×SE",
        "Types of errors: Type I (α) = reject true H₀; Type II (β) = accept false H₀. Power = 1-β",
        "Null hypothesis (H₀): no difference. P<0.05 → statistically significant",
        "t-test (compare 2 means), ANOVA (>2 groups), Chi-square (proportions/categorical)",
        "Pearson correlation (parametric, r), Spearman (non-parametric)",
        "NNT = 1/ARR  |  NNH = 1/ARI  |  ARR = CER − EER",
        "Bar diagram, Pie chart, Histogram, Frequency polygon",
        "Measures of central tendency: Mean, Median, Mode. Mean deviation, Range",
    ],
    THEAD, PSM_LIGHT, PSM_DARK,
    star_items=[0, 3, 4, 7, 9, 11, 13]
))

# 3. Communicable Diseases
story.append(box(
    "3. COMMUNICABLE DISEASES & IMMUNIZATION",
    [
        "ARI (Acute Respiratory Infections): Leading cause of child death. Pneumonia — tachypnoea, indrawing. IMNCI classification",
        "Rabies: Negri bodies (pathognomonic). 100% fatal once symptomatic. PEP: wound wash + vaccine ± RIG",
        "Dengue: NS1 Day 1-5, IgM Day 5+. Tourniquet test ≥10 petechiae. DHF grades I-IV. Warning signs",
        "Malaria: API = positive slides/population×1000. SPR, ABER. P.falciparum → severe malaria",
        "Malaria control under NVBDCP: DDT spray, LLIN, ACT for Pf, chloroquine for Pv",
        "Syndromic approach in STD control: treat before lab results (flowchart-based)",
        "Epidemiology of acute diarrhoeal disease: ORS = 75 mEq/L (new formula). Zinc supplementation",
        "Types of food poisoning: Staph (1-6 hrs, vomiting), Salmonella (6-72 hrs, eggs), Clostridium botulinum (neurotoxin, canned food), Bacillus cereus",
        "IPV vs OPV: IPV — injectable, killed, no VAPP, better seroconversion. OPV — oral, live, herd immunity, VAPP risk",
        "Smallpox vs chickenpox: Smallpox (all same stage, centrifugal, deep). Chickenpox (mixed stages, centripetal, superficial)",
        "Hepatitis B: HBsAg = infective. Anti-HBs = immune. HBeAg = active replication",
        "TB/RNTCP-NTEP: DOTS. New regimen: 2HRZE/4HR. Drug-resistant TB: MDR = R+H resistant",
        "Leprosy: PB (1-5 patches, 1 nerve) = 6 months. MB (>5 patches, >1 nerve) = 12 months",
        "Cold chain: +2°C to +8°C. Freeze-sensitive: DPT, Hep-B, TT. OPV: −20°C. VVM: discard if square ≥ circle",
        "Adverse events following immunization (AEFI): mild local (common) → anaphylaxis (rare)",
        "UIP schedule: BCG (birth), OPV+DPT+HepB+IPV (6,10,14 wks), Rota, PCV, MR (9 mths), booster (16-24 mths)",
        "JE vaccine: in endemic areas. Live attenuated SA 14-14-2 strain",
        "Diff b/w killed & live vaccine: killed = safer, less immunogenic; live = better immunity, VAPP risk",
        "Polio endgame: OPV to IPV switch. Wild poliovirus eradicated (last case India 2011)",
    ],
    THEAD, PSM_LIGHT, PSM_DARK,
    star_items=[0, 1, 2, 3, 6, 8, 11, 13]
))

# 4. Non-Communicable Diseases
story.append(box(
    "4. NON-COMMUNICABLE DISEASES (NCDs)",
    [
        "Rule of Halves in Hypertension: ½ know → ½ treated → ½ controlled (so only 1/8 controlled)",
        "HTN risk factors: salt, obesity, alcohol, stress, family history. Prevention: DASH diet, weight loss",
        "WHO BMI classification: Underweight <18.5, Normal 18.5-24.9, Overweight 25-29.9, Obese ≥30. Asian cutoff: ≥23",
        "Epidemiology of Diabetes: Type 2 increasing globally. Risk: obesity, inactivity, family history. Criteria: FBG ≥126, RBG ≥200, HbA1c ≥6.5%",
        "Danger signs of cancer (CAUTION mnemonic): Change in bowel/bladder, A sore not healing, Unusual bleeding, Thickening or lump, Indigestion, Obvious nasal/oral changes, Nagging cough",
        "Screening for cervical cancer: Pap smear (3-yearly), HPV DNA test, VIA/VILI (low-resource)",
        "Cancer prevention: tobacco control (IPC 46A), HPV vaccine (girls 9-14 yrs), hepatitis B vaccine",
        "Epidemiology of road traffic accidents: leading cause of death 15-29 yr age group",
    ],
    THEAD, PSM_LIGHT, PSM_DARK,
    star_items=[0, 3, 4]
))

# 5. MCH + Nutrition (two col)
story.append(two_col(
    "5A. MCH, FAMILY PLANNING & PROGRAMMES",
    [
        "★ ANC visits: min 4 (WHO now recommends 8). PMSMA: 9th of every month",
        "★ High-risk pregnancy: age <18 or >35, grand multi, <45 kg, Hb<7, H/O bad obstetric",
        "★ APGAR score: 0-10. <7 at 1 min = needs attention, <4 = resuscitation",
        "Kangaroo Mother Care (KMC): skin-to-skin for LBW (<2500g). Reduces mortality by 40%",
        "Baby-Friendly Hospital Initiative (BFHI): 10 steps. Encourage breastfeeding",
        "Growth chart: Z-scores. Stunting (<-2 SD height-for-age), Wasting (<-2 SD weight-for-height)",
        "Indicators of MCH: IMR, NMR, MMR, U5MR, stillbirth rate",
        "MMR India (2018-20): 97/100,000 LB (Target SDG: <70 by 2030)",
        "★ RMNCH+A strategy: Reproductive, Maternal, Newborn, Child, Adolescent health (linked lifecycle)",
        "★ IMNCI: integrated management. Classify: danger signs → refer. No danger → assess feeding, wt",
        "Demographic cycle: 4 stages. India in Stage 3 (declining birth + death rates)",
        "TFR India: 2.0 (2020). Replacement TFR = 2.1",
        "★ Contraceptive methods: Barrier (condom, diaphragm), Hormonal (OCP, injectables, implants), IUCD, Sterilization, Emergency (emergency OCP within 72h)",
        "★ 3rd generation OCP (desogestrel) vs 2nd (levonorgestrel). Emergency: Levonorgestrel 1.5mg",
        "MTP Act 1971 (amended 2021): up to 20 wks (single provider), up to 24 wks (special categories)",
        "Pearl index: failure rate per 100 woman-years. Lower = more effective",
        "Juvenile delinquency: <18 yrs, criminal behaviour. JJ Act 2015",
        "PCPNDT Act 1994: prohibit sex determination. Penalties",
    ],
    "5B. NUTRITION",
    [
        "★ PEM: Kwashiorkor (protein ↓, edema, moon face, dermatosis) vs Marasmus (calorie ↓, severe wasting, no edema)",
        "★ Classify malnutrition: Gomez (weight-for-age), Waterlow (stunting + wasting), IAP, WHO Z-score",
        "★ MUAC <11.5 cm = SAM (6-59 months). 11.5-12.5 = MAM",
        "ICDS: 6 services — supplementary nutrition, immunization, health check-up, referral, pre-school education, nutrition & health education",
        "★ Vit A: Night blindness (XN) → Bitot's spots (X1B) → Xerophthalmia → Keratomalacia (X3B). Supplement: 1L IU at 9 months + measles vaccine",
        "Iron deficiency: most common nutritional deficiency. Hb <11 g/dL in children. IFA weekly in school children",
        "Iodine deficiency: goitre, cretinism. Iodized salt ≥15 ppm at household level",
        "Vit D: rickets (children), osteomalacia (adults). Vit C: scurvy (bleeding gums, perifollicular). Vit B12: megaloblastic anaemia, subacute combined degeneration",
        "Balanced diet: energy from carbs 60%, fat 20%, protein 10-15%. Protein requirement: 0.8g/kg/day",
        "Net Protein Utilization (NPU): egg = 100 (reference). Soybean NPU = 65",
        "Nutritional surveillance: methods — sentinel surveillance, dietary survey, anthropometric survey",
        "Diff b/w growth monitoring & nutritional surveillance",
        "Community nutrition programmes: ICDS, Mid-day meal (450 kcal/12g protein), SNP",
        "Vit A prophylaxis: schedule — 1L IU at 9 mths, 2L IU at 18 mths, then 6-monthly till 5 yrs",
        "Prevention iron deficiency anaemia: IFA supplementation, fortification, dietary diversification",
        "Pasteurisation of milk: HTST (72°C/15 sec) or LTLT (63°C/30 min)",
    ],
    THEAD, PSM_LIGHT, PSM_DARK,
    THEAD, PSM_LIGHT, PSM_DARK,
    l_stars=[0,1,2,8,12,13], r_stars=[0,1,2,4,5]
))

# 6. Environment
story.append(box(
    "6. ENVIRONMENT, WATER & WASTE",
    [
        "Waterborne diseases: cholera, typhoid, hepatitis A/E, polio, dysentery, dracunculiasis",
        "Water purification (large scale): Sedimentation → Coagulation (alum) → Filtration (slow/rapid sand) → Disinfection (chlorination)",
        "Diff b/w slow sand filter & rapid sand filter: slow = 0.1-0.4 m/hr, biological (schmutzdecke); rapid = 5-15 m/hr, physical+chemical",
        "Residual chlorine: 0.5 mg/L after 1 hr. Break-point chlorination: removes all organic matter + ammonia",
        "Disinfection of well: permanganate, bleaching powder, chlorination",
        "Hardness of water: temporary (carbonate) vs permanent (sulphate). Not health hazard directly",
        "BOD (Biochemical Oxygen Demand): indicator of organic pollution. Higher BOD = more polluted",
        "Oxidation pond: natural, sunlight, algae-bacteria symbiosis. Low-cost sewage treatment",
        "BMW (Biomedical Waste) Management Rules 2016: colour coding — yellow (incineration/deep burial), red (autoclave), white (sharps/puncture-proof), blue (glassware)",
        "Inertization: mix waste with cement before landfill (heavy metals)",
        "Overcrowding: >1.5 persons/room (NHRC). Promotes TB, ARI, meningitis",
        "Types of ventilation: natural (windows, louvres), artificial (fans, AC). Cross-ventilation ideal",
        "Green house gases: CO₂, CH₄, N₂O, CFCs. Global warming",
        "Breeding habits: Anopheles (clean, stagnant, edge vegetation), Culex (polluted water, overhead tanks), Aedes (clean collected water — tyres, coolers)",
        "Aedes diseases: Dengue, Chikungunya, Zika, Yellow fever",
        "Mosquito control: biological (Gambusia fish, Bacillus thuringiensis), chemical (DDT, pyrethrin), source reduction",
    ],
    THEAD, PSM_LIGHT, PSM_DARK,
    star_items=[2, 3, 8, 13]
))

# 7. Occupational + Disaster + Miscellaneous
story.append(box(
    "7. OCCUPATIONAL HEALTH, DISASTER, SOCIAL MEDICINE",
    [
        "Ergonomics: fitting the job to the worker. Musculoskeletal disorders from poor ergonomics",
        "Pneumoconiosis: Silicosis (silica — eggshell calcification, nodular), Asbestosis (pleural plaques, mesothelioma), Coal workers' (progressive massive fibrosis), Byssinosis (cotton dust — Monday fever)",
        "ESI Act 1948: medical benefit, sickness benefit, maternity benefit, disablement benefit. Factory Act 1948: hours, safety, welfare",
        "Occupational cancer: scrotal (chimney sweeps, 1st occupational cancer — Pott's disease), bladder (aniline dyes, β-naphthylamine), lung (asbestos, radon, arsenic)",
        "Noise-induced hearing loss (NIHL): >85 dB(A) for 8 hrs. 4000 Hz notch on audiometry",
        "Triage: START method. Red (immediate), Yellow (delayed), Green (minor), Black (expectant/dead)",
        "Disaster preparedness: plan → mitigation → response → recovery (4 phases)",
        "Types of family: nuclear, joint, extended, single parent, blended. Family cycle stages",
        "IQ formula: IQ = Mental age / Chronological age × 100. Normal 90-110",
        "Socialization: learning social norms. Acculturation: cultural change due to contact",
        "Doctor-patient relationship: Szasz-Hollander model (activity-passivity, guidance-cooperation, mutual participation)",
        "Genetic counseling: risk assessment, non-directive approach. Hardy-Weinberg principle: p²+2pq+q²=1",
        "Turner's syndrome (45X0): webbed neck, primary amenorrhoea, short stature — NO Barr body",
        "Klinefelter's (47XXY): tall, gynecomastia, azoospermia, Barr body +ve",
        "Diff b/w Eugenics (genetic quality improvement) & Euthenics (improving environment)",
        "Warning signs of mental health: irritability, sleep disturbance, poor concentration, withdrawal",
        "Barriers of communication: language, cultural, physical, psychological, semantic",
        "Health education: IEC (Inform, Educate, Communicate) vs BCC (Behaviour Change Communication)",
        "Planning cycle: situation analysis → priority setting → objectives → strategies → implementation → evaluation",
        "PERT & CPM: project management tools. Critical path = longest path",
        "WHO functions: normative, technical cooperation, governance. HQ Geneva",
        "UNICEF GOBI: Growth monitoring, ORT, Breastfeeding, Immunization",
        "World Health Day 2025 theme: 'My health, my right'",
        "Vision 2020 / Ayushman Bharat / PM-JAY / NHM: key schemes",
    ],
    THEAD, PSM_LIGHT, PSM_DARK,
    star_items=[0,1,2,5,8,19,21]
))

story.append(PageBreak())

# ══════════════════════════════════════════════════════
# FMT SECTION
# ══════════════════════════════════════════════════════
story.append(banner("📕  SECTION 2: FMT — Forensic Medicine & Toxicology", FMT_DARK))
story.append(Spacer(1,5))

# 1. Legal Procedure + Inquest
story.append(box(
    "1. LEGAL PROCEDURE & INQUEST",
    [
        "★ Inquest: official inquiry into sudden/unnatural death. Types: Police (CrPC 174), Magistrate (CrPC 176), Coroner's (not in India now), Jury inquest (UK)",
        "★ Diff b/w Police & Magistrate inquest: Police = all unnatural deaths; Magistrate = custodial death, rape + death, exhumation, unidentified bodies",
        "Summon/Subpoena: court order to appear. Failure = contempt of court",
        "★ Perjury: giving false evidence under oath. IPC 193 — 7 yrs imprisonment",
        "Dying declaration: Section 32 IEA. No oath needed. Magistrate preferred. All circumstances of transaction",
        "★ Cross-examination: questioning witness by opposite party to discredit testimony",
        "Criminal amendment act 2018: death penalty for rape of <12 yrs. POCSO strengthened",
        "Section 375 IPC: Rape — 7 clauses. Without consent, with false promise, <18 yrs, mental incapacity",
        "Doctor as a witness: expert witness (opinion), ordinary witness (facts). Professional secrecy limitations",
        "Exhumation: digging up buried body for PM examination. Magistrate's order needed",
        "Virtopsy: virtual autopsy using CT/MRI. Non-invasive. Especially for religious objections",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    star_items=[0,1,3,5]
))

# 2. Death & PM Changes
story.append(box(
    "2. DEATH & POST-MORTEM CHANGES",
    [
        "★ Rule of 12 (Thanatology): Rigor mortis starts 2-6 hrs (avg starts ~4 hrs). 12 hrs = fully developed. 24 hrs = starts passing. 48 hrs = gone. Also: lividity fixed 12 hrs",
        "Manner of Death: Natural, Accidental, Suicidal, Homicidal (NASH)",
        "Suspended animation: apparent death — no detectable vital signs. Seen in: drowning, electrocution, CO poisoning, newborn. Medicolegal importance",
        "★ Rigor mortis: ATP depletion → actin-myosin locking. Nysten's law = jaw → neck → trunk → limbs. Cadaveric spasm = instantaneous rigor (article found in hand). Heat stiffening ≠ rigor (different mechanism)",
        "★ Hypostasis (Livor mortis): starts 2-4 hrs, fixed 8-12 hrs. Distribution: dependent parts. MLI: position of body, time, possibility of ante/post-mortem injury",
        "★ Adipocere: saponification of fats in moist conditions. Months to develop. MLI: preserves body features, helps identify position",
        "★ Decomposition: putrefaction (bacteria). Green iliac fossa first (caecum). Marbling = putrefaction blood vessels. Stages: fresh → bloat → active → advanced → skeletonization",
        "Mummification: dry hot environment. Desiccation. Preserves external features",
        "Tache noire: post-mortem artifact — drying of sclera (blackish brown band) when eyelids open",
        "Changes seen after birth vs stillbirth: air in lungs (hydrostatic test), separate placenta/cord",
        "Algor mortis: ~1°C/hr cooling (Henssge nomogram). Affected by environment, clothing, obesity, body size",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    star_items=[0,3,4,5,6]
))

# 3. Autopsy
story.append(box(
    "3. AUTOPSY (POST-MORTEM EXAMINATION)",
    [
        "Types: Medicolegal (commissioned by court/magistrate) vs Clinical (hospital). Forensic PM = external + internal examination",
        "Types of incisions: I-shaped (thorax), Y-shaped (thorax+abdomen), H-shaped (special). Brain: coronal incision",
        "Organ removal methods: Virchow (organ by organ), Rokitansky (in situ), Ghon (en bloc), Letulle (all at once)",
        "★ Viscera preserved for chemical analysis: stomach + contents, 1 ft of intestine, 1/3 of liver, 1 kidney, urine, blood, CSF. Preservative: saturated NaCl (NOT formalin for chemical)",
        "★ Exhumation: order from Executive Magistrate. Presence of doctor, police, witnesses. PM done as if fresh body",
        "★ Objectives of ML autopsy: cause of death, manner of death, time of death, identity, injuries, collect evidence",
        "Negative autopsy: no cause found after full PM + histology + toxicology (e.g., cardiac arrhythmia, epilepsy)",
        "Virtopsy: CT + MRI + angiography. Useful when family refuses conventional autopsy",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    star_items=[3,4,5]
))

# 4. Mechanical Asphyxia + Drowning
story.append(box(
    "4. MECHANICAL ASPHYXIA",
    [
        "Classic signs: TBL — Tardieu spots (petechiae under serosal surfaces), Bloating/cyanosis (face, lips), Liquidity of blood (prolonged hypoxia → heparin-like substances)",
        "★ Hanging: classify — judicial (drop), suicidal (suspension). Ligature mark: oblique, incomplete, parchment. Cause of death: asphyxia (most common), venous congestion, reflex cardiac arrest, fracture C2 (judicial). Dribbling of saliva, face pale/congested (partial vs complete)",
        "★ Strangulation: ligature mark = horizontal, complete. Manual = throttling (fingernail abrasions, hyoid fracture). Garroting = from behind",
        "★ PM findings of drowning: frothy fluid in airways, washerwoman's hands/feet, weed in hands, lungs waterlogged (emphysema aquosum). Diatom test = GOLD STANDARD for antemortem drowning",
        "★ Diff b/w ante-mortem & post-mortem drowning: cadaveric spasm (ante), no spasm (post). Diatom test +ve only in ante",
        "Café coronary syndrome: food bolus → vagal inhibition → sudden death. Mimics MI",
        "Café coronary treatment: Heimlich manoeuvre",
        "★ CO poisoning: cherry-red lividity + face. COHb >50% = lethal. Treatment: 100% O₂, hyperbaric O₂",
        "Traumatic asphyxia: compression of chest. Masque écchymotique (petechiae face/neck)",
        "Smothering: mouth + nose covered. Lacerations inner lips (from teeth)",
        "Burking = smothering + traumatic asphyxia simultaneously",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    star_items=[1,2,3,4,7]
))

# 5. Injuries — two col
story.append(two_col(
    "5A. MECHANICAL INJURIES",
    [
        "★ Abrasion types: Scratch/linear, Graze/brush (direction of force), Pressure/impact. No bleeding (epidermis only). Indicates site + direction of impact. MLI: corroborates history",
        "★ Contusion (bruise): extravasation into tissues. Age: 0-2d (red/blue-black) → 5-7d (green) → 7-14d (yellow) → disappears. Railway pattern bruise",
        "★ Diff incised vs lacerated: Incised = sharp weapon, clean edges, no bridging, bleeds freely; Lacerated = blunt, irregular edges, hair bulbs intact, bridging strands",
        "Stab wound: depth > length. Hilt mark = full penetration",
        "Chop wound: heavy sharp weapon (dao/axe). Mixed incised + lacerated features",
        "Defense injuries: palms, forearms, back of hands — defensive posture against attack",
        "Self-inflicted injury: accessible areas, superficial parallel cuts, hesitation marks, clothing intact",
        "Forged wound: fabricated injury for insurance/alibi",
        "★ Grievous hurt (IPC 320): 8 types — emasculation, permanent loss of sight/hearing, loss of member/joint, permanent disfiguration, fracture/dislocation of bone, dangerous hurt",
        "★ Types of skull fracture: linear, depressed, pond (children), contrecoup, ring fracture (base)",
        "★ Coup and contrecoup injury: coup = at impact site; contrecoup = opposite side (more severe in contrecoup due to brain movement)",
        "Epidural haematoma: lucid interval (middle meningeal artery rupture). Subdural: bridging veins",
        "Whiplash injury: sudden hyperextension-flexion of neck (rear-end collision). C5-C6 most common",
    ],
    "5B. FIREARM INJURIES",
    [
        "★ Entry wound (rifled): circular, inverted, abrasion collar (contusion ring), smaller",
        "★ Exit wound: irregular, everted (punched out), larger, NO abrasion collar",
        "Contact range GSW: muzzle impression, star-shaped laceration, singeing, blackening, tattooing (all present)",
        "★ Abrasion collar (contusion ring): due to bullet spinning. Always present at entry. Absent in exit",
        "Tattooing/Stippling: unburnt gunpowder embeds in skin. Cannot be wiped. <60 cm range",
        "Blackening/Smudging: soot deposits. Can be wiped. Very close range",
        "Tandem bullet: two bullets fired from one cartridge, one behind other",
        "Ricochet bullet: deflected off surface → irregular trajectory, irregular wound",
        "Classify firearms: rifled (pistol, rifle, revolver) vs smooth bore (shotgun). Rifled → more accurate",
        "Primer in cartridge: ignites propellant. Components: case, primer, propellant, projectile",
        "Close shotgun injury: single circular entry. Near range: multiple pellet holes + central hole. Distant: multiple separate pellets",
        "GSR (Gunshot Residue): Pb, Ba, Sb triad. SEM-EDX analysis. Within 6 hrs",
        "Beveling of skull: internal bevel at entry, external bevel at exit",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    THEAD_F, FMT_LIGHT, FMT_DARK,
    l_stars=[0,1,2,8,9,10,11], r_stars=[0,1,3]
))

# 6. Burn + Electrical + Infanticide
story.append(two_col(
    "6A. BURNS, ELECTRICAL & THERMAL INJURIES",
    [
        "★ Dupuytren's classification of burns: 1st (erythema), 2nd (blister/vesicle), 3rd (full thickness — charring), 4th (carbonization)",
        "Cause of death in burns: shock, sepsis, respiratory failure, renal failure",
        "★ Ante-mortem vs post-mortem burn: AM = vital reactions (soot in airways, COHb >10%, cherry-red blood, inflammatory response, blisters with protein/chloride)",
        "Joule burn (electrical): metalloidal deposit at entry + exit. Arborescent burns (lightning) = Lichtenberg flower marking",
        "Pugilistic attitude: boxing posture due to heat stiffening of flexors (NOT rigor mortis)",
        "Trench foot: prolonged cold water immersion without freezing",
    ],
    "6B. INFANTICIDE & IDENTIFICATION",
    [
        "★ Signs of live birth: cry, air in lungs (+hydrostatic test), separate placenta, meconium passage, cord changes",
        "★ Signs of dead born (stillbirth): no air in lungs, maceration if long-standing",
        "★ Rule of Hasse: fetal age in months squared = length (cm) in first 5 months. After 5 months × 5",
        "Battered baby syndrome: multiple fractures (different ages), retinal haemorrhage, subdural, metaphyseal fractures",
        "★ Gustafson's method: 6 dental features — Attrition, Secondary dentin, Periodontosis, Cementum apposition, Root resorption, Transparency of root (ASPCRT)",
        "★ Types of fingerprints: Arch (5%), Tented arch, Radial loop, Ulnar loop (most common 65%), Whorl, Composite. Henry system classification",
        "Diff b/w Animal hair & Human hair: medullary index >0.5 = animal; <0.33 = human",
        "Barr body (sex chromatin): present in females (XX). Seen in buccal smear. One less than X chromosome number",
        "MLI of tattoo mark: identify deceased, communicate occupation/gang membership, permanence",
        "MLI of 18 years of age: age of consent, driving, voting, marriage (girls), criminal responsibility",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    THEAD_F, FMT_LIGHT, FMT_DARK,
    l_stars=[0,2], r_stars=[0,2,4,5]
))

# 7. Sexual Offences + Pregnancy
story.append(box(
    "7. SEXUAL OFFENCES, VIRGINITY & PREGNANCY",
    [
        "★ Section 375 IPC (Rape): 7 clauses — against will, without consent, false promise of marriage, while intoxicated, <18 yrs, mental incapacity, etc. Punishment IPC 376: min 7 yrs → life",
        "★ POCSO Act 2012: Sexual offences against children <18 yrs. Penetrative, aggravated, non-penetrative, sexual harassment, pornography",
        "★ Medicolegal examination of rape victim: written informed consent, examine injuries (genital + non-genital), hymen examination, vaginal swab (within 72-96 hrs), blood grouping, DNA collection",
        "Samples to preserve: vaginal swab, blood, urine, semen, clothing, nail clippings",
        "★ Hymen: types (annular, crescentic, cribriform, imperforate). Tear: fresh = bleeds, old = healed notch at 3 or 9 o'clock. NOT reliable indicator of virginity",
        "★ Diff b/w true & false virginity: true = intact hymen; false = intact hymen but history of coitus OR broken hymen but no coitus",
        "Two-finger test: abolished by Supreme Court 2022 (re-traumatizing, inaccurate, violates dignity)",
        "★ Sexual perversions (paraphilias): Pedophilia (<14 yrs), Voyeurism (watching), Exhibitionism, Fetishism, Sadism (pleasure from inflicting pain), Masochism (own pain), Bestiality (animals), Tribadesim/Lesbianism, Sodomy (IPC 377)",
        "Probable signs of pregnancy: amenorrhoea, nausea, breast changes, Chadwick's sign, Hegar's sign (6-8 wks), Goodell's sign, ballottement",
        "★ Confirmatory signs: USG (fetal heart from 6 wks), FHR auscultation, fetal movements felt by examiner, X-ray skeleton",
        "★ Presumptive signs of recent delivery: uterine involution, lochia, engorged breasts, stretch marks, torn hymen + perineum",
        "Heteropaternal superfecundation: twins with different fathers (two ova fertilized in same cycle by different men)",
        "★ Artificial Insemination: AIH (husband) vs AID (donor). MLI: legitimacy of child",
        "★ MTP Act 2021 amendment: up to 20 wks (one provider), up to 24 wks (special: rape, incest, fetal abnormality, disability). Unmarried women now included",
        "Methods of criminal abortion: instrumental (most dangerous), drugs (ergot, quinine, pitocin), local (soap/antiseptic)",
        "Impotence vs sterility: impotence = inability to have intercourse; sterility = inability to reproduce",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    star_items=[0,1,2,4,5,7,9,10,12,13]
))

# 8. Medical Jurisprudence + Psychiatry
story.append(box(
    "8. MEDICAL JURISPRUDENCE & FORENSIC PSYCHIATRY",
    [
        "★ Professional misconduct: infamous conduct, covering for unqualified person, issuing false certificate, criminal abortion, association with unqualified person. Punished by NMC",
        "★ Negligence: 4 D's — Duty, Dereliction, Direct causation, Damage. Bolam test: standard of reasonable doctor",
        "★ Civil vs Criminal negligence: civil = compensation; criminal (IPC 304A) = imprisonment up to 2 yrs. Jacob Mathew case",
        "★ Informed consent: voluntary, competent, informative. Elements: diagnosis, procedure, risks, alternatives, right to refuse. Valid age = 12 yrs general, 18 yrs sterilization",
        "★ Privileged communication: doctor-patient confidentiality. Exceptions: court order, communicable disease notification, insurance, public interest",
        "★ Vicarious liability: employer responsible for employee's negligence. Hospital liable for doctor",
        "★ Professional secrecy: duty of confidentiality. Can be broken: court order, notifiable disease, for patient's welfare",
        "Doctrine of Res ipsa loquitur: 'the thing speaks for itself' — negligence apparent from facts (e.g., instrument left in abdomen)",
        "Corporate negligence: hospital's own direct negligence (credentialing, maintenance, supervision)",
        "Consumer Protection Act 2019: medical services included. NCDRC for compensation",
        "★ NMC Act 2020: replaced MCI. National Medical Commission. Regulates medical education + practice",
        "HIV & AIDS (Prevention & Control) Act 2017: no discrimination, confidentiality, right to treatment",
        "★★★★★★★ McNaughten Rules: legal test for insanity. 'Not guilty by reason of insanity' if at time of offence: didn't know nature of act OR didn't know it was wrong",
        "★★ Delusion types: persecution, grandeur, reference, nihilism, hypochondriacal",
        "★★★★ Hallucination: false perception without external stimulus. Types: visual (organic), auditory (schizophrenia), tactile (cocaine bugs/formication), olfactory, gustatory",
        "★ Testamentary capacity: ability to make a will. Must know: nature of will, property, beneficiaries, free from delusion affecting will",
        "Cocaine bugs (Magnon's symptom/formication): tactile hallucination of insects crawling under skin — cocaine poisoning",
        "OCD: obsessions (intrusive thoughts) + compulsions (repetitive acts). Ego-dystonic",
        "Criminal responsibility of mentally ill: IPC 84 (complete unsoundness of mind = no criminal responsibility)",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    star_items=[0,1,2,3,4,5,6,10,12,13,14,15]
))

# 9. Toxicology
story.append(box(
    "9. TOXICOLOGY",
    [
        "★ ML duties in suspected poisoning: preserve evidence, collect samples (blood, urine, gastric contents, viscera), fill poison chart, inform police, send viscera in saturated NaCl",
        "★ Classify poisons: corrosive (acids, alkalis), irritant (metallic, non-metallic, mechanical), systemic (cardiac, CNS, spinal, asphyxiant), neurotic",
        "★ Qualities of homicidal poison: tasteless, odourless, colourless, slow acting, mimics natural disease, difficult to detect",
        "★ Gastric lavage: within 4-6 hrs of ingestion. CI: corrosive poisoning (perforation risk), unconscious (without intubation), hydrocarbon ingestion",
        "★ Vitriolage: throwing corrosive acid (H₂SO₄ most common). IPC 326A/B. Specific punishment in India 2013",
        "Carbolic acid (Phenol): white staining → turns red-brown. Anaesthetic on mucosa. Smell of phenol",
        "★ Phosphorus (yellow): garlic odour, luminescent vomit in dark. Hepatotoxicity. Firecracker/matchstick",
        "★ Arsenic: garlic odour, Reinsch test, Marsh test (gold standard). Rice-water stools + blood. Mees lines (transverse white lines on nails). Chronic: keratosis palms/soles, rain-drop pigmentation",
        "★ Diff b/w arsenic & cholera: both have rice-water stools, but arsenic = garlic odour, Marsh test +ve, history of exposure",
        "★ Lead: Burton's line (blue-black gum), wrist/foot drop, basophilic stippling (RBC), lead colic, encephalopathy. Serum lead >10 μg/dL = toxic",
        "Mercury: Minamata disease (organic mercury, Japan). Acrodynia = Pink disease (children). Erethism (neurological)",
        "★ Organophosphates: irreversible AChE inhibition. SLUDGE (Salivation, Lacrimation, Urination, Defecation, GI cramps, Emesis) + miosis, bradycardia. Treatment: Atropine (first) + Pralidoxime (PAM — before aging)",
        "★ Aluminium phosphide (celphos/tablet): releases PH₃ (phosphine gas). No antidote. Gastric decontamination + supportive. Mass suicide India",
        "★ Dhatura (Anticholinergic): MOA = competitive ACh blockade. Signs: Dry as bone, Red as beet, Blind as bat, Mad as hatter, Hot as hare. Treatment: physostigmine (specific antidote)",
        "★ Cannabis indica preparations: bhang (least potent), ganja, charas/hashish (most potent). Active: THC. Run amok (cannabis-induced violence)",
        "★ Cocaine: Erythroxylon coca. Local anaesthetic + vasoconstrictor. Nasal septal perforation (chronic). Cocaine bugs (formication). Crack = freebase form",
        "★ Ethyl alcohol: Widmark formula: BAC = A/(r×W). r = 0.7 (male), 0.6 (female). Legal limit India: 30 mg/100 mL blood. McEwan's sign: putrid smell of breath (ante-mortem alcohol)",
        "Diff b/w poisonous & non-poisonous snake: poisonous = fangs, single row subcaudal scales, elliptical pupil, hemipenis scar. Non-poisonous = double row, round pupil",
        "★ Ophitoxemia (snake venom): neurotoxic (cobra, krait — elapidae), haemotoxic (viper), cytotoxic. Treatment: polyvalent antivenom. Serum sickness risk",
        "★ Abrus precatorius (rosary pea/jequirity): toxalbumin (abrin). MLI: homicide (seeds used as poison)",
        "★ Semicarpus anacardium (marking nut): vesicant contact poison. MLI: skin burns, criminal abortion attempts",
        "★ Croton tiglium (purging croton): phorbol esters, powerful irritant cathartic. Cocarcinogen",
        "★ Nux vomica/Strychnine: alkaloids strychnine + brucine. Spinal poison. Opisthotonos, risus sardonicus, convulsions. Diff: strychnine convulsions vs tetanus (jaw not locked initially in strychnine)",
        "Cyanide: bitter almond smell. Brick-red lividity. Antidote: amyl nitrite + Na thiosulfate",
        "Cardiac poisons: Digitalis (heart block), Aconite (tingling + arrhythmia), Oleander, Veratrum. Hippus: rhythmic contraction-dilation of pupil (aconite)",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK,
    star_items=[0,1,2,3,4,6,7,8,9,11,12,13,14,15,16,18,19,20,21,22,23]
))

# 10. Recent Advances
story.append(box(
    "10. RECENT ADVANCES & FORENSIC SCIENCE LAB",
    [
        "Narcoanalysis (truth serum): sodium pentothal/scopolamine IV. NOT admissible as sole evidence (Selvi vs Karnataka 2010). Voluntary only",
        "Polygraph (lie detector): measures physiological responses (BP, pulse, respiration, GSR). NOT 100% accurate",
        "Locard's exchange principle: 'every contact leaves a trace' — basis of forensic science",
        "Collection of PM samples: blood (femoral), urine (bladder), vitreous humour (best preserved), stomach contents, liver, brain",
        "DNA fingerprinting: STR (short tandem repeats) — current standard. Mitochondrial DNA from hair shaft (no nucleus). CODIS system (USA)",
        "Dactylography: fingerprint classification (Henry system). MLI of fingerprints: cannot be altered, unique, permanent",
    ],
    THEAD_F, FMT_LIGHT, FMT_DARK
))

# ── QUICK REFERENCE TABLES ──────────────────────────────────────
story.append(Spacer(1,5))
story.append(HRFlowable(width="100%", thickness=1.5, color=GOLD))
story.append(Spacer(1,5))
story.append(Paragraph("⚡  QUICK REFERENCE — KEY NUMBERS & FACTS", S("QT", fontName="Helvetica-Bold", fontSize=10, textColor=colors.HexColor("#333"), spaceBefore=3, spaceAfter=4)))

qr = [
    [Paragraph("<b>PSM KEY NUMBERS</b>", S("PLH", fontName="Helvetica-Bold", fontSize=8.5, textColor=PSM_DARK)),
     Paragraph("<b>FMT KEY NUMBERS</b>", S("FLH", fontName="Helvetica-Bold", fontSize=8.5, textColor=FMT_DARK))],
    [
        Paragraph(
            "• India Census 2011: 121 crore | Sex ratio: 943 | Literacy: 74%<br/>"
            "• IMR (2020): ~27/1000 LB | NMR: ~20 | MMR (2018-20): 97/1L LB<br/>"
            "• TFR India 2020: 2.0 | Life expectancy: 69.7 yrs<br/>"
            "• Herd immunity: 1 − 1/R₀ | Measles coverage needed: 95%<br/>"
            "• PHC: 30,000 pop | Sub-centre: 5,000 | CHC: 1,20,000<br/>"
            "• ASHA: 1/1000 rural pop | ANM: 1 per sub-centre<br/>"
            "• Residual chlorine: 0.5 mg/L | Break-point chlorination<br/>"
            "• BOD: high = polluted | WHO drinking water coliform = 0/100mL<br/>"
            "• MUAC <11.5 cm = SAM | 11.5-12.5 cm = MAM<br/>"
            "• Vit A schedule: 1L IU at 9 mths + measles; 2L IU every 6 mths till 5 yrs<br/>"
            "• ORS (new): 75 mEq/L sodium, 75 mmol/L glucose, 245 mOsm/L<br/>"
            "• APGAR: 0-10 | <7 at 1 min = attention needed<br/>"
            "• MTP 2021: up to 20 wks (1 provider), 24 wks (special cases)",
            BODY),
        Paragraph(
            "• Rigor mortis: starts 2-6 hrs, complete 12 hrs, passes 48-72 hrs<br/>"
            "• Livor mortis: starts 2-4 hrs, FIXED at 8-12 hrs<br/>"
            "• Algor mortis: ~1°C/hr (Henssge nomogram)<br/>"
            "• Spermatozoa viability in vagina: up to 72 hrs<br/>"
            "• Blood alcohol legal limit: 30 mg/100 mL (India driving)<br/>"
            "• Age of consent (POCSO): 18 years<br/>"
            "• Age of medical consent: 12 yrs (general), 18 yrs (sterilization)<br/>"
            "• IPC 304A: death by negligence → 2 yrs | IPC 302: murder → death/life<br/>"
            "• MTP amended 2021: 20 wks (1 provider), 24 wks (special)<br/>"
            "• McNaughten Rule: didn't know nature OR didn't know wrong<br/>"
            "• Widmark formula: BAC = A / (r × W)<br/>"
            "• Rule of 12: rigor complete 12 hrs, lividity fixed 12 hrs<br/>"
            "• Gustafson's 6 features: A-S-P-C-R-T (Attrition, Secondary dentin, Periodontosis, Cementum, Resorption, Transparency)",
            BODY),
    ]
]
qr_tbl = Table(qr, colWidths=[CW/2, CW/2])
qr_tbl.setStyle(TableStyle([
    ("BACKGROUND",(0,0),(0,0),PSM_LIGHT),("BACKGROUND",(1,0),(1,0),FMT_LIGHT),
    ("BACKGROUND",(0,1),(0,1),GREY_BG),("BACKGROUND",(1,1),(1,1),GREY_BG),
    ("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4),
    ("LEFTPADDING",(0,0),(-1,-1),6),
    ("BOX",(0,0),(0,-1),1,PSM_DARK),("BOX",(1,0),(1,-1),1,FMT_DARK),
    ("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(KeepTogether([qr_tbl]))
story.append(Spacer(1,8))
story.append(Paragraph(
    "★ = Topics specifically listed as important in your exam topic sheets  |  Prepared for 3rd Prof MBBS — August 2026. Best of luck! 🎯",
    FNOTE
))

doc.build(story, onFirstPage=footer, onLaterPages=footer)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/mbbs-study && python generate_pdf_v2.py 2>&1

Running Command

ls -lh /home/daytona/workspace/mbbs-study/HighYield_PSM_FMT_v2.pdf

Your updated PDF is ready — download it here:

HighYield PSM FMT v2

PDF Document · PDF


Here's what's new in this version compared to the first one:
What was added from your 3 topic sheets:
All three PDFs were processed (OCR was needed for the scanned ones):
  • 3rd yr Imp. Topic.pdf — gave the complete structured PSM + FMT topic list with your professor's importance markings (★★★★★ = very important)
  • fmt imp topic wise.pdf — FMT handwritten topic list with importance stars
  • PSM Important (New).pdf — handwritten PSM topic list with professor's starred topics
New topics added to the PDF:
SectionNewly Added
PSMSDGs/MDGs, PQLI, AETCOM, Iceberg phenomenon, Epidemic investigation, Rule of halves, Vision 2020/Ayushman Bharat, RMNCH+A, IMNCI, Kangaroo mother care, Demographic cycle, Family cycle, Ergonomics, ESI Act, PERT & CPM, WHO/UNICEF functions
FMTInquest types (Police vs Magistrate), Perjury, Dying declaration, Exhumation, Virtopsy, Rule of 12, Suspended animation, Signs of live birth/stillbirth, Rule of Hasse, Infanticide, Narcoanalysis, Polygraph, Locard's principle, Cocaine bugs, McNaughten rule, Sexual perversions, Testamentary capacity, Forensic psychiatry topics
ToxicologyAluminium phosphide, Abrus precatorius, Semicarpus anacardium, Croton tiglium, Nux vomica/Strychnine, Cardiac poisons (hippus, aconite, digitalis)
Key feature: Topics from your sheets are marked with ★ (in red/bold) throughout the PDF so you know exactly which ones your professor considers exam-important.

Excel sheet of schedule and study plan

Reading File
Writing File

~/mbbs-study/generate_schedule.py

import openpyxl
from openpyxl.styles import (
    PatternFill, Font, Alignment, Border, Side, GradientFill
)
from openpyxl.utils import get_column_letter
from openpyxl.worksheet.datavalidation import DataValidation

OUTPUT = "/home/daytona/workspace/mbbs-study/MBBS_3rdProf_StudyPlan.xlsx"

wb = openpyxl.Workbook()

# ── Colour palette ────────────────────────────────────────────────
C = {
    "psm_dark":    "1A5276",
    "psm_mid":     "2980B9",
    "psm_light":   "D6EAF8",
    "fmt_dark":    "7B241C",
    "fmt_mid":     "C0392B",
    "fmt_light":   "FADBD8",
    "gym":         "1E8449",
    "gym_light":   "D5F5E3",
    "outing":      "784212",
    "outing_light":"FDEBD0",
    "gold":        "F0B000",
    "grey_hdr":    "2C3E50",
    "grey_mid":    "85929E",
    "grey_light":  "F4F6F7",
    "white":       "FFFFFF",
    "black":       "000000",
    "revision":    "6C3483",
    "revision_l":  "E8DAEF",
    "exam_day":    "B7950B",
    "exam_light":  "FEF9E7",
    "green_tick":  "27AE60",
    "orange":      "E67E22",
    "orange_l":    "FDEBD0",
}

def fill(hex_color):
    return PatternFill("solid", fgColor=hex_color)

def font(bold=False, color="000000", size=10, italic=False):
    return Font(name="Arial", bold=bold, color=color, size=size, italic=italic)

def align(h="center", v="center", wrap=False):
    return Alignment(horizontal=h, vertical=v, wrap_text=wrap)

def border(style="thin"):
    s = Side(style=style)
    return Border(left=s, right=s, top=s, bottom=s)

def thick_border():
    t = Side(style="medium")
    return Border(left=t, right=t, top=t, bottom=t)

def apply(ws, row, col, value="", bg=None, bold=False, color="000000",
          size=10, halign="center", valign="center", wrap=False,
          italic=False, brdr=True):
    cell = ws.cell(row=row, column=col, value=value)
    if bg:
        cell.fill = fill(bg)
    cell.font = font(bold=bold, color=color, size=size, italic=italic)
    cell.alignment = align(halign, valign, wrap)
    if brdr:
        cell.border = border()
    return cell

def merge_apply(ws, r1, c1, r2, c2, value="", bg=None, bold=False,
                color="000000", size=10, halign="center", valign="center",
                wrap=False, italic=False):
    ws.merge_cells(start_row=r1, start_column=c1, end_row=r2, end_column=c2)
    cell = ws.cell(row=r1, column=c1, value=value)
    if bg:
        cell.fill = fill(bg)
    cell.font = font(bold=bold, color=color, size=size, italic=italic)
    cell.alignment = align(halign, valign, wrap)
    cell.border = border("medium")
    return cell

# ═══════════════════════════════════════════════════════════
# SHEET 1 — DAILY TIMETABLE
# ═══════════════════════════════════════════════════════════
ws1 = wb.active
ws1.title = "Daily Timetable"
ws1.sheet_view.showGridLines = False
ws1.row_dimensions[1].height = 40
ws1.row_dimensions[2].height = 22

# Title
merge_apply(ws1, 1, 1, 1, 5,
    "📅  MBBS 3RD PROF — DAILY STUDY TIMETABLE",
    bg=C["psm_dark"], bold=True, color=C["white"], size=16, valign="center")

merge_apply(ws1, 2, 1, 2, 5,
    "Exam: August 3, 2026  |  Subjects: PSM + FMT  |  Study: 9 hrs/day  |  Gym: 2 hrs  |  Outing: 1.5 hrs",
    bg=C["grey_hdr"], bold=False, color=C["gold"], size=9, italic=True)

# Column widths
ws1.column_dimensions["A"].width = 18
ws1.column_dimensions["B"].width = 32
ws1.column_dimensions["C"].width = 22
ws1.column_dimensions["D"].width = 28
ws1.column_dimensions["E"].width = 18

# Headers
headers = ["Time Slot", "Activity", "Type", "Focus / Notes", "Duration"]
for ci, h in enumerate(headers, 1):
    apply(ws1, 3, ci, h, bg=C["grey_hdr"], bold=True, color=C["white"], size=10)
ws1.row_dimensions[3].height = 18

schedule = [
    # (time, activity, type, notes, duration, bg)
    ("5:30 AM",         "Wake Up & Freshen Up",             "Personal",         "Light breakfast, hydration",                          "30 min",  C["grey_light"]),
    ("6:00 – 6:45 AM",  "Morning Revision",                 "Study",            "Flashcards / previous day's notes — NO new content",  "45 min",  C["psm_light"]),
    ("6:45 – 7:00 AM",  "Travel / Prep for Gym",            "Personal",         "Get ready, pack gym bag",                             "15 min",  C["grey_light"]),
    ("7:00 – 9:00 AM",  "🏋️ GYM",                          "Gym",              "Workout: 45 min lifting + 15 min cardio + cool-down", "2 hrs",   C["gym_light"]),
    ("9:00 – 9:30 AM",  "Shower + Breakfast",               "Personal",         "High-protein breakfast (eggs, milk, fruits)",          "30 min",  C["grey_light"]),
    ("9:30 AM – 1:00 PM","📘 Study Block 1 — PSM",          "PSM Study",        "Main theory: 1 topic in depth. Write short notes",    "3.5 hrs", C["psm_light"]),
    ("1:00 – 1:15 PM",  "Short Break",                      "Break",            "Stretch, walk around",                                "15 min",  C["grey_light"]),
    ("1:00 – 2:00 PM",  "Lunch + Rest",                     "Personal",         "Light lunch. Power nap 20 min if needed",             "1 hr",    C["grey_light"]),
    ("2:00 – 5:30 PM",  "📕 Study Block 2 — FMT",          "FMT Study",        "Main theory: 1 topic in depth. Write short notes",    "3.5 hrs", C["fmt_light"]),
    ("5:30 – 7:00 PM",  "🚶 Outing / Break",               "Outing",           "Walk, hang out, relax — MANDATORY, prevents burnout", "1.5 hrs", C["outing_light"]),
    ("7:00 – 7:30 PM",  "Freshen Up + Light Snack",         "Personal",         "Tea/coffee, light snack",                             "30 min",  C["grey_light"]),
    ("7:30 – 9:30 PM",  "📚 Study Block 3 — Mixed PYQs",   "Revision",         "Solve 20-25 PYQs: mix PSM + FMT. Self-test",          "2 hrs",   C["revision_l"]),
    ("9:30 – 10:00 PM", "Plan Next Day",                    "Planning",         "Write tomorrow's topics, review today's notes",       "30 min",  C["grey_light"]),
    ("10:00 PM",        "😴 Sleep",                         "Personal",         "8 hrs sleep. No screen 30 min before bed",            "8 hrs",   C["grey_light"]),
]

type_colors = {
    "PSM Study":  C["psm_mid"],
    "FMT Study":  C["fmt_mid"],
    "Gym":        C["gym"],
    "Outing":     C["outing"],
    "Revision":   C["revision"],
    "Personal":   C["grey_mid"],
    "Break":      C["grey_mid"],
    "Planning":   C["grey_mid"],
    "Study":      C["psm_mid"],
}

for ri, (time, act, typ, notes, dur, row_bg) in enumerate(schedule, 4):
    ws1.row_dimensions[ri].height = 20
    apply(ws1, ri, 1, time,   bg=row_bg, bold=True,  halign="center")
    apply(ws1, ri, 2, act,    bg=row_bg, bold=False, halign="left",  wrap=True)
    tc = type_colors.get(typ, C["grey_mid"])
    apply(ws1, ri, 3, typ,    bg=tc, bold=True, color=C["white"], halign="center")
    apply(ws1, ri, 4, notes,  bg=row_bg, bold=False, halign="left",  wrap=True, italic=True, size=9)
    apply(ws1, ri, 5, dur,    bg=row_bg, bold=True,  halign="center")

# Summary totals
r = len(schedule) + 5
merge_apply(ws1, r, 1, r, 2, "DAILY SUMMARY", bg=C["grey_hdr"], bold=True, color=C["white"], size=10)
summaries = [
    ("Total Study Hours", "~9 hours", C["psm_light"]),
    ("Gym",               "2 hours",  C["gym_light"]),
    ("Outing / Break",    "1.5 hours",C["outing_light"]),
    ("Sleep",             "8 hours",  C["grey_light"]),
]
for i, (lbl, val, bg) in enumerate(summaries, r+1):
    ws1.row_dimensions[i].height = 18
    apply(ws1, i, 1, lbl, bg=C["grey_light"], bold=True, halign="left")
    apply(ws1, i, 2, val, bg=bg,              bold=True, halign="center", color=C["black"])
    for col in range(3, 6):
        apply(ws1, i, col, "", bg=bg)

# ═══════════════════════════════════════════════════════════
# SHEET 2 — 20-DAY PLAN
# ═══════════════════════════════════════════════════════════
ws2 = wb.create_sheet("20-Day Study Plan")
ws2.sheet_view.showGridLines = False

ws2.column_dimensions["A"].width = 5
ws2.column_dimensions["B"].width = 14
ws2.column_dimensions["C"].width = 12
ws2.column_dimensions["D"].width = 36
ws2.column_dimensions["E"].width = 36
ws2.column_dimensions["F"].width = 30
ws2.column_dimensions["G"].width = 14

ws2.row_dimensions[1].height = 38
ws2.row_dimensions[2].height = 20
ws2.row_dimensions[3].height = 18

merge_apply(ws2, 1, 1, 1, 7,
    "📅  20-DAY STUDY PLAN  —  July 14 to August 2, 2026",
    bg=C["psm_dark"], bold=True, color=C["white"], size=15)
merge_apply(ws2, 2, 1, 2, 7,
    "Exam: August 3, 2026  |  ★ = High-priority exam topics  |  Revision days every Sunday + Monday",
    bg=C["grey_hdr"], bold=False, color=C["gold"], size=9, italic=True)

headers2 = ["#", "Date", "Day", "📘 PSM — Morning Block (9:30–1:00)", "📕 FMT — Afternoon Block (2:00–5:30)", "🌙 Evening Block (7:30–9:30) — PYQs / Revision", "Status"]
for ci, h in enumerate(headers2, 1):
    apply(ws2, 3, ci, h, bg=C["grey_hdr"], bold=True, color=C["white"], size=9, wrap=True)
ws2.row_dimensions[3].height = 28

days = [
    # (date_str, day, psm_topic, fmt_topic, evening, row_type)
    # WEEK 1
    ("Jul 14", "Tue", "Epidemiology basics: Define epi, Epi triad, Descriptive epi (Person/Place/Time)", "Thanatology: Stages of death, Rule of 12, Rigor mortis, Hypostasis", "PYQs: Epidemiology + PM changes", "psm"),
    ("Jul 15", "Wed", "Epidemiology study designs: Case-control (OR formula), Cohort (RR formula), Diff b/w CCS & Cohort", "Forensic pathology: Abrasion, Contusion (age estimation), Laceration vs Incised wound", "Short notes: OR, RR, Abrasion MLI", "psm"),
    ("Jul 16", "Thu", "Biostatistics: ALL formulae — SD, SE, CI, sensitivity, specificity, PPV, NPV, NNT", "Asphyxial deaths: Hanging (classify+PM), Strangulation, Throttling, CO poisoning", "PYQs: Biostatistics + Asphyxia", "psm"),
    ("Jul 17", "Fri", "Biostatistics: Tests of significance — t-test, Chi-sq, ANOVA. Sampling types", "Sexual offences: Rape (IPC 375/376), POCSO 2012, Hymen exam, Rape kit, Two-finger test abolition", "PYQs: Sampling + IPC sections", "psm"),
    ("Jul 18", "Sat", "Communicable diseases: ARI, Rabies, Dengue, Cholera, Food poisoning. IHR 2005", "Medical jurisprudence: Inquest types, Perjury, Dying declaration, Professional misconduct, Consent", "Mixed PYQs: Comm disease + Jurisprudence", "psm"),
    ("Jul 19", "Sun", "National Programmes: UIP schedule, DOTS/NTEP, NVBDCP, VVM, Cold chain, Herd immunity", "Forensic psychiatry: McNaughten rule, Hallucination, Delusion, Testamentary capacity", "★ WEEK 1 SELF-TEST: 30 MCQs each subject", "revision"),
    ("Jul 20", "Mon", "🔄 REVISION — Week 1 PSM: Epi + Biostat + Comm Disease formulae + PYQs", "🔄 REVISION — Week 1 FMT: PM changes + Injuries + Asphyxia + Jurisprudence", "Weak areas only. Make cheat sheet for formulae", "revision"),
    # WEEK 2
    ("Jul 21", "Tue", "Non-communicable diseases: Rule of halves (HTN), Diabetes epi, Cancer (CAUTION signs), Screening cervical", "Toxicology: Corrosive poisons (H₂SO₄, Carbolic acid). Metallic: Arsenic (Marsh test), Lead (Burton's line)", "PYQs: NCDs + Corrosive/Metallic poisons", "psm"),
    ("Jul 22", "Wed", "MCH: ANC, High-risk pregnancy, APGAR, KMC, BFHI, Growth chart, MMR/IMR formulae", "Toxicology: OP poisoning (SLUDGE, Atropine + PAM), Aluminium phosphide, Dhatura (anticholinergic signs)", "PYQs: MCH + OP/Dhatura toxicology", "psm"),
    ("Jul 23", "Thu", "Nutrition: PEM (Kwashiorkor vs Marasmus), MUAC, Vit A schedule, ICDS, Balanced diet, NPU", "Toxicology: Alcohol (Widmark formula), Cannabis, Cocaine (cocaine bugs), Plant poisons (Abrus, Nux vomica)", "Cheat sheet: Toxicology antidotes", "fmt"),
    ("Jul 24", "Fri", "Health planning: NHM/NRHM/NUHM, ASHA duties, PHC/CHC/SC norms, IPHS, Planning cycle, PERT", "Sexual offences (cont): Pregnancy signs, MTP Act 2021, Artificial insemination, Infanticide, Rule of Hasse", "PYQs: Health programmes + Sexual offences", "psm"),
    ("Jul 25", "Sat", "Demography: Demographic cycle (4 stages), TFR/GFR/MMR/IMR formulae, Contraception (all methods)", "Identification: Gustafson's 6 features, Fingerprints (types, Henry), Hair (medullary index), Barr body, DNA", "PYQs: Demography + Identification", "psm"),
    ("Jul 26", "Sun", "Environment: Water purification (slow vs rapid sand), BOD, Chlorination, BMW colour coding. Occupational health", "Firearm injuries: Entry vs exit wound, Abrasion collar, Tattooing vs blackening, Range estimation, GSR", "★ WEEK 2 SELF-TEST: 30 MCQs each subject", "revision"),
    ("Jul 27", "Mon", "🔄 REVISION — Week 2 PSM: NCDs + MCH + Nutrition + Demography + Environment", "🔄 REVISION — Week 2 FMT: Toxicology + Identification + Firearms + Sexual offences", "Target score: ≥75% on PYQs. Note all mistakes", "revision"),
    # WEEK 3 — INTENSIVE REVISION
    ("Jul 28", "Tue", "★ INTENSIVE: Epidemiology (all study designs, bias types) + Biostatistics (all formulae sheet)", "★ INTENSIVE: Thanatology (Rule of 12) + PM changes + Autopsy (viscera preservation)", "Full-length MCQ test: 50 Qs PSM", "psm"),
    ("Jul 29", "Wed", "★ INTENSIVE: Communicable diseases (all national programs, UIP, vaccine schedule)", "★ INTENSIVE: Asphyxia + Injuries + Firearm wounds (all types, entry vs exit)", "Full-length MCQ test: 50 Qs FMT", "fmt"),
    ("Jul 30", "Thu", "★ INTENSIVE: MCH + Nutrition + Health planning + Demography (all numerical indicators)", "★ INTENSIVE: Toxicology (classify all, antidotes, SLUDGE, Dhatura signs)", "Mixed: 25 PSM + 25 FMT PYQs. Review weak areas", "revision"),
    ("Jul 31", "Fri", "★ INTENSIVE: Environment + Occupational health + Screening criteria + Social medicine", "★ INTENSIVE: Jurisprudence (all IPC sections, McNaughten, MTP Act, POCSO)", "IPC sections + important formulae — loud revision", "fmt"),
    ("Aug 1",  "Sat", "🧪 MOCK EXAM — Full PSM paper (3 hrs timed). Review all wrong answers", "🧪 MOCK EXAM — Full FMT paper (3 hrs timed). Review all wrong answers", "Compare with answer key. Targeted revision of gaps", "exam"),
    ("Aug 2",  "Sun", "LIGHT REVISION ONLY — PSM: Biostat formulae, UIP schedule, MMR/IMR numbers, Herd immunity", "LIGHT REVISION ONLY — FMT: IPC sections list, Rule of 12, Gustafson's 6, Widmark formula", "Rest by 9 PM. No new content. Sleep 8 hrs ✅", "exam"),
    # EXAM DAY
    ("Aug 3",  "Mon", "🎯 EXAM DAY — PSM", "🎯 EXAM DAY — FMT", "You've got this! Stay calm, attempt all questions", "exam_day"),
]

row_bgs = {
    "psm":      (C["psm_light"],    C["fmt_light"]),
    "fmt":      (C["fmt_light"],    C["psm_light"]),
    "revision": (C["revision_l"],   C["revision_l"]),
    "exam":     (C["exam_light"],   C["exam_light"]),
    "exam_day": (C["gold"],         C["gold"]),
}

status_dv = DataValidation(
    type="list",
    formula1='"✅ Done,🔄 In Progress,⏳ Pending,⭐ Needs Review"',
    allow_blank=True
)
ws2.add_data_validation(status_dv)

for idx, (date, day, psm, fmt, eve, rtype) in enumerate(days, 1):
    r = idx + 3
    ws2.row_dimensions[r].height = 42 if rtype in ("revision", "exam", "exam_day") else 52

    bg_psm, bg_fmt = row_bgs.get(rtype, (C["psm_light"], C["fmt_light"]))
    # alt row tinting
    row_bg = bg_psm

    # determine text colours for special rows
    txt_col = C["black"]
    if rtype == "exam_day":
        txt_col = C["white"]
        row_bg = C["fmt_dark"]

    apply(ws2, r, 1, idx,  bg=row_bg, bold=True,  size=9, color=txt_col)
    apply(ws2, r, 2, date, bg=row_bg, bold=True,  size=9, color=txt_col)
    apply(ws2, r, 3, day,  bg=row_bg, bold=False, size=9, color=txt_col)
    apply(ws2, r, 4, psm,  bg=bg_psm if rtype != "exam_day" else row_bg,
          bold=False, size=8.5, halign="left", wrap=True, color=txt_col)
    apply(ws2, r, 5, fmt,  bg=bg_fmt if rtype != "exam_day" else row_bg,
          bold=False, size=8.5, halign="left", wrap=True, color=txt_col)
    apply(ws2, r, 6, eve,  bg=C["revision_l"] if rtype not in ("exam_day",) else row_bg,
          bold=False, size=8.5, halign="left", wrap=True, italic=True,
          color=txt_col if rtype == "exam_day" else C["black"])

    status_cell = ws2.cell(row=r, column=7, value="⏳ Pending")
    status_cell.font = font(size=9, bold=False)
    status_cell.alignment = align("center", "center")
    status_cell.fill = fill(C["grey_light"])
    status_cell.border = border()
    status_dv.add(status_cell)

# Week separators
week_rows = {4: "WEEK 1 — Foundation Topics (Jul 14–20)",
             11: "WEEK 2 — Complete Syllabus (Jul 21–27)",
             18: "WEEK 3 — Intensive Revision (Jul 28–Aug 2)"}
# Insert colored band above each week block — done via row colouring above

# ═══════════════════════════════════════════════════════════
# SHEET 3 — PSM TOPIC CHECKLIST
# ═══════════════════════════════════════════════════════════
ws3 = wb.create_sheet("PSM Topic Checklist")
ws3.sheet_view.showGridLines = False
ws3.column_dimensions["A"].width = 5
ws3.column_dimensions["B"].width = 35
ws3.column_dimensions["C"].width = 22
ws3.column_dimensions["D"].width = 12
ws3.column_dimensions["E"].width = 18
ws3.column_dimensions["F"].width = 18

merge_apply(ws3, 1, 1, 1, 6,
    "📘  PSM — COMPLETE TOPIC CHECKLIST",
    bg=C["psm_dark"], bold=True, color=C["white"], size=14)
merge_apply(ws3, 2, 1, 2, 6,
    "Mark each topic as Done / In Progress / Pending. Focus on ★★★★★ topics first.",
    bg=C["psm_mid"], bold=False, color=C["white"], size=9, italic=True)

hdrs3 = ["#", "Topic", "Sub-topics / Key Points", "★ Imp", "Status", "Revised?"]
for ci, h in enumerate(hdrs3, 1):
    apply(ws3, 3, ci, h, bg=C["grey_hdr"], bold=True, color=C["white"], size=9)
ws3.row_dimensions[3].height = 18

psm_topics = [
    # (topic, subtopics, imp_stars)
    ("Health & Disease",        "Define Health, PQLI, Spectrum, Iceberg, Epidemiological triad, SDGs/MDGs",          "★★★★"),
    ("Levels of Prevention",    "Primordial/Primary/Secondary/Tertiary, Modes of intervention, Examples each",        "★★★★★"),
    ("Epidemiology — Basics",   "Define epi, Aims, Descriptive (PPT), Epidemic curve, Secular trend",                "★★★★"),
    ("Case-Control Study",      "OR formula, retrospective, advantages/disadvantages, biases (Berkson's)",            "★★★★★"),
    ("Cohort Study",            "RR formula, prospective, advantages/disadvantages, Neyman bias",                     "★★★★★"),
    ("RCT",                     "Steps, blinding, ITT analysis, types of RCT, PICO",                                  "★★★★★"),
    ("Diff CCS vs Cohort",      "Direction, time, measure of association, cost, suitable disease",                    "★★★★"),
    ("Screening",               "Criteria (Wilson & Jungner), types, sensitivity, specificity, PPV, NPV, lead time", "★★★★★"),
    ("Biostatistics — Formulae","SD, SE, CI (95%=±1.96SE), Normal distribution %s, NNT, ARR, RRR",                  "★★★★★"),
    ("Statistical Tests",       "t-test, ANOVA, Chi-square, Mann-Whitney. Type I/II error, Power, p-value",           "★★★★"),
    ("Sampling Methods",        "SRS, Stratified, Systematic, Cluster, Multistage. Diff stratified vs SRS",          "★★★★★"),
    ("ARI / Rabies / Dengue",   "ARI: IMNCI classification. Rabies: Negri bodies, PEP. Dengue: NS1, DHF grades",     "★★★★★"),
    ("Malaria",                 "API, SPR, ABER, P.falciparum severe malaria, NVBDCP control measures",              "★★★★"),
    ("TB/RNTCP-NTEP",           "DOTS, drug regimens, MDR-TB, DOTS-plus",                                             "★★★"),
    ("Food Poisoning Types",    "Staph (1-6h), Salmonella (6-72h), Botulinum (canned), Bacillus cereus",             "★★★★"),
    ("IPV vs OPV",              "Killed vs live, VAPP, seroconversion, herd immunity differences",                    "★★★★"),
    ("Immunization Schedule",   "Complete UIP schedule, cold chain (+2 to +8°C), VVM, AEFI",                         "★★★★★"),
    ("Herd Immunity",           "Formula: 1 − 1/R₀. Measles 95%, Polio 85%",                                         "★★★"),
    ("Rule of Halves (HTN)",    "½ know → ½ treated → ½ controlled = only 1/8 controlled",                          "★★★★★"),
    ("Diabetes Epidemiology",   "Risk factors, diagnostic criteria (FBG/RBG/HbA1c), global burden",                  "★★★"),
    ("Danger Signs of Cancer",  "CAUTION mnemonic, cervical cancer screening (Pap, VIA), cancer prevention",          "★★★"),
    ("RMNCH+A / IMNCI",         "Lifecycle approach, IMNCI classification (danger signs, assess, classify, treat)",  "★★★★★"),
    ("MCH Indicators",          "MMR, IMR, NMR, U5MR, TFR, GFR formulae + India values",                            "★★★★"),
    ("ANC / High-risk Preg",    "4 (WHO 8) visits, PMSMA 9th of month, high-risk criteria, APGAR",                   "★★★"),
    ("KMC / BFHI / Growth",     "Kangaroo mother care, Baby-friendly hospital, growth chart Z-scores, MUAC",          "★★★"),
    ("PEM",                     "Kwashiorkor vs Marasmus (features diff), Gomez/IAP classification, MUAC <11.5=SAM", "★★★★★"),
    ("Vitamins & Deficiencies",  "Vit A (Bitot's, Xerophthalmia), Vit D (Rickets), Iron (common), Iodine (goitre)",  "★★★★"),
    ("ICDS Programme",          "6 services, target group (0-6 yrs, preg, lactating), anganwadi worker",              "★★★"),
    ("Demographic Cycle",       "4 stages, India in Stage 3. TFR 2.0 (India 2020). Replacement TFR = 2.1",           "★★★★★"),
    ("Contraception",           "All methods, Pearl index, OCP types (2nd/3rd gen), emergency OCP, MTP Act 2021",    "★★★★"),
    ("Water & Environment",     "Slow vs rapid sand filter, residual chlorine 0.5mg/L, BOD, BMW colour coding",       "★★★★"),
    ("Chlorination",            "Break-point chlorination, residual chlorine, disinfection of wells",                 "★★★"),
    ("Breeding Habits",         "Anopheles, Culex, Aedes — habitats and diseases transmitted",                        "★★★"),
    ("Occupational Health",     "Ergonomics, Pneumoconiosis (silicosis, asbestosis), ESI Act, NIHL >85dB",            "★★★"),
    ("Triage",                  "START method, colour codes (red/yellow/green/black), disaster phases",               "★★★"),
    ("Health Planning",         "Planning cycle steps, PERT/CPM, NHM structure, PHC/CHC/SC norms, ASHA 1/1000",     "★★★★"),
    ("Social Medicine",         "Types of family, IQ formula, Doctor-patient relationship (Szasz-Hollander)",         "★★★"),
    ("Biostatistics — Diagrams","Bar, Pie, Histogram, Frequency polygon, measures of central tendency",               "★★"),
    ("Communication",           "Process, barriers, IEC vs BCC, health education vs propaganda",                      "★★★"),
    ("International Health",    "WHO (HQ Geneva, functions), UNICEF (GOBI), World Health Day 2025 theme",            "★★★"),
]

status_dv3 = DataValidation(
    type="list",
    formula1='"✅ Done,🔄 In Progress,⏳ Not Started,⭐ Need Review"',
    allow_blank=True
)
ws3.add_data_validation(status_dv3)

revised_dv3 = DataValidation(
    type="list",
    formula1='"✅ Yes,❌ No,🔄 Once"',
    allow_blank=True
)
ws3.add_data_validation(revised_dv3)

for idx, (topic, subtopics, stars) in enumerate(psm_topics, 1):
    r = idx + 3
    ws3.row_dimensions[r].height = 32
    row_bg = C["psm_light"] if idx % 2 == 0 else C["white"]
    apply(ws3, r, 1, idx,       bg=row_bg, bold=True,  size=9)
    apply(ws3, r, 2, topic,     bg=row_bg, bold=True,  size=9, halign="left", wrap=True)
    apply(ws3, r, 3, subtopics, bg=row_bg, bold=False, size=8, halign="left", wrap=True, italic=True)
    star_bg = C["gold"] if "★★★★★" in stars else (C["psm_light"] if "★★★★" in stars else C["grey_light"])
    apply(ws3, r, 4, stars,     bg=star_bg, bold=True, size=9, color=C["fmt_dark"] if "★★★★★" in stars else C["black"])

    sc = ws3.cell(row=r, column=5, value="⏳ Not Started")
    sc.font = font(size=9); sc.alignment = align(); sc.fill = fill(C["grey_light"]); sc.border = border()
    status_dv3.add(sc)

    rc = ws3.cell(row=r, column=6, value="❌ No")
    rc.font = font(size=9); rc.alignment = align(); rc.fill = fill(C["grey_light"]); rc.border = border()
    revised_dv3.add(rc)

# ═══════════════════════════════════════════════════════════
# SHEET 4 — FMT TOPIC CHECKLIST
# ═══════════════════════════════════════════════════════════
ws4 = wb.create_sheet("FMT Topic Checklist")
ws4.sheet_view.showGridLines = False
ws4.column_dimensions["A"].width = 5
ws4.column_dimensions["B"].width = 35
ws4.column_dimensions["C"].width = 22
ws4.column_dimensions["D"].width = 12
ws4.column_dimensions["E"].width = 18
ws4.column_dimensions["F"].width = 18

merge_apply(ws4, 1, 1, 1, 6,
    "📕  FMT — COMPLETE TOPIC CHECKLIST",
    bg=C["fmt_dark"], bold=True, color=C["white"], size=14)
merge_apply(ws4, 2, 1, 2, 6,
    "Mark each topic as Done / In Progress / Pending. Focus on ★★★★★ topics first.",
    bg=C["fmt_mid"], bold=False, color=C["white"], size=9, italic=True)

hdrs4 = ["#", "Topic", "Sub-topics / Key Points", "★ Imp", "Status", "Revised?"]
for ci, h in enumerate(hdrs4, 1):
    apply(ws4, 3, ci, h, bg=C["grey_hdr"], bold=True, color=C["white"], size=9)
ws4.row_dimensions[3].height = 18

fmt_topics = [
    ("Inquest Types",          "Police (CrPC 174) vs Magistrate (CrPC 176) — when each called, differences",         "★★★★★"),
    ("Dying Declaration",      "IEA Section 32, no oath, magistrate preferred, all circumstances of transaction",     "★★★★"),
    ("Perjury",                "IPC 193, 7 yrs, false evidence under oath",                                          "★★★★"),
    ("Rule of 12",             "Rigor: starts 4h, complete 12h, passes 48h. Lividity fixed 12h",                     "★★★★★"),
    ("Rigor Mortis",           "ATP depletion, actin-myosin, Nysten's law, cadaveric spasm, heat stiffening",        "★★★★★"),
    ("Hypostasis / Lividity",  "Starts 2-4h, fixed 8-12h, colour (CO=cherry red, drowning=pink), MLI",              "★★★★"),
    ("Adipocere",              "Saponification, moist conditions, months to develop, MLI",                           "★★★"),
    ("Decomposition",          "Putrefaction, green iliac fossa first, marbling, stages",                             "★★★"),
    ("Mummification",          "Dry hot environment, desiccation, preserves features",                               "★★"),
    ("Autopsy — Viscera",      "Organs preserved, quantity, preservative = saturated NaCl (NOT formalin)",           "★★★★★"),
    ("Exhumation",             "Executive magistrate order, procedure, witnesses, PM done fresh",                     "★★★"),
    ("Abrasion Types & MLI",   "Scratch/graze/pressure. No bleeding. Direction of force. Site of impact",            "★★★★★"),
    ("Contusion / Bruise",     "Age estimation (0→red-black→green→yellow). Railway pattern bruise",                  "★★★★"),
    ("Incised vs Lacerated",   "Incised: sharp, clean edges, no bridging; Lacerated: blunt, bridging strands",       "★★★★"),
    ("Stab Wound",             "Depth > length, hilt mark, sharp weapon",                                            "★★★"),
    ("Chop Wound",             "Heavy sharp weapon, features of both incised + lacerated",                           "★★★"),
    ("Defense Injuries",       "Palms/forearms/back of hand, seen in homicidal assault victims",                     "★★★"),
    ("Grievous Hurt IPC 320",  "8 types: emasculation, loss of eye/ear, limb, fracture, disfiguration, dangerous",  "★★★★"),
    ("Skull Fractures",        "Linear, depressed, pond (children), contrecoup, ring (base)",                        "★★★★"),
    ("Coup & Contrecoup",      "Coup = at impact, contrecoup = opposite (more severe). Lucid interval = EDH",        "★★★"),
    ("Hanging",                "Judicial vs suicidal, ligature mark (oblique, incomplete), causes of death, PM",     "★★★★★"),
    ("Throttling/Strangulation","Ligature mark horizontal+complete vs manual (fingernail marks, hyoid fx)",          "★★★★"),
    ("Drowning PM findings",   "Washerwoman hands, frothy fluid, weed in hands, emphysema aquosum",                  "★★★★"),
    ("Diatom Test",            "Gold standard for ante-mortem drowning. Diatoms pass to bone marrow only ante-M",    "★★★★"),
    ("Entry vs Exit GSW",      "Entry: inverted, smaller, abrasion collar. Exit: everted, larger, no collar",        "★★★★★"),
    ("Abrasion Collar",        "Due to bullet spin. Present ONLY at entry. Absent at exit",                          "★★★★★"),
    ("Range of Firearm",       "Contact → close → near → distant. Features change progressively",                   "★★★★"),
    ("Burns Classification",   "Dupuytren's 4 degrees. AM vs PM burn (vital reactions, soot in airways, COHb>10%)", "★★★★"),
    ("Rape IPC 375/376",       "7 clauses of IPC 375. Examination: injuries, hymen, swabs, DNA. Samples to keep",   "★★★★★"),
    ("POCSO Act 2012",         "All sexual offences against <18 yrs. Types, punishment, mandatory reporting",        "★★★★★"),
    ("MTP Act 2021",           "Up to 20 wks (1 provider), 24 wks special categories, unmarried included",          "★★★★"),
    ("Signs of Live Birth",    "Cry, air in lungs (hydrostatic test), separate cord/placenta, meconium",             "★★★★"),
    ("Rule of Hasse",          "Fetal age: 1st 5 months = month² (cm). After 5 months = month × 5 (cm)",           "★★★★★"),
    ("Gustafson's Method",     "6 features: ASPCRT — Attrition, Secondary dentin, Periodontosis, Cementum, Root resorption, Transparency", "★★★★"),
    ("Fingerprint Types",      "Henry system: Arch, Tented arch, Radial loop, Ulnar loop (most common), Whorl, Composite", "★★★★"),
    ("Sexual Perversions",     "Pedophilia, voyeurism, exhibitionism, fetishism, sadism, masochism, bestiality",     "★★★"),
    ("McNaughten Rules",       "Insanity defence: didn't know nature of act OR didn't know it was wrong (IPC 84)",  "★★★★★★"),
    ("Hallucination",          "False perception without external stimulus. Auditory (schizophrenia), visual (organic), tactile (cocaine)", "★★★★"),
    ("Delusion Types",         "Persecution, grandeur, reference, nihilism, hypochondriacal",                        "★★★"),
    ("Professional Misconduct","Infamous conduct, false certificate, covering unqualified. NMC Act 2020",            "★★★"),
    ("Negligence",             "4 D's. Bolam test. Civil vs Criminal (IPC 304A). Jacob Mathew case",                "★★★★"),
    ("Informed Consent",       "Voluntary, competent, informative. Age 12/18 yrs. Elements",                        "★★★★"),
    ("Privileged Communication","Confidentiality + exceptions (court, notifiable disease, public interest)",         "★★★★"),
    ("Vicarious Liability",    "Employer responsible for employee's negligence. Hospital liable for doctor",          "★★★"),
    ("Classify Poisons",       "Corrosive, irritant, systemic, neurotic. Homicidal poison qualities",                "★★★★"),
    ("Gastric Lavage",         "Within 4-6 hrs. Contraindications: corrosive, unconscious, HC ingestion",            "★★★"),
    ("OP Poisoning",           "SLUDGE signs. Miosis, bradycardia. Treatment: Atropine + PAM (before aging)",        "★★★★★"),
    ("Arsenic Poisoning",      "Garlic odour, Reinsch/Marsh test, rice-water stools, Mees lines, rain-drop pigment", "★★★★"),
    ("Lead Poisoning",         "Burton's line, wrist/foot drop, basophilic stippling, lead colic, encephalopathy",  "★★★"),
    ("Dhatura Poisoning",      "Anticholinergic: Dry/Red/Blind/Mad/Hot. MOA: ACh blockade. Antidote: Physostigmine","★★★★"),
    ("Alcohol (Widmark)",      "BAC = A/(r×W). r=0.7M/0.6F. Legal limit 30mg/100mL. McEwan's sign",                "★★★★"),
    ("Plant Poisons",          "Abrus precatorius (abrin), Semicarpus (vesicant), Croton tiglium, Nux vomica (strychnine)", "★★★★"),
    ("Cocaine Bugs",           "Formication/Magnon's symptom — tactile hallucination (insects under skin)",          "★★★"),
    ("Snake Bite",             "Poisonous vs non-poisonous diff. Neurotoxic (cobra/krait) vs haemotoxic (viper). Treatment: antivenom", "★★★"),
    ("Narcoanalysis/Polygraph","Narcoanalysis: sodium pentothal, not admissible alone (Selvi vs Karnataka 2010)",    "★★"),
    ("Locard's Principle",     "'Every contact leaves a trace' — basis of forensic science",                         "★★"),
]

status_dv4 = DataValidation(type="list",
    formula1='"✅ Done,🔄 In Progress,⏳ Not Started,⭐ Need Review"', allow_blank=True)
ws4.add_data_validation(status_dv4)
revised_dv4 = DataValidation(type="list",
    formula1='"✅ Yes,❌ No,🔄 Once"', allow_blank=True)
ws4.add_data_validation(revised_dv4)

for idx, (topic, subtopics, stars) in enumerate(fmt_topics, 1):
    r = idx + 3
    ws4.row_dimensions[r].height = 32
    row_bg = C["fmt_light"] if idx % 2 == 0 else C["white"]
    apply(ws4, r, 1, idx,       bg=row_bg, bold=True,  size=9)
    apply(ws4, r, 2, topic,     bg=row_bg, bold=True,  size=9, halign="left", wrap=True)
    apply(ws4, r, 3, subtopics, bg=row_bg, bold=False, size=8, halign="left", wrap=True, italic=True)
    star_bg = C["gold"] if "★★★★★" in stars else (C["fmt_light"] if "★★★★" in stars else C["grey_light"])
    apply(ws4, r, 4, stars,     bg=star_bg, bold=True, size=9, color=C["fmt_dark"] if "★★★★★" in stars else C["black"])

    sc = ws4.cell(row=r, column=5, value="⏳ Not Started")
    sc.font = font(size=9); sc.alignment = align(); sc.fill = fill(C["grey_light"]); sc.border = border()
    status_dv4.add(sc)

    rc = ws4.cell(row=r, column=6, value="❌ No")
    rc.font = font(size=9); rc.alignment = align(); rc.fill = fill(C["grey_light"]); rc.border = border()
    revised_dv4.add(rc)

# ═══════════════════════════════════════════════════════════
# SHEET 5 — DAILY LOG
# ═══════════════════════════════════════════════════════════
ws5 = wb.create_sheet("Daily Study Log")
ws5.sheet_view.showGridLines = False
ws5.column_dimensions["A"].width = 12
ws5.column_dimensions["B"].width = 14
ws5.column_dimensions["C"].width = 30
ws5.column_dimensions["D"].width = 30
ws5.column_dimensions["E"].width = 12
ws5.column_dimensions["F"].width = 20
ws5.column_dimensions["G"].width = 12

merge_apply(ws5, 1, 1, 1, 7,
    "📝  DAILY STUDY LOG — July 14 to August 3, 2026",
    bg=C["grey_hdr"], bold=True, color=C["white"], size=14)
merge_apply(ws5, 2, 1, 2, 7,
    "Log each day's actual study. Track hours, mood, and next-day priority.",
    bg=C["grey_mid"], bold=False, color=C["white"], size=9, italic=True)

hdrs5 = ["Date", "Day", "What I Studied (PSM)", "What I Studied (FMT)", "Study Hrs", "Mood / Energy", "Tomorrow's Priority"]
for ci, h in enumerate(hdrs5, 1):
    apply(ws5, 3, ci, h, bg=C["grey_hdr"], bold=True, color=C["white"], size=9, wrap=True)
ws5.row_dimensions[3].height = 28

import datetime
start_date = datetime.date(2026, 7, 14)
days_list = ["Tue","Wed","Thu","Fri","Sat","Sun","Mon"] * 3

mood_dv = DataValidation(type="list",
    formula1='"😊 Great,😐 Okay,😴 Tired,😤 Stressed,💪 Focused"', allow_blank=True)
ws5.add_data_validation(mood_dv)

for i in range(21):
    d = start_date + datetime.timedelta(days=i)
    day_name = d.strftime("%a")
    date_str = d.strftime("%b %d")
    r = i + 4
    ws5.row_dimensions[r].height = 28
    bg = C["revision_l"] if day_name in ("Sun", "Mon") else (C["exam_light"] if d >= datetime.date(2026, 8, 1) else C["grey_light"])
    apply(ws5, r, 1, date_str, bg=bg, bold=True, size=9)
    apply(ws5, r, 2, day_name, bg=bg, bold=False, size=9)
    apply(ws5, r, 3, "",       bg=bg, bold=False, size=9, halign="left")
    apply(ws5, r, 4, "",       bg=bg, bold=False, size=9, halign="left")
    apply(ws5, r, 5, "",       bg=bg, bold=False, size=9)

    mc = ws5.cell(row=r, column=6, value="😊 Great")
    mc.font = font(size=9); mc.alignment = align(); mc.fill = fill(bg); mc.border = border()
    mood_dv.add(mc)

    apply(ws5, r, 7, "", bg=bg, bold=False, size=9, halign="left")

# freeze panes
for ws in [ws2, ws3, ws4, ws5]:
    ws.freeze_panes = ws.cell(row=4, column=1)
ws1.freeze_panes = ws1.cell(row=4, column=1)

wb.save(OUTPUT)
print(f"Excel file created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/mbbs-study && python generate_schedule.py 2>&1

Editing File

~/mbbs-study/generate_schedule.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/mbbs-study/generate_schedule.py'
Editing File

~/mbbs-study/generate_schedule.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/mbbs-study/generate_schedule.py'
Running Command

cd /home/daytona/workspace/mbbs-study && python generate_schedule.py 2>&1

Editing File

~/mbbs-study/generate_schedule.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/mbbs-study/generate_schedule.py'
Running Command

python /home/daytona/workspace/mbbs-study/generate_schedule.py 2>&1

Editing File

~/mbbs-study/generate_schedule.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/mbbs-study/generate_schedule.py'
Running Command

python /home/daytona/workspace/mbbs-study/generate_schedule.py 2>&1

Running Command

ls -lh /home/daytona/workspace/mbbs-study/MBBS_3rdProf_StudyPlan.xlsx

Your Excel file is ready — download it here:

MBBS 3rdProf StudyPlan

Spreadsheet · XLSX


The workbook has 5 fully formatted sheets:

Sheet 1 — Daily Timetable

Your complete day from 5:30 AM to 10:00 PM with colour-coded activity types:
  • 🔵 Blue = PSM study blocks
  • 🔴 Red = FMT study blocks
  • 🟢 Green = Gym
  • 🟠 Orange = Outing
  • 🟣 Purple = Evening revision/PYQs

Sheet 2 — 20-Day Study Plan

All 20 days (Jul 14 → Aug 2) in a table with:
  • Morning block (PSM topic for the day)
  • Afternoon block (FMT topic for the day)
  • Evening block (PYQ/revision task)
  • Status dropdown per day: ✅ Done / 🔄 In Progress / ⏳ Pending / ⭐ Needs Review
  • Revision days (Sundays + Mondays) highlighted in purple
  • Mock exam days + exam day highlighted in gold/red

Sheet 3 — PSM Topic Checklist

40 PSM topics with:
  • Sub-topics / key points for each
  • Importance rating (★ to ★★★★★) — ★★★★★ highlighted in gold
  • Status dropdown + "Revised?" dropdown per topic

Sheet 4 — FMT Topic Checklist

55 FMT topics with the same format — all topics from your uploaded PDFs included, with ★ importance ratings

Sheet 5 — Daily Study Log

A daily journal with date, what you studied in PSM + FMT, actual hours, mood tracker (😊/😐/😴/😤/💪), and tomorrow's priority field
This is a shared conversation. Sign in to Orris to start your own chat.