Create a pdf to download by Giving answers according to marks distribution rguhs mbbs by referring pediatric Ghai textbook in the form of flowchart and tabular form wherever its necessary
~/attachments/8a31174c-5ede-46fc-8b77-c0740bafc86c
cd /home/daytona/workspace/attachments/8a31174c-5ede-46fc-8b77-c0740bafc86c && f…
python3 -c " from PIL import Image import pillow_heif pillow_heif.register_heif_…
python3 -c " import pytesseract from PIL import Image img = Image.open('/tmp/que…
mkdir -p /home/daytona/workspace/rguhs-pediatrics && ls /home/daytona/workspace/…
~/rguhs-pediatrics/generate_pdf.py
#!/usr/bin/env python3
"""
RGUHS MBBS Phase III Pediatrics Answer PDF Generator
QP CODE: 1044 | Based on Ghai's Essential Pediatrics
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.graphics.shapes import Drawing, Rect, String, Line, Arrow
from reportlab.graphics import renderPDF
from reportlab.graphics.shapes import Drawing, Rect, String, Line, PolyLine, Polygon
from reportlab.platypus.flowables import Flowable
import io
# ── Color palette ──────────────────────────────────────────────────────────────
NAVY = colors.HexColor('#1a3a5c')
TEAL = colors.HexColor('#1abc9c')
LIGHT_BLU = colors.HexColor('#d6eaf8')
LIGHT_GRN = colors.HexColor('#d5f5e3')
LIGHT_YLW = colors.HexColor('#fef9e7')
LIGHT_RED = colors.HexColor('#fadbd8')
LIGHT_PUR = colors.HexColor('#e8daef')
ORANGE = colors.HexColor('#e67e22')
DARK_GRY = colors.HexColor('#2c3e50')
MID_GRY = colors.HexColor('#7f8c8d')
WHITE = colors.white
HEADER_BG = colors.HexColor('#1a3a5c')
ROW_ALT = colors.HexColor('#eaf4fb')
def make_doc(path):
return SimpleDocTemplate(
path,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="RGUHS Pediatrics Answers - QP 1044",
author="Ghai Essential Pediatrics Reference"
)
def styles():
s = getSampleStyleSheet()
base = dict(fontName='Helvetica', leading=14)
custom = {}
custom['cover_title'] = ParagraphStyle('cover_title',
parent=s['Title'], fontSize=22, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=6, fontName='Helvetica-Bold')
custom['cover_sub'] = ParagraphStyle('cover_sub',
parent=s['Normal'], fontSize=12, textColor=LIGHT_BLU,
alignment=TA_CENTER, spaceAfter=4)
custom['q_header'] = ParagraphStyle('q_header',
parent=s['Heading1'], fontSize=13, textColor=WHITE,
fontName='Helvetica-Bold', backColor=NAVY,
borderPadding=(6,10,6,10), spaceAfter=8, spaceBefore=14,
leftIndent=-5, rightIndent=-5)
custom['sub_head'] = ParagraphStyle('sub_head',
parent=s['Heading2'], fontSize=11, textColor=NAVY,
fontName='Helvetica-Bold', spaceAfter=4, spaceBefore=8,
borderPadding=(2,0,2,0))
custom['body'] = ParagraphStyle('body',
parent=s['Normal'], fontSize=10, leading=15,
alignment=TA_JUSTIFY, spaceAfter=4)
custom['bullet'] = ParagraphStyle('bullet',
parent=s['Normal'], fontSize=10, leading=14,
leftIndent=14, bulletIndent=4, spaceAfter=2)
custom['marks_tag'] = ParagraphStyle('marks_tag',
parent=s['Normal'], fontSize=9, textColor=ORANGE,
fontName='Helvetica-Bold', alignment=TA_LEFT)
custom['note'] = ParagraphStyle('note',
parent=s['Normal'], fontSize=9, textColor=MID_GRY,
fontName='Helvetica-Oblique', spaceAfter=4)
custom['table_head'] = ParagraphStyle('table_head',
parent=s['Normal'], fontSize=9, textColor=WHITE,
fontName='Helvetica-Bold', alignment=TA_CENTER)
custom['table_cell'] = ParagraphStyle('table_cell',
parent=s['Normal'], fontSize=9, leading=12,
alignment=TA_LEFT)
custom['fc_box'] = ParagraphStyle('fc_box',
parent=s['Normal'], fontSize=9, leading=13,
alignment=TA_CENTER, fontName='Helvetica-Bold')
custom['section_banner'] = ParagraphStyle('section_banner',
parent=s['Normal'], fontSize=14, textColor=WHITE,
fontName='Helvetica-Bold', backColor=TEAL,
alignment=TA_CENTER, spaceBefore=10, spaceAfter=10,
borderPadding=(8,12,8,12))
return custom
# ── Flowchart helper ───────────────────────────────────────────────────────────
class FlowchartBox(Flowable):
"""Simple flowchart made from boxes and arrows."""
def __init__(self, steps, width=460, box_h=28, box_gap=16, title='',
box_color=LIGHT_BLU, arrow_color=NAVY, font_size=8.5):
Flowable.__init__(self)
self.steps = steps # list of strings
self.box_w = width
self.box_h = box_h
self.box_gap = box_gap
self.title = title
self.box_color = box_color
self.arrow_color = arrow_color
self.font_size = font_size
# total height
n = len(steps)
self.height = n*box_h + (n-1)*box_gap + (30 if title else 10)
self.width = width
def draw(self):
c = self.canv
y_offset = self.height
if self.title:
c.setFont('Helvetica-Bold', 10)
c.setFillColor(NAVY)
c.drawCentredString(self.box_w/2, y_offset-14, self.title)
y_offset -= 28
for i, step in enumerate(self.steps):
top = y_offset - self.box_h
# box
c.setFillColor(self.box_color)
c.setStrokeColor(NAVY)
c.roundRect(0, top, self.box_w, self.box_h, 5, fill=1, stroke=1)
# text
c.setFillColor(DARK_GRY)
c.setFont('Helvetica-Bold', self.font_size)
# multi-line if needed
words = step.split()
line = ''
lines_out = []
for w in words:
test = (line + ' ' + w).strip()
if c.stringWidth(test, 'Helvetica-Bold', self.font_size) < self.box_w - 16:
line = test
else:
lines_out.append(line)
line = w
if line:
lines_out.append(line)
total_text_h = len(lines_out) * (self.font_size + 2)
ty = top + (self.box_h + total_text_h) / 2 - (self.font_size + 2)
for ln in lines_out:
c.drawCentredString(self.box_w/2, ty, ln)
ty -= (self.font_size + 2)
# arrow
if i < len(self.steps)-1:
ax = self.box_w / 2
ay_top = top - 2
ay_bot = top - self.box_gap + 4
c.setStrokeColor(self.arrow_color)
c.setLineWidth(1.5)
c.line(ax, ay_top, ax, ay_bot + 6)
# arrowhead
c.setFillColor(self.arrow_color)
c.beginPath()
c.moveTo(ax, ay_bot)
c.lineTo(ax-5, ay_bot+8)
c.lineTo(ax+5, ay_bot+8)
c.closePath()
c.fill()
y_offset -= (self.box_h + self.box_gap)
class DecisionFlowchart(Flowable):
"""Two-column branch flowchart for Yes/No decision."""
def __init__(self, items, width=460):
Flowable.__init__(self)
self.items = items # list of dicts: {node, yes, no}
self.width = width
self.height = len(items)*80 + 40
def draw(self):
pass # kept simple; use tables for complex branching
def make_table(headers, rows, col_widths=None, alt_row=True):
"""Build a styled ReportLab Table."""
st = styles()
header_row = [Paragraph(h, st['table_head']) for h in headers]
data = [header_row]
for i, row in enumerate(rows):
styled = [Paragraph(str(cell), st['table_cell']) for cell in row]
data.append(styled)
if col_widths is None:
page_w = A4[0] - 3.6*cm
col_widths = [page_w / len(headers)] * len(headers)
style_cmds = [
('BACKGROUND', (0,0), (-1,0), NAVY),
('TEXTCOLOR', (0,0), (-1,0), WHITE),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,-1), 9),
('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#bdc3c7')),
('ROWBACKGROUNDS', (0,1), (-1,-1),
[ROW_ALT, WHITE] if alt_row else [WHITE]),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
]
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle(style_cmds))
return t
def q_block(story, q_num, q_text, marks, color=NAVY):
"""Add a question header block."""
st = styles()
story.append(Spacer(1, 6))
story.append(Paragraph(
f"Q{q_num}. {q_text}",
st['q_header']))
story.append(Paragraph(f"[{marks} Marks]", st['marks_tag']))
story.append(Spacer(1, 4))
def section_banner(story, title):
st = styles()
story.append(Spacer(1, 10))
story.append(Paragraph(title, st['section_banner']))
story.append(Spacer(1, 4))
# ═══════════════════════════════════════════════════════════════════════════════
# CONTENT BUILDERS
# ═══════════════════════════════════════════════════════════════════════════════
def build_cover(story):
st = styles()
# title card table
cover_data = [[Paragraph("RGUHS MBBS PHASE III (PART II) - CBME", st['cover_title'])],
[Paragraph("PAEDIATRICS | QP CODE: 1044 | April 2025", st['cover_sub'])],
[Paragraph("Model Answers based on Ghai's Essential Pediatrics", st['cover_sub'])],
[Paragraph("Max Marks: 100 | Time: 3 Hours", st['cover_sub'])]]
cover_table = Table(cover_data, colWidths=[A4[0]-3.6*cm])
cover_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), NAVY),
('TOPPADDING', (0,0),(-1,-1), 10),
('BOTTOMPADDING', (0,0),(-1,-1), 10),
('LEFTPADDING', (0,0),(-1,-1), 16),
('RIGHTPADDING', (0,0),(-1,-1), 16),
]))
story.append(cover_table)
story.append(Spacer(1, 12))
story.append(Paragraph(
"This document provides detailed model answers for all questions in the exam paper, "
"incorporating flowcharts and tables as per RGUHS examination pattern. "
"Content aligned with <b>Ghai's Essential Pediatrics (9th Edition)</b>.",
st['body']))
story.append(HRFlowable(width='100%', thickness=1.5, color=TEAL))
story.append(Spacer(1, 4))
# Marks distribution table
dist_data = [
["Section", "No. of Questions", "Marks Each", "Total Marks"],
["Long Essays (LE)", "2", "10", "20"],
["Short Essays (SE)", "8", "5", "40"],
["Short Answers (SA)", "10", "3", "30"],
["Viva / Others", "-", "-", "10"],
["TOTAL", "", "", "100"],
]
dist_widths = [160, 110, 90, 95]
t = make_table(dist_data[0], dist_data[1:], col_widths=dist_widths)
story.append(Paragraph("<b>MARKS DISTRIBUTION</b>", styles()['sub_head']))
story.append(t)
story.append(PageBreak())
# ─── Q1: Short Stature ────────────────────────────────────────────────────────
def build_q1(story):
st = styles()
q_block(story, 1,
"7-yr boy, height 100 cm (-2SD): Diagnosis, Causes, Management of Short Stature",
"10 Marks (Long Essay)")
story.append(Paragraph("<b>a) Probable Diagnosis: SHORT STATURE</b>", st['sub_head']))
story.append(Paragraph(
"A child whose height falls below -2SD (or below 3rd percentile) for age and sex is defined as having <b>Short Stature</b>. "
"A 7-year-old with height 100 cm is significantly below the expected mean of ~121 cm (i.e., falls at ~-3SD), indicating pathological short stature.",
st['body']))
story.append(Paragraph("<b>b) Classification & Causes of Short Stature</b>", st['sub_head']))
t_causes = make_table(
["Category", "Specific Conditions"],
[
["<b>Normal Variants</b>",
"• Familial Short Stature (FSS)\n• Constitutional Growth Delay (CGD)"],
["<b>Nutritional</b>",
"• Protein-Energy Malnutrition\n• Iron, Zinc, Vitamin D deficiency"],
["<b>Endocrine</b>",
"• Growth Hormone Deficiency (GHD)\n• Hypothyroidism\n• Cushing syndrome\n• Diabetes mellitus (poorly controlled)\n• Precocious puberty"],
["<b>Systemic/Chronic Disease</b>",
"• Celiac disease / IBD\n• Chronic renal failure\n• Congenital heart disease\n• Chronic lung disease (asthma, cystic fibrosis)\n• HIV infection"],
["<b>Skeletal Dysplasias</b>",
"• Achondroplasia\n• Hypochondroplasia\n• Osteogenesis imperfecta"],
["<b>Chromosomal</b>",
"• Turner syndrome (45,X)\n• Down syndrome\n• Prader-Willi syndrome"],
["<b>Psychosocial</b>",
"• Emotional deprivation\n• Child abuse / neglect"],
["<b>Intrauterine</b>",
"• Small for Gestational Age (SGA)\n• Intrauterine Growth Restriction (IUGR)"],
],
col_widths=[160, 295]
)
story.append(t_causes)
story.append(Spacer(1, 8))
story.append(Paragraph("<b>c) Management Flowchart</b>", st['sub_head']))
fc = FlowchartBox([
"History: birth weight, parental heights, nutrition, pubertal stage, chronic illness",
"Examination: height, weight, head circumference, body proportions, dysmorphic features",
"Plot on growth chart → Calculate Height SDS / Height Age",
"Investigations: Bone age X-ray (L wrist), CBC, TFT, IGF-1, IGFBP-3, karyotype (girls), celiac serology",
"Identify Cause → Treat Underlying Condition",
"GH Deficiency → Recombinant GH therapy (0.025-0.05 mg/kg/day SC)",
"Hypothyroidism → Levothyroxine replacement",
"Turner/Chromosomal → GH + Estrogen at puberty",
"Nutritional → Dietary rehabilitation + micronutrient supplementation",
"Regular follow-up: height velocity every 6 months",
], width=455, box_h=26, box_gap=14, title="Management Algorithm for Short Stature",
box_color=LIGHT_BLU)
story.append(fc)
story.append(Spacer(1, 6))
story.append(Paragraph(
"<b>Key Point (Ghai):</b> Height velocity is more important than a single height measurement. "
"Normal height velocity is 5-6 cm/yr in school-age children. "
"GHD is diagnosed when peak GH <10 ng/mL on two stimulation tests.",
st['note']))
# ─── Q2: Acute Severe Asthma ─────────────────────────────────────────────────
def build_q2(story):
st = styles()
q_block(story, 2,
"12-yr girl with cough, hurried breathing, wheeze on irregular medications: Triggers, Management & Prevention of Acute Severe Asthma",
"10 Marks (Long Essay)")
story.append(Paragraph("<b>a) Triggers of Childhood Asthma</b>", st['sub_head']))
t_triggers = make_table(
["Category", "Specific Triggers"],
[
["Allergens (Indoor)", "House dust mite, cockroach, pet dander, mold"],
["Allergens (Outdoor)", "Pollen, fungal spores"],
["Infections", "Viral URTIs (rhinovirus, RSV), bacterial infections"],
["Exercise", "Exercise-induced bronchospasm (cold dry air)"],
["Irritants", "Tobacco smoke, air pollution, strong odors, chemicals"],
["Medications", "Aspirin, NSAIDs, beta-blockers"],
["Weather", "Cold air, humidity changes, thunderstorms"],
["Emotions", "Stress, crying, laughing"],
["GERD", "Acid reflux triggering bronchospasm"],
["Food", "Sulfites, preservatives (less common in children)"],
],
col_widths=[150, 305]
)
story.append(t_triggers)
story.append(Paragraph("<b>b) Severity Assessment of Acute Asthma (Ghai Table)</b>", st['sub_head']))
t_severity = make_table(
["Feature", "Mild", "Moderate", "Severe / Life-threatening"],
[
["SpO2", ">95%", "91-95%", "<91%"],
["Speech", "Full sentences", "Short phrases", "Words only / mute"],
["RR", "Normal-mildly elevated", "Elevated", "Very elevated"],
["Accessory muscles", "None", "Present", "Marked"],
["Wheeze", "End-expiratory", "Expiratory", "Silent chest (danger!)"],
["PEFR", ">80% predicted", "50-80%", "<50%"],
["Consciousness", "Alert", "Agitated", "Drowsy / confused"],
],
col_widths=[130, 90, 100, 135]
)
story.append(t_severity)
story.append(Paragraph("<b>Management Flowchart - Acute Severe Asthma</b>", st['sub_head']))
fc = FlowchartBox([
"ASSESS SEVERITY → SpO2, RR, PEFR, consciousness",
"OXYGEN: Maintain SpO2 >94% via face mask",
"SALBUTAMOL (SABA): 2.5-5mg nebulization every 20 min x3 in first hour",
"IPRATROPIUM BROMIDE 0.25mg nebulization (add to SABA in severe cases)",
"SYSTEMIC CORTICOSTEROIDS: Prednisolone 1-2 mg/kg/day PO or IV Hydrocortisone",
"If poor response → IV Magnesium Sulphate 25-75 mg/kg over 20 min",
"If life-threatening → ICU: IV Aminophylline, Heliox, IV Salbutamol, Intubation",
"MONITOR: SpO2, PEFR, clinical response every 1-2 hours",
"Discharge criteria: SpO2 >94%, PEFR >75%, stable for 4 hours",
], width=455, box_h=26, box_gap=14, title="Acute Severe Asthma Management",
box_color=LIGHT_GRN)
story.append(fc)
story.append(Paragraph("<b>Prevention of Asthma Exacerbations</b>", st['sub_head']))
t_prev = make_table(
["Level", "Intervention"],
[
["Step 1 (Intermittent)", "SABA as needed only"],
["Step 2 (Mild persistent)", "Low-dose ICS (Budesonide 100-200 mcg/day)"],
["Step 3 (Moderate)", "Medium-dose ICS or Low-dose ICS + LABA"],
["Step 4 (Severe)", "High-dose ICS + LABA + Montelukast"],
["Step 5", "Add-on: Theophylline, Omalizumab, Oral steroids"],
["Non-pharmacological", "Allergen avoidance, influenza vaccine, written asthma action plan, peak flow monitoring"],
],
col_widths=[160, 295]
)
story.append(t_prev)
story.append(PageBreak())
# ─── SHORT ESSAYS ─────────────────────────────────────────────────────────────
def build_short_essays(story):
st = styles()
section_banner(story, "SHORT ESSAYS | 8 x 5 = 40 Marks")
# Q3: Febrile Seizures
q_block(story, 3, "Define Febrile Seizures, Classify and Management", "5 Marks")
story.append(Paragraph(
"<b>Definition:</b> Febrile seizures are seizures occurring in children aged <b>6 months to 5 years</b>, "
"associated with fever ≥38°C (rectal), without evidence of intracranial infection, electrolyte imbalance, "
"or history of afebrile seizures. (Ghai 9e / Nelson)",
st['body']))
story.append(Paragraph("<b>Classification (Simple vs Complex)</b>", st['sub_head']))
t_fs = make_table(
["Feature", "Simple Febrile Seizure", "Complex Febrile Seizure"],
[
["Duration", "<15 minutes", ">15 minutes"],
["Type", "Generalized tonic-clonic", "Focal / partial"],
["Recurrence in 24h", "Once only", "Recurs within 24 hours"],
["Post-ictal", "Brief confusion", "Prolonged Todd's palsy possible"],
["Frequency", "~75% of all FS", "~25%"],
["Risk of epilepsy", "~1-2%", "~10%"],
],
col_widths=[130, 165, 160]
)
story.append(t_fs)
story.append(Paragraph("<b>Management Flowchart</b>", st['sub_head']))
fc3 = FlowchartBox([
"ACUTE: Place child in recovery position, time the seizure",
"If seizure >5 min: Diazepam 0.3 mg/kg IV or 0.5 mg/kg rectal",
"Identify & Treat Fever: Paracetamol 15 mg/kg + tepid sponging",
"Lumbar puncture if: age <12 months, complex FS, meningeal signs",
"Investigations: Blood glucose, electrolytes (to r/o metabolic causes)",
"EEG + Neuroimaging: NOT routine for simple FS; indicated for complex FS",
"Prophylaxis: Intermittent oral diazepam 0.3 mg/kg q8h during febrile illness",
"Parental counseling: FS is benign; recurrence risk ~30%; anti-epileptics rarely needed",
], width=455, box_h=25, box_gap=14, box_color=LIGHT_YLW)
story.append(fc3)
# Q4: Thalassemia Major
story.append(Spacer(1, 8))
q_block(story, 4, "Investigations in child with Thalassemia Major (10-month infant with pallor, HSM, family h/o transfusion)", "5 Marks")
story.append(Paragraph(
"Thalassemia Major (beta-thalassemia homozygous) presents by 6 months to 2 years with severe hemolytic anemia, "
"hepatosplenomegaly, and transfusion dependence.",
st['body']))
t_thal = make_table(
["Investigation", "Expected Finding in Thal Major"],
[
["Hemoglobin", "<7 g/dL (often 3-5 g/dL)"],
["CBC - MCV/MCH", "Microcytic (<70 fL), Hypochromic (<20 pg)"],
["PBS (Peripheral Blood Smear)", "Microcytosis, hypochromia, target cells, nucleated RBCs, basophilic stippling, tear-drop cells"],
["Reticulocyte count", "Elevated (compensatory erythropoiesis)"],
["HbA2 (HPLC / Electrophoresis)", "HbF >90%, HbA absent, HbA2 variable"],
["Serum Iron + Ferritin", "Elevated (iron overload from transfusions)"],
["TIBC", "Decreased"],
["Bilirubin (indirect)", "Elevated (hemolysis)"],
["LFT", "Elevated transaminases (iron overload hepatopathy)"],
["X-ray skull / bones", "'Hair-on-end' appearance (marrow expansion)"],
["Echocardiogram", "Dilated cardiomyopathy (iron overload)"],
["Genetic/DNA analysis", "Confirm mutation type (IVS 1-5, 619 bp deletion, etc.)"],
["Parents' CBC + HPLC", "Both parents: microcytosis, HbA2 >3.5% (trait carriers)"],
],
col_widths=[185, 270]
)
story.append(t_thal)
# Q5: Acute Flaccid Paralysis
story.append(PageBreak())
q_block(story, 5, "Differential Diagnosis of Acute Flaccid Paralysis (AFP)", "5 Marks")
story.append(Paragraph(
"<b>AFP</b> is defined as acute onset of flaccid (lower motor neuron type) paralysis in a child <15 years. "
"All AFP cases must be reported under Polio surveillance.",
st['body']))
t_afp = make_table(
["Level of Lesion", "Disease", "Key Distinguishing Features"],
[
["Anterior Horn Cell", "Poliomyelitis", "Fever, asymmetric, pure motor, normal sensation, CSF pleocytosis"],
["Anterior Horn Cell", "Non-polio Enterovirus (EV-D68, EV-A71)", "Limb pain, respiratory illness preceding"],
["Nerve Roots", "Guillain-Barre Syndrome (GBS)", "Ascending, symmetric, areflexia, albuminocytologic dissociation in CSF, post-infectious"],
["Peripheral Nerve", "Traumatic Neuritis", "H/o injection in buttock, footdrop"],
["NMJ", "Botulism", "Descending, bulbar first, constipation, food h/o"],
["NMJ", "Myasthenia Gravis", "Fatigable weakness, ptosis, normal reflexes"],
["Muscle", "Hypokalemic Periodic Paralysis", "Sudden onset, K+ low, trigger: high carb meal"],
["Muscle", "Inflammatory Myopathy", "Proximal weakness, elevated CK, rash (dermatomyositis)"],
["Spinal Cord", "Transverse Myelitis", "Sensory level, bladder involvement, paraplegia"],
["Spinal Cord", "Spinal Cord Compression", "H/o trauma, tumor; MRI spine diagnostic"],
],
col_widths=[120, 135, 200]
)
story.append(t_afp)
story.append(Paragraph(
"<b>Investigation of AFP:</b> Stool x2 for poliovirus (within 14 days onset), nerve conduction studies, "
"CSF analysis, MRI spine, electrolytes.",
st['note']))
# Q6: Dehydration Management
q_block(story, 6, "Management of Dehydration in 2-yr boy (loose stools, irritability, decreased urine output, thirsty)", "5 Marks")
story.append(Paragraph(
"The child's features (thirsty, irritable, decreased urine output) suggest <b>Some Dehydration (WHO classification)</b>. "
"Estimated dehydration: 5-10% body weight loss.",
st['body']))
story.append(Paragraph("<b>WHO Dehydration Classification (Table)</b>", st['sub_head']))
t_dehyd_class = make_table(
["Feature", "No Dehydration", "Some Dehydration", "Severe Dehydration"],
[
["General", "Well, alert", "Restless/irritable", "Lethargic/unconscious"],
["Eyes", "Normal", "Sunken", "Very sunken"],
["Tears", "Present", "Absent", "Absent"],
["Mouth/tongue", "Moist", "Dry", "Very dry"],
["Thirst", "Normal", "Thirsty, drinks eagerly", "Drinks poorly / unable"],
["Skin pinch", "Goes back quickly", "Goes back slowly (<2s)", "Goes back very slowly (>2s)"],
["Dehydration %", "<5%", "5-10%", ">10%"],
["Treatment Plan", "Plan A", "Plan B", "Plan C"],
],
col_widths=[110, 100, 120, 125]
)
story.append(t_dehyd_class)
story.append(Paragraph("<b>Management Flowchart - Plan B (Some Dehydration)</b>", st['sub_head']))
fc6 = FlowchartBox([
"Weight child → Calculate ORS requirement: 75 mL/kg in 4 hours",
"ORS (low osmolarity): Give 75 mL/kg over 4 hours (slow, frequent sips)",
"If vomiting: small frequent sips every 5 min; NG tube if needed",
"Reassess every 1-2 hours (signs of dehydration, urine output)",
"Continue breast feeding / age-appropriate diet throughout",
"Zinc supplementation: 20 mg/day x 14 days (children >6 months)",
"After rehydration: Plan A (ORS 10 mL/kg per loose stool + normal diet)",
"IV fluids (Ringer Lactate) only if severe dehydration / unable to drink",
"Educate mother: danger signs, when to return, hand hygiene",
], width=455, box_h=25, box_gap=13, box_color=LIGHT_GRN)
story.append(fc6)
# Q7: Nadas Criteria (not fully legible in scan but implied)
story.append(PageBreak())
q_block(story, 7, "Nadas Criteria (Diagnosis of Rheumatic Heart Disease / VSD)", "5 Marks")
story.append(Paragraph(
"Nadas criteria are used to diagnose <b>congestive cardiac failure</b> and hemodynamically significant "
"cardiac shunts in children. They comprise major and minor criteria.",
st['body']))
t_nadas = make_table(
["Criteria Type", "Parameter", "Threshold"],
[
["Major", "Respiratory rate", ">60/min (infants) / >40/min (older)"],
["Major", "Heart rate", ">160/min (infants) / >100/min (older)"],
["Major", "Hepatomegaly", ">3 cm below costal margin"],
["Major", "Cardiomegaly", "Cardiothoracic ratio >0.55 (infants) / >0.50 (children)"],
["Minor", "Periorbital edema", "Present"],
["Minor", "Basal crepitations", "Present (pulmonary congestion)"],
["Minor", "Gallop rhythm", "Present"],
],
col_widths=[100, 160, 195]
)
story.append(t_nadas)
story.append(Paragraph(
"<b>Diagnosis of CCF:</b> 2 major criteria OR 1 major + 2 minor criteria = CCF present.",
st['note']))
# Q8: NACP
q_block(story, 8, "National Anemia Control Programme and its recommendations", "5 Marks")
story.append(Paragraph(
"The <b>National Iron Plus Initiative (NIPI) / NACP</b> is India's program to reduce iron deficiency anemia "
"across all life stages.",
st['body']))
t_nacp = make_table(
["Target Group", "Formulation", "Dose & Frequency"],
[
["Infants 6-59 months", "Liquid IFA (25 mg elemental Fe + 100 mcg Folic acid)", "Once weekly"],
["Children 5-9 years", "Small IFA tablet (45 mg Fe + 400 mcg FA)", "Once weekly"],
["Children 10-19 years (school)", "Large IFA tablet (100 mg Fe + 500 mcg FA)", "Once weekly (WIFS)"],
["Pregnant women", "Large IFA tablet", "Daily x 180 days"],
["Lactating mothers", "Large IFA tablet", "Daily x 180 days (post-partum)"],
["Albendazole", "Deworming 400 mg stat", "6-monthly (children >1yr)"],
],
col_widths=[140, 175, 140]
)
story.append(t_nacp)
story.append(Paragraph(
"<b>Target:</b> Reduce anemia prevalence by 50% by 2025 (National Health Policy). "
"Distribution through ASHA/ANM workers under Weekly Iron and Folic Acid Supplementation (WIFS).",
st['note']))
# Q9: Rotavirus Vaccine
q_block(story, 9, "Rotavirus Vaccine", "5 Marks")
t_rota = make_table(
["Parameter", "Details"],
[
["Disease", "Rotavirus - commonest cause of severe dehydrating diarrhea in <5yr children"],
["Available Vaccines in India", "ROTAVAC (Bharat Biotech - monovalent G9P[11]), ROTASIIL (Serum Institute - pentavalent), Rotarix (GSK - G1P[8]), RotaTeq (Merck - pentavalent)"],
["Schedule (IAP/NIP India)", "3 doses: 6 weeks, 10 weeks, 14 weeks (with DPT/OPV)"],
["Route & Dose", "Oral, 5 drops (0.5 mL) per dose"],
["Contraindications", "SCID, intussusception h/o, latex allergy (Rotarix)"],
["Efficacy", "~55-70% against all Rota diarrhea; ~90% against severe disease"],
["IAP UIP 2023", "First dose must be given by 12 weeks; complete by 32 weeks"],
["Cold chain", "Requires 2-8°C refrigeration; no freezing"],
["Impact", "~40% reduction in rotavirus hospitalizations seen in India"],
],
col_widths=[160, 295]
)
story.append(t_rota)
# Q10: Cephalhematoma
story.append(PageBreak())
q_block(story, 10, "Cephalhematoma", "5 Marks")
story.append(Paragraph(
"<b>Definition:</b> Subperiosteal collection of blood between the pericranium and the outer table of skull bones. "
"It does NOT cross suture lines (confined to one bone).",
st['body']))
t_ceph = make_table(
["Feature", "Cephalhematoma", "Caput Succedaneum"],
[
["Location", "Subperiosteal", "Subcutaneous (scalp)"],
["Suture lines", "Does NOT cross", "Crosses suture lines"],
["Onset", "Hours after birth (delayed)", "Present at birth"],
["Consistency", "Firm, fluctuant, tense", "Soft, pitting edema"],
["Resolution", "Weeks to months", "Days"],
["Causes", "Vacuum delivery, forceps, prolonged labor", "Normal vaginal delivery"],
["Complications", "Jaundice (hemolysis), anemia, skull fracture (~25%), calcification", "Usually none"],
["Management", "Mostly conservative; phototherapy for jaundice; never aspirate (infection risk)", "Reassurance"],
],
col_widths=[120, 175, 160]
)
story.append(t_ceph)
story.append(PageBreak())
# ─── SHORT ANSWERS ────────────────────────────────────────────────────────────
def build_short_answers(story):
st = styles()
section_banner(story, "SHORT ANSWERS | 10 x 3 = 30 Marks")
# Q11: ARV drugs
q_block(story, 11, "List six Antiretroviral Drugs", "3 Marks")
t_arv = make_table(
["Class", "Drug Name", "Mechanism"],
[
["NRTI", "Zidovudine (AZT)", "Nucleoside RT Inhibitor"],
["NRTI", "Lamivudine (3TC)", "Nucleoside RT Inhibitor"],
["NRTI", "Abacavir (ABC)", "Nucleoside RT Inhibitor"],
["NNRTI", "Nevirapine (NVP)", "Non-nucleoside RT Inhibitor"],
["NNRTI", "Efavirenz (EFV)", "Non-nucleoside RT Inhibitor"],
["PI", "Lopinavir/Ritonavir (LPV/r)", "Protease Inhibitor (preferred in children <3yr)"],
],
col_widths=[80, 150, 225]
)
story.append(t_arv)
story.append(Paragraph(
"<b>India NACO Pediatric First-line ART:</b> ABC + 3TC + LPV/r (<3 yr) or ABC + 3TC + EFV (>3 yr).",
st['note']))
# Q12: Hyperkalemia
q_block(story, 12, "Define Hyperkalemia and list three common causes", "3 Marks")
story.append(Paragraph(
"<b>Definition:</b> Serum potassium >5.5 mEq/L in neonates (>5.0 mEq/L in children and adults).",
st['body']))
story.append(Paragraph("<b>Three Common Causes:</b>", st['sub_head']))
for cause in [
"1. <b>Renal failure</b> (Acute or Chronic Kidney Disease) - reduced urinary K+ excretion",
"2. <b>Metabolic acidosis</b> (DKA, sepsis) - intracellular K+ shifts to extracellular",
"3. <b>Addison's disease / Hypoaldosteronism</b> - reduced renal K+ excretion",
]:
story.append(Paragraph(cause, st['bullet']))
story.append(Paragraph(
"<b>ECG changes:</b> Peaked T waves → Prolonged PR → Wide QRS → Sine wave → VF (life-threatening).",
st['note']))
# Q13: Vitamin K
q_block(story, 13, "Role of Vitamin K injection in Newborn + Dose", "3 Marks")
story.append(Paragraph(
"<b>Role:</b> Newborns are born with physiologically low levels of Vitamin K-dependent clotting factors "
"(II, VII, IX, X, Protein C, S). Breast milk is poor in Vitamin K. "
"This predisposes to <b>Hemorrhagic Disease of the Newborn (HDN)</b> / Vitamin K Deficiency Bleeding (VKDB).",
st['body']))
t_vitk = make_table(
["Type of VKDB", "Timing", "Presentation"],
[
["Early", "0-24 hours", "Maternal drugs (warfarin, antiepileptics, rifampicin)"],
["Classic", "2-7 days", "GI bleed, umbilical bleed, circumcision bleed"],
["Late", "2-12 weeks", "Intracranial bleed, cholestasis (most dangerous)"],
],
col_widths=[110, 110, 235]
)
story.append(t_vitk)
story.append(Paragraph(
"<b>Dose:</b> Vitamin K1 (Phytomenadione) <b>1 mg IM</b> single dose at birth for ALL neonates. "
"(If <1 kg: 0.5 mg IM). Oral route less reliable.",
st['note']))
# Q14: Thrombocytopenia
q_block(story, 14, "Enumerate causes of thrombocytopenia in children", "3 Marks")
t_thrombo = make_table(
["Mechanism", "Causes"],
[
["Decreased production", "Aplastic anemia, Fanconi anemia, leukemia, drugs (chemotherapy)"],
["Increased destruction (immune)", "ITP (Immune Thrombocytopenic Purpura), SLE, drug-induced"],
["Increased destruction (non-immune)", "HUS, DIC, TTP, mechanical (prosthetic valves)"],
["Sequestration", "Hypersplenism (portal hypertension, storage disorders)"],
["Neonatal", "Neonatal alloimmune thrombocytopenia (NAIT), maternal ITP, infections (TORCH)"],
["Infections", "Dengue fever, malaria, sepsis, HIV, CMV, EBV"],
["Congenital", "Wiskott-Aldrich syndrome, May-Hegglin anomaly, TAR syndrome"],
],
col_widths=[160, 295]
)
story.append(t_thrombo)
# Q15: Adolescent Immunization
story.append(PageBreak())
q_block(story, 15, "Adolescent Immunization", "3 Marks")
t_adol_imm = make_table(
["Vaccine", "Age", "Schedule", "Indication"],
[
["Tdap booster", "10-12 yrs", "Single dose booster", "Whooping cough protection"],
["HPV (Human Papillomavirus)", "9-14 yrs (girls + boys)", "2 doses (0,6 months) if <15 yrs; 3 doses if ≥15 yrs", "Cervical cancer prevention"],
["Hepatitis A (if not given)", "2 doses", "0, 6 months", "Catch-up"],
["Varicella (if not immune)", "2 doses", "0, 3 months", "Catch-up"],
["Meningococcal (MCV4)", "11-12 yrs (US); high-risk in India", "1 dose + booster at 16 yrs", "Meningococcal disease"],
["Influenza", "Annually", "Yearly", "High-risk adolescents"],
["COVID-19", "≥12 yrs", "Per national schedule", "SARS-CoV-2"],
],
col_widths=[120, 70, 140, 125]
)
story.append(t_adol_imm)
# Q16: Malaria Complications
q_block(story, 16, "Complications of Malaria in children", "3 Marks")
t_mal = make_table(
["System", "Complication"],
[
["Neurological (Cerebral malaria)", "Seizures, coma, hemiplegia, cortical blindness, increased ICP"],
["Hematological", "Severe anemia (Hb <5 g/dL), thrombocytopenia, DIC"],
["Renal", "Acute kidney injury / Blackwater fever (massive hemolysis + hemoglobinuria)"],
["Respiratory", "Acute Respiratory Distress Syndrome (ARDS), pulmonary edema"],
["Metabolic", "Hypoglycemia (esp. with quinine), metabolic acidosis, hyponatremia"],
["Hepatic", "Hepatomegaly, jaundice, malarial hepatitis"],
["Splenic", "Splenic rupture (rare), tropical splenomegaly syndrome"],
["Hyperparasitemia", ">5% parasitemia → poor prognosis"],
],
col_widths=[160, 295]
)
story.append(t_mal)
story.append(Paragraph(
"<b>Note:</b> Cerebral malaria (P. falciparum) is the most dangerous complication. "
"Treat with IV Artesunate (first-line) + supportive care.",
st['note']))
# Q17: Scabies treatment
q_block(story, 17, "Treatment of Scabies in children", "3 Marks")
story.append(Paragraph(
"<b>Scabies</b> is caused by <i>Sarcoptes scabiei</i> var hominis. "
"The hallmark is nocturnal pruritus and burrows in interdigital spaces.",
st['body']))
t_scab = make_table(
["Drug", "Age", "Application", "Notes"],
[
["Permethrin 5% cream", ">2 months", "Neck down, wash after 8-12h; repeat after 1 wk", "First-line (safest)"],
["Benzyl Benzoate 25%", ">2 years", "Apply x 3 nights, bath on 4th day", "Dilute to 12.5% for children"],
["Ivermectin oral", ">5 yrs / >15 kg", "200 mcg/kg, repeat after 2 weeks", "Crusted/Norwegian scabies"],
["Sulfur 5-10% ointment", "All ages including infants", "Apply nightly x3 days", "Safest for infants <2 months"],
["Crotamiton 10%", "Adults mainly", "Apply x2 days", "Less effective"],
],
col_widths=[130, 80, 170, 75]
)
story.append(t_scab)
story.append(Paragraph(
"<b>Important:</b> Treat all household contacts simultaneously. Wash all clothing/bedding in hot water. "
"Antihistamines for pruritus (may persist 2-4 weeks after treatment).",
st['note']))
# Q18: Organophosphorus poisoning
q_block(story, 18, "Muscarinic effects of Organophosphorus poisoning", "3 Marks")
story.append(Paragraph(
"<b>OP compounds</b> inhibit acetylcholinesterase → accumulation of Ach → overstimulation of muscarinic and nicotinic receptors.",
st['body']))
story.append(Paragraph("<b>Muscarinic Effects (mnemonic: DUMBELS / SLUDGE)</b>", st['sub_head']))
t_op = make_table(
["Mnemonic Letter", "Feature", "System"],
[
["D", "Defecation / Diarrhea", "GI"],
["U", "Urination", "Urinary"],
["M", "Miosis (pinpoint pupils)", "Eye"],
["B", "Bradycardia, Bronchoconstriction", "Cardiac/Respiratory"],
["E", "Emesis (vomiting)", "GI"],
["L", "Lacrimation", "Eye"],
["S", "Salivation, Sweating, Secretions", "Exocrine glands"],
["+", "Bronchospasm + Bronchorrhea", "Respiratory (life-threatening)"],
],
col_widths=[100, 180, 175]
)
story.append(t_op)
story.append(Paragraph(
"<b>Treatment:</b> ABC → Atropine (titrate until secretions dry up) → Pralidoxime (within 24-48h) → ICU support.",
st['note']))
# Q19: Renal Biopsy in PSGN
q_block(story, 19, "Indications for Renal Biopsy in Post-Streptococcal Glomerulonephritis (PSGN)", "3 Marks")
story.append(Paragraph(
"PSGN is usually self-limiting and biopsy is NOT routinely indicated. "
"Biopsy is reserved for atypical presentations.",
st['body']))
story.append(Paragraph("<b>Indications for Renal Biopsy in PSGN:</b>", st['sub_head']))
indications = [
"1. Absence of typical latent period (Group A Strep infection → nephritic syndrome onset: <1 wk)",
"2. Persistent low complement (C3) beyond <b>8-12 weeks</b> (suggests alternate diagnosis like MPGN, SLE)",
"3. Nephrotic-range proteinuria persisting >4 weeks",
"4. Persistent hematuria >12-18 months",
"5. Rapidly progressive glomerulonephritis (RPGN) pattern - rapidly rising creatinine",
"6. No evidence of preceding streptococcal infection (ASO titer negative)",
"7. Age <2 years or >12 years (atypical presentation)",
]
for ind in indications:
story.append(Paragraph(ind, st['bullet']))
# Q20: Kangaroo Mother Care (implied from 'Kan e' in scan)
q_block(story, 20, "Components of Kangaroo Mother Care (KMC)", "3 Marks")
story.append(Paragraph(
"<b>Kangaroo Mother Care (KMC)</b> is evidence-based care for low birth weight (LBW) and preterm neonates "
"involving continuous skin-to-skin contact between mother and neonate.",
st['body']))
t_kmc = make_table(
["Component", "Details"],
[
["1. Kangaroo Position", "Neonate placed upright, skin-to-skin on mother's chest between breasts. Head turned to one side. Flexed limbs."],
["2. Kangaroo Nutrition", "Exclusive breastfeeding or expressed breast milk (EBM). Breastfeed on demand (8-12 times/24h)."],
["3. Kangaroo Discharge", "Early discharge with LBW baby once stable, feeding well, gaining weight, and KMC is practiced."],
["4. Kangaroo Support", "Family/community support: father KMC, trained nurses, follow-up visits (day 3, 7, 14, monthly)."],
["5. Warmth", "Continuous skin-to-skin prevents hypothermia. No need for incubator if continuous KMC."],
],
col_widths=[140, 315]
)
story.append(t_kmc)
story.append(Paragraph(
"<b>WHO recommends:</b> Start KMC as soon as possible for all neonates <2000g (including those on oxygen if stable). "
"Minimum 8 hours/day; continuous KMC is ideal. "
"Reduces mortality by 40% in LBW neonates (Lancet 2021).",
st['note']))
# ═══════════════════════════════════════════════════════════════════════════════
# MAIN
# ═══════════════════════════════════════════════════════════════════════════════
def main():
out_path = '/home/daytona/workspace/rguhs-pediatrics/RGUHS_Pediatrics_QP1044_Answers.pdf'
doc = make_doc(out_path)
story = []
st = styles()
build_cover(story)
# Long essays header
section_banner(story, "LONG ESSAYS | 2 x 10 = 20 Marks")
build_q1(story)
story.append(PageBreak())
build_q2(story)
build_short_essays(story)
build_short_answers(story)
# Final reference note
story.append(Spacer(1, 20))
story.append(HRFlowable(width='100%', thickness=1, color=TEAL))
story.append(Spacer(1, 6))
story.append(Paragraph(
"<b>Reference:</b> Ghai OP, Paul VK, Bagga A. <i>Essential Pediatrics</i>, 9th Edition. CBS Publishers. | "
"Harriet Lane Handbook 23e | IAP Immunization Guidelines 2023 | WHO IMCI / IMNCI Guidelines | "
"National Health Mission India - NACP / NIPI / WIFS Programs.",
st['note']))
story.append(Paragraph(
f"Generated for RGUHS MBBS Phase III Pediatrics | QP Code: 1044 | April 2025",
st['note']))
doc.build(story)
print(f"PDF generated: {out_path}")
return out_path
if __name__ == '__main__':
main()
cd /home/daytona/workspace/rguhs-pediatrics && python3 generate_pdf.py 2>&1
~/rguhs-pediatrics/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/rguhs-pediatrics/generate_pdf.py'
cd /home/daytona/workspace/rguhs-pediatrics && python3 generate_pdf.py 2>&1
~/rguhs-pediatrics/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/rguhs-pediatrics/generate_pdf.py'
cd /home/daytona/workspace/rguhs-pediatrics && python3 generate_pdf.py 2>&1 && l…