From ch2 questions wise answers according to park's textbook
Park's Textbook of Preventive and Social Medicine, p. 151
| Feature | Epidemic | Outbreak |
|---|---|---|
| Scale | Wider geographic spread, larger population affected | Limited to a small area / institution |
| Number | Larger number of cases | Relatively fewer cases |
| Usage | Used for classical widespread events | Often preferred for food poisoning, institutional clusters |
| Connotation | Implies public alarm | Less alarming to public |
Attack Rate = (Number of new cases during epidemic period / Population at risk) × 100
EPIDEMIOLOGICAL STUDIES
├── Observational (non-experimental)
│ ├── Descriptive
│ │ ├── Case report / Case series
│ │ ├── Cross-sectional (prevalence) study
│ │ └── Ecological (correlational) study
│ └── Analytical
│ ├── Case-control study (retrospective)
│ └── Cohort study (prospective/longitudinal)
└── Experimental (Interventional)
├── Randomized Controlled Trial (RCT)
├── Field trial
└── Community trial
| Age | Vaccine | Dose | Route | Site |
|---|---|---|---|---|
| Birth | BCG | 0.1 ml (0.05 ml neonates) | Intradermal | Left upper arm |
| Birth | OPV-0 (zero dose) | 2 drops | Oral | Oral |
| Birth | Hepatitis B (birth dose) | 0.5 ml | Intramuscular | Anterolateral thigh |
| 6 weeks | OPV-1 + Penta-1 (DPT+HepB+Hib) + IPV-1 + RVV-1 | - | Oral/IM/Oral | - |
| 10 weeks | OPV-2 + Penta-2 + RVV-2 | - | Oral/IM/Oral | - |
| 14 weeks | OPV-3 + Penta-3 + IPV-2 + RVV-3 | - | Oral/IM/Oral | - |
| 9-12 months | Measles-Rubella (MR)-1 + JE-1 (endemic areas) + Vitamin A (1st dose) | 0.5 ml | Subcutaneous | Right upper arm |
| 16-24 months | DPT booster-1 + OPV booster + MR-2 + JE-2 + Vitamin A (2nd dose) | - | IM/Oral/SC | - |
| 5-6 years | DPT booster-2 | - | IM | - |
| 10 years & 16 years | TT | 0.5 ml | IM | - |
| Category | Definition | Examples |
|---|---|---|
| Vaccine product-related reaction | Due to inherent properties of vaccine | OPV-associated paralytic poliomyelitis (VAPP), BCG lymphadenitis |
| Vaccine quality defect-related | Manufacturing defect | Incomplete inactivation of poliovirus in IPV |
| Immunization error-related (Programmatic error) | Error in preparation/handling/administration | Abscess at injection site due to non-sterile technique, wrong vaccine, wrong dose |
| Immunization anxiety-related reaction | Fear of injection | Vasovagal syncope, mass psychogenic illness |
| Coincidental | Temporal association only; not causally related | Fever from concurrent infection unrelated to vaccine |
| Feature | Bias | Confounding |
|---|---|---|
| Definition | Systematic error in design, conduct, or analysis leading to incorrect estimate of association | A third variable that is related to both exposure and outcome, distorting the apparent relationship |
| Directionality | Can overestimate or underestimate | Can overestimate or underestimate |
| Prevention | By careful study design (randomization, blinding) | By matching, restriction, stratification, multivariate analysis |
| Examples | Recall bias, selection bias, interviewer bias | Smoking as confounder in alcohol-laryngeal cancer study |
| Post-hoc correction | Often cannot be corrected after study | Can be adjusted statistically (e.g., Mantel-Haenszel) |
| Silicosis | No Silicosis | Total | |
|---|---|---|---|
| Exposed | 120 | 680 | 800 |
| Not exposed | 30 | 1170 | 1200 |
Generate a PDF quick reference guide for immunization schedules and AEFI
ls /home/daytona/workspace/ 2>/dev/null && echo "---" && python3 -c "import repo…
mkdir -p /home/daytona/workspace/immunization-guide && echo "dir created"
~/immunization-guide/generate_pdf.py
#!/usr/bin/env python3
"""
Immunization Schedule & AEFI Quick Reference Guide
Based on Park's Textbook of Preventive and Social Medicine
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.pdfgen import canvas
from reportlab.platypus.flowables import Flowable
OUTPUT = "/home/daytona/workspace/immunization-guide/Immunization_AEFI_QuickRef.pdf"
# ── Colour Palette ──────────────────────────────────────────────────────────
C_NAVY = colors.HexColor("#1a3a5c")
C_TEAL = colors.HexColor("#0d7377")
C_AMBER = colors.HexColor("#f6a623")
C_GREEN = colors.HexColor("#2e7d32")
C_RED = colors.HexColor("#c62828")
C_ORANGE = colors.HexColor("#e65100")
C_PURPLE = colors.HexColor("#4a148c")
C_LBLUE = colors.HexColor("#e3f2fd")
C_LTEAL = colors.HexColor("#e0f7fa")
C_LGREEN = colors.HexColor("#e8f5e9")
C_LRED = colors.HexColor("#ffebee")
C_LYELLOW = colors.HexColor("#fff8e1")
C_LPURPLE = colors.HexColor("#f3e5f5")
C_LGRAY = colors.HexColor("#f5f5f5")
C_WHITE = colors.white
# ── Styles ──────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
sTitle = S("sTitle",
fontName="Helvetica-Bold", fontSize=22, leading=28,
textColor=C_WHITE, alignment=TA_CENTER, spaceAfter=4)
sSub = S("sSub",
fontName="Helvetica", fontSize=11, leading=14,
textColor=C_WHITE, alignment=TA_CENTER, spaceAfter=2)
sH1 = S("sH1",
fontName="Helvetica-Bold", fontSize=13, leading=16,
textColor=C_WHITE, spaceBefore=4, spaceAfter=4,
leftIndent=6)
sH2 = S("sH2",
fontName="Helvetica-Bold", fontSize=10.5, leading=13,
textColor=C_NAVY, spaceBefore=6, spaceAfter=3)
sBody = S("sBody",
fontName="Helvetica", fontSize=8.5, leading=12,
textColor=colors.black, spaceAfter=2)
sBold = S("sBold",
fontName="Helvetica-Bold", fontSize=8.5, leading=12,
textColor=colors.black)
sSmall = S("sSmall",
fontName="Helvetica", fontSize=7.5, leading=10,
textColor=colors.HexColor("#444444"))
sNote = S("sNote",
fontName="Helvetica-Oblique", fontSize=7.5, leading=10,
textColor=C_NAVY, spaceAfter=2)
sFooter = S("sFooter",
fontName="Helvetica", fontSize=7, leading=9,
textColor=colors.HexColor("#666666"), alignment=TA_CENTER)
# ── Helper: section header bar ───────────────────────────────────────────────
def section_header(title, color=C_NAVY):
t = Table([[Paragraph(title, sH1)]], colWidths=[18.2*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROUNDEDCORNERS", [4]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
return t
# ── Page numbering callback ───────────────────────────────────────────────────
def add_page_number(canvas_obj, doc):
canvas_obj.saveState()
canvas_obj.setFont("Helvetica", 7)
canvas_obj.setFillColor(colors.HexColor("#888888"))
canvas_obj.drawCentredString(A4[0]/2, 15*mm,
f"Immunization & AEFI Quick Reference | Park's Textbook | Page {doc.page}")
canvas_obj.restoreState()
# ── Build document ────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.3*cm, leftMargin=1.3*cm,
topMargin=1.5*cm, bottomMargin=2*cm,
title="Immunization & AEFI Quick Reference Guide",
author="Park's Textbook of Preventive and Social Medicine"
)
story = []
# ═══════════════════════════════════════════════════════════════════════
# COVER HEADER
# ═══════════════════════════════════════════════════════════════════════
cover = Table([
[Paragraph("IMMUNIZATION SCHEDULE", sTitle)],
[Paragraph("& AEFI Quick Reference Guide", sTitle)],
[Spacer(1, 4)],
[Paragraph("Based on Park's Textbook of Preventive and Social Medicine", sSub)],
[Paragraph("Universal Immunization Programme (UIP) • National Immunization Schedule (NIS) • AEFI Classification", sSub)],
], colWidths=[18.2*cm])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [6]),
]))
story.append(cover)
story.append(Spacer(1, 10))
# ═══════════════════════════════════════════════════════════════════════
# SECTION 1 – NATIONAL IMMUNIZATION SCHEDULE
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("1. National Immunization Schedule (NIS) — India UIP", C_TEAL))
story.append(Spacer(1, 4))
nis_headers = ["Age", "Vaccine", "Dose", "Route", "Site", "Remarks"]
nis_data = [nis_headers,
["Birth\n(≤24 hrs)", "BCG", "0.1 ml\n(0.05 ml\nneonate)", "Intradermal", "Left upper arm\n(deltoid region)", "Single dose; induces cell-mediated immunity"],
["Birth\n(≤24 hrs)", "OPV-0\n(Zero dose)", "2 drops", "Oral", "Oral", "Gut immunity; before hospital discharge"],
["Birth\n(≤24 hrs)", "Hepatitis B\n(Birth dose)", "0.5 ml", "Intramuscular", "Anterolateral\nthigh (R)", "Within 24 hrs to prevent vertical transmission"],
["6 weeks", "OPV-1\nPentavalent-1\n(DPT+HepB+Hib)\nIPV-1\nRVV-1", "2 drops\n0.5 ml\n\n0.1 ml\n5 drops", "Oral\nIM\n\nID (fractional)\nOral", "—\nAnterolateral thigh (L)\n\nRight deltoid\n—", "Fractional IPV (fIPV) 0.1 ml ID at 6 & 14 weeks"],
["10 weeks", "OPV-2\nPentavalent-2\nRVV-2", "2 drops\n0.5 ml\n5 drops", "Oral\nIM\nOral", "—\nAnterolateral\nthigh (R)\n—", ""],
["14 weeks", "OPV-3\nPentavalent-3\nIPV-2\nRVV-3", "2 drops\n0.5 ml\n0.1 ml\n5 drops", "Oral\nIM\nID\nOral", "—\nAnterolateral\nthigh (L)\nRight deltoid\n—", "Complete primary series"],
["9–12 months", "MR-1\nJE-1*\nVit A (1st)", "0.5 ml\n0.5 ml\n1 lakh IU", "SC\nSC\nOral", "Right upper arm\nLeft upper arm\n—", "*JE in endemic districts only\nVit A with MR-1"],
["16–24 months", "DPT Booster-1\nOPV Booster\nMR-2\nJE-2*\nVit A (2nd)", "0.5 ml\n2 drops\n0.5 ml\n0.5 ml\n2 lakh IU", "IM\nOral\nSC\nSC\nOral", "Anterolateral thigh\n—\nRight upper arm\nLeft upper arm\n—", "*JE in endemic districts\nVit A 6-monthly till 5 yrs"],
["5–6 years\n(School entry)", "DPT Booster-2", "0.5 ml", "IM", "Upper arm (deltoid)", "At school entry"],
["10 years\n&\n16 years", "Td\n(Tetanus-\ndiphtheria)", "0.5 ml", "IM", "Upper arm\n(deltoid)", "Td replaces TT in booster doses; dT has reduced diphtheria component"],
["Pregnant\nWomen", "Td-1\nTd-2\n(Td-Booster)", "0.5 ml each", "IM", "Upper arm\n(deltoid)", "Td-1: early pregnancy\nTd-2: 4 wks after Td-1\nBooster: if prev immunized within 3 yrs"],
]
col_w = [2.2*cm, 2.8*cm, 1.7*cm, 1.7*cm, 2.5*cm, 7.3*cm]
nis_table = Table(nis_data, colWidths=col_w, repeatRows=1)
row_colors = []
for i in range(1, len(nis_data)):
bg = C_LTEAL if i % 2 == 0 else C_WHITE
row_colors.append(("BACKGROUND", (0, i), (-1, i), bg))
nis_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), C_TEAL),
("TEXTCOLOR", (0, 0), (-1, 0), C_WHITE),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, 0), 8),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("FONTSIZE", (0, 1), (-1, -1), 7.5),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("GRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#b2dfdb")),
("TOPPADDING", (0, 0), (-1, -1), 4),
("BOTTOMPADDING", (0, 0), (-1, -1), 4),
("LEFTPADDING", (0, 0), (-1, -1), 3),
("RIGHTPADDING", (0, 0), (-1, -1), 3),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [C_WHITE, C_LTEAL]),
("TEXTCOLOR", (0, 1), (-1, -1), colors.black),
("FONTNAME", (0, 1), (0, -1), "Helvetica-Bold"),
]))
story.append(nis_table)
story.append(Spacer(1, 4))
story.append(Paragraph(
"<b>Abbreviations:</b> BCG=Bacille Calmette-Guérin | OPV=Oral Polio Vaccine | IPV=Inactivated Polio Vaccine (fractional ID) | "
"DPT=Diphtheria-Pertussis-Tetanus | Hib=Haemophilus influenzae type b | HepB=Hepatitis B | RVV=Rotavirus Vaccine | "
"MR=Measles-Rubella | JE=Japanese Encephalitis | Td=Tetanus-diphtheria | SC=Subcutaneous | IM=Intramuscular | ID=Intradermal",
sNote))
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════════════
# SECTION 2 – VACCINE PROPERTIES & COLD CHAIN
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("2. Vaccine Properties, Storage & Cold Chain", C_NAVY))
story.append(Spacer(1, 4))
# 2a - Vaccine sensitivity
two_col = [
[
# Left: Vaccine Storage
Table([
[Paragraph("<b>Vaccine Temperature Sensitivity</b>", sH2)],
[Table([
[Paragraph("<b>Vaccine</b>", sBold), Paragraph("<b>Temp</b>", sBold), Paragraph("<b>Notes</b>", sBold)],
[Paragraph("OPV", sSmall), Paragraph("-15 to -25°C\n(freeze)", sSmall), Paragraph("Most heat-sensitive; can store at +2 to +8°C short-term", sSmall)],
[Paragraph("BCG, Measles/MR", sSmall), Paragraph("+2 to +8°C", sSmall), Paragraph("Light-sensitive; reconstitute just before use", sSmall)],
[Paragraph("DPT, Hep B, TT, Td,\nPentavalent, IPV", sSmall), Paragraph("+2 to +8°C\n(DO NOT FREEZE)", sSmall), Paragraph("Freezing destroys adsorbed vaccines; do Shake Test", sSmall)],
[Paragraph("Rotavirus (RVV)", sSmall), Paragraph("+2 to +8°C", sSmall), Paragraph("Oral; do not freeze", sSmall)],
], colWidths=[2.5*cm, 3.0*cm, 3.5*cm],
style=TableStyle([
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#cccccc")),
("BACKGROUND", (0,0), (-1,0), C_LBLUE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("ROWBACKGROUNDS", (0,1), (-1,-1), [C_WHITE, C_LGRAY]),
]))],
], colWidths=[9.0*cm]),
# Right: Cold Chain Levels
Table([
[Paragraph("<b>Cold Chain Equipment by Level</b>", sH2)],
[Table([
[Paragraph("<b>Level</b>", sBold), Paragraph("<b>Equipment</b>", sBold), Paragraph("<b>Temp</b>", sBold)],
[Paragraph("State / Region", sSmall), Paragraph("Walk-in Cold Room (WIC)\nWalk-in Freezer (WIF)", sSmall), Paragraph("+2 to +8°C\n-15 to -25°C", sSmall)],
[Paragraph("District", sSmall), Paragraph("ILR (Ice-Lined\nRefrigerator)\nDeep Freezer", sSmall), Paragraph("+2 to +8°C\n\n-15 to -25°C", sSmall)],
[Paragraph("PHC / Sub-Centre", sSmall), Paragraph("ILR / Cold Box", sSmall), Paragraph("+2 to +8°C", sSmall)],
[Paragraph("Outreach Session", sSmall), Paragraph("Vaccine Carrier\n(day carrier) + ice packs", sSmall), Paragraph("0 to +8°C", sSmall)],
], colWidths=[2.4*cm, 3.5*cm, 2.0*cm],
style=TableStyle([
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#cccccc")),
("BACKGROUND", (0,0), (-1,0), C_LBLUE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("ROWBACKGROUNDS", (0,1), (-1,-1), [C_WHITE, C_LGRAY]),
]))],
], colWidths=[8.4*cm]),
]
]
two_col_table = Table(two_col, colWidths=[9.2*cm, 9.0*cm])
two_col_table.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
story.append(two_col_table)
# VVM + Shake Test
story.append(Spacer(1, 5))
tip_data = [
[Paragraph("<b>VVM (Vaccine Vial Monitor)</b>", sBold),
Paragraph("<b>Shake Test</b>", sBold),
Paragraph("<b>Open Vial Policy</b>", sBold)],
[Paragraph("Heat-sensitive colour indicator on vial. Inner square lighter than outer ring = USE. Inner square same or darker = DISCARD.", sSmall),
Paragraph("For adsorbed vaccines (DPT, Hep B, TT, Td): Shake frozen + unfrozen vials; compare appearance. Frozen vial shows flocculation = DISCARD.", sSmall),
Paragraph("Multi-dose vials of OPV, DPT, TT, Hep B, Pentavalent can be reused up to 4 weeks if: cold chain maintained, VVM valid, no contamination. BCG = discard after session.", sSmall)],
]
tip_t = Table(tip_data, colWidths=[6.0*cm, 6.0*cm, 6.2*cm])
tip_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_LBLUE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#90caf9")),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tip_t)
story.append(Spacer(1, 8))
# ═══════════════════════════════════════════════════════════════════════
# SECTION 3 – SPECIAL VACCINES
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("3. Special / High-Risk Group Vaccines", C_PURPLE))
story.append(Spacer(1, 4))
sv_data = [
[Paragraph("<b>Disease</b>", sBold), Paragraph("<b>Vaccine / Schedule</b>", sBold), Paragraph("<b>Target Group / Notes</b>", sBold)],
[Paragraph("Hepatitis A", sSmall), Paragraph("2 doses (0 & 6 months); IM", sSmall), Paragraph("Travellers to endemic areas; children in high-risk settings", sSmall)],
[Paragraph("Typhoid", sSmall), Paragraph("Vi polysaccharide: 1 dose SC/IM (above 2 yrs)\nOral Ty21a: days 1,3,5", sSmall), Paragraph("Travellers; endemic areas. Protection from day 7.", sSmall)],
[Paragraph("Meningococcal", sSmall), Paragraph("Quadrivalent (A,C,W,Y) 1 dose IM", sSmall), Paragraph("Hajj pilgrims; outbreak control; high-risk travellers", sSmall)],
[Paragraph("Yellow Fever", sSmall), Paragraph("1 dose SC; booster ×1 after 10 yrs", sSmall), Paragraph("Mandatory for travel to endemic countries (ICVP required)", sSmall)],
[Paragraph("Rabies (PEP)", sSmall), Paragraph("5 doses: days 0,3,7,14,28 IM deltoid\n(Zagreb: 0,7,21 — 3 doses)", sSmall), Paragraph("Post-exposure prophylaxis; with RIG for cat. III exposure", sSmall)],
[Paragraph("Influenza", sSmall), Paragraph("Annual 1 dose IM; 2 doses in first-time vaccinees <9 yrs", sSmall), Paragraph("Elderly >65; healthcare workers; chronic disease; pregnancy", sSmall)],
[Paragraph("HPV", sSmall), Paragraph("2 doses (0 & 6 months) for 9–14 yrs\n3 doses (0,1,6 or 0,2,6) for ≥15 yrs", sSmall), Paragraph("Girls 9–14 yrs (India NIS); prevents cervical cancer (HPV 16,18 = 70% of cases); does not replace Pap smear", sSmall)],
[Paragraph("Varicella", sSmall), Paragraph("2 doses SC; 12–18 months & 4–6 yrs", sSmall), Paragraph("Seronegative individuals; healthcare workers; outbreaks", sSmall)],
[Paragraph("Cholera", sSmall), Paragraph("Oral; 2 doses ≥6 weeks apart", sSmall), Paragraph("Outbreak control; travellers to epidemic areas", sSmall)],
[Paragraph("Pneumococcal\n(PCV13 / PPSV23)", sSmall), Paragraph("PCV13: 3 doses + 1 booster (infants)\nPPSV23: 1 dose (adults >65)", sSmall), Paragraph("Under NIS in some states; elderly; asplenic; immunocompromised", sSmall)],
]
sv_t = Table(sv_data, colWidths=[3.2*cm, 7.0*cm, 8.0*cm], repeatRows=1)
sv_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_PURPLE),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#ce93d8")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LPURPLE]),
]))
story.append(sv_t)
story.append(Spacer(1, 8))
# PAGE BREAK before AEFI
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════
# SECTION 4 – AEFI CLASSIFICATION
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("4. AEFI — Adverse Events Following Immunization", C_RED))
story.append(Spacer(1, 4))
story.append(Paragraph(
"<b>Definition:</b> Any untoward medical occurrence which follows immunization and which does not necessarily have a causal relationship with the usage of the vaccine. (WHO)",
sBody))
story.append(Spacer(1, 4))
# Classification table
aefi_data = [
[Paragraph("<b>Category</b>", sBold), Paragraph("<b>Definition</b>", sBold), Paragraph("<b>Examples</b>", sBold), Paragraph("<b>Action</b>", sBold)],
[Paragraph("1. Vaccine Product-\nRelated Reaction", sSmall),
Paragraph("Caused by inherent properties of the vaccine, even when correctly prepared and administered", sSmall),
Paragraph("• VAPP (OPV-associated paralytic polio)\n• BCG lymphadenitis / BCG osteitis\n• Febrile seizures (DPT whole cell)\n• Measles vaccine rash\n• Anaphylaxis (rare)", sSmall),
Paragraph("Report; causality assessment; may need lot withdrawal", sSmall)],
[Paragraph("2. Vaccine Quality\nDefect-Related\nReaction", sSmall),
Paragraph("Caused by a defect in vaccine manufacturing — deviation from quality standards", sSmall),
Paragraph("• Incomplete inactivation of virus\n• Contaminated batch\n• Wrong potency", sSmall),
Paragraph("Lot withdrawal; notify manufacturer and regulatory authority", sSmall)],
[Paragraph("3. Immunization\nError-Related\nReaction\n(Programmatic)", sSmall),
Paragraph("Caused by error in vaccine preparation, handling, or administration", sSmall),
Paragraph("• Sterile / septic abscess at injection site\n• Wrong vaccine / wrong dose\n• Wrong route of administration\n• Reconstituted with wrong diluent\n• Non-sterile technique\n• Frozen adsorbed vaccine given", sSmall),
Paragraph("Immediate correction; supervisor review; training; cold chain audit", sSmall)],
[Paragraph("4. Immunization\nAnxiety-Related\nReaction", sSmall),
Paragraph("Arises from anxiety about the immunization — NOT due to vaccine itself", sSmall),
Paragraph("• Vasovagal syncope (fainting)\n• Hyperventilation\n• Mass psychogenic illness (MPI)\n• Anxiety attacks", sSmall),
Paragraph("Observation 30 min post-vaccination; manage anxiety; education", sSmall)],
[Paragraph("5. Coincidental\nEvent", sSmall),
Paragraph("Temporal association only — NOT caused by vaccination; would have occurred regardless", sSmall),
Paragraph("• Fever from concurrent infection unrelated to vaccine\n• SIDS coinciding with DPT timing\n• Intussusception (must be assessed carefully with RVV)", sSmall),
Paragraph("Document; investigate to rule out causal link; reassure community", sSmall)],
]
aefi_t = Table(aefi_data, colWidths=[3.4*cm, 4.5*cm, 5.8*cm, 4.5*cm], repeatRows=1)
aefi_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_RED),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#ef9a9a")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LRED]),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(aefi_t)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════════════
# SECTION 5 – SERIOUS vs SEVERE
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("5. 'Serious' vs 'Severe' AEFI — NOT the Same!", C_ORANGE))
story.append(Spacer(1, 4))
ss_data = [
[Paragraph("<b>Serious AEFI</b>", sBold), Paragraph("<b>Severe AEFI</b>", sBold)],
[Paragraph("Based on <b>OUTCOME</b>\nResults in death, hospitalization (or prolongation), disability/incapacity, life-threatening event, or congenital anomaly", sSmall),
Paragraph("Based on <b>INTENSITY/GRADE</b> of the reaction\nA reaction that is intense or extreme but may not lead to hospitalization or death", sSmall)],
[Paragraph("<b>Examples:</b> Anaphylaxis leading to ICU admission; VAPP causing permanent paralysis; death following immunization", sSmall),
Paragraph("<b>Examples:</b> Grade 3 local reaction (induration >5cm, inability to use limb) — may be 'severe' but not 'serious' if no hospitalization", sSmall)],
[Paragraph("→ ALL serious AEFIs must be reported within 24 hours to BMOH", sSmall),
Paragraph("→ A reaction can be SEVERE but NOT SERIOUS, or SERIOUS but NOT SEVERE", sSmall)],
]
ss_t = Table(ss_data, colWidths=[9.1*cm, 9.1*cm])
ss_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_LYELLOW),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#ffcc02")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BACKGROUND", (0,3), (-1,3), C_LYELLOW),
("FONTNAME", (0,3), (-1,3), "Helvetica-Bold"),
("TEXTCOLOR", (0,3), (-1,3), C_ORANGE),
]))
story.append(ss_t)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════════════
# SECTION 6 – AEFI REPORTING & INVESTIGATION
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("6. AEFI Reporting, Investigation & Management", C_GREEN))
story.append(Spacer(1, 4))
rep_left = Table([
[Paragraph("<b>AEFI Reporting Timeline</b>", sH2)],
[Table([
[Paragraph("<b>AEFI Type</b>", sBold), Paragraph("<b>Report within</b>", sBold)],
[Paragraph("Death / Cluster / Serious AEFI", sSmall), Paragraph("24 HOURS to BMOH → CMOH → State", sSmall)],
[Paragraph("Hospitalisation", sSmall), Paragraph("Within 24–48 hours", sSmall)],
[Paragraph("Any AEFI (minor/moderate)", sSmall), Paragraph("Within 7 days", sSmall)],
[Paragraph("Monthly summary", sSmall), Paragraph("Routine monthly report", sSmall)],
], colWidths=[4.2*cm, 4.0*cm],
style=TableStyle([
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#a5d6a7")),
("BACKGROUND", (0,0), (-1,0), C_LGREEN),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("ROWBACKGROUNDS", (0,1), (-1,-1), [C_WHITE, C_LGREEN]),
]))],
], colWidths=[8.5*cm])
rep_right = Table([
[Paragraph("<b>Field Investigation Steps</b>", sH2)],
[Paragraph(
"1. Immediate clinical management (adrenaline for anaphylaxis)<br/>"
"2. Fill AEFI reporting form; report to BMOH within 24 hrs<br/>"
"3. Collect batch no., lot no., expiry date, vial details<br/>"
"4. Examine remaining vials; preserve samples<br/>"
"5. Check cold chain records, reconstitution details<br/>"
"6. Examine all others vaccinated in same session<br/>"
"7. Send vaccine samples to designated laboratory<br/>"
"8. Causality assessment by District/State AEFI Committee<br/>"
"9. Community communication to prevent vaccine hesitancy",
sSmall)],
], colWidths=[9.7*cm])
rep_row = Table([[rep_left, rep_right]], colWidths=[8.7*cm, 9.5*cm])
rep_row.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
story.append(rep_row)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════════════
# SECTION 7 – ANAPHYLAXIS MANAGEMENT
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("7. Anaphylaxis Management at Immunization Session", C_RED))
story.append(Spacer(1, 4))
ana_data = [
[Paragraph("<b>Recognition</b>", sBold), Paragraph("<b>Immediate Management</b>", sBold), Paragraph("<b>Kit Contents (MUST be present)</b>", sBold)],
[Paragraph(
"• Onset: within 15–30 min of vaccination\n"
"• Urticaria / angioedema\n"
"• Bronchospasm / wheeze\n"
"• Hypotension / collapse\n"
"• Loss of consciousness\n"
"• Stridor / cyanosis", sSmall),
Paragraph(
"1. Call for help; do not leave patient\n"
"2. Position supine; raise legs (if BP low)\n"
"3. Adrenaline (Epinephrine) 1:1000\n"
" 0.01 mg/kg IM (max 0.5 mg) anterolateral thigh\n"
" Repeat every 5–15 min if needed\n"
"4. Oxygen if available\n"
"5. IV fluids for hypotension\n"
"6. Antihistamine (chlorpheniramine) IM/IV\n"
"7. Hydrocortisone IV (for late phase)\n"
"8. Refer to hospital URGENTLY", sSmall),
Paragraph(
"• Adrenaline 1:1000 (1 mg/ml) ampoules\n"
"• Disposable syringes (1ml, 2ml)\n"
"• Chlorpheniramine maleate injection\n"
"• IV fluids (normal saline)\n"
"• IV cannula + giving set\n"
"• Oxygen cylinder / mask\n"
"• Hub cutter (functioning)\n"
"• Referral documentation\n"
"• Transport arrangement", sSmall)],
]
ana_t = Table(ana_data, colWidths=[5.5*cm, 7.0*cm, 5.7*cm])
ana_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_LRED),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#ef9a9a")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BACKGROUND", (0,1), (-1,1), C_WHITE),
]))
story.append(ana_t)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════════════
# SECTION 8 – HERD IMMUNITY & KEY CONCEPTS
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("8. Key Immunization Concepts", C_TEAL))
story.append(Spacer(1, 4))
concepts = [
["<b>Herd Immunity</b>", "When a sufficient proportion of a population is immune → infection spread is limited even in non-immune individuals. Indirect protection for unvaccinated.", "Threshold: Measles ~95% | Polio ~80–85% | Smallpox ~80%"],
["<b>Drop-out</b>", "Child who received SOME doses but did NOT complete full immunization series.", "Tracked by: Drop-out rate = (Penta-1 – MR-1) / Penta-1 × 100"],
["<b>Left-out</b>", "Child who received NO vaccine dose at all — completely unimmunized.", "Target: Zero left-outs; tracked via headcount surveys"],
["<b>Epidemiologically\nImportant Carrier</b>", "A carrier is more epidemiologically important than a case because carriers are more numerous, undetected, mobile, and spread disease longer without knowing.", "Typhoid carriers (Salmonella typhi); HBV carriers"],
["<b>VVM Stages</b>", "Stage 1: Inner square lighter (OK) | Stage 2: Same (USE SOON) | Stage 3: Same shade (DO NOT USE) | Stage 4: Darker (DISCARD)", ""],
["<b>Shake Test</b>", "Used for adsorbed vaccines (DPT, TT, Td, Hep B). Frozen vaccine shows permanent flocculation/clumping. Compare frozen vs. suspected freeze-damaged vial.", "If same appearance = DISCARD"],
["<b>Contraindications</b>", "True contraindications: anaphylaxis to prior dose or vaccine component. AVOID: live vaccines in immunocompromised. FALSE contraindication: mild fever, minor illness, low-grade malnutrition.", ""],
["<b>Simultaneous\nVaccination</b>", "Multiple vaccines can be given simultaneously at different sites. Does NOT reduce efficacy or increase reactions (except avoid 2 live injected vaccines unless given same day or 4 weeks apart).", ""],
]
c_headers = [Paragraph("<b>Concept</b>", sBold), Paragraph("<b>Explanation</b>", sBold), Paragraph("<b>Key Fact / Formula</b>", sBold)]
c_rows = [c_headers]
for row in concepts:
c_rows.append([Paragraph(row[0], sSmall), Paragraph(row[1], sSmall), Paragraph(row[2], sSmall)])
conc_t = Table(c_rows, colWidths=[3.5*cm, 9.0*cm, 5.7*cm], repeatRows=1)
conc_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_TEAL),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#b2dfdb")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LTEAL]),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(conc_t)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════════════
# SECTION 9 – POLIO ERADICATION STRATEGIES
# ═══════════════════════════════════════════════════════════════════════
story.append(section_header("9. Polio Eradication & Immunization Programme Strategies", C_NAVY))
story.append(Spacer(1, 4))
polio_left = [
Paragraph("<b>Strategies for Polio Eradication:</b>", sBold),
Paragraph("1. Routine immunization (OPV + IPV in NIS)", sSmall),
Paragraph("2. National Immunization Days (NIDs) — Pulse Polio: 2 rounds/year", sSmall),
Paragraph("3. Sub-National Immunization Days (SNIDs) — high-risk areas", sSmall),
Paragraph("4. AFP Surveillance — target ≥2 cases/100,000 children under 15 years", sSmall),
Paragraph("5. Mop-up operations — house-to-house in high-risk/outbreak areas", sSmall),
Paragraph("6. IPV introduction in routine schedule (2015) — eliminates VAPP risk", sSmall),
Spacer(1,4),
Paragraph("<b>Why OPV given at birth (zero dose)?</b>", sBold),
Paragraph("• Early gut mucosal immunity before poliovirus exposure", sSmall),
Paragraph("• OPV multiplies in gut → spreads to contacts → boosts herd immunity", sSmall),
Paragraph("• Subsequent 3 doses needed for complete seroconversion (maternal antibodies partially neutralize vaccine virus)", sSmall),
]
polio_right = [
Paragraph("<b>Intensified Mission Indradhanush (IMI):</b>", sBold),
Paragraph("• Target: ≥90% full immunization coverage", sSmall),
Paragraph("• Focuses on high-risk districts, missed children, urban slums", sSmall),
Paragraph("• 7 rounds of intensive immunization in selected districts", sSmall),
Spacer(1,4),
Paragraph("<b>UIP Goals under Mission Indradhanush:</b>", sBold),
Paragraph("• 7 vaccines originally → now 12 vaccines under NIS", sSmall),
Paragraph("• Target: Full immunization of every child born in India", sSmall),
Spacer(1,4),
Paragraph("<b>Why Hep B given within 24 hrs of birth?</b>", sBold),
Paragraph("• Prevents vertical (mother→child) transmission", sSmall),
Paragraph("• 90% of perinatally infected neonates develop chronic HBV", sSmall),
Paragraph("• Birth dose + anti-HBs immunoglobulin (HBIG) for high-risk neonates", sSmall),
]
pr_cols = [[p for p in polio_left], [p for p in polio_right]]
pr_t = Table([[
Table([[item] for item in polio_left], colWidths=[8.5*cm]),
Table([[item] for item in polio_right], colWidths=[8.9*cm]),
]], colWidths=[8.7*cm, 9.5*cm])
pr_t.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING",(0,0),(-1,-1), 4),
]))
story.append(pr_t)
story.append(Spacer(1, 8))
# ═══════════════════════════════════════════════════════════════════════
# FOOTER NOTE
# ═══════════════════════════════════════════════════════════════════════
story.append(HRFlowable(width="100%", thickness=1, color=C_NAVY))
story.append(Spacer(1, 3))
story.append(Paragraph(
"<b>Reference:</b> Park's Textbook of Preventive and Social Medicine (Park K.), ISBN 9789382219163 | "
"<b>NIS Source:</b> Ministry of Health & Family Welfare, Government of India | "
"For latest updates refer to MoHFW/WHO guidelines. This guide is for exam reference purposes.",
sFooter))
# ── Build ─────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=add_page_number, onLaterPages=add_page_number)
print(f"PDF generated: {OUTPUT}")
cd /home/daytona/workspace/immunization-guide && python3 generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/immunization-guide/Immunization_AEFI_QuickRef.pdf
Immunization AEFI QuickRef
PDF Document · PDF
| Section | Content |
|---|---|
| 1. NIS Table | Full National Immunization Schedule - age, vaccine, dose, route, site, remarks for every antigen from birth to 16 years + pregnant women |
| 2. Cold Chain | Vaccine temperature sensitivity (freeze vs. refrigerate), cold chain equipment by level (State→PHC→outreach), VVM guide, Shake Test, Open Vial Policy |
| 3. Special Vaccines | High-risk group vaccines - HPV, Hep A, Typhoid, Rabies PEP, Influenza, Meningococcal, Varicella, Cholera, Pneumococcal |
| 4. AEFI Classification | All 5 WHO categories with definitions and examples - vaccine product-related, quality defect, immunization error, anxiety-related, coincidental |
| 5. Serious vs Severe | Key exam distinction - outcome-based (serious) vs intensity-based (severe) with examples |
| 6. AEFI Reporting | Timeline table + field investigation steps |
| 7. Anaphylaxis | Recognition, step-by-step management, kit contents (adrenaline dose included) |
| 8. Key Concepts | Herd immunity, dropout vs left-out, VVM stages, contraindications, simultaneous vaccination |
| 9. Polio Eradication | AFP surveillance target, NIDs, Mission Indradhanush, rationale for OPV zero dose and Hep B birth dose |