CNS Meningitis, Hydrocephalus, Infantile hemiplegia, Febrile Seizures, Epilepsy 35 PE 27.1, 27.2, 27.3, 27.4, 27.5, 27.6, 27.7 MCQ -20 (to include 10 Case based) 5 Case based Long Answer Questions 10 Case Based Short Answer Questions Mental Retardation, Cerebral Palsy, Floppy infant, Duchenne Muscular Dystrophy 35 PE 27.9, 27.10, 27.11, 27.12 MCQ -20 (to include 10 Case based) 5 Case based Long Answer Questions 10 Case Based Short Answer Questions Can you create questions for UG CBME university exam based on the above topics. Use OP Ghai and Piyush gupta UG book
| Set | Topics | MCQ | Case MCQ | LAQ | SAQ | Total Marks |
|---|---|---|---|---|---|---|
| SET 1 | Meningitis, Hydrocephalus, Infantile Hemiplegia, Febrile Seizures, Epilepsy | 10 | 10 | 5 | 10 | 35 |
| SET 2 | Mental Retardation, Cerebral Palsy, Floppy Infant, DMD | 10 | 10 | 5 | 10 | 35 |
Create a PDF answer key with scoring rubrics for LAQ
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "workspace ready"
mkdir -p /tmp/workspace/cns-exam && echo "dir created"
~/cns-exam/generate_answer_key.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, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
from reportlab.pdfbase import pdfmetrics
OUTPUT_PATH = "/tmp/workspace/cns-exam/CNS_LAQ_Answer_Key_with_Rubrics.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a3a5c")
MED_BLUE = colors.HexColor("#2563a8")
LIGHT_BLUE = colors.HexColor("#dbeafe")
ACCENT_TEAL = colors.HexColor("#0e7490")
GOLD = colors.HexColor("#b45309")
RUBRIC_BG = colors.HexColor("#f0fdf4")
RUBRIC_HDR = colors.HexColor("#166534")
RUBRIC_ROW = colors.HexColor("#dcfce7")
ALT_ROW = colors.HexColor("#f9fafb")
BORDER_GRAY = colors.HexColor("#d1d5db")
WHITE = colors.white
SET1_HDR = colors.HexColor("#1e3a5f")
SET2_HDR = colors.HexColor("#4a1942")
# ── Document setup ───────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT_PATH,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2.2*cm,
title="CNS Pediatrics LAQ Answer Key with Scoring Rubrics",
author="UG CBME Examination Board",
subject="Pediatrics CNS – Long Answer Questions Answer Key",
)
styles = getSampleStyleSheet()
def S(name, **kwargs):
return ParagraphStyle(name, **kwargs)
# Custom styles
TITLE_STYLE = S("Title",
fontName="Helvetica-Bold", fontSize=16, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=4, leading=20)
SUB_TITLE = S("SubTitle",
fontName="Helvetica", fontSize=10, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=2, leading=14)
SET_HEADER = S("SetHeader",
fontName="Helvetica-Bold", fontSize=13, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=6, leading=16)
Q_LABEL = S("QLabel",
fontName="Helvetica-Bold", fontSize=11, textColor=DARK_BLUE,
spaceBefore=14, spaceAfter=3, leading=14)
Q_CASE = S("QCase",
fontName="Helvetica-Oblique", fontSize=9.5, textColor=colors.HexColor("#374151"),
spaceBefore=4, spaceAfter=6, leading=13, leftIndent=8,
borderPad=6, backColor=colors.HexColor("#f0f9ff"),
borderColor=colors.HexColor("#7dd3fc"), borderWidth=0.5, borderRadius=3)
PART_LABEL = S("PartLabel",
fontName="Helvetica-Bold", fontSize=10, textColor=ACCENT_TEAL,
spaceBefore=8, spaceAfter=2, leading=13)
BODY = S("Body",
fontName="Helvetica", fontSize=9.5, textColor=colors.HexColor("#1f2937"),
spaceBefore=2, spaceAfter=2, leading=13, alignment=TA_JUSTIFY)
BULLET = S("Bullet",
fontName="Helvetica", fontSize=9.5, textColor=colors.HexColor("#1f2937"),
spaceBefore=1, spaceAfter=1, leading=13, leftIndent=16,
bulletIndent=6, alignment=TA_LEFT)
NOTE_STYLE = S("Note",
fontName="Helvetica-Oblique", fontSize=8.5, textColor=colors.HexColor("#6b7280"),
spaceBefore=4, spaceAfter=2, leading=12, leftIndent=8)
RUBRIC_TITLE = S("RubricTitle",
fontName="Helvetica-Bold", fontSize=9, textColor=WHITE,
alignment=TA_CENTER, leading=12)
CELL_HEAD = S("CellHead",
fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE, leading=11)
CELL_BODY = S("CellBody",
fontName="Helvetica", fontSize=8.5, textColor=colors.HexColor("#111827"), leading=11)
TOTAL_MARKS = S("TotalMarks",
fontName="Helvetica-Bold", fontSize=9, textColor=DARK_BLUE,
spaceBefore=4, spaceAfter=8, leading=12)
# ── Header/Footer ────────────────────────────────────────────────────────────
def header_footer(canvas, doc):
canvas.saveState()
W, H = A4
# Top bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, H - 1.5*cm, W, 1.5*cm, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont("Helvetica-Bold", 9)
canvas.drawCentredString(W/2, H - 0.8*cm,
"CNS Pediatrics — LAQ Answer Key with Scoring Rubrics | UG CBME University Examination")
# Bottom bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, 0, W, 1.1*cm, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont("Helvetica", 8)
canvas.drawString(2*cm, 0.4*cm, "Reference: OP Ghai Essential Pediatrics / Piyush Gupta Pediatrics")
canvas.drawRightString(W - 2*cm, 0.4*cm, f"Page {doc.page}")
canvas.restoreState()
# ── Helper builders ──────────────────────────────────────────────────────────
def cover_banner(text_lines, bg_color):
"""Coloured banner table used for section/set headers."""
cells = [[Paragraph(t, SET_HEADER if i < 2 else SUB_TITLE)]
for i, t in enumerate(text_lines)]
t = Table([[Paragraph(ln, SET_HEADER)] for ln in text_lines],
colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg_color),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
("ROUNDEDCORNERS", (0,0), (-1,-1), [4,4,4,4]),
]))
return t
def rubric_table(rows):
"""
rows: list of [criterion, marks, key_points]
"""
header = [
Paragraph("Criterion / Sub-part", CELL_HEAD),
Paragraph("Marks", CELL_HEAD),
Paragraph("Key Answer Points", CELL_HEAD),
]
data = [header]
for i, (crit, marks, points) in enumerate(rows):
bg = RUBRIC_ROW if i % 2 == 0 else ALT_ROW
data.append([
Paragraph(crit, CELL_BODY),
Paragraph(str(marks), ParagraphStyle("m", fontName="Helvetica-Bold",
fontSize=8.5, alignment=TA_CENTER,
textColor=RUBRIC_HDR, leading=11)),
Paragraph(points, CELL_BODY),
])
total_marks = sum(int(r[1]) for r in rows)
data.append([
Paragraph("<b>TOTAL</b>", CELL_BODY),
Paragraph(f"<b>{total_marks}</b>",
ParagraphStyle("tot", fontName="Helvetica-Bold", fontSize=9,
alignment=TA_CENTER, textColor=GOLD, leading=11)),
Paragraph("", CELL_BODY),
])
col_w = [4.5*cm, 1.4*cm, 11.1*cm]
t = Table(data, colWidths=col_w, repeatRows=1)
n = len(data)
t.setStyle(TableStyle([
# Header row
("BACKGROUND", (0,0),(-1,0), RUBRIC_HDR),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
# Total row
("BACKGROUND", (0,n-1),(-1,n-1), colors.HexColor("#fef3c7")),
# Alternating rows
*[("BACKGROUND", (0,i),(- 1,i), RUBRIC_ROW if i % 2 == 1 else ALT_ROW)
for i in range(1, n-1)],
# Grid
("GRID", (0,0),(-1,-1), 0.4, BORDER_GRAY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("RIGHTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
("ALIGN", (1,0),(1,-1), "CENTER"),
]))
return t
def section_divider(label, bg=MED_BLUE):
t = Table([[Paragraph(f"<b>{label}</b>",
ParagraphStyle("sd", fontName="Helvetica-Bold",
fontSize=10, textColor=WHITE,
alignment=TA_CENTER, leading=13))]],
colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
]))
return t
# ════════════════════════════════════════════════════════════════════════════
# CONTENT DATA
# ════════════════════════════════════════════════════════════════════════════
story = []
# ─── COVER PAGE ──────────────────────────────────────────────────────────────
cover_data = [[
Paragraph("UG CBME UNIVERSITY EXAMINATION", TITLE_STYLE),
Paragraph("PEDIATRICS — CENTRAL NERVOUS SYSTEM", TITLE_STYLE),
Paragraph("LONG ANSWER QUESTIONS: ANSWER KEY WITH SCORING RUBRICS", TITLE_STYLE),
Spacer(1, 6),
Paragraph("Reference: OP Ghai Essential Pediatrics | Piyush Gupta Pediatrics (PE 27.1–27.12)", SUB_TITLE),
Spacer(1, 4),
Paragraph("For Examiner Use Only — Confidential", SUB_TITLE),
]]
cover_table = Table(cover_data, colWidths=[17*cm])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), DARK_BLUE),
("TOPPADDING", (0,0),(-1,-1), 22),
("BOTTOMPADDING", (0,0),(-1,-1), 22),
("LEFTPADDING", (0,0),(-1,-1), 16),
("RIGHTPADDING", (0,0),(-1,-1), 16),
]))
story.append(cover_table)
story.append(Spacer(1, 0.5*cm))
# Info box
info_data = [
["EXAM DETAILS", ""],
["Subject", "Pediatrics — CNS"],
["Topics Covered",
"Set 1: Meningitis, Hydrocephalus, Infantile Hemiplegia, Febrile Seizures, Epilepsy\n"
"Set 2: Mental Retardation, Cerebral Palsy, Floppy Infant, Duchenne Muscular Dystrophy"],
["Total LAQs", "10 (5 per set) × 10 marks each = 100 marks total"],
["Competencies", "PE 27.1–27.7 (Set 1) | PE 27.9–27.12 (Set 2)"],
["Document Type", "Examiner Answer Key with Scoring Rubrics — CONFIDENTIAL"],
]
info_t = Table(info_data, colWidths=[4.5*cm, 12.5*cm])
info_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("SPAN", (0,0),(-1,0)),
("ALIGN", (0,0),(-1,0), "CENTER"),
("FONTNAME", (0,1),( 0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 9),
("GRID", (0,0),(-1,-1), 0.4, BORDER_GRAY),
("BACKGROUND", (0,1),(-1,-1), ALT_ROW),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
story.append(info_t)
story.append(Spacer(1, 0.4*cm))
# Rubric guide box
guide_rows = [
["10/10", "All criteria met; clear, accurate, well-organised answer with all key points present"],
["8–9/10", "Most criteria met; minor omissions in one sub-part; factually correct"],
["6–7/10", "Partial coverage; 1–2 sub-parts incomplete or minor factual errors"],
["4–5/10", "Significant gaps; only half the content covered; some errors"],
["1–3/10", "Largely incomplete; major errors; barely relevant content"],
["0/10", "No attempt or completely irrelevant"],
]
guide_data = [[Paragraph("GLOBAL SCORING GUIDE (apply per sub-part marks)", CELL_HEAD), ""]] + \
[[Paragraph(r[0], ParagraphStyle("gs", fontName="Helvetica-Bold", fontSize=8.5,
textColor=RUBRIC_HDR, alignment=TA_CENTER, leading=11)),
Paragraph(r[1], CELL_BODY)] for r in guide_rows]
guide_t = Table(guide_data, colWidths=[2.5*cm, 14.5*cm])
guide_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), ACCENT_TEAL),
("SPAN", (0,0),(-1,0)),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("GRID", (0,0),(-1,-1), 0.4, BORDER_GRAY),
("BACKGROUND", (0,1),(-1,-1), RUBRIC_BG),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 6),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("ALIGN", (0,1),(0,-1), "CENTER"),
]))
story.append(guide_t)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SET 1 — Questions & Rubrics
# ═══════════════════════════════════════════════════════════════════════════
story.append(cover_banner([
"SET 1 — LONG ANSWER QUESTIONS",
"Meningitis | Hydrocephalus | Infantile Hemiplegia | Febrile Seizures | Epilepsy",
"PE Competencies: 27.1, 27.2, 27.3, 27.4, 27.5, 27.6, 27.7 | 5 × 10 Marks = 50 Marks",
], SET1_HDR))
story.append(Spacer(1, 0.3*cm))
# ── LAQ 1 ───────────────────────────────────────────────────────────────────
story.append(KeepTogether([
Paragraph("LAQ 1 — Bacterial Meningitis (PE 27.1)", Q_LABEL),
Paragraph(
"<i>Case: A 6-month-old infant admitted with fever, seizures, and bulging fontanelle. "
"CSF examination confirms bacterial meningitis.</i>",
Q_CASE),
]))
story.append(Paragraph("(a) Enumerate causative organisms by age group. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Age: 0–3 months (Neonatal)", 1,
"Group B Streptococcus (GBS), Escherichia coli, Listeria monocytogenes. "
"<b>1 mark</b>: correctly listing ≥2 neonatal organisms."),
("Age: 3 months–5 years", 1,
"Streptococcus pneumoniae (most common), Neisseria meningitidis, Haemophilus influenzae type b. "
"<b>1 mark</b>: ≥2 correct organisms for this age group."),
("Age: >5 years / older children", 1,
"Streptococcus pneumoniae, Neisseria meningitidis. "
"<b>1 mark</b>: both listed; partial credit 0.5 if only one mentioned."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) CSF findings — Bacterial vs. Viral vs. Tuberculous meningitis (tabular). [4 marks]", PART_LABEL))
csf_hdr = ["Parameter", "Bacterial", "Viral", "Tuberculous"]
csf_rows = [
["Appearance", "Turbid / Purulent", "Clear / slightly turbid", "Clear; cobweb clot"],
["Cells (type)", "Neutrophils >80%", "Lymphocytes", "Lymphocytes 100–500"],
["Cell count", "500–20,000", "10–1000", "100–500"],
["Glucose", "<40 mg/dL; CSF:blood <0.4", "Normal or mildly low", "Very low (<45 mg/dL)"],
["Protein", ">100 mg/dL (↑↑)", "Normal/slightly raised", "Very high >100 mg/dL"],
["AFB/Culture", "Gram stain + Culture", "Viral PCR", "AFB smear (low sensitivity); culture gold standard"],
["Other", "CIE / latex agglutination for antigen", "—", "ADA raised; PCR for MTB"],
]
csf_data = [[Paragraph(h, ParagraphStyle("ch", fontName="Helvetica-Bold",
fontSize=8, textColor=WHITE, leading=10))
for h in csf_hdr]]
for row in csf_rows:
csf_data.append([Paragraph(c, ParagraphStyle("cb", fontName="Helvetica",
fontSize=8, leading=10))
for c in row])
csf_t = Table(csf_data, colWidths=[3.5*cm, 4.3*cm, 4*cm, 5.2*cm])
csf_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("GRID", (0,0),(-1,-1), 0.4, BORDER_GRAY),
("TOPPADDING", (0,0),(-1,-1), 3), ("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "TOP"),
("BACKGROUND", (0,1),(-1,-1), ALT_ROW),
*[("BACKGROUND",(0,i),(-1,i), LIGHT_BLUE) for i in range(1, len(csf_data), 2)],
]))
story.append(csf_t)
story.append(Paragraph(
"<i>Marks: 1 mark each for correctly differentiating bacterial vs viral vs TBM (3 marks) + "
"1 mark for listing ≥5 parameters with correct values.</i>", NOTE_STYLE))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Antibiotic therapy and adjunctive treatment. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Empirical Antibiotics", 2,
"<b>Age <1 month</b>: Ampicillin + Cefotaxime (or + Gentamicin). "
"<b>Age >1 month</b>: Ceftriaxone 100 mg/kg/day ÷ 12-hrly + Vancomycin (for resistant pneumococcus). "
"Duration: 10–14 days for S. pneumoniae; 7 days for N. meningitidis. "
"<b>2 marks</b>: correct drugs + doses + duration; <b>1 mark</b>: only drugs without doses."),
("Adjunctive: Dexamethasone", 1,
"0.15 mg/kg/dose IV 6-hourly × 4 days; start with or before first antibiotic dose. "
"Reduces sensorineural hearing loss (especially H. influenzae). "
"Benefit uncertain in developing-country settings with high HIV prevalence. "
"<b>1 mark</b>: dose + indication + timing mentioned."),
]))
story.append(Spacer(1, 0.4*cm))
# ── LAQ 2 ───────────────────────────────────────────────────────────────────
story.append(KeepTogether([
Paragraph("LAQ 2 — Hydrocephalus (PE 27.2)", Q_LABEL),
Paragraph(
"<i>Case: 14-month-old with progressively increasing head size, bulging fontanelle, "
"sunset sign, and prominent scalp veins. Head circumference 54 cm.</i>", Q_CASE),
]))
story.append(Paragraph("(a) Classification and mechanisms of hydrocephalus. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Communicating hydrocephalus", 1,
"Impaired CSF absorption at arachnoid villi (all ventricles dilated including 4th). "
"Causes: post-meningitic, post-hemorrhagic, Arnold-Chiari malformation. "
"<b>1 mark</b>: correct definition + ≥2 causes."),
("Non-communicating (Obstructive)",1,
"Block within ventricular system (4th ventricle normal/small). "
"Causes: Aqueductal stenosis (most common), Dandy-Walker malformation, posterior fossa tumour. "
"<b>1 mark</b>: correct definition + causes."),
("External / Other types", 1,
"External hydrocephalus: extra-axial CSF without raised ICP. "
"Hydrocephalus ex vacuo: secondary to brain atrophy. "
"Normal pressure hydrocephalus (adults). "
"<b>1 mark</b>: external hydrocephalus + ex vacuo explained with distinction."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Clinical features and diagnosis. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Clinical features in infants", 2,
"Increasing OFC (>97th percentile), bulging fontanelle, dilated scalp veins, "
"sunset sign of eyes (Parinaud's sign), Macewen's sign (cracked-pot resonance on skull percussion), "
"suture diastasis, irritability, poor feeding, vomiting. "
"In older children (closed fontanelle): headache, vomiting, papilledema, 6th nerve palsy. "
"<b>2 marks</b>: ≥6 features listed with context; <b>1 mark</b>: 3–5 features."),
("Investigations", 1,
"First-line: Cranial USG (neonates/infants — open fontanelle). "
"CT head: dilated ventricles, periventricular lucency. "
"MRI brain: gold standard — aetiology, aqueductal flow. "
"<b>1 mark</b>: USG as first choice stated + CT/MRI role."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Management including VP shunt and its complications. [4 marks]", PART_LABEL))
story.append(rubric_table([
("Conservative", 1,
"Acetazolamide (reduces CSF production) — temporising only. "
"Serial lumbar punctures — for post-hemorrhagic hydrocephalus in premature infants. "
"<b>1 mark</b>: both mentioned with indications."),
("Surgical: VP Shunt", 2,
"Ventriculo-peritoneal shunt — definitive treatment. "
"Catheter drains CSF from lateral ventricle to peritoneum via subcutaneous tunnel. "
"Endoscopic Third Ventriculostomy (ETV): preferred for obstructive hydrocephalus in children >2 years (avoids shunt). "
"<b>2 marks</b>: VP shunt described + ETV indication + comparison."),
("VP Shunt Complications",1,
"<b>Early</b>: Shunt infection (S. epidermidis, S. aureus) — fever, meningism, raised CRP. "
"<b>Late</b>: Shunt obstruction — symptoms of raised ICP; over-drainage — slit-ventricle syndrome, subdural hematoma. "
"Shunt revision rate ~40% at 2 years. "
"<b>1 mark</b>: ≥3 complications correctly identified with clinical pointers."),
]))
story.append(PageBreak())
# ── LAQ 3 ───────────────────────────────────────────────────────────────────
story.append(cover_banner([
"SET 1 — continued",
"LAQ 3, 4, 5: Febrile Seizures | Epilepsy | Infantile Hemiplegia",
], SET1_HDR))
story.append(Spacer(1, 0.3*cm))
story.append(KeepTogether([
Paragraph("LAQ 3 — Complex Febrile Seizures / Febrile Status Epilepticus (PE 27.4, 27.7)", Q_LABEL),
Paragraph(
"<i>Case: 4-year-old boy, complex febrile seizure (20 minutes, focal onset, "
"right-sided twitching). Prior simple febrile seizure at 18 months.</i>", Q_CASE),
]))
story.append(Paragraph("(a) Definition and classification of febrile seizures. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Definition", 1,
"Seizure occurring in a febrile child aged 6 months–5 years, not caused by CNS infection "
"or metabolic disturbance, and without prior afebrile seizures. (AAP/ILAE definition). "
"<b>1 mark</b>: age limits + temperature context + exclusion of CNS infection all stated."),
("Simple febrile seizure", 1,
"Generalized (usually GTC); duration <15 minutes; single episode in 24 hours; "
"complete recovery within 1 hour. <b>1 mark</b>: all 3 criteria correct."),
("Complex febrile seizure", 1,
"ANY of: focal onset OR duration >15 minutes OR >1 episode within 24 hours. "
"Febrile status epilepticus = seizure ≥30 minutes. "
"<b>1 mark</b>: ≥2 defining criteria + FSE definition."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Risk factors for recurrence. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Risk factors", 3,
"<b>1 mark each for any 3 of the following</b> (max 3): "
"(1) Age <18 months at first febrile seizure. "
"(2) Low-grade fever at seizure onset (<38°C). "
"(3) Brief duration of fever before seizure. "
"(4) Positive family history of febrile seizures (first-degree relative). "
"(5) Daycare attendance (more frequent infections). "
"Overall recurrence: ~30–40%. With all 4 risk factors: >70% recurrence. "
"<b>Note</b>: Complex FS does NOT independently increase recurrence risk."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Indications for AED prophylaxis and drugs used. [4 marks]", PART_LABEL))
story.append(rubric_table([
("Indications for prophylaxis", 2,
"<b>Continuous prophylaxis</b> indications (controversial; most guidelines now recommend against routine use): "
"Multiple complex febrile seizures, parental anxiety with inability to manage, "
"child with neurological abnormality. "
"<b>Intermittent prophylaxis</b> (rectal/oral diazepam at onset of fever): "
"more commonly recommended. Reduces recurrence during febrile illness. "
"<b>2 marks</b>: distinction between continuous vs intermittent + indications."),
("Drugs: Continuous", 1,
"Phenobarbitone 3–5 mg/kg/day OR Sodium valproate 20–40 mg/kg/day. "
"NOT recommended routinely (side effects > benefit in simple FS). "
"<b>1 mark</b>: drugs + doses + caveat about routine use."),
("Drugs: Intermittent", 1,
"Diazepam 0.5 mg/kg rectal / oral at fever onset, repeat in 8–12 hours if fever persists. "
"Reduces recurrence by ~44% during febrile episodes. "
"Side effect: sedation, ataxia. "
"<b>1 mark</b>: drug + dose + route + mechanism."),
]))
story.append(Spacer(1, 0.4*cm))
# ── LAQ 4 ───────────────────────────────────────────────────────────────────
story.append(KeepTogether([
Paragraph("LAQ 4 — Generalized Tonic-Clonic Epilepsy (PE 27.5, 27.6)", Q_LABEL),
Paragraph(
"<i>Case: 10-year-old boy, generalized tonic-clonic seizures for 6 months, "
"3 episodes per month, postictal confusion ~10 minutes each time.</i>", Q_CASE),
]))
story.append(Paragraph("(a) ILAE 2017 Classification of Epilepsy. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Seizure type level", 1,
"Focal onset (aware/impaired awareness/unknown) vs. Generalized onset (motor/non-motor) "
"vs. Unknown onset. <b>1 mark</b>: 3 main seizure types with subdivision."),
("Epilepsy type level", 1,
"Focal epilepsy | Generalized epilepsy | Combined focal + generalized | Unknown. "
"<b>1 mark</b>: all 4 types mentioned."),
("Epilepsy syndrome level", 1,
"Childhood absence epilepsy (3 Hz SW), Juvenile myoclonic epilepsy (JME — morning myoclonus, 4–6 Hz poly-SW), "
"Lennox-Gastaut (multiple seizure types, slow SW <2.5 Hz, cognitive decline), "
"Benign Rolandic epilepsy (centrotemporal spikes). "
"<b>1 mark</b>: ≥3 named syndromes with EEG pattern."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Management of generalized tonic-clonic epilepsy. [4 marks]", PART_LABEL))
story.append(rubric_table([
("First-line AED", 1,
"Sodium valproate 20–40 mg/kg/day (drug of choice for generalised epilepsy). "
"Levetiracetam as alternative. "
"<b>1 mark</b>: correct drug + dose + rationale."),
("Principles of AED therapy", 1,
"Start with monotherapy at lowest effective dose; increase gradually. "
"Maintain minimum 2 years seizure-free before considering withdrawal. "
"Monitor serum levels if toxicity suspected (valproate, phenytoin). "
"<b>1 mark</b>: monotherapy principle + duration + monitoring."),
("Non-pharmacological", 1,
"Ketogenic diet (2:1 or 4:1 fat:carb+protein ratio) for drug-resistant epilepsy. "
"Vagus nerve stimulation (VNS), corpus callosotomy for suitable cases. "
"Seizure first-aid education for parents/school. "
"<b>1 mark</b>: ketogenic diet + VNS + parent education all mentioned."),
("Valproate adverse effects", 1,
"Hepatotoxicity (monitor LFTs first 6 months), weight gain, hair loss, tremor, "
"teratogenicity (neural tube defects — avoid in girls of childbearing age), "
"thrombocytopaenia, hyperammonaemia. "
"<b>1 mark</b>: ≥4 correct side effects."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) When to withdraw AEDs. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Seizure-free period", 1,
"At least 2 years of complete seizure freedom (some guidelines: 2–4 years depending on syndrome). "
"<b>1 mark</b>: 2-year minimum stated."),
("Favourable prognostic factors", 1,
"Normal neurological examination, normal EEG before withdrawal, idiopathic epilepsy, "
"single seizure type, good response to first AED, no family history of epilepsy. "
"<b>1 mark</b>: ≥3 factors."),
("Withdrawal protocol + caution", 1,
"Taper over minimum 3–6 months (never abrupt withdrawal — risk of status epilepticus). "
"Counsel family on recurrence risk (~25–30%). Avoid withdrawal during exams or high-risk activities. "
"<b>1 mark</b>: slow taper + recurrence risk + counseling point."),
]))
story.append(Spacer(1, 0.4*cm))
# ── LAQ 5 ───────────────────────────────────────────────────────────────────
story.append(KeepTogether([
Paragraph("LAQ 5 — Infantile (Acquired) Hemiplegia (PE 27.3)", Q_LABEL),
Paragraph(
"<i>Case: 3-year-old previously healthy child, sudden right-sided hemiplegia "
"with fever, right UMN facial palsy, and aphasia.</i>", Q_CASE),
]))
story.append(Paragraph("(a) Definition and etiology. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Definition", 1,
"Hemiplegia acquired after a period of normal neurological development (not congenital), "
"most commonly before age 5 years. Acute hemiplegia of childhood: sudden onset within hours. "
"<b>1 mark</b>: acquired after normal development + age context."),
("Etiology", 2,
"<b>Vascular (most common)</b>: Arterial ischaemic stroke (cardiac embolism — CHD, rheumatic HD; "
"meningitis-associated vasculitis; sickle cell disease; moyamoya; coagulopathy). "
"<b>Infectious</b>: Focal cerebritis, cerebral abscess, HHV-6 / HSV encephalitis (HHE syndrome). "
"<b>Structural</b>: AVM rupture, venous sinus thrombosis, ADEM. "
"<b>Metabolic</b>: MELAS (mitochondrial). "
"<b>2 marks</b>: ≥3 categories with examples; <b>1 mark</b>: 2 categories only."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Clinical features of acute hemiplegia of childhood. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Acute presentation", 2,
"Sudden onset weakness of face + arm + leg (contralateral to lesion), "
"UMN facial palsy (lower face), dysphasia/aphasia (if dominant hemisphere), "
"homonymous hemianopia, hemisensory loss, focal seizures, altered consciousness. "
"Todd's palsy: post-ictal weakness mimicking stroke — transient (<24 h). "
"<b>2 marks</b>: ≥5 features; <b>1 mark</b>: 3–4 features."),
("Chronic phase features", 1,
"Spastic hemiplegia (UMN pattern), limb shortening/hemiatrophy (smaller affected limbs), "
"hemisensory deficit, visual field defect, post-hemiplegia epilepsy (~50%), "
"cognitive/behavioural issues. "
"<b>1 mark</b>: ≥3 chronic features."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Investigations and management. [4 marks]", PART_LABEL))
story.append(rubric_table([
("Investigations", 2,
"<b>Urgent</b>: CT head (rule out bleed), Blood glucose, CBC, electrolytes, coagulation. "
"<b>MRI brain + MRA/MRV</b>: gold standard — identifies infarct, vasculopathy, venous thrombosis. "
"<b>Echocardiography</b>: cardiac source of embolism. "
"<b>Thrombophilia screen</b>: protein C/S, APC resistance, antiphospholipid antibodies. "
"<b>Metabolic</b>: serum lactate (MELAS), amino acids. "
"<b>CSF</b>: if encephalitis / meningitis suspected. "
"<b>2 marks</b>: ≥5 investigations with rationale; <b>1 mark</b>: 3–4 correct."),
("Acute management", 1,
"Maintain airway + oxygenation. IV fluids (maintain euglycaemia). "
"Anticoagulation if cardiac embolism or cerebral venous thrombosis (LMWH then warfarin). "
"Aspirin in arterial ischaemic stroke (after haemorrhage excluded). "
"Antiepileptics if seizures. Treat precipitating cause (antibiotics for meningitis, IVIG for vasculitis). "
"<b>1 mark</b>: acute stabilisation + aetiological treatment."),
("Long-term management", 1,
"Physiotherapy, occupational therapy, speech therapy. "
"AED maintenance if post-hemiplegia epilepsy. "
"Aspirin prophylaxis. Sickle cell: hydroxyurea + transfusion programme. "
"Rehabilitation team approach + school support. "
"<b>1 mark</b>: ≥3 long-term components."),
]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SET 2 — Questions & Rubrics
# ═══════════════════════════════════════════════════════════════════════════
story.append(cover_banner([
"SET 2 — LONG ANSWER QUESTIONS",
"Mental Retardation | Cerebral Palsy | Floppy Infant | Duchenne Muscular Dystrophy",
"PE Competencies: 27.9, 27.10, 27.11, 27.12 | 5 × 10 Marks = 50 Marks",
], SET2_HDR))
story.append(Spacer(1, 0.3*cm))
# ── LAQ 6 ───────────────────────────────────────────────────────────────────
story.append(KeepTogether([
Paragraph("LAQ 6 — Intellectual Disability (Mental Retardation) (PE 27.9)", Q_LABEL),
Paragraph(
"<i>Case: 3-year-old child, global developmental delay, IQ testing shows IQ 45. "
"Not toilet-trained, single words only, cannot self-feed.</i>", Q_CASE),
]))
story.append(Paragraph("(a) Definition and IQ-based classification with functional implications. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Definition", 1,
"Significantly sub-average intellectual functioning (IQ ≤70) + concurrent deficits in ≥2 adaptive skill areas "
"(communication, self-care, social skills, home living, self-direction) + onset before age 18 years. "
"(DSM-5 now uses 'Intellectual Disability' — IQ + adaptive function + onset <18 yrs). "
"<b>1 mark</b>: all 3 criteria present."),
("IQ Classification", 2,
"<b>Mild (IQ 50–70)</b>: Educable; attains 6th grade academics; can live independently with support. "
"<b>Moderate (IQ 35–49)</b>: Trainable; limited academics; sheltered workshop; requires supervision. "
"<b>Severe (IQ 20–34)</b>: Limited communication; basic self-care with support; structured care needed. "
"<b>Profound (IQ <20)</b>: Minimal communication; total care dependency; significant physical disabilities common. "
"<b>2 marks</b>: all 4 categories + functional level; <b>1 mark</b>: 2–3 categories correct."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Common causes of intellectual disability. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Causes — 1 mark each category (max 3)", 3,
"<b>Prenatal genetic</b>: Down syndrome (most common identifiable), Fragile X (most common inherited), "
"PKU, congenital hypothyroidism, Rett syndrome, Prader-Willi. "
"<b>Prenatal acquired</b>: Congenital infections (TORCH), alcohol (FAS), radiation, iodine deficiency (cretinism). "
"<b>Perinatal</b>: Birth asphyxia/HIE, hyperbilirubinemia/kernicterus, prematurity. "
"<b>Postnatal</b>: Meningitis/encephalitis, severe malnutrition, lead toxicity, TBI. "
"<b>3 marks</b>: ≥3 categories each with ≥2 examples; <b>2 marks</b>: 2 categories; <b>1 mark</b>: 1 category."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Assessment and management approach. [4 marks]", PART_LABEL))
story.append(rubric_table([
("Assessment", 2,
"<b>History</b>: Antenatal (infections, drugs, radiation), perinatal (asphyxia, jaundice), family history. "
"<b>Developmental assessment</b>: Developmental history + Gesell / Bayley / DDST screening. "
"<b>IQ testing</b>: Wechsler (WPPSI/WISC), Stanford-Binet, Seguin Form Board. "
"<b>Investigations</b>: Chromosomal karyotype, FISH, chromosomal microarray; thyroid function; metabolic screen; "
"neuroimaging (MRI) if indicated; BERA (hearing). "
"<b>2 marks</b>: history + developmental tools + IQ test named + ≥3 investigations."),
("Management: Educational", 1,
"Special education (individualized education plan — IEP). Mainstreaming with resource room (mild ID). "
"Vocational training (moderate ID). Behavioural therapy (ABA). "
"<b>1 mark</b>: IEP + appropriate schooling + vocational."),
("Management: Medical + Family support", 1,
"Treat underlying cause (e.g., thyroxine for hypothyroidism, phenylalanine-restricted diet for PKU). "
"AED if epilepsy coexists. Genetic counselling. Family support groups. "
"Disability certification and social benefits. "
"<b>1 mark</b>: treat cause + genetic counselling + family support."),
]))
story.append(Spacer(1, 0.4*cm))
# ── LAQ 7 ───────────────────────────────────────────────────────────────────
story.append(KeepTogether([
Paragraph("LAQ 7 — Cerebral Palsy (PE 27.10)", Q_LABEL),
Paragraph(
"<i>Case: 9-month-old ex-preterm (30 weeks), persistent fisting, poor head control, "
"asymmetric Moro, increased lower limb tone. MRI: bilateral PVL.</i>", Q_CASE),
]))
story.append(Paragraph("(a) Definition and classification of CP. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Definition", 1,
"A group of permanent, non-progressive disorders of movement and posture causing activity limitation, "
"attributable to non-progressive disturbances in the developing foetal or infant brain. "
"Associated impairments: epilepsy, cognition, communication, perception, behaviour. "
"<b>1 mark</b>: non-progressive + developmental brain + activity limitation + associated impairments."),
("Classification by motor type", 1,
"Spastic (most common, 70–80%): UMN features. "
"Dyskinetic/Athetoid: basal ganglia — choreoathetosis/dystonia. "
"Ataxic: cerebellar — wide-based gait, intention tremor. "
"Mixed: spastic + dyskinetic. "
"<b>1 mark</b>: ≥3 types with distinguishing features."),
("Classification by topography", 1,
"Monoplegia, Hemiplegia (one side), Diplegia (legs > arms — prematurity), "
"Quadriplegia/Tetraplegia (all 4 limbs equally), Paraplegia. "
"GMFCS (Gross Motor Function Classification System): Levels I–V. "
"<b>1 mark</b>: ≥4 topographic types + GMFCS mentioned."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Clinical features and associated comorbidities. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Motor features of spastic diplegia", 1,
"Scissor gait (adductor spasm), toe-walking (equinus), brisk DTRs, extensor plantars, "
"delayed motor milestones, persistent primitive reflexes. "
"<b>1 mark</b>: ≥4 features of spastic diplegia."),
("Associated comorbidities", 2,
"<b>Epilepsy</b> (25–35%), <b>Intellectual disability</b> (30–50% — less in diplegia), "
"<b>Visual</b>: strabismus, cortical visual impairment. "
"<b>Hearing</b>: SNHL (esp. dyskinetic CP post-kernicterus). "
"<b>Speech/communication</b>: dysarthria, AAC needs. "
"<b>Orthopaedic</b>: hip dislocation, scoliosis, contractures. "
"<b>Nutrition/GI</b>: feeding difficulty, GERD, constipation. "
"<b>2 marks</b>: ≥5 comorbidities; <b>1 mark</b>: 3–4."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Comprehensive rehabilitation plan. [4 marks]", PART_LABEL))
story.append(rubric_table([
("Physiotherapy", 1,
"Bobath neurodevelopmental therapy (NDT). Stretching exercises to prevent contractures. "
"Gait training; assistive devices (walkers, AFOs — ankle-foot orthoses). "
"<b>1 mark</b>: NDT + stretching + orthoses."),
("Management of spasticity", 1,
"Oral: Baclofen, Diazepam. "
"Focal: Botulinum toxin type A injection (into spastic muscles — gastrocnemius, adductors): "
"3–4-month effect; creates window for physiotherapy. "
"Intrathecal baclofen pump (severe generalised spasticity). "
"Surgical: Selective dorsal rhizotomy (SDR) — permanent reduction; requires good underlying strength. "
"<b>1 mark</b>: BTX-A + intrathecal baclofen + SDR with indications."),
("Multidisciplinary team (MDT)", 1,
"Paediatrician, physiotherapist, occupational therapist, speech-language pathologist, "
"orthopaedic surgeon, ophthalmologist, audiologist, special educator, social worker. "
"<b>1 mark</b>: ≥5 team members named."),
("School / Family / Social", 1,
"IEP for school, assistive technology (AAC devices), home modifications, "
"family counselling and carer support, disability certification. "
"<b>1 mark</b>: ≥3 school/family components."),
]))
story.append(PageBreak())
# ── LAQ 8 ───────────────────────────────────────────────────────────────────
story.append(cover_banner([
"SET 2 — continued",
"LAQ 8, 9, 10: Floppy Infant | Duchenne Muscular Dystrophy | Down Syndrome",
], SET2_HDR))
story.append(Spacer(1, 0.3*cm))
story.append(KeepTogether([
Paragraph("LAQ 8 — Floppy Infant / SMA Type 1 (PE 27.11)", Q_LABEL),
Paragraph(
"<i>Case: 3-month-old, severe hypotonia since birth, absent DTRs, tongue fasciculations, "
"paradoxical breathing. SMN1 exon 7 deletion confirmed.</i>", Q_CASE),
]))
story.append(Paragraph("(a) Definition and central vs. peripheral hypotonia. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Definition of floppy infant", 1,
"Infant with generalized decrease in muscle tone (hypotonia) resulting in decreased resistance "
"to passive movement, abnormal posture (frog-leg), and poor head control. "
"<b>1 mark</b>: passive movement + frog-leg posture + head control."),
("Central vs. peripheral", 2,
"<b>Central hypotonia</b>: UMN / brain origin. "
"Features: brisk or normal DTRs, extensor plantars, cognitive delay, dysmorphic features common. "
"Causes: HIE, chromosomal (Down, PWS), metabolic, structural brain malformation. "
"<b>Peripheral hypotonia</b>: LMN / muscle/NMJ origin. "
"Features: absent/reduced DTRs, fasciculations (SMA), normal cognition, high CPK (myopathy). "
"Causes: SMA, congenital myopathies, myotonic dystrophy, myasthenia gravis. "
"<b>2 marks</b>: full comparison with ≥3 distinguishing features per type; "
"<b>1 mark</b>: partial comparison."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Classification of causes and diagnostic approach. [4 marks]", PART_LABEL))
story.append(rubric_table([
("Classification of causes", 2,
"<b>Central (UMN/Brain)</b>: HIE, chromosomal (Down, Prader-Willi), benign congenital hypotonia, "
"metabolic (hypothyroidism, organic acidurias), structural brain. "
"<b>Spinal cord</b>: Traumatic, transverse myelitis. "
"<b>Anterior horn cell</b>: SMA types 1, 2, 3 (SMN1 deletion); poliomyelitis. "
"<b>Peripheral nerve</b>: Guillain-Barré, hereditary neuropathies. "
"<b>NMJ</b>: Neonatal myasthenia gravis, botulism. "
"<b>Muscle</b>: Congenital myopathies (nemaline, central core), muscular dystrophies, metabolic myopathies. "
"<b>2 marks</b>: ≥5 categories with examples; <b>1 mark</b>: 3–4 categories."),
("Diagnostic approach", 2,
"<b>Step 1</b>: Establish central vs peripheral (history, examination, DTRs, fasciculations). "
"<b>Step 2</b>: Investigations — "
"Serum CPK (↑↑ in dystrophies; normal in SMA); "
"Thyroid function; karyotype/chromosomal microarray (central); "
"EMG + NCS (myopathic vs neurogenic); "
"SMN1 deletion testing (SMA); "
"Muscle biopsy (congenital myopathy — nemaline rods, central cores, fibre type disproportion); "
"Genetics: whole exome sequencing if diagnosis unclear. "
"<b>2 marks</b>: stepwise approach + ≥5 investigations with their rationale."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Prognosis and management of SMA type 1. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Prognosis", 1,
"SMA type 1 (Werdnig-Hoffmann): most severe. Onset birth–6 months. "
"Progressive weakness — never achieve sitting independently. "
"Respiratory failure: median survival 2 years without intervention. "
"<b>1 mark</b>: onset + never sit + survival without treatment."),
("Supportive care", 1,
"Nutritional support (nasogastric / gastrostomy feeding). "
"Respiratory: non-invasive ventilation (NIV/BiPAP), cough assist devices, airway clearance. "
"Palliative care discussion with family. "
"<b>1 mark</b>: nutrition + respiratory support + palliative."),
("Disease-modifying therapy", 1,
"<b>Nusinersen (Spinraza)</b>: antisense oligonucleotide — intrathecal; increases SMN protein. "
"<b>Onasemnogene abeparvovec (Zolgensma)</b>: gene replacement therapy — single IV infusion; "
"approved for children <2 years; most effective when started pre-symptomatically. "
"<b>Risdiplam (Evrysdi)</b>: oral SMN2 splicing modifier. "
"<b>1 mark</b>: ≥2 disease-modifying therapies named with mechanism."),
]))
story.append(Spacer(1, 0.4*cm))
# ── LAQ 9 ───────────────────────────────────────────────────────────────────
story.append(KeepTogether([
Paragraph("LAQ 9 — Duchenne Muscular Dystrophy (PE 27.12)", Q_LABEL),
Paragraph(
"<i>Case: 6-year-old boy with DMD confirmed on muscle biopsy and genetic testing.</i>", Q_CASE),
]))
story.append(Paragraph("(a) Genetics, pathophysiology, and natural history. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Genetics", 1,
"X-linked recessive. DMD gene on chromosome Xp21 — largest gene in human genome (2.4 Mb). "
"Codes for dystrophin (427 kDa structural protein). "
"~65% large deletions, ~10% duplications, ~25% point mutations. "
"1/3 cases are de novo mutations. Carrier females: may have raised CPK; rarely manifesting carriers. "
"<b>1 mark</b>: XLR + Xp21 + dystrophin + deletion type."),
("Pathophysiology", 1,
"Dystrophin: links F-actin cytoskeleton to extracellular matrix via dystroglycan complex. "
"Absence → membrane instability → repeated muscle fibre damage → necrosis → "
"fatty and fibrous replacement. Frameshift mutation = no dystrophin = Duchenne; "
"in-frame mutation = truncated dystrophin = Becker (milder). "
"<b>1 mark</b>: membrane link + necrosis mechanism + reading frame concept."),
("Natural history", 1,
"Normal at birth. Delayed motor milestones. Gower's sign by 3–5 years. "
"Loss of ambulation: average age 9–10 years (without steroids), 12+ years (with steroids). "
"Respiratory failure: 2nd decade. "
"Cardiomyopathy: dilated CMP in virtually all by late teens. "
"Death: average 2nd–3rd decade (respiratory/cardiac). "
"<b>1 mark</b>: timeline of milestones loss + ambulation + death."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Clinical features and disease progression. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Early features (3–5 years)", 1,
"Delayed walking, frequent falls, difficulty climbing stairs, toe-walking. "
"Gower's sign (climbs up legs to stand). Calf pseudohypertrophy (fatty/fibrous replacement). "
"<b>1 mark</b>: Gower's + pseudohypertrophy + 2 other early features."),
("Progressive features", 1,
"Proximal > distal weakness. Loss of ambulation (average 9–10 yr). "
"Scoliosis (post-ambulation). Respiratory involvement: restrictive lung disease, "
"nocturnal hypoventilation → need for NIV. "
"<b>1 mark</b>: loss of ambulation age + scoliosis + respiratory involvement."),
("Cardiac + Cognitive", 1,
"Dilated cardiomyopathy (nearly universal by late teens — 20% symptomatic by 18 yr). "
"Cognitive: mean IQ ~1 SD below average; specific learning difficulties (reading). "
"Non-progressive; related to dystrophin isoforms (Dp140) in CNS. "
"<b>1 mark</b>: CMP + cognitive profile + CNS dystrophin isoforms."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Current management: corticosteroids and gene-based therapies. [4 marks]", PART_LABEL))
story.append(rubric_table([
("Corticosteroids", 2,
"<b>Prednisolone</b> 0.75 mg/kg/day (deflazacort 0.9 mg/kg/day — less weight gain). "
"Started when motor function is plateauing (~4–6 years). "
"<b>Benefits</b>: Delays loss of ambulation by 2–3 years; preserves respiratory and cardiac function; "
"reduces scoliosis risk; prolongs survival. "
"<b>Side effects</b>: Weight gain, osteoporosis (vitamin D + Ca supplement mandatory), "
"hypertension, cataract, behavioural changes, growth suppression. "
"<b>2 marks</b>: drug + dose + benefits (≥3) + side effects (≥3)."),
("Exon skipping therapy", 1,
"Antisense oligonucleotides (ASOs) skip specific exons → restore reading frame → produce truncated "
"but partially functional dystrophin (like Becker). "
"<b>Eteplirsen</b> (exon 51 skip): FDA approved; ~13% of DMD mutations amenable. "
"<b>Golodirsen/Viltolarsen</b> (exon 53 skip). "
"<b>Casimersen</b> (exon 45 skip). "
"<b>1 mark</b>: mechanism (restore reading frame) + ≥2 drugs named with exon target."),
("Gene therapy + other", 1,
"<b>Micro-dystrophin gene therapy</b>: AAV-delivered mini-dystrophin (SRP-9001/Elevidys — FDA approved 2023 "
"for ages 4–5 yr ambulatory); delivers truncated dystrophin to muscle. "
"<b>Stop codon read-through</b>: Ataluren (nonsense mutations only; ~10%). "
"<b>Cardiac</b>: ACE inhibitors from age 10 (or at diagnosis of CMP). Beta-blockers. "
"<b>Respiratory</b>: NIV/BiPAP when FVC <50%. "
"<b>1 mark</b>: gene therapy approach + cardiac management + respiratory plan."),
]))
story.append(Spacer(1, 0.4*cm))
# ── LAQ 10 ───────────────────────────────────────────────────────────────────
story.append(KeepTogether([
Paragraph("LAQ 10 — Down Syndrome / Intellectual Disability (PE 27.9)", Q_LABEL),
Paragraph(
"<i>Case: 4-year-old with Down syndrome enrolled in early intervention. "
"Parents asking about long-term prognosis and associated medical problems.</i>", Q_CASE),
]))
story.append(Paragraph("(a) Clinical features of Down syndrome. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Facial / Head features", 1,
"Flat facies, brachycephaly, upward slanting palpebral fissures (mongoloid slant), "
"epicanthal folds, Brushfield spots (iris), small ears, flat nasal bridge, protruding tongue, "
"small mouth, short neck with skin folds. "
"<b>1 mark</b>: ≥5 facial/head features correctly listed."),
("Limb / Body features", 1,
"Short stature, single palmar crease (simian crease), clinodactyly (incurved 5th finger), "
"sandal gap (wide space 1st–2nd toe), hypotonia (universal), hyperflexibility of joints. "
"<b>1 mark</b>: ≥4 limb/body features."),
("Systemic associations", 1,
"Congenital heart disease (40–50%: AVSD most common, then VSD, ASD, PDA). "
"GI: duodenal atresia, Hirschsprung disease. "
"Haematological: increased risk of ALL and AML. "
"Endocrine: hypothyroidism (15–20%). "
"<b>1 mark</b>: CHD (AVSD) + ≥2 other systemic associations."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(b) Associated medical conditions and their monitoring. [4 marks]", PART_LABEL))
story.append(rubric_table([
("Cardiac", 1,
"Echo at diagnosis (all children). Surgery if AVSD/VSD haemodynamically significant. "
"Annual cardiology review. <b>1 mark</b>: Echo at diagnosis + surgical indication."),
("Thyroid", 1,
"Hypothyroidism in 15–20%. TFT at birth, 6 months, 12 months, then annually. "
"Treat with levothyroxine. <b>1 mark</b>: frequency of TFT + treatment."),
("Hearing/Vision", 1,
"BERA at birth (SNHL); audiometry annually. "
"Ophthalmology at 6 months (strabismus, nystagmus, refractive errors). "
"Atlantoaxial instability: X-ray C-spine (flexion-extension views) before contact sports/anaesthesia. "
"<b>1 mark</b>: BERA + ophthalmology + atlantoaxial screening."),
("Haematology + Cognitive",1,
"Blood count at birth (transient myeloproliferative disorder — TMD in 10%; "
"risk of AML by age 4). "
"Alzheimer's disease by 4th–5th decade (virtually universal — APP gene on Chr 21). "
"Cognitive level usually mild–moderate ID. "
"<b>1 mark</b>: TMD/AML + Alzheimer risk + ID level."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("(c) Role of early intervention and educational rehabilitation. [3 marks]", PART_LABEL))
story.append(rubric_table([
("Early intervention (0–3 years)", 1,
"Physiotherapy: head control, sitting, standing, walking. "
"Speech therapy: feeding, communication, language. "
"Occupational therapy: fine motor, ADL. "
"Evidence shows early intervention significantly improves functional outcomes. "
"<b>1 mark</b>: all 3 therapy types + evidence statement."),
("Educational approach", 1,
"Individualized Education Plan (IEP). "
"Inclusive education / mainstreaming with support for mild ID. "
"Special school for moderate–severe ID. "
"Vocational training in adolescence (sheltered workshops, supported employment). "
"<b>1 mark</b>: IEP + mainstreaming + vocational component."),
("Family + Social", 1,
"Genetic counselling (recurrence risk: free trisomy 21 ≈ 1% + age-related risk; "
"Robertsonian translocation: 10–100% depending on carrier parent). "
"Parent support groups (Down Syndrome Societies). "
"Disability certification + government schemes. "
"<b>1 mark</b>: genetic counselling with recurrence risk + support network."),
]))
story.append(Spacer(1, 0.5*cm))
# ─── Final Summary Table ─────────────────────────────────────────────────────
story.append(section_divider("MARKS SUMMARY — ALL LAQs", DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
summary_hdr = ["LAQ", "Topic", "Set", "(a)", "(b)", "(c)", "Total"]
summary_rows = [
["LAQ 1", "Bacterial Meningitis", "1", "3", "4", "3", "10"],
["LAQ 2", "Hydrocephalus", "1", "3", "3", "4", "10"],
["LAQ 3", "Complex Febrile Seizures", "1", "3", "3", "4", "10"],
["LAQ 4", "Generalized Epilepsy", "1", "3", "4", "3", "10"],
["LAQ 5", "Infantile Hemiplegia", "1", "3", "3", "4", "10"],
["LAQ 6", "Intellectual Disability", "2", "3", "3", "4", "10"],
["LAQ 7", "Cerebral Palsy", "2", "3", "3", "4", "10"],
["LAQ 8", "Floppy Infant / SMA", "2", "3", "4", "3", "10"],
["LAQ 9", "Duchenne Muscular Dystrophy", "2", "3", "3", "4", "10"],
["LAQ 10","Down Syndrome", "2", "3", "4", "3", "10"],
["", "GRAND TOTAL", "", "30", "33", "37", "100"],
]
sum_data = [[Paragraph(h, ParagraphStyle("sh", fontName="Helvetica-Bold", fontSize=8.5,
textColor=WHITE, alignment=TA_CENTER, leading=11))
for h in summary_hdr]]
for i, row in enumerate(summary_rows):
is_total = row[0] == ""
style_fn = lambda x, bold=is_total: Paragraph(
f"<b>{x}</b>" if bold else x,
ParagraphStyle("sr", fontName="Helvetica-Bold" if bold else "Helvetica",
fontSize=8.5 if not bold else 9,
textColor=GOLD if bold else colors.HexColor("#111827"),
alignment=TA_CENTER, leading=11))
sum_data.append([style_fn(c) for c in row])
sum_t = Table(sum_data, colWidths=[1.5*cm, 5.5*cm, 1.2*cm, 1.4*cm, 1.4*cm, 1.4*cm, 1.6*cm])
sum_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("GRID", (0,0),(-1,-1), 0.4, BORDER_GRAY),
("BACKGROUND", (0,-1),(-1,-1), colors.HexColor("#fef3c7")),
*[("BACKGROUND", (0,i),(-1,i), LIGHT_BLUE if i % 2 == 1 else ALT_ROW) for i in range(1, len(sum_data)-1)],
("TOPPADDING", (0,0),(-1,-1), 4), ("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING", (0,0),(-1,-1), 4),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("ALIGN", (2,0),(-1,-1), "CENTER"),
]))
story.append(sum_t)
story.append(Spacer(1, 0.5*cm))
story.append(HRFlowable(width="100%", thickness=0.5, color=BORDER_GRAY))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"<i>This answer key is prepared for examiner use only. "
"Based on OP Ghai Essential Pediatrics and Piyush Gupta Pediatrics (UG edition). "
"Marks awarded per sub-part as indicated in rubrics. Half marks may be awarded for partial answers. "
"Clinical reasoning and appropriate management steps should be rewarded even if exact terminology differs.</i>",
NOTE_STYLE))
# ─── BUILD ───────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=header_footer, onLaterPages=header_footer)
print(f"PDF generated: {OUTPUT_PATH}")
cd /tmp/workspace/cns-exam && python generate_answer_key.py 2>&1
ls -lh /tmp/workspace/cns-exam/CNS_LAQ_Answer_Key_with_Rubrics.pdf
CNS LAQ Answer Key with Rubrics
PDF Document · PDF
| Section | Content |
|---|---|
| Cover page | Exam details box, Global Scoring Guide (0–10 scale) |
| Set 1 (Pages 2–3) | LAQ 1–5 with full answer keys + colour-coded rubric tables |
| Set 2 (Pages 4–5) | LAQ 6–10 with full answer keys + colour-coded rubric tables |
| Final page | Marks Summary table for all 10 LAQs |