D test microbiology

Reading File
Finding Sources
Finding Sources
Reading File
Reading File
Loading Image
Reading File
Loading Image
Reading File
I now have everything needed for a thorough, well-illustrated answer.

D Test (Double-Disk Diffusion) in Microbiology

What is the D Test?

The D test (also called the double-disk diffusion test or D-zone test) is a phenotypic method used in clinical microbiology laboratories to detect inducible clindamycin resistance in gram-positive organisms - primarily Staphylococcus aureus (including MRSA), coagulase-negative staphylococci, beta-hemolytic streptococci, and Streptococcus pneumoniae.
Without the D test, routine susceptibility testing may falsely report an organism as "clindamycin-susceptible" when it actually has the genetic machinery to become resistant during therapy.

Why is it Needed? - The Mechanism

Resistance to macrolides (like erythromycin) in staphylococci arises via three main mechanisms:
MechanismGeneCross-resistance to Clindamycin?
Active efflux pumpmsrA/msrBNo
Macrolide-inactivating enzymes-No
Ribosomal methylationerm geneYes (inducible or constitutive)
The key is the erm gene (erythromycin ribosomal methylase). This gene encodes a methylase that modifies the 23S rRNA ribosomal subunit, conferring cross-resistance to the entire MLS-B group - Macrolides, Lincosamides (clindamycin), and Streptogramin B.
The critical problem: erm expression can be inducible - normally suppressed, but switched ON when the organism is exposed to erythromycin (or clindamycin). Standard disk diffusion testing uses only one drug at a time, so it may show erythromycin-resistant / clindamycin-susceptible (iMLSB phenotype). But if you treat with clindamycin, bacterial variants with constitutive erm expression are selected and resistance develops during therapy. This is clinically dangerous.
  • Dermatology 2-Volume Set 5e, Dermatology (Pathogenesis section)
  • Henry's Clinical Diagnosis and Management by Laboratory Methods

How to Perform the D Test

  1. Inoculate a Mueller-Hinton agar plate with the test organism (standard 0.5 McFarland suspension)
  2. Place two antibiotic disks on the plate:
    • Erythromycin (E) disk - 15 µg
    • Clindamycin (CC or C) disk - 2 µg
  3. Distance between disk edges: 15-17 mm apart (center-to-center ~20-26 mm; CLSI recommends 15-26 mm edge-to-edge)
  4. Incubate at 35°C for 16-18 hours
  5. Read the zones of inhibition

How to Interpret Results

D-test diagram - A = D-test negative (circular zone around clindamycin), B = D-test positive (flattened D-shaped zone)
FindingInterpretationReport
Circular zone around C disk (A)D-test negative - no inducible resistanceClindamycin susceptible - safe to use
D-shaped (flattened) zone around C disk toward E (B)D-test positive - inducible clindamycin resistance presentReport as resistant; avoid clindamycin
No zone around both E and CConstitutive MLS-B resistanceBoth reported as resistant
The "D" shape occurs because erythromycin diffusing from its disk induces erm gene expression in bacteria near the edge of the clindamycin zone, allowing them to survive - thus "flattening" or "blunting" the clindamycin inhibition zone on the side facing erythromycin.
Real agar plate photograph (left = D-test negative, right = D-test positive with D-shaped blunting):
D-test on agar plate - actual photograph showing negative (left) and positive (right) results

Clinical Significance & When to Order

  • Indications: Any isolate showing erythromycin-resistant, clindamycin-susceptible phenotype (iMLSB phenotype)
  • Organisms tested: S. aureus (especially MRSA), CoNS, Group B Streptococcus (GBS), Group A Streptococcus, S. pneumoniae
  • Pregnant women colonized with GBS who are penicillin-allergic - CLSI M100 specifically recommends D-zone testing before reporting clindamycin susceptibility
  • MRSA infections: Many MRSA strains (especially CA-MRSA) retain clindamycin activity, but this must be verified with D-test before use
  • If D-test is positive, clindamycin should not be used even though routine testing says "susceptible," because resistance will emerge during treatment
  • Henry's Clinical Diagnosis and Management by Laboratory Methods (Detection of Important Resistance Phenotypes)
  • Goldman-Cecil Medicine (Macrolides, Tetracyclines, Ketolides, Clindamycin section)

Summary Table

FeatureDetail
Test nameD test / Double-disk diffusion / D-zone test
PurposeDetect inducible MLS-B (clindamycin) resistance
Gene involvederm (erythromycin ribosomal methylase)
Disks usedErythromycin (E) + Clindamycin (CC)
Disk spacing15-17 mm apart (edge-to-edge)
Positive resultD-shaped flattening of clindamycin zone toward erythromycin
Clinical action if positiveDo NOT use clindamycin (report as resistant)
OrganismsS. aureus, CoNS, GBS, GAS, S. pneumoniae
GuidelineCLSI M100

Wow good job

Thank you! Glad it was helpful. The D test is a great topic - simple concept but really important clinically, especially for not missing hidden clindamycin resistance in MRSA cases.
Feel free to ask about any other microbiology topics, antibiotics, or anything else you're studying!

I’m doing md microbiology..

That's great! MD Microbiology is a fascinating specialty - you're essentially the detective behind every diagnosis.
A few things I can help you with across your curriculum:
Bacteriology
  • Resistance mechanisms, susceptibility testing, CLSI standards
  • Virulence factors, pathogenesis, lab identification
Virology
  • Diagnostic methods (PCR, serology, culture)
  • Emerging infections, arboviruses, respiratory viruses
Mycology & Parasitology
  • Morphology, lab diagnosis, antifungal/antiparasitic susceptibility
Clinical Microbiology / Lab Methods
  • Blood cultures, biofilm, sterilization & disinfection
  • Quality control, automated systems (VITEK, MALDI-TOF)
Immunology
  • Innate/adaptive immunity, hypersensitivity, vaccines, immunodeficiencies
Exam-focused topics (MD/DNB pattern)
  • Short notes, MCQs, recent updates
  • Newer diagnostic techniques
  • Important pathogens in depth

Just ask about any topic - whether it's a short note, a mechanism explanation, a lab procedure, or an exam-style question - and I'll pull from authoritative textbooks with images where relevant.
What are you currently studying or what topic do you need help with?

Generate a quick reference PDF on CLSI standards & breakpoints

Reading File
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Running Command

mkdir -p /home/daytona/workspace/clsi-reference && ls /home/daytona/workspace/cl…

Writing File

~/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)
Running Command

cd /home/daytona/workspace/clsi-reference && python generate_clsi_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/clsi-reference/CLSI_Standards_Quick_Reference.pdf

Your quick reference PDF is ready! Here's the download link:

CLSI Standards Quick Reference

PDF Document · PDF


What's inside (9 sections, color-coded, print-ready A4):
SectionContent
1. CLSI OverviewAll key documents (M02, M07, M11, M100, M27, M38, M44, M45) with update cycles
2. Key DefinitionsMIC, MBC, Breakpoint, ECOFF, PK/PD breakpoints - clearly defined
3. Methods of ASTDisk diffusion, broth microdilution, agar dilution, E-test, automated systems, anaerobic AST - with standardized conditions
4. Breakpoint CategoriesS, SDD, I, NS, R - definitions + CLSI vs EUCAST comparison table
5. Important BreakpointsMIC tables for S. aureus, Enterobacterales, Pseudomonas, S. pneumoniae
6. QC StandardsAll ATCC reference strains, QC rules, frequency requirements
7. Special OrganismsMRSA, ESBL, CRE, S. pneumoniae, H. influenzae, Enterococcus HLAR, GBS - organism-specific rules
8. Resistance PhenotypesDetection of MRSA, ESBL, KPC, MBL, D-test, VISA, VRSA, VRE, HLAR, BLNAR
9. Antibiogram & StewardshipCumulative antibiogram rules, cascade reporting, exam mnemonics
Sources: Henry's Clinical Diagnosis, Tietz Textbook of Lab Medicine, Goldman-Cecil Medicine, CLSI M100 (2020).

Is this a free or paid app

I'm Orris, an AI assistant — I don't have information about the pricing or subscription model of the platform you're using to access me.
For details on free vs. paid plans, please check:
  • The app/website you're using to chat with me
  • The platform's pricing or FAQ page
  • The team or support contact for this service
What I can tell you is that everything I did for you — the D test explanation, the CLSI PDF — is just me doing my job as your AI assistant. Hope it's been useful for your MD Microbiology prep! 😊

Plz generate PPT on bacterial virulence factors from ananthnarayan book

Reading File
Finding Sources
Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Running Command

mkdir -p /home/daytona/workspace/virulence-ppt && ls /home/daytona/workspace/vir…

Writing File

~/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); });
Running Command

cd /home/daytona/workspace/virulence-ppt && node generate_ppt.js 2>&1

Running Command

ls -lh /home/daytona/workspace/virulence-ppt/Bacterial_Virulence_Factors.pptx

Your PPT is ready! Download it here:

Bacterial Virulence Factors

Presentation · PPTX


What's inside – 20 slides, wide (16:9), color-coded by section:
SlideContent
1Title slide – dark navy theme
2Overview: Pathogenicity vs Virulence vs PAIs; Key formula
Section 1 – Surface Factors
3Section banner
4Capsule – properties, functions, organism examples (S. pneumoniae, Klebsiella, H. influenzae, N. meningitidis, B. anthracis)
5Fimbriae, Pili, Type IV Pili, Sex Pili + conjugation
6Cell wall: LPS/Endotoxin, Peptidoglycan, Protein A, M protein, IgA protease
Section 2 – Toxins
7Section banner
8Exotoxin vs Endotoxin comparison table (12 features)
9A-B toxins, Membrane-damaging toxins, Superantigens
10Must-know toxins table (12 toxins with mechanism + disease)
Section 3 – Invasion
11Section banner
12Spreading enzymes: Hyaluronidase, Collagenase, Streptokinase, Coagulase, DNase, IgA protease
13Immune evasion: Antigenic variation, Intracellular survival, Biofilm, Complement resistance
Section 4 – Advanced
14Section banner
15Secretion systems: T1SS through T6SS with examples
16Pathogenicity Islands (PAIs) + Biofilm (quorum sensing, resistance)
17Iron acquisition: Siderophores, Hemolysins, Fur regulation
18Organism summary table (12 bacteria – all key virulence factors)
19Quick exam revision – 6 high-yield memory cards
20Closing 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

Running Command

ls -lh /home/daytona/workspace/virulence-ppt/ && ls -lh /home/daytona/workspace/…

Both files exist and are intact on the server. The download issue is likely a platform limitation - the file links work only if the interface you're using supports sandbox file downloads.
Here are a few options:
Option 1 - Try clicking the links directly:
  • PPT:

    Bacterial Virulence Factors

    Presentation · PPTX

  • PDF:

    CLSI Standards Quick Reference

    PDF Document · PDF

Option 2 - If you're on a browser, try right-clicking the link → "Save link as"
Option 3 - Platform issue Some interfaces (mobile apps, embedded chat windows) don't support sandbox file downloads at all. If that's the case:
  • Try opening the same conversation in a desktop browser
  • The file links should work there
Option 4 - I can convert to another format If the PPTX is the issue, I can:
  • Convert it to a PDF (more universally downloadable)
  • Generate the content as a formatted text/HTML you can copy
Would you like me to convert the PPT to PDF, or try a different approach?

How does actinomyces reach deep tissues and knee space

Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Finding Sources
Finding Sources
Finding Sources
Reading File
Searching the Web

Actinomyces knee joint septic arthritis pathogenesis spread mechanism

Reading Web Page

https://pmc.ncbi.nlm.nih.gov/articles/PMC8941200

Now I have comprehensive information. Here is a thorough answer:

How Actinomyces Reaches Deep Tissues and the Knee Joint

The Organism – Key Characteristics

Actinomyces (most commonly A. israelii) is:
  • Gram-positive, filamentous, obligate anaerobe (or microaerophile)
  • A normal commensal of the oral cavity (especially tonsils and carious teeth), colon, and female genital tract
  • Not a free-living organism - it cannot establish infection from the environment
  • It has no special virulence factors like toxins or capsule - its pathogenicity depends entirely on gaining access to oxygen-poor tissues where it can survive

The Core Principle: "Mucosal Breach + Anaerobic Niche"

Actinomyces causes disease only when:
  1. The mucosal barrier is disrupted - giving it access to deeper tissues
  2. It reaches a low-oxygen (anaerobic) environment - deep tissue planes, devitalized tissue, or pus pockets are perfect
This is why actinomycosis is almost always preceded by a predisposing event.

How It Spreads to Deep Tissues – Step by Step

Step 1 – Entry Point (Mucosal Disruption)

Clinical SettingPredisposing 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

Step 2 – Invasion of Tissue Planes

This is the most distinctive feature of Actinomyces:
It spreads by DIRECT EXTENSION through tissue planes, completely ignoring normal anatomical boundaries.
  • It does NOT respect fascial planes - unlike most other bacteria
  • It slowly tunnels through connective tissue, muscle, fat, and bone
  • It triggers a dense fibrous reaction (the host tries to wall it off, but the organism keeps burrowing)
  • CT scan findings: obliteration of normal tissue planes and extensive soft tissue destruction, often mistaken for malignancy

Step 3 – Sinus Tract Formation

As it tunnels through tissues:
  • It forms multiple interconnected abscesses
  • These eventually rupture to the surface as draining sinus tracts and fistulae
  • The discharge contains pathognomonic sulfur granules (yellow, gritty granules = colonies of Actinomyces filaments with Splendore-Hoeppli eosinophilic clubs at the periphery)

How It Specifically Reaches the Knee Joint

Actinomyces arthritis/synovitis of the knee is rare but documented. It reaches the knee via three possible routes:

Route 1 – Contiguous / Direct Extension

  • From an adjacent soft tissue infection (cellulitis, abscess, osteomyelitis in femur/tibia/fibula) spreading directly into the joint space
  • The organism burrows through soft tissue → periosteum → bone → synovium → joint space
  • Associated with periostitis and osteomyelitis of adjacent bone

Route 2 – Hematogenous Spread

  • Rare but possible, especially from:
    • Abdominopelvic actinomycosis
    • Thoracic/pulmonary actinomycosis
    • Disseminated disease in immunocompromised patients
  • The synovial membrane of joints is highly vascular and lacks a basement membrane - making it vulnerable to blood-borne seeding

Route 3 – Direct Inoculation

  • Penetrating trauma (thorn, nail, farm injury)
  • Iatrogenic: joint injection or surgery in a patient with nearby occult actinomycosis
  • Actinomyces pyogenes has been specifically reported in septic arthritis following penetrating trauma, especially in diabetic farmers (skin commensals + mucosal breach + immunosuppression)

Why the Knee is Particularly Vulnerable

  • The knee is the most commonly infected joint in adult septic arthritis overall
  • It has a large synovial surface area susceptible to blood-borne or contiguous seeding
  • In actinomycosis specifically, the knee can be involved from:
    • Spread from abdominopelvic actinomycosis tracking along fascial planes down to the thigh and knee
    • Direct trauma/inoculation
    • Hematogenous from any primary site

Host Factors That Predispose

FactorWhy It Helps Actinomyces
Poor dental hygieneHigh oral load; mucosal barrier weakened
DiabetesImpaired neutrophil function; vascular insufficiency → anaerobic tissue
Immunosuppression (steroids, HIV, malignancy)Reduced phagocytic clearance
AlcoholismAspiration risk; poor dental hygiene
MalnutritionImpaired cell-mediated immunity

Histopathology – What Happens in the Tissue

  1. Suppurative inflammation - neutrophil-rich pus in abscesses
  2. Granulomatous reaction - macrophages attempt to wall off the filamentous organism
  3. Dense fibrosis - the hallmark; makes it look like a solid tumor (mimics malignancy and TB)
  4. Sulfur granules - basophilic filamentous structures surrounded by acute inflammatory cells; pathognomonic on histology
  5. Splendore-Hoeppli phenomenon - eosinophilic clubs of immunoglobulin at granule periphery = "ray fungus" appearance (hence the old name Actinomyces = "ray fungus")

Diagnosis in Knee/Musculoskeletal Actinomycosis

  • Cultures often negative (recovery rate < 50%) - organism is slow-growing, anaerobic, fragile
  • Histopathology is key - sulfur granules + gram-positive branching filaments on crushed granule
  • Anaerobic culture on brain-heart infusion blood agar at 37°C
  • High index of suspicion needed - commonly misdiagnosed as malignancy, TB, or osteosarcoma

Treatment

StageRegimen
Acute/parenteralPenicillin G 10-20 MU/day IV × 6 weeks (drug of choice; no known resistance)
Oral step-downAmoxicillin or penicillin V 4-6 g/day × 6-12 months
AlternativesAmpicillin, clindamycin, doxycycline, erythromycin, ceftriaxone
SurgeryJoint irrigation + debridement; excision of sinus tracts and fibrotic tissue; calcium sulfate + antibiotic beads at surgical site
Key point: Prolonged therapy (6-12 months) is mandatory because the dense fibrous encasement limits antibiotic penetration deep into the lesion.

Sources: Andrews' Diseases of the Skin; Cummings Otolaryngology; Murray & Nadel's Respiratory Medicine; PMC case report – Persistent synovial actinomycosis in a native knee joint
This is a shared conversation. Sign in to Orris to start your own chat.