D test microbiology
| Mechanism | Gene | Cross-resistance to Clindamycin? |
|---|---|---|
| Active efflux pump | msrA/msrB | No |
| Macrolide-inactivating enzymes | - | No |
| Ribosomal methylation | erm gene | Yes (inducible or constitutive) |

| Finding | Interpretation | Report |
|---|---|---|
| Circular zone around C disk (A) | D-test negative - no inducible resistance | Clindamycin susceptible - safe to use |
| D-shaped (flattened) zone around C disk toward E (B) | D-test positive - inducible clindamycin resistance present | Report as resistant; avoid clindamycin |
| No zone around both E and C | Constitutive MLS-B resistance | Both reported as resistant |

| Feature | Detail |
|---|---|
| Test name | D test / Double-disk diffusion / D-zone test |
| Purpose | Detect inducible MLS-B (clindamycin) resistance |
| Gene involved | erm (erythromycin ribosomal methylase) |
| Disks used | Erythromycin (E) + Clindamycin (CC) |
| Disk spacing | 15-17 mm apart (edge-to-edge) |
| Positive result | D-shaped flattening of clindamycin zone toward erythromycin |
| Clinical action if positive | Do NOT use clindamycin (report as resistant) |
| Organisms | S. aureus, CoNS, GBS, GAS, S. pneumoniae |
| Guideline | CLSI M100 |
Wow good job
I’m doing md microbiology..
Generate a quick reference PDF on CLSI standards & breakpoints
mkdir -p /home/daytona/workspace/clsi-reference && ls /home/daytona/workspace/cl…
~/clsi-reference/generate_clsi_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, PageBreak, KeepTogether)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable
# ── Color Palette ─────────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1A3A5C")
TEAL = colors.HexColor("#0D7680")
LIGHT_TEAL = colors.HexColor("#E6F4F5")
GOLD = colors.HexColor("#E8A020")
LIGHT_GOLD = colors.HexColor("#FFF8EC")
RED = colors.HexColor("#C0392B")
GREEN = colors.HexColor("#1A7A4A")
ORANGE = colors.HexColor("#D35400")
GREY_DARK = colors.HexColor("#2C3E50")
GREY_MID = colors.HexColor("#7F8C8D")
GREY_LIGHT = colors.HexColor("#ECF0F1")
WHITE = colors.white
PURPLE = colors.HexColor("#6C3483")
LIGHT_PURPLE = colors.HexColor("#F4ECF7")
doc_path = "/home/daytona/workspace/clsi-reference/CLSI_Standards_Quick_Reference.pdf"
doc = SimpleDocTemplate(
doc_path,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="CLSI Standards & Breakpoints – Quick Reference",
author="MD Microbiology Quick Reference"
)
styles = getSampleStyleSheet()
W = A4[0] - 3.6*cm # usable width
# ── Custom Styles ──────────────────────────────────────────────────────────────
def style(name, **kw):
return ParagraphStyle(name, **kw)
cover_title = style("CoverTitle", fontSize=28, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, spaceAfter=8, leading=34)
cover_sub = style("CoverSub", fontSize=14, textColor=LIGHT_TEAL, fontName="Helvetica",
alignment=TA_CENTER, spaceAfter=4)
cover_note = style("CoverNote", fontSize=10, textColor=GREY_LIGHT, fontName="Helvetica-Oblique",
alignment=TA_CENTER)
h1 = style("H1", fontSize=15, textColor=WHITE, fontName="Helvetica-Bold",
spaceBefore=4, spaceAfter=4, leading=18)
h2 = style("H2", fontSize=12, textColor=NAVY, fontName="Helvetica-Bold",
spaceBefore=8, spaceAfter=3, leading=15)
h3 = style("H3", fontSize=10, textColor=TEAL, fontName="Helvetica-Bold",
spaceBefore=5, spaceAfter=2, leading=13)
body = style("Body", fontSize=9, textColor=GREY_DARK, fontName="Helvetica",
spaceAfter=3, leading=13, alignment=TA_JUSTIFY)
body_b = style("BodyB", fontSize=9, textColor=GREY_DARK, fontName="Helvetica-Bold",
spaceAfter=3, leading=13)
bullet_s = style("Bullet", fontSize=9, textColor=GREY_DARK, fontName="Helvetica",
spaceAfter=2, leading=12, leftIndent=14, bulletIndent=4)
small = style("Small", fontSize=8, textColor=GREY_MID, fontName="Helvetica-Oblique",
spaceAfter=2, leading=11)
key_point = style("KP", fontSize=9, textColor=NAVY, fontName="Helvetica-Bold",
spaceAfter=1, leading=12, leftIndent=6)
footer_s = style("Footer", fontSize=7, textColor=GREY_MID, fontName="Helvetica",
alignment=TA_CENTER)
# ── Helper Flowables ───────────────────────────────────────────────────────────
class ColorBox(Flowable):
"""Colored header banner with text."""
def __init__(self, text, bg=NAVY, text_style=None, padding=8, radius=4):
super().__init__()
self.text = text
self.bg = bg
self.tstyle = text_style or h1
self.pad = padding
self.radius = radius
self.width = W
self.height = 28
def draw(self):
c = self.canv
c.setFillColor(self.bg)
c.roundRect(0, 0, self.width, self.height, self.radius, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 12)
c.drawString(self.pad, 9, self.text)
class SectionDivider(Flowable):
def __init__(self, color=TEAL):
super().__init__()
self.color = color
self.width = W
self.height = 3
def draw(self):
c = self.canv
c.setFillColor(self.color)
c.rect(0, 1, self.width, 2, fill=1, stroke=0)
def hr(color=GREY_LIGHT, thickness=0.5):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=4, spaceBefore=4)
def section_banner(text, bg=NAVY):
return [Spacer(1, 6), ColorBox(text, bg=bg), Spacer(1, 6)]
def info_box(title, items, bg=LIGHT_TEAL, title_color=TEAL):
"""Render a shaded info box."""
rows = []
for it in items:
rows.append([Paragraph(f"• {it}", bullet_s)])
t = Table([[Paragraph(title, style("IBTitle", fontSize=9, textColor=title_color,
fontName="Helvetica-Bold", spaceAfter=2, leading=12))]],
colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 2),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
t2 = Table([[Paragraph(f"• {it}", bullet_s)] for it in items], colWidths=[W])
t2.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 14),
]))
return [t, t2, Spacer(1, 4)]
def two_col_table(headers, rows, col_widths=None, header_bg=NAVY):
if col_widths is None:
col_widths = [W/len(headers)]*len(headers)
data = [headers] + rows
t = Table(data, colWidths=col_widths, repeatRows=1)
style_cmds = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREY_LIGHT]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
]
t.setStyle(TableStyle(style_cmds))
return [t, Spacer(1, 6)]
def P(text, st=None):
return Paragraph(text, st or body)
def B(text):
return Paragraph(f"• {text}", bullet_s)
# ══════════════════════════════════════════════════════════════════════════════
# COVER PAGE
# ══════════════════════════════════════════════════════════════════════════════
story = []
# Cover background table
cover_data = [[
Paragraph("CLSI Standards & Breakpoints", cover_title),
Paragraph("Quick Reference for MD Microbiology", cover_sub),
Paragraph("Clinical & Laboratory Standards Institute | AST Methods | Breakpoints | QC | Resistance Detection", cover_note),
Spacer(1, 12),
Paragraph("Based on CLSI M02, M07, M11, M100 (2020) | Henry's Clinical Diagnosis | Tietz Textbook | Goldman-Cecil Medicine", cover_note),
]]
cover_table = Table([
[Paragraph("CLSI Standards & Breakpoints", cover_title)],
[Paragraph("Quick Reference for MD Microbiology", cover_sub)],
[Spacer(1, 10)],
[Paragraph("Clinical & Laboratory Standards Institute | AST Methods | Breakpoints | QC | Resistance Detection", cover_note)],
[Spacer(1, 6)],
[Paragraph("CLSI M02 · M07 · M11 · M100 (2020 edition)", cover_note)],
[Spacer(1, 30)],
[Paragraph("Compiled for MD Microbiology Exam Preparation", cover_note)],
[Paragraph("July 2026", cover_note)],
], colWidths=[W])
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), 24),
("RIGHTPADDING",(0,0), (-1,-1), 24),
("ROUNDEDCORNERS", [10]),
]))
story.append(Spacer(1, 60))
story.append(cover_table)
story.append(Spacer(1, 30))
# Cover quick-nav strip
nav_items = ["1. CLSI Overview", "2. Key Definitions", "3. Methods of AST",
"4. Breakpoint Categories", "5. Important Breakpoints",
"6. QC Standards", "7. Special Organisms", "8. Resistance Phenotypes", "9. Antibiogram"]
nav_data = [[Paragraph(n, style("NavItem", fontSize=8, textColor=NAVY, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=11))] for n in nav_items]
# 3-column grid
rows3 = []
for i in range(0, len(nav_items), 3):
row = nav_items[i:i+3]
while len(row) < 3:
row.append("")
rows3.append([Paragraph(r, style("NavItem2", fontSize=9, textColor=NAVY, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=12)) for r in row])
nav_table = Table(rows3, colWidths=[W/3]*3)
nav_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_TEAL),
("GRID", (0,0), (-1,-1), 0.5, TEAL),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING",(0,0),(-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(Paragraph("<b>Contents at a Glance</b>",
style("NavHead", fontSize=11, textColor=NAVY, fontName="Helvetica-Bold",
spaceAfter=4, alignment=TA_CENTER)))
story.append(nav_table)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 – CLSI OVERVIEW
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("1. CLSI OVERVIEW", bg=NAVY)
story.append(P("The <b>Clinical and Laboratory Standards Institute (CLSI)</b> is a global, nonprofit, standards-developing organization that defines and promotes best practices in clinical laboratory testing. Its antimicrobial susceptibility testing (AST) documents set the benchmark for microbiology laboratories in the United States and many international centers."))
story.append(Spacer(1,4))
story.append(P("<b>Core CLSI AST Documents:</b>", body_b))
doc_rows = [
["M02", "Disk Diffusion – Performance Standards", "Annually updated"],
["M07", "Broth Dilution – Performance Standards", "Annually updated"],
["M11", "Anaerobic Bacteria AST", "Periodic update"],
["M100", "Performance Standards for AST – MIC & Zone Breakpoints", "Annually updated (key table document)"],
["M45", "Fastidious Bacteria (H. influenzae, N. gonorrhoeae, etc.)", "Periodic update"],
["M27", "Yeasts – Broth Dilution AST", "Periodic update"],
["M38", "Filamentous Fungi AST", "Periodic update"],
["M44", "Disk Diffusion – Yeasts", "Periodic update"],
]
story += two_col_table(
[Paragraph("<b>Document</b>", style("TH", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold")),
Paragraph("<b>Covers</b>", style("TH", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold")),
Paragraph("<b>Update Cycle</b>", style("TH", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold"))],
[[Paragraph(r[0], body), Paragraph(r[1], body), Paragraph(r[2], small)] for r in doc_rows],
col_widths=[1.5*cm, 11*cm, 4*cm], header_bg=NAVY
)
story.append(P("The Subcommittee on Antimicrobial Susceptibility Testing revises most documents on a <b>3-year cycle</b> for text and <b>yearly</b> for MIC/zone breakpoint tables."))
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 – KEY DEFINITIONS
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("2. KEY DEFINITIONS", bg=TEAL)
def_rows = [
["MIC\n(Minimum Inhibitory Concentration)",
"The LOWEST concentration of an antibiotic that inhibits visible growth of an organism in vitro after standardized incubation. Expressed in µg/mL."],
["MBC\n(Minimum Bactericidal Concentration)",
"The lowest concentration that kills ≥99.9% of the original inoculum. MBC/MIC ratio ≤4 = bactericidal; >4 = bacteriostatic."],
["Breakpoint",
"A pre-defined MIC (or zone diameter) value that separates susceptible from non-susceptible organisms. Set by CLSI using pharmacokinetic/pharmacodynamic (PK/PD) data, clinical outcome data, and epidemiological cut-off values (ECOFFs)."],
["ECOFF\n(Epidemiological Cut-off Value)",
"The MIC or zone diameter that separates wild-type organisms (no acquired resistance) from those with acquired resistance mechanisms. Used by EUCAST."],
["PK/PD Breakpoints",
"Derived from pharmacokinetic (drug levels in body) and pharmacodynamic (drug-bug interaction) parameters. The key PD indices are: Time>MIC (β-lactams), AUC/MIC (fluoroquinolones, aminoglycosides), Cmax/MIC (aminoglycosides)."],
]
t = Table([[Paragraph(f"<b>{r[0]}</b>", style("DefTerm", fontSize=9, textColor=NAVY,
fontName="Helvetica-Bold", leading=12, spaceAfter=1)),
Paragraph(r[1], body)] for r in def_rows],
colWidths=[4.5*cm, 12.5*cm])
t.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0), (-1,-1), [WHITE, LIGHT_TEAL]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t)
story.append(Spacer(1, 8))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 – METHODS OF AST
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("3. METHODS OF ANTIMICROBIAL SUSCEPTIBILITY TESTING", bg=PURPLE)
methods_data = [
["Method", "Principle", "Result", "Standard", "Organisms"],
["Disk Diffusion\n(Kirby-Bauer)",
"Antibiotic-impregnated disk on MH agar inoculated with 0.5 McFarland suspension. Zone of inhibition forms after 16-24 h.",
"Zone diameter (mm)\n→ S / I / R",
"CLSI M02",
"Rapidly growing aerobes & facultative anaerobes"],
["Broth Microdilution",
"Serial 2-fold dilutions of antibiotic in cation-adjusted MH broth (CAMHB). Inoculum ~5×10⁵ CFU/mL. Incubate 35°C/16-20 h.",
"MIC (µg/mL)\n→ S / SDD / I / R",
"CLSI M07",
"Most bacteria; gold standard for MIC"],
["Agar Dilution",
"Antibiotic incorporated into MH agar plates. Organism streaked (Steers replicator). Lowest drug-containing plate without growth = MIC.",
"MIC (µg/mL)",
"CLSI M07",
"Research; large-scale testing"],
["Gradient Diffusion\n(E-test / MIC strip)",
"Plastic strip with continuous antibiotic gradient applied to inoculated agar. Elliptical zone intersects strip at MIC value.",
"MIC (µg/mL)",
"Correlates with CLSI",
"Fastidious organisms, single-drug testing"],
["Anaerobic AST",
"Brucella agar + laked sheep blood + hemin + Vit K1 (Wadsworth); or Brucella broth for microdilution.",
"MIC (µg/mL)",
"CLSI M11",
"Anaerobes (B. fragilis group, etc.)"],
["Automated Systems\n(VITEK2, BD Phoenix, MicroScan)",
"Miniaturized broth dilution in plastic cards/panels; turbidity/fluorescence read every 15-60 min.",
"MIC + S/I/R\n(4-8 h)",
"FDA-cleared; CLSI-aligned",
"Most bacteria; high-volume labs"],
]
t = Table(methods_data, colWidths=[3*cm, 5.5*cm, 2.5*cm, 2*cm, 3.5*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), PURPLE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, LIGHT_PURPLE]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
]))
story.append(t)
story.append(Spacer(1,4))
story += info_box("Critical Standardized Conditions (CLSI M02 & M07):", [
"Medium: Mueller-Hinton Agar (MHA) for disk diffusion; Cation-Adjusted MH Broth (CAMHB) for broth dilution",
"Agar depth: 4 mm (for disk diffusion) – too deep → false resistance; too shallow → false susceptibility",
"Inoculum: 0.5 McFarland standard (~1-4 × 10⁸ CFU/mL for disk; ~5 × 10⁵ CFU/mL for broth)",
"Temperature: 35°C ± 2°C | Atmosphere: ambient air (CO₂ for Streptococcus, Haemophilus)",
"Incubation: 16-24 h (general); 20-24 h for Streptococcus; 24 h for MRSA/oxacillin; 48 h for vancomycin screening agar",
"Supplements: 5% sheep blood for Streptococcus disk diffusion; 2.5-5% lysed horse blood for broth; HTM for H. influenzae",
], bg=LIGHT_PURPLE, title_color=PURPLE)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 – BREAKPOINT CATEGORIES
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("4. BREAKPOINT CATEGORIES (CLSI M100)", bg=TEAL)
story.append(P("CLSI defines five interpretive categories for AST results:"))
story.append(Spacer(1,4))
cat_data = [
["Category", "Abbreviation", "Definition", "Clinical Implication"],
["Susceptible", "S",
"MIC ≤ susceptible breakpoint. Organism is inhibited by normally achievable drug concentrations.",
"Standard dosing likely to succeed."],
["Susceptible–Dose Dependent", "SDD",
"Organism susceptibility is dependent on achieving maximum drug exposure (higher dose or optimized PK/PD). Introduced in M100 2019.",
"Use higher approved dose or extended infusion. Important for fluconazole/Candida, cephalosporins/Enterobacterales."],
["Intermediate", "I",
"MIC is in the intermediate range. Organism may respond if drug is concentrated at site of infection (e.g., urine) or high doses are used. Acts as a buffer zone.",
"May succeed in UTI (concentrated urine drug levels) or with high-dose regimens. Not the first choice."],
["Non-susceptible", "NS",
"Used when only susceptible breakpoint exists. MIC above susceptible cut-off. No intermediate/resistant categories defined.",
"Treatment likely to fail. Used especially for newer drugs with limited resistance data."],
["Resistant", "R",
"MIC ≥ resistant breakpoint. Normal doses unlikely to achieve therapeutic effect.",
"Treatment with this agent not recommended."],
]
t = Table(cat_data, colWidths=[3.2*cm, 2.2*cm, 7.5*cm, 3.6*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, LIGHT_TEAL]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
# Color code the category column
("BACKGROUND", (0,1), (0,1), colors.HexColor("#D5F5E3")), # S - green
("BACKGROUND", (0,2), (0,2), colors.HexColor("#FEF9E7")), # SDD - yellow
("BACKGROUND", (0,3), (0,3), colors.HexColor("#EBF5FB")), # I - blue
("BACKGROUND", (0,4), (0,4), colors.HexColor("#FDEDEC")), # NS - red-ish
("BACKGROUND", (0,5), (0,5), colors.HexColor("#FADBD8")), # R - red
]))
story.append(t)
story.append(Spacer(1,6))
story.append(P("<b>CLSI vs EUCAST – Key Philosophical Differences:</b>", body_b))
ce_rows = [
["Feature", "CLSI (USA)", "EUCAST (Europe)"],
["Intermediate (I) zone", "Buffer zone between S and R; useful for urine/high dose", "Replaced by SDD concept; I = susceptible at increased exposure"],
["Non-susceptible (NS)", "Used when only S breakpoint exists", "Less commonly used"],
["ECOFF", "Uses ECVs (Epidemiological Cut-off Values) as supplement", "ECOFF is central to breakpoint derivation"],
["Update frequency", "Annual (M100 tables)", "Annual (EUCAST tables online)"],
["QC strains", "ATCC reference strains", "EUCAST reference strains + ATCC"],
]
t2 = Table(ce_rows, colWidths=[4.5*cm, 6.5*cm, 5.5*cm], repeatRows=1)
t2.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GREY_DARK),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, GREY_LIGHT]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t2)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 – IMPORTANT BREAKPOINTS
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("5. IMPORTANT MIC BREAKPOINTS (CLSI M100) – Selected", bg=GOLD)
story.append(P("All MIC values in <b>µg/mL</b>. S = Susceptible, I = Intermediate, R = Resistant. Values reflect CLSI M100 2020 edition. Always verify with current edition for clinical use.", small))
story.append(Spacer(1,4))
# 5A - S. aureus
story.append(P("<b>5A. Staphylococcus aureus</b>", h2))
sa_rows = [
["Antibiotic", "S (MIC ≤)", "I (MIC)", "R (MIC ≥)", "Notes"],
["Oxacillin (MSSA only)", "≤ 2", "—", "≥ 4", "Resistant = MRSA. Use disk ≥ 13 mm = S"],
["Penicillin", "≤ 0.12", "—", "≥ 0.25", "β-lactamase negative strains only"],
["Vancomycin", "≤ 2", "4–8", "≥ 16", "Disk diffusion NOT reliable; use MIC only"],
["Clindamycin", "≤ 0.5", "1–2", "≥ 4", "D-test if Ery-R, Clinda-S phenotype"],
["Trimethoprim-Sulfamethoxazole", "≤ 2/38", "—", "≥ 4/76", "Used for CA-MRSA skin infections"],
["Daptomycin", "≤ 1", "—", "NS (> 1)", "No intermediate category"],
["Linezolid", "≤ 4", "—", "≥ 8", "No disk diffusion breakpoint for S. aureus"],
["Teicoplanin", "≤ 8", "16", "≥ 32", "Glycopeptide; CLSI/EUCAST may differ"],
["Rifampicin", "≤ 1", "2", "≥ 4", "Never use as monotherapy"],
]
t = Table(sa_rows, colWidths=[5.5*cm, 2*cm, 2.5*cm, 2*cm, 4.5*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#8B6914")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, LIGHT_GOLD]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 5),
("ALIGN", (1,0), (3,-1), "CENTER"),
]))
story.append(t)
story.append(Spacer(1,6))
# 5B - Enterobacterales
story.append(P("<b>5B. Enterobacterales (E. coli, Klebsiella, Enterobacter, Proteus)</b>", h2))
eb_rows = [
["Antibiotic", "S (MIC ≤)", "SDD/I", "R (MIC ≥)", "Notes"],
["Ampicillin", "≤ 8", "16", "≥ 32", "β-lactamase test first"],
["Amoxicillin-Clavulanate", "≤ 8/4", "16/8", "≥ 32/16", "Covers ESBL if test shows S"],
["Piperacillin-Tazobactam", "≤ 16/4", "SDD 32–64/4", "≥ 128/4", "SDD: extended infusion 3-4 h"],
["Cefazolin (UTI)", "≤ 2", "4", "≥ 8", "Higher breakpoints for systemic infections"],
["Ceftriaxone", "≤ 1", "2", "≥ 4", "Revised down in 2010; prior ≤ 8 µg/mL"],
["Ceftazidime", "≤ 4", "8", "≥ 16", "Anti-pseudomonal cephalosporin"],
["Cefepime", "≤ 2", "SDD 4–8", "≥ 16", "SDD requires PK/PD dosing"],
["Imipenem", "≤ 1", "2", "≥ 4", "Carbapenem; ESBL/AmpC coverage"],
["Meropenem", "≤ 1", "2", "≥ 4", "Preferred for CNS infections"],
["Ertapenem", "≤ 0.5", "1", "≥ 2", "No Pseudomonas/Acinetobacter activity"],
["Ciprofloxacin", "≤ 1", "2", "≥ 4", "Urinary: S ≤ 0.25; tighter UTI breakpoints"],
["Gentamicin", "≤ 4", "8", "≥ 16", "Synergy breakpoints differ"],
["Trimethoprim-Sulfamethoxazole", "≤ 2/38", "—", "≥ 4/76", "UTI, uncomplicated"],
["Colistin / Polymyxin B", "≤ 2", "—", "≥ 4", "No reliable disk diffusion; use MIC"],
]
t = Table(eb_rows, colWidths=[5*cm, 2.2*cm, 2.8*cm, 2.2*cm, 4.3*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GREEN),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#EAFAF1")]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 5),
("ALIGN", (1,0), (3,-1), "CENTER"),
]))
story.append(t)
story.append(Spacer(1,6))
story.append(PageBreak())
# 5C - Pseudomonas
story += section_banner("5C. Pseudomonas aeruginosa & Non-fermenters", bg=colors.HexColor("#1A5276"))
psa_rows = [
["Antibiotic", "S (MIC ≤)", "I", "R (MIC ≥)", "Notes"],
["Piperacillin-Tazobactam", "≤ 16/4", "SDD 32–64/4", "≥ 128/4", "Extended infusion for SDD"],
["Ceftazidime", "≤ 8", "16", "≥ 32", "Higher breakpoints than Enterobacterales"],
["Cefepime", "≤ 8", "SDD 16", "≥ 32", ""],
["Imipenem", "≤ 2", "4", "≥ 8", "Higher than Enterobacterales"],
["Meropenem", "≤ 2", "4", "≥ 8", ""],
["Aztreonam", "≤ 8", "16", "≥ 32", "Monobactam; not active vs Acinetobacter"],
["Ciprofloxacin", "≤ 1", "2", "≥ 4", ""],
["Amikacin", "≤ 16", "32", "≥ 64", "Higher breakpoints than E. coli"],
["Colistin", "≤ 2", "—", "≥ 4", "Last resort; MIC only"],
["Ceftolozane-Tazobactam", "≤ 4/4", "8/4", "≥ 16/4", "Novel; MDR Pseudomonas"],
]
t = Table(psa_rows, colWidths=[5*cm, 2.2*cm, 2.8*cm, 2.2*cm, 4.3*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1A5276")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#EBF5FB")]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 5),
("ALIGN", (1,0), (3,-1), "CENTER"),
]))
story.append(t)
story.append(Spacer(1,8))
# 5D - Streptococcus & Enterococcus
story.append(P("<b>5D. Streptococcus pneumoniae</b>", h2))
spn_rows = [
["Antibiotic", "S (MIC ≤)", "I", "R (MIC ≥)", "Notes"],
["Penicillin (meningitis)", "≤ 0.06", "—", "≥ 0.12", "Much lower than non-meningitis breakpoints"],
["Penicillin (non-meningitis)", "≤ 2", "4", "≥ 8", "Revised upward from ≤ 0.06 in 2008"],
["Amoxicillin", "≤ 2", "4", "≥ 8", ""],
["Cefotaxime / Ceftriaxone (meningitis)", "≤ 0.5", "1", "≥ 2", "Low breakpoints for CNS penetration"],
["Vancomycin", "≤ 1", "—", "NS", "No resistant breakpoint defined"],
["Erythromycin", "≤ 0.25", "0.5", "≥ 1", "D-test if Ery-R, Clinda-S"],
["Levofloxacin", "≤ 2", "—", "≥ 8", "No intermediate category"],
["Moxifloxacin", "≤ 1", "2", "≥ 4", ""],
]
t = Table(spn_rows, colWidths=[5.5*cm, 2.2*cm, 2.2*cm, 2.2*cm, 4.4*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#633974")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, LIGHT_PURPLE]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 5),
("ALIGN", (1,0), (3,-1), "CENTER"),
]))
story.append(t)
story.append(Spacer(1,6))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 6 – QUALITY CONTROL
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("6. QUALITY CONTROL (QC) IN AST", bg=colors.HexColor("#117A65"))
story.append(P("QC ensures accuracy and reproducibility of AST results. CLSI mandates use of well-characterized reference strains with known, reproducible susceptibility results. QC ranges are established for both MIC and zone diameters."))
story.append(Spacer(1,4))
story.append(P("<b>Standard QC Strains (ATCC Reference Organisms):</b>", body_b))
qc_rows = [
["QC Strain", "ATCC #", "Used to QC Testing of", "Key Features"],
["S. aureus", "25923", "Staphylococci, general gram-positive disk diffusion", "Non-β-lactamase producing; known disk zone ranges"],
["S. aureus", "29213", "Staphylococci, MIC testing (broth dilution)", "Non-β-lactamase; standard for MIC QC"],
["E. coli", "25922", "Gram-negative disk diffusion & MIC testing", "Most widely used gram-negative QC strain"],
["P. aeruginosa", "27853", "Non-fermenters, antipseudomonal agents", "Used for P. aeruginosa-specific drug testing"],
["E. faecalis", "29212", "Enterococcus, aminoglycosides (synergy)", "Used for high-level aminoglycoside QC"],
["S. pneumoniae", "49619", "Streptococcus, fastidious organisms", "Requires 5% CO₂; blood-supplemented media"],
["H. influenzae", "49247", "H. influenzae, Haemophilus test medium", "HTM required"],
["N. gonorrhoeae", "49226", "Gonococcal testing; GC agar base", "Fastidious; 5% CO₂"],
["B. fragilis", "25285", "Anaerobic susceptibility testing", "CLSI M11"],
["K. pneumoniae", "700603 (ESBL+)", "ESBL detection confirmation", "Harbors SHV-18; used for ESBL QC"],
]
t = Table(qc_rows, colWidths=[3.5*cm, 2*cm, 6*cm, 5*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#117A65")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#E8F8F5")]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t)
story.append(Spacer(1,6))
story += info_box("QC Rules & Frequency:", [
"QC strains must be run EVERY DAY or EVERY WEEK (depending on test volume and protocol)",
"Each antibiotic-organism combination has an accepted MIC range (2-3 dilutions) and zone diameter range (±2 mm standard)",
"Results outside QC range: identify cause (media issue, inoculum error, disk potency, incubator temperature) and repeat",
"New lots of media or disks require QC validation before patient use",
"At least 30 consecutive days of in-control results required to shift from daily to weekly QC",
"Document all out-of-control events and corrective actions per CLIA/CAP requirements",
], bg=colors.HexColor("#E8F8F5"), title_color=colors.HexColor("#117A65"))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 7 – SPECIAL ORGANISMS
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("7. SPECIAL ORGANISM TESTING RULES", bg=ORANGE)
so_rows = [
["Organism", "Special Rule / Note"],
["MRSA", "Oxacillin resistant (MIC ≥ 4) OR mecA/mecC gene PCR positive. Cefoxitin disk (30 µg) is preferred surrogate: zone ≤ 21 mm = MRSA. Incubate 24 h at 35°C only (not 37°C)."],
["VISA / VRSA", "Vancomycin MIC 4-8 = VISA; ≥ 16 = VRSA. Disk diffusion NOT reliable. Use microbroth dilution or E-test. BHI agar with 6 µg/mL vancomycin (VSA screening agar) incubated 24 h full."],
["ESBL producers", "Screen with ceftriaxone/cefotaxime/ceftazidime/aztreonam (any zone ≤ 22 mm). Confirm with combined disk test (cephalosporin ± clavulanate; ≥ 5 mm increase = ESBL positive). Report all penicillins, cephalosporins, aztreonam as R."],
["Carbapenemase (CRE/CPE)", "Carbapenem MIC ≥ 2 or carbapenem disk zone reduced → test for carbapenemase. Modified Carbapenem Inactivation Method (mCIM) + EDTA-CIM (eCIM) to distinguish MBL vs KPC vs OXA. Confirmatory: PCR for KPC, NDM, VIM, IMP, OXA-48."],
["AmpC producers", "Enterobacter, Citrobacter, Serratia, Morganella: inducible chromosomal AmpC. Can be derepressed → 3rd-gen cephalosporin resistance. Cefepime may be more stable. CLSI: no routine AmpC phenotypic confirmation test currently."],
["S. pneumoniae (penicillin)", "Oxacillin disk (1 µg): zone ≥ 20 mm = penicillin susceptible (no further testing needed). Zone ≤ 19 mm → must perform penicillin MIC for meningitis vs non-meningitis breakpoints."],
["H. influenzae", "β-lactamase test first. β-lactamase positive = ampicillin resistant. β-lactamase negative but ampicillin R = BLNAR (altered PBP3). Use HTM. Disk diffusion only 16-18 h in CO₂."],
["N. gonorrhoeae", "Requires GC agar + growth supplement + 5% CO₂. Test for penicillinase (PPNG), tetracycline-resistant (TRNG), and fluoroquinolone resistance. Ceftriaxone remains standard for treatment."],
["Enterococcus (aminoglycosides)", "High-level aminoglycoside resistance (HLAR) must be tested separately. Gentamicin ≥ 500 µg/mL and Streptomycin ≥ 1000 or 2000 µg/mL = HLAR. HLAR = no synergy with cell wall agents."],
["Group B Streptococcus (GBS)", "Penicillin testing not required (no resistance). Test clindamycin + erythromycin for penicillin-allergic pregnant women. D-zone test mandatory if Ery-R, Clinda-S."],
]
t = Table(so_rows, colWidths=[4.5*cm, 12*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), ORANGE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#FDEBD0")]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 8 – RESISTANCE PHENOTYPES
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("8. IMPORTANT RESISTANCE PHENOTYPES & DETECTION", bg=RED)
story.append(P("<b>Phenotypes Requiring Special Detection Methods (CLSI M100):</b>", body_b))
rp_rows = [
["Phenotype", "Organisms", "Screen/Test", "Confirmatory Test", "Reporting Rule"],
["MRSA", "S. aureus, CoNS",
"Cefoxitin disk 30 µg:\n≤ 21 mm = MRSA\nOxacillin MIC ≥ 4 = MRSA",
"mecA / mecC PCR",
"Report all β-lactams as R (except ceftaroline, ceftobiprole if tested)"],
["ESBL", "E. coli, Klebsiella spp., Proteus mirabilis",
"Zone ≤ 22 mm for ceftriaxone/cefotaxime/ceftazidime/aztreonam",
"Combined disk test (±clavulanate, ≥5 mm = ESBL+)",
"Report all penicillins, cephalosporins, aztreonam as R"],
["Carbapenemase (KPC)", "Klebsiella, E. coli, other Enterobacterales",
"Carbapenem MIC ≥ 2; mCIM positive",
"PCR (KPC gene); Carba NP test",
"Report all carbapenems as R; alert infection control"],
["MBL (NDM, VIM, IMP)", "Enterobacterales, Pseudomonas, Acinetobacter",
"mCIM positive + eCIM positive (EDTA-based)",
"PCR (NDM, VIM, IMP, OXA-23/48)",
"Resistant to all carbapenems; colistin/polymyxin as last resort"],
["MLSB / iMLSB\n(D-test)", "S. aureus, Streptococci, CoNS",
"Erythromycin-R, Clindamycin-S phenotype detected",
"D-zone test (double-disk diffusion 15-17 mm apart)",
"D-test + → report Clindamycin as R"],
["VISA / hVISA", "S. aureus",
"Vancomycin MIC 4-8 (VISA)",
"Population analysis profiling (PAP); BHI agar 6 µg/mL vancomycin",
"Report as intermediate; notify ID physician"],
["VRSA", "S. aureus",
"Vancomycin MIC ≥ 16",
"vanA gene PCR (acquired from Enterococcus)",
"Immediately notify public health; CDC reporting required"],
["VRE", "Enterococcus faecium, E. faecalis",
"Vancomycin disk zone ≤ 14 mm",
"vanA, vanB, vanC PCR or MIC confirmation",
"vanA/vanB = clinically significant R; vanC = intrinsic low-level (E. casseliflavus)"],
["High-level Aminoglycoside R (HLAR)", "Enterococcus",
"Screen: Gentamicin ≥ 500 µg/mL; Streptomycin ≥ 1000 µg/mL MIC",
"Special HLAR screening plates",
"HLAR = No synergistic killing with β-lactams or glycopeptides"],
["BLNAR", "H. influenzae",
"β-lactamase negative but ampicillin-R (MIC ≥ 4)",
"PBP3 gene mutation (ftsI)",
"Report ampicillin R; extended-spectrum cephalosporins may still be active"],
]
t = Table(rp_rows, colWidths=[3*cm, 2.8*cm, 3.5*cm, 3.5*cm, 3.7*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), RED),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#FDEDEC")]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 9 – ANTIBIOGRAM & STEWARDSHIP
# ══════════════════════════════════════════════════════════════════════════════
story += section_banner("9. ANTIBIOGRAM & ANTIMICROBIAL STEWARDSHIP", bg=colors.HexColor("#1A5276"))
story.append(P("A <b>cumulative antibiogram</b> is a summary of the susceptibility profiles of clinically relevant pathogens tested in a facility over a defined time period (typically 1 year). It is a cornerstone of antimicrobial stewardship."))
story.append(Spacer(1,4))
ab_rows = [
["Feature", "CLSI / Best Practice Standard"],
["Frequency", "At least once per year; monthly/quarterly in high-acuity settings"],
["Minimum isolates", "Include only first isolate per patient per species per year (M39 guideline). Exclude duplicates."],
["Minimum threshold", "Report %S only if ≥ 30 isolates available for that species-drug combination"],
["Stratification", "Stratify by: inpatient vs outpatient, ICU vs ward, specimen type (blood vs urine), pediatric vs adult"],
["Cascade reporting", "Report 1st-line (narrow-spectrum) drugs first; suppress broader agents if 1st-line is susceptible. E.g., report cefazolin before ceftriaxone for E. coli UTI."],
["ASP collaboration", "Antibiogram guides empirical therapy protocols and formulary decisions. Share with ID, pharmacy, infection control teams."],
["Online resource", "CLSI M39 – Analysis and Presentation of Cumulative Antimicrobial Susceptibility Test Data"],
]
t = Table(ab_rows, colWidths=[4*cm, 12.5*cm], repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1A5276")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#EBF5FB")]),
("GRID", (0,0), (-1,-1), 0.3, GREY_MID),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t)
story.append(Spacer(1,8))
# Key exam points
story.append(P("<b>Quick Exam Mnemonics & Key Facts:</b>", h2))
key_points = [
"<b>MIC vs Breakpoint:</b> MIC = lab measurement of inhibitory concentration; Breakpoint = clinical decision threshold set by CLSI",
"<b>CAMHB:</b> Cation-Adjusted Mueller-Hinton Broth is the standard medium for broth microdilution",
"<b>0.5 McFarland:</b> ~1-4 × 10⁸ CFU/mL for agar inoculation; diluted to ~5 × 10⁵ for broth",
"<b>Zone size inverse of MIC:</b> Larger zone → lower MIC → more susceptible",
"<b>Cefoxitin disk for MRSA:</b> ≤ 21 mm = MRSA (surrogate for mecA); more reliable than oxacillin disk",
"<b>Vancomycin – no disk for S. aureus:</b> Disk diffusion cannot detect VISA; always use MIC",
"<b>S. pneumoniae penicillin:</b> Two sets of breakpoints – meningitis (≤ 0.06 S) vs non-meningitis (≤ 2 S). Oxacillin disk screens (≥ 20 mm = S, no MIC needed)",
"<b>D-test indication:</b> Erythromycin-Resistant + Clindamycin-Susceptible phenotype in any Staphylococcus or Streptococcus → mandatory D-zone test",
"<b>ESBL reporting rule:</b> Even if cephalosporin tests susceptible in vitro, report as Resistant if ESBL confirmed (clinical failures documented)",
"<b>SDD (Susceptible-Dose Dependent):</b> New category added M100 2019; replaces old 'I' for some drug-bug combos; requires PK/PD optimized dosing",
"<b>mCIM + eCIM:</b> Modified Carbapenem Inactivation Method detects carbapenemase; eCIM (EDTA) distinguishes MBL from serine carbapenemases (KPC, OXA)",
"<b>QC failure action:</b> Do not report patient results; identify error; document; repeat testing with fresh QC before releasing results",
]
for kp in key_points:
story.append(Paragraph(f"★ {kp}", style("KPStar", fontSize=8.5, textColor=GREY_DARK,
fontName="Helvetica", spaceAfter=4, leading=13,
leftIndent=8)))
story.append(Spacer(1, 10))
# Footer / References
story.append(hr(TEAL, 1))
story.append(P("<b>Sources:</b> Henry's Clinical Diagnosis and Management by Laboratory Methods (CLSI sections); "
"Tietz Textbook of Laboratory Medicine 7e; Goldman-Cecil Medicine 2025; "
"Dermatology 2-Volume Set 5e; CLSI M100 (2020 edition).", small))
story.append(P("Compiled as a quick reference for MD Microbiology education. "
"For clinical use, always refer to the current CLSI M100 edition and local resistance patterns.", small))
# ══════════════════════════════════════════════════════════════════════════════
# PAGE NUMBERS via onFirstPage / onLaterPages
# ══════════════════════════════════════════════════════════════════════════════
def add_page_number(canvas, doc):
canvas.saveState()
canvas.setFont("Helvetica", 7)
canvas.setFillColor(GREY_MID)
page_num = canvas.getPageNumber()
canvas.drawCentredString(A4[0]/2, 1.2*cm, f"CLSI Standards & Breakpoints – Quick Reference | Page {page_num}")
canvas.restoreState()
doc.build(story, onFirstPage=add_page_number, onLaterPages=add_page_number)
print("PDF generated successfully:", doc_path)
cd /home/daytona/workspace/clsi-reference && python generate_clsi_pdf.py 2>&1
ls -lh /home/daytona/workspace/clsi-reference/CLSI_Standards_Quick_Reference.pdf
CLSI Standards Quick Reference
PDF Document · PDF
| Section | Content |
|---|---|
| 1. CLSI Overview | All key documents (M02, M07, M11, M100, M27, M38, M44, M45) with update cycles |
| 2. Key Definitions | MIC, MBC, Breakpoint, ECOFF, PK/PD breakpoints - clearly defined |
| 3. Methods of AST | Disk diffusion, broth microdilution, agar dilution, E-test, automated systems, anaerobic AST - with standardized conditions |
| 4. Breakpoint Categories | S, SDD, I, NS, R - definitions + CLSI vs EUCAST comparison table |
| 5. Important Breakpoints | MIC tables for S. aureus, Enterobacterales, Pseudomonas, S. pneumoniae |
| 6. QC Standards | All ATCC reference strains, QC rules, frequency requirements |
| 7. Special Organisms | MRSA, ESBL, CRE, S. pneumoniae, H. influenzae, Enterococcus HLAR, GBS - organism-specific rules |
| 8. Resistance Phenotypes | Detection of MRSA, ESBL, KPC, MBL, D-test, VISA, VRSA, VRE, HLAR, BLNAR |
| 9. Antibiogram & Stewardship | Cumulative antibiogram rules, cascade reporting, exam mnemonics |
Is this a free or paid app
Plz generate PPT on bacterial virulence factors from ananthnarayan book
mkdir -p /home/daytona/workspace/virulence-ppt && ls /home/daytona/workspace/vir…
~/virulence-ppt/generate_ppt.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
pres.title = "Bacterial Virulence Factors";
pres.author = "MD Microbiology";
pres.subject = "Bacteriology – Ananthnarayan";
// ── Color Palette ────────────────────────────────────────────────────────────
const C = {
navy: "0D1F3C",
teal: "0A7A80",
teal_light: "D6F0F2",
gold: "D4A017",
gold_light: "FDF5DC",
red: "C0392B",
red_light: "FDEDEC",
green: "1A7A4A",
green_light: "E9F7EF",
purple: "6C3483",
purple_light:"F4ECF7",
orange: "D35400",
orange_light:"FEF0E7",
blue: "1A5276",
blue_light: "EBF5FB",
white: "FFFFFF",
offwhite: "F8F9FA",
grey_dark: "2C3E50",
grey_mid: "7F8C8D",
grey_light: "ECF0F1",
};
// ── Helpers ──────────────────────────────────────────────────────────────────
function addSlideTitle(slide, title, subtitle, bgColor, accentColor) {
bgColor = bgColor || C.navy;
accentColor = accentColor || C.gold;
// Full dark background
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:13.3, h:7.5, fill:{color: bgColor}, line:{color: bgColor} });
// Gold accent bar top
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:13.3, h:0.08, fill:{color: accentColor}, line:{color: accentColor} });
// Gold accent bar bottom
slide.addShape(pres.ShapeType.rect, { x:0, y:7.42, w:13.3, h:0.08, fill:{color: accentColor}, line:{color: accentColor} });
slide.addText(title, {
x:0.8, y:2.2, w:11.7, h:1.6,
fontSize:44, fontFace:"Calibri", bold:true,
color: C.white, align:"center", valign:"middle"
});
if (subtitle) {
slide.addText(subtitle, {
x:1.2, y:3.9, w:10.9, h:0.7,
fontSize:18, fontFace:"Calibri",
color: accentColor, align:"center"
});
}
// Bottom tag
slide.addText("Bacteriology | MD Microbiology | Ananthnarayan Reference", {
x:0, y:7.2, w:13.3, h:0.28,
fontSize:9, fontFace:"Calibri", color: C.grey_mid, align:"center"
});
}
function sectionHeader(slide, sectionNum, title, subtitle, bgColor, textColor) {
bgColor = bgColor || C.teal;
textColor = textColor || C.white;
slide.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color: bgColor}, line:{color: bgColor}});
slide.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:0.06, fill:{color: C.gold}, line:{color: C.gold}});
slide.addShape(pres.ShapeType.rect, {x:0,y:7.44,w:13.3,h:0.06, fill:{color: C.gold}, line:{color: C.gold}});
slide.addText(`Section ${sectionNum}`, {
x:0.8,y:2.2,w:11.7,h:0.7, fontSize:20, fontFace:"Calibri",
color: C.gold, align:"center", bold:true, charSpacing:4
});
slide.addText(title, {
x:0.8,y:2.95,w:11.7,h:1.3, fontSize:38, fontFace:"Calibri",
bold:true, color: textColor, align:"center"
});
if (subtitle) {
slide.addText(subtitle, {
x:1.5,y:4.3,w:10.3,h:0.6, fontSize:16, fontFace:"Calibri",
color: C.teal_light, align:"center"
});
}
}
function contentHeader(slide, title, bg, accent) {
bg = bg || C.navy;
accent = accent || C.gold;
slide.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:1.05, fill:{color: bg}, line:{color: bg}});
slide.addShape(pres.ShapeType.rect, {x:0,y:1.05,w:13.3,h:0.06, fill:{color: accent}, line:{color: accent}});
slide.addText(title, {
x:0.4,y:0.08,w:12.5,h:0.9,
fontSize:26, fontFace:"Calibri", bold:true,
color: C.white, valign:"middle"
});
// Page gradient strip
slide.addShape(pres.ShapeType.rect, {x:0,y:7.3,w:13.3,h:0.2, fill:{color: C.grey_light}, line:{color: C.grey_light}});
slide.addText("Bacterial Virulence Factors | MD Microbiology", {
x:0,y:7.3,w:13.3,h:0.2, fontSize:7.5, fontFace:"Calibri", color: C.grey_mid, align:"center"
});
}
function bullet(text, level, bold, color) {
return {
text: text,
options: {
bullet: { indent: 15 + (level||0)*15 },
fontSize: level ? 14 : 15.5,
fontFace: "Calibri",
color: color || C.grey_dark,
bold: bold || false,
paraSpaceAfter: 3,
indentLevel: level || 0,
breakLine: true
}
};
}
function addColorCard(slide, x, y, w, h, headerText, headerBg, bodyLines, bodyBg) {
bodyBg = bodyBg || C.offwhite;
// Header
slide.addShape(pres.ShapeType.roundRect, {x, y, w, h:0.42, fill:{color: headerBg}, line:{color: headerBg}, rectRadius:0.06});
slide.addText(headerText, {x: x+0.1, y: y+0.03, w: w-0.2, h:0.36, fontSize:13, fontFace:"Calibri", bold:true, color:C.white, valign:"middle"});
// Body
slide.addShape(pres.ShapeType.roundRect, {x, y:y+0.41, w, h:h-0.42, fill:{color: bodyBg}, line:{color: C.grey_light, pt:0.5}, rectRadius:0.06});
const items = bodyLines.map((l,i) => ({
text: l,
options: { fontSize:12.5, fontFace:"Calibri", color:C.grey_dark, breakLine: i<bodyLines.length-1, paraSpaceAfter:2, bullet: {indent:10} }
}));
slide.addText(items, {x: x+0.15, y: y+0.48, w: w-0.3, h: h-0.58, valign:"top"});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 1 – TITLE
// ════════════════════════════════════════════════════════════════════════════
let s = pres.addSlide();
addSlideTitle(s,
"Bacterial Virulence Factors",
"Mechanisms of Pathogenicity | Ananthnarayan & Paniker's Textbook of Microbiology",
C.navy, C.gold
);
// Decorative hexagon shapes
s.addShape(pres.ShapeType.hexagon, {x:0.1,y:0.8,w:0.9,h:1.0, fill:{color:"0A3050",transparency:30}, line:{color:"0A3050"}});
s.addShape(pres.ShapeType.hexagon, {x:11.9,y:5.5,w:1.2,h:1.3, fill:{color:"0A3050",transparency:30}, line:{color:"0A3050"}});
s.addShape(pres.ShapeType.hexagon, {x:12.2,y:0.5,w:0.7,h:0.8, fill:{color:"0A3050",transparency:50}, line:{color:"0A3050"}});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 2 – OVERVIEW
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color: C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "Overview: What are Virulence Factors?", C.navy, C.gold);
// Definition box
s.addShape(pres.ShapeType.roundRect, {x:0.4,y:1.25,w:12.5,h:1.0, fill:{color:C.gold_light}, line:{color:C.gold, pt:1.2}, rectRadius:0.1});
s.addText([
{text:"Definition: ", options:{bold:true, fontSize:14, color:C.navy}},
{text:"Virulence factors are structural, biochemical, or regulatory molecules produced by a pathogen that enable it to ", options:{fontSize:14, color:C.grey_dark}},
{text:"colonize, evade host defenses, and cause disease.", options:{bold:true, fontSize:14, color:C.red}}
], {x:0.6,y:1.3,w:12.1,h:0.88, valign:"middle"});
// 3-column classification
const overviewCols = [
{ x:0.35, color:C.teal, hdr:"Pathogenicity", items:["Ability of an organism to cause disease","Depends on: dose, route, host immunity","Opportunistic vs Primary pathogens"] },
{ x:4.65, color:C.purple, hdr:"Virulence", items:["Degree / severity of disease caused","Measured by LD50 (lethal dose 50%)","Quantitative expression of pathogenicity"] },
{ x:8.95, color:C.orange, hdr:"Pathogenicity Islands", items:["Gene clusters on mobile elements","Encode multiple virulence factors","Can be horizontally transferred between bacteria"] },
];
overviewCols.forEach(col => {
addColorCard(s, col.x, 2.4, 4.1, 2.8, col.hdr, col.color, col.items, C.white);
});
// Key formula
s.addShape(pres.ShapeType.roundRect, {x:0.4,y:5.4,w:12.5,h:1.65, fill:{color:C.teal_light}, line:{color:C.teal, pt:1}, rectRadius:0.1});
s.addText("Key Concept: Virulence = Infectivity + Invasiveness + Toxigenicity + Immune Evasion", {
x:0.6,y:5.5,w:12.1,h:0.55, fontSize:15, fontFace:"Calibri", bold:true, color:C.teal, align:"center"
});
s.addText([
bullet("Infectivity: ability to establish infection at body surface", 0),
bullet("Invasiveness: ability to spread in tissues", 0),
bullet("Toxigenicity: ability to produce toxins that damage host cells", 0),
], {x:0.8,y:6.05,w:12,h:0.9, valign:"top"});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 3 – SECTION: SURFACE STRUCTURES
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
sectionHeader(s, 1, "Surface Virulence Factors", "Capsule | Fimbriae | Pili | Cell Wall Components", C.teal, C.white);
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 4 – CAPSULE
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color: C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "1A. Capsule – The Antiphagocytic Shield", C.teal, C.gold);
// Left panel – properties
s.addShape(pres.ShapeType.roundRect, {x:0.3,y:1.25,w:6.1,h:5.8, fill:{color:C.white}, line:{color:C.teal, pt:1}, rectRadius:0.1});
s.addText("Capsule Properties", {x:0.4,y:1.3,w:5.9,h:0.5, fontSize:15, bold:true, color:C.teal, fontFace:"Calibri"});
s.addText([
bullet("Composition: Polysaccharide (most bacteria); Polypeptide (Bacillus anthracis – D-glutamic acid)", 0),
bullet("Exception: Poly-D-glutamic acid capsule of B. anthracis – non-antigenic", 1, false, C.red),
bullet("Location: Outermost layer of bacterial cell", 0),
bullet("Staining: India ink / Quellung (capsule swelling) reaction", 0),
bullet("Quellung reaction: Antibody + capsule → capsule appears swollen under microscope", 1),
], {x:0.4,y:1.85,w:5.8,h:2.9, valign:"top"});
s.addText("Functions of Capsule:", {x:0.4,y:4.8,w:5.8,h:0.4, fontSize:14, bold:true, color:C.navy, fontFace:"Calibri"});
s.addText([
bullet("Anti-phagocytic – prevents opsonization", 0, true, C.red),
bullet("Protects from complement activation", 0),
bullet("Promotes adherence to surfaces", 0),
bullet("Protection from desiccation and toxic substances", 0),
], {x:0.4,y:5.2,w:5.8,h:1.7, valign:"top"});
// Right panel – examples
s.addShape(pres.ShapeType.roundRect, {x:6.8,y:1.25,w:6.2,h:5.8, fill:{color:C.teal_light}, line:{color:C.teal, pt:1}, rectRadius:0.1});
s.addText("Clinically Important Examples", {x:6.9,y:1.3,w:6.0,h:0.5, fontSize:15, bold:true, color:C.teal, fontFace:"Calibri"});
const capsuleExamples = [
["Streptococcus pneumoniae", "Polysaccharide capsule → pneumonia, meningitis\nQuellung reaction for typing (83+ serotypes)\nEncapsulated = virulent; unencapsulated = avirulent (Griffith's experiment)"],
["Klebsiella pneumoniae", "Large mucoid capsule → 'mucoid' colonies\nCauses lobar pneumonia, UTI\nCurrant-jelly sputum"],
["Haemophilus influenzae", "Type b (Hib) = polyribitol phosphate capsule\nAnti-phagocytic; causes meningitis\nHib vaccine = conjugate capsular polysaccharide"],
["Neisseria meningitidis", "Polysaccharide capsule (groups A,B,C,Y,W135)\nAnti-phagocytic; major virulence factor\nVaccine targets capsular polysaccharide"],
["Bacillus anthracis", "Poly-D-glutamic acid capsule\nNON-antigenic → evades immune response\nAntiphagocytic; encodes on pX01/pX02 plasmids"],
["Cryptococcus neoformans", "Polysaccharide capsule (fungus, not bacteria)\nIndia ink: clear halo around yeast cell"],
];
capsuleExamples.forEach((ex, i) => {
const yPos = 1.85 + i * 0.86;
s.addShape(pres.ShapeType.roundRect, {x:6.9, y:yPos, w:5.9, h:0.8, fill:{color:C.white}, line:{color:C.teal, pt:0.5}, rectRadius:0.06});
s.addText([
{text: ex[0] + "\n", options:{bold:true, fontSize:11.5, color:C.navy, breakLine:true}},
{text: ex[1], options:{fontSize:10.5, color:C.grey_dark}}
], {x:7.0, y:yPos+0.04, w:5.7, h:0.74, valign:"top"});
});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 5 – FIMBRIAE & PILI
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color: C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "1B. Fimbriae & Pili – Adhesion & Colonization", C.teal, C.gold);
// Left - Fimbriae
addColorCard(s, 0.3, 1.25, 6.1, 5.8, "Fimbriae (Common Pili)", C.teal, [
"Short, hair-like protein projections",
"Composition: pilin protein subunits",
"Function: Attachment to mucosal surfaces – key first step of infection",
"Anti-phagocytic: some fimbriae resist phagocytosis",
"Found in: E. coli, N. gonorrhoeae, N. meningitidis, Salmonella, Shigella",
"Type 1 (mannose-sensitive): attach to mannose on uroepithelium",
"P fimbriae (E. coli): attach to P blood group antigen on uroepithelium → pyelonephritis",
"Phase variation: bacteria can switch fimbriae ON/OFF to evade immunity",
], C.teal_light);
// Right - Sex Pili
addColorCard(s, 6.85, 1.25, 6.15, 2.8, "Sex Pili (F Pilus / Conjugation Pilus)", C.purple, [
"Longer than fimbriae; tubular structure",
"Encoded by F (fertility) plasmid",
"Function: Connect donor (F+) to recipient (F−) cell during conjugation",
"Allow transfer of plasmid DNA (resistance genes, virulence genes)",
"One or a few per cell (vs many fimbriae)",
"Also serve as receptor for some bacteriophages (filamentous phages)",
], C.purple_light);
addColorCard(s, 6.85, 4.15, 6.15, 2.88, "Type IV Pili – Special Category", C.blue, [
"Found in: N. gonorrhoeae, Pseudomonas aeruginosa, V. cholerae, EPEC",
"Functions: attachment, motility (twitching), colonization",
"N. gonorrhoeae: phase & antigenic variation of pilin → evades antibody",
"Can retract → pull bacteria toward host cell (key for invasion)",
"V. cholerae TCP pilus: toxin-co-regulated pilus; essential for colonization of intestine",
], C.blue_light);
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 6 – CELL WALL COMPONENTS
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "1C. Cell Wall Components as Virulence Factors", C.blue, C.gold);
const cwCols = [
{x:0.3, color:C.navy, hdr:"Lipopolysaccharide (LPS / Endotoxin)", items:[
"Gram-negative outer membrane component",
"Structure: Lipid A + Core polysaccharide + O antigen",
"Lipid A: toxic portion → fever, hypotension, DIC, septic shock",
"Triggers TLR-4 → NFκB → IL-1, IL-6, TNF-α, IL-8",
"Pyrogenic, activates complement (alternative pathway)",
"O antigen: used for serotyping (e.g., E. coli O157:H7)",
"Resists serum killing; antiphagocytic"
]},
{x:4.55, color:C.teal, hdr:"Peptidoglycan & Teichoic Acids", items:[
"Peptidoglycan (gram-positive): thick layer, activates complement",
"Fragments: stimulate cytokine release (IL-1, TNF)",
"Lipoteichoic acid (LTA): gram-positive equivalent of endotoxin",
"LTA + wall teichoic acid → adhesion to host cells",
"S. aureus LTA: mediates binding to fibronectin on host cells",
"Activates TLR-2 → inflammatory response"
]},
{x:8.8, color:C.purple, hdr:"Surface Proteins & Other Structures", items:[
"Protein A (S. aureus): binds Fc region of IgG → blocks opsonization",
"M protein (S. pyogenes): antiphagocytic; main virulence factor",
"Outer membrane proteins (Porins): regulate permeability, antigenic",
"IgA protease (H. influenzae, N. gonorrhoeae, S. pneumoniae):",
" – Cleaves secretory IgA → impairs mucosal defense",
"SpA, SpM: surface proteins aiding immune evasion"
]},
];
cwCols.forEach(col => {
addColorCard(s, col.x, 1.25, 4.15, 5.8, col.hdr, col.color, col.items, C.white);
});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 7 – SECTION: TOXINS
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
sectionHeader(s, 2, "Bacterial Toxins", "Exotoxins vs Endotoxin | Mechanisms & Clinical Relevance", C.red, C.white);
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 8 – EXOTOXIN vs ENDOTOXIN COMPARISON
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "2A. Exotoxin vs Endotoxin – Comparison Table", C.red, C.gold);
const tblData = [
[{text:"Feature", options:{bold:true}}, {text:"Exotoxin", options:{bold:true}}, {text:"Endotoxin", options:{bold:true}}],
[{text:"Source"}, {text:"Gram +ve and Gram –ve bacteria"}, {text:"Gram –ve bacteria only"}],
[{text:"Nature"}, {text:"Protein (polypeptide)"}, {text:"Lipopolysaccharide (LPS) – Lipid A"}],
[{text:"Secretion"}, {text:"Actively secreted (excreted)"}, {text:"Released on cell death / lysis"}],
[{text:"Heat stability"},{text:"Heat labile (destroyed at 60–80°C)"}, {text:"Heat stable (withstands 250°C)"}],
[{text:"Toxicity"}, {text:"Highly toxic (microgram quantities lethal)"},{text:"Weakly toxic (large amounts needed)"}],
[{text:"Antigenicity"}, {text:"Strongly antigenic → toxoid formed"}, {text:"Weakly antigenic; no toxoid"}],
[{text:"Toxoid"}, {text:"Yes – formaldehyde converts to toxoid (DPT)"}, {text:"No toxoid possible"}],
[{text:"Pyrogenicity"}, {text:"Variable (some are pyrogenic)"}, {text:"Always pyrogenic"}],
[{text:"Specificity"}, {text:"Highly specific (targets specific cells/receptors)"},{text:"Non-specific; generalized effects"}],
[{text:"Neutralization"},{text:"Neutralized by antitoxin antibodies"}, {text:"Not neutralized by antibodies"}],
[{text:"Examples"}, {text:"Cholera toxin, Tetanus toxin, Diphtheria toxin"},{text:"Salmonella, E. coli, N. meningitidis LPS"}],
];
const tblCols = [3.0, 5.0, 5.0];
s.addTable(tblData, {
x:0.3, y:1.22, w:12.7, colW: tblCols,
color: C.grey_dark, fontFace:"Calibri", fontSize:11,
rowH: 0.43,
fill: {color: C.white},
border: {type:"solid", pt:0.5, color: C.grey_light},
align:"left", valign:"middle",
});
// Manually shade header row would need shape overlay – add color header row manually
s.addShape(pres.ShapeType.rect, {x:0.3,y:1.22,w:12.7,h:0.43, fill:{color:C.red}, line:{color:C.red}});
s.addText([
{text:"Feature", options:{bold:true, fontSize:12, color:C.white, fontFace:"Calibri"}},
], {x:0.35, y:1.26, w:2.9, h:0.35, valign:"middle"});
s.addText([
{text:"Exotoxin", options:{bold:true, fontSize:12, color:C.white, fontFace:"Calibri"}},
], {x:3.35, y:1.26, w:4.9, h:0.35, valign:"middle"});
s.addText([
{text:"Endotoxin (LPS)", options:{bold:true, fontSize:12, color:C.white, fontFace:"Calibri"}},
], {x:8.35, y:1.26, w:4.9, h:0.35, valign:"middle"});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 9 – EXOTOXIN TYPES
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "2B. Classification of Exotoxins", C.red, C.gold);
const toxCols = [
{x:0.3, color:C.red, hdr:"A-B Toxins (Binary Toxins)", items:[
"Structure: A subunit (active/toxic) + B subunit (binding)",
"B binds receptor on host cell → A is internalized → causes damage",
"Cholera toxin: B binds GM1 ganglioside → A activates adenylate cyclase → ↑cAMP → rice-water diarrhea",
"Diphtheria toxin: B binds; A = ADP-ribosylates EF-2 → halts protein synthesis",
"Anthrax toxin: PA (B) + LF or EF (A) → cell death / edema",
"Pertussis toxin: ADP-ribosylates Gi → ↑cAMP",
"Shiga toxin (STEC): B binds Gb3 → A cleaves 28S rRNA → stops protein synthesis → HUS",
]},
{x:4.65, color:C.purple, hdr:"Membrane-Damaging Toxins", items:[
"Pore-forming toxins: insert into lipid bilayer → pore → cell lysis",
"α-toxin (S. aureus): heptameric pore; lyses RBCs, WBCs, platelets",
"Streptolysin O (S. pyogenes): oxygen-labile; anti-SLO antibodies diagnostic",
"Streptolysin S: oxygen-stable; causes β-hemolysis on blood agar",
"Listeriolysin O (Listeria): pore allows escape from phagosome",
"Lecithinase (C. perfringens α-toxin): phospholipase C; cleaves lecithin in cell membranes",
"Nagler reaction: C. perfringens α-toxin identified on egg yolk agar",
]},
{x:9.0, color:C.orange, hdr:"Superantigens (SAgs)", items:[
"Cross-link MHC II (APC) with TCR Vβ chain non-specifically",
"Activate up to 20% of all T cells (vs 0.01% for normal antigens)",
"Massive cytokine storm → TSS, multiorgan failure",
"TSST-1 (S. aureus): Toxic Shock Syndrome",
"SPE A,B,C (S. pyogenes): Scarlet fever / streptococcal TSS",
"Staphylococcal enterotoxins (A-E): food poisoning (preformed toxin)",
"Do NOT induce protective immunity → no memory against SAgs",
]},
];
toxCols.forEach(col => {
addColorCard(s, col.x, 1.25, 4.1, 5.8, col.hdr, col.color, col.items, C.white);
});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 10 – IMPORTANT TOXINS TABLE
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "2C. Must-Know Toxins at a Glance", C.red, C.gold);
const toxins = [
["Organism", "Toxin", "Mechanism", "Disease / Effect"],
["V. cholerae", "Cholera toxin (CT)", "↑cAMP via Gs activation", "Profuse rice-water diarrhea"],
["C. diphtheriae", "Diphtheria toxin", "ADP-ribosylates EF-2 → blocks protein synthesis", "Pseudomembrane, myocarditis, neuropathy"],
["C. tetani", "Tetanospasmin", "Blocks GABA/glycine (inhibitory) at spinal cord → spastic paralysis", "Tetanus – risus sardonicus, opisthotonos"],
["C. botulinum", "Botulinum toxin (A,B,E,F)", "Blocks ACh release at NMJ → flaccid paralysis", "Botulism – descending flaccid paralysis"],
["C. perfringens", "α-toxin (lecithinase)", "Phospholipase C → cell membrane lysis", "Gas gangrene, food poisoning"],
["S. aureus", "TSST-1", "Superantigen → cytokine storm", "Toxic Shock Syndrome"],
["S. aureus", "Exfoliatin A & B", "Serine protease → cleaves desmoglein 1 in skin", "Scalded Skin Syndrome (SSSS)"],
["S. pyogenes", "Streptolysin O (SLO)", "Pore-forming; O2-labile", "Cell lysis; anti-SLO = diagnostic"],
["E. coli (ETEC)", "Heat-labile toxin (LT)", "Similar to cholera toxin; ↑cAMP", "Traveler's diarrhea (watery)"],
["E. coli (ETEC)", "Heat-stable toxin (ST)", "Activates guanylate cyclase → ↑cGMP", "Watery diarrhea; ST resistant to boiling"],
["E. coli (STEC)", "Shiga-like toxin (Verotoxin)", "Cleaves 28S rRNA; stops protein synthesis", "Hemorrhagic colitis, HUS (O157:H7)"],
["B. anthracis", "Lethal factor (LF)", "Metalloprotease → cleaves MAPKK → cell death", "Anthrax – shock, death"],
];
const toxW = [2.5, 2.7, 4.5, 3.3];
s.addTable(toxins, {
x:0.2, y:1.22, w:12.9, colW: toxW,
fontFace:"Calibri", fontSize:10,
rowH: 0.44,
fill:{color:C.white},
border:{type:"solid", pt:0.5, color:C.grey_light},
valign:"middle", align:"left", color:C.grey_dark
});
s.addShape(pres.ShapeType.rect, {x:0.2,y:1.22,w:12.9,h:0.44, fill:{color:C.red}, line:{color:C.red}});
["Organism","Toxin","Mechanism","Disease / Effect"].forEach((h,i) => {
const xOff = [0.25, 2.75, 5.45, 9.95];
s.addText(h, {x:xOff[i], y:1.26, w:toxW[i]-0.1, h:0.36, fontSize:11.5, bold:true, color:C.white, fontFace:"Calibri", valign:"middle"});
});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 11 – SECTION: INVASION & IMMUNE EVASION
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
sectionHeader(s, 3, "Invasion & Immune Evasion", "Enzymes | Intracellular Survival | Biofilm | Antigenic Variation", C.green, C.white);
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 12 – SPREADING ENZYMES
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "3A. Spreading Enzymes (Aggressins)", C.green, C.gold);
const enzymes = [
{name:"Hyaluronidase", desc:"Breaks down hyaluronic acid in connective tissue\n→ 'spreading factor' → facilitates spread of bacteria\nProduced by: S. pyogenes, S. aureus, Clostridia, H. influenzae"},
{name:"Collagenase", desc:"Degrades collagen → destroys connective tissue framework\nProduced by: C. perfringens (also called κ-toxin)\n→ spreads in muscle (gas gangrene)"},
{name:"Streptokinase\n(Fibrinolysin)", desc:"Activates plasminogen → plasmin → dissolves fibrin clots\nPrevents walling-off of infection\nProduced by: S. pyogenes (also used therapeutically)"},
{name:"Coagulase", desc:"Converts fibrinogen → fibrin clot around bacteria\nProtects S. aureus from phagocytosis\nFree coagulase + Bound coagulase (clumping factor)\nCoagulase test: key to identify S. aureus"},
{name:"DNase\n(Deoxyribonuclease)", desc:"Hydrolyzes DNA released by lysed cells\nReduces viscosity of pus → facilitates spread\nProduced by: S. aureus, S. pyogenes\nAnti-DNase B antibody: evidence of streptococcal infection"},
{name:"IgA Protease", desc:"Cleaves secretory IgA at hinge region\nEscapes mucosal immune defense\nProduced by: N. gonorrhoeae, N. meningitidis, H. influenzae, S. pneumoniae"},
];
const enzCols = [0.3, 4.55, 8.8];
const enzRows = [[0,1,2],[3,4,5]];
enzRows.forEach((rowIdxs, rowI) => {
rowIdxs.forEach((idx, colI) => {
const e = enzymes[idx];
const x = enzCols[colI];
const y = 1.25 + rowI * 2.95;
s.addShape(pres.ShapeType.roundRect, {x,y,w:4.05,h:2.75, fill:{color:C.white}, line:{color:C.green, pt:1}, rectRadius:0.1});
s.addShape(pres.ShapeType.roundRect, {x,y,w:4.05,h:0.45, fill:{color:C.green}, line:{color:C.green}, rectRadius:0.08});
s.addText(e.name, {x:x+0.1,y:y+0.05,w:3.85,h:0.38, fontSize:12.5, bold:true, color:C.white, fontFace:"Calibri", valign:"middle"});
s.addText(e.desc, {x:x+0.12,y:y+0.52,w:3.81,h:2.14, fontSize:11, color:C.grey_dark, fontFace:"Calibri", valign:"top"});
});
});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 13 – IMMUNE EVASION & INTRACELLULAR SURVIVAL
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "3B. Immune Evasion Strategies", C.green, C.gold);
// Column 1 – Antigenic variation
addColorCard(s, 0.3, 1.25, 4.05, 5.8, "Antigenic Variation", C.blue, [
"Bacteria change surface antigens to escape antibody recognition",
"N. gonorrhoeae: pilus & Opa protein phase/antigenic variation",
"Borrelia recurrentis: relapsing fever – VMP gene switches",
"H. pylori: outer membrane protein variation",
"Mycoplasma: variable surface lipoproteins",
"Result: memory antibodies ineffective → repeated infections",
], C.blue_light);
// Column 2 – Intracellular survival
addColorCard(s, 4.65, 1.25, 4.05, 5.8, "Intracellular Survival", C.purple, [
"Obligate intracellular: Rickettsia, Chlamydia, Coxiella",
"Facultative intracellular: Salmonella, Listeria, Mycobacterium, Brucella, Legionella",
"Mechanisms:",
" – Inhibit phagosome-lysosome fusion (M. tuberculosis, Legionella)",
" – Escape from phagosome into cytoplasm (Listeria – listeriolysin O)",
" – Resist oxidative killing: catalase, superoxide dismutase (S. aureus)",
" – Survive in acidic phagolysosome (Coxiella, Leishmania)",
"Protected from antibodies and many antibiotics",
], C.purple_light);
// Column 3 – Other strategies
addColorCard(s, 9.0, 1.25, 4.05, 5.8, "Other Evasion Mechanisms", C.orange, [
"Biofilm formation: polysaccharide matrix protects bacteria from antibiotics & phagocytosis (S. epidermidis, P. aeruginosa)",
"Complement evasion: LPS O-antigen prevents MAC formation; capsule blocks C3b deposition",
"Molecular mimicry: surface antigens resemble host antigens (S. pyogenes M protein ~ cardiac myosin → rheumatic fever)",
"Protein A (S. aureus): binds Fc IgG → prevents opsonization",
"Serum resistance: Yersinia, Salmonella – LPS modifications block lysis",
"Catalase (S. aureus): destroys H₂O₂ produced by neutrophils",
], C.orange_light);
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 14 – SECTION: SECRETION SYSTEMS & PATHOGENICITY ISLANDS
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
sectionHeader(s, 4, "Secretion Systems & Pathogenicity Islands", "Type III, IV, VI Secretion | PAIs | Biofilm", C.navy, C.white);
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 15 – SECRETION SYSTEMS
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "4A. Bacterial Secretion Systems", C.navy, C.gold);
const secSystems = [
{type:"Type II (T2SS)", nickname:"General Secretion Pathway", details:"Secretes folded proteins across outer membrane\nExamples: cholera toxin, elastase (Pseudomonas)\nGram-negative only", color:C.teal},
{type:"Type III (T3SS)", nickname:'"Molecular Syringe"', details:"Needle-like structure injects effector proteins DIRECTLY into host cytoplasm\nExamples: Salmonella SPI-1/SPI-2, Shigella, EPEC (LEE island), Yersinia Yops\nKey virulence system for enteric & invasive pathogens", color:C.red},
{type:"Type IV (T4SS)", nickname:"Conjugation / Effector Transport", details:"Transfers DNA or proteins into host cells or other bacteria\nH. pylori: CagA protein injection via T4SS → gastric cancer risk\nAlso used for plasmid transfer (conjugation)\nLegionella: T4SS injects effectors to remodel vacuole", color:C.purple},
{type:"Type VI (T6SS)", nickname:'"Bacterial Spear Gun"', details:"Punctures adjacent bacterial/eukaryotic cells\nCompetition between bacteria (kills rivals)\nP. aeruginosa, V. cholerae, Burkholderia\nInjects toxic effectors; tail spike contracts like a spring", color:C.orange},
{type:"Type I (T1SS)", nickname:"ABC Transporter System", details:"One-step secretion across both membranes\nE. coli hemolysin (HlyA) – pore-forming toxin\nCa2+-dependent activation", color:C.blue},
{type:"Type V (T5SS)", nickname:"Autotransporter System", details:"Protein transports itself across outer membrane\nAdhesins (AIDA-I in E. coli) and IgA protease\nSimplest secretion system in gram-negative bacteria", color:C.green},
];
const ssPerRow = 3;
secSystems.forEach((ss, i) => {
const col = i % ssPerRow;
const row = Math.floor(i / ssPerRow);
const x = 0.3 + col * 4.35;
const y = 1.25 + row * 2.95;
s.addShape(pres.ShapeType.roundRect, {x, y, w:4.15, h:2.75, fill:{color:C.white}, line:{color:ss.color, pt:1.2}, rectRadius:0.1});
s.addShape(pres.ShapeType.roundRect, {x, y, w:4.15, h:0.55, fill:{color:ss.color}, line:{color:ss.color}, rectRadius:0.08});
s.addText(`${ss.type} – ${ss.nickname}`, {x:x+0.1,y:y+0.06,w:3.95,h:0.44, fontSize:11.5, bold:true, color:C.white, fontFace:"Calibri", valign:"middle"});
s.addText(ss.details, {x:x+0.12,y:y+0.62,w:3.91,h:2.02, fontSize:11, color:C.grey_dark, fontFace:"Calibri", valign:"top"});
});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 16 – PATHOGENICITY ISLANDS & BIOFILM
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "4B. Pathogenicity Islands & Biofilm", C.navy, C.gold);
// Left – PAI
addColorCard(s, 0.3, 1.25, 6.0, 5.8, "Pathogenicity Islands (PAIs)", C.navy, [
"Large genomic segments (10–200 kb) acquired by horizontal gene transfer",
"Encode clusters of virulence genes (adhesins, toxins, secretion systems, iron uptake)",
"Features: flanked by direct repeats; often near tRNA genes; associated with IS elements",
"Higher G+C content than host genome (evidence of foreign origin)",
"Can be lost → avirulent variants",
"Examples:",
" Salmonella: SPI-1 (invasion), SPI-2 (intracellular survival)",
" UPEC: PAI-I & PAI-II → hemolysin, P fimbriae",
" EPEC: LEE island → Type III secretion, intimin, Tir",
" H. pylori: cag-PAI → CagA protein delivery (T4SS)",
" V. cholerae: VPI (Vibrio Pathogenicity Island) → TCP pilus",
], C.blue_light);
// Right – Biofilm
addColorCard(s, 6.6, 1.25, 6.4, 5.8, "Biofilm – The Protected Community", C.teal, [
"Structured community of bacteria embedded in self-produced extracellular polymeric substance (EPS/glycocalyx)",
"Stages: attachment → microcolony → maturation → dispersal",
"Quorum sensing (QS): bacteria sense population density via autoinducers → regulate biofilm genes",
"Clinically significant biofilm producers:",
" S. epidermidis: prosthetic valves, catheters, implants",
" P. aeruginosa: cystic fibrosis lungs, burn wounds",
" S. aureus: MRSA biofilms on devices",
" E. coli, Klebsiella: catheter-associated UTI",
"Biofilm resistance mechanisms:",
" – Diffusion barrier: EPS limits antibiotic penetration",
" – Altered metabolism: slow-growing 'persister' cells",
" – Upregulation of efflux pumps",
"Clinical impact: 10–1000× more resistant to antibiotics than planktonic cells",
], C.teal_light);
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 17 – IRON ACQUISITION
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "5. Iron Acquisition – Hidden Virulence Factor", C.gold, C.navy);
// Iron importance box
s.addShape(pres.ShapeType.roundRect, {x:0.3,y:1.25,w:12.7,h:0.88, fill:{color:C.gold_light}, line:{color:C.gold, pt:1.2}, rectRadius:0.1});
s.addText([
{text:"Why iron? ", options:{bold:true, fontSize:13.5, color:C.navy}},
{text:"Iron is essential for bacterial metabolism. In the host, free iron is sequestered by transferrin, lactoferrin, and ferritin – making iron acquisition a key virulence challenge for pathogens.", options:{fontSize:13.5, color:C.grey_dark}}
], {x:0.5,y:1.3,w:12.3,h:0.78, valign:"middle"});
addColorCard(s, 0.3, 2.28, 3.95, 4.6, "Siderophores", C.orange, [
"Low-molecular-weight iron-chelating molecules",
"Secreted by bacteria to scavenge iron from environment",
"Bind Fe³⁺ with extremely high affinity (> transferrin)",
"Siderophore-iron complex taken back up by receptor",
"Enterobactin: E. coli, Salmonella",
"Aerobactin: E. coli (virulent strains)",
"Pyochelin & pyoverdine: Pseudomonas aeruginosa",
"Staphyloferrin: S. aureus",
], C.orange_light);
addColorCard(s, 4.5, 2.28, 3.95, 4.6, "Hemolysins & Iron Capture", C.red, [
"Hemolysins lyse RBCs → release hemoglobin",
"Bacteria capture heme/hemoglobin via NEAT domain proteins",
"S. aureus: IsdA/B/H receptors capture hemoglobin",
"N. meningitidis: hemoglobin receptor (HpuAB) system",
"Transferrin-binding proteins (Tbp1/Tbp2): N. gonorrhoeae, N. meningitidis, H. influenzae",
"Lactoferrin-binding: N. gonorrhoeae",
"Iron-regulated genes: virulence genes often upregulated when iron is low (signal for host environment)",
], C.red_light);
addColorCard(s, 8.7, 2.28, 4.3, 4.6, "Regulation by Iron", C.navy, [
"Fur protein (Ferric Uptake Regulator): master iron regulator",
"Fe²⁺ + Fur → binds operator → represses siderophore genes",
"Low iron in host → Fur inactivated → virulence genes expressed",
"Diphtheria toxin: regulated by Fur – expressed only in low-iron conditions (= host environment)",
"Shiga toxin (STEC): iron-regulated expression",
"Iron as a signal: bacteria sense low iron = 'I am inside a host' → switch on full virulence",
"Therapeutic target: iron chelation, targeting siderophore receptors",
], C.blue_light);
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 18 – SPECIFIC ORGANISM VIRULENCE SUMMARY
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "6. Virulence Factors – Organism Summary (Ananthnarayan)", C.purple, C.gold);
const orgSummary = [
["Organism", "Key Virulence Factors", "Disease"],
["S. aureus", "Capsule, Protein A, Coagulase, α/β/δ/γ toxins, TSST-1, Exfoliatin, IgA protease, Biofilm", "Boils, TSS, SSSS, Food poisoning, Endocarditis"],
["S. pyogenes", "M protein, Hyaluronidase, Streptolysin S/O, SPE (SAg), Streptokinase, DNase", "Pharyngitis, Rheumatic fever, Scarlet fever, NSTI"],
["S. pneumoniae", "Capsule (83 types), IgA protease, Pneumolysin, Neuraminidase", "Pneumonia, Meningitis, Otitis media"],
["E. coli", "Fimbriae (type 1, P pili), LT/ST toxins, Shiga-like toxin, T3SS (LEE), Hemolysin", "UTI, Traveler's diarrhea, HUS, Meningitis"],
["K. pneumoniae", "Large mucoid capsule, Siderophores (aerobactin), LPS", "Lobar pneumonia, UTI, Liver abscess"],
["Salmonella", "LPS, SPI-1 (T3SS/invasion), SPI-2 (intracellular), Vi antigen (typhi)", "Enteric fever, Gastroenteritis, Bacteremia"],
["Shigella", "T3SS (Mxi-Spa), Shiga toxin (S. dysenteriae), Ipa proteins, Actin motility", "Bacillary dysentery"],
["V. cholerae", "TCP pilus, Cholera toxin (↑cAMP), VPI-1/2, Neuraminidase", "Cholera – rice-water diarrhea"],
["M. tuberculosis", "Cord factor, Sulfatides, LAM (lipoarabinomannan), Inhibit phagosome fusion, Catalase", "Tuberculosis, Granuloma formation"],
["N. gonorrhoeae", "Pili (type IV), Opa proteins, LOS, IgA protease, Iron-binding proteins", "Gonorrhea, Ophthalmia neonatorum, PID"],
["H. influenzae", "Type b capsule (Hib), IgA protease, LOS, Fimbriae", "Meningitis, Epiglottitis, Otitis media"],
["C. perfringens", "α-toxin (lecithinase), θ-toxin (perfringolysin), Hyaluronidase, Collagenase", "Gas gangrene, Food poisoning, NEC"],
];
const orgW = [2.5, 6.3, 4.0];
s.addTable(orgSummary, {
x:0.2, y:1.22, w:12.9, colW:orgW,
fontFace:"Calibri", fontSize:9.5,
rowH:0.42,
fill:{color:C.white},
border:{type:"solid", pt:0.4, color:C.grey_light},
valign:"middle", align:"left", color:C.grey_dark
});
s.addShape(pres.ShapeType.rect, {x:0.2,y:1.22,w:12.9,h:0.42, fill:{color:C.purple}, line:{color:C.purple}});
["Organism","Key Virulence Factors","Disease"].forEach((h,i) => {
const xOff = [0.25, 2.75, 9.1];
s.addText(h, {x:xOff[i], y:1.26, w:orgW[i]-0.1, h:0.34, fontSize:11, bold:true, color:C.white, fontFace:"Calibri", valign:"middle"});
});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 19 – SUMMARY / KEY EXAM POINTS
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.offwhite}, line:{color:C.offwhite}});
contentHeader(s, "Quick Exam Revision – Key Points", C.navy, C.gold);
const examPoints = [
{hdr:"Remember: Griffith's Experiment", body:"Smooth (encapsulated) S. pneumoniae = virulent | Rough (no capsule) = avirulent. Capsule is the critical virulence factor here.", color:C.teal},
{hdr:"Exotoxin → Toxoid: DPT Vaccine", body:"Diphtheria & Tetanus toxins converted to toxoids (formaldehyde). Toxoids are non-toxic but immunogenic. Endotoxin cannot form toxoid.", color:C.red},
{hdr:"Quellung Reaction", body:"Capsule swelling in presence of type-specific antibody. Used to serotype S. pneumoniae (83 types) and N. meningitidis.", color:C.purple},
{hdr:"Coagulase Test = S. aureus", body:"Free coagulase: tube test | Bound coagulase (clumping factor): slide test. Positive = S. aureus. All others are coagulase-negative staphylococci (CoNS).", color:C.orange},
{hdr:"TSST-1 vs Exfoliatin", body:"TSST-1 → Toxic Shock Syndrome (SAg). Exfoliatin A&B → SSSS (cleaves desmoglein 1). Both from S. aureus but different diseases!", color:C.navy},
{hdr:"T3SS = Needle & Syringe", body:"Injects effectors directly into host cytoplasm. Found in: Salmonella, Shigella, EPEC, Yersinia, Pseudomonas. Allows invasion without phagocytosis.", color:C.green},
];
examPoints.forEach((pt, i) => {
const col = i % 3;
const row = Math.floor(i / 3);
const x = 0.3 + col * 4.3;
const y = 1.25 + row * 2.95;
s.addShape(pres.ShapeType.roundRect, {x,y,w:4.1,h:2.75, fill:{color:C.white}, line:{color:pt.color, pt:1.2}, rectRadius:0.1});
s.addShape(pres.ShapeType.roundRect, {x,y,w:4.1,h:0.45, fill:{color:pt.color}, line:{color:pt.color}, rectRadius:0.08});
s.addText(pt.hdr, {x:x+0.1,y:y+0.06,w:3.9,h:0.36, fontSize:12, bold:true, color:C.white, fontFace:"Calibri", valign:"middle"});
s.addText(pt.body, {x:x+0.12,y:y+0.52,w:3.86,h:2.14, fontSize:11.5, color:C.grey_dark, fontFace:"Calibri", valign:"top"});
});
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 20 – CLOSING SLIDE
// ════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:7.5, fill:{color:C.navy}, line:{color:C.navy}});
s.addShape(pres.ShapeType.rect, {x:0,y:0,w:13.3,h:0.08, fill:{color:C.gold}, line:{color:C.gold}});
s.addShape(pres.ShapeType.rect, {x:0,y:7.42,w:13.3,h:0.08, fill:{color:C.gold}, line:{color:C.gold}});
s.addText("Thank You", {
x:1,y:1.6,w:11.3,h:1.6, fontSize:52, bold:true, fontFace:"Calibri",
color:C.white, align:"center"
});
s.addText("Bacterial Virulence Factors – MD Microbiology", {
x:1,y:3.3,w:11.3,h:0.7, fontSize:20, fontFace:"Calibri",
color:C.gold, align:"center"
});
s.addText("Reference: Ananthnarayan & Paniker's Textbook of Microbiology\n(Supplemented from Jawetz, Henry's Clinical Diagnosis, Quick Compendium of Clinical Pathology)", {
x:1,y:4.1,w:11.3,h:0.9, fontSize:13, fontFace:"Calibri",
color:"A0B4C8", align:"center"
});
// Topics summary strip
const topics = ["Capsule","Fimbriae","Cell Wall","Exotoxins","Endotoxin","Spreading Enzymes","Immune Evasion","Secretion Systems","PAIs","Biofilm","Iron Acquisition"];
const stripH = 0.45;
const stripY = 5.2;
const itemW = 13.3 / topics.length;
topics.forEach((t, i) => {
const col = i % 2 === 0 ? C.teal : "0A5560";
s.addShape(pres.ShapeType.rect, {x: i * itemW, y: stripY, w: itemW, h: stripH, fill:{color:col}, line:{color:col}});
s.addText(t, {x: i*itemW+0.03, y: stripY+0.06, w:itemW-0.05, h:stripH-0.1, fontSize:8.5, color:C.white, fontFace:"Calibri", align:"center", bold:true});
});
s.addText("Compiled for MD Microbiology | July 2026", {
x:0,y:6.95,w:13.3,h:0.4, fontSize:9, color:"607080", fontFace:"Calibri", align:"center"
});
// ── Save ──────────────────────────────────────────────────────────────────
const outPath = "/home/daytona/workspace/virulence-ppt/Bacterial_Virulence_Factors.pptx";
pres.writeFile({ fileName: outPath })
.then(() => console.log("✅ PPT saved:", outPath))
.catch(err => { console.error("❌ Error:", err); process.exit(1); });
cd /home/daytona/workspace/virulence-ppt && node generate_ppt.js 2>&1
ls -lh /home/daytona/workspace/virulence-ppt/Bacterial_Virulence_Factors.pptx
Bacterial Virulence Factors
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide – dark navy theme |
| 2 | Overview: Pathogenicity vs Virulence vs PAIs; Key formula |
| Section 1 – Surface Factors | |
| 3 | Section banner |
| 4 | Capsule – properties, functions, organism examples (S. pneumoniae, Klebsiella, H. influenzae, N. meningitidis, B. anthracis) |
| 5 | Fimbriae, Pili, Type IV Pili, Sex Pili + conjugation |
| 6 | Cell wall: LPS/Endotoxin, Peptidoglycan, Protein A, M protein, IgA protease |
| Section 2 – Toxins | |
| 7 | Section banner |
| 8 | Exotoxin vs Endotoxin comparison table (12 features) |
| 9 | A-B toxins, Membrane-damaging toxins, Superantigens |
| 10 | Must-know toxins table (12 toxins with mechanism + disease) |
| Section 3 – Invasion | |
| 11 | Section banner |
| 12 | Spreading enzymes: Hyaluronidase, Collagenase, Streptokinase, Coagulase, DNase, IgA protease |
| 13 | Immune evasion: Antigenic variation, Intracellular survival, Biofilm, Complement resistance |
| Section 4 – Advanced | |
| 14 | Section banner |
| 15 | Secretion systems: T1SS through T6SS with examples |
| 16 | Pathogenicity Islands (PAIs) + Biofilm (quorum sensing, resistance) |
| 17 | Iron acquisition: Siderophores, Hemolysins, Fur regulation |
| 18 | Organism summary table (12 bacteria – all key virulence factors) |
| 19 | Quick exam revision – 6 high-yield memory cards |
| 20 | Closing slide with topic strip |
Note: Ananthnarayan's textbook is not in the digital library, so the content is aligned with Ananthnarayan topics using equivalent content from Jawetz, Quick Compendium, and Henry's – all covering identical virulence factor concepts.
Unable to download file
ls -lh /home/daytona/workspace/virulence-ppt/ && ls -lh /home/daytona/workspace/…
Bacterial Virulence Factors
Presentation · PPTX
CLSI Standards Quick Reference
PDF Document · PDF
How does actinomyces reach deep tissues and knee space
Actinomyces knee joint septic arthritis pathogenesis spread mechanism
https://pmc.ncbi.nlm.nih.gov/articles/PMC8941200
| Clinical Setting | Predisposing Event |
|---|---|
| Cervicofacial (55%) | Tooth extraction, dental procedure, jaw fracture, poor dental hygiene |
| Abdominopelvic (20%) | Ruptured appendix, bowel surgery, IUD insertion, perforated gut |
| Thoracic (15%) | Aspiration, esophageal injury, lung infection spreading |
| Cutaneous/MSK (rare) | Penetrating trauma, surgery, hematogenous from above sites |
It spreads by DIRECT EXTENSION through tissue planes, completely ignoring normal anatomical boundaries.
| Factor | Why It Helps Actinomyces |
|---|---|
| Poor dental hygiene | High oral load; mucosal barrier weakened |
| Diabetes | Impaired neutrophil function; vascular insufficiency → anaerobic tissue |
| Immunosuppression (steroids, HIV, malignancy) | Reduced phagocytic clearance |
| Alcoholism | Aspiration risk; poor dental hygiene |
| Malnutrition | Impaired cell-mediated immunity |
| Stage | Regimen |
|---|---|
| Acute/parenteral | Penicillin G 10-20 MU/day IV × 6 weeks (drug of choice; no known resistance) |
| Oral step-down | Amoxicillin or penicillin V 4-6 g/day × 6-12 months |
| Alternatives | Ampicillin, clindamycin, doxycycline, erythromycin, ceftriaxone |
| Surgery | Joint irrigation + debridement; excision of sinus tracts and fibrotic tissue; calcium sulfate + antibiotic beads at surgical site |