Fmt topics for neet pg
| Topic | Why Important |
|---|---|
| Rigor mortis timing | Frequently asked with exact timings |
| Hanging vs strangulation | Classic comparison question |
| Arsenic/lead/mercury chronic signs | Recurring pattern |
| OP poisoning management | Clinical + FMT overlap |
| Sections of IPC | Direct fact-based questions |
| Wound ballistics | Often tricky options |
| Diatom test | Specific for drowning |
| Adipocere vs mummification | Conditions, differences |
Create a summary PDF of FMT topics for quick revision
mkdir -p /home/daytona/workspace/fmt-revision && ls /home/daytona/workspace/fmt-revision/
~/fmt-revision/generate_fmt_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 mm, 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 FrameBreak
OUTPUT = "/home/daytona/workspace/fmt-revision/FMT_NEET_PG_Quick_Revision.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=15*mm,
rightMargin=15*mm,
topMargin=18*mm,
bottomMargin=18*mm,
title="FMT Quick Revision - NEET PG",
author="Orris AI"
)
W, H = A4
# ββ colour palette ββ
C_DARK = colors.HexColor("#1a237e") # deep indigo
C_MED = colors.HexColor("#283593")
C_ACCENT = colors.HexColor("#e53935") # red accent
C_GOLD = colors.HexColor("#f9a825")
C_GREEN = colors.HexColor("#2e7d32")
C_TEAL = colors.HexColor("#00695c")
C_BG = colors.HexColor("#e8eaf6") # light indigo bg
C_LIGHT = colors.HexColor("#f5f5f5")
C_WHITE = colors.white
C_BLACK = colors.HexColor("#212121")
C_GRAY = colors.HexColor("#616161")
C_WARN = colors.HexColor("#fff3e0")
C_WARN_B = colors.HexColor("#ef6c00")
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
# --- custom styles ---
TITLE_S = S("Title", fontName="Helvetica-Bold", fontSize=22,
textColor=C_WHITE, alignment=TA_CENTER, spaceAfter=4,
leading=28)
SUB_S = S("Sub", fontName="Helvetica", fontSize=11,
textColor=C_BG, alignment=TA_CENTER, spaceAfter=2)
H1 = S("H1", fontName="Helvetica-Bold", fontSize=13,
textColor=C_WHITE, alignment=TA_LEFT, spaceAfter=2,
spaceBefore=6, leading=17, leftIndent=4)
H2 = S("H2", fontName="Helvetica-Bold", fontSize=11,
textColor=C_MED, alignment=TA_LEFT, spaceBefore=6,
spaceAfter=2, leading=14)
H3 = S("H3", fontName="Helvetica-Bold", fontSize=10,
textColor=C_TEAL, spaceBefore=4, spaceAfter=1, leading=13)
BODY = S("Body", fontName="Helvetica", fontSize=9,
textColor=C_BLACK, leading=13, spaceAfter=1)
BULLET = S("Bullet", fontName="Helvetica", fontSize=9,
textColor=C_BLACK, leading=13, leftIndent=12,
firstLineIndent=-8, spaceAfter=1)
BOLD_B = S("BoldB", fontName="Helvetica-Bold", fontSize=9,
textColor=C_BLACK, leading=13, leftIndent=12,
firstLineIndent=-8, spaceAfter=1)
SMALL = S("Small", fontName="Helvetica", fontSize=8,
textColor=C_GRAY, leading=11)
WARN_S = S("Warn", fontName="Helvetica-Bold", fontSize=9,
textColor=C_WARN_B, leading=13, spaceAfter=1)
RED_B = S("RedB", fontName="Helvetica-Bold", fontSize=9,
textColor=C_ACCENT, leading=13, spaceAfter=1)
def bullet(txt, bold=False):
st = BOLD_B if bold else BULLET
return Paragraph(f"\u2022 {txt}", st)
def sub_bullet(txt):
return Paragraph(f" \u2013 {txt}",
S("SB", fontName="Helvetica", fontSize=8.5,
textColor=C_GRAY, leading=12, leftIndent=20,
firstLineIndent=-8, spaceAfter=1))
def section_header(title, color=C_DARK):
data = [[Paragraph(title, H1)]]
t = Table(data, colWidths=[W - 30*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROUNDEDCORNERS", [4]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
return t
def key_table(headers, rows, col_widths=None):
data = [headers] + rows
if col_widths is None:
n = len(headers)
col_widths = [(W - 30*mm) / n] * n
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), C_DARK),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8.5),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [C_WHITE, C_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#bdbdbd")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
t.setStyle(TableStyle(style))
return t
def warn_box(text):
data = [[Paragraph(f"β {text}", WARN_S)]]
t = Table(data, colWidths=[W - 30*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_WARN),
("LEFTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("BOX", (0,0), (-1,-1), 1, C_WARN_B),
("ROUNDEDCORNERS", [3]),
]))
return t
def highlight_box(text, bg=C_BG, border=C_DARK):
data = [[Paragraph(text, S("HB", fontName="Helvetica-Bold", fontSize=9,
textColor=border, leading=13))]]
t = Table(data, colWidths=[W - 30*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 1.2, border),
("ROUNDEDCORNERS", [3]),
]))
return t
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Build story
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story = []
# ββ COVER PAGE ββ
cover_data = [[Paragraph("FORENSIC MEDICINE &\nTOXICOLOGY", TITLE_S)],
[Paragraph("NEET PG β Quick Revision Notes", SUB_S)],
[Paragraph("Compiled from standard FMT texts | NEET PG Pattern", SMALL)]]
cover = Table(cover_data, colWidths=[W - 30*mm])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_DARK),
("TOPPADDING", (0,0), (-1,-1), 16),
("BOTTOMPADDING", (0,0), (-1,-1), 16),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
("ROUNDEDCORNERS", [6]),
]))
story.append(cover)
story.append(Spacer(1, 8*mm))
story.append(highlight_box("π High-yield topics marked with β
| Mnemonics in [brackets] | Classic exam traps underlined"))
story.append(Spacer(1, 5*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 1: DEATH & PM CHANGES
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("1. DEATH & POST-MORTEM CHANGES β
"))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Types of Death", H2))
story.append(bullet("<b>Somatic / Clinical death</b>: cessation of heartbeat, respiration, CNS activity"))
story.append(bullet("<b>Molecular / Cellular death</b>: irreversible cell death; neurons β 4-6 min"))
story.append(bullet("<b>Brain death</b>: irreversible cessation of all brain function including brainstem"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Post-mortem Changes β Timeline", H2))
pm_table = key_table(
[Paragraph("Change", H3), Paragraph("Onset", H3), Paragraph("Duration / Max", H3), Paragraph("Key Facts", H3)],
[
["Cooling (Algor mortis)", "Immediate", "~1Β°C/hr", "Rule of thumb: body temp - 36.9Β°C = hrs since death"],
["Livor mortis (hypostasis)", "30 minβ2 hrs", "Fixed at 6β12 hrs", "Cherry-red β CO/CN poisoning; absent in severe anaemia"],
["Rigor mortis", "2β6 hrs", "Max 12 hrs; passes 24β48 hrs", "Nysten's rule: jaw β neck β trunk β limbs (descending)"],
["Decomposition", "24β48 hrs", "Greenish discolouration first", "Green in RIF first (cecum β most bacteria)"],
["Putrefaction", "2β3 days", "Ongoing", "H2S causes greenish/black discolouration"],
],
col_widths=[42*mm, 30*mm, 42*mm, 56*mm]
)
story.append(pm_table)
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Special Post-mortem Changes", H2))
items = [
("<b>Adipocere (saponification)</b>: conversion of body fat β soap-like substance. Requires moisture + warmth. Preserves body for years.",),
("<b>Mummification</b>: dehydration of body in hot dry environment. Preserves body. More common in deserts.",),
("<b>Maceration</b>: in stillborn / retained dead fetus; skin slippage, red discolouration of fluid.",),
("<b>Cadaveric spasm</b>: instantaneous rigor at moment of death; seen in violent deaths; legal importance (weapon found in hand).",),
]
for (t,) in items:
story.append(bullet(t))
story.append(Spacer(1, 2*mm))
story.append(warn_box("Rigor mortis EXAM TRAP: First appears in jaw (masseter), passes off in same order. Cadaveric spasm β rigor mortis β no relaxation phase."))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 2: IDENTIFICATION
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("2. IDENTIFICATION", C_TEAL))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Age Estimation", H2))
story.append(bullet("<b>Gustafson's method</b> (teeth): 6 criteria β Attrition, Secondary dentin, Cementum apposition, Root resorption, Periodontosis, Root transparency (mnemonic: <b>AS CRRP</b>)"))
story.append(bullet("<b>X-ray (bone age)</b>: epiphyseal fusion β medial clavicle fuses last (25β31 yrs); iliac crest (16β23 yrs)"))
story.append(bullet("<b>Ossification centres</b>: wrist centres β 1 per year from age 1 to 8"))
story.append(bullet("<b>Union of skull sutures</b>: coronal/lambdoid β 30β40 yrs; sagittal last"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Stature Estimation", H2))
story.append(bullet("Femur β most accurate bone for height estimation"))
story.append(bullet("Pearson's formula used for skeletal remains"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Sex Determination from Skeleton", H2))
sex_table = key_table(
["Feature", "Male", "Female"],
[
["Pelvis", "Narrow, tall, heart-shaped inlet", "Wide, shallow, oval inlet (gynaecoid)"],
["Skull", "Heavy, prominent ridges, square orbit", "Smooth, rounded, oval orbit"],
["Subpubic angle", "< 90Β°", "> 90Β°"],
["Sciatic notch", "Narrow (<68Β°)", "Wide (>68Β°)"],
["Most reliable bone", "Pelvis (sex)", "Pelvis (sex)"],
],
col_widths=[45*mm, 60*mm, 65*mm]
)
story.append(sex_table)
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 3: WOUNDS & INJURIES
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("3. WOUNDS & INJURIES β
", C_ACCENT))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Classification of Wounds", H2))
wounds_table = key_table(
["Type", "Characteristics", "Key Exam Point"],
[
["Abrasion", "Epidermis only; direction shown by tag", "Brush burn / graze"],
["Contusion", "Bleeding into tissues; no breach of skin", "Tramline bruise β rod injury"],
["Laceration", "Tear; irregular edges; hair bridges inside", "NOT an incised wound"],
["Incised wound", "Sharp object; clean edges; no hair bridges", "Longer than deep; defence wounds"],
["Stab wound", "Pointed object; deeper than long", "Hilt mark = full penetration"],
["Chop wound", "Heavy sharp object; bone cut", "e.g. Axe, daoo"],
],
col_widths=[35*mm, 75*mm, 60*mm]
)
story.append(wounds_table)
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Firearm Wounds", H2))
story.append(bullet("<b>Contact range</b>: blackening, charring, cruciate laceration, 'X-shaped' wound, muzzle abrasion"))
story.append(bullet("<b>Close range (<15 cm)</b>: blackening + tattooing (stippling) + singeing"))
story.append(bullet("<b>Near range (15β60 cm)</b>: tattooing only (no blackening)"))
story.append(bullet("<b>Distant range (>60 cm)</b>: entry = small, circular, punched-out, inverted; no burning/tattooing"))
story.append(bullet("<b>Exit wound</b>: larger, irregular, everted, no abrasion collar"))
story.append(Spacer(1, 2*mm))
story.append(warn_box("Entry vs Exit: Entry = smaller + abrasion collar (inverted edges). Exit = larger + irregular + no collar. Bevelling outwards on skull β exit."))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 4: ASPHYXIA
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("4. ASPHYXIA β
", C_MED))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Types & Key Differences", H2))
asphyx_table = key_table(
["Type", "Key Feature", "PM Findings", "Exam Pointer"],
[
["Hanging", "Ligature above thyroid; oblique, incomplete mark", "Fracture of C2-3 (judicial); tongue protruded", "Suicidal most common; mark incomplete at knot"],
["Strangulation (ligature)", "Mark below thyroid; horizontal, complete", "Mark complete all around", "Homicidal; mark complete"],
["Throttling (manual)", "Finger-nail marks on neck", "Fracture of hyoid β
", "Always homicidal"],
["Mugging (arm-lock)", "Carotid compression", "No external marks", "Homicidal"],
["Suffocation/Smothering", "Nose+mouth obstruction", "Cyanosis, petechia", "Pillow smothering β no marks"],
["Drowning (wet)", "Water in lungs", "Paltauf haemorrhages, diatom test +ve", "Diatom test from bone marrow"],
["Dry drowning", "Laryngospasm", "Asphyxial signs only, dry lungs", "~10β15% of drowning deaths"],
],
col_widths=[35*mm, 50*mm, 50*mm, 35*mm]
)
story.append(asphyx_table)
story.append(Spacer(1, 2*mm))
story.append(highlight_box("β
Hyoid bone fracture = pathognomonic of manual strangulation (throttling). Commonest bone fractured in neck compression."))
story.append(Spacer(1, 2*mm))
story.append(bullet("<b>PM findings of asphyxia (general)</b>: cyanosis, congestion, petechial haemorrhages (Tardieu spots on lungs/conjunctiva), fluidity of blood"))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 5: SEXUAL OFFENCES
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("5. SEXUAL OFFENCES & OBSTETRIC MLI", C_TEAL))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Rape β IPC Sections", H2))
story.append(bullet("<b>IPC Sec 375</b>: Definition of rape (amended 2013 β POCSO) β includes all forms of non-consensual penetration"))
story.append(bullet("<b>IPC Sec 376</b>: Punishment for rape β min 7 years, up to life"))
story.append(bullet("<b>IPC Sec 377</b>: Unnatural offences"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("MLI Examination of Rape Victim", H2))
story.append(bullet("Examine with consent + female attendant; document all injuries"))
story.append(bullet("<b>Hymen</b>: not proof of virginity; tears most common at 5 & 7 o'clock positions posteriorly"))
story.append(bullet("<b>Vaginal swabs</b>: motile spermatozoa up to 6 hrs; non-motile up to 72 hrs"))
story.append(bullet("Seminal acid phosphatase, DNA fingerprinting"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("MTP Act 1971 (Amended 2021)", H2))
story.append(bullet("Up to <b>20 weeks</b>: 1 doctor's opinion"))
story.append(bullet("20β24 weeks: 2 doctors' opinion (specific categories β rape, disabled, etc.)"))
story.append(bullet(">24 weeks: Medical Board only (fetal abnormality)"))
story.append(bullet("Unmarried women can also seek MTP (2021 amendment)"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("PCPNDT Act 1994", H2))
story.append(bullet("Prohibits sex determination of fetus"))
story.append(bullet("Punishable: 3 years imprisonment + βΉ10,000 fine (first offence); 5 years + βΉ50,000 (subsequent)"))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 6: MEDICAL JURISPRUDENCE
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("6. MEDICAL JURISPRUDENCE β
", C_DARK))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Important IPC Sections β Quick Reference", H2))
ipc_table = key_table(
["IPC Section", "Offence"],
[
["299 / 300", "Culpable homicide / Murder"],
["302", "Punishment for murder (death / life imprisonment)"],
["304 A", "Death by negligence (not amounting to murder) β medical negligence"],
["312", "Causing miscarriage (voluntarily)"],
["313", "Causing miscarriage without consent"],
["316", "Causing death of quick unborn child"],
["375", "Rape (definition)"],
["376", "Punishment for rape"],
["377", "Unnatural offences"],
["354", "Outraging modesty of woman"],
["509", "Word/gesture to insult modesty"],
],
col_widths=[35*mm, 135*mm]
)
story.append(ipc_table)
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Medical Negligence", H2))
story.append(bullet("<b>Bolam test</b> (1957): standard of care = what a reasonable body of medical opinion accepts as proper β still gold standard in India"))
story.append(bullet("<b>Bolitho modification</b>: the body of opinion must withstand logical analysis"))
story.append(bullet("<b>3 Ds of negligence</b>: Duty, Dereliction of duty, Damage resulting from dereliction"))
story.append(bullet("<b>Consumer Protection Act 2019</b>: Patients are consumers; doctors providing service (except free/charitable services) are covered"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Dying Declaration", H2))
story.append(bullet("Statement by person who is dying / believes death is imminent"))
story.append(bullet("Admissible under <b>Indian Evidence Act Sec 32(1)</b>"))
story.append(bullet("Not necessary to be recorded by magistrate β any person including doctor"))
story.append(bullet("Does not require corroboration but court may seek it"))
story.append(bullet("Patient must be in fit mental state (doctor certifies fitness)"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Inquest Types", H2))
inq_table = key_table(
["Type", "Authority", "When Conducted"],
[
["Police inquest", "Police (Sec 174 CrPC)", "Any suspicious / unnatural death"],
["Magistrate inquest", "Executive Magistrate", "Death in police custody, jail, mental hospital, plantation"],
["Coroner's inquest", "Coroner (Mumbai, Calcutta)", "Similar to magistrate inquest"],
["Medical examiner system", "Forensic pathologist", "USA system; best medicolegal system"],
],
col_widths=[40*mm, 60*mm, 70*mm]
)
story.append(inq_table)
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# PAGE BREAK β TOXICOLOGY
# ββββββββββββββββββββββββββββββββββββββ
story.append(PageBreak())
tox_cover = [[Paragraph("TOXICOLOGY", TITLE_S)],
[Paragraph("Poisons β Classification, Features, Antidotes", SUB_S)]]
tc = Table(tox_cover, colWidths=[W - 30*mm])
tc.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_ACCENT),
("TOPPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING", (0,0), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 20),
("ROUNDEDCORNERS", [6]),
]))
story.append(tc)
story.append(Spacer(1, 6*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 7: CORROSIVE POISONS
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("7. CORROSIVE POISONS", C_ACCENT))
story.append(Spacer(1, 3*mm))
corr_table = key_table(
["Poison", "Stain / Colour", "Key Features", "Antidote"],
[
["Sulphuric acid (HβSOβ)", "Black/brown eschar", "Charring; most common acid burn; tanners'", "Dilute alkali (milk, chalk)"],
["Nitric acid (HNOβ)", "Yellow (xanthoprotein rxn)", "Fuming; yellow staining of skin", "Dilute alkali"],
["Hydrochloric acid", "Grey eschar", "Fumes HC; bleaching powder odour", "Dilute alkali"],
["Oxalic acid", "White eschar", "Hypocalcaemia, renal tubular damage", "Calcium gluconate IV"],
["Carbolic acid (Phenol)", "White β brown eschar", "Distinctive phenol smell; glassy look", "Sodium sulphate; olive oil"],
["NaOH / KOH (Lye)", "Soapy, slippery", "Saponification of tissues; deep burns", "Dilute acid / vinegar"],
],
col_widths=[38*mm, 32*mm, 70*mm, 30*mm]
)
story.append(corr_table)
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 8: IRRITANT METALLIC POISONS
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("8. IRRITANT METALLIC POISONS β
", C_WARN_B))
story.append(Spacer(1, 3*mm))
metal_table = key_table(
["Metal", "Classic Sign / Disease", "Diagnosis", "Antidote"],
[
["Arsenic (As)", "Mee's lines (nails), Rain-drop pigmentation, Aldrich-Mees lines, Peripheral neuropathy", "Marsh test, Reinsch test, Hair analysis", "BAL (Dimercaprol), DMSA"],
["Lead (Pb)", "Burton's line (blue), Wrist/foot drop, Lead colic, Basophilic stippling, Encephalopathy", "Blood lead level, X-ray (lead lines in bone)", "EDTA (CaNaβEDTA), BAL, Succimer"],
["Mercury (Hg)", "Minamata disease (methylmercury), Pink disease (acrodynia) in children, Hatters' shakes", "Urine mercury", "BAL, DMSA"],
["Phosphorus (P)", "Phossy jaw (necrosis of mandible), Luminescent vomitus ('smoking stool')", "Garlic odour; glows in dark", "Copper sulphate wash; no fats"],
["Copper (Cu)", "Blue-green vomitus, haemolysis", "Wilson's disease (chronic)", "BAL; D-penicillamine"],
["Thallium (Tl)", "Alopecia (hair loss) β
, peripheral neuropathy", "Urine thallium", "Prussian blue (Berlin blue)"],
],
col_widths=[28*mm, 65*mm, 42*mm, 35*mm]
)
story.append(metal_table)
story.append(Spacer(1, 2*mm))
story.append(warn_box("Arsenic EXAM: Marsh test = arsine gas; Reinsch test = silvery metallic deposit on copper strip. Chronic arsenic β Mee's lines on nails (1mm = 1 month)."))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 9: NEUROTROPIC POISONS
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("9. NEUROTROPIC / CNS POISONS β
", C_TEAL))
story.append(Spacer(1, 3*mm))
neuro_table = key_table(
["Poison", "Source", "Mechanism", "Features", "Antidote"],
[
["Strychnine", "Nux vomica", "Glycine antagonist (spinal cord)", "Risus sardonicus, opisthotonus, convulsions triggered by stimuli, NO loss of consciousness", "Diazepam; avoid stimuli"],
["Dhatura (Atropine)", "Datura stramonium", "Anticholinergic (muscarinic block)", "Dry as bone, Red as beet, Blind as bat, Mad as hatter, Hot as hare β [5 B's]", "Physostigmine; supportive"],
["Cocaine", "Coca leaves", "NA reuptake inhibitor + local anaesthetic", "Euphoria β paranoia, mydriasis, Maddening of Maradona", "Benzodiazepine; supportive"],
["Cannabis", "Cannabis sativa", "CB1/CB2 agonist", "Bhang/Ganja/Hashish; injected eyes (conjunctival congestion), munchies", "Supportive; BZD"],
["Aconite", "Aconitum napellus", "Na channel activator", "'King of poisons'; tingling/numbness, cardiac arrhythmia", "Atropine; lignocaine"],
["Opium / Morphine", "Papaver somniferum", "ΞΌ-opioid agonist", "Pin-point pupils β
, respiratory depression, coma β classic triad", "Naloxone (Narcan) IV"],
],
col_widths=[28*mm, 28*mm, 38*mm, 52*mm, 24*mm]
)
story.append(neuro_table)
story.append(Spacer(1, 2*mm))
story.append(highlight_box("β
Strychnine vs Tetanus: Both β opisthotonus + rigidity. Difference β Strychnine: no trismus initially, muscles relax between spasms, NO fever. Tetanus: trismus first, sustained rigidity, fever."))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 10: OP POISONING
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("10. ORGANOPHOSPHORUS POISONING β
β
", C_GREEN))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Mechanism", H2))
story.append(bullet("Inhibits acetylcholinesterase β accumulation of acetylcholine at synapses"))
story.append(bullet("Examples: Parathion, Malathion, Chlorpyrifos, Sarin (nerve agent)"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Clinical Features β SLUDGE / DUMBELS Mnemonics", H2))
mnemo_data = [
[Paragraph("<b>SLUDGE</b>", H3), Paragraph("<b>DUMBELS (more complete)</b>", H3)],
[
Paragraph("S β Salivation\nL β Lacrimation\nU β Urination\nD β Defecation\nG β GI cramps\nE β Emesis",
S("MN", fontName="Helvetica", fontSize=9, leading=14, textColor=C_BLACK)),
Paragraph("D β Defecation/Diarrhoea\nU β Urination\nM β Miosis β
\nB β Bradycardia / Bronchospasm / Bronchorrhoea\nE β Emesis\nL β Lacrimation\nS β Salivation / Secretions / Seizures",
S("MN", fontName="Helvetica", fontSize=9, leading=14, textColor=C_BLACK)),
]
]
mt = Table(mnemo_data, colWidths=[(W - 30*mm)/2, (W - 30*mm)/2])
mt.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_GREEN),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("BACKGROUND", (0,1), (-1,1), colors.HexColor("#e8f5e9")),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#a5d6a7")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(mt)
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Nicotinic (NMJ) Effects", H2))
story.append(bullet("Muscle fasciculations β weakness β paralysis (intermediate syndrome Day 2β4)"))
story.append(bullet("Tachycardia, hypertension (early nicotinic overstimulation)"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Treatment", H2))
story.append(bullet("<b>Atropine</b>: reverses muscarinic effects; titrate till secretions dry up (NOT pupil dilation); very high doses required", bold=True))
story.append(bullet("<b>Pralidoxime (PAM / 2-PAM)</b>: regenerates cholinesterase if given within 24β48 hrs (before 'ageing')", bold=True))
story.append(bullet("Benzodiazepines for seizures; supportive care"))
story.append(Spacer(1, 2*mm))
story.append(warn_box("Ageing: OP-AChE complex becomes irreversible after ~24-48 hrs β PAM ineffective after this. Atropine has NO time limit."))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 11: ALCOHOL
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("11. ALCOHOL POISONING β
", C_DARK))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("Ethanol Blood Levels & Effects", H2))
alc_table = key_table(
["Blood Alcohol (mg%)", "Effect"],
[
["< 30 mg%", "Subclinical; reaction time prolonged"],
["30β50 mg%", "Euphoria, talkativeness"],
["50β100 mg%", "Impaired coordination, judgment"],
["100β150 mg%", "Ataxia, slurred speech"],
["150β250 mg%", "Confusion, diplopia"],
["250β400 mg%", "Stupor, incontinence"],
["> 400 mg% (lethal)", "Coma, respiratory failure, death"],
["Driving limit (India)", "30 mg% (blood) = 150 mg/L (urine)"],
],
col_widths=[55*mm, 115*mm]
)
story.append(alc_table)
story.append(Spacer(1, 2*mm))
story.append(Paragraph("Methanol (CHβOH) Poisoning", H2))
story.append(bullet("Metabolised by alcohol dehydrogenase to β <b>Formic acid + Formaldehyde</b>"))
story.append(bullet("Blindness: optic nerve damage by formic acid β
"))
story.append(bullet("Metabolic acidosis with high anion gap; snowy-field vision"))
story.append(bullet("<b>Antidote</b>: Ethanol (competitive inhibitor of ADH) OR Fomepizole (4-MP) β drug of choice; Folic acid; Haemodialysis", bold=True))
story.append(Spacer(1, 2*mm))
story.append(highlight_box("Latent period in methanol: 12β24 hrs (during metabolism to toxic metabolites). Patient initially appears fine, then deteriorates β classic exam feature."))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 12: ASPHYXIANT POISONS
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("12. ASPHYXIANT POISONS β
", C_ACCENT))
story.append(Spacer(1, 3*mm))
asphy_table = key_table(
["Poison", "Source", "Mechanism", "Key PM Finding", "Antidote"],
[
["Carbon monoxide (CO)", "Incomplete combustion, car exhaust", "Binds Hb (240Γ > Oβ); shifts ODC left", "Cherry-red skin & organs β
; COHb levels", "100% Oβ; Hyperbaric Oβ"],
["Cyanide (HCN)", "Bitter almonds, industrial", "Cytochrome oxidase inhibition (histotoxic hypoxia)", "Bitter almond smell; cherry-red blood (venous)", "Amyl nitrite β Na nitrite β Na thiosulphate; Hydroxocobalamin"],
["HβS (Hydrogen sulphide)", "Sewers, rotten eggs", "Cytochrome oxidase inhibition similar to CN", "Rotten egg smell; greenish discolouration", "Supportive; Oβ; nitrites"],
],
col_widths=[30*mm, 35*mm, 45*mm, 45*mm, 15*mm]
)
story.append(asphy_table)
story.append(Spacer(1, 2*mm))
story.append(warn_box("CO poisoning: COHb >10% = symptomatic. COHb >50% = usually fatal. Cherry-red lividity on autopsy. Standard pulse oximetry CANNOT detect CO poisoning (reads falsely normal)."))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 13: SNAKE VENOM
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("13. SNAKE VENOM β
", C_TEAL))
story.append(Spacer(1, 3*mm))
snake_table = key_table(
["Snake", "Venom Type", "Mechanism", "Features", "Treatment"],
[
["Cobra (Naja naja)", "Neurotoxin (post-synaptic)", "Blocks nAChR", "Ptosis, diplopia, bulbar palsy, respiratory paralysis; local β mild", "Polyvalent antivenom"],
["Krait (Bungarus)", "Neurotoxin (pre-synaptic)", "Blocks ACh release", "Severe paralysis; NO local signs; nocturnal bites", "Polyvalent antivenom (less responsive)"],
["Russell's viper", "Haemotoxin", "PLAβ, procoagulants β DIC + local necrosis", "Bleeding, haematuria, renal failure (most common cause of ARF by snakebite)", "Polyvalent antivenom; FFP"],
["Saw-scaled viper", "Haemotoxin + cytotoxin", "Coagulopathy, cytotoxic", "Haemorrhage, necrosis", "Antivenom"],
["Sea snake", "Myotoxin", "Rhabdomyolysis", "Myalgias, dark urine, renal failure", "Antivenom; supportive"],
],
col_widths=[28*mm, 30*mm, 38*mm, 45*mm, 29*mm]
)
story.append(snake_table)
story.append(Spacer(1, 2*mm))
story.append(bullet("20-min whole blood clotting test (20WBCT): used in field β if blood doesn't clot in 20 min β coagulopathy (viper envenomation)"))
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 14: HIGH-YIELD SUMMARY TABLE
# ββββββββββββββββββββββββββββββββββββββ
story.append(PageBreak())
story.append(section_header("15. HIGH-YIELD FACTS β EXAM RAPID FIRE β
β
β
", C_DARK))
story.append(Spacer(1, 3*mm))
rapid = key_table(
["Topic", "High-Yield Fact"],
[
["Rigor mortis", "Starts: 2β6 hrs; Complete: 12 hrs; Passes: 24β48 hrs; Nysten's rule (jaw first)"],
["Cadaveric spasm", "Instantaneous rigor at death; no relaxation phase; NO primary flaccidity"],
["Adipocere", "Warm + moist conditions; saponification; preserves body; female > male"],
["Mummification", "Hot + dry; dehydration; preserves body; found in deserts/egypt"],
["Tardieu spots", "Petechial haemorrhages in asphyxial deaths; subpleural in lungs"],
["Paltauf haemorrhages", "Large haemorrhages in lungs in drowning (wet drowning)"],
["Hanging β judicial", "Fracture C2-C3 (axis/atlas); cause of death = fracture-dislocation"],
["Throttling β hyoid bone", "Hyoid bone fracture = manual strangulation (>40 yrs age)"],
["Cherry-red colour", "CO poisoning / CN poisoning / refrigerated body"],
["Miosis (pin-point pupils)", "Opiates, organophosphorus, pontine haemorrhage"],
["Mydriasis (dilated pupils)", "Atropine/dhatura, cocaine, amphetamines, death"],
["Risus sardonicus", "Strychnine / tetanus"],
["Mee's lines on nails", "Arsenic poisoning (1 mm per month of exposure)"],
["Burton's line (gums)", "Lead poisoning (blue-black line at gum margin)"],
["Phossy jaw", "Phosphorus poisoning (factory workers)"],
["Minamata disease", "Methylmercury (organic mercury) β Japan"],
["Pink disease (acrodynia)", "Inorganic mercury in children; pink extremities, photophobia"],
["Marsh test / Reinsch test", "Arsenic detection"],
["20WBCT", "Russell's viper diagnosis β coagulopathy test"],
["Diatom test", "Drowning; most reliable from bone marrow / liver"],
["Bolam test", "Standard of medical negligence (1957)"],
["Sec 304A IPC", "Negligence causing death β most common section used vs doctors"],
["MTP Act limit 2021", "Up to 20 wks (1 doctor); 20β24 wks (2 doctors); >24 wks (Medical Board)"],
["Driving alcohol limit India", "30 mg% blood alcohol"],
["Thallium poisoning", "Alopecia (hair loss) β hallmark; Prussian blue antidote"],
["Prussian blue antidote", "Thallium + Caesium poisoning"],
["Fomepizole (4-MP)", "Drug of choice for methanol + ethylene glycol poisoning"],
["Naloxone (Narcan)", "Opioid antidote; short-acting β repeat doses needed"],
["Atropine + PAM", "OP poisoning treatment; PAM works within 24-48 hrs only"],
["Hydroxocobalamin", "Preferred antidote for cyanide (especially in smoke inhalation)"],
["Gustafson's method", "Age estimation from teeth β 6 criteria"],
["Femur", "Most accurate bone for height estimation"],
["Subpubic angle", "Male <90Β°; Female >90Β°; most reliable sex indicator in pelvis"],
["Sciatic notch", "Narrow in male (<68Β°); wide in female (>68Β°)"],
],
col_widths=[52*mm, 118*mm]
)
story.append(rapid)
story.append(Spacer(1, 4*mm))
# ββββββββββββββββββββββββββββββββββββββ
# SECTION 15: ANTIDOTES AT A GLANCE
# ββββββββββββββββββββββββββββββββββββββ
story.append(section_header("16. ANTIDOTES AT A GLANCE β
β
", C_GREEN))
story.append(Spacer(1, 3*mm))
anti_table = key_table(
["Poison", "Antidote"],
[
["Organophosphorus", "Atropine + Pralidoxime (2-PAM)"],
["Opioids (morphine, heroin)", "Naloxone (Narcan)"],
["Carbon monoxide", "100% Oβ; Hyperbaric Oβ"],
["Cyanide (HCN)", "Amyl nitrite β Na nitrite β Na thiosulphate; OR Hydroxocobalamin"],
["Arsenic", "BAL (Dimercaprol); DMSA (succimer)"],
["Lead", "CaNaβEDTA (IV); BAL + EDTA (severe); Succimer (oral)"],
["Mercury", "BAL; DMSA"],
["Iron", "Desferrioxamine (deferoxamine)"],
["Copper / D-penicillamine", "D-penicillamine; Trientine"],
["Thallium", "Prussian blue (Berlin blue); Activated charcoal"],
["Paracetamol", "N-acetylcysteine (NAC)"],
["Methanol / Ethylene glycol", "Fomepizole (4-MP); Ethanol; Haemodialysis"],
["Atropine / Dhatura", "Physostigmine; Neostigmine"],
["Benzodiazepines", "Flumazenil"],
["Digoxin", "Digoxin-specific antibody Fab fragments"],
["Heparin", "Protamine sulphate"],
["Warfarin", "Vitamin K; Fresh Frozen Plasma (FFP)"],
["Beta-blockers", "Glucagon; High-dose insulin"],
["Calcium channel blockers", "Calcium gluconate; High-dose insulin"],
["Organochlorines (DDT)", "Cholestyramine; Phenobarbitone (enhances metabolism)"],
],
col_widths=[80*mm, 90*mm]
)
story.append(anti_table)
story.append(Spacer(1, 5*mm))
# Footer note
footer = Paragraph(
"This document is compiled for NEET PG exam preparation. Always verify with standard textbooks (Parikh's / KS Narayan Reddy / Apurba Nandy) for complete information.",
S("Footer", fontName="Helvetica-Oblique", fontSize=7.5, textColor=C_GRAY, alignment=TA_CENTER)
)
story.append(footer)
# ββ Build PDF ββ
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /home/daytona/workspace/fmt-revision && python generate_fmt_pdf.py 2>&1
ls -lh /home/daytona/workspace/fmt-revision/FMT_NEET_PG_Quick_Revision.pdf
FMT NEET PG Quick Revision
PDF Document Β· PDF
| Section | Content |
|---|---|
| Cover | Title + usage guide |
| 1. Death & PM Changes | Rigor/livor/algor mortis timeline table, adipocere vs mummification |
| 2. Identification | Age estimation (Gustafson's), stature, sex determination table |
| 3. Wounds & Injuries | Classification table + firearm wounds (entry vs exit) |
| 4. Asphyxia | Hanging vs strangulation vs throttling vs drowning table |
| 5. Sexual Offences | Rape IPC sections, MTP Act 2021, PCPNDT Act |
| 6. Medical Jurisprudence | IPC sections table, Bolam test, dying declaration, inquest types |
| 7-8. Corrosive & Metal Poisons | Color-coded tables with antidotes |
| 9. Neurotropic Poisons | Strychnine, dhatura, opioids, aconite β mechanisms + antidotes |
| 10. OP Poisoning | SLUDGE/DUMBELS mnemonic, atropine + PAM treatment |
| 11-12. Alcohol & Asphyxiants | Blood alcohol levels, methanol blindness, CO/CN poisoning |
| 13. Snake Venom | Cobra/krait/Russell's viper comparison table |
| 15. Rapid Fire Facts | 34-row high-yield exam facts table |
| 16. Antidotes | Complete antidotes reference table (20 poisons) |
Do u neet pg pyqs
1st is B
U ask questions same neet pg questions no ur own generated MCQ and I will answer
NEET PG FMT forensic medicine PYQ previous year questions with answers
B
C