Use Bernard knight and other standard forensic textbook , to create an answer for sudden natural deaths for my pg FMT exam , for 20 marks , diagrams for exams where possible
ls /home/daytona/workspace/attachments/d543a6a2-7953-477a-b6b7-d13b32ef4823/
python3 -c " import pdfplumber pdf_path = '/home/daytona/workspace/attachments/d…
python3 -c " import pdfplumber pdf_path = '/home/daytona/workspace/attachments/d…
python3 -c " import pdfplumber pdf_path = '/home/daytona/workspace/attachments/d…
python3 -c " import pdfplumber pdf_path = '/home/daytona/workspace/attachments/d…
python3 -c " import pdfplumber pdf_path = '/home/daytona/workspace/attachments/d…
python3 -c " import pdfplumber pdf_path = '/home/daytona/workspace/attachments/d…
| Section | Marks |
|---|---|
| Definition (WHO + Knight) | 1 |
| System-wise frequency table (diagram) | 1 |
| Cardiovascular system in detail (coronary anatomy, types of occlusion, sequelae, MI table) | 8 |
| TTC and histological methods | 2 |
| CNS - SAH, Circle of Willis diagram, ICH, infections, epilepsy | 4 |
| Respiratory / Alimentary / GU / Miscellaneous | 2 |
| Medicolegal importance + Negative Autopsy | 2 |
| Total | 20 |
Create a study guide PDF with this 20-mark answer for quick revision
ls /home/daytona/workspace/ 2>/dev/null && echo "---" && ls /home/daytona/worksp…
mkdir -p /home/daytona/workspace/sudden-death-guide && python3 -c "from reportla…
~/sudden-death-guide/build_pdf.py
#!/usr/bin/env python3
"""
Sudden Natural Deaths - PG FMT Study Guide PDF
Uses reportlab for rich formatting with colors, tables, and diagrams.
"""
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.platypus.flowables import Flowable
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.graphics.shapes import Drawing, Rect, String, Line, Circle, Polygon
from reportlab.graphics import renderPDF
from reportlab.graphics.shapes import Group
import os
OUTPUT = "/home/daytona/workspace/sudden-death-guide/Sudden_Natural_Deaths_FMT_StudyGuide.pdf"
# ── Color palette ────────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1a2e52")
TEAL = colors.HexColor("#1a7a6e")
AMBER = colors.HexColor("#e67e22")
RED_DARK = colors.HexColor("#c0392b")
LIGHT_BG = colors.HexColor("#eaf4f2")
AMBER_BG = colors.HexColor("#fef9e7")
RED_BG = colors.HexColor("#fdedec")
WHITE = colors.white
GREY_LIGHT= colors.HexColor("#ecf0f1")
GREY_MID = colors.HexColor("#95a5a6")
BLACK = colors.black
PURPLE = colors.HexColor("#6c3483")
PAGE_W, PAGE_H = A4
MARGIN = 18*mm
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=20*mm, bottomMargin=20*mm,
title="Sudden Natural Deaths - PG FMT Study Guide",
author="Orris AI | Based on Dikshit FMT & Bernard Knight"
)
styles = getSampleStyleSheet()
# ── Custom paragraph styles ──────────────────────────────────────────────────
def S(name, **kw):
return ParagraphStyle(name, **kw)
H1 = S("H1", fontName="Helvetica-Bold", fontSize=20, textColor=WHITE,
spaceAfter=4, spaceBefore=0, alignment=TA_CENTER)
H2 = S("H2", fontName="Helvetica-Bold", fontSize=13, textColor=WHITE,
spaceAfter=2, spaceBefore=2, alignment=TA_LEFT)
H3 = S("H3", fontName="Helvetica-Bold", fontSize=11, textColor=NAVY,
spaceAfter=3, spaceBefore=6, alignment=TA_LEFT)
H4 = S("H4", fontName="Helvetica-Bold", fontSize=10, textColor=TEAL,
spaceAfter=2, spaceBefore=4, alignment=TA_LEFT)
BODY = S("Body", fontName="Helvetica", fontSize=9, textColor=BLACK,
spaceAfter=3, spaceBefore=1, leading=13, alignment=TA_JUSTIFY)
BODY_SM = S("BodySm", fontName="Helvetica", fontSize=8, textColor=BLACK,
spaceAfter=2, spaceBefore=1, leading=11)
MONO = S("Mono", fontName="Courier", fontSize=7.5, textColor=NAVY,
spaceAfter=2, leading=10)
TIP = S("Tip", fontName="Helvetica-Oblique", fontSize=8.5, textColor=PURPLE,
spaceAfter=3, spaceBefore=3, leading=12)
BULLET = S("Bullet", fontName="Helvetica", fontSize=9, textColor=BLACK,
spaceAfter=2, leading=12, leftIndent=12, bulletIndent=0)
SMALL_BOLD = S("SmallBold", fontName="Helvetica-Bold", fontSize=8, textColor=NAVY,
spaceAfter=1, leading=10)
REF = S("Ref", fontName="Helvetica-Oblique", fontSize=7.5, textColor=GREY_MID,
spaceAfter=2, leading=10)
# ── Helper builders ──────────────────────────────────────────────────────────
def section_header(text, color=NAVY):
"""Colored band heading."""
tbl = Table([[Paragraph(text, H2)]], colWidths=[PAGE_W - 2*MARGIN])
tbl.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),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return tbl
def sub_header(text):
return Paragraph(text, H3)
def sub2_header(text):
return Paragraph(text, H4)
def body(text):
return Paragraph(text, BODY)
def bullet(items, color=TEAL):
elems = []
for item in items:
elems.append(Paragraph(f"<bullet>\u2022</bullet> {item}", BULLET))
return elems
def tip_box(text):
tbl = Table([[Paragraph(f"<b>Exam Tip:</b> {text}", TIP)]],
colWidths=[PAGE_W - 2*MARGIN])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), AMBER_BG),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 1, AMBER),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return tbl
def info_box(text, bg=LIGHT_BG, border=TEAL):
tbl = Table([[Paragraph(text, BODY)]],
colWidths=[PAGE_W - 2*MARGIN])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 1.2, border),
]))
return tbl
def spacer(h=4):
return Spacer(1, h*mm)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=GREY_MID, spaceAfter=3, spaceBefore=3)
def styled_table(headers, rows, col_widths=None, header_bg=NAVY):
if col_widths is None:
n = len(headers)
col_widths = [(PAGE_W - 2*MARGIN) / n] * n
header_row = [Paragraph(f"<b>{h}</b>", S("TH", fontName="Helvetica-Bold",
fontSize=8, textColor=WHITE, alignment=TA_CENTER, leading=10)) for h in headers]
data = [header_row]
for i, row in enumerate(rows):
bg = GREY_LIGHT if i % 2 == 0 else WHITE
data.append([Paragraph(str(c), BODY_SM) for c in row])
tbl = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [GREY_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
tbl.setStyle(TableStyle(style))
return tbl
# ── Diagram: Coronary Artery Tree ────────────────────────────────────────────
def coronary_diagram():
d = Drawing(480, 190)
# Background
d.add(Rect(0, 0, 480, 190, fillColor=LIGHT_BG, strokeColor=TEAL, strokeWidth=1))
# Title
d.add(String(240, 175, "BLOOD SUPPLY OF THE HEART", fontSize=9,
fontName="Helvetica-Bold", fillColor=NAVY, textAnchor="middle"))
# Aorta (vertical stem)
d.add(Line(240, 160, 240, 130, strokeColor=RED_DARK, strokeWidth=3))
d.add(String(240, 163, "AORTA", fontSize=7, fontName="Helvetica-Bold",
fillColor=RED_DARK, textAnchor="middle"))
# LCA branch left
d.add(Line(240, 145, 100, 120, strokeColor=RED_DARK, strokeWidth=2))
d.add(String(95, 123, "LEFT CORONARY A.", fontSize=7, fontName="Helvetica-Bold",
fillColor=RED_DARK, textAnchor="end"))
# LAD
d.add(Line(100, 120, 60, 55, strokeColor=RED_DARK, strokeWidth=1.5))
d.add(String(55, 48, "LAD (Ant. Interventricular)", fontSize=6.5, fontName="Helvetica",
fillColor=NAVY, textAnchor="end"))
d.add(String(55, 40, "45-64% fatal stenosis", fontSize=6, fontName="Helvetica-Bold",
fillColor=RED_DARK, textAnchor="end"))
# LCx
d.add(Line(100, 120, 80, 75, strokeColor=RED_DARK, strokeWidth=1.5))
d.add(String(78, 68, "Left Circumflex", fontSize=6.5, fontName="Helvetica",
fillColor=NAVY, textAnchor="end"))
d.add(String(78, 60, "3-10% fatal stenosis", fontSize=6, fontName="Helvetica-Bold",
fillColor=GREY_MID, textAnchor="end"))
# RCA branch right
d.add(Line(240, 145, 380, 120, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2))
d.add(String(385, 123, "RIGHT CORONARY A.", fontSize=7, fontName="Helvetica-Bold",
fillColor=colors.HexColor("#8e44ad"), textAnchor="start"))
# Right marginal
d.add(Line(380, 120, 410, 75, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=1.5))
d.add(String(415, 68, "Right Marginal Br.", fontSize=6.5, fontName="Helvetica",
fillColor=NAVY, textAnchor="start"))
# Post descending
d.add(Line(380, 120, 420, 55, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=1.5))
d.add(String(425, 48, "Post. Descending Br.", fontSize=6.5, fontName="Helvetica",
fillColor=NAVY, textAnchor="start"))
d.add(String(425, 40, "24-46% (RCA) fatal stenosis", fontSize=6, fontName="Helvetica-Bold",
fillColor=colors.HexColor("#8e44ad"), textAnchor="start"))
# Left main note
d.add(String(240, 108, "Left Main: 0-10% fatal stenosis", fontSize=6.5,
fontName="Helvetica-Bold", fillColor=AMBER, textAnchor="middle"))
# Legend box
d.add(Rect(155, 5, 170, 28, fillColor=WHITE, strokeColor=GREY_MID, strokeWidth=0.5))
d.add(Line(160, 24, 175, 24, strokeColor=RED_DARK, strokeWidth=2))
d.add(String(178, 21, "Left Coronary System", fontSize=6.5, fontName="Helvetica", fillColor=BLACK))
d.add(Line(160, 13, 175, 13, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2))
d.add(String(178, 10, "Right Coronary System", fontSize=6.5, fontName="Helvetica", fillColor=BLACK))
return d
# ── Diagram: Circle of Willis ────────────────────────────────────────────────
def circle_of_willis_diagram():
d = Drawing(480, 220)
d.add(Rect(0, 0, 480, 220, fillColor=LIGHT_BG, strokeColor=TEAL, strokeWidth=1))
d.add(String(240, 207, "CIRCLE OF WILLIS", fontSize=9,
fontName="Helvetica-Bold", fillColor=NAVY, textAnchor="middle"))
d.add(String(240, 196, "(Common sites of Berry Aneurysm marked with ★)", fontSize=7,
fontName="Helvetica-Oblique", fillColor=RED_DARK, textAnchor="middle"))
cx, cy = 240, 108 # center
# Draw ellipse approximated with line segments forming circle of willis
# Anterior communicating artery (horizontal top)
d.add(Line(195, 155, 285, 155, strokeColor=RED_DARK, strokeWidth=2.5)) # Ant Comm
# Anterior cerebral arteries going up
d.add(Line(195, 155, 155, 185, strokeColor=RED_DARK, strokeWidth=2)) # L ACA
d.add(Line(285, 155, 325, 185, strokeColor=RED_DARK, strokeWidth=2)) # R ACA
# Internal carotid arteries coming in
d.add(Line(195, 155, 170, 120, strokeColor=RED_DARK, strokeWidth=2)) # L ICA
d.add(Line(285, 155, 310, 120, strokeColor=RED_DARK, strokeWidth=2)) # R ICA
# Middle cerebral arteries going out
d.add(Line(170, 120, 110, 120, strokeColor=RED_DARK, strokeWidth=2)) # L MCA
d.add(Line(310, 120, 370, 120, strokeColor=RED_DARK, strokeWidth=2)) # R MCA
# Posterior communicating arteries
d.add(Line(170, 120, 175, 85, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=1.5)) # L PComm
d.add(Line(310, 120, 305, 85, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=1.5)) # R PComm
# Posterior cerebral arteries
d.add(Line(175, 85, 150, 60, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2)) # L PCA
d.add(Line(305, 85, 330, 60, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2)) # R PCA
# Basilar artery
d.add(Line(240, 85, 175, 85, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2))
d.add(Line(240, 85, 305, 85, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2))
d.add(Line(240, 85, 240, 45, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2.5))
# Vertebral arteries
d.add(Line(240, 45, 205, 20, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2))
d.add(Line(240, 45, 275, 20, strokeColor=colors.HexColor("#8e44ad"), strokeWidth=2))
# Labels
d.add(String(240, 158, "Ant. Communicating A.", fontSize=6, fontName="Helvetica-Bold",
fillColor=RED_DARK, textAnchor="middle"))
d.add(String(135, 189, "L. Ant. Cerebral A.", fontSize=6, fontName="Helvetica", fillColor=BLACK))
d.add(String(330, 189, "R. Ant. Cerebral A.", fontSize=6, fontName="Helvetica", fillColor=BLACK))
d.add(String(95, 123, "L. Middle Cerebral A.", fontSize=6, fontName="Helvetica", fillColor=BLACK, textAnchor="end"))
d.add(String(375, 123, "R. Middle Cerebral A.", fontSize=6, fontName="Helvetica", fillColor=BLACK))
d.add(String(165, 112, "L. ICA", fontSize=6, fontName="Helvetica-Bold", fillColor=RED_DARK))
d.add(String(305, 112, "R. ICA", fontSize=6, fontName="Helvetica-Bold", fillColor=RED_DARK))
d.add(String(158, 75, "L. Post. Comm. A.", fontSize=6, fontName="Helvetica", fillColor=BLACK, textAnchor="end"))
d.add(String(322, 75, "R. Post. Comm. A.", fontSize=6, fontName="Helvetica", fillColor=BLACK))
d.add(String(135, 54, "L. Post. Cerebral A.", fontSize=6, fontName="Helvetica", fillColor=BLACK, textAnchor="end"))
d.add(String(335, 54, "R. Post. Cerebral A.", fontSize=6, fontName="Helvetica", fillColor=BLACK))
d.add(String(240, 38, "Basilar A.", fontSize=6, fontName="Helvetica-Bold",
fillColor=colors.HexColor("#8e44ad"), textAnchor="middle"))
d.add(String(190, 12, "L. Vertebral A.", fontSize=6, fontName="Helvetica", fillColor=BLACK, textAnchor="end"))
d.add(String(285, 12, "R. Vertebral A.", fontSize=6, fontName="Helvetica", fillColor=BLACK))
# Berry aneurysm sites - red stars
star_sites = [
(240, 155, "★ Ant. Comm. (MOST COMMON)"),
(170, 120, "★ ICA-PComm junction"),
(285, 155, "★ ACA bifurcation"),
]
for sx, sy, label in star_sites:
d.add(String(sx, sy+4, "★", fontSize=10, fontName="Helvetica-Bold",
fillColor=RED_DARK, textAnchor="middle"))
return d
# ── Diagram: Causes Pie-style bar ─────────────────────────────────────────────
def causes_bar_diagram():
d = Drawing(480, 95)
d.add(Rect(0, 0, 480, 95, fillColor=WHITE, strokeColor=TEAL, strokeWidth=0.5))
d.add(String(240, 82, "SYSTEM-WISE FREQUENCY OF SUDDEN NATURAL DEATH", fontSize=8,
fontName="Helvetica-Bold", fillColor=NAVY, textAnchor="middle"))
data = [
("Cardiovascular", 47.5, RED_DARK),
("CNS", 14, NAVY),
("Respiratory", 12.5, TEAL),
("Alimentary", 7, AMBER),
("Genitourinary", 4, PURPLE),
("Miscellaneous", 7.5, GREY_MID),
]
total = sum(d2 for _, d2, _ in data)
x = 20
bar_y = 40
bar_h = 22
total_w = 440
for label, pct, col in data:
w = (pct / total) * total_w
d.add(Rect(x, bar_y, w, bar_h, fillColor=col, strokeColor=WHITE, strokeWidth=1))
if w > 22:
d.add(String(x + w/2, bar_y + bar_h/2 - 3, f"{pct:.0f}%",
fontSize=7, fontName="Helvetica-Bold", fillColor=WHITE, textAnchor="middle"))
x += w
# Legend
x2 = 20
for label, pct, col in data:
d.add(Rect(x2, 12, 8, 8, fillColor=col, strokeColor=None))
d.add(String(x2 + 10, 12, f"{label}", fontSize=6, fontName="Helvetica", fillColor=BLACK))
x2 += 75
return d
# ── Diagram: Sequelae flowchart ───────────────────────────────────────────────
def sequelae_diagram():
d = Drawing(480, 140)
d.add(Rect(0, 0, 480, 140, fillColor=RED_BG, strokeColor=RED_DARK, strokeWidth=0.8))
d.add(String(240, 127, "SEQUELAE OF CORONARY OCCLUSION", fontSize=8.5,
fontName="Helvetica-Bold", fillColor=RED_DARK, textAnchor="middle"))
# Central box
d.add(Rect(165, 95, 150, 22, fillColor=RED_DARK, strokeColor=None))
d.add(String(240, 101, "CORONARY OCCLUSION", fontSize=7.5,
fontName="Helvetica-Bold", fillColor=WHITE, textAnchor="middle"))
boxes = [
(20, 50, 90, 18, "Sudden Death\n(VF)", RED_DARK),
(115, 50, 90, 18, "MI", NAVY),
(210, 50, 90, 18, "Rupture\n(Day 2-3)", RED_DARK),
(305, 50, 90, 18, "Mural Thrombus\n→ Emboli", TEAL),
(20, 15, 90, 18, "Cardiac\nTamponade", colors.HexColor("#8e44ad")),
(115, 15, 90, 18, "LV Aneurysm", AMBER),
(210, 15, 90, 18, "Haemoperi-\ncardium", RED_DARK),
(305, 15, 90, 18, "Pericarditis", TEAL),
]
for bx, by, bw, bh, label, col in boxes:
d.add(Rect(bx, by, bw, bh, fillColor=col, strokeColor=WHITE, strokeWidth=0.5))
lines = label.split("\n")
if len(lines) == 2:
d.add(String(bx+bw/2, by+bh-7, lines[0], fontSize=6, fontName="Helvetica-Bold",
fillColor=WHITE, textAnchor="middle"))
d.add(String(bx+bw/2, by+3, lines[1], fontSize=6, fontName="Helvetica",
fillColor=WHITE, textAnchor="middle"))
else:
d.add(String(bx+bw/2, by+bh/2-3, label, fontSize=6.5, fontName="Helvetica-Bold",
fillColor=WHITE, textAnchor="middle"))
# Lines from central box
d.add(Line(240, 95, bx+bw/2, by+bh, strokeColor=GREY_MID, strokeWidth=0.8))
return d
# ══════════════════════════════════════════════════════════════════════════════
# BUILD STORY
# ══════════════════════════════════════════════════════════════════════════════
story = []
# ── COVER / TITLE BLOCK ──────────────────────────────────────────────────────
cover = Table([
[Paragraph("SUDDEN NATURAL DEATHS", H1)],
[Paragraph("PG FMT Exam Study Guide | 20 Marks", S("Sub", fontName="Helvetica",
fontSize=11, textColor=colors.HexColor("#cce8e4"), alignment=TA_CENTER))],
[Paragraph("Based on: Dikshit FMT (Chapter 11) & Bernard Knight's Forensic Pathology",
S("Ref2", fontName="Helvetica-Oblique", fontSize=8.5,
textColor=colors.HexColor("#a8d8d2"), alignment=TA_CENTER))],
], colWidths=[PAGE_W - 2*MARGIN])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
story.append(cover)
story.append(spacer(4))
# ── DEFINITION ───────────────────────────────────────────────────────────────
story.append(section_header("1. DEFINITION", NAVY))
story.append(spacer(2))
story.append(info_box(
"<b>WHO Definition:</b> Death that is unknown or sudden, occurring within "
"<b>24 hours</b> from onset of symptoms.<br/><br/>"
"<b>Bernard Knight:</b> \"Sudden death means death that is rapid and unexpected, "
"either instantaneous or within a very short time of the onset of symptoms or signs "
"of the fatal process.\"<br/><br/>"
"<b>Stricter definition (some pathologists):</b> Death within <b>1 hour</b> of symptom onset. "
"The <b>unexpected nature</b> of death is more important than its suddenness.",
bg=LIGHT_BG, border=TEAL
))
story.append(spacer(3))
# ── FREQUENCY DIAGRAM ────────────────────────────────────────────────────────
story.append(section_header("2. SYSTEM-WISE CAUSES & FREQUENCY", TEAL))
story.append(spacer(2))
story.append(causes_bar_diagram())
story.append(spacer(2))
freq_headers = ["System", "Frequency", "Key Conditions"]
freq_rows = [
["Cardiovascular", "45 - 50%", "IHD, Hypertensive HD, Cardiomyopathy, Valvular disease"],
["Central Nervous System", "10 - 18%", "SAH (Berry aneurysm), ICH, Meningitis, Epilepsy"],
["Respiratory", "10 - 15%", "Massive haemoptysis, Spontaneous pneumothorax"],
["Alimentary", "6 - 8%", "GI bleed, Peptic perforation, Strangulated hernia"],
["Genitourinary", "3 - 5%", "Chronic nephritis, Uterine haemorrhage"],
["Miscellaneous", "5 - 10%", "Anaphylaxis, Diabetes, Vagal inhibition"],
]
story.append(styled_table(freq_headers, freq_rows,
col_widths=[90*mm, 28*mm, (PAGE_W-2*MARGIN-118*mm)]))
story.append(spacer(2))
story.append(tip_box("CVS is the most common cause (45-50%). Always state this first. "
"Examiner expects the frequency table."))
story.append(spacer(3))
# ── CARDIOVASCULAR ───────────────────────────────────────────────────────────
story.append(section_header("3. CARDIOVASCULAR SYSTEM (45-50%) - THE MOST COMMON", RED_DARK))
story.append(spacer(2))
story.append(sub_header("A. Normal Heart - Autopsy Reference Values"))
norm_data = [
["Parameter", "Male", "Female"],
["Heart weight", "275 - 300 g", "225 - 250 g"],
["Atrial wall thickness", "1 - 2 mm", "1 - 2 mm"],
["Right ventricular wall", "3 - 5 mm", "3 - 5 mm"],
["Left ventricular wall", "10 - 15 mm", "10 - 15 mm"],
]
tbl_norm = Table(norm_data, colWidths=[80*mm, 50*mm, 50*mm])
tbl_norm.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), RED_DARK),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [GREY_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
story.append(tbl_norm)
story.append(spacer(3))
story.append(sub_header("B. Cardiovascular Causes of Sudden Death"))
story += bullet([
"<b>Coronary atherosclerosis</b> (most common cause in Western nations)",
"Hypertensive heart disease",
"Aortic valve disease",
"Coronary circulation anomalies",
"Coronary artery diseases - polyarteritis",
"Cardiomyopathic enlargement",
"Congenital heart disease",
])
story.append(spacer(3))
story.append(sub_header("C. Coronary Artery Anatomy & Fatal Stenosis Sites"))
story.append(coronary_diagram())
story.append(spacer(2))
fatal_headers = ["Vessel", "% Fatal Stenosis (with/without Thrombosis)"]
fatal_rows = [
["Anterior Interventricular (LAD)", "45 - 64% ← MOST COMMON"],
["Right Main Coronary (RCA)", "24 - 46%"],
["Left Circumflex", "3 - 10%"],
["Left Main Coronary", "0 - 10%"],
["Right Marginal / Post. Interventricular", "Relatively immune"],
]
story.append(styled_table(fatal_headers, fatal_rows,
col_widths=[95*mm, (PAGE_W-2*MARGIN-95*mm)],
header_bg=RED_DARK))
story.append(spacer(2))
story.append(body(
"Coronary stenosis most commonly involves the <b>first 2 cm from the origin</b> of the vessel. "
"Coronary atheroma may be focal; every part of the major vessel must be examined with "
"transverse cuts at <b>no more than 3 mm intervals</b> at autopsy."
))
story.append(spacer(3))
story.append(sub_header("D. Types of Coronary Atherosclerotic Occlusion"))
types_data = [
["Type", "Description"],
["1. Simple atheroma", "Eccentric plaques with central pinhole; crescentic residual lumen"],
["2. Ulcerative atheroma", "Breakdown of endothelium over plaque; conducive to thrombosis"],
["3. Subintimal haemorrhage", "Rupture of tiny vessels in arterial wall; haematoma forces plaque inward"],
["4. Coronary thrombosis", "Occurs on stenosed plaque with damaged endothelium"],
["5. Periarteritis nodosa", "Pan-inflammatory disease of arteries; affects males in 4th decade"],
]
tbl_types = Table(types_data, colWidths=[55*mm, (PAGE_W-2*MARGIN-55*mm)])
tbl_types.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), RED_DARK),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [GREY_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), RED_DARK),
]))
story.append(tbl_types)
story.append(spacer(3))
story.append(sub_header("E. Sequelae of Coronary Occlusion"))
story.append(sequelae_diagram())
story.append(spacer(2))
seq_items = [
"<b>Sudden death</b>: at time of occlusion or subsequently from <b>ventricular fibrillation (VF)</b> "
"due to damage to nodal tissue or conducting system",
"<b>Myocardial infarction</b>: in myocardium distal to complete occlusion (absent collateral circulation)",
"<b>Cardiac rupture</b>: usually on Day 2-3 post-MI; involves LV wall (soft/necrotic); "
"causes haemopericardium → cardiac tamponade → death",
"<b>Myocardial fibrosis</b>: localized patches from healed MI; predilection at distal IVS, apex, posterior wall",
"<b>LV Aneurysm</b>: if large full-thickness fibrotic plaque becomes stretched",
"<b>Mural thrombosis</b>: over infarct reaching endocardial surface; danger of emboli",
"<b>Pericarditis</b>: in transmural infarcts involving epicardium; IHD is most common cause",
]
story += bullet(seq_items, color=RED_DARK)
story.append(spacer(3))
story.append(sub_header("F. Myocardial Infarction - Types & Distribution"))
story.append(body(
"<b>Types:</b> Subendocardial | Intramural | Transmural (full-thickness) - most important"
))
mi_dist = [
["Region Involved", "% of Transmural MIs"],
["Left Ventricle with IV septum", "67 - 80%"],
["Right and Left Ventricular wall", "15 - 30%"],
["Isolated Right Ventricle", "1 - 3%"],
["Isolated Left Atrium", "Rarest"],
]
tbl_mi = Table(mi_dist, colWidths=[110*mm, (PAGE_W-2*MARGIN-110*mm)])
tbl_mi.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [GREY_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
story.append(tbl_mi)
story.append(spacer(3))
# ── MI TIME TABLE ─────────────────────────────────────────────────────────────
story.append(PageBreak())
story.append(section_header("4. MYOCARDIAL INFARCTION - GROSS & MICROSCOPY WITH TIME", RED_DARK))
story.append(spacer(2))
story.append(tip_box("This table is the MOST IMPORTANT for 20-mark answers. Memorise the key "
"time milestones: <6h no change, 4-12h eosinophilia, 2-4d max neutrophils, "
"1wk granulation tissue, >1 month mature scar."))
story.append(spacer(2))
mi_time_headers = ["Age of MI", "Gross Appearance", "Light Microscopy"]
mi_time_rows = [
["< 4 hours", "No change", "No change"],
["4 - 12 hours",
"Slight mottling with areas of dark discolouration",
"Intense sarcoplasmic eosinophilia, nuclear pyknosis, contraction bands"],
["12 - 24 hours",
"Mottled, mildly oedematous, bulging cut surface",
"Sarcoplasmic eosinophilia, early interstitial oedema, neutrophilic infiltrate"],
["2 - 4 days",
"Soft yellow-tan core with mottled border",
"MAXIMUM neutrophilic infiltrate, nuclear loss, sarcoplasmic coagulation"],
["5 - 7 days",
"Yellow-tan core, irregular hyperaemic red-brown border",
"Basophilic interstitial debris, early macrophage infiltration, dilated capillaries at border"],
["8 - 10 days",
"Yellow-gray core, red-brown border, depressed cut surface",
"Numerous macrophages with active phagocytosis, lipofuscin-laden macrophages"],
["11 - 14 days",
"Yellow-gray core, red-gray border, depressed cut surface",
"Granulation tissue along border, ongoing phagocytosis at core"],
["2 - 4 weeks",
"Core becoming smaller, border gray, firmer, less gelatinous, less depressed",
"Ongoing scar formation, dense collagen at outer border, central necrotic core"],
["> 1 month",
"Firm gray-white or red-gray scar, scar retraction, variable wall thinning",
"Mature scar: dense collagen, focal elastin, lymphocytes, hypercellularity"],
]
story.append(styled_table(mi_time_headers, mi_time_rows,
col_widths=[28*mm, 65*mm, (PAGE_W-2*MARGIN-93*mm)],
header_bg=RED_DARK))
story.append(spacer(3))
story.append(sub_header("Postmortem Demonstration of Myocardial Infarction"))
demo_headers = ["Technique", "Principle", "Detectable from"]
demo_rows = [
["H&E staining",
"Eosinophilia, nuclear pyknosis, neutrophil infiltrate",
"4 - 6 hours"],
["TTC (Triphenyl Tetrazolium Chloride)",
"Active dehydrogenases → bright red formazan; infarcted area = pale/negative",
"Within hours (very useful)"],
["PTAH",
"Break-up of muscle striations; 'sandy' appearance progressing to clumping",
"Similar to H&E"],
["PAS stain",
"Detects diastase-resistant glycoprotein in necrotic myocardium (purplish-pink)",
"Not before 12 hours"],
]
story.append(styled_table(demo_headers, demo_rows,
col_widths=[45*mm, 95*mm, 35*mm],
header_bg=TEAL))
story.append(spacer(2))
story.append(info_box(
"<b>TTC Method in Detail:</b> Transverse slices of ventricles ~5 mm thick are cut and incubated "
"for 1 hour in <b>1% TTC in phosphate buffer pH 8</b>. Normal myocardium with active "
"dehydrogenases → <b>bright red formazan</b>. Infarcted area → <b>pale/unstained</b>. "
"Fix in formalin after reaction. Postmortem interval up to 2 days does not affect the reaction.",
bg=AMBER_BG, border=AMBER
))
story.append(spacer(3))
story.append(sub_header("Other Cardiac Lesions Causing Sudden Death"))
other_cardiac = [
["Condition", "Key Features"],
["Hypertrophic cardiomyopathy",
"Familial variety → sudden death common; IVS enlarged, bulges into both ventricles, ridge beneath aortic valve"],
["Myocarditis",
"Inflammation of myocardium; acute purulent form complicates septicaemia; pyogenic abscess (rare)"],
["Alcoholic cardiomyopathy",
"Both ventricles hypertrophied; coronaries free from atheroma; scattered LV fibrosis on microscopy"],
["Fibro-elastosis (Endocardial)",
"Congenital; thick endocardium; death in 1st week of life in 1/4 infants"],
["Valvular lesions",
"Mitral valve disease may be undetected in life; ball-valve thrombus in left auricle → emboli"],
["Reflex vagal inhibition",
"Primary neurogenic shock; cardiac arrest without any demonstrable cardiac lesion"],
]
tbl_oc = Table(other_cardiac, colWidths=[60*mm, (PAGE_W-2*MARGIN-60*mm)])
tbl_oc.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [GREY_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), TEAL),
]))
story.append(tbl_oc)
story.append(spacer(3))
# ── CNS ──────────────────────────────────────────────────────────────────────
story.append(PageBreak())
story.append(section_header("5. CENTRAL NERVOUS SYSTEM (10-18%)", NAVY))
story.append(spacer(2))
story.append(sub_header("A. Subarachnoid Haemorrhage (SAH)"))
story.append(circle_of_willis_diagram())
story.append(spacer(2))
story += bullet([
"<b>Cause:</b> Rupture of <b>Berry aneurysm</b> (usually on the Circle of Willis, "
"most commonly at the junction of anterior communicating and anterior cerebral arteries)",
"Aneurysms are usually <b>developmental</b> (congenital weakness of vessel wall); "
"also atheromatous degeneration",
"<b>Mycotic cerebral aneurysm</b>: damaged vessel wall from infected emboli (e.g., bacterial endocarditis)",
"At autopsy: massive collection of blood at base of brain - makes locating aneurysm difficult; "
"multiple aneurysms may be present",
"Rupture may be triggered by transient rise in BP even from minor injury",
])
story.append(spacer(3))
story.append(sub_header("B. Intracerebral Haemorrhage"))
story += bullet([
"Located in: internal capsule (most common), brain substance, cerebellum, pons",
"Capsular region: rarely immediately fatal; death after hours or patient recovers then "
"collapses from rupture into lateral ventricle",
"<b>Pontine haemorrhage:</b> Primary = single, involves hypothalamus; "
"Secondary = associated with head injury (important medico-legally)",
])
story.append(spacer(2))
story.append(sub_header("C. Cerebral Thrombosis and Embolism"))
story += bullet([
"Cerebral embolism: sudden onset; source = left auricle (AF, mitral stenosis, mural thrombus)",
"Positions of lesions: territory of cerebral, basilar, or rarely carotid arteries",
])
story.append(spacer(2))
story.append(sub_header("D. Infections"))
cns_infect = [
["Meningococcal / Pneumococcal / Influenzal / Tuberculous meningitis", "Rapid death"],
["Acute poliomyelitis / Encephalitis", "Fulminant, especially if brainstem involved"],
["Cerebral malaria", "PM diagnosis: malarial pigment in brain, spleen, liver, kidney (distinguish from formalin pigment)"],
["Trypanosomiasis", "Organisms hard to find; look for perivascular inflammation + morula cells (large histiocytes)"],
["Epilepsy (status epilepticus)", "Heart failure from myocardial ischaemia; bite marks on tongue at autopsy"],
]
tbl_cns = Table([[Paragraph("<b>Condition</b>", SMALL_BOLD), Paragraph("<b>Key Feature</b>", SMALL_BOLD)]] +
[[Paragraph(r[0], BODY_SM), Paragraph(r[1], BODY_SM)] for r in cns_infect],
colWidths=[80*mm, (PAGE_W-2*MARGIN-80*mm)])
tbl_cns.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS",(0,1), (-1,-1), [GREY_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
]))
story.append(tbl_cns)
story.append(spacer(3))
# ── RESPIRATORY / GIT / GU / MISC ───────────────────────────────────────────
story.append(section_header("6. RESPIRATORY SYSTEM (10-15%)", TEAL))
story.append(spacer(2))
story.append(info_box(
"Sudden death from respiratory disease in a <b>healthy individual is rare</b>. "
"Main cause is massive <b>haemoptysis</b>.",
bg=LIGHT_BG, border=TEAL
))
story.append(spacer(2))
story += bullet([
"<b>Haemorrhage:</b> from neoplasm/inflammatory lesions of nasopharynx; carcinoma of bronchus or oesophagus; "
"tuberculous cavitation, lung abscess, bronchiectasis",
"<b>Aortic aneurysm:</b> may rupture into bronchus or oesophagus",
"<b>Spontaneous pneumothorax:</b> from rupture of emphysematous bulla (rarely fatal)",
"<b>Respiratory infections:</b> bronchopneumonia / acute purulent bronchitis superimposed on chronic bronchitis",
"<b>Laryngeal obstruction:</b> local neoplasm, angioneurotic oedema, local inflammation",
])
story.append(spacer(3))
story.append(section_header("7. ALIMENTARY SYSTEM (6-8%)", AMBER))
story.append(spacer(2))
story += bullet([
"Haemorrhage into GI tract: peptic ulcer, oesophageal varices",
"Perforation of ulcers: peptic, typhoid",
"Strangulated hernia",
"Rupture of liver abscess",
"Rupture of enlarged spleen (e.g., malaria)",
"Intestinal obstruction; twisting of intestinal loops",
])
story.append(spacer(3))
story.append(section_header("8. GENITOURINARY SYSTEM (3-5%)", PURPLE))
story.append(spacer(2))
story += bullet([
"Chronic nephritis",
"Nephrolithiasis",
"Carcinoma of kidney and urinary bladder",
"Uterine haemorrhages",
"Carcinoma of female genital tract eroding femoral vessels",
"Twisting of ovary, ovarian cyst or fibroid tumours",
])
story.append(spacer(3))
story.append(section_header("9. MISCELLANEOUS (5-10%)", colors.HexColor("#5d6d7e")))
story.append(spacer(2))
misc_items = [
["Diabetes mellitus", "CNS - Cerebral malaria", "Vagal inhibition (reflex cardiac arrest - no lesion)"],
["Drug anaphylaxis", "Emotional excitement (shock)", "Mismatched blood transfusions"],
]
tbl_misc = Table(misc_items, colWidths=[(PAGE_W-2*MARGIN)/3]*3)
tbl_misc.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), GREY_LIGHT),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("FONTNAME", (0,0), (-1,-1), "Helvetica"),
("GRID", (0,0), (-1,-1), 0.4, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
story.append(tbl_misc)
story.append(spacer(3))
# ── MEDICOLEGAL IMPORTANCE ───────────────────────────────────────────────────
story.append(PageBreak())
story.append(section_header("10. MEDICOLEGAL IMPORTANCE (Bernard Knight)", colors.HexColor("#1a5276")))
story.append(spacer(2))
ml_items = [
"<b>Exclude foul play:</b> poison or violence may mimic natural disease; full autopsy mandatory",
"<b>Relationship to trauma:</b> was pre-existing disease aggravated by injury or exertion?",
"<b>Occupational relevance:</b> stress or exertion at work leading to sudden death",
"<b>Insurance claims:</b> accidental death vs. natural death distinction",
"<b>Natural disease causing accident:</b> MI while driving - differentiating cause of accident from effect",
"<b>Negative autopsy rate:</b> ~5-8% of all autopsies show no demonstrable cause of death",
]
story += bullet(ml_items)
story.append(spacer(3))
story.append(sub_header("Negative Autopsy"))
story.append(info_box(
"Occurs in <b>5-8%</b> of all medicolegal autopsies. Even the best-equipped centres in the world "
"have >5% negative autopsy rate.<br/><br/>"
"Reasons include: inadequate examination, death from <b>arrhythmia without structural lesion</b>, "
"SIDS, minor and scarcely detectable insults to myocardium causing faults in normal cardiac "
"transmission. Sudden death can occur in apparently healthy young individuals on over-exertion "
"without any gross or microscopic cardiac abnormality.<br/><br/>"
"<i>(Dikshit: \"A variety of minor and scarcely detectable insults to the myocardium can cause "
"faults in the normal transmission of the heart and can cause sudden death.\")</i>",
bg=AMBER_BG, border=AMBER
))
story.append(spacer(3))
# ── SUMMARY FLOWCHART ─────────────────────────────────────────────────────────
story.append(sub_header("Summary: Classification at a Glance"))
summary_data = [
[Paragraph("<b>CVS (45-50%)</b>", S("SH", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE)),
Paragraph("<b>CNS (10-18%)</b>", S("SH2", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE)),
Paragraph("<b>Respiratory (10-15%)</b>", S("SH3", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE)),
Paragraph("<b>Other Systems</b>", S("SH4", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE))],
[Paragraph(
"• IHD / Coronary atherosclerosis<br/>"
"• Hypertensive HD<br/>"
"• Hypertrophic cardiomyopathy<br/>"
"• Myocarditis<br/>"
"• Alcoholic cardiomyopathy<br/>"
"• Valvular lesions<br/>"
"• Reflex vagal inhibition", BODY_SM),
Paragraph(
"• SAH - Berry aneurysm<br/>"
"• Intracerebral haemorrhage<br/>"
"• Cerebral thrombosis<br/>"
"• Meningitis (all types)<br/>"
"• Encephalitis / Polio<br/>"
"• Epilepsy (status)<br/>"
"• Cerebral malaria", BODY_SM),
Paragraph(
"• Massive haemoptysis<br/>"
"• Aortic aneurysm<br/> rupture into bronchus<br/>"
"• Spontaneous pneumo-<br/> thorax<br/>"
"• Laryngeal obstruction<br/>"
"• Respiratory infections", BODY_SM),
Paragraph(
"<b>GIT:</b> GI bleed, perforation,<br/>"
"strangulated hernia<br/><br/>"
"<b>GU:</b> Nephritis, uterine Hge<br/><br/>"
"<b>Misc:</b> Anaphylaxis,<br/>"
"Diabetes, Vagal inhibition,<br/>"
"Mismatched transfusion", BODY_SM)],
]
col_w = (PAGE_W - 2*MARGIN) / 4
tbl_sum = Table(summary_data, colWidths=[col_w]*4, rowHeights=[None, None])
tbl_sum.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), RED_DARK),
("BACKGROUND", (1,0), (1,0), NAVY),
("BACKGROUND", (2,0), (2,0), TEAL),
("BACKGROUND", (3,0), (3,0), AMBER),
("BACKGROUND", (0,1), (0,1), RED_BG),
("BACKGROUND", (1,1), (1,1), LIGHT_BG),
("BACKGROUND", (2,1), (2,1), colors.HexColor("#e8f8f5")),
("BACKGROUND", (3,1), (3,1), AMBER_BG),
("GRID", (0,0), (-1,-1), 0.5, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tbl_sum)
story.append(spacer(3))
# ── EXAM TIPS ────────────────────────────────────────────────────────────────
story.append(section_header("11. QUICK EXAM TIPS", colors.HexColor("#1a5276")))
story.append(spacer(2))
tips = [
"Always open with WHO + Knight definition. Both definitions expected for full marks.",
"State CVS = 45-50% immediately. Draw the system-wise frequency table.",
"For CVS: coronary anatomy diagram + LAD = most common fatal site (45-64%).",
"The MI age table (gross + histology) is expected in any 20-mark answer.",
"TTC staining: 1% TTC, pH 8, 5 mm slices, 1 hour incubation. Normal = bright red; infarct = pale.",
"For CNS: always draw Circle of Willis and mark Berry aneurysm sites.",
"Negative autopsy (5-8%) is a Bernard Knight hallmark point - earns bonus marks.",
"Reflex vagal inhibition = cardiac arrest with NO demonstrable lesion.",
"MCQ trap: LAD = most common site of fatal coronary stenosis (not RCA).",
"Always end with medicolegal importance - distinguish natural death from foul play.",
]
for i, t in enumerate(tips, 1):
story.append(info_box(f"<b>{i}.</b> {t}", bg=AMBER_BG if i%2==0 else LIGHT_BG,
border=AMBER if i%2==0 else TEAL))
story.append(spacer(1))
story.append(spacer(4))
# ── REFERENCES ────────────────────────────────────────────────────────────────
story.append(hr())
story.append(Paragraph("<b>References</b>", H4))
refs = [
"Dikshit, P.C. Textbook of Forensic Medicine and Toxicology. Chapter 11: Sudden and Unexpected Deaths, pp. 180-188.",
"Knight, Bernard. Forensic Pathology, 3rd Edition. Arnold Publishers. Chapter: Sudden Death.",
"Knight, B. & Saukko, P. Knight's Forensic Pathology, 4th Edition.",
"WHO Definition of Sudden Death.",
]
for r in refs:
story.append(Paragraph(f"• {r}", REF))
story.append(spacer(2))
story.append(Paragraph(
"Generated by Orris AI | Study Guide for PG FMT Examination | May 2026",
S("Footer", fontName="Helvetica-Oblique", fontSize=7, textColor=GREY_MID, alignment=TA_CENTER)
))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/sudden-death-guide && python3 build_pdf.py 2>&1
ls -lh /home/daytona/workspace/sudden-death-guide/Sudden_Natural_Deaths_FMT_Stud…
Sudden Natural Deaths FMT StudyGuide
PDF Document · PDF
| Page | Content |
|---|---|
| 1 | Cover header, Definition (WHO + Knight), System-wise frequency bar diagram + table |
| 1-2 | CVS in full: normal heart values, coronary anatomy diagram, fatal stenosis table, types of occlusion table, sequelae flowchart diagram, MI distribution table |
| 2-3 | MI age table (gross + histology), TTC/staining methods, other cardiac lesions, Circle of Willis diagram with Berry aneurysm sites, CNS section |
| 4 | Respiratory/GIT/GU/Misc, Medicolegal importance, Negative autopsy box, 4-column summary table, 10 exam tips, References |