Pertussis
pertussis whooping cough

| Toxin | Action |
|---|---|
| Pertussis toxin (PT) | Systemic effects; leukocyte-lymphocytosis; enhances glucose-stimulated insulin secretion; immunomodulatory (downregulates early immune responses, inhibits macrophages and neutrophil recruitment, perpetuating infection) |
| Adenylate cyclase-hemolysin toxin (ACT) | Binds CR3 on host cells; produces supraphysiologic cAMP levels; inhibits antibacterial function of macrophages and neutrophils |
| Tracheal cytotoxin | Local mucosal damage to respiratory epithelium |
| Dermonecrotic toxin | Local damage at the site of infection |
| Feature | Infants & Children | Adolescents & Adults |
|---|---|---|
| Whoop | Present (classic) | Often absent |
| Post-tussive emesis | Common | Less common |
| Apnea | Common, life-threatening | Rare |
| Cough duration | Weeks | Weeks to months |
| Fever | Usually absent | Usually absent |
| Lymphocytosis | Marked | Mild |
| Test | Notes |
|---|---|
| PCR (nasopharyngeal swab) | Most sensitive; preferred test; rapid turnaround. Best in catarrhal or early paroxysmal stage |
| Culture | Gold standard but fastidious; requires special media (Bordet-Gengou or Regan-Lowe); most positive in catarrhal/early paroxysmal stages; negative after week 4 or after antibiotics |
| Serology (anti-PT IgG) | Useful in later disease; single high titer or 2-fold rise diagnostic |
| WBC/lymphocyte count | Marked lymphocytosis (often 20,000-100,000/µL) is a key diagnostic clue |
| Chest X-ray | May show "shaggy right heart border" or be clear; not diagnostic |
| Drug | Regimen | Notes |
|---|---|---|
| Azithromycin | 500 mg day 1, then 250 mg days 2-5 (or 10 mg/kg/day x5 in infants) | First-line; best tolerated; preferred in infants <1 month (avoids pyloric stenosis risk of erythromycin) |
| Erythromycin | 500 mg QID x 14 days | Alternative; risk of infantile hypertrophic pyloric stenosis in neonates |
| Clarithromycin | 500 mg BID x 7 days | Alternative |
| Trimethoprim-sulfamethoxazole | For macrolide-intolerant patients |
| Vaccine | Components | Notes |
|---|---|---|
| DTaP | PT toxoid, FHA, pertactin (± fimbriae) | Childhood; 5 doses |
| Tdap (Boostrix) | PT, FHA, PRN | Adults/adolescents ≥10 yr |
| Tdap (Adacel) | PT, FHA, PRN, two fimbriae | Adults 10-64 yr |
| Whole-cell DTP | Killed whole bacteria | Still used in developing regions; more reactogenic but longer-lasting and blocks transmission |
Make a presentation on acellular vs whole-cell pertussis vaccines
mkdir -p /home/daytona/workspace/pertussis-vaccines && ls /home/daytona/workspac…
~/pertussis-vaccines/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Acellular vs Whole-Cell Pertussis Vaccines";
pres.author = "Orris";
// ─── Color Palette ───────────────────────────────────────────────────────────
// Deep navy dominant, teal accent, warm amber highlight, off-white text
const C = {
navy: "0D1B3E", // dominant bg
navyMid: "152550", // card bg
teal: "1A8C8C", // whole-cell accent
amber: "E8A020", // acellular accent
green: "2EAF7D", // positive
red: "D64045", // negative / warning
white: "F5F7FA",
offWhite: "C8D4E8",
lightGray: "8A9BB8",
};
// ─── Helper: slide background ────────────────────────────────────────────────
function darkBg(slide) {
slide.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 5.625,
fill: { color: C.navy }, line: { color: C.navy }
});
}
// ─── Helper: section label pill ──────────────────────────────────────────────
function pill(slide, text, color, x, y, w = 2.5) {
slide.addShape(pres.shapes.ROUNDED_RECTANGLE, {
x, y, w, h: 0.3, fill: { color }, line: { color }, rectRadius: 0.15
});
slide.addText(text, {
x, y, w, h: 0.3, fontSize: 9, bold: true, color: C.navy,
align: "center", valign: "middle", margin: 0
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 1 — TITLE
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
// Top accent bar
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.teal }, line: { color: C.teal }
});
// Germ icon hint — decorative circles
for (const [cx, cy, r, op] of [
[8.6, 1.2, 1.4, 8], [9.1, 2.4, 0.9, 6], [8.0, 2.8, 0.6, 5]
]) {
s.addShape(pres.shapes.OVAL, {
x: cx - r/2, y: cy - r/2, w: r, h: r,
fill: { color: C.teal, transparency: 100 - op },
line: { color: C.teal, transparency: 100 - op - 20, width: 1.5 }
});
}
// Subtitle tag
pill(s, "IMMUNOLOGY | VACCINOLOGY", C.teal, 0.55, 1.4, 3.2);
s.addText("Acellular vs\nWhole-Cell\nPertussis Vaccines", {
x: 0.55, y: 1.75, w: 7.5, h: 2.6,
fontSize: 40, bold: true, color: C.white,
align: "left", valign: "top",
charSpacing: 0.5
});
s.addText("A comparative analysis of composition, immunogenicity,\nefficacy, safety, and public health impact", {
x: 0.55, y: 4.25, w: 7.8, h: 0.85,
fontSize: 14, color: C.offWhite, align: "left"
});
// Bottom bar
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 5.45, w: 10, h: 0.175, fill: { color: C.amber }, line: { color: C.amber }
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 2 — BACKGROUND: THE PERTUSSIS PROBLEM
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.teal }, line: { color: C.teal }
});
s.addText("Background: The Pertussis Problem", {
x: 0.5, y: 0.2, w: 9, h: 0.6, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
// 4 stat cards
const stats = [
["16M", "estimated cases\nper year globally"],
["200K+", "deaths/year in\npre-vaccine era"],
["84%", "of US deaths in\ninfants <2 months"],
["~1M", "adult cases/year\nin the US alone"],
];
stats.forEach(([num, label], i) => {
const x = 0.3 + i * 2.38;
s.addShape(pres.shapes.RECTANGLE, {
x, y: 0.95, w: 2.15, h: 1.55,
fill: { color: C.navyMid }, line: { color: C.teal, width: 1.5 }
});
s.addText(num, {
x, y: 1.05, w: 2.15, h: 0.65,
fontSize: 28, bold: true, color: C.amber, align: "center", margin: 0
});
s.addText(label, {
x, y: 1.72, w: 2.15, h: 0.72,
fontSize: 11, color: C.offWhite, align: "center", margin: 4
});
});
// Key points
const pts = [
"Bordetella pertussis — gram-negative coccobacillus; transmission via aerosol droplets",
"Whole-cell (wP) vaccines introduced in 1940s → dramatic case reduction, but reactogenicity concerns arose",
"Acellular (aP) vaccines replaced wP in developed nations in the 1990s — fewer side effects, but waning immunity",
"Resurgence since 2000s linked to: waning aP immunity, pertactin-deficient strains, cocooning failure",
"WHO (2019): countries using wP should continue; aP countries need additional boosters + maternal vaccination",
];
s.addText(pts.map((t, i) => ({
text: t,
options: { bullet: { type: "bullet", indent: 15 }, breakLine: i < pts.length - 1, color: i === 4 ? C.amber : C.offWhite, fontSize: 12.5 }
})), { x: 0.4, y: 2.65, w: 9.2, h: 2.7, valign: "top" });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 3 — COMPOSITION
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.teal }, line: { color: C.teal }
});
s.addText("Vaccine Composition", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
// Left panel — wP
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y: 0.9, w: 4.3, h: 4.55,
fill: { color: C.navyMid }, line: { color: C.teal, width: 2 }
});
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y: 0.9, w: 4.3, h: 0.42,
fill: { color: C.teal }, line: { color: C.teal }
});
s.addText("Whole-Cell Pertussis (wP)", {
x: 0.3, y: 0.9, w: 4.3, h: 0.42,
fontSize: 13, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0
});
const wpPts = [
"Killed, intact B. pertussis bacteria",
"Contains ALL antigens: ~3,000+ proteins",
"Preserves native LPS (lipopolysaccharide)",
"Elicits TH1 + TH17 immune response",
"Induces mucosal IgA → blocks colonization",
"Reduces nasopharyngeal bacterial load",
"Used in: DTP, DTwP combinations",
"Still standard in LMICs (WHO recommendation)",
];
s.addText(wpPts.map((t, i) => ({
text: t,
options: { bullet: { type: "bullet", indent: 12 }, breakLine: i < wpPts.length - 1, fontSize: 12, color: C.offWhite }
})), { x: 0.4, y: 1.4, w: 4.1, h: 3.9, valign: "top" });
// Right panel — aP
s.addShape(pres.shapes.RECTANGLE, {
x: 5.4, y: 0.9, w: 4.3, h: 4.55,
fill: { color: C.navyMid }, line: { color: C.amber, width: 2 }
});
s.addShape(pres.shapes.RECTANGLE, {
x: 5.4, y: 0.9, w: 4.3, h: 0.42,
fill: { color: C.amber }, line: { color: C.amber }
});
s.addText("Acellular Pertussis (aP)", {
x: 5.4, y: 0.9, w: 4.3, h: 0.42,
fontSize: 13, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0
});
const apAntigens = [
["Pertussis Toxoid (PT)", "all formulations"],
["Filamentous Hemagglutinin (FHA)", "all formulations"],
["Pertactin (PRN)", "most formulations"],
["Fimbriae types 2 & 3", "some (e.g. Adacel)"],
];
s.addText("Purified subunit antigens only:", {
x: 5.5, y: 1.42, w: 4.1, h: 0.3,
fontSize: 12, bold: true, color: C.amber, align: "left", margin: 4
});
apAntigens.forEach(([name, note], i) => {
const y = 1.78 + i * 0.52;
s.addShape(pres.shapes.RECTANGLE, {
x: 5.5, y, w: 4.05, h: 0.44,
fill: { color: "1C2E52" }, line: { color: C.amber, transparency: 60 }
});
s.addText(name, { x: 5.55, y: y + 0.03, w: 2.8, h: 0.22, fontSize: 11.5, bold: true, color: C.white, margin: 2 });
s.addText(note, { x: 5.55, y: y + 0.23, w: 3.9, h: 0.18, fontSize: 9.5, color: C.lightGray, margin: 2, italic: true });
});
s.addText([
{ text: "Elicits TH2-biased response ", options: { bullet: { type: "bullet", indent: 10 }, breakLine: true, fontSize: 12, color: C.offWhite } },
{ text: "No mucosal IgA induction → colonization possible", options: { bullet: { type: "bullet", indent: 10 }, breakLine: true, fontSize: 12, color: C.offWhite } },
{ text: "Used in: DTaP (children), Tdap (adolescents/adults)", options: { bullet: { type: "bullet", indent: 10 }, fontSize: 12, color: C.offWhite } },
], { x: 5.5, y: 4.0, w: 4.0, h: 1.3, valign: "top" });
// VS badge
s.addShape(pres.shapes.OVAL, {
x: 4.62, y: 2.7, w: 0.76, h: 0.76,
fill: { color: C.amber }, line: { color: C.amber }
});
s.addText("VS", {
x: 4.62, y: 2.7, w: 0.76, h: 0.76,
fontSize: 13, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 4 — IMMUNOGENICITY & MECHANISM
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.amber }, line: { color: C.amber }
});
s.addText("Immunogenicity & Immune Mechanisms", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
// Two column comparison table
const headers = ["Parameter", "Whole-Cell (wP)", "Acellular (aP)"];
const rows = [
["T-helper response", "TH1 + TH17 (balanced)", "TH2-biased"],
["Mucosal immunity (IgA)", "Yes — blocks colonization", "No — colonization persists"],
["Serum antibodies", "Broad (all antigens)", "Narrow (2–5 antigens)"],
["Duration of protection", "~10–12 years", "2–4 years (rapid waning)"],
["Memory B cells", "Broad repertoire", "Limited repertoire"],
["Blocks transmission", "Yes", "No"],
["Matches natural infection", "Closer match", "Divergent response"],
];
const colW = [2.8, 3.1, 3.1];
const colX = [0.3, 3.15, 6.3];
const rowH = 0.52;
const tableY = 0.9;
// Header row
headers.forEach((h, ci) => {
s.addShape(pres.shapes.RECTANGLE, {
x: colX[ci], y: tableY, w: colW[ci] - 0.04, h: 0.42,
fill: { color: ci === 1 ? C.teal : ci === 2 ? C.amber : "1C2D55" },
line: { color: C.navy }
});
s.addText(h, {
x: colX[ci], y: tableY, w: colW[ci] - 0.04, h: 0.42,
fontSize: 12, bold: true,
color: ci === 0 ? C.offWhite : C.navy,
align: "center", valign: "middle", margin: 0
});
});
// Data rows
rows.forEach((row, ri) => {
const y = tableY + 0.42 + ri * rowH;
const bgRow = ri % 2 === 0 ? "131F3C" : C.navyMid;
row.forEach((cell, ci) => {
s.addShape(pres.shapes.RECTANGLE, {
x: colX[ci], y, w: colW[ci] - 0.04, h: rowH - 0.03,
fill: { color: bgRow }, line: { color: "1E2D50" }
});
// Color code good/bad for wP vs aP
let textColor = C.offWhite;
if (ci === 1 && ["TH1 + TH17 (balanced)", "Yes — blocks colonization", "~10–12 years", "Yes", "Closer match"].includes(cell))
textColor = C.green;
if (ci === 2 && ["TH2-biased", "No — colonization persists", "2–4 years (rapid waning)", "No", "Divergent response"].includes(cell))
textColor = C.red;
s.addText(cell, {
x: colX[ci] + 0.08, y, w: colW[ci] - 0.2, h: rowH - 0.03,
fontSize: 11.5, color: textColor, valign: "middle", margin: 0,
align: ci === 0 ? "left" : "center", bold: ci === 0
});
});
});
s.addText("Green = immunological advantage | Red = immunological limitation", {
x: 0.3, y: 5.28, w: 9.4, h: 0.25,
fontSize: 9.5, italic: true, color: C.lightGray, align: "left"
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 5 — EFFICACY & EFFECTIVENESS
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.teal }, line: { color: C.teal }
});
s.addText("Efficacy & Real-World Effectiveness", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
// Efficacy bars — wP
s.addText("WHOLE-CELL (wP)", {
x: 0.4, y: 0.88, w: 4.2, h: 0.32, fontSize: 11, bold: true, color: C.teal, align: "left", margin: 0
});
const wpBars = [
["Initial efficacy (3 doses)", 0.94],
["After 10 years", 0.55],
["Nasopharyngeal clearance", 0.80],
["Transmission blocking", 0.75],
];
wpBars.forEach(([label, pct], i) => {
const y = 1.25 + i * 0.72;
s.addText(label, { x: 0.4, y, w: 4.1, h: 0.22, fontSize: 11, color: C.offWhite, margin: 0 });
const barW = 4.0 * pct;
s.addShape(pres.shapes.RECTANGLE, {
x: 0.4, y: y + 0.24, w: 4.0, h: 0.28,
fill: { color: "1C2D50" }, line: { color: "1C2D50" }
});
s.addShape(pres.shapes.RECTANGLE, {
x: 0.4, y: y + 0.24, w: barW, h: 0.28,
fill: { color: C.teal }, line: { color: C.teal }
});
s.addText(`${Math.round(pct * 100)}%`, {
x: 0.4 + barW + 0.1, y: y + 0.24, w: 0.55, h: 0.28,
fontSize: 11, bold: true, color: C.teal, valign: "middle", margin: 0
});
});
// Efficacy bars — aP
s.addText("ACELLULAR (aP)", {
x: 5.4, y: 0.88, w: 4.2, h: 0.32, fontSize: 11, bold: true, color: C.amber, align: "left", margin: 0
});
const apBars = [
["Initial efficacy (3 doses)", 0.85],
["After 4 years", 0.40],
["Nasopharyngeal clearance", 0.10],
["Transmission blocking", 0.05],
];
apBars.forEach(([label, pct], i) => {
const y = 1.25 + i * 0.72;
s.addText(label, { x: 5.4, y, w: 4.1, h: 0.22, fontSize: 11, color: C.offWhite, margin: 0 });
const barW = 4.0 * pct;
s.addShape(pres.shapes.RECTANGLE, {
x: 5.4, y: y + 0.24, w: 4.0, h: 0.28,
fill: { color: "1C2D50" }, line: { color: "1C2D50" }
});
s.addShape(pres.shapes.RECTANGLE, {
x: 5.4, y: y + 0.24, w: barW, h: 0.28,
fill: { color: C.amber }, line: { color: C.amber }
});
s.addText(`${Math.round(pct * 100)}%`, {
x: 5.4 + barW + 0.1, y: y + 0.24, w: 0.55, h: 0.28,
fontSize: 11, bold: true, color: C.amber, valign: "middle", margin: 0
});
});
// Divider
s.addShape(pres.shapes.RECTANGLE, {
x: 4.9, y: 0.88, w: 0.04, h: 4.2,
fill: { color: C.lightGray, transparency: 60 }, line: { color: C.lightGray, transparency: 60 }
});
s.addText("Note: aP vaccines prevent clinical disease but do NOT reduce nasopharyngeal colonization, enabling silent transmission (\"cocooning\" failure).", {
x: 0.4, y: 5.22, w: 9.2, h: 0.3,
fontSize: 10, italic: true, color: C.amber, align: "left"
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 6 — SAFETY PROFILE
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.amber }, line: { color: C.amber }
});
s.addText("Safety Profile", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
// wP safety
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y: 0.88, w: 4.3, h: 0.38,
fill: { color: C.teal }, line: { color: C.teal }
});
s.addText("Whole-Cell (wP) — Adverse Events", {
x: 0.3, y: 0.88, w: 4.3, h: 0.38, fontSize: 12, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0
});
const wpSafety = [
["Local reactions", "Very common (>50%): redness, swelling, pain at injection site", C.red],
["Fever", "Common; often high-grade (>40°C in some cases)", C.red],
["Prolonged crying", "Up to 3% of doses; self-limiting", C.red],
["Febrile seizures", "Rare but reported (1–9 per 100,000 doses)", C.red],
["Hypotonic-hyporesponsive episode (HHE)", "Rare; generally self-resolving", C.red],
["Encephalopathy (claimed)", "Alleged but NOT causally proven (IOM 1994 review)", "#8A9BB8"],
];
wpSafety.forEach(([ae, desc], i) => {
const y = 1.34 + i * 0.6;
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y, w: 4.3, h: 0.55,
fill: { color: i % 2 === 0 ? "131F3C" : C.navyMid }, line: { color: "1E2D50" }
});
s.addText(ae, { x: 0.38, y: y + 0.02, w: 4.1, h: 0.22, fontSize: 11, bold: true, color: C.red, margin: 0 });
s.addText(desc, { x: 0.38, y: y + 0.23, w: 4.1, h: 0.22, fontSize: 9.5, color: C.offWhite, margin: 0 });
});
// aP safety
s.addShape(pres.shapes.RECTANGLE, {
x: 5.4, y: 0.88, w: 4.3, h: 0.38,
fill: { color: C.amber }, line: { color: C.amber }
});
s.addText("Acellular (aP) — Adverse Events", {
x: 5.4, y: 0.88, w: 4.3, h: 0.38, fontSize: 12, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0
});
const apSafety = [
["Local reactions", "Less common, milder than wP", C.green],
["Fever", "Less frequent; usually low-grade", C.green],
["Systemic reactions", "Significantly reduced vs wP", C.green],
["Large local reactions (LLR)", "Increased risk after multiple doses (4th–5th)", C.red],
["No neurological concerns", "No causal link to encephalopathy", C.green],
["Injection site nodule", "Rare; especially with aluminium adjuvant", "#8A9BB8"],
];
apSafety.forEach(([ae, desc, color], i) => {
const y = 1.34 + i * 0.6;
s.addShape(pres.shapes.RECTANGLE, {
x: 5.4, y, w: 4.3, h: 0.55,
fill: { color: i % 2 === 0 ? "131F3C" : C.navyMid }, line: { color: "1E2D50" }
});
s.addText(ae, { x: 5.48, y: y + 0.02, w: 4.1, h: 0.22, fontSize: 11, bold: true, color, margin: 0 });
s.addText(desc, { x: 5.48, y: y + 0.23, w: 4.1, h: 0.22, fontSize: 9.5, color: C.offWhite, margin: 0 });
});
s.addText("The switch to aP vaccines was largely driven by safety concerns about wP — but subsequent analysis showed most serious events were not causally linked.", {
x: 0.4, y: 5.22, w: 9.2, h: 0.3,
fontSize: 10, italic: true, color: C.lightGray
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 7 — WANING IMMUNITY & RESURGENCE
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.red }, line: { color: C.red }
});
s.addText("Waning Immunity & Pertussis Resurgence", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
// Timeline visual
const timelineY = 1.4;
s.addShape(pres.shapes.RECTANGLE, {
x: 0.5, y: timelineY + 0.12, w: 9.0, h: 0.06,
fill: { color: C.lightGray }, line: { color: C.lightGray }
});
const events = [
[0.5, "1940s", "wP introduced\nCases fall\n>99%"],
[2.2, "1990s", "aP replaces wP\n(US, EU, Japan)\nFewer side effects"],
[4.2, "2000s", "Waning immunity\nCases rebound\n~20,000/yr US"],
[6.1, "2010–12", "Major outbreaks\n48,000 US cases\nin 2012"],
[8.0, "2024–26", "Pertactin-\ndeficient strains\nSpreading globally"],
];
events.forEach(([x, year, text], i) => {
const isTop = i % 2 === 0;
const dotY = timelineY + 0.09;
s.addShape(pres.shapes.OVAL, {
x: x - 0.1, y: dotY, w: 0.22, h: 0.22,
fill: { color: i < 2 ? C.teal : i < 4 ? C.amber : C.red },
line: { color: C.navy }
});
s.addText(year, {
x: x - 0.3, y: isTop ? dotY - 0.3 : dotY + 0.24,
w: 0.9, h: 0.25, fontSize: 9, bold: true,
color: i < 2 ? C.teal : i < 4 ? C.amber : C.red,
align: "center", margin: 0
});
s.addText(text, {
x: x - 0.45, y: isTop ? timelineY - 1.15 : timelineY + 0.55,
w: 1.2, h: 0.85, fontSize: 9.5, color: C.offWhite,
align: "center", margin: 0
});
});
// Key reasons box
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y: 2.7, w: 9.4, h: 0.35,
fill: { color: "1C2D55" }, line: { color: C.red, width: 1.5 }
});
s.addText("Why did pertussis resurge after aP vaccine introduction?", {
x: 0.4, y: 2.7, w: 9.2, h: 0.35,
fontSize: 13, bold: true, color: C.amber, valign: "middle", margin: 4
});
const reasons = [
["1. Rapid waning immunity", "aP protection wanes within 2–4 years after 5th/6th dose vs 10–12 years for wP"],
["2. TH2 vs TH1/TH17 bias", "aP does not elicit TH17 responses needed for mucosal immunity; natural infection and wP do"],
["3. Colonization not blocked", "aP recipients can carry and transmit B. pertussis silently — 'cocooning' fails"],
["4. Pertactin-deficient strains", "Vaccine-driven evolution: strains losing PRN (a key aP antigen) have spread globally (2024 systematic review)"],
["5. Underimmunization in adults", "Adult Tdap coverage was only 30.1% in US (2019) — large susceptible reservoir"],
];
reasons.forEach(([title, desc], i) => {
const y = 3.14 + i * 0.46;
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y, w: 9.4, h: 0.43,
fill: { color: i % 2 === 0 ? "131F3C" : C.navyMid }, line: { color: "1E2D50" }
});
s.addText(title, { x: 0.42, y: y + 0.03, w: 2.3, h: 0.38, fontSize: 10.5, bold: true, color: C.red, valign: "middle", margin: 0 });
s.addText(desc, { x: 2.78, y: y + 0.03, w: 6.8, h: 0.38, fontSize: 10.5, color: C.offWhite, valign: "middle", margin: 0 });
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 8 — VACCINATION SCHEDULES & GLOBAL USE
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.teal }, line: { color: C.teal }
});
s.addText("Vaccination Schedules & Global Use", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
// Left: Developed nations (aP)
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y: 0.88, w: 4.3, h: 0.38,
fill: { color: C.amber }, line: { color: C.amber }
});
s.addText("High-Income Countries (aP-based)", {
x: 0.3, y: 0.88, w: 4.3, h: 0.38, fontSize: 12, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0
});
const hiRows = [
["Vaccine", "DTaP"],
["Primary series", "2, 4, 6 months (3 doses)"],
["Booster 1", "15–18 months"],
["Booster 2", "4–6 years"],
["Adolescent", "Tdap at 11–12 years"],
["Adults", "Single Tdap (unvaccinated)"],
["Pregnancy", "Tdap at 27–36 wks (every pregnancy)"],
["HCW", "Tdap recommended"],
["Coverage (US)", "89.9% adolescents, 30.1% adults (2019)"],
];
hiRows.forEach(([label, val], i) => {
const y = 1.35 + i * 0.43;
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y, w: 4.3, h: 0.40,
fill: { color: i % 2 === 0 ? "131F3C" : C.navyMid }, line: { color: "1E2D50" }
});
s.addText(label, { x: 0.38, y, w: 1.6, h: 0.40, fontSize: 10.5, bold: true, color: C.amber, valign: "middle", margin: 4 });
s.addText(val, { x: 2.0, y, w: 2.5, h: 0.40, fontSize: 10.5, color: C.offWhite, valign: "middle", margin: 4 });
});
// Right: LMICs (wP)
s.addShape(pres.shapes.RECTANGLE, {
x: 5.4, y: 0.88, w: 4.3, h: 0.38,
fill: { color: C.teal }, line: { color: C.teal }
});
s.addText("Low/Middle-Income Countries (wP-based)", {
x: 5.4, y: 0.88, w: 4.3, h: 0.38, fontSize: 12, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0
});
const lmicRows = [
["Vaccine", "DTwP or Pentavalent"],
["Primary series", "6, 10, 14 weeks (3 doses)"],
["Combination", "Often with HBV, Hib, IPV"],
["Global coverage", "~84% DTP3 globally (WHO 2022)"],
["Cost", "Significantly lower than aP"],
["WHO SAGE", "Countries using wP should continue"],
["Advantage", "Blocks transmission + colonization"],
["Limitation", "More reactogenic; cold-chain needed"],
["", ""],
];
lmicRows.forEach(([label, val], i) => {
const y = 1.35 + i * 0.43;
s.addShape(pres.shapes.RECTANGLE, {
x: 5.4, y, w: 4.3, h: 0.40,
fill: { color: i % 2 === 0 ? "131F3C" : C.navyMid }, line: { color: "1E2D50" }
});
if (label) {
s.addText(label, { x: 5.48, y, w: 1.6, h: 0.40, fontSize: 10.5, bold: true, color: C.teal, valign: "middle", margin: 4 });
s.addText(val, { x: 7.1, y, w: 2.5, h: 0.40, fontSize: 10.5, color: C.offWhite, valign: "middle", margin: 4 });
}
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 9 — NEXT-GENERATION VACCINES
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.green }, line: { color: C.green }
});
s.addText("Next-Generation Pertussis Vaccines", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
s.addText("Current acellular vaccines prevent disease but fail to block transmission. The next generation must achieve sterilizing mucosal immunity.", {
x: 0.4, y: 0.85, w: 9.2, h: 0.45,
fontSize: 12.5, color: C.offWhite, italic: true
});
const candidates = [
{
title: "Live Attenuated Nasal Vaccine (BPZE1)",
stage: "Phase II trials",
stageColor: C.amber,
pts: [
"Delivered intranasally → optimizes mucosal TH1/TH17 response",
"Mimics natural infection immunity profile",
"Reduces nasopharyngeal colonization in animal models",
"Potentially single dose; no cold chain dependency",
]
},
{
title: "Outer Membrane Vesicle (OMV) Vaccines",
stage: "Preclinical / Phase I",
stageColor: C.lightGray,
pts: [
"Contains native LPS and surface proteins similar to whole-cell",
"Retains TH1/TH17 stimulating capacity",
"Better safety profile than whole-cell (no live bacteria)",
"Could bridge wP immunogenicity with aP safety",
]
},
{
title: "Polysaccharide-Protein Conjugate Vaccine",
stage: "Early development",
stageColor: C.lightGray,
pts: [
"Links B. pertussis capsule polysaccharide to pertussis toxin",
"Novel antigen target not included in current vaccines",
"May address pertactin-deficient strain evasion",
]
},
];
candidates.forEach((c, i) => {
const y = 1.4 + i * 1.38;
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y, w: 9.4, h: 1.28,
fill: { color: C.navyMid }, line: { color: C.green, width: 1.5 }
});
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y, w: 0.22, h: 1.28,
fill: { color: C.green }, line: { color: C.green }
});
// Stage pill
s.addShape(pres.shapes.ROUNDED_RECTANGLE, {
x: 8.3, y: y + 0.08, w: 1.3, h: 0.26,
fill: { color: c.stageColor }, line: { color: c.stageColor }, rectRadius: 0.13
});
s.addText(c.stage, {
x: 8.3, y: y + 0.08, w: 1.3, h: 0.26,
fontSize: 8.5, bold: true, color: C.navy, align: "center", valign: "middle", margin: 0
});
s.addText(c.title, {
x: 0.62, y: y + 0.05, w: 7.5, h: 0.3,
fontSize: 13, bold: true, color: C.green, margin: 0
});
s.addText(c.pts.map((p, pi) => ({
text: p,
options: { bullet: { type: "bullet", indent: 10 }, breakLine: pi < c.pts.length - 1, fontSize: 11, color: C.offWhite }
})), { x: 0.62, y: y + 0.38, w: 9.0, h: 0.85, valign: "top" });
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 10 — HEAD-TO-HEAD SUMMARY
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.teal }, line: { color: C.teal }
});
s.addText("Head-to-Head Summary", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
const cols = ["Characteristic", "Whole-Cell (wP)", "Acellular (aP)"];
const colX2 = [0.25, 3.42, 6.72];
const colW2 = [3.1, 3.22, 3.0];
// Header
cols.forEach((h, ci) => {
s.addShape(pres.shapes.RECTANGLE, {
x: colX2[ci], y: 0.88, w: colW2[ci] - 0.04, h: 0.38,
fill: { color: ci === 1 ? C.teal : ci === 2 ? C.amber : "1C2D55" },
line: { color: C.navy }
});
s.addText(h, {
x: colX2[ci], y: 0.88, w: colW2[ci] - 0.04, h: 0.38,
fontSize: 12, bold: true, color: ci === 0 ? C.offWhite : C.navy,
align: "center", valign: "middle", margin: 0
});
});
const summaryRows = [
["Composition", "Killed whole bacteria", "Purified subunit proteins"],
["Antigens", "Thousands (all native)", "2–5 selected antigens"],
["Immune response", "TH1 + TH17", "TH2-biased"],
["Mucosal IgA", "Yes", "No"],
["Duration of protection", "~10–12 years", "2–4 years"],
["Blocks transmission", "Yes", "No"],
["Reactogenicity", "High", "Low"],
["Serious adverse events", "Rare but reported", "Very rare"],
["Cost", "Low (LMICs)", "Higher"],
["WHO recommendation", "Continue in wP countries", "Add boosters + maternal Tdap"],
["Resurgence risk", "Lower", "Higher (proven)"],
];
summaryRows.forEach((row, ri) => {
const y = 1.33 + ri * 0.38;
const bg = ri % 2 === 0 ? "131F3C" : C.navyMid;
row.forEach((cell, ci) => {
s.addShape(pres.shapes.RECTANGLE, {
x: colX2[ci], y, w: colW2[ci] - 0.04, h: 0.36,
fill: { color: bg }, line: { color: "1E2D50" }
});
let color = C.offWhite;
if (ci === 1 && ["Yes", "~10–12 years", "TH1 + TH17", "Lower"].includes(cell)) color = C.green;
if (ci === 2 && ["No", "2–4 years", "TH2-biased", "Higher (proven)"].includes(cell)) color = C.red;
if (ci === 1 && ["High"].includes(cell)) color = C.red;
if (ci === 2 && ["Low", "Very rare"].includes(cell)) color = C.green;
s.addText(cell, {
x: colX2[ci] + 0.08, y, w: colW2[ci] - 0.2, h: 0.36,
fontSize: 10.5, color, valign: "middle", margin: 0,
align: ci === 0 ? "left" : "center", bold: ci === 0
});
});
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 11 — CONCLUSION & KEY TAKEAWAYS
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkBg(s);
s.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: 10, h: 0.08, fill: { color: C.amber }, line: { color: C.amber }
});
s.addText("Key Takeaways", {
x: 0.5, y: 0.2, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white, align: "left", margin: 0
});
const takeaways = [
[C.teal, "wP > aP for population immunity", "Whole-cell vaccines block transmission and provide longer-lasting TH1/TH17 immunity. WHO recommends countries using wP continue to do so."],
[C.amber, "aP wins on safety & tolerability", "Far fewer local and systemic reactions. Enabled high uptake globally. Reduced parent vaccine hesitancy."],
[C.red, "Pertussis has resurged with aP", "Waning immunity + no transmission blocking = epidemics every 3–5 years. Pertactin-deficient strains are spreading (2024 systematic review, PMID 39686838)."],
[C.green, "Maternal Tdap is the best bridge", "Tdap at 27–36 weeks is 90–93% effective at protecting infants <2 months — the highest-risk group. Recommended in every pregnancy."],
[C.teal, "Next-gen vaccines must block transmission", "Live nasal (BPZE1) and OMV vaccines in trials aim to restore mucosal immunity. Sterilizing immunity is the ultimate goal."],
[C.lightGray, "Adults & HCWs are a key reservoir", "Adult Tdap coverage only 30% in the US. Improving adult vaccination would reduce infant exposure significantly."],
];
takeaways.forEach(([color, title, body], i) => {
const x = i < 3 ? 0.3 : 5.2;
const y = 0.88 + (i % 3) * 1.52;
s.addShape(pres.shapes.RECTANGLE, {
x, y, w: 4.6, h: 1.42,
fill: { color: C.navyMid }, line: { color }
});
s.addShape(pres.shapes.RECTANGLE, {
x, y, w: 4.6, h: 0.06, fill: { color }, line: { color }
});
s.addText(title, {
x: x + 0.15, y: y + 0.1, w: 4.3, h: 0.32,
fontSize: 12, bold: true, color, margin: 0
});
s.addText(body, {
x: x + 0.15, y: y + 0.45, w: 4.3, h: 0.92,
fontSize: 10.5, color: C.offWhite, margin: 0
});
});
}
// ─── Write file ───────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/pertussis-vaccines/Pertussis_Vaccines_aP_vs_wP.pptx" })
.then(() => console.log("DONE"))
.catch(e => console.error("ERROR:", e));
node /home/daytona/workspace/pertussis-vaccines/build.js
ls -lh /home/daytona/workspace/pertussis-vaccines/
Pertussis Vaccines aP vs wP
Presentation · PPTX
| # | Slide | Highlights |
|---|---|---|
| 1 | Title | Deep navy design with teal/amber palette |
| 2 | Background: The Pertussis Problem | 4 stat cards (16M cases/year, 200K deaths pre-vaccine, etc.), key epidemiology bullets |
| 3 | Vaccine Composition | Side-by-side panels — wP (killed whole bacteria, all antigens, TH1/TH17) vs aP (PT, FHA, PRN, fimbriae, TH2-biased) |
| 4 | Immunogenicity & Mechanism | Color-coded comparison table (green = advantage, red = limitation) across 7 parameters |
| 5 | Efficacy & Effectiveness | Bar chart comparison — initial efficacy, waning, nasopharyngeal clearance, transmission blocking |
| 6 | Safety Profile | Adverse event breakdown for both vaccines; addresses the wP encephalopathy controversy |
| 7 | Waning Immunity & Resurgence | Timeline from 1940s to 2024-26, with 5 reasons why pertussis resurged after aP introduction |
| 8 | Vaccination Schedules & Global Use | US/high-income (DTaP/Tdap) vs LMIC (DTwP/Pentavalent) schedules side by side |
| 9 | Next-Generation Vaccines | BPZE1 live nasal vaccine, OMV vaccines, polysaccharide-conjugate — stages and goals |
| 10 | Head-to-Head Summary | Full 11-row comparison table |
| 11 | Key Takeaways | 6 color-coded message cards with clinical and public health implications |