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.
| Time | Activity |
|---|---|
| 5:30 AM | Wake up, freshen up, light breakfast |
| 6:00 - 6:45 AM | Quick revision / flashcards (previous day's topics) |
| 7:00 - 9:00 AM | GYM |
| 9:00 - 9:30 AM | Shower + Breakfast |
| 9:30 AM - 1:00 PM | Study Block 1 - Subject A (3.5 hrs) |
| 1:00 - 2:00 PM | Lunch + Rest |
| 2:00 - 5:30 PM | Study Block 2 - Subject B (3.5 hrs) |
| 5:30 - 7:00 PM | Outing / Break (1.5 hrs) |
| 7:00 - 7:30 PM | Light snack + freshen up |
| 7:30 - 9:30 PM | Study Block 3 - Mixed revision / PYQs (2 hrs) |
| 9:30 - 10:00 PM | Wind down, plan next day |
| 10:00 PM | Sleep |
| Day | Morning Block (PSM) | Afternoon Block (FMT) | Evening Revision |
|---|---|---|---|
| Tue Jul 14 | Epidemiology basics | Thanatology (death changes) | PYQs on both |
| Wed Jul 15 | Epidemiology - study designs | Forensic pathology - injuries | Short notes |
| Thu Jul 16 | Biostatistics (formulae + sampling) | Asphyxial deaths | Stats PYQs |
| Fri Jul 17 | Biostatistics (tests of significance) | Sexual offences + POCSO | FMT PYQs |
| Sat Jul 18 | Communicable diseases (IHR, surveillance) | Medical jurisprudence | Mixed PYQs |
| Sun Jul 19 | National programs (EPI, malaria, TB) | Consent, negligence, MCI | Weekly test (self) |
| Mon Jul 20 | REVISION DAY - Week 1 PSM | REVISION DAY - Week 1 FMT | Weak area focus |
| Day | Morning Block (PSM) | Afternoon Block (FMT) | Evening Revision |
|---|---|---|---|
| Tue Jul 21 | Environment & occupational health | Toxicology - corrosive poisons | Short notes |
| Wed Jul 22 | MCH, RCH, immunization schedule | Toxicology - metallic poisons | Toxicology PYQs |
| Thu Jul 23 | Nutrition (PEM, deficiencies) | Toxicology - organic/misc poisons | Nutrition PYQs |
| Fri Jul 24 | Health planning (NHM, NRHM, plans) | Forensic serology + DNA | Admin PYQs |
| Sat Jul 25 | Demography (census, indicators) | Identification (age, sex, stature) | Demography PYQs |
| Sun Jul 26 | International health orgs + misc | IPC sections + wound ballistics | Mixed PYQs |
| Mon Jul 27 | REVISION DAY - Week 2 PSM | REVISION DAY - Week 2 FMT | Self-test |
| Day | Focus |
|---|---|
| Tue Jul 28 | Full PSM revision - Epidemiology + Biostatistics (high-yield) |
| Wed Jul 29 | Full FMT revision - Thanatology + Injuries + Asphyxia |
| Thu Jul 30 | PSM - Programs, nutrition, demography + Mock MCQs |
| Fri Jul 31 | FMT - Toxicology + Jurisprudence + IPC sections |
| Sat Aug 1 | Full-length mock paper: PSM + FMT (3 hr timed test) |
| Sun Aug 2 | Light revision only - only formulae, IPC sections, key stats. Rest by 9 PM. |
| Mon Aug 3 | EXAM DAY 🎯 |
Create a printable PDF summary of high-yield PSM & FMT topics
mkdir -p /home/daytona/workspace/mbbs-study && ls /home/daytona/workspace/
~/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}")
cd /home/daytona/workspace/mbbs-study && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/mbbs-study/HighYield_PSM_FMT.pdf
HighYield PSM FMT
PDF Document · PDF
These are the important topics list add these too
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
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
# 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)"
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
~/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) & 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}")
cd /home/daytona/workspace/mbbs-study && python generate_pdf_v2.py 2>&1
ls -lh /home/daytona/workspace/mbbs-study/HighYield_PSM_FMT_v2.pdf
HighYield PSM FMT v2
PDF Document · PDF
| Section | Newly Added |
|---|---|
| PSM | SDGs/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 |
| FMT | Inquest 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 |
| Toxicology | Aluminium phosphide, Abrus precatorius, Semicarpus anacardium, Croton tiglium, Nux vomica/Strychnine, Cardiac poisons (hippus, aconite, digitalis) |
Excel sheet of schedule and study plan
~/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}")
cd /home/daytona/workspace/mbbs-study && python generate_schedule.py 2>&1
~/mbbs-study/generate_schedule.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/mbbs-study/generate_schedule.py'
~/mbbs-study/generate_schedule.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/mbbs-study/generate_schedule.py'
cd /home/daytona/workspace/mbbs-study && python generate_schedule.py 2>&1
~/mbbs-study/generate_schedule.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/mbbs-study/generate_schedule.py'
python /home/daytona/workspace/mbbs-study/generate_schedule.py 2>&1
~/mbbs-study/generate_schedule.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/mbbs-study/generate_schedule.py'
python /home/daytona/workspace/mbbs-study/generate_schedule.py 2>&1
ls -lh /home/daytona/workspace/mbbs-study/MBBS_3rdProf_StudyPlan.xlsx
MBBS 3rdProf StudyPlan
Spreadsheet · XLSX