Can you make a revision card or something like that in the topic Cardiac Poisons in Forensic Medicine, and it should include the plants Cerbera thevetia, Cerbera odollam, Nerium odorum, and Aconite, and Hydrocyanic acid, and its salts, and Cleistanthus collinus.
mkdir -p /home/daytona/workspace/cardiac-poisons && ls /home/daytona/workspace/cardiac-poisons
~/cardiac-poisons/make_revision_card.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, mm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, KeepTogether)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/cardiac-poisons/Cardiac_Poisons_Revision_Card.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.5*cm,
rightMargin=1.5*cm,
topMargin=1.8*cm,
bottomMargin=1.5*cm,
)
# ── COLOUR PALETTE ──────────────────────────────────────────────
C_DARK = colors.HexColor("#1a1a2e") # deep navy
C_MID = colors.HexColor("#16213e")
C_ACCENT = colors.HexColor("#c0392b") # crimson (cardiac!)
C_GOLD = colors.HexColor("#f39c12")
C_TEAL = colors.HexColor("#1abc9c")
C_LTBLUE = colors.HexColor("#2980b9")
C_LTGRAY = colors.HexColor("#ecf0f1")
C_WHITE = colors.white
C_TEXT = colors.HexColor("#2c3e50")
C_SUBHDR = colors.HexColor("#8e44ad") # purple for sub-headers
C_GREEN = colors.HexColor("#27ae60")
C_ORANGE = colors.HexColor("#e67e22")
# ── STYLES ───────────────────────────────────────────────────────
styles = getSampleStyleSheet()
title_style = ParagraphStyle(
"Title", parent=styles["Heading1"],
fontSize=20, textColor=C_WHITE, alignment=TA_CENTER,
spaceAfter=4, leading=26, fontName="Helvetica-Bold"
)
subtitle_style = ParagraphStyle(
"Subtitle", parent=styles["Normal"],
fontSize=10, textColor=C_GOLD, alignment=TA_CENTER,
spaceAfter=2, leading=14
)
section_hdr = ParagraphStyle(
"SecHdr", parent=styles["Heading2"],
fontSize=12, textColor=C_WHITE, alignment=TA_LEFT,
spaceAfter=3, spaceBefore=6, leading=16, fontName="Helvetica-Bold",
backColor=C_ACCENT, borderPad=4
)
plant_hdr = ParagraphStyle(
"PlantHdr", parent=styles["Heading2"],
fontSize=11, textColor=C_DARK, alignment=TA_LEFT,
spaceAfter=2, spaceBefore=4, leading=15, fontName="Helvetica-Bold"
)
body = ParagraphStyle(
"Body", parent=styles["Normal"],
fontSize=8.5, textColor=C_TEXT, leading=12, spaceAfter=2
)
body_small = ParagraphStyle(
"BodySm", parent=styles["Normal"],
fontSize=7.8, textColor=C_TEXT, leading=11, spaceAfter=1
)
bold_label = ParagraphStyle(
"BoldLabel", parent=styles["Normal"],
fontSize=8.5, textColor=C_DARK, leading=12, fontName="Helvetica-Bold"
)
italic_note = ParagraphStyle(
"ItalNote", parent=styles["Normal"],
fontSize=7.5, textColor=C_LTBLUE, leading=11, fontName="Helvetica-Oblique"
)
def hdr_cell(text, bg=C_ACCENT, fc=C_WHITE, fs=9):
return Paragraph(f"<b>{text}</b>",
ParagraphStyle("hc", fontSize=fs, textColor=fc,
fontName="Helvetica-Bold", leading=12, alignment=TA_CENTER))
def data_cell(text, fc=C_TEXT, fs=8.2, bold=False, align=TA_LEFT):
fn = "Helvetica-Bold" if bold else "Helvetica"
return Paragraph(text, ParagraphStyle("dc", fontSize=fs, textColor=fc,
fontName=fn, leading=11, alignment=align))
TABLE_STYLE_BASE = [
("GRID", (0,0),(-1,-1), 0.4, colors.HexColor("#bdc3c7")),
("ROWBACKGROUNDS",(0,1),(-1,-1),[C_LTGRAY, C_WHITE]),
("VALIGN", (0,0),(-1,-1),"TOP"),
("LEFTPADDING", (0,0),(-1,-1), 4),
("RIGHTPADDING", (0,0),(-1,-1), 4),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING",(0,0),(-1,-1), 3),
]
story = []
# ══════════════════════════════════════════════════════════════
# HEADER BANNER
# ══════════════════════════════════════════════════════════════
banner_data = [[
Paragraph(
"<b>CARDIAC POISONS</b> — Forensic Medicine & Toxicology",
title_style),
]]
banner_tbl = Table(banner_data, colWidths=[17.7*cm])
banner_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), C_DARK),
("TOPPADDING", (0,0),(0,0), 10),
("BOTTOMPADDING",(0,0),(0,0), 4),
("LEFTPADDING",(0,0),(0,0), 8),
("RIGHTPADDING",(0,0),(0,0), 8),
("BOX",(0,0),(-1,-1), 1.5, C_ACCENT),
]))
story.append(banner_tbl)
sub_data = [[Paragraph(
"Classification: <b>Vegetable Poisons — Glycoside-based / Alkaloid-based</b> | "
"Sources: <i>Parikh's Textbook of Forensic Medicine & The Essentials of Forensic Medicine (36th ed.)</i>",
ParagraphStyle("sub2", fontSize=8, textColor=C_MID, alignment=TA_CENTER, leading=11)
)]]
sub_tbl = Table(sub_data, colWidths=[17.7*cm])
sub_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(0,0), colors.HexColor("#d6eaf8")),
("TOPPADDING",(0,0),(0,0), 4),
("BOTTOMPADDING",(0,0),(0,0), 4),
]))
story.append(sub_tbl)
story.append(Spacer(1, 5))
# ══════════════════════════════════════════════════════════════
# OVERVIEW TABLE
# ══════════════════════════════════════════════════════════════
story.append(Paragraph("■ QUICK OVERVIEW", section_hdr))
ov_headers = [
hdr_cell("Poison", C_MID),
hdr_cell("Other Names"),
hdr_cell("Active Principle(s)"),
hdr_cell("MOA"),
hdr_cell("Fatal Dose"),
hdr_cell("Fatal Period"),
]
ov_rows = [
[
data_cell("Nerium odorum", fc=C_ACCENT, bold=True),
data_cell("White Oleander, Kaner"),
data_cell("Neriodorin, Neriodorein, Karabin"),
data_cell("Cardiac glycosides → heart failure; karabin acts like strychnine on spinal cord"),
data_cell("~15 g root"),
data_cell("~24 hrs"),
],
[
data_cell("Cerbera thevetia", fc=C_LTBLUE, bold=True),
data_cell("Yellow Oleander, Pila Kaner"),
data_cell("Thevetin, Thevotoxin, Cerberin"),
data_cell("Thevetin = powerful cardiac poison; thevotoxin resembles digitalis; cerberin acts like strychnine"),
data_cell("8–10 seeds or 15–20 g root"),
data_cell("~24 hrs"),
],
[
data_cell("Cerbera odollam", fc=C_GREEN, bold=True),
data_cell("Dabur, Dhakur, Pilikirbir"),
data_cell("Cerberin (glycoside), Cerebroside (weak alkaloid)"),
data_cell("Digitalis-like action → cardiac toxicity + GI irritation"),
data_cell("Kernel of 1 fruit"),
data_cell("1–2 days"),
],
[
data_cell("Aconite", fc=C_SUBHDR, bold=True),
data_cell("Mithazahar, Mitha Bish, Monkshood (Aconitum napellus)"),
data_cell("Aconitine (chief), Piraconitine, Pseudoaconitine, Aconine"),
data_cell("Stimulates then depresses myocardium, smooth/skeletal muscles, CNS, peripheral nerves"),
data_cell("1 g root; 250 mg extract; 4 mg alkaloid"),
data_cell("~6 hrs"),
],
[
data_cell("Hydrocyanic Acid & Salts", fc=C_ORANGE, bold=True),
data_cell("HCN, Prussic acid, Cyanogen; Salts: KCN, NaCN"),
data_cell("HCN (cyanide ion)"),
data_cell("Inhibits cytochrome oxidase → histotoxic hypoxia (cells cannot use O₂)"),
data_cell("50–60 mg pure acid; 200 mg KCN"),
data_cell("Seconds–10 min (acid); 30 min (KCN)"),
],
[
data_cell("Cleistanthus collinus", fc=colors.HexColor("#16a085"), bold=True),
data_cell("Oduvan (Tamil), Garari (Hindi)"),
data_cell("Cleistanthin A & B, Diphyllin (arylnaphthalene lignans)"),
data_cell("Inhibits Na⁺/K⁺-ATPase → cardiac arrhythmias; also causes hypokalaemia, metabolic acidosis"),
data_cell("Leaves/bark decoction — variable"),
data_cell("Hours to days"),
],
]
ov_col_w = [2.8*cm, 2.8*cm, 3.3*cm, 4.3*cm, 2.2*cm, 2.2*cm]
ov_data = [ov_headers] + ov_rows
ov_tbl = Table(ov_data, colWidths=ov_col_w, repeatRows=1)
ov_tbl.setStyle(TableStyle(TABLE_STYLE_BASE + [
("BACKGROUND", (0,0),(-1,0), C_MID),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,0), 8.5),
("TEXTCOLOR", (0,0),(-1,0), C_WHITE),
("ALIGN", (0,0),(-1,0), "CENTER"),
]))
story.append(ov_tbl)
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════════════════════
# DETAILED CARDS — each plant/poison
# ══════════════════════════════════════════════════════════════
def make_detail_card(name, color, synonyms, source, active_principles,
symptoms, fatal_info, treatment, pm_findings, medico_legal):
"""Build a 'card' table for one poison."""
elements = []
# Name banner
name_tbl = Table([[Paragraph(f"<b>{name}</b>", ParagraphStyle("cn", fontSize=11,
textColor=C_WHITE, fontName="Helvetica-Bold", leading=14)),
Paragraph(f"<i>{synonyms}</i>", ParagraphStyle("cs", fontSize=8.2,
textColor=C_GOLD, fontName="Helvetica-Oblique", leading=11))
]], colWidths=[6*cm, 11.7*cm])
name_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), 6),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
]))
elements.append(name_tbl)
# Two-column detail
left_rows = [
[data_cell("Source / Active Principles", bold=True, fc=color),
data_cell(active_principles)],
[data_cell("Symptoms & Signs", bold=True, fc=color),
data_cell(symptoms)],
[data_cell("Fatal Dose / Period", bold=True, fc=C_ACCENT),
data_cell(fatal_info, fc=C_ACCENT, bold=True)],
[data_cell("Treatment", bold=True, fc=C_GREEN),
data_cell(treatment)],
[data_cell("P/M Findings", bold=True, fc=C_LTBLUE),
data_cell(pm_findings)],
[data_cell("Medico-Legal Aspects", bold=True, fc=C_SUBHDR),
data_cell(medico_legal)],
]
detail_tbl = Table(left_rows, colWidths=[3.4*cm, 14.3*cm])
detail_tbl.setStyle(TableStyle([
("GRID",(0,0),(-1,-1), 0.35, colors.HexColor("#bdc3c7")),
("ROWBACKGROUNDS",(0,0),(-1,-1),[colors.HexColor("#fdfefe"), colors.HexColor("#f0f3f4")]),
("VALIGN",(0,0),(-1,-1),"TOP"),
("LEFTPADDING",(0,0),(-1,-1),4),
("RIGHTPADDING",(0,0),(-1,-1),4),
("TOPPADDING",(0,0),(-1,-1),3),
("BOTTOMPADDING",(0,0),(-1,-1),3),
("BACKGROUND",(0,0),(0,-1), colors.HexColor("#f8f9fa")),
]))
elements.append(detail_tbl)
elements.append(Spacer(1, 6))
return KeepTogether(elements)
# ─── 1. NERIUM ODORUM ─────────────────────────────────────────
story.append(Paragraph("■ DETAILED PROFILES", section_hdr))
story.append(make_detail_card(
name="1. Nerium odorum (White Oleander / Kaner)",
color=C_ACCENT,
synonyms="Family: Apocynaceae | Variously: True Oleander, White Kaner",
source="Plant",
active_principles=(
"<b>Source:</b> All parts poisonous (root, leaves, flowers, seeds, bark).<br/>"
"<b>Active principles:</b> Three glycosides — <b>Neriodorin</b> (acts like digitalis), "
"<b>Neriodorein</b> (causes muscular twitchings/tetanic spasms > strychnine), "
"<b>Karabin</b> (acts on heart like digitalis AND on spinal cord like strychnine)."
),
symptoms=(
"Vomiting, abdominal pain, frothy salivation, restlessness. "
"Pulse slow and weak; respirations hurried. Difficulty swallowing, lockjaw. "
"Muscular twitchings → tetanic spasms (often one-sided). "
"Exhaustion → drowsiness → coma → <b>death from heart failure</b>."
),
fatal_info="Fatal dose: ~15 g of root (adult). Fatal period: ~24 hours.",
treatment=(
"Gastric lavage + symptom management. Anaesthetic usually necessary. "
"Morphine injection beneficial. No specific antidote."
),
pm_findings=(
"Non-specific. <b>Petechial haemorrhages on heart</b> (characteristic). "
"<b>Nerium odorum resists heat</b> — detectable even from burnt remains."
),
medico_legal=(
"Suicide (decoction of root/leaves/fruit) common in village girls (dowry problems). "
"Root used as abortifacient. Accidental: used as love philter, external remedy for swellings, "
"treatment for venereal diseases/cancer growths. Cattle poison (mixed with fodder / rectal application). "
"Used as abortion stick (twig inserted into OS)."
)
))
# ─── 2. CERBERA THEVETIA ─────────────────────────────────────
story.append(make_detail_card(
name="2. Cerbera thevetia (Yellow Oleander / Pila Kaner)",
color=C_LTBLUE,
synonyms="Also: Thevetia peruviana | Family: Apocynaceae",
source="Plant",
active_principles=(
"<b>Source:</b> All parts, especially the milky juice and kernel seeds (triangular nut, pale yellow seeds).<br/>"
"<b>Active principles:</b> <b>Thevetin</b> (powerful cardiac poison — from kernels and milky juice), "
"<b>Thevotoxin</b> (resembles digitalis glycosides — from kernels), "
"<b>Cerberin</b> (strychnine-like action — from milky juice)."
),
symptoms=(
"Burning sensation in mouth, tingling of tongue, dryness of throat. "
"Vomiting, diarrhoea, headache, dizziness. Dilated pupils. "
"Irregular cardiac action (digitalis-like). Drowsiness → collapse → coma → death. "
"Tetanic convulsions occasionally."
),
fatal_info="Fatal dose: 8–10 seeds or 15–20 g root. Fatal period: within 24 hours.",
treatment=(
"Same as Nerium odorum (gastric lavage, symptom management). "
"Good results: IV molar sodium lactate (combat acidosis) + 5% glucose with "
"atropine 1.2 mg + adrenaline 2 ml 1:1000 + noradrenaline 2 mg (if BP low) to counteract heart block."
),
pm_findings=(
"GI irritation signs, congestion of organs, generalised venous engorgement, "
"<b>subendocardial ecchymoses</b>. "
"<b>Yellow oleander resists putrefaction</b> — detectable years after death in exhumed bodies."
),
medico_legal=(
"Root and seeds used for suicide (women, dowry problems). Also used for abortion. "
"Cattle poisoning: seeds crushed, mixed with fodder. "
"Medico-legal advantage: resists putrefaction, useful for exhumation cases."
)
))
# ─── 3. CERBERA ODOLLAM ──────────────────────────────────────
story.append(make_detail_card(
name="3. Cerbera odollam (Dabur / Dhakur / Pilikirbir)",
color=C_GREEN,
synonyms="Family: Apocynaceae | Suicide tree | Grows wild on seacoasts of India",
source="Plant",
active_principles=(
"<b>Source:</b> All parts; toxic milky juice. Fruits resemble unripe mangoes.<br/>"
"<b>Active principles:</b> <b>Cerberin</b> (cardiac glycoside) + "
"<b>Cerebroside</b> (weak alkaloid) — both have digitalis-like action."
),
symptoms=(
"GI irritation: bitter taste, nausea, vomiting, abdominal pain, diarrhoea. "
"Followed by: irregular respiration, general weakness, <b>bradycardia</b>, "
"collapse → <b>death from heart failure</b>."
),
fatal_info="Fatal dose: kernel of ONE fruit. Fatal period: 1–2 days.",
treatment=(
"Same as Cerbera thevetia. Atropine for bradycardia. IV fluids. Symptomatic support."
),
pm_findings=(
"Signs of cardiac failure. GI irritation signs. Milky latex may be identified in gastric contents."
),
medico_legal=(
"Suicide: common in <b>Tamil Nadu & Kerala</b> — women eat kernel for suicide (dowry problems). "
"Accidental: children eat fruit mistaking it for edible fruit. "
"Homicidal: powdered kernel may be added to alcohol. "
"Known as 'the suicide tree' — one of the most common suicidal plants in S. India."
)
))
# ─── 4. ACONITE ──────────────────────────────────────────────
story.append(make_detail_card(
name="4. Aconite (Mithazahar / Mitha Bish / Monkshood)",
color=C_SUBHDR,
synonyms="Aconitum napellus | Family: Ranunculaceae | Indian varieties: A. ferox (Bikh), A. charmanthum, A. spicatum",
source="Plant",
active_principles=(
"<b>Source:</b> All parts; root is most potent (dry root — dark brown externally, white internally, "
"turns pink on air exposure; acrid sweetish taste = 'Mitha Bish').<br/>"
"<b>Active principles (from A. napellus):</b> <b>Aconitine</b> (chief alkaloid — very potent), "
"Piraconitine, Pseudoaconitine, Aconine.<br/>"
"From A. ferox: Pseudoaconitine (Veratroyl-aconine). "
"<b>Action:</b> Stimulates THEN depresses myocardium, smooth muscles, skeletal muscles, CNS, peripheral nerves."
),
symptoms=(
"<b>Immediate:</b> Tingling and numbness of lips, mouth, tongue, pharynx → extends over whole body. "
"Salivation, nausea, vomiting, diarrhoea. "
"Giddiness, impaired vision/speech, limb weakness. "
"Twitching → convulsions. "
"<b>Cardiac:</b> Pulse slow and irregular (vagal stimulation) → collapse. "
"Breathing: rapid → slow, laboured, shallow. "
"Pupils: alternately contract/dilate → fixed dilated (late). "
"<b>Mind remains clear till the end.</b> "
"Death: cardiac arrhythmia or respiratory paralysis."
),
fatal_info="1 g root; 250 mg extract; 25 drops tincture; 4 mg alkaloid. Fatal period: ~6 hours.",
treatment=(
"Gastric lavage with tannic acid 10g/2L or KMnO₄ 1:1000 or strong tea. "
"Atropine 1 mg SC (heart support). Digitalin 0.25 mg SC. "
"Novocaine 50 mL of 0.1% IV (slow) for arrhythmias. "
"Artificial respiration + O₂. Symptomatic treatment."
),
pm_findings=(
"<b>Not characteristic.</b> Plant/root remnants in gastric contents. "
"Chloroform odour if liniment swallowed. "
"<b>Aconite largely destroyed in body and by alkalis</b> — very difficult to detect after death. "
"Vomit must be preserved in <b>acidified spirit</b> (acetic acid + rectified spirit 1:2)."
),
medico_legal=(
"One of the most potent poisons known. "
"<b>Accidental:</b> Root mistaken for horse-radish; quack remedies; liniment application/drinking; added to liquor. "
"<b>Homicidal (not uncommon):</b> Given with betel leaf (masks tingling taste); mixed with pink drinks (masks colour); "
"mixed with sweets. Used as arrow poison by tribals. Cattle poison. Abortifacient. "
"<b>Advantages as homicidal poison:</b> cheap, easily available, small lethal dose, short fatal period, "
"colour disguisable, taste maskable, largely destroyed in body (difficult to detect by chemical analysis)."
)
))
# ─── 5. HYDROCYANIC ACID & SALTS ────────────────────────────
story.append(make_detail_card(
name="5. Hydrocyanic Acid (HCN) & Its Salts",
color=C_ORANGE,
synonyms="Prussic acid, Cyanogen | Salts: Potassium cyanide (KCN), Sodium cyanide (NaCN), Mercury cyanide",
source="Chemical",
active_principles=(
"<b>Nature:</b> HCN = colourless gas with bitter almond odour (volatile); liquid form also colourless and highly volatile. "
"Pharmacopoeial prep = ~2% anhydrous acid; Scheele's acid = 4% (veterinary).<br/>"
"<b>Natural occurrence:</b> Found in fruits (peach, plum, bitter almonds) as glycoside <b>amygdalin</b> "
"(harmless until hydrolysed by emulsin enzyme → liberates HCN).<br/>"
"<b>Industrial uses:</b> Photography, electroplating, metallurgy, tanning, fumigation, agriculture.<br/>"
"<b>Note:</b> 20–40% of population cannot smell bitter almonds (sex-linked recessive trait)."
),
symptoms=(
"<b>Gas inhalation (large dose):</b> Instantaneous death — victim may cork bottle or walk distance first.<br/>"
"<b>Liquid/small dose:</b> Headache, confusion, giddiness, nausea, loss of muscle power, "
"bitter almond smell in breath, violent convulsions → unconsciousness → death. Fine froth at mouth.<br/>"
"<b>KCN ingestion:</b> Onset 10–20 min (HCl liberates HCN). Giddiness, dyspnoea, fixed dilated pupils, "
"convulsions, muscle weakness. Corrosive effect on mouth/throat/stomach. Epigastric pain, vomiting. "
"Face cyanosed, jaw clenched, froth at mouth, spasmodic respirations. "
"<b>Death: respiratory paralysis.</b><br/>"
"<b>Chronic:</b> Headache, vomiting, diarrhoea, cachexia, mental disturbances (photographers, gilders)."
),
fatal_info=(
"HCN (pure acid): 50–60 mg. Pharmacopoeial prep: 30 drops. Crude oil of bitter almonds: 60 drops. "
"KCN: 200 mg. Fatal period: seconds–10 min (HCN acid); ~30 min (KCN)."
),
treatment=(
"<b>Antidotes — convert Hb to metHb (cyanide binds metHb instead of cytochrome oxidase):</b><br/>"
"1. <b>Dicobalt tetracemate (Kelocyanor)</b> 2×20 mL of 1.5% IV + 20 mL 50% glucose.<br/>"
"2. <b>Methylene blue</b> 50 mL of 1% IV — converts Hb → metHb.<br/>"
"3. <b>Hydroxocobalamin</b> 50 mg/kg IV — combines with CN⁻ → cyanocobalamin (excreted in urine).<br/>"
"4. <b>Ingestion (KCN/dilute HCN):</b> Lavage with 5–10% sodium thiosulphate OR ferrous/ferric sulphate + K₂CO₃ → Prussian blue (inert).<br/>"
"5. <b>Inhalation:</b> Remove from source; 100% O₂ + artificial respiration; IV sodium nitrite + sodium thiosulphate (repeat if symptoms return).<br/>"
"6. Mercury cyanide: BAL injection.<br/>"
"Survival beyond 4 hours usually = recovery."
),
pm_findings=(
"<b>External:</b> Smell of bitter almonds from body. Irregular pink patches on face/body surface. "
"Skin livid or cyanosed; nails blue. Fine froth at mouth. Bright glistening eyes, dilated pupils. "
"<b>PM staining pink</b> (often incorrectly called 'cherry red'). Early rigor mortis (if convulsions).<br/>"
"<b>Internal:</b> Bitter almond smell in stomach/serous cavities/brain. Pink gastric mucosa. "
"Pink organs + blood (impeded tissue oxygenation + cyanmetHb). "
"Blood-stained froth in trachea/bronchi. Hyperaemic brain/meninges. "
"Petechial haemorrhages in pleura, pericardium, brain, meninges, lungs.<br/>"
"<b>KCN:</b> Gastric mucosa discoloured brown/grey (corrosive effect)."
),
medico_legal=(
"Principally used as <b>suicidal</b> agent (cyanides ~3× more potent than HCN per unit). "
"Accidental: occupational exposure (photographers, gilders, chemists, fumigators). "
"HCN used in gas chambers (historical). "
"<b>Caution at autopsy:</b> Precautions needed to prevent HCN inhalation from stomach contents; "
"rubber gloves essential."
)
))
# ─── 6. CLEISTANTHUS COLLINUS ────────────────────────────────
story.append(make_detail_card(
name="6. Cleistanthus collinus (Oduvan / Garari)",
color=colors.HexColor("#16a085"),
synonyms="Oduvan (Tamil), Karada (Telugu), Garari/Kalianee (Hindi) | Family: Euphorbiaceae",
source="Plant",
active_principles=(
"<b>Source:</b> Leaves and bark (used as decoction). Grows in South India and Sri Lanka.<br/>"
"<b>Active principles:</b> Arylnaphthalene lignans — <b>Cleistanthin A, Cleistanthin B</b>, "
"<b>Diphyllin</b> (most toxic), Collinusin.<br/>"
"<b>MOA:</b> Inhibits Na⁺/K⁺-ATPase → similar to cardiac glycosides → arrhythmias. "
"Also causes hypokalaemia, metabolic acidosis, and renal tubular acidosis (type 1 RTA)."
),
symptoms=(
"<b>GI:</b> Nausea, vomiting, abdominal pain (early). "
"<b>Cardiovascular:</b> Sinus bradycardia, heart block, ventricular arrhythmias, cardiac arrest. "
"<b>Neurological:</b> Altered sensorium, seizures. "
"<b>Respiratory:</b> Respiratory failure. "
"<b>Metabolic:</b> Hypokalaemia (characteristic!), metabolic acidosis, hyponatraemia. "
"Muscle weakness, paralysis. Oliguria/anuria (renal failure). "
"Death: cardiac failure or respiratory failure."
),
fatal_info="Variable — decoction of leaves/bark. No fixed established fatal dose in humans.",
treatment=(
"Gastric lavage (early). Activated charcoal. "
"Aggressive correction of <b>hypokalaemia</b> (IV KCl — key treatment). "
"Correction of metabolic acidosis (IV sodium bicarbonate). "
"Cardiac monitoring (ECG). Antiarrhythmics for ventricular arrhythmias. "
"Dialysis for renal failure. Supportive care. "
"<b>No specific antidote.</b>"
),
pm_findings=(
"Non-specific. Signs of cardiac failure and multi-organ failure. "
"Petechial haemorrhages (cardiac and pulmonary). "
"Chemical analysis of blood/urine for lignans (TLC/HPLC). "
"Leaf/bark fragments may be found in gastric contents."
),
medico_legal=(
"Predominantly seen in <b>South India</b> (Tamil Nadu, Andhra Pradesh). "
"Mostly <b>suicidal</b> (women, tribal populations). "
"Accidental (mistaken identity, quack remedies). "
"Characteristic <b>hypokalaemia + metabolic acidosis + cardiac arrhythmias</b> triad points to diagnosis. "
"One of the most important regional cardiac poisons in forensic practice in South India."
)
))
# ══════════════════════════════════════════════════════════════
# COMPARISON / EXAM TIPS TABLE
# ══════════════════════════════════════════════════════════════
story.append(Paragraph("■ KEY EXAM COMPARISONS & MNEMONICS", section_hdr))
comp_hdrs = [
hdr_cell("Feature", C_MID),
hdr_cell("Nerium odorum"),
hdr_cell("C. thevetia"),
hdr_cell("C. odollam"),
hdr_cell("Aconite"),
hdr_cell("HCN/Cyanide"),
hdr_cell("C. collinus"),
]
comp_rows = [
[data_cell("Family", bold=True),
data_cell("Apocynaceae"), data_cell("Apocynaceae"),
data_cell("Apocynaceae"), data_cell("Ranunculaceae"),
data_cell("Inorganic acid"), data_cell("Euphorbiaceae")],
[data_cell("Active class", bold=True),
data_cell("Glycosides"), data_cell("Glycosides"),
data_cell("Glycoside + alkaloid"), data_cell("Alkaloid (aconitine)"),
data_cell("CN⁻ ion"), data_cell("Lignan")],
[data_cell("Unique sign", bold=True),
data_cell("Petechiae on heart; resists heat"),
data_cell("Resists putrefaction"),
data_cell("Fruit resembles mango"),
data_cell("Mind clear till end; tingling"),
data_cell("Bitter almond smell; pink PM staining"),
data_cell("Hypokalaemia + RTA")],
[data_cell("PM detection", bold=True),
data_cell("Detected from burnt remains"),
data_cell("Detectable years after exhumation"),
data_cell("Milky latex in GI"),
data_cell("Difficult — destroyed in body"),
data_cell("Smell; pink lividity"),
data_cell("TLC/HPLC for lignans")],
[data_cell("Common use", bold=True),
data_cell("Suicide/cattle poison/abortifacient"),
data_cell("Suicide/cattle/abortion"),
data_cell("Suicide (TN, Kerala)"),
data_cell("Homicide / arrow poison"),
data_cell("Suicide / accidental (occupational)"),
data_cell("Suicide (S. India)")],
[data_cell("Antidote", bold=True),
data_cell("None specific; atropine"),
data_cell("Na lactate + atropine"),
data_cell("None specific; atropine"),
data_cell("Atropine; novocaine"),
data_cell("Kelocyanor; hydroxocobalamin"),
data_cell("IV KCl (hypokalaemia)")],
]
comp_data = [comp_hdrs] + comp_rows
comp_tbl = Table(comp_data, colWidths=[2.4*cm, 2.5*cm, 2.5*cm, 2.5*cm, 2.5*cm, 2.5*cm, 2.8*cm])
comp_tbl.setStyle(TableStyle(TABLE_STYLE_BASE + [
("BACKGROUND",(0,0),(-1,0), C_MID),
("TEXTCOLOR",(0,0),(-1,0), C_WHITE),
("FONTNAME",(0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,0), 8),
("BACKGROUND",(0,1),(0,-1), colors.HexColor("#f8f9fa")),
]))
story.append(comp_tbl)
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════════════════════
# MECHANISM OF CARDIAC GLYCOSIDE TOXICITY BOX
# ══════════════════════════════════════════════════════════════
story.append(Paragraph("■ MECHANISM: CARDIAC GLYCOSIDE POISONS (Oleanders, Cerbera spp.)", section_hdr))
moa_text = (
"All oleander/Cerbera poisons share the same fundamental mechanism: <b>inhibition of Na⁺/K⁺-ATPase pump</b> "
"→ ↑ intracellular Na⁺ → ↑ intracellular Ca²⁺ (via Na⁺/Ca²⁺ exchanger) → positive inotropy initially, "
"then: <b>↑ automaticity + ↓ conduction velocity + bradycardia + heart block → ventricular fibrillation → death.</b><br/>"
"The vagal stimulation effect causes early bradycardia. Clinically resembles <b>digitalis toxicity</b>. "
"Treatment cornerstone: <b>atropine</b> (for bradycardia) + electrolyte correction + ECG monitoring."
)
moa_data = [[Paragraph(moa_text, body)]]
moa_tbl = Table(moa_data, colWidths=[17.7*cm])
moa_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(0,0), colors.HexColor("#fef9e7")),
("BOX",(0,0),(-1,-1), 1, C_GOLD),
("TOPPADDING",(0,0),(0,0), 6),
("BOTTOMPADDING",(0,0),(0,0), 6),
("LEFTPADDING",(0,0),(0,0), 8),
("RIGHTPADDING",(0,0),(0,0), 8),
]))
story.append(moa_tbl)
story.append(Spacer(1, 6))
# ══════════════════════════════════════════════════════════════
# HCN MECHANISM BOX
# ══════════════════════════════════════════════════════════════
hcn_text = (
"<b>HCN Mechanism:</b> CN⁻ binds <b>cytochrome c oxidase</b> (complex IV, mitochondrial electron transport chain) "
"→ blocks cellular respiration → <b>histotoxic hypoxia</b> (tissues cannot utilise O₂ despite adequate delivery). "
"Cells shift to anaerobic metabolism → lactic acidosis. "
"Cells with highest O₂ demand (brain, heart) affected first. "
"Blood remains oxygenated → venous blood bright red (pink PM staining, NOT cherry red). "
"KCN must first be converted by gastric HCl to HCN before absorption."
)
hcn_data = [[Paragraph(hcn_text, body)]]
hcn_tbl = Table(hcn_data, colWidths=[17.7*cm])
hcn_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(0,0), colors.HexColor("#fdebd0")),
("BOX",(0,0),(-1,-1), 1, C_ORANGE),
("TOPPADDING",(0,0),(0,0), 6),
("BOTTOMPADDING",(0,0),(0,0), 6),
("LEFTPADDING",(0,0),(0,0), 8),
("RIGHTPADDING",(0,0),(0,0), 8),
]))
story.append(hcn_tbl)
story.append(Spacer(1, 6))
# ══════════════════════════════════════════════════════════════
# FOOTER
# ══════════════════════════════════════════════════════════════
footer_text = (
"<b>Sources:</b> Parikh's Textbook of Medical Jurisprudence, Forensic Medicine & Toxicology (pp. 694–700, 583–585) | "
"The Essentials of Forensic Medicine & Toxicology, 36th Edition (2026) | "
"P.C. Dikshit Textbook of Forensic Medicine & Toxicology"
)
footer_data = [[Paragraph(footer_text, ParagraphStyle("ft", fontSize=7, textColor=colors.HexColor("#7f8c8d"),
leading=10, alignment=TA_CENTER))]]
footer_tbl = Table(footer_data, colWidths=[17.7*cm])
footer_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(0,0), colors.HexColor("#f2f3f4")),
("BOX",(0,0),(-1,-1), 0.5, colors.HexColor("#bdc3c7")),
("TOPPADDING",(0,0),(0,0), 5),
("BOTTOMPADDING",(0,0),(0,0), 5),
]))
story.append(footer_tbl)
# ══════════════════════════════════════════════════════════════
# BUILD PDF
# ══════════════════════════════════════════════════════════════
doc.build(story)
print(f"✅ PDF created: {OUTPUT}")
cd /home/daytona/workspace/cardiac-poisons && python make_revision_card.py 2>&1
Cardiac Poisons Revision Card
PDF Document · PDF
| Poison | Key Highlight |
|---|---|
| Nerium odorum (White Oleander) | Petechial haemorrhages on heart; resists heat - detectable from burnt remains |
| Cerbera thevetia (Yellow Oleander) | Resists putrefaction - detectable years after exhumation |
| Cerbera odollam | "Suicide tree"; fatal dose = kernel of ONE fruit; common in Tamil Nadu & Kerala |
| Aconite | Mind clear till death; hard to detect chemically; classic homicidal poison |
| Hydrocyanic Acid & Salts | Bitter almond smell; pink PM staining (NOT cherry red); 3 antidotes detailed |
| Cleistanthus collinus | Hypokalaemia + metabolic acidosis triad; South India regional poison |