mkdir -p /tmp/workspace/marrow-notes && cat > /tmp/workspace/marrow-notes/generate_pdf.py << 'PYEOF'
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, PageBreak, KeepTogether)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
# ── Output file ──────────────────────────────────────────────────────────────
OUTPUT = "/tmp/workspace/marrow-notes/NEET_PG_Marrow_Notes.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="NEET PG High-Yield Marrow Notes",
author="Orris AI"
)
W, H = A4
# ── Colour palette ────────────────────────────────────────────────────────────
C_NAVY = colors.HexColor("#1a237e")
C_TEAL = colors.HexColor("#00838f")
C_AMBER = colors.HexColor("#e65100")
C_GREEN = colors.HexColor("#2e7d32")
C_PINK = colors.HexColor("#ad1457")
C_LGREY = colors.HexColor("#f5f5f5")
C_DGREY = colors.HexColor("#424242")
C_THEAD = colors.HexColor("#0d47a1")
C_TROW1 = colors.HexColor("#e3f2fd")
C_TROW2 = colors.white
C_MNEMROW = colors.HexColor("#fff8e1")
C_WARN = colors.HexColor("#fff3e0")
C_BORDER = colors.HexColor("#bbdefb")
# ── Styles ────────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, **kw):
s = ParagraphStyle(name, **kw)
return s
title_style = S("Title",
fontSize=22, fontName="Helvetica-Bold",
textColor=C_NAVY, alignment=TA_CENTER, spaceAfter=4)
subtitle_style = S("Subtitle",
fontSize=11, fontName="Helvetica",
textColor=C_TEAL, alignment=TA_CENTER, spaceAfter=18)
h1_style = S("H1",
fontSize=14, fontName="Helvetica-Bold",
textColor=colors.white, backColor=C_NAVY,
leading=20, spaceBefore=14, spaceAfter=4,
leftIndent=-5, rightIndent=-5,
borderPadding=(4,6,4,6))
h2_style = S("H2",
fontSize=11, fontName="Helvetica-Bold",
textColor=C_TEAL, spaceBefore=10, spaceAfter=3,
borderPadding=(2,0,2,0))
h3_style = S("H3",
fontSize=10, fontName="Helvetica-Bold",
textColor=C_AMBER, spaceBefore=6, spaceAfter=2)
body_style = S("Body",
fontSize=8.5, fontName="Helvetica",
textColor=C_DGREY, leading=13,
spaceBefore=1, spaceAfter=1)
bullet_style = S("Bullet",
fontSize=8.5, fontName="Helvetica",
textColor=C_DGREY, leading=12,
leftIndent=14, firstLineIndent=-10,
spaceBefore=1, spaceAfter=1)
mnemonic_style = S("Mnemonic",
fontSize=8.5, fontName="Helvetica-BoldOblique",
textColor=C_AMBER, backColor=C_MNEMROW,
leading=13, leftIndent=8, rightIndent=8,
borderPadding=6, spaceBefore=4, spaceAfter=4)
footer_style = S("Footer",
fontSize=7, fontName="Helvetica",
textColor=colors.grey, alignment=TA_CENTER)
def strat_style_fn(col):
styles = [S(f"Strat{col}",
fontSize=8.5, fontName="Helvetica-Bold" if col==0 else "Helvetica",
textColor=C_NAVY if col==0 else C_DGREY,
leading=12, alignment=TA_LEFT)]
return styles[0]
# ── Helper functions ───────────────────────────────────────────────────────────
def section_header(title):
"""Returns a styled section header paragraph."""
return Paragraph(f" {title}", h1_style)
def sub_header(title):
return Paragraph(title, h2_style)
def sub3_header(title):
return Paragraph(title, h3_style)
def bp(text):
"""Bullet point."""
return Paragraph(f"<bullet>•</bullet> {text}", bullet_style)
def mn(text):
"""Mnemonic box."""
return Paragraph(f"<b>Mnemonic:</b> {text}", mnemonic_style)
def body(text):
return Paragraph(text, body_style)
def spacer(h=4):
return Spacer(1, h*mm)
def hr(color=C_BORDER):
return HRFlowable(width="100%", thickness=0.5, color=color, spaceAfter=2, spaceBefore=2)
def make_table(header_row, data_rows, col_widths=None, zebra=True):
"""Creates a styled table."""
all_rows = [header_row] + data_rows
if col_widths is None:
n = len(header_row)
avail = W - 3.6*cm
col_widths = [avail/n]*n
# Build cell styles
style = [
# Header
('BACKGROUND', (0,0), (-1,0), C_THEAD),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,0), 8),
('ALIGN', (0,0), (-1,0), 'CENTER'),
('BOTTOMPADDING', (0,0), (-1,0), 5),
('TOPPADDING', (0,0), (-1,0), 5),
# Body
('FONTNAME', (0,1), (-1,-1), 'Helvetica'),
('FONTSIZE', (0,1), (-1,-1), 7.5),
('TOPPADDING', (0,1), (-1,-1), 3),
('BOTTOMPADDING', (0,1), (-1,-1), 3),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('GRID', (0,0), (-1,-1), 0.3, C_BORDER),
]
if zebra:
for i in range(1, len(all_rows)):
bg = C_TROW1 if i % 2 == 1 else C_TROW2
style.append(('BACKGROUND', (0,i), (-1,i), bg))
# Wrap strings in Paragraphs for word-wrap
wrapped = []
for ri, row in enumerate(all_rows):
new_row = []
for ci, cell in enumerate(row):
if ri == 0:
p = Paragraph(str(cell), S(f"th{ri}{ci}",
fontSize=8, fontName="Helvetica-Bold",
textColor=colors.white, alignment=TA_CENTER, leading=10))
else:
p = Paragraph(str(cell), S(f"td{ri}{ci}",
fontSize=7.5, fontName="Helvetica",
textColor=C_DGREY, leading=10))
new_row.append(p)
wrapped.append(new_row)
t = Table(wrapped, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle(style))
return t
# ── Cover page ────────────────────────────────────────────────────────────────
story = []
story.append(spacer(20))
story.append(Paragraph("NEET PG LAST 15 DAYS", title_style))
story.append(Paragraph("HIGH-YIELD MARROW REVISION NOTES", title_style))
story.append(spacer(4))
story.append(Paragraph("All Subjects | Mix of Bullets + Tables + Mnemonics", subtitle_style))
story.append(HRFlowable(width="60%", thickness=2, color=C_TEAL, spaceAfter=6, hAlign='CENTER'))
story.append(spacer(6))
cover_data = [
["Coverage", "All major subjects"],
["Format", "Bullets, Tables & Mnemonics"],
["Exam Focus", "NEET PG / INI-CET"],
["Purpose", "Last 15-day rapid revision"],
]
cover_style = [
('BACKGROUND', (0,0), (0,-1), C_NAVY),
('TEXTCOLOR', (0,0), (0,-1), colors.white),
('FONTNAME', (0,0), (0,-1), 'Helvetica-Bold'),
('FONTNAME', (1,0), (1,-1), 'Helvetica'),
('FONTSIZE', (0,0), (-1,-1), 9),
('ALIGN', (0,0), (-1,-1), 'LEFT'),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 10),
('BACKGROUND', (1,0), (1,-1), C_LGREY),
('GRID', (0,0), (-1,-1), 0.5, C_BORDER),
]
avail = W - 3.6*cm
ct = Table([[Paragraph(r[0], S("cv0", fontSize=9, fontName="Helvetica-Bold", textColor=colors.white, leading=12)),
Paragraph(r[1], S("cv1", fontSize=9, fontName="Helvetica", textColor=C_DGREY, leading=12))]
for r in cover_data],
colWidths=[avail*0.3, avail*0.7])
ct.setStyle(TableStyle(cover_style))
story.append(ct)
story.append(spacer(8))
story.append(Paragraph("Generated by Orris AI | July 2026", footer_style))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 1. ANATOMY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("1. ANATOMY"))
story.append(spacer(3))
story.append(sub_header("High-Yield Nerve Injuries"))
nerves = [
["Nerve", "Lesion Site", "Deformity / Loss"],
["Long thoracic (C5,6,7)", "Serratus anterior", "Winging of scapula"],
["Axillary nerve", "Surgical neck of humerus", "Deltoid loss + badge area sensory loss"],
["Radial nerve", "Spiral groove", "Wrist drop"],
["Ulnar nerve", "Medial epicondyle", "Claw hand (ring + little fingers)"],
["Median nerve", "Carpal tunnel", "Ape thumb deformity; LOAF muscles lost"],
["Common peroneal", "Fibular neck", "Foot drop"],
["Femoral nerve", "Inguinal region", "Loss of knee jerk, quad weakness"],
]
story.append(make_table(nerves[0], nerves[1:], col_widths=[avail*0.28, avail*0.32, avail*0.40]))
story.append(spacer(4))
story.append(mn("C5,6,7 keeps the wing off heaven (Long thoracic nerve)"))
story.append(spacer(4))
story.append(sub_header("Skull Foramina"))
foramina = [
["Foramen", "Contents"],
["Foramen ovale", "V3, lesser petrosal nerve, accessory meningeal artery"],
["Foramen spinosum", "Middle meningeal artery"],
["Foramen rotundum", "V2 (maxillary)"],
["Jugular foramen", "CN IX, X, XI + sigmoid sinus"],
["Stylomastoid foramen", "CN VII (facial nerve exits)"],
]
story.append(make_table(foramina[0], foramina[1:]))
story.append(spacer(4))
story.append(mn("Carpal bones: She Looks Too Pretty, Try To Catch Her (Scaphoid, Lunate, Triquetrum, Pisiform, Trapezium, Trapezoid, Capitate, Hamate)"))
story.append(spacer(8))
# ═══════════════════════════════════════════════════════════════════════════════
# 2. PHYSIOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("2. PHYSIOLOGY"))
story.append(spacer(3))
story.append(sub_header("Action Potential Key Values"))
for txt in [
"Resting membrane potential = <b>-70 mV</b>",
"Threshold = <b>-55 mV</b>",
"Depolarization = Na+ IN (voltage-gated Na+ channels open)",
"Repolarization = K+ OUT",
"Absolute refractory period = Na+ channels inactivated (no stimulus works)",
]:
story.append(bp(txt))
story.append(spacer(4))
story.append(sub_header("Lung Volumes"))
lungs = [
["Volume / Capacity", "Value"],
["Tidal Volume (TV)", "500 mL"],
["IRV", "3000 mL"],
["ERV", "1100 mL"],
["RV", "1200 mL"],
["FRC = ERV + RV", "2300 mL"],
["Vital Capacity", "4600 mL"],
["TLC", "5800 mL"],
]
story.append(make_table(lungs[0], lungs[1:]))
story.append(bp("<b>RV cannot be measured by spirometry</b> (use body plethysmography or helium dilution)"))
story.append(spacer(4))
story.append(sub_header("GFR & RBF"))
for txt in [
"GFR gold standard = <b>Inulin clearance</b>; clinically = creatinine clearance",
"RBF = measured by <b>PAH</b> (para-aminohippuric acid)",
]:
story.append(bp(txt))
story.append(spacer(4))
story.append(sub_header("ECG Intervals"))
ecg = [
["Interval", "Normal", "Abnormal Meaning"],
["PR interval", "0.12 - 0.20 s", ">0.20 s = 1st degree AV block"],
["QRS", "< 0.12 s", ">0.12 s = Bundle branch block"],
["QTc", "<0.44 s (M), <0.46 s (F)", "Prolonged QT = TdP risk"],
]
story.append(make_table(ecg[0], ecg[1:]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 3. BIOCHEMISTRY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("3. BIOCHEMISTRY"))
story.append(spacer(3))
story.append(sub_header("Enzyme Deficiency Diseases"))
enzymes = [
["Disease", "Enzyme Deficient", "Key Feature"],
["PKU", "Phenylalanine hydroxylase", "Musty odor, fair skin, intellectual disability"],
["Alkaptonuria", "Homogentisic acid oxidase", "Black urine, ochronosis"],
["Homocystinuria", "Cystathionine beta-synthase", "Marfanoid, DVT, lens dislocation DOWNWARD"],
["Maple Syrup Urine", "BCKAD complex", "Maple syrup odor"],
["Gaucher", "Glucocerebrosidase", "Bone crises, Erlenmeyer flask on X-ray"],
["Niemann-Pick", "Sphingomyelinase", "Cherry red spot + hepatosplenomegaly"],
["Tay-Sachs", "Hexosaminidase A", "Cherry red spot; NO hepatosplenomegaly"],
["Fabry", "Alpha-galactosidase A", "Angiokeratomas, X-linked recessive"],
]
story.append(make_table(enzymes[0], enzymes[1:]))
story.append(spacer(4))
story.append(sub_header("Vitamins - Deficiency Summary"))
vits = [
["Vitamin", "Deficiency / Toxicity", "Key Fact"],
["B1 (Thiamine)", "Wernicke-Korsakoff, Beriberi", "Alcoholics; cofactor for pyruvate dehydrogenase"],
["B3 (Niacin)", "Pellagra (3Ds)", "Dermatitis, Diarrhea, Dementia; Hartnup disease"],
["B6 (Pyridoxine)", "Sideroblastic anemia, neuropathy", "INH side effect - give B6 prophylactically"],
["B12", "Megaloblastic anemia + SACD", "Intrinsic factor needed; Schilling test"],
["C (Ascorbic acid)", "Scurvy", "Perifollicular hemorrhage, corkscrew hairs"],
["D", "Rickets / Osteomalacia", "1-alpha hydroxylase in kidney for active form"],
["K", "Bleeding (increased PT)", "Warfarin antagonist; neonatal hemorrhage"],
]
story.append(make_table(vits[0], vits[1:]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 4. PATHOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("4. PATHOLOGY"))
story.append(spacer(3))
story.append(sub_header("Amyloidosis"))
amyloid = [
["Type", "Precursor", "Associated Condition"],
["AL", "Immunoglobulin light chains", "Multiple myeloma (most common systemic)"],
["AA", "Serum amyloid A", "Chronic inflammation (TB, RA, osteomyelitis)"],
["AB (Amyloid beta)", "APP protein", "Alzheimer's disease (chromosome 21)"],
["Beta-2 microglobulin", "B2M protein", "Long-term hemodialysis"],
]
story.append(make_table(amyloid[0], amyloid[1:]))
story.append(bp("Congo red stain + <b>apple green birefringence</b> under polarized light"))
story.append(spacer(4))
story.append(sub_header("Necrosis Types"))
necrosis = [
["Type", "Example", "Feature"],
["Coagulative", "Cardiac/renal infarct", "Architecture preserved; most common"],
["Liquefactive", "Brain infarct, bacterial abscess", "Enzymatic digestion; no architecture"],
["Caseous", "Tuberculosis", "Cheese-like; granuloma center"],
["Fat", "Pancreas (enzymatic), Breast (trauma)", "Calcium soap deposits"],
["Fibrinoid", "Vasculitis, malignant HTN", "Immune complex deposition"],
["Gangrenous", "Diabetic foot", "Dry (coagulative) or Wet (+ liquefactive)"],
]
story.append(make_table(necrosis[0], necrosis[1:]))
story.append(spacer(4))
story.append(sub_header("Tumor Markers"))
markers = [
["Marker", "Tumor"],
["AFP", "HCC, Yolk sac tumor"],
["b-hCG", "Choriocarcinoma, GTD"],
["CEA", "Colorectal, pancreatic, gastric"],
["CA-125", "Ovarian carcinoma"],
["CA 19-9", "Pancreatic cancer"],
["PSA", "Prostate cancer"],
["Calcitonin", "Medullary thyroid carcinoma"],
["S-100", "Melanoma, Schwannoma"],
["Chromogranin A", "Carcinoid, neuroendocrine tumors"],
]
story.append(make_table(markers[0], markers[1:]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 5. PHARMACOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("5. PHARMACOLOGY"))
story.append(spacer(3))
story.append(sub_header("Antibiotic Mechanisms"))
abx = [
["Antibiotic", "Mechanism", "Notes"],
["Penicillins / Cephalosporins", "Inhibit cell wall synthesis (PBP)", "Beta-lactams"],
["Vancomycin", "Binds D-Ala-D-Ala (cell wall)", "MRSA; Red Man Syndrome"],
["Aminoglycosides", "30S ribosome inhibitor", "Bactericidal; ototoxic, nephrotoxic"],
["Tetracyclines", "30S ribosome inhibitor", "Bacteriostatic; no children/pregnancy"],
["Macrolides", "50S ribosome inhibitor", "Bacteriostatic; QT prolongation"],
["Chloramphenicol", "50S ribosome inhibitor", "Gray baby syndrome; aplastic anemia"],
["Metronidazole", "DNA strand breakage", "Anaerobes + protozoa; metallic taste"],
["Fluoroquinolones", "DNA gyrase / topoisomerase IV", "Tendon rupture; no children"],
["Rifampicin", "RNA polymerase inhibitor", "Orange urine; enzyme inducer"],
]
story.append(make_table(abx[0], abx[1:]))
story.append(mn("30S: Amino + Tetra | 50S: MAC (Macro, Aminoglycosides-no, Chlor, Clinda) | DNA: Fluoro + Metro + Rifampin"))
story.append(spacer(4))
story.append(sub_header("Important Drug Side Effects"))
sideeff = [
["Drug", "Side Effect"],
["Chloramphenicol", "Gray baby syndrome, aplastic anemia"],
["Tetracycline", "Teeth staining, photosensitivity, Fanconi syndrome"],
["Isoniazid (INH)", "Peripheral neuropathy (B6), hepatitis, SLE-like"],
["Rifampicin", "Orange urine, enzyme inducer, hepatitis"],
["Ethambutol", "Optic neuritis (color vision loss first)"],
["Streptomycin", "Ototoxicity, nephrotoxicity"],
["Methotrexate", "Folate antagonist, hepatic fibrosis, teratogenic"],
["Cyclophosphamide", "Hemorrhagic cystitis (Mesna prevents), SIADH"],
["Amiodarone", "Pulmonary fibrosis, thyroid dysfunction, photosensitivity"],
["Lithium", "Nephrogenic DI, hypothyroidism, tremor, Ebstein's (fetal)"],
]
story.append(make_table(sideeff[0], sideeff[1:]))
story.append(spacer(4))
story.append(sub_header("Antidotes - Must Know"))
antidotes = [
["Poison", "Antidote"],
["Organophosphate", "Atropine + Pralidoxime (PAM) - give PAM within 24h"],
["Opioids", "Naloxone"],
["Benzodiazepines", "Flumazenil"],
["Warfarin (chronic)", "Vitamin K"],
["Warfarin (acute)", "FFP (Fresh Frozen Plasma)"],
["Digoxin toxicity", "Digoxin-specific Fab antibodies"],
["Iron", "Deferoxamine"],
["Lead", "EDTA (inorganic), DMSA (dimercaptosuccinic acid)"],
["Arsenic / Mercury", "BAL (Dimercaprol)"],
["Carbon monoxide", "100% Oxygen"],
["Paracetamol", "N-acetylcysteine (NAC)"],
["Cyanide", "Sodium thiosulfate + Hydroxocobalamin"],
["Methanol / Ethylene glycol", "Fomepizole (or Ethanol)"],
["Heparin", "Protamine sulfate"],
]
story.append(make_table(antidotes[0], antidotes[1:]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 6. MEDICINE
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("6. MEDICINE"))
story.append(spacer(3))
story.append(sub_header("Heart Murmurs"))
murmurs = [
["Condition", "Murmur Type", "Special Feature"],
["Aortic stenosis", "Ejection systolic (R 2nd ICS → neck)", "Pulsus parvus et tardus; plateau pulse"],
["Aortic regurgitation", "Early diastolic (R 2nd ICS)", "Wide pulse pressure; Corrigan's pulse"],
["Mitral stenosis", "Mid-diastolic rumble (apex)", "Opening snap; loud S1"],
["Mitral regurgitation", "Pansystolic (apex → axilla)", "Soft S1"],
["VSD", "Pansystolic (left lower sternal)", "Harsh; may close spontaneously"],
["ASD", "Ejection systolic + fixed split S2", "Ostium secundum most common"],
["PDA", "Continuous machine murmur", "Indomethacin closes it"],
["MVP", "Mid-systolic click + late systolic", "Females; click moves with maneuvers"],
]
story.append(make_table(murmurs[0], murmurs[1:]))
story.append(spacer(4))
story.append(sub_header("Diabetes Mellitus"))
dm = [
["Parameter", "Value"],
["FPG diagnosis", "≥ 126 mg/dL"],
["2h OGTT diagnosis", "≥ 200 mg/dL"],
["HbA1c diagnosis", "≥ 6.5%"],
["Random glucose (symptomatic)", "≥ 200 mg/dL"],
["HbA1c target (general)", "< 7%"],
["HbA1c target (elderly/frail)", "< 8%"],
]
story.append(make_table(dm[0], dm[1:]))
for txt in [
"<b>Metformin</b> = first-line; contraindicated if eGFR <30; lactic acidosis risk",
"<b>SGLT2 inhibitors</b> (empagliflozin, dapagliflozin) = cardioprotective + renoprotective",
"<b>GLP-1 agonists</b> (liraglutide, semaglutide) = weight loss + cardioprotective",
]:
story.append(bp(txt))
story.append(spacer(4))
story.append(sub_header("Thyroid"))
thyroid = [
["Test", "Hypothyroid", "Hyperthyroid"],
["TSH", "HIGH", "LOW"],
["T4 / T3", "LOW", "HIGH"],
["Radioiodine uptake", "Low (Hashimoto)", "High (Graves), Low (thyroiditis)"],
["Antibodies", "Anti-TPO, Anti-Tg (Hashimoto)", "TSI / TSH-R Ab (Graves)"],
]
story.append(make_table(thyroid[0], thyroid[1:]))
story.append(bp("Thyroid storm treatment: <b>PTU first → Propranolol → Steroids → Lugol's iodine</b>"))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 7. SURGERY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("7. SURGERY"))
story.append(spacer(3))
story.append(sub_header("Burns - Rule of Nines (Adult)"))
burns = [
["Area", "% BSA"],
["Head + Neck", "9%"],
["Each Upper Limb", "9%"],
["Anterior Trunk", "18%"],
["Posterior Trunk", "18%"],
["Each Lower Limb", "18%"],
["Perineum", "1%"],
]
story.append(make_table(burns[0], burns[1:]))
story.append(bp("<b>Parkland formula:</b> 4 mL x kg x %BSA burnt (Ringer's Lactate); first 8h = half, next 16h = half"))
story.append(bp("Lund-Browder chart = most accurate (especially in children)"))
story.append(spacer(4))
story.append(sub_header("Fractures - High Yield"))
fxs = [
["Fracture", "Feature / Deformity"],
["Colles", "Dinner fork deformity; FOOSH (fall on outstretched hand)"],
["Smith's", "Reverse Colles; Garden spade deformity; reverse FOOSH"],
["Scaphoid", "Anatomical snuffbox tenderness; AVN risk; X-ray may be normal"],
["Monteggia", "Ulna fracture + radial head dislocation"],
["Galeazzi", "Radius fracture + distal radio-ulnar dislocation"],
["Pott's", "Bimalleolar fracture of ankle"],
["March", "Stress fracture of 2nd metatarsal"],
]
story.append(make_table(fxs[0], fxs[1:]))
story.append(mn("MUD RUD: Monteggia = Ulna + Dislocation of radius head; Galeazzi = Radius fracture + Ulnar Dislocation"))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 8. OBG
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("8. OBSTETRICS & GYNECOLOGY"))
story.append(spacer(3))
story.append(sub_header("Placenta Previa vs Abruptio Placentae"))
pp = [
["Feature", "Placenta Previa", "Abruptio Placentae"],
["Bleeding", "Painless, bright red", "Painful, dark red"],
["Uterus", "Soft, non-tender", "Board-like, tender"],
["Fetal heart", "Usually normal", "Distress common"],
["Shock", "Proportionate to loss", "Disproportionate to visible loss"],
["Diagnosis", "USG (never do PV)", "Clinical + USG"],
]
story.append(make_table(pp[0], pp[1:]))
story.append(spacer(4))
story.append(sub_header("Pre-eclampsia"))
for txt in [
"BP ≥ 140/90 after 20 weeks + proteinuria ≥ 300 mg/24h",
"<b>Severe features:</b> BP ≥ 160/110, platelets <100k, creatinine >1.1, visual/CNS symptoms",
"MgSO4 = prevention + treatment of eclampsia (Pritchard regimen)",
"<b>Antidote to MgSO4 toxicity = Calcium gluconate IV</b>",
"Definitive treatment = <b>Delivery</b>",
]:
story.append(bp(txt))
story.append(spacer(4))
story.append(sub_header("Gestational Trophoblastic Disease"))
gtd = [
["Type", "Karyotype", "Feature"],
["Complete mole", "46XX (both paternal)", "No fetal parts; snowstorm USG; very high b-hCG"],
["Partial mole", "69XXY (triploid)", "Fetal parts may be present"],
["Choriocarcinoma", "Variable", "Most malignant; responds to methotrexate"],
]
story.append(make_table(gtd[0], gtd[1:]))
story.append(spacer(4))
story.append(sub_header("Ovarian Tumors"))
ovarian = [
["Tumor", "Key Feature"],
["Serous cystadenocarcinoma", "Most common MALIGNANT ovarian tumor"],
["Serous cystadenoma", "Most common BENIGN ovarian tumor"],
["Mucinous cystadenocarcinoma", "Largest ovarian tumor"],
["Dysgerminoma", "Radiosensitive germ cell tumor; LDH marker"],
["Granulosa cell tumor", "Estrogen-secreting; Call-Exner bodies; feminizing"],
["Krukenberg tumor", "Metastatic (gastric origin); bilateral; signet ring cells"],
]
story.append(make_table(ovarian[0], ovarian[1:]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 9. PEDIATRICS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("9. PEDIATRICS"))
story.append(spacer(3))
story.append(sub_header("Developmental Milestones"))
dev = [
["Milestone", "Age"],
["Social smile", "6 weeks"],
["Neck holding (prone)", "3 months"],
["Rolls over", "5 months"],
["Sits without support", "8 months"],
["Stands with support", "9 months"],
["Pincer grasp", "9 months"],
["Walks alone", "13-15 months"],
["2-word sentences", "2 years"],
["3-word sentences / Counts to 3", "3 years"],
["Counts 10 objects", "5 years"],
]
story.append(make_table(dev[0], dev[1:]))
story.append(spacer(4))
story.append(sub_header("National Immunization Schedule (India) - Key Points"))
vacc = [
["Vaccine", "Age Given"],
["BCG", "At birth"],
["OPV + HepB", "Birth, 6, 10, 14 weeks; booster 16-24 months"],
["Pentavalent (DPT+HepB+Hib)", "6, 10, 14 weeks"],
["IPV (fractional)", "6 weeks + 14 weeks"],
["Rotavirus", "6, 10, 14 weeks"],
["PCV", "6, 14 weeks + 9 months"],
["Measles / MR", "9 months + 16-24 months"],
["JE (endemic areas)", "9 months + 16-24 months"],
["Typhoid", "2 years onwards"],
]
story.append(make_table(vacc[0], vacc[1:]))
story.append(spacer(4))
story.append(sub_header("Neonatal Quick Facts"))
for txt in [
"Normal RR = 40-60/min | HR = 120-160/min",
"Physiological weight loss: up to 10% (regained by day 10)",
"<b>Physiological jaundice:</b> Starts day 2-3, peaks day 4-5, resolves by day 7-10",
"<b>Pathological jaundice:</b> Jaundice in FIRST 24 hours is ALWAYS pathological",
]:
story.append(bp(txt))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 10. ENT
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("10. ENT"))
story.append(spacer(3))
story.append(sub_header("Hearing Loss Tests"))
hl = [
["Test", "Conductive Loss", "Sensorineural Loss"],
["Rinne test", "AC < BC (Rinne NEGATIVE)", "AC > BC (Rinne POSITIVE but reduced)"],
["Weber test", "Lateralizes to AFFECTED ear", "Lateralizes to NORMAL ear"],
]
story.append(make_table(hl[0], hl[1:]))
story.append(spacer(4))
story.append(sub_header("Important ENT Syndromes"))
ent = [
["Condition", "Key Feature"],
["Gradenigo syndrome", "Otitis media + VI nerve palsy + trigeminal pain"],
["Bezold's abscess", "Mastoid pus tracks under sternocleidomastoid"],
["Cholesteatoma", "Unsafe CSOM; foul discharge; marginal perforation; bone erosion"],
["Otosclerosis", "Conductive loss; Schwartze sign (flamingo pink blush); AD inheritance"],
["Meniere's disease", "Low-frequency SNHL + episodic vertigo + tinnitus + aural fullness"],
]
story.append(make_table(ent[0], ent[1:]))
story.append(spacer(8))
# ═══════════════════════════════════════════════════════════════════════════════
# 11. OPHTHALMOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("11. OPHTHALMOLOGY"))
story.append(spacer(3))
story.append(sub_header("Glaucoma"))
glaucoma = [
["Feature", "POAG", "PACG"],
["Angle", "Open", "Closed"],
["Onset", "Insidious, asymptomatic", "Acute: haloes, pain, red eye"],
["IOP", "Elevated (may fluctuate)", "Very high (often >40 mmHg)"],
["Treatment", "Timolol, latanoprost", "Pilocarpine, laser iridotomy"],
]
story.append(make_table(glaucoma[0], glaucoma[1:]))
story.append(spacer(4))
story.append(sub_header("Retinal Conditions"))
retina = [
["Condition", "Key Finding"],
["CRVO", "Disc edema, flame hemorrhages all quadrants; 'blood and thunder' fundus"],
["CRAO", "Cherry red spot, cattle-trucking; sudden painless loss"],
["Diabetic retinopathy", "Microaneurysms (FIRST sign); cotton wool spots; NVD/NVE"],
["Hypertensive retinopathy", "AV nipping; cotton wool spots; papilledema in Grade 4"],
["Retinitis pigmentosa", "Bone spicule pigmentation; night blindness; tunnel vision"],
]
story.append(make_table(retina[0], retina[1:]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 12. PSYCHIATRY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("12. PSYCHIATRY"))
story.append(spacer(3))
story.append(mn("MDD (SIGECAPS): Sleep, Interest, Guilt, Energy, Concentration, Appetite, Psychomotor, Suicidal ideation (≥5 for 2 weeks)"))
story.append(mn("Mania (DIG FAST): Distractibility, Impulsivity, Grandiosity, Flight of ideas, Activity, Sleep decreased, Talkativeness"))
story.append(spacer(4))
story.append(sub_header("Drug of Choice - Psychiatry"))
psych = [
["Condition", "Drug of Choice"],
["Schizophrenia", "Risperidone (atypical); Haloperidol (typical)"],
["Bipolar disorder", "Lithium (acute mania + prophylaxis)"],
["OCD", "Fluvoxamine / Fluoxetine (SSRIs)"],
["Panic disorder", "SSRIs (first-line); Alprazolam (acute)"],
["PTSD", "Sertraline, Paroxetine"],
["Enuresis", "Imipramine (TCA); Desmopressin"],
["ADHD", "Methylphenidate (first-line); Atomoxetine"],
["Alzheimer's (mild-moderate)", "Donepezil (AChE inhibitor)"],
["Neuroleptic malignant syndrome", "Dantrolene + Bromocriptine; STOP antipsychotic"],
]
story.append(make_table(psych[0], psych[1:]))
story.append(spacer(8))
# ═══════════════════════════════════════════════════════════════════════════════
# 13. DERMATOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("13. DERMATOLOGY"))
story.append(spacer(3))
story.append(sub_header("Blistering Disorders"))
blister = [
["Disease", "Level of Split", "Test", "Feature"],
["Pemphigus vulgaris", "Intraepidermal (suprabasal)", "Tzanck, IIF", "Acantholysis; Nikolsky +ve; flaccid bullae"],
["Bullous pemphigoid", "Sub-epidermal", "IIF", "Tense bullae; elderly; Nikolsky -ve"],
["Dermatitis herpetiformis", "Sub-epidermal", "DIF granular IgA", "Celiac disease association"],
]
story.append(make_table(blister[0], blister[1:]))
story.append(spacer(4))
story.append(sub_header("Skin Cancers"))
skin = [
["Cancer", "Key Feature"],
["BCC", "Pearly papule; rolled edge; telangiectasia; NEVER metastasizes"],
["SCC", "Everted edge; arises from actinic keratosis; may metastasize"],
["Melanoma", "ABCDE criteria; Breslow thickness; worst prognosis"],
["Merkel cell carcinoma", "Neuroendocrine origin; aggressive; sun-exposed areas"],
]
story.append(make_table(skin[0], skin[1:]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 14. COMMUNITY MEDICINE (PSM)
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("14. COMMUNITY MEDICINE (PSM)"))
story.append(spacer(3))
story.append(sub_header("Epidemiology Formulas"))
epi = [
["Measure", "Formula"],
["Attack rate", "(Cases / Population at risk) x 100"],
["Case fatality rate", "(Deaths / Cases) x 100"],
["Sensitivity", "TP / (TP + FN)"],
["Specificity", "TN / (TN + FP)"],
["PPV", "TP / (TP + FP)"],
["NPV", "TN / (TN + FN)"],
["Relative Risk (RR)", "Incidence in exposed / Incidence in unexposed"],
["Odds Ratio (OR)", "(a x d) / (b x c)"],
]
story.append(make_table(epi[0], epi[1:]))
story.append(spacer(4))
story.append(sub_header("Study Designs"))
study = [
["Design", "Key Use", "Measure of Association"],
["RCT", "Gold standard for intervention", "Risk difference, NNT"],
["Cohort study", "Prospective; rare exposures", "Relative Risk (RR)"],
["Case-control", "Retrospective; rare diseases", "Odds Ratio (OR)"],
["Cross-sectional", "Prevalence studies", "Prevalence ratio"],
["Systematic review / Meta-analysis", "Highest evidence level", "Pooled effect size"],
]
story.append(make_table(study[0], study[1:]))
story.append(spacer(8))
# ═══════════════════════════════════════════════════════════════════════════════
# 15. FORENSIC MEDICINE
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("15. FORENSIC MEDICINE"))
story.append(spacer(3))
story.append(sub_header("Post-mortem Changes"))
pm = [
["Change", "Onset", "Maximum / Passes Off"],
["Rigor mortis", "2-6 hours", "Complete 12h; passes off 36-48h"],
["Livor mortis (hypostasis)", "30 min - 2h", "Fixed after 6-8 hours"],
["Putrefaction", "Starts 24-48h (warm weather faster)", "Bloating at 3-5 days"],
["Cadaveric spasm", "Instantaneous", "Indicates violent/sudden death"],
]
story.append(make_table(pm[0], pm[1:]))
story.append(spacer(8))
# ═══════════════════════════════════════════════════════════════════════════════
# 16. RADIOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("16. RADIOLOGY - X-ray Signs"))
story.append(spacer(3))
rad = [
["Sign", "Disease"],
["Ground glass opacity", "ARDS, PCP, pulmonary edema, COVID-19"],
["Eggshell calcification", "Silicosis, sarcoidosis, irradiated lymphoma"],
["Bat-wing / Butterfly", "Pulmonary edema"],
["Honeycomb lung", "UIP / IPF"],
["Reverse bat-wing", "COP (Cryptogenic organizing pneumonia)"],
["Egg on side", "TGA (Transposition of Great Arteries)"],
["Boot-shaped heart", "Tetralogy of Fallot"],
["Box-shaped heart", "Ebstein's anomaly"],
["Flask-shaped heart", "Pericardial effusion"],
["Snowstorm appearance", "Hydatidiform mole (USG)"],
]
story.append(make_table(rad[0], rad[1:]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# 17. LAST 15-DAY STRATEGY
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_header("17. LAST 15-DAY REVISION STRATEGY"))
story.append(spacer(3))
strat = [
["Days", "Focus"],
["Days 1-7 (Week 1)", "High-density subjects: Pharmacology, Pathology, Medicine, PSM"],
["Days 8-13 (Week 2)", "Surgery, OBG, Pediatrics, Psychiatry + Rapid revision of Anatomy / Physiology / Biochemistry"],
["Day 14", "ENT, Ophthalmology, Dermatology, Forensic Medicine"],
["Day 15", "Revise mnemonics + PYQs (previous year questions) + weak areas only"],
]
story.append(make_table(strat[0], strat[1:], col_widths=[avail*0.28, avail*0.72]))
story.append(spacer(6))
for txt in [
"These notes cover the <b>top 20% of content that appears in 80% of NEET PG questions</b>.",
"Focus on <b>tables, exceptions, and 'most common' facts</b> - these are NEET PG favorites.",
"For PYQs: use Grand Tests and subject-wise tests in the last 5 days.",
"Sleep 7-8 hours in the last week - retrieval consolidates during sleep.",
]:
story.append(bp(txt))
story.append(spacer(10))
story.append(HRFlowable(width="100%", thickness=1, color=C_TEAL, spaceAfter=4))
story.append(Paragraph("Generated by Orris AI | NEET PG High-Yield Marrow Notes | July 2026", footer_style))
# ── Build PDF ─────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
PYEOF
echo "Script written"
show command