bacterial classification

Bacteria are classified by several key criteria: Gram stain (positive/negative), shape (cocci, bacilli, spirochetes), oxygen requirement (aerobic/anaerobic), and other features like spore formation, motility, and cell wall structure. Major groups include Firmicutes, Proteobacteria, Actinobacteria, and Bacteroidetes.
Searching sources...
Reading File
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Loading Image
Finding Sources
Reading File
Loading Image
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Now I have comprehensive information from two authoritative textbooks. Let me compile a thorough answer.

Bacterial Classification

Bacteria are classified using a hierarchy of increasingly specific criteria - from gross appearance to molecular genetics. Here is a complete overview sourced from Medical Microbiology 9e and Jawetz, Melnick & Adelberg's Medical Microbiology (28e).

1. Taxonomic Hierarchy (Linnaean System)

Bacterial taxonomy follows formal ranks from broad to specific:
RankExample
KingdomProkaryotae
DivisionGracilicutes
ClassScotobacteria
OrderEubacteriales
FamilyEnterobacteriaceae
GenusEscherichia
Speciescoli
SubtypeE. coli O157:H7
In clinical practice, family, genus, and species are the most useful ranks. - Jawetz, Melnick & Adelberg's Medical Microbiology 28e, p. 49

2. Prokaryotes vs. Eukaryotes

Before classifying bacteria, it helps to understand what makes them distinct from eukaryotes:
CharacteristicEukaryoteProkaryote (Bacteria)
Size>5 µm0.5-3.0 µm
NucleusMembrane-boundNo nuclear membrane
ChromosomesDiploid, multipleSingle, circular, haploid
Ribosomes80S (60S+40S)70S (50S+30S) - antibiotic target
MitochondriaPresentAbsent
Cytoplasmic membraneContains sterolsNo sterols (except Mycoplasma)
Cell wallAbsent (except fungi)Peptidoglycan-based
ReproductionSexual and asexualAsexual (binary fission only)
  • Medical Microbiology 9e, p. 139 (Table 12.1)

3. Classification by Morphology (Macroscopic & Microscopic)

Shape (Morphology)

Bacterial morphology shapes and Gram stain steps
Fig. 12.3 - Gram-stain steps (A) and bacterial morphology shapes (B) - Medical Microbiology 9e
ShapeDescriptionExample
CoccusSphericalStaphylococcus, Streptococcus
BacillusRod-shapedE. coli, Bacillus spp.
CoccobacillusShort rodHaemophilus influenzae
VibrioComma-shaped curveVibrio cholerae
SpirillumRigid spiralCampylobacter
SpirocheteFlexible coiledTreponema, Borrelia
Fusiform bacillusSpindle-shapedFusobacterium
FilamentousBranching hyphae-likeNocardia, Actinomyces

Aggregation Patterns

  • Clusters (grapelike): Staphylococcus aureus
  • Chains: Streptococcus pyogenes
  • Diplococci (pairs): S. pneumoniae, Neisseria spp.

Colony Morphology

On culture media, colonies differ in color, size, shape, smell, and their ability to ferment sugars, lyse erythrocytes (hemolysis), or produce enzymes. - Medical Microbiology 9e, p. 139

4. Classification by Gram Stain

The Gram stain is the single most important initial classification tool:
FeatureGram-PositiveGram-Negative
Color resultPurple (crystal violet retained)Red/Pink (safranin counterstain)
Peptidoglycan layerThickThin
Outer membraneAbsentPresent
Lipopolysaccharide (LPS/Endotoxin)AbsentPresent
Teichoic acidOften presentAbsent
SporulationSome bacteria (e.g., Clostridium, Bacillus)None
Penicillin susceptibilityMore susceptibleMore resistant
Lysozyme sensitivitySensitiveResistant
Mnemonic: "P-PURPLE-POSITIVE"

Gram-Stain Procedure (4 Steps)

  1. Apply crystal violet (primary stain)
  2. Add Gram's iodine (mordant - precipitates stain)
  3. Wash with acetone/alcohol decolorizer
  4. Apply safranin (red counterstain)
Gram staining cannot be applied to mycobacteria (waxy outer shell - use acid-fast stain) or mycoplasmas (no peptidoglycan at all). - Medical Microbiology 9e, p. 140

5. Classification by Metabolic/Oxygen Requirements

CategoryDescriptionExamples
Obligate aerobeRequire O2 as terminal electron acceptorMycobacterium tuberculosis, Bacillus spp.
Obligate anaerobeCannot survive in O2Clostridium, Bacteroides
Facultative anaerobeGrow with or without O2E. coli, most Enterobacteriaceae
MicroaerophileRequire low O2Campylobacter, Helicobacter
Aerotolerant anaerobeTolerate O2 but do not use itLactobacillus
  • Jawetz, Melnick & Adelberg's Medical Microbiology 28e (Glossary)

6. Classification by Biochemical Tests

Biochemical tests form the backbone of routine clinical identification:
TestWhat it DetectsExample Use
CatalaseH2O2-splitting enzymeStaphylococci (+) vs Streptococci (-)
CoagulaseFibrin-clotting enzymeS. aureus (+) vs S. epidermidis (-)
OxidaseCytochrome C oxidasePseudomonas (+) vs E. coli (-)
UreaseUrea hydrolysis → NH3Proteus (strongly +)
Nitrate reductionNO3- → NO2- + N2Used in urinalysis for Gram-neg rods
Lactose fermentationAcid production from lactoseE. coli (pink) vs Salmonella (white) on MacConkey
Voges-ProskauerAcetoin productionDifferentiates enteric rods
Algorithm for differentiating Gram-positive cocci using catalase and coagulase tests
Algorithm for differentiating Gram-positive cocci - Jawetz, Melnick & Adelberg's Medical Microbiology 28e, p. 50

7. Classification by Culture Media

Media TypePurposeExample
Non-selective (complex)Supports most bacteriaBlood agar, Chocolate agar
SelectiveInhibits unwanted organismsMacConkey (Gram-neg rods), CNA agar (Gram-pos cocci)
DifferentialDistinguishes by metabolic reactionMacConkey (lactose fermentation)
Key selective agents:
  • Sodium azide - selects Gram-positives over Gram-negatives
  • Bile salts - selects Gram-negative enteric bacteria
  • Colistin + nalidixic acid - selects Gram-positive cocci

8. Classification by Immunologic Properties (Serotyping)

Antibodies against surface antigens - O-antigen (LPS), H-antigen (flagella), and K-antigen (capsule) - are used to define:
  • Serotypes / Serovars / Serogroups: identify specific strains within a species (e.g., E. coli O157:H7)
  • Especially useful in outbreak epidemiology to trace clonal spread

9. Classification by Genotype (Modern Molecular Methods)

The most accurate classification is now molecular:
MethodPrincipleUse
16S rRNA sequencingConserved ribosomal RNA gene sequenceGold standard for species identification
Whole genome sequencingFull genomic comparisonStrain-level identification, outbreak tracing
DNA-DNA hybridization% genetic similaritySpecies definition (>70% = same species)
MLST (multi-locus sequence typing)7 housekeeping gene allelesEpidemiologic typing
DNA sequencing is particularly valuable for organisms that are difficult to culture or whose traits are encoded on mobile genetic elements (plasmids, bacteriophages). - Jawetz 28e, p. 51

10. Special Staining Categories

Bacteria that cannot be classified by Gram stain require special approaches:
CategoryStainExample Organisms
Acid-fastZiehl-Neelsen / AuramineMycobacterium tuberculosis, M. leprae
No cell wallNo Gram stain possibleMycoplasma spp.
Intracellular obligatesGiemsa, immunofluorescenceChlamydia, Rickettsia
Endospore-formersSchaeffer-FultonBacillus, Clostridium

Summary: Classification Criteria at a Glance

Bacteria
├── By Gram stain:   Gram-positive | Gram-negative | Acid-fast | No wall
├── By shape:        Cocci | Bacilli | Spirochetes | Filamentous
├── By O2 need:      Aerobe | Anaerobe | Facultative | Microaerophile
├── By metabolism:   Fermentative | Oxidative | Photosynthetic
├── By structure:    Capsule / Flagella / Pili / Spores
├── By serology:     O, H, K antigens (serotypes)
└── By genetics:     16S rRNA / Whole genome / DNA hybridization
Sources: Medical Microbiology 9e (Murray et al.), pp. 139-141; Jawetz, Melnick & Adelberg's Medical Microbiology 28e, pp. 49-52

Flowchart with example of bacteria species with explaination

Asking for Preferences

What format would you like the flowchart in?

Generating Image

A detailed educational flowchart for bacterial classification with example species. The flowchart starts at the top with "BACTERIA" and branches step by step: Step 1 - Gram Stain splits into two branches: - LEFT branch: "GRAM-POSITIVE (Purple)" with label "Thick peptidoglycan, no outer membrane" - RIGHT branch: "GRAM-NEGATIVE (Red/Pink)" with label "Thin peptidoglycan, has outer membrane & LPS" Step 2 - Each branch splits by Shape: GRAM-POSITIVE left side: - "Cocci (spherical)" → further splits by Catalase: - Catalase POSITIVE → "Staphylococcus" → splits by Coagulase: - Coagulase + → "S. aureus" (causes skin infections, pneumonia, toxic shock) - Coagulase − → "S. epidermidis" (causes catheter infections) - Catalase NEGATIVE → "Streptococcus" → splits by Hemolysis: - Beta-hemolysis → "S. pyogenes" (strep throat, rheumatic fever) - Alpha-hemolysis → "S. pneumoniae" (pneumonia, meningitis) - Gamma (no hemolysis) → "Enterococcus faecalis" (UTI, endocarditis) - "Bacilli (rods)" → splits by Spores: - Spore-forming → "Bacillus anthracis" (anthrax), "Clostridium tetani" (tetanus) - Non-spore-forming → "Listeria monocytogenes" (listeriosis), "Corynebacterium diphtheriae" (diphtheria) GRAM-NEGATIVE right side: - "Cocci (spherical)" → "Neisseria meningitidis" (meningitis), "N. gonorrhoeae" (gonorrhea) - "Bacilli (rods)" → splits by Oxygen requirement: - Aerobic/Facultative → "Enterobacteriaceae": "E. coli" (UTI, diarrhea), "Salmonella typhi" (typhoid), "Klebsiella pneumoniae" (pneumonia) - Anaerobic → "Bacteroides fragilis" (intra-abdominal infections) - "Spirochetes (spiral)" → "Treponema pallidum" (syphilis), "Borrelia burgdorferi" (Lyme disease) At the bottom, a separate box: "GRAM-STAIN EXCEPTIONS: Acid-fast stain → Mycobacterium tuberculosis (TB), M. leprae (leprosy). No cell wall → Mycoplasma pneumoniae (atypical pneumonia). Obligate intracellular → Chlamydia trachomatis, Rickettsia rickettsii" Use a clean white background, blue and red color coding for gram positive/negative branches, green for organism names, small italic text for disease examples. Use clear arrows and boxes. Professional medical education style, highly readable, organized layout.

Bacterial Classification Flowchart
Here's a full walkthrough of the flowchart:

How to Read the Flowchart

Step 1 - Gram Stain (First Branch Point)

The very first test done on any unknown bacterium. It divides all bacteria into two fundamental groups based on cell wall structure.

GRAM-POSITIVE Bacteria (Purple)

Thick peptidoglycan layer traps crystal violet dye

Gram-Positive Cocci

TestResultOrganismDiseases
Catalase+Staphylococcus-
Coagulase (from Staph)+S. aureusSkin abscesses, pneumonia, toxic shock syndrome, food poisoning
Coagulase (from Staph)-S. epidermidisCatheter/prosthetic device infections
Catalase-Streptococcus-
Beta-hemolysis (from Strep)S. pyogenes (Group A)Strep throat, scarlet fever, rheumatic fever
Alpha-hemolysis (from Strep)S. pneumoniaePneumonia, meningitis, otitis media
No hemolysisEnterococcus faecalisUTI, endocarditis

Gram-Positive Bacilli (Rods)

FeatureOrganismDiseases
Spore-forming, aerobicBacillus anthracisAnthrax
Spore-forming, anaerobicClostridium tetaniTetanus
Spore-forming, anaerobicC. difficilePseudomembranous colitis (antibiotic-associated diarrhea)
Non-spore-formingListeria monocytogenesListeriosis (dangerous in pregnancy)
Non-spore-formingCorynebacterium diphtheriaeDiphtheria
Acid-fast positive (special)Mycobacterium tuberculosisTuberculosis

GRAM-NEGATIVE Bacteria (Red/Pink)

Thin peptidoglycan + outer membrane with LPS (endotoxin)

Gram-Negative Cocci

OrganismDiseases
Neisseria meningitidisBacterial meningitis, septicemia
N. gonorrhoeaeGonorrhea, neonatal conjunctivitis

Gram-Negative Rods (Bacilli)

Classified further by oxygen requirement:
Facultative Anaerobes (Enterobacteriaceae family):
OrganismKey FeatureDiseases
E. coliOxidase-neg, lactose fermenterUTI, neonatal meningitis, diarrhea
Salmonella typhiNon-lactose fermenterTyphoid fever
Klebsiella pneumoniaeMucoid capsulePneumonia (especially alcoholics), UTI
Shigella dysenteriaeNon-motileBloody dysentery
Aerobic only:
OrganismKey FeatureDiseases
Pseudomonas aeruginosaOxidase-positive, blue-green pigmentBurn/wound infections, CF pneumonia
Helicobacter pyloriMicroaerophile, urease+Peptic ulcer, gastric cancer
Obligate Anaerobes:
OrganismDiseases
Bacteroides fragilisIntra-abdominal infections, abscesses

Gram-Negative Spirochetes (Spiral)

OrganismDiseases
Treponema pallidumSyphilis
Borrelia burgdorferiLyme disease
Leptospira interrogansLeptospirosis

Gram-Stain Exceptions (Special Groups)

CategoryReasonOrganismDisease
Acid-fastWaxy mycolic acid wallM. tuberculosis, M. lepraeTB, Leprosy
No cell wallCannot retain any stainMycoplasma pneumoniaeAtypical ("walking") pneumonia
Obligate intracellularToo small, no independent metabolismChlamydia trachomatisSTI, trachoma
Obligate intracellularRickettsia rickettsiiRocky Mountain Spotted Fever

Key clinical rule: Gram stain + shape + one or two biochemical tests (catalase, coagulase, oxidase) gets you to the correct genus/species in most clinical scenarios within minutes.

gpc, gnb , Kingdom Division Class Order Family Genus Species c Subtype

The user wants full taxonomic classification (Kingdom → Subtype) for key Gram-Positive Cocci (GPC) and Gram-Negative Bacilli (GNB) examples, shown as a visual flowchart/diagram.
Searching sources...
Generating Image

A detailed professional educational taxonomy table/diagram showing full Linnaean classification for Gram-Positive Cocci (GPC) and Gram-Negative Bacilli (GNB) bacteria. Layout: Two large side-by-side columns, left column is blue-themed for GPC, right column is red-themed for GNB. Each column shows a vertical taxonomy ladder with 8 rows for the ranks: Kingdom, Division, Class, Order, Family, Genus, Species, Subtype. LEFT COLUMN - GRAM-POSITIVE COCCI (GPC) - Blue theme: Title: "GPC - Gram-Positive Cocci" Show TWO example organisms side by side within the column: Example 1: Staphylococcus aureus Kingdom: Bacteria Division: Firmicutes Class: Bacilli Order: Bacillales Family: Staphylococcaceae Genus: Staphylococcus Species: S. aureus Subtype: MRSA (Methicillin-Resistant S. aureus) Disease note: Skin infections, pneumonia, toxic shock Example 2: Streptococcus pyogenes Kingdom: Bacteria Division: Firmicutes Class: Bacilli Order: Lactobacillales Family: Streptococcaceae Genus: Streptococcus Species: S. pyogenes Subtype: Group A Streptococcus (GAS) Disease note: Strep throat, rheumatic fever RIGHT COLUMN - GRAM-NEGATIVE BACILLI (GNB) - Red/orange theme: Title: "GNB - Gram-Negative Bacilli" Show TWO example organisms side by side within the column: Example 1: Escherichia coli Kingdom: Bacteria Division: Proteobacteria Class: Gammaproteobacteria Order: Enterobacterales Family: Enterobacteriaceae Genus: Escherichia Species: E. coli Subtype: E. coli O157:H7 Disease note: UTI, diarrhea, neonatal meningitis Example 2: Klebsiella pneumoniae Kingdom: Bacteria Division: Proteobacteria Class: Gammaproteobacteria Order: Enterobacterales Family: Enterobacteriaceae Genus: Klebsiella Species: K. pneumoniae Subtype: CRKP (Carbapenem-Resistant K. pneumoniae) Disease note: Hospital pneumonia, UTI At the very top center, a title box: "Full Linnaean Taxonomy: GPC vs GNB" At the bottom, a legend box: "GPC = Gram-Positive Cocci (purple on Gram stain, thick peptidoglycan, NO outer membrane) | GNB = Gram-Negative Bacilli (pink/red on Gram stain, thin peptidoglycan, HAS outer membrane + LPS endotoxin)" Use clean white background, clear bold rank labels on left side, connecting arrows between ranks, color-coded boxes per organism, professional medical textbook style, large readable font.

Full Linnaean Taxonomy: GPC vs GNB
Here is the complete written breakdown for study reference:

GRAM-POSITIVE COCCI (GPC)

Example 1 - Staphylococcus aureus

RankClassificationNotes
KingdomBacteriaProkaryote, no nucleus
Division (Phylum)FirmicutesLow G+C content, thick peptidoglycan
ClassBacilliDespite name, includes cocci too
OrderBacillales
FamilyStaphylococcaceaeCatalase-positive cocci
GenusStaphylococcus40+ species
SpeciesS. aureusCoagulase-positive
SubtypeMRSAMethicillin-Resistant S. aureus - major hospital pathogen
Key diseases: Skin/soft tissue infections, bacteremia, endocarditis, toxic shock syndrome, food poisoning

Example 2 - Streptococcus pyogenes

RankClassificationNotes
KingdomBacteria
Division (Phylum)Firmicutes
ClassBacilli
OrderLactobacillales
FamilyStreptococcaceaeCatalase-negative cocci
GenusStreptococcus
SpeciesS. pyogenesBeta-hemolytic
SubtypeGroup A Streptococcus (GAS)Lancefield group A antigen
Key diseases: Strep throat, scarlet fever, rheumatic fever, necrotizing fasciitis, glomerulonephritis

Example 3 - Streptococcus pneumoniae

RankClassificationNotes
KingdomBacteria
Division (Phylum)Firmicutes
ClassBacilli
OrderLactobacillales
FamilyStreptococcaceae
GenusStreptococcus
SpeciesS. pneumoniaeAlpha-hemolytic, bile-soluble
Subtype>90 serotypesClassified by polysaccharide capsule type
Key diseases: Pneumonia, bacterial meningitis, otitis media, sinusitis

GRAM-NEGATIVE BACILLI (GNB)

Example 1 - Escherichia coli

RankClassificationNotes
KingdomBacteria
Division (Phylum)ProteobacteriaLargest phylum of Gram-negatives
ClassGammaproteobacteria
OrderEnterobacterales
FamilyEnterobacteriaceae"Enterics" - gut flora
GenusEscherichia
SpeciesE. coliOxidase-negative, lactose fermenter
SubtypeE. coli O157:H7O = somatic antigen, H = flagellar antigen
Key diseases: UTI (most common cause), neonatal meningitis, traveler's diarrhea, hemolytic uremic syndrome (HUS - O157:H7)

Example 2 - Klebsiella pneumoniae

RankClassificationNotes
KingdomBacteria
Division (Phylum)Proteobacteria
ClassGammaproteobacteria
OrderEnterobacterales
FamilyEnterobacteriaceae
GenusKlebsiella
SpeciesK. pneumoniaeLarge mucoid capsule, non-motile
SubtypeCRKPCarbapenem-Resistant K. pneumoniae - WHO priority pathogen
Key diseases: Hospital-acquired pneumonia (especially in alcoholics), UTI, liver abscess, septicemia

Example 3 - Pseudomonas aeruginosa

RankClassificationNotes
KingdomBacteria
Division (Phylum)Proteobacteria
ClassGammaproteobacteria
OrderPseudomonadales
FamilyPseudomonadaceae
GenusPseudomonas
SpeciesP. aeruginosaOxidase-positive, blue-green pyocyanin pigment
SubtypeMucoid strainsFound in cystic fibrosis patients
Key diseases: Burn/wound infections, ventilator-associated pneumonia, cystic fibrosis lung disease, hot tub folliculitis

Quick Comparison Summary

FeatureGPCGNB
Gram stainPurplePink/Red
PhylumFirmicutesProteobacteria
PeptidoglycanThickThin
Outer membraneAbsentPresent
LPS (Endotoxin)NoYes - causes septic shock
Typical antibioticsPenicillin, VancomycinCephalosporins, Fluoroquinolones, Carbapenems
Key virulenceExotoxins, Coagulase, Protein AEndotoxin, Pili, Type III secretion

add all gpc species and gnb

Comprehensive taxonomy for all clinically relevant GPC and GNB species - this will be a detailed reference table.
Searching sources...
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Finding Sources
Excellent - I now have all the data needed from authoritative textbooks. Let me compile the comprehensive tables.

Complete Taxonomy: ALL Clinically Relevant GPC & GNB Species


GRAM-POSITIVE COCCI (GPC) - Complete

GENUS 1: Staphylococcus (Phylum: Firmicutes)

RankAll Species
KingdomBacteria
Division/PhylumFirmicutes
ClassBacilli
OrderBacillales
FamilyStaphylococcaceae
GenusStaphylococcus

Species - Coagulase Positive:

SpeciesSubtypeKey DiseaseNotes
S. aureusMRSA (methicillin-resistant)Skin/soft tissue infections, bacteremia, pneumonia, endocarditis, toxic shock syndrome, food poisoningMost virulent; coagulase+, catalase+
MSSA (methicillin-sensitive)Same as aboveAntibiotic-sensitive strain
VRSA (vancomycin-resistant)Last-resort treatment failuresRare but critical

Species - Coagulase Negative (CoNS):

SpeciesSubtype/ResistanceKey DiseaseDistinguishing Feature
S. epidermidisSlime-producing strainsCatheter/prosthetic device infections, neonatal sepsis, endocarditisMost common CoNS; biofilm producer
S. saprophyticus-UTI in young sexually active womenNovobiocin-resistant
S. haemolyticusVancomycin-reduced susceptibilityUTI in hospitalized patients, wound infections2nd most common CoNS clinically
S. lugdunensis-Aggressive endocarditis, skin infectionsBehaves like S. aureus in virulence
S. schleiferi-Wound infections, otitisLess common
S. warneri-Bacteremia in immunocompromisedRare pathogen
S. capitis-Neonatal sepsis, endocarditisFound on scalp/face
S. hominis-Bacteremia, catheter infectionsNormal skin flora
  • Red Book 2021, p. 2421: "There are more than 40 named coagulase-negative Staphylococcus species; S. epidermidis, S. haemolyticus, S. saprophyticus, S. schleiferi, and S. lugdunensis most often associated with human infections."

GENUS 2: Streptococcus (Phylum: Firmicutes)

RankClassification
KingdomBacteria
Division/PhylumFirmicutes
ClassBacilli
OrderLactobacillales
FamilyStreptococcaceae
GenusStreptococcus
SpeciesLancefield GroupHemolysisSubtypeKey Disease
S. pyogenesGroup A (GAS)BetaM-protein types (1, 3, 5, 12, 28...)Strep throat, scarlet fever, rheumatic fever, necrotizing fasciitis, glomerulonephritis
S. agalactiaeGroup B (GBS)BetaSerotypes Ia, Ib, II-IXNeonatal meningitis & bacteremia, maternal peripartum infections
S. dysgalactiaeGroup C/GBeta-Pharyngitis, cellulitis, bacteremia
S. pneumoniaeNo Lancefield groupAlpha>90 capsular serotypesPneumonia, bacterial meningitis, otitis media, sinusitis
S. viridans groupNo Lancefield groupAlpha-Subacute bacterial endocarditis, dental caries
- S. mutans-Alpha/None-Dental caries
- S. mitis-Alpha-Endocarditis
- S. sanguinis-Alpha-Endocarditis
- S. salivarius-Alpha-Opportunistic infections
- S. milleri group (S. anginosus, S. constellatus, S. intermedius)-Variable-Brain/liver/lung abscesses
S. bovis / S. gallolyticusGroup DNone (gamma)-Endocarditis, bacteremia - associated with colon cancer

GENUS 3: Enterococcus (Phylum: Firmicutes)

RankClassification
KingdomBacteria
Division/PhylumFirmicutes
ClassBacilli
OrderLactobacillales
FamilyEnterococcaceae
GenusEnterococcus
SpeciesSubtype/ResistanceKey DiseaseNotes
E. faecalisVSE (vancomycin-sensitive)UTI, endocarditis, bacteremia80-90% of enterococcal infections
E. faeciumVRE (vancomycin-resistant)Nosocomial UTI, bacteremiaMore resistant than E. faecalis; hospital pathogen
E. gallinarumIntrinsic low-level vancomycin resistanceRare infections
E. casseliflavusIntrinsic low-level vancomycin resistanceRare infections
  • Henry's Clinical Diagnosis: "E. faecalis and E. faecium are the most common causes of nosocomial UTI and bacteremia."

GRAM-NEGATIVE BACILLI (GNB) - Complete

FAMILY 1: Enterobacteriaceae / Enterobacterales (Phylum: Proteobacteria)

RankClassification
KingdomBacteria
Division/PhylumProteobacteria
ClassGammaproteobacteria
OrderEnterobacterales
FamilyEnterobacteriaceae
GenusSpeciesSubtypeKey DiseaseKey Feature
EscherichiaE. coliO157:H7 (EHEC)UTI, neonatal meningitis, HUS, traveler's diarrheaMost common GNB; lactose fermenter, oxidase-
ETECTraveler's diarrheaHeat-labile & heat-stable toxins
EPECInfant diarrhea
UPECUTIUropathogenic
KlebsiellaK. pneumoniaeCRKP, ESBL+Hospital pneumonia, UTI, liver abscessMucoid capsule; "currant jelly" sputum
K. oxytocaESBL+UTI, bacteremia
ProteusP. mirabilis-UTI, kidney stones, wound infectionsUrease+, swarming motility, staghorn calculi
P. vulgaris-UTI, wound infections
SalmonellaS. typhi-Typhoid feverNon-lactose fermenter; H2S+
S. paratyphiA, B, CParatyphoid fever
S. enteritidis / typhimuriumMany serovarsFood poisoning, gastroenteritis
ShigellaS. dysenteriaeSerotype 1Bloody dysentery (most severe)Shiga toxin; non-motile
S. flexneri15 serotypesBacillary dysenteryMost common in developing countries
S. sonnei-Mild diarrheaMost common in developed countries
S. boydii-Diarrhea
EnterobacterE. cloacaeAmpC beta-lactamaseNosocomial pneumonia, UTI, bacteremiaInducible AmpC resistance
E. aerogenes (now Klebsiella aerogenes)Hospital infections
SerratiaS. marcescens-Hospital pneumonia, UTI, bacteremiaRed pigment (prodigiosin); IV drug users
CitrobacterC. freundii-UTI, neonatal meningitis, brain abscess
C. koseri-Neonatal brain abscess
ProvidenciaP. stuartii-UTI in catheterized patients
MorganellaM. morganii-UTI, wound infections
YersiniaY. pestisBiovar Orientalis, Antiqua, MedievalisPlague (bubonic, pneumonic, septicemic)Bioterrorism agent
Y. enterocolitica-Enterocolitis, mesenteric adenitisMimics appendicitis
Y. pseudotuberculosis-Mesenteric adenitis

FAMILY 2: Non-Fermentative GNB (Phylum: Proteobacteria)

GenusSpeciesOrder/FamilySubtypeKey DiseaseKey Feature
PseudomonasP. aeruginosaPseudomonadales / PseudomonadaceaeMucoid strains (CF)Burn infections, VAP, cystic fibrosis, hot tub folliculitisOxidase+, blue-green pyocyanin pigment, grape odor
AcinetobacterA. baumanniiPseudomonadales / MoraxellaceaeCRAB (carbapenem-resistant)VAP, wound infections, bacteremia in ICU"ESKAPE" pathogen; survives on surfaces
StenotrophomonasS. maltophiliaXanthomonadales-Pneumonia in immunocompromised, CFIntrinsically resistant to carbapenems
BurkholderiaB. cepacia complexBurkholderialesMultiple genomovarsLung infections in CF patients
B. pseudomallei-MelioidosisEndemic in SE Asia

FAMILY 3: Fastidious GNB (special growth requirements)

GenusSpeciesPhylum/ClassKey DiseaseSpecial Feature
HaemophilusH. influenzaeProteobacteria / PasteurellalesMeningitis (type b), pneumonia, otitisRequires X and V factors; type b has polysaccharide capsule
H. ducreyiChancroid (painful genital ulcer)
LegionellaL. pneumophilaLegionellalesLegionnaire's disease (severe pneumonia), Pontiac feverIntracellular; grows in air conditioning/water systems
BordetellaB. pertussisBurkholderialesWhooping cough (pertussis)Pertussis toxin; "whoop" inspiratory sound
B. parapertussisMilder pertussis
BrucellaB. melitensisRhizobialesBrucellosis (undulant fever)Zoonosis (goats)
B. abortusBrucellosisZoonosis (cattle)
FrancisellaF. tularensisThiotrichalesTularemia ("rabbit fever")Bioterrorism agent; extremely infectious
PasteurellaP. multocidaPasteurellalesWound infections after animal bitesCat/dog bites
BartonellaB. henselaeRhizobialesCat scratch disease, bacillary angiomatosis

FAMILY 4: Curved / Microaerophilic GNB

GenusSpeciesOrder/FamilyKey DiseaseSpecial Feature
CampylobacterC. jejuniCampylobacteralesMost common bacterial diarrhea worldwide; Guillain-Barré syndromeMicroaerophile; comma/S-shaped rods
C. fetusBacteremia in immunocompromised
HelicobacterH. pyloriCampylobacteralesPeptic ulcer disease, gastric cancer, MALT lymphomaUrease+; spiral rods; lives in gastric mucosa
VibrioV. choleraeVibrionalesCholera ("rice water" diarrhea)O1 and O139 serovars cause epidemics
V. parahaemolyticusSeafood-associated gastroenteritisHalophile
V. vulnificusWound infections, septicemiaRaw oysters; fatal in liver disease patients

FAMILY 5: Gram-Negative Cocci & Coccobacilli (related group)

GenusSpeciesKey Disease
NeisseriaN. meningitidisBacterial meningitis, Waterhouse-Friderichsen syndrome
N. gonorrhoeaeGonorrhea, PID, neonatal ophthalmia
MoraxellaM. catarrhalisOtitis media, sinusitis, COPD exacerbations

Master Summary Table

GroupPhylumClassOrderFamilyExample
GPC - StaphylococciFirmicutesBacilliBacillalesStaphylococcaceaeS. aureus, S. epidermidis
GPC - StreptococciFirmicutesBacilliLactobacillalesStreptococcaceaeS. pyogenes, S. pneumoniae
GPC - EnterococciFirmicutesBacilliLactobacillalesEnterococcaceaeE. faecalis, E. faecium
GNB - EnterobacteralesProteobacteriaGammaproteobacteriaEnterobacteralesEnterobacteriaceaeE. coli, Klebsiella, Salmonella
GNB - Non-fermentersProteobacteriaGammaproteobacteriaPseudomonadalesPseudomonadaceae / MoraxellaceaeP. aeruginosa, A. baumannii
GNB - FastidiousProteobacteriaVariousVariousVariousH. influenzae, Legionella
GNB - CurvedProteobacteriaEpsilonproteobacteriaCampylobacteralesCampylobacteraceaeCampylobacter, H. pylori
Sources: Henry's Clinical Diagnosis and Management by Laboratory Methods, p. 63-71; Red Book 2021, p. 2421; Medical Microbiology 9e; Jawetz, Melnick & Adelberg's Medical Microbiology 28e

Create a comparative PDF chart of GPC vs GNB antibiotic susceptibility

Reading File
Finding Sources
Running Command

mkdir -p /home/daytona/workspace/gpc-gnb-chart && ls /home/daytona/workspace/gpc-gnb-chart

Writing File

~/gpc-gnb-chart/generate_chart.py

from reportlab.lib.pagesizes import A3, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Table, TableStyle, Paragraph,
    Spacer, HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import PageBreak

OUTPUT = "/home/daytona/workspace/gpc-gnb-chart/GPC_vs_GNB_Antibiotic_Susceptibility.pdf"

# ── Colours ──────────────────────────────────────────────────────────────────
DARK_BLUE   = colors.HexColor("#1a3a5c")
MID_BLUE    = colors.HexColor("#2e6da4")
LIGHT_BLUE  = colors.HexColor("#d0e4f7")
PALE_BLUE   = colors.HexColor("#eaf3fb")

DARK_RED    = colors.HexColor("#8b1a1a")
MID_RED     = colors.HexColor("#c0392b")
LIGHT_RED   = colors.HexColor("#fdd5d0")
PALE_RED    = colors.HexColor("#fff0ee")

DARK_GREEN  = colors.HexColor("#1a5c2e")
LIGHT_GREEN = colors.HexColor("#d4edda")

DARK_ORANGE = colors.HexColor("#7d4e00")
LIGHT_ORANGE= colors.HexColor("#fff3cd")

GREY_HEADER = colors.HexColor("#2c3e50")
LIGHT_GREY  = colors.HexColor("#f2f4f6")
WHITE       = colors.white
BLACK       = colors.black

# Susceptibility cell colours
S_COLOR  = colors.HexColor("#27ae60")   # Susceptible  - green
R_COLOR  = colors.HexColor("#e74c3c")   # Resistant    - red
V_COLOR  = colors.HexColor("#f39c12")   # Variable     - amber
I_COLOR  = colors.HexColor("#8e44ad")   # Intermediate - purple
NA_COLOR = colors.HexColor("#95a5a6")   # N/A          - grey

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=landscape(A3),
    leftMargin=1.2*cm, rightMargin=1.2*cm,
    topMargin=1.5*cm,  bottomMargin=1.5*cm,
    title="GPC vs GNB Antibiotic Susceptibility Chart",
    author="Orris Medical Reference"
)

styles = getSampleStyleSheet()

def style(name, **kw):
    s = ParagraphStyle(name, parent=styles["Normal"], **kw)
    return s

title_style = style("Title2", fontSize=20, fontName="Helvetica-Bold",
                    textColor=WHITE, alignment=TA_CENTER, spaceAfter=4)
subtitle_style = style("Sub", fontSize=11, fontName="Helvetica",
                       textColor=colors.HexColor("#ccddee"), alignment=TA_CENTER)
section_style = style("Sec", fontSize=13, fontName="Helvetica-Bold",
                      textColor=WHITE, alignment=TA_CENTER)
cell_hdr = style("CH", fontSize=8.5, fontName="Helvetica-Bold",
                 textColor=WHITE, alignment=TA_CENTER, leading=10)
cell_body = style("CB", fontSize=7.5, fontName="Helvetica",
                  textColor=BLACK, alignment=TA_LEFT, leading=9)
cell_center = style("CC", fontSize=7.5, fontName="Helvetica",
                    textColor=BLACK, alignment=TA_CENTER, leading=9)
legend_style = style("Leg", fontSize=8, fontName="Helvetica",
                     textColor=BLACK, alignment=TA_LEFT)
note_style = style("Note", fontSize=7.5, fontName="Helvetica-Oblique",
                   textColor=colors.HexColor("#555555"), alignment=TA_CENTER)

# ── Helper: coloured susceptibility cell ─────────────────────────────────────
def sc(text, bg=None):
    """Return a (Paragraph, bg_color) tuple for susceptibility cells."""
    mapping = {
        "S":  (S_COLOR,  WHITE, "S"),
        "R":  (R_COLOR,  WHITE, "R"),
        "V":  (V_COLOR,  WHITE, "V"),
        "I":  (I_COLOR,  WHITE, "I"),
        "S*": (colors.HexColor("#1e8449"), WHITE, "S*"),
        "R*": (colors.HexColor("#b03a2e"), WHITE, "R*"),
        "V*": (colors.HexColor("#d68910"), WHITE, "V*"),
        "-":  (NA_COLOR, WHITE, "-"),
    }
    if text in mapping:
        bg_col, fg_col, label = mapping[text]
        p = Paragraph(f"<b>{label}</b>",
                      style("SC", fontSize=8, fontName="Helvetica-Bold",
                            textColor=fg_col, alignment=TA_CENTER, leading=10))
        return p, bg_col
    p = Paragraph(text, cell_center)
    return p, (bg if bg else WHITE)

# ── Data definition ──────────────────────────────────────────────────────────
# Columns: Antibiotic | Class | S.aureus(MSSA) | S.aureus(MRSA) | S.pyogenes |
#          S.pneumoniae | E.faecalis | E.faecium(VRE) ||
#          E.coli | Klebsiella | Pseudomonas | Acinetobacter | Salmonella | H.influenzae

# Key: S=Susceptible, R=Resistant, V=Variable, I=Intermediate, -=Not applicable / not used
# S* / V* / R* = with caveats (footnote)

ABX_DATA = [
    # [Antibiotic, Drug Class,
    #   MSSA, MRSA, S.pyo, S.pneu, E.fae, E.fae(VRE),
    #   E.coli, Klebsiella, Pseudomonas, Acinetobacter, Salmonella, H.influenzae]
    # ── Beta-lactams ──────────────────────────────────────────────
    ["Penicillin G", "Natural Penicillin",
     "S","R","S","V*","S","-",
     "R","R","R","R","R","R"],
    ["Amoxicillin", "Aminopenicillin",
     "S","R","S","S","S","-",
     "V","R","R","R","V","V"],
    ["Amoxicillin-Clavulanate", "Beta-lactam + Inhibitor",
     "S","R","S","S","S","-",
     "S","S","R","V","V","S"],
    ["Nafcillin / Oxacillin", "Antistaphylococcal PCN",
     "S","R","S","S","R","R",
     "R","R","R","R","R","R"],
    ["Piperacillin-Tazobactam", "Extended PCN + Inhibitor",
     "S","R","S","S","S","-",
     "S","S","V","V","S","S"],
    ["Cefazolin (1st gen)", "1st-Gen Cephalosporin",
     "S","R","S","S","R","R",
     "S","S","R","R","V","V"],
    ["Ceftriaxone (3rd gen)", "3rd-Gen Cephalosporin",
     "S","R","S","S","R","R",
     "S","S","R","R","S","S"],
    ["Ceftazidime (3rd gen)", "3rd-Gen Cephalosporin (anti-Pseudo)",
     "R","R","R","R","R","R",
     "S","S","S","V","S","S"],
    ["Cefepime (4th gen)", "4th-Gen Cephalosporin",
     "S","R","S","S","R","R",
     "S","S","S","V","S","S"],
    ["Ceftaroline (5th gen)", "5th-Gen Cephalosporin (anti-MRSA)",
     "S","S","S","S","R","R",
     "S","S","R","R","S","S"],
    ["Imipenem/Meropenem", "Carbapenem",
     "S","R","S","S","S","R",
     "S","S","V","V","S","S"],
    ["Ertapenem", "Carbapenem (no Pseudo)",
     "S","R","S","S","S","R",
     "S","S","R","V","S","S"],
    ["Aztreonam", "Monobactam",
     "R","R","R","R","R","R",
     "S","S","S","V","S","S"],
    # ── Glycopeptides ──────────────────────────────────────────────
    ["Vancomycin", "Glycopeptide",
     "S","S","S","S","S","R",
     "R","R","R","R","R","R"],
    ["Teicoplanin", "Glycopeptide",
     "S","S","S","S","S","R",
     "R","R","R","R","R","R"],
    # ── Lipopeptide ────────────────────────────────────────────────
    ["Daptomycin", "Lipopeptide",
     "S","S","S","S","S","V",
     "R","R","R","R","R","R"],
    # ── Oxazolidinones ─────────────────────────────────────────────
    ["Linezolid", "Oxazolidinone",
     "S","S","S","S","S","S",
     "R","R","R","R","R","R"],
    ["Tedizolid", "Oxazolidinone (2nd gen)",
     "S","S","S","S","S","S",
     "R","R","R","R","R","R"],
    # ── Aminoglycosides ────────────────────────────────────────────
    ["Gentamicin", "Aminoglycoside",
     "S","V","V","R","V*","V*",
     "S","S","S","V","V","V"],
    ["Amikacin", "Aminoglycoside",
     "S","V","V","R","V*","V*",
     "S","S","S","V","V","S"],
    # ── Fluoroquinolones ───────────────────────────────────────────
    ["Ciprofloxacin", "Fluoroquinolone",
     "S","R","V","R","V","V",
     "S","S","S","V","V","S"],
    ["Levofloxacin", "Respiratory FQ",
     "S","R","S","S","S","V",
     "S","S","S","V","S","S"],
    ["Moxifloxacin", "Respiratory FQ",
     "S","R","S","S","S","V",
     "S","S","R","V","S","S"],
    # ── Macrolides ─────────────────────────────────────────────────
    ["Azithromycin", "Macrolide",
     "V","R","S","V","R","R",
     "R","R","R","R","V","S"],
    ["Erythromycin", "Macrolide",
     "V","R","S","V","R","R",
     "R","R","R","R","R","R"],
    # ── Tetracyclines ──────────────────────────────────────────────
    ["Doxycycline", "Tetracycline",
     "S","V","S","S","V","V",
     "V","V","R","V","V","R"],
    ["Tigecycline", "Glycylcycline",
     "S","S","S","S","S","S",
     "S","S","R","S","S","S"],
    # ── Folate Inhibitors ──────────────────────────────────────────
    ["TMP-SMX", "Sulfonamide Combo",
     "S","V","V","V","R","R",
     "V","V","R","V","V","V"],
    # ── Other ──────────────────────────────────────────────────────
    ["Clindamycin", "Lincosamide",
     "S","V","S","S","R","R",
     "R","R","R","R","R","R"],
    ["Metronidazole", "Nitroimidazole",
     "R","R","R","R","R","R",
     "R","R","R","R","R","R"],
    ["Rifampicin", "Rifamycin",
     "S","S","S","S","V","V",
     "R","R","R","R","R","R"],
    ["Colistin / Polymyxin B", "Polymyxin",
     "R","R","R","R","R","R",
     "S","S","S","S","S","R"],
    ["Nitrofurantoin", "Nitrofuran",
     "S","S","S","V","S","R",
     "S","V","R","R","R","R"],
    ["Fosfomycin", "Phosphonic acid",
     "S","S","V","V","S","V",
     "S","V","V","R","V","V"],
]

# Column widths (landscape A3 = 420 x 297mm, usable ~397mm)
# Antibiotic(90), Class(80), then 12 organism cols each 19mm => 228mm => total 398mm
COL_W = [90, 80] + [19]*12
page_w = sum(COL_W)

# ── Build table rows ─────────────────────────────────────────────────────────
def hdr(txt, bg, fg=WHITE, size=8):
    return Paragraph(f"<b>{txt}</b>",
                     style("H", fontSize=size, fontName="Helvetica-Bold",
                           textColor=fg, alignment=TA_CENTER, leading=9))

# Row 0: mega header
R0 = [
    hdr("ANTIBIOTIC", GREY_HEADER, size=9),
    hdr("DRUG CLASS", GREY_HEADER, size=9),
    hdr("GRAM-POSITIVE COCCI (GPC)", MID_BLUE, size=10),
    Paragraph(""), Paragraph(""), Paragraph(""), Paragraph(""), Paragraph(""),
    hdr("GRAM-NEGATIVE BACILLI (GNB)", MID_RED, size=10),
    Paragraph(""), Paragraph(""), Paragraph(""), Paragraph(""), Paragraph(""),
]

# Row 1: organism names
org_names_gpc = ["S. aureus\n(MSSA)", "S. aureus\n(MRSA)", "S. pyogenes\n(GAS)",
                 "S. pneumoniae", "E. faecalis", "E. faecium\n(VRE)"]
org_names_gnb = ["E. coli", "Klebsiella\npneumoniae", "Pseudomonas\naeruginosa",
                 "Acinetobacter\nbaumannii", "Salmonella\nspp.", "H. influenzae"]

R1 = [hdr("ANTIBIOTIC", DARK_BLUE, size=8),
      hdr("CLASS", DARK_BLUE, size=8)]
for n in org_names_gpc:
    R1.append(hdr(n, MID_BLUE, size=7.5))
for n in org_names_gnb:
    R1.append(hdr(n, MID_RED, size=7.5))

# Data rows
data_rows = []
style_commands = []
row_idx = 2  # rows 0,1 are headers

for i, row in enumerate(ABX_DATA):
    abx, cls = row[0], row[1]
    sus_vals = row[2:]  # 12 values

    tr = [
        Paragraph(f"<b>{abx}</b>",
                  style("A", fontSize=8, fontName="Helvetica-Bold",
                        textColor=DARK_BLUE, alignment=TA_LEFT, leading=10)),
        Paragraph(cls,
                  style("C", fontSize=7.5, fontName="Helvetica-Oblique",
                        textColor=colors.HexColor("#333333"), alignment=TA_LEFT, leading=9)),
    ]
    for j, val in enumerate(sus_vals):
        p, bg = sc(val)
        tr.append(p)
        col = 2 + j
        bg_key = f"bg_{row_idx}_{col}"
        style_commands.append(("BACKGROUND", (col, row_idx), (col, row_idx), bg))

    row_bg = PALE_BLUE if i % 2 == 0 else WHITE
    style_commands.append(("BACKGROUND", (0, row_idx), (1, row_idx), row_bg))
    data_rows.append(tr)
    row_idx += 1

all_rows = [R0, R1] + data_rows

# ── Table style ──────────────────────────────────────────────────────────────
base_style = [
    # Spanning
    ("SPAN", (2, 0), (7, 0)),    # GPC header spans cols 2-7
    ("SPAN", (8, 0), (13, 0)),   # GNB header spans cols 8-13
    ("SPAN", (0, 0), (0, 1)),    # Antibiotic header spans rows 0-1
    ("SPAN", (1, 0), (1, 1)),    # Class header spans rows 0-1

    # Fonts / alignment
    ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
    ("ALIGN",  (0, 0), (-1, -1), "CENTER"),
    ("ALIGN",  (0, 2), (1, -1),  "LEFT"),

    # Grid
    ("GRID",      (0, 0), (-1, -1), 0.4, colors.HexColor("#aaaaaa")),
    ("LINEBELOW", (0, 1), (-1, 1),  1.2, DARK_BLUE),

    # Row 0 backgrounds
    ("BACKGROUND", (0, 0), (1, 1),   GREY_HEADER),
    ("BACKGROUND", (2, 0), (7, 0),   MID_BLUE),
    ("BACKGROUND", (2, 1), (7, 1),   DARK_BLUE),
    ("BACKGROUND", (8, 0), (13, 0),  MID_RED),
    ("BACKGROUND", (8, 1), (13, 1),  DARK_RED),

    # Vertical separator between GPC and GNB
    ("LINEAFTER", (7, 0), (7, -1), 2, GREY_HEADER),

    # Row heights
    ("ROWBACKGROUNDS", (0, 2), (-1, -1), [PALE_BLUE, WHITE]),

    # Padding
    ("TOPPADDING",    (0, 0), (-1, -1), 4),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 4),
    ("LEFTPADDING",   (0, 0), (-1, -1), 3),
    ("RIGHTPADDING",  (0, 0), (-1, -1), 3),
]

ts = TableStyle(base_style + style_commands)

t = Table(all_rows, colWidths=COL_W, repeatRows=2)
t.setStyle(ts)

# ── Legend ────────────────────────────────────────────────────────────────────
legend_items = [
    (S_COLOR,  "S  = Susceptible (typically effective)"),
    (R_COLOR,  "R  = Resistant (not effective)"),
    (V_COLOR,  "V  = Variable (depends on strain/resistance pattern)"),
    (I_COLOR,  "I   = Intermediate / reduced susceptibility"),
    (NA_COLOR, "-   = Not applicable / not used clinically"),
]

def legend_row(col, label):
    box = Table([[""]], colWidths=[12], rowHeights=[12])
    box.setStyle(TableStyle([("BACKGROUND",(0,0),(0,0),col),
                              ("GRID",(0,0),(0,0),0.5,colors.grey)]))
    return [box, Paragraph(f"  {label}", legend_style)]

leg_data = [legend_row(c, l) for c, l in legend_items]
# Build as a single-row horizontal legend
leg_cells = []
for c, l in legend_items:
    box = Table([[""]], colWidths=[10], rowHeights=[10])
    box.setStyle(TableStyle([("BACKGROUND",(0,0),(0,0),c),
                              ("GRID",(0,0),(0,0),0.5,colors.grey)]))
    leg_cells.append(box)
    leg_cells.append(Paragraph(f" {l}   ", legend_style))

leg_table = Table([leg_cells], colWidths=([12,120]*5))
leg_table.setStyle(TableStyle([
    ("VALIGN",(0,0),(-1,-1),"MIDDLE"),
    ("ALIGN", (0,0),(-1,-1),"LEFT"),
    ("TOPPADDING",(0,0),(-1,-1),3),
    ("BOTTOMPADDING",(0,0),(-1,-1),3),
]))

notes = [
    "* V for penicillin against S. pneumoniae: susceptibility varies by site (meningitis requires higher MIC breakpoints).",
    "* Gentamicin/Amikacin used synergistically with beta-lactams for enterococcal endocarditis (not monotherapy).",
    "* MRSA = Methicillin-Resistant S. aureus; VRE = Vancomycin-Resistant Enterococcus; ESBL/CRKP strains may show further resistance.",
    "* Pseudomonas aeruginosa is intrinsically resistant to many antibiotics; always verify local antibiogram.",
    "* This chart reflects general/typical susceptibility patterns. Always consult local antibiogram and culture/sensitivity results.",
]

# ── Assemble document ─────────────────────────────────────────────────────────
elements = []

# Page title banner
title_table = Table(
    [[Paragraph("GPC vs GNB", title_style)],
     [Paragraph("Comparative Antibiotic Susceptibility Reference Chart", subtitle_style)],
     [Paragraph("Gram-Positive Cocci (GPC)  |  Gram-Negative Bacilli (GNB)  •  Orris Medical Reference 2026", subtitle_style)]],
    colWidths=[page_w]
)
title_table.setStyle(TableStyle([
    ("BACKGROUND", (0,0),(0,2), DARK_BLUE),
    ("TOPPADDING", (0,0),(0,2), 6),
    ("BOTTOMPADDING",(0,0),(0,2), 6),
    ("LEFTPADDING", (0,0),(0,2), 8),
    ("RIGHTPADDING",(0,0),(0,2), 8),
]))

elements.append(title_table)
elements.append(Spacer(1, 6))
elements.append(t)
elements.append(Spacer(1, 6))

# Legend box
leg_outer = Table(
    [[Paragraph("<b>LEGEND:</b>", style("LT", fontSize=8.5, fontName="Helvetica-Bold",
                                        textColor=GREY_HEADER, alignment=TA_LEFT)),
      leg_table]],
    colWidths=[55, page_w - 55]
)
leg_outer.setStyle(TableStyle([
    ("BACKGROUND",(0,0),(-1,-1), LIGHT_GREY),
    ("BOX",(0,0),(-1,-1), 0.8, colors.HexColor("#aaaaaa")),
    ("VALIGN",(0,0),(-1,-1),"MIDDLE"),
    ("TOPPADDING",(0,0),(-1,-1),5),
    ("BOTTOMPADDING",(0,0),(-1,-1),5),
    ("LEFTPADDING",(0,0),(-1,-1),6),
]))
elements.append(leg_outer)
elements.append(Spacer(1, 5))

for note in notes:
    elements.append(Paragraph(f"<i>{note}</i>", note_style))
    elements.append(Spacer(1, 2))

doc.build(elements)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/gpc-gnb-chart && python generate_chart.py 2>&1

Running Command

ls -lh /home/daytona/workspace/gpc-gnb-chart/

Your PDF is ready:

GPC vs GNB Antibiotic Susceptibility

PDF Document · PDF


What's Inside the Chart

Format: Landscape A3, single-page reference chart
Organisms covered (12 total):
GPC (6)GNB (6)
S. aureus MSSAE. coli
S. aureus MRSAKlebsiella pneumoniae
S. pyogenes (GAS)Pseudomonas aeruginosa
S. pneumoniaeAcinetobacter baumannii
E. faecalisSalmonella spp.
E. faecium (VRE)H. influenzae
Antibiotics covered (34 drugs across 12 classes):
  • Beta-lactams (Penicillins, Cephalosporins 1st-5th gen, Carbapenems, Monobactam)
  • Glycopeptides (Vancomycin, Teicoplanin)
  • Lipopeptides (Daptomycin)
  • Oxazolidinones (Linezolid, Tedizolid)
  • Aminoglycosides
  • Fluoroquinolones
  • Macrolides
  • Tetracyclines / Glycylcyclines
  • Folate inhibitors (TMP-SMX)
  • Lincosamides, Rifamycins, Polymyxins, Nitrofurans, Fosfomycin
Color coding:
  • 🟢 S = Susceptible
  • 🔴 R = Resistant
  • 🟡 V = Variable
  • 🟣 I = Intermediate
  • - = Not applicable
Clinical footnotes at the bottom cover MRSA, VRE, ESBL caveats, and the reminder to always verify with local antibiogram.

gnb Genus Species Phylum/Class Special Feature Key Disease

Comprehensive GNB reference with Genus, Species, Phylum/Class, Special Feature, and Key Disease - pulling all data from the medical library.
Searching sources...
Finding Sources
Finding Sources
Reading File
Finding Sources
Now I'll create a comprehensive GNB reference table with all the details:
Generating Image

A detailed professional medical reference table for Gram-Negative Bacilli (GNB). The table should show 40+ clinically relevant species organized by category. Table with 5 columns: - Column 1: GENUS (bold, left-aligned) - Column 2: SPECIES (italicized, left-aligned) - Column 3: PHYLUM/CLASS (smaller text, center) - Column 4: SPECIAL FEATURE (concise, left-aligned) - Column 5: KEY DISEASE (left-aligned) Organize into sections with color-coded category headers: SECTION 1 - ENTEROBACTERIACEAE (FAMILY ENTEROBACTERALES, PHYLUM PROTEOBACTERIA, CLASS GAMMAPROTEOBACTERIA) - Blue header - Escherichia | E. coli | Gamma | Oxidase-, lactose ferment | UTI, neonatal meningitis, diarrhea, HUS - Escherichia | E. coli O157:H7 | Gamma | Shiga toxin producer | Hemolytic uremic syndrome - Klebsiella | K. pneumoniae | Gamma | Mucoid capsule, non-motile | Hospital pneumonia, UTI, liver abscess - Klebsiella | K. oxytoca | Gamma | ESBL producer | UTI, bacteremia - Proteus | P. mirabilis | Gamma | Urease+, swarming | Staghorn calculi, UTI - Proteus | P. vulgaris | Gamma | Urease+, indole+ | UTI, wound infections - Morganella | M. morganii | Gamma | Urease+, indole+ | UTI, wound infection - Salmonella | S. typhi | Gamma | Non-lactose ferment, H2S+ | Typhoid fever (systemic) - Salmonella | S. paratyphi | Gamma | Non-lactose ferment | Paratyphoid fever - Salmonella | S. enteritidis | Gamma | Food pathogen | Foodborne gastroenteritis - Salmonella | S. typhimurium | Gamma | Multiple serovars | Foodborne gastroenteritis - Shigella | S. dysenteriae | Gamma | Non-motile, Shiga toxin | Severe bloody dysentery - Shigella | S. flexneri | Gamma | 15 serotypes | Bacillary dysentery - Shigella | S. sonnei | Gamma | Non-motile | Mild diarrhea - Shigella | S. boydii | Gamma | Non-motile | Diarrhea - Yersinia | Y. pestis | Gamma | Biofilm | PLAGUE (bubonic/pneumonic/septicemic) - Yersinia | Y. enterocolitica | Gamma | Psychrophilic | Enterocolitis, mesenteric adenitis - Yersinia | Y. pseudotuberculosis | Gamma | Cold-loving | Mesenteric adenitis, mimics appendicitis - Enterobacter | E. cloacae | Gamma | AmpC beta-lactamase | Nosocomial infections - Enterobacter | E. aerogenes | Gamma | AmpC producer | Hospital-acquired infections - Serratia | S. marcescens | Gamma | Red pigment | Hospital infections, IV drug users - Citrobacter | C. freundii | Gamma | ESBL producer | UTI, neonatal meningitis - Citrobacter | C. koseri | Gamma | Meningitis risk | Neonatal brain abscess - Providencia | P. stuartii | Gamma | Urease+ | UTI in catheterized patients - Hafnia | H. alvei | Gamma | Lactose delayed | Rarely pathogenic SECTION 2 - NON-FERMENTATIVE GRAM-NEGATIVE BACILLI - Red header - Pseudomonas | P. aeruginosa | Gamma | Oxidase+, blue-green pigment, mucoid | Burn/wound infections, VAP, CF lung disease - Pseudomonas | P. fluorescens | Gamma | Oxidase+, fluorescence | Environmental contaminant - Pseudomonas | P. putida | Gamma | Oxidase+ | Environmental - Acinetobacter | A. baumannii | Gamma | Oxidase-, CRAB strains | Hospital VAP, wound infections - Acinetobacter | A. lwoffii | Gamma | Oxidase- | Opportunistic - Stenotrophomonas | S. maltophilia | Xanthomonas (class) | Oxidase-, carbapenem-resistant | CF pneumonia, VAP in ICU - Burkholderia | B. cepacia | Burkholderiales | Multiple genomovars | CF lung colonization - Burkholderia | B. pseudomallei | Burkholderiales | Bipolar staining | Melioidosis (endemic SE Asia) SECTION 3 - FASTIDIOUS GRAM-NEGATIVE BACILLI - Orange header - Haemophilus | H. influenzae | Pasteurellales | Requires X & V factors, type b has capsule | Meningitis, pneumonia, epiglottitis - Haemophilus | H. ducreyi | Pasteurellales | Gram-negative bacillus | Chancroid (STI) - Legionella | L. pneumophila | Legionellales | Intracellular, water systems | Legionnaire's disease, Pontiac fever - Bordetella | B. pertussis | Burkholderiales | Pertussis toxin producer | Whooping cough (pertussis) - Bordetella | B. parapertussis | Burkholderiales | Mild toxin | Parapertussis (milder) - Brucella | B. melitensis | Rhizobiales | Zoonosis (goats) | Brucellosis (undulant fever) - Brucella | B. abortus | Rhizobiales | Zoonosis (cattle) | Brucellosis - Francisella | F. tularensis | Thiotrichales | Bioterror agent, highly infectious | Tularemia (rabbit fever) - Pasteurella | P. multocida | Pasteurellales | Animal bite wound pathogen | Cat/dog bite infections - Bartonella | B. henselae | Rhizobiales | Cat flea vector | Cat scratch disease, bacillary angiomatosis SECTION 4 - CURVED/SPIRAL GRAM-NEGATIVE BACILLI - Purple header - Campylobacter | C. jejuni | Epsilonproteobacteria | Microaerophile, comma-shaped | Most common bacterial diarrhea - Campylobacter | C. fetus | Epsilonproteobacteria | Microaerophile, S-shaped | Bacteremia in elderly/immunocompromised - Helicobacter | H. pylori | Epsilonproteobacteria | Urease+, spiral, lives in stomach | Peptic ulcer, gastric cancer, MALT lymphoma - Vibrio | V. cholerae | Vibrionales | O1 & O139 epidemic strains | Cholera (rice-water diarrhea) - Vibrio | V. parahaemolyticus | Vibrionales | Halophile (salt-loving) | Seafood-associated gastroenteritis - Vibrio | V. vulnificus | Vibrionales | Highly virulent | Raw oyster infections, septicemia SECTION 5 - GRAM-NEGATIVE COCCI / COCCOBACILLI - Green header - Neisseria | N. meningitidis | Gammaproteobacteria | Gram-negative diplococcus | Bacterial meningitis, septicemia - Neisseria | N. gonorrhoeae | Gammaproteobacteria | Gram-negative diplococcus | Gonorrhea, PID, neonatal ophthalmia - Moraxella | M. catarrhalis | Gammaproteobacteria | Gram-negative diplococcus | Otitis media, sinusitis, COPD exacerbation Use white background. Section headers bold, full-width color bands. Alternate row shading (very light grey/white) for readability. Professional, high-contrast layout. Include a footer: "Data source: Henry's Clinical Diagnosis & Laboratory Methods, Red Book 2021, Medical Microbiology 9e. *Phylum = Proteobacteria unless noted; Class = Gammaproteobacteria unless noted."

!

400, message: Got more than 4194304 bytes when reading: b'data: {"candidates": [{"content": {"role": "model","parts": [{"inlineData": {"mimeType": "image/png"...'.

We encountered an error while processing your request. Please try again or reach out to us for help.

gnb Group Phylum Class Order Family species Key Disease

Full GNB taxonomy table - Group → Phylum → Class → Order → Family → Species → Key Disease, formatted as a comprehensive visual reference.
Searching sources...
Finding Sources
I have all the taxonomy data needed from the previous queries. Let me build the complete table now as a downloadable PDF.
Writing File

~/gpc-gnb-chart/gnb_taxonomy.py

from reportlab.lib.pagesizes import A3, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT

OUTPUT = "/home/daytona/workspace/gpc-gnb-chart/GNB_Full_Taxonomy_Table.pdf"

# ── Palette ──────────────────────────────────────────────────────────────────
NAVY       = colors.HexColor("#0d2b45")
BLUE_H     = colors.HexColor("#1a5276")
BLUE_L     = colors.HexColor("#d6eaf8")
BLUE_P     = colors.HexColor("#eaf4fb")

RED_H      = colors.HexColor("#922b21")
RED_L      = colors.HexColor("#fadbd8")
RED_P      = colors.HexColor("#fef9f9")

GREEN_H    = colors.HexColor("#1e8449")
GREEN_L    = colors.HexColor("#d5f5e3")
GREEN_P    = colors.HexColor("#f0faf4")

ORANGE_H   = colors.HexColor("#784212")
ORANGE_L   = colors.HexColor("#fdebd0")
ORANGE_P   = colors.HexColor("#fef9f4")

PURPLE_H   = colors.HexColor("#4a235a")
PURPLE_L   = colors.HexColor("#e8daef")
PURPLE_P   = colors.HexColor("#faf5fc")

TEAL_H     = colors.HexColor("#0e6655")
TEAL_L     = colors.HexColor("#d1f2eb")
TEAL_P     = colors.HexColor("#f0faf8")

GREY_H     = colors.HexColor("#2c3e50")
GREY_L     = colors.HexColor("#f2f3f4")
WHITE      = colors.white
BLACK      = colors.black

def st(name, **kw):
    base = getSampleStyleSheet()["Normal"]
    return ParagraphStyle(name, parent=base, **kw)

# Paragraph styles
TH = st("TH", fontSize=8, fontName="Helvetica-Bold",
        textColor=WHITE, alignment=TA_CENTER, leading=10)
TD_L = st("TDL", fontSize=7.5, fontName="Helvetica",
          textColor=BLACK, alignment=TA_LEFT, leading=9)
TD_I = st("TDI", fontSize=7.5, fontName="Helvetica-Oblique",
          textColor=colors.HexColor("#1a3a5c"), alignment=TA_LEFT, leading=9)
TD_C = st("TDC", fontSize=7.5, fontName="Helvetica",
          textColor=BLACK, alignment=TA_CENTER, leading=9)
SEC_H = st("SEC", fontSize=9.5, fontName="Helvetica-Bold",
           textColor=WHITE, alignment=TA_CENTER, leading=12)
NOTE = st("NOTE", fontSize=7, fontName="Helvetica-Oblique",
          textColor=colors.HexColor("#555555"), alignment=TA_LEFT, leading=9)

def p(text, style): return Paragraph(text, style)
def ph(text): return p(text, TH)
def pl(text): return p(text, TD_L)
def pi(text): return p(text, TD_I)
def pc(text): return p(text, TD_C)
def pb(text): return p(f"<b>{text}</b>", TD_L)

# ── Column widths (landscape A3 usable ~397mm) ───────────────────────────────
# Group | Phylum | Class | Order | Family | Species | Key Disease
CW = [38, 45, 60, 52, 58, 65, 110]   # mm
# total = 428 → slightly over; reduce
CW = [35, 42, 58, 50, 55, 62, 108]   # ≈ 410mm

# ── Header row ────────────────────────────────────────────────────────────────
HDR = [ph("GROUP"), ph("PHYLUM"), ph("CLASS"),
       ph("ORDER"), ph("FAMILY"), ph("SPECIES"), ph("KEY DISEASE")]

# ── Section header helper ─────────────────────────────────────────────────────
def sec(label, bg, n_cols=7):
    row = [p(f"<b>{label}</b>", SEC_H)] + [p("", SEC_H)] * (n_cols - 1)
    return row, bg

# ── Data ──────────────────────────────────────────────────────────────────────
# Each tuple: (group, phylum, class_, order, family, species_italic, disease)
# ─── 1. Enterobacteriaceae ────────────────────────────────────────────────────
ENTERO = [
    ("Enteric\nFermenters", "Pseudomonadota\n(Proteobacteria)", "Gamma-\nproteobacteria",
     "Enterobacterales", "Enterobacteriaceae",
     "Escherichia coli", "UTI, neonatal meningitis, diarrhea (ETEC/EHEC), HUS (O157:H7)"),
    ("", "", "", "", "",
     "Klebsiella pneumoniae", "Hospital-acquired pneumonia, UTI, liver abscess; ESBL/CRKP strains"),
    ("", "", "", "", "",
     "Klebsiella oxytoca", "UTI, bacteremia; ESBL-producing strains"),
    ("", "", "", "", "",
     "Proteus mirabilis", "UTI, staghorn kidney calculi; swarming, urease+"),
    ("", "", "", "", "",
     "Proteus vulgaris", "UTI, wound infections; indole+"),
    ("", "", "", "", "",
     "Morganella morganii", "UTI, wound infections; nosocomial"),
    ("", "", "", "", "",
     "Providencia stuartii", "UTI in catheterised patients; aminoglycoside-resistant"),
    ("", "", "", "", "",
     "Enterobacter cloacae", "Nosocomial pneumonia, UTI, bacteremia; AmpC β-lactamase"),
    ("", "", "", "", "",
     "Enterobacter aerogenes\n(Klebsiella aerogenes)", "Hospital infections; AmpC producer"),
    ("", "", "", "", "",
     "Serratia marcescens", "Hospital pneumonia, UTI; red pigment (prodigiosin); IV drug users"),
    ("", "", "", "", "",
     "Citrobacter freundii", "UTI, neonatal meningitis; ESBL producer"),
    ("", "", "", "", "",
     "Citrobacter koseri", "Neonatal brain abscess; meningitis risk"),
    ("", "", "", "", "",
     "Hafnia alvei", "Rare opportunist; gastroenteritis"),
]

SALMONELLA = [
    ("Salmonella /\nShigella\n(Enteric)", "Pseudomonadota", "Gamma-\nproteobacteria",
     "Enterobacterales", "Enterobacteriaceae",
     "Salmonella typhi", "Typhoid fever (enteric fever); rose spots, hepatosplenomegaly"),
    ("", "", "", "", "",
     "Salmonella paratyphi A/B/C", "Paratyphoid fever"),
    ("", "", "", "", "",
     "Salmonella enteritidis", "Foodborne gastroenteritis (poultry/eggs)"),
    ("", "", "", "", "",
     "Salmonella typhimurium", "Foodborne gastroenteritis; bacteremia in sickle cell"),
    ("", "", "", "", "",
     "Shigella dysenteriae", "Severe bloody dysentery; Shiga toxin; HUS risk"),
    ("", "", "", "", "",
     "Shigella flexneri", "Bacillary dysentery; most common in developing countries"),
    ("", "", "", "", "",
     "Shigella sonnei", "Mild diarrhea; most common in developed countries"),
    ("", "", "", "", "",
     "Shigella boydii", "Diarrhea; endemic in Indian subcontinent"),
]

YERSINIA = [
    ("Yersinia", "Pseudomonadota", "Gamma-\nproteobacteria",
     "Enterobacterales", "Yersiniaceae",
     "Yersinia pestis", "PLAGUE: bubonic / pneumonic / septicemic; bioterrorism agent"),
    ("", "", "", "", "",
     "Yersinia enterocolitica", "Enterocolitis, mesenteric adenitis (mimics appendicitis)"),
    ("", "", "", "", "",
     "Yersinia pseudotuberculosis", "Mesenteric adenitis; Kawasaki-like syndrome in children"),
]

# ─── 2. Non-fermenters ────────────────────────────────────────────────────────
NONFERMENT = [
    ("Non-\nFermentative\nGNB", "Pseudomonadota", "Gamma-\nproteobacteria",
     "Pseudomonadales", "Pseudomonadaceae",
     "Pseudomonas aeruginosa", "Burn/wound infections, VAP, CF lung disease, hot-tub folliculitis; oxidase+, pyocyanin"),
    ("", "", "", "", "Pseudomonadaceae",
     "Pseudomonas fluorescens", "Rare opportunist; blood product contamination"),
    ("", "", "Gamma-\nproteobacteria",
     "Pseudomonadales", "Moraxellaceae",
     "Acinetobacter baumannii", "VAP, wound infections; CRAB strains; survives on dry surfaces"),
    ("", "", "", "", "Moraxellaceae",
     "Acinetobacter lwoffii", "Meningitis, bacteremia; rarely pathogenic"),
    ("", "", "Xanthomonadetes",
     "Xanthomonadales", "Xanthomonadaceae",
     "Stenotrophomonas maltophilia", "VAP in ICU, CF; intrinsically carbapenem-resistant; TMP-SMX"),
    ("", "", "Beta-\nproteobacteria",
     "Burkholderiales", "Burkholderiaceae",
     "Burkholderia cepacia complex", "CF lung colonisation; multiple genomovars; hard to treat"),
    ("", "", "", "Burkholderiales", "Burkholderiaceae",
     "Burkholderia pseudomallei", "Melioidosis; SE Asia/N. Australia; mimics TB"),
]

# ─── 3. Fastidious GNB ───────────────────────────────────────────────────────
FASTIDIOUS = [
    ("Fastidious\nGNB", "Pseudomonadota", "Gamma-\nproteobacteria",
     "Pasteurellales", "Pasteurellaceae",
     "Haemophilus influenzae", "Meningitis (type b), epiglottitis, otitis media; requires X & V factors"),
    ("", "", "", "Pasteurellales", "Pasteurellaceae",
     "Haemophilus ducreyi", "Chancroid (painful genital ulcer); STI"),
    ("", "", "", "Pasteurellales", "Pasteurellaceae",
     "Pasteurella multocida", "Animal bite wound infections (cat/dog); cellulitis"),
    ("", "", "", "Legionellales", "Legionellaceae",
     "Legionella pneumophila", "Legionnaire's disease (severe pneumonia); Pontiac fever; water systems"),
    ("", "", "Beta-\nproteobacteria",
     "Burkholderiales", "Alcaligenaceae",
     "Bordetella pertussis", "Whooping cough; pertussis toxin → lymphocytosis"),
    ("", "", "", "Burkholderiales", "Alcaligenaceae",
     "Bordetella parapertussis", "Milder pertussis-like illness"),
    ("", "", "Alpha-\nproteobacteria",
     "Rhizobiales", "Brucellaceae",
     "Brucella melitensis", "Brucellosis (undulant fever); goats; undulating fever"),
    ("", "", "", "Rhizobiales", "Brucellaceae",
     "Brucella abortus", "Brucellosis; cattle; occupational disease"),
    ("", "", "Gamma-\nproteobacteria",
     "Thiotrichales", "Francisellaceae",
     "Francisella tularensis", "Tularemia (rabbit fever); extremely infectious; bioterrorism agent"),
    ("", "", "Alpha-\nproteobacteria",
     "Rhizobiales", "Bartonellaceae",
     "Bartonella henselae", "Cat scratch disease, bacillary angiomatosis (HIV patients)"),
    ("", "", "", "Rhizobiales", "Bartonellaceae",
     "Bartonella quintana", "Trench fever; bacillary angiomatosis in homeless"),
]

# ─── 4. Curved/Microaerophilic ────────────────────────────────────────────────
CURVED = [
    ("Curved /\nMicroaero-\nphilic GNB", "Pseudomonadota", "Epsilon-\nproteobacteria",
     "Campylobacterales", "Campylobacteraceae",
     "Campylobacter jejuni", "Most common bacterial diarrhea worldwide; Guillain-Barré post-infection"),
    ("", "", "", "Campylobacterales", "Campylobacteraceae",
     "Campylobacter fetus", "Bacteremia; meningitis in immunocompromised & elderly"),
    ("", "", "", "Campylobacterales", "Helicobacteraceae",
     "Helicobacter pylori", "Peptic ulcer disease, gastric cancer, MALT lymphoma; urease+"),
    ("", "", "Gamma-\nproteobacteria",
     "Vibrionales", "Vibrionaceae",
     "Vibrio cholerae (O1/O139)", "Cholera (rice-water diarrhea); massive fluid loss"),
    ("", "", "", "Vibrionales", "Vibrionaceae",
     "Vibrio parahaemolyticus", "Seafood-associated gastroenteritis; halophile"),
    ("", "", "", "Vibrionales", "Vibrionaceae",
     "Vibrio vulnificus", "Septicemia from raw oysters; fatal in liver disease"),
]

# ─── 5. GN Cocci/Coccobacilli ────────────────────────────────────────────────
GNCOC = [
    ("GN Cocci /\nCoccobacilli", "Pseudomonadota", "Beta-\nproteobacteria",
     "Neisseriales", "Neisseriaceae",
     "Neisseria meningitidis", "Bacterial meningitis, Waterhouse-Friderichsen syndrome; capsule serogroups A,B,C,W,Y"),
    ("", "", "", "Neisseriales", "Neisseriaceae",
     "Neisseria gonorrhoeae", "Gonorrhea, PID, neonatal ophthalmia, disseminated GC infection"),
    ("", "", "Gamma-\nproteobacteria",
     "Pseudomonadales", "Moraxellaceae",
     "Moraxella catarrhalis", "Otitis media, sinusitis, COPD exacerbation; β-lactamase+"),
]

# ─── 6. Anaerobic GNB ────────────────────────────────────────────────────────
ANAEROB = [
    ("Anaerobic\nGNB", "Bacteroidota\n(Bacteroidetes)", "Bacteroidia",
     "Bacteroidales", "Bacteroidaceae",
     "Bacteroides fragilis", "Intra-abdominal infections, abscesses; most common anaerobe in clinical specimens"),
    ("", "", "", "Bacteroidales", "Prevotellaceae",
     "Prevotella melaninogenica", "Oral infections, aspiration pneumonia, brain abscess"),
    ("", "", "", "Bacteroidales", "Porphyromonadaceae",
     "Porphyromonas gingivalis", "Periodontal disease; implicated in cardiovascular disease"),
    ("", "Fusobacteriota\n(Fusobacteria)", "Fusobacteriia",
     "Fusobacteriales", "Fusobacteriaceae",
     "Fusobacterium nucleatum", "Oral infections, Lemierre syndrome, colorectal cancer association"),
]

# ── Build PDF ─────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=landscape(A3),
    leftMargin=1.0*cm, rightMargin=1.0*cm,
    topMargin=1.3*cm, bottomMargin=1.3*cm,
    title="GNB Full Taxonomy Table",
    author="Orris Medical Reference"
)

def build_section(label, bg_h, bg_l, bg_p, data_rows):
    """Returns list of table row lists for one section."""
    rows = []
    # Section header spanning all 7 cols
    sec_row = [p(f"<b>  {label}</b>",
                 st("SH", fontSize=9, fontName="Helvetica-Bold",
                    textColor=WHITE, alignment=TA_LEFT, leading=11))]
    sec_row += [p("", TH)] * 6
    rows.append(("SEC", sec_row, bg_h))

    for i, (grp, phyl, cls, ord_, fam, spp, dis) in enumerate(data_rows):
        row = [
            pb(grp) if grp else p("", TD_L),
            pc(phyl) if phyl else p("", TD_C),
            pc(cls) if cls else p("", TD_C),
            pc(ord_) if ord_ else p("", TD_C),
            pc(fam) if fam else p("", TD_C),
            pi(spp),
            pl(dis),
        ]
        bg = bg_l if i % 2 == 0 else bg_p
        rows.append(("DATA", row, bg))
    return rows

sections = [
    ("GROUP 1 · ENTEROBACTERIACEAE  (Enteric Fermenters + Salmonella/Shigella + Yersinia)",
     BLUE_H, BLUE_L, BLUE_P,
     ENTERO + SALMONELLA + YERSINIA),
    ("GROUP 2 · NON-FERMENTATIVE GNB  (Environmental / Opportunistic)",
     RED_H, RED_L, RED_P,
     NONFERMENT),
    ("GROUP 3 · FASTIDIOUS GNB  (Special Growth Requirements)",
     ORANGE_H, ORANGE_L, ORANGE_P,
     FASTIDIOUS),
    ("GROUP 4 · CURVED / MICROAEROPHILIC GNB",
     PURPLE_H, PURPLE_L, PURPLE_P,
     CURVED),
    ("GROUP 5 · GN COCCI & COCCOBACILLI",
     GREEN_H, GREEN_L, GREEN_P,
     GNCOC),
    ("GROUP 6 · ANAEROBIC GNB",
     TEAL_H, TEAL_L, TEAL_P,
     ANAEROB),
]

# Collect all rows with metadata
all_rows_meta = []  # list of (type, row_data, bg_color)
all_rows_meta.append(("HDR", HDR, GREY_H))

for label, bg_h, bg_l, bg_p, data in sections:
    all_rows_meta.extend(build_section(label, bg_h, bg_l, bg_p, data))

all_rows = [r for _, r, _ in all_rows_meta]

# Build table style
ts_cmds = [
    # Grid
    ("GRID",      (0,0),(-1,-1), 0.35, colors.HexColor("#bbbbbb")),
    ("VALIGN",    (0,0),(-1,-1), "MIDDLE"),
    ("ALIGN",     (0,0),(-1,-1), "CENTER"),
    ("ALIGN",     (0,0),(0,-1),  "LEFT"),
    ("ALIGN",     (5,0),(6,-1),  "LEFT"),
    # Padding
    ("TOPPADDING",    (0,0),(-1,-1), 3),
    ("BOTTOMPADDING", (0,0),(-1,-1), 3),
    ("LEFTPADDING",   (0,0),(-1,-1), 4),
    ("RIGHTPADDING",  (0,0),(-1,-1), 3),
    # Header row
    ("BACKGROUND",    (0,0),(-1,0), GREY_H),
    ("LINEBELOW",     (0,0),(-1,0), 1.2, WHITE),
]

for i, (rtype, row, bg) in enumerate(all_rows_meta):
    if rtype == "SEC":
        ts_cmds.append(("SPAN",       (0,i),(-1,i)))
        ts_cmds.append(("BACKGROUND", (0,i),(-1,i), bg))
        ts_cmds.append(("LINEABOVE",  (0,i),(-1,i), 1.0, colors.HexColor("#888888")))
        ts_cmds.append(("LINEBELOW",  (0,i),(-1,i), 0.8, colors.HexColor("#888888")))
    elif rtype == "DATA":
        ts_cmds.append(("BACKGROUND", (0,i),(-1,i), bg))

# Bold species column
ts_cmds.append(("FONTNAME", (5,1),(5,-1), "Helvetica-Oblique"))

ts = TableStyle(ts_cmds)
tbl = Table(all_rows, colWidths=CW, repeatRows=1)
tbl.setStyle(ts)

# ── Title banner ──────────────────────────────────────────────────────────────
total_w = sum(CW)
title_tbl = Table([
    [p("<b>GRAM-NEGATIVE BACILLI (GNB)</b>",
       st("T1", fontSize=18, fontName="Helvetica-Bold", textColor=WHITE,
          alignment=TA_CENTER))],
    [p("Complete Taxonomic Classification  ·  Group | Phylum | Class | Order | Family | Species | Key Disease",
       st("T2", fontSize=9.5, fontName="Helvetica", textColor=colors.HexColor("#aaccee"),
          alignment=TA_CENTER))],
    [p("6 Groups  ·  40+ Clinically Relevant Species  ·  Orris Medical Reference 2026",
       st("T3", fontSize=8, fontName="Helvetica-Oblique", textColor=colors.HexColor("#88aacc"),
          alignment=TA_CENTER))],
], colWidths=[total_w])
title_tbl.setStyle(TableStyle([
    ("BACKGROUND",    (0,0),(0,2), NAVY),
    ("TOPPADDING",    (0,0),(0,2), 5),
    ("BOTTOMPADDING", (0,0),(0,2), 5),
    ("LEFTPADDING",   (0,0),(0,2), 8),
]))

notes = [
    "Phylum 'Pseudomonadota' is the modern name for Proteobacteria (same organisms). "
    "Class abbreviations: Gamma = Gammaproteobacteria; Beta = Betaproteobacteria; "
    "Alpha = Alphaproteobacteria; Epsilon = Epsilonproteobacteria.",
    "GNB = Gram-Negative Bacilli. All stain pink/red on Gram stain due to thin peptidoglycan + outer membrane with LPS (endotoxin). "
    "Species in italics per standard microbiological nomenclature.",
    "Sources: Henry's Clinical Diagnosis & Laboratory Methods; Red Book 2021; Medical Microbiology 9e (Murray); Jawetz, Melnick & Adelberg's Medical Microbiology 28e.",
]

elements = [title_tbl, Spacer(1, 5), tbl, Spacer(1, 5)]
for n in notes:
    elements.append(Paragraph(n, NOTE))
    elements.append(Spacer(1, 2))

doc.build(elements)
print(f"PDF saved: {OUTPUT}")
Running Command

cd /home/daytona/workspace/gpc-gnb-chart && python gnb_taxonomy.py 2>&1

Running Command

ls -lh /home/daytona/workspace/gpc-gnb-chart/GNB_Full_Taxonomy_Table.pdf

Your PDF is ready:

GNB Full Taxonomy Table

PDF Document · PDF


Here is the full reference table in text form:

GNB - Complete Taxonomy: Group → Phylum → Class → Order → Family → Species → Key Disease


GROUP 1 - ENTEROBACTERIACEAE (Enteric Fermenters)

GroupPhylumClassOrderFamilySpeciesKey Disease
Enteric FermentersProteobacteriaGammaproteobacteriaEnterobacteralesEnterobacteriaceaeEscherichia coliUTI, neonatal meningitis, diarrhea (ETEC/EHEC), HUS (O157:H7)
Klebsiella pneumoniaeHospital-acquired pneumonia, UTI, liver abscess; ESBL/CRKP strains
Klebsiella oxytocaUTI, bacteremia; ESBL-producing strains
Proteus mirabilisUTI, staghorn kidney calculi; swarming, urease+
Proteus vulgarisUTI, wound infections; indole+
Morganella morganiiUTI, wound infections; nosocomial
Providencia stuartiiUTI in catheterised patients; aminoglycoside-resistant
Enterobacter cloacaeNosocomial pneumonia, UTI, bacteremia; AmpC β-lactamase
Enterobacter aerogenesHospital infections; AmpC producer
Serratia marcescensHospital pneumonia, UTI; red pigment; IV drug users
Citrobacter freundiiUTI, neonatal meningitis; ESBL producer
Citrobacter koseriNeonatal brain abscess
Salmonella / ShigellaSalmonella typhiTyphoid fever; rose spots, hepatosplenomegaly
Salmonella paratyphi A/B/CParatyphoid fever
Salmonella enteritidisFoodborne gastroenteritis (poultry/eggs)
Salmonella typhimuriumFoodborne gastroenteritis; bacteremia in sickle cell
Shigella dysenteriaeSevere bloody dysentery; Shiga toxin; HUS risk
Shigella flexneriBacillary dysentery; most common in developing countries
Shigella sonneiMild diarrhea; most common in developed countries
Shigella boydiiDiarrhea; endemic in Indian subcontinent
YersiniaYersiniaceaeYersinia pestisPLAGUE (bubonic/pneumonic/septicemic); bioterrorism agent
Yersinia enterocoliticaEnterocolitis, mesenteric adenitis (mimics appendicitis)
Yersinia pseudotuberculosisMesenteric adenitis; Kawasaki-like in children

GROUP 2 - NON-FERMENTATIVE GNB

GroupPhylumClassOrderFamilySpeciesKey Disease
Non-FermentersProteobacteriaGammaproteobacteriaPseudomonadalesPseudomonadaceaePseudomonas aeruginosaBurn/wound infections, VAP, cystic fibrosis, hot-tub folliculitis; oxidase+, pyocyanin pigment
Pseudomonas fluorescensRare; blood product contamination
PseudomonadalesMoraxellaceaeAcinetobacter baumanniiVAP, wound infections; CRAB strains; survives on dry surfaces
XanthomonadetesXanthomonadalesXanthomonadaceaeStenotrophomonas maltophiliaVAP in ICU, CF; intrinsically carbapenem-resistant; TMP-SMX
BetaproteobacteriaBurkholderialesBurkholderiaceaeBurkholderia cepacia complexCF lung colonisation; multiple genomovars
Burkholderia pseudomalleiMelioidosis; SE Asia/N. Australia; mimics TB

GROUP 3 - FASTIDIOUS GNB (special growth requirements)

GroupPhylumClassOrderFamilySpeciesKey Disease
FastidiousProteobacteriaGammaproteobacteriaPasteurellalesPasteurellaceaeHaemophilus influenzaeMeningitis (type b), epiglottitis, otitis media; requires X & V factors
Haemophilus ducreyiChancroid (painful genital ulcer - STI)
Pasteurella multocidaCat/dog bite wound infections; cellulitis
LegionellalesLegionellaceaeLegionella pneumophilaLegionnaire's disease; Pontiac fever; water/AC systems
BetaproteobacteriaBurkholderialesAlcaligenaceaeBordetella pertussisWhooping cough (pertussis); lymphocytosis
Bordetella parapertussisMilder pertussis-like illness
AlphaproteobacteriaRhizobialesBrucellaceaeBrucella melitensisBrucellosis (undulant fever); goats
Brucella abortusBrucellosis; cattle; occupational disease
GammaproteobacteriaThiotrichalesFrancisellaceaeFrancisella tularensisTularemia (rabbit fever); bioterrorism agent
AlphaproteobacteriaRhizobialesBartonellaceaeBartonella henselaeCat scratch disease; bacillary angiomatosis (HIV)
Bartonella quintanaTrench fever; bacillary angiomatosis in homeless

GROUP 4 - CURVED / MICROAEROPHILIC GNB

GroupPhylumClassOrderFamilySpeciesKey Disease
CurvedProteobacteriaEpsilonproteobacteriaCampylobacteralesCampylobacteraceaeCampylobacter jejuniMost common bacterial diarrhea worldwide; Guillain-Barré post-infection
Campylobacter fetusBacteremia; meningitis in immunocompromised
CampylobacteralesHelicobacteraceaeHelicobacter pyloriPeptic ulcer, gastric cancer, MALT lymphoma; urease+
GammaproteobacteriaVibrionalesVibrionaceaeVibrio cholerae O1/O139Cholera (rice-water diarrhea); massive fluid loss
Vibrio parahaemolyticusSeafood-associated gastroenteritis; halophile
Vibrio vulnificusSepticemia from raw oysters; fatal in liver disease

GROUP 5 - GN COCCI & COCCOBACILLI

GroupPhylumClassOrderFamilySpeciesKey Disease
GN CocciProteobacteriaBetaproteobacteriaNeisserialesNeisseriaceaeNeisseria meningitidisBacterial meningitis; Waterhouse-Friderichsen syndrome; serogroups A,B,C,W,Y
Neisseria gonorrhoeaeGonorrhea, PID, neonatal ophthalmia
GammaproteobacteriaPseudomonadalesMoraxellaceaeMoraxella catarrhalisOtitis media, sinusitis, COPD exacerbation; β-lactamase+

GROUP 6 - ANAEROBIC GNB

GroupPhylumClassOrderFamilySpeciesKey Disease
AnaerobicBacteroidetesBacteroidiaBacteroidalesBacteroidaceaeBacteroides fragilisIntra-abdominal infections, abscesses; most common anaerobe in clinical specimens
PrevotellaceaePrevotella melaninogenicaOral infections, aspiration pneumonia, brain abscess
PorphyromonadaceaePorphyromonas gingivalisPeriodontal disease; linked to cardiovascular disease
FusobacteriaFusobacteriiaFusobacterialesFusobacteriaceaeFusobacterium nucleatumOral infections, Lemierre syndrome; colorectal cancer association

Sources: Henry's Clinical Diagnosis & Laboratory Methods; Red Book 2021; Medical Microbiology 9e; Jawetz, Melnick & Adelberg's Medical Microbiology 28e

Generate antibiotic resistance patterns for common GNB (ESBL, MRSA, VRE)

Note: MRSA and VRE are Gram-positive organisms, not GNB - but including them alongside ESBL-GNB makes this a comprehensive MDR resistance reference.
Searching sources...
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Finding Sources
I have all the data needed. Now building the PDF.
Writing File

~/gpc-gnb-chart/resistance_patterns.py

from reportlab.lib.pagesizes import A3, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (
    SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT

OUTPUT = "/home/daytona/workspace/gpc-gnb-chart/Antibiotic_Resistance_Patterns.pdf"

# ── Palette ───────────────────────────────────────────────────────────────────
NAVY       = colors.HexColor("#0d2b45")
DARK_BLUE  = colors.HexColor("#1a3a5c")
MID_BLUE   = colors.HexColor("#2471a3")
PALE_BLUE  = colors.HexColor("#d6eaf8")
VLIGHT_BLUE= colors.HexColor("#eaf4fb")

DARK_RED   = colors.HexColor("#7b241c")
MID_RED    = colors.HexColor("#c0392b")
PALE_RED   = colors.HexColor("#fadbd8")
VLIGHT_RED = colors.HexColor("#fff5f4")

DARK_GREEN = colors.HexColor("#1d6a3a")
MID_GREEN  = colors.HexColor("#27ae60")
PALE_GREEN = colors.HexColor("#d5f5e3")
VLIGHT_GRN = colors.HexColor("#f0faf4")

DARK_ORNG  = colors.HexColor("#784212")
MID_ORNG   = colors.HexColor("#d35400")
PALE_ORNG  = colors.HexColor("#fdebd0")
VLIGHT_ORG = colors.HexColor("#fef9f4")

DARK_PURP  = colors.HexColor("#4a235a")
MID_PURP   = colors.HexColor("#7d3c98")
PALE_PURP  = colors.HexColor("#e8daef")
VLIGHT_PRP = colors.HexColor("#faf5fc")

DARK_TEAL  = colors.HexColor("#0e6655")
PALE_TEAL  = colors.HexColor("#d1f2eb")
VLIGHT_TEL = colors.HexColor("#f0faf8")

GREY       = colors.HexColor("#2c3e50")
LGREY      = colors.HexColor("#f2f3f4")
WHITE      = colors.white
BLACK      = colors.black

# Cell colours for susceptibility
S_CLR  = colors.HexColor("#27ae60")   # Susceptible
R_CLR  = colors.HexColor("#e74c3c")   # Resistant
V_CLR  = colors.HexColor("#f39c12")   # Variable
I_CLR  = colors.HexColor("#8e44ad")   # Intermediate
N_CLR  = colors.HexColor("#95a5a6")   # N/A

def sty(name, **kw):
    base = getSampleStyleSheet()["Normal"]
    return ParagraphStyle(name, parent=base, **kw)

TH   = sty("TH",   fontSize=8,   fontName="Helvetica-Bold",   textColor=WHITE, alignment=TA_CENTER, leading=10)
THL  = sty("THL",  fontSize=8,   fontName="Helvetica-Bold",   textColor=WHITE, alignment=TA_LEFT,   leading=10)
TD   = sty("TD",   fontSize=7.5, fontName="Helvetica",         textColor=BLACK, alignment=TA_LEFT,   leading=9)
TDC  = sty("TDC",  fontSize=7.5, fontName="Helvetica",         textColor=BLACK, alignment=TA_CENTER, leading=9)
TDB  = sty("TDB",  fontSize=7.5, fontName="Helvetica-Bold",    textColor=BLACK, alignment=TA_LEFT,   leading=9)
TDBR = sty("TDBR", fontSize=7.5, fontName="Helvetica-Bold",    textColor=BLACK, alignment=TA_CENTER, leading=9)
SEC  = sty("SEC",  fontSize=10,  fontName="Helvetica-Bold",    textColor=WHITE, alignment=TA_LEFT,   leading=12)
NOTE = sty("NOTE", fontSize=7,   fontName="Helvetica-Oblique", textColor=colors.HexColor("#555555"), alignment=TA_LEFT, leading=9)
MECH = sty("MECH", fontSize=7.5, fontName="Helvetica",         textColor=colors.HexColor("#1a3a5c"), alignment=TA_LEFT, leading=9)
BOX  = sty("BOX",  fontSize=8,   fontName="Helvetica",         textColor=BLACK, alignment=TA_LEFT,   leading=10)

def ph(t): return Paragraph(t, TH)
def phl(t): return Paragraph(t, THL)
def p(t):  return Paragraph(t, TD)
def pc(t): return Paragraph(t, TDC)
def pb(t): return Paragraph(f"<b>{t}</b>", TDB)
def pbc(t):return Paragraph(f"<b>{t}</b>", TDBR)

def sc_cell(code):
    """Coloured susceptibility cell."""
    MAP = {
        "S":  (S_CLR,  "S"),
        "R":  (R_CLR,  "R"),
        "V":  (V_CLR,  "V"),
        "I":  (I_CLR,  "I"),
        "-":  (N_CLR,  "-"),
        "S*": (colors.HexColor("#1e8449"), "S*"),
        "R*": (colors.HexColor("#b03a2e"), "R*"),
    }
    col, label = MAP.get(code, (N_CLR, code))
    return Paragraph(f"<b>{label}</b>",
                     sty("SC", fontSize=8, fontName="Helvetica-Bold",
                         textColor=WHITE, alignment=TA_CENTER, leading=10)), col

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=landscape(A3),
    leftMargin=1.0*cm, rightMargin=1.0*cm,
    topMargin=1.2*cm,  bottomMargin=1.2*cm,
    title="Antibiotic Resistance Patterns – ESBL · CRE · MRSA · VRE · MDR-GNB",
    author="Orris Medical Reference"
)

# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 1 — RESISTANCE MECHANISM OVERVIEW TABLE
# ═══════════════════════════════════════════════════════════════════════════════
# Columns: Resistance Type | Organism(s) | Mechanism | Genes/Enzymes |
#          Drugs RESISTANT | Drugs ACTIVE | Detection | Clinical Notes
OV_CW = [40, 70, 75, 62, 75, 75, 45, 68]  # total ~510 → trim
OV_CW = [38, 65, 72, 60, 70, 72, 42, 62]  # ~481mm — fits landscape A3

OV_HDR = [ph("RESISTANCE\nTYPE"), ph("AFFECTED\nORGANISMS"),
          ph("MECHANISM"), ph("GENES /\nENZYMES"),
          ph("RESISTANT TO\n(avoid)"), ph("ACTIVE DRUGS\n(treatment)"),
          ph("DETECTION"), ph("KEY CLINICAL NOTES")]

OV_DATA = [
    # ── ESBL ──
    ["ESBL\n(Extended-Spectrum\nBeta-Lactamase)",
     "E. coli, K. pneumoniae,\nK. oxytoca, P. mirabilis,\nEnterobacter spp.",
     "Plasmid-encoded β-lactamases\nhydroly se extended-spectrum\ncephalosporins; overcome\ninhibitors variably",
     "blaTEM, blaSHV,\nblaCTX-M\n(CTX-M most common\nworldwide)",
     "Penicillins, ALL\ncephalosporins (1st–4th gen),\nAztreonam;\nPiperacillin-tazobactam\n(unreliable)",
     "Carbapenems (DOC):\nErtapenem, Meropenem;\nFosfomycin (UTI);\nNitrofurantoin (UTI);\nFluoroquinolones (if susceptible);\nTMP-SMX (if susceptible)",
     "Double-disk synergy\ntest (DDST);\nCombination disk;\nMIC testing;\nMolecular PCR",
     "Carbapenem superior to\npiperacillin-tazobactam (RCT);\nHigh-risk: hospital, elderly,\nprior antibiotics, travel;\nPlasmid-mediated = rapid spread"],
    # ── CRE ──
    ["CRE\n(Carbapenem-Resistant\nEnterobacterales)",
     "K. pneumoniae (KPC),\nE. coli, Enterobacter,\nSerratia, Proteus",
     "Carbapenemase production\n(KPC, MBL, OXA);\nOR porin loss +\nAmpC/ESBL coproduction",
     "blaKPC (Class A)\nblaNDM, blaVIM,\nblaIMP (Class B MBL)\nblaOXA-48 (Class D)",
     "ALL beta-lactams\nincl. carbapenems;\nOften also: FQ,\naminoglycosides,\nTMP-SMX",
     "Ceftazidime-avibactam (KPC,\nsome OXA);\nMeropenem-vaborbactam (KPC);\nImipenem-cilastatin-relebactam;\nCefiderocol (MBL, OXA-48);\nAztreonam-avibactam (MBL);\nColistin (last resort, nephrotoxic)",
     "Modified Hodge test;\nCarbaNP test;\nMicrobroth dilution;\nMolecular: PCR/\nWGS for gene type",
     "50% of CRE produce\ncarbapenemase;\nKPC dominant in USA;\nNDM dominant in\nS. Asia/Africa;\nMortality 40-50%\nin bloodstream infection"],
    # ── AmpC ──
    ["AmpC β-Lactamase\n(Inducible/\nChromosomal)",
     "SPACE organisms:\nSerratia, Pseudomonas,\nAcinetobacter,\nCitrobacter, Enterobacter\n(+ Morganella, Hafnia)",
     "Inducible chromosomal\nor plasmid AmpC;\ninduced by 3rd-gen\ncephalosporins →\nhydrolyses them",
     "ampC gene\n(chromosomal);\nplasmid AmpC:\nblaCMY, blaDHA,\nblaFOX, blaACT",
     "All penicillins;\nAll cephalosporins\n1st–3rd gen;\nClavulanate combinations;\n(avoid even if in vitro\nsusceptible to 3GC)",
     "Cefepime (4th gen) if\nMIC ≤2 μg/mL;\nCarbapenem if\nMIC ≥4 μg/mL;\nFluoroquinolones;\nPiperacillin-tazobactam\n(limited evidence)",
     "No reliable phenotypic\ntest for inducible AmpC;\nWatch for MIC creep;\nMolecular PCR",
     "3rd-gen cephalosporin\nmay test 'susceptible'\nbut fail clinically;\nCo-production of ESBL\ncommon; use 4th-gen or\ncarbapenem empirically"],
    # ── MDR Pseudomonas ──
    ["MDR Pseudomonas\naeruginosa\n(Non-fermentative)",
     "Pseudomonas aeruginosa\n(especially ICU,\nCF patients)",
     "Multiple: porin loss (OprD),\nefflux pumps (MexAB-OprM),\nbeta-lactamases (IMP/VIM/NDM),\nAmpC upregulation,\nmodified PBPs",
     "blaIMP, blaVIM,\nblaOXA-48;\nOprD mutation;\nMexAB-OprM, MexCD,\nMexXY efflux pumps",
     "Ampicillin (intrinsic R);\nTMP-SMX (intrinsic R);\nAll early gen cephalosporins;\nErtapenem;\n1st/2nd gen FQ",
     "Piperacillin-tazobactam;\nCeftazidime;\nCefepime;\nImipenem/Meropenem;\nCiprofloxacin;\nAmikacin;\nColistin (XDR strains);\nCeftolozane-tazobactam\n(MDR Pseudomonas)",
     "Susceptibility testing\nmandatory;\nCombination therapy\nfor serious infections;\nPDD extended infusion",
     "Intrinsic resistance to\nmany drug classes;\nAlways obtain cultures;\nConsult ID for MDR\nstrains; de-escalate\nbased on C&S"],
    # ── CRAB ──
    ["CRAB\n(Carbapenem-Resistant\nAcinetobacter baumannii)",
     "Acinetobacter baumannii\n(ICU, war wounds,\nhospital environment)",
     "OXA-type carbapenemases\n(OXA-23, OXA-40, OXA-58);\nMBL (NDM, IMP, VIM);\nPorin loss;\nMultiple efflux pumps",
     "blaOXA-23 (dominant);\nblaOXA-40,\nblaOXA-58;\nblaNDM (emerging)",
     "ALL beta-lactams;\nFluoroquinolones;\nAminoglycosides;\nTMP-SMX;\n(pan-resistant strains\nexist)",
     "Colistin/Polymyxin B\n(last resort);\nSulbactam (intrinsic\nactivity vs. Acinetobacter);\nTigecycline;\nMinocycline;\nCefiderocol (emerging);\nRifampicin (combination)",
     "MIC testing essential;\nOXA carbapenemase PCR;\nSurface sampling\nfor outbreak tracing",
     "Survives on dry\nsurfaces for weeks;\nHospital outbreak\npotential is high;\npan-drug resistance\n(PDR) reported;\nBundled infection\ncontrol critical"],
    # ── MRSA ──
    ["MRSA\n(Methicillin-Resistant\nS. aureus)\n[GPC, not GNB]",
     "Staphylococcus aureus\n(HA-MRSA: hospital;\nCA-MRSA: community;\nLA-MRSA: livestock)",
     "mecA gene → altered PBP2a\n(PBP2') with low affinity for\nall beta-lactams;\nCA-MRSA also carries\nPVL (Panton-Valentine\nleukocidin) toxin",
     "mecA, mecC\n(PBP2a);\nPVL (CA-MRSA);\nnuc gene (ID);\nSCCmec types\nI–XI",
     "ALL beta-lactams\n(penicillins, cephalosporins,\ncarbapenems, monobactam);\nErythromycin;\nOften Clindamycin (V/R)",
     "Vancomycin (DOC for\nbacteremia, endocarditis,\nmeningitis);\nLinezolid (skin, pneumonia);\nDaptomycin (bacteremia);\nTedizolid;\nTMP-SMX (skin, SSTI);\nDoxycycline (skin);\nCeftaroline (5th gen β-lac)",
     "Oxacillin/cefoxitin\ndisk screen;\nPBP2a latex\nagglutination;\nMRSA PCR;\nMolecular typing\n(spa, MLST, WGS)",
     "Vancomycin penetrates\npoorly into lung & bone;\nuse linezolid/daptomycin\nfor MRSA pneumonia;\nNasal screening detects\ncarriage (MRSA bundle);\nVRSA/VISA strains rare"],
    # ── VRE ──
    ["VRE\n(Vancomycin-Resistant\nEnterococcus)\n[GPC, not GNB]",
     "Enterococcus faecium\n(VanA/VanB);\nE. faecalis (VanB,\nless common;\nintrinsic low-level\nVanC: E. gallinarum)",
     "Acquired van gene clusters\nmodify D-Ala-D-Ala terminus\nof peptidoglycan precursor\nto D-Ala-D-Lac (VanA,B)\nor D-Ala-D-Ser (VanC) →\nvancomycin cannot bind",
     "vanA (high-level;\nR to vancomycin\n+ teicoplanin);\nvanB (variable;\nR to vancomycin,\nS to teicoplanin);\nvanC (intrinsic,\nlow-level)",
     "Vancomycin;\nTeicoplanin (VanA);\nAmpicillin (E. faecium\nusually resistant);\nAll cephalosporins;\nAll carbapenems (MRSE)",
     "Linezolid (DOC);\nDaptomycin;\nTedizolid;\nQ-D (Quinupristin-\ndalfopristin) – E. faecium\nonly;\nHigh-dose ampicillin\n(if MIC allows, E. faecalis)",
     "Vancomycin MIC;\nVan gene PCR\n(vanA, vanB);\nVRE rectal swab\nscreening in ICU;\nEpidemic strain\ntyping (WGS)",
     "Risk factors: prolonged\nhospitalisation, prior\nvancomycin, GI surgery;\nStrict contact\nprecautions;\nLinezolid resistance\ncan emerge on therapy;\nDaptomycin non-\nsusceptible strains exist"],
    # ── Stenotrophomonas ──
    ["Intrinsic MDR:\nStenotrophomonas\nmaltophilia",
     "Stenotrophomonas\nmaltophilia\n(ICU, CF, immunocomp.)",
     "Intrinsic resistance to\ncarbapenems via\nL1 (MBL) + L2 (cephalosporinase);\nMultiple efflux pumps;\nOuter membrane impermeability",
     "L1 MBL (blaL1);\nL2 cephalosporinase\n(blaL2);\nSmeABC, SmeDEF\nefflux pumps",
     "ALL carbapenems\n(intrinsically resistant);\nAll penicillins;\nMost cephalosporins;\nAminoglycosides;\nMany FQ",
     "TMP-SMX (DOC);\nLevofloxacin;\nMinocycline/Doxycycline;\nTigecycline;\nChloramphenicol;\nCeftazidime-avibactam\n(variable)",
     "Disk diffusion or\nMIC (TMP-SMX);\nMolecular:\nblaL1, blaL2",
     "Carbapenem therapy\ncan select for\nStenotrophomonas;\nConsider in patients\non prolonged carbapenem;\nCF patients: chronic\ncolonisation common"],
]

def build_overview_table(data):
    all_rows = [OV_HDR]
    cmd = [
        ("GRID",      (0,0),(-1,-1), 0.3, colors.HexColor("#aaaaaa")),
        ("BACKGROUND",(0,0),(-1,0),  GREY),
        ("VALIGN",    (0,0),(-1,-1), "TOP"),
        ("ALIGN",     (0,0),(-1,-1), "LEFT"),
        ("ALIGN",     (0,0),(-1,0),  "CENTER"),
        ("TOPPADDING",    (0,0),(-1,-1), 3),
        ("BOTTOMPADDING", (0,0),(-1,-1), 3),
        ("LEFTPADDING",   (0,0),(-1,-1), 4),
        ("RIGHTPADDING",  (0,0),(-1,-1), 3),
        ("LINEBELOW", (0,0),(-1,0), 1.0, WHITE),
    ]
    row_bgs = [
        (PALE_BLUE,  VLIGHT_BLUE),   # ESBL
        (PALE_RED,   VLIGHT_RED),    # CRE
        (PALE_ORNG,  VLIGHT_ORG),    # AmpC
        (PALE_PURP,  VLIGHT_PRP),    # Pseudomonas
        (PALE_RED,   VLIGHT_RED),    # CRAB
        (PALE_BLUE,  VLIGHT_BLUE),   # MRSA
        (PALE_GREEN, VLIGHT_GRN),    # VRE
        (PALE_TEAL,  VLIGHT_TEL),    # Steno
    ]
    for i, row_data in enumerate(data):
        styled_row = []
        for j, cell in enumerate(row_data):
            if j == 0:
                styled_row.append(Paragraph(f"<b>{cell}</b>",
                    sty("R0", fontSize=8, fontName="Helvetica-Bold",
                        textColor=WHITE, alignment=TA_CENTER, leading=10)))
            elif j in (4, 5):  # resistant / active
                styled_row.append(Paragraph(cell, MECH))
            else:
                styled_row.append(Paragraph(cell, TD))
            
        ri = i + 1
        bg0, bg1 = row_bgs[i % len(row_bgs)]
        # col 0 gets distinctive dark bg
        dark_cols = [
            MID_BLUE, MID_RED, MID_ORNG, MID_PURP,
            MID_RED, MID_BLUE, MID_GREEN, DARK_TEAL
        ]
        cmd.append(("BACKGROUND", (0,ri),(0,ri), dark_cols[i % len(dark_cols)]))
        cmd.append(("TEXTCOLOR",  (0,ri),(0,ri), WHITE))
        # Resistant column = pale red
        cmd.append(("BACKGROUND", (4,ri),(4,ri), PALE_RED))
        # Active drugs column = pale green
        cmd.append(("BACKGROUND", (5,ri),(5,ri), PALE_GREEN))
        # rest alternating
        for c in [1,2,3,6,7]:
            cmd.append(("BACKGROUND", (c,ri),(c,ri), bg0 if i%2==0 else bg1))
        
        all_rows.append(styled_row)
    
    cmd.append(("FONTSIZE", (0,1),(0,-1), 8))
    ts = TableStyle(cmd)
    t = Table(all_rows, colWidths=OV_CW, repeatRows=1)
    t.setStyle(ts)
    return t

# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 2 — DRUG-BY-DRUG COMPARISON MATRIX
# Rows = antibiotics, Cols = resistance phenotype
# ═══════════════════════════════════════════════════════════════════════════════
# Cols: Antibiotic | Class | ESBL-E.coli | CRE-Kpn | MDR-Psa | CRAB | MRSA | VRE | AmpC
MAT_CW = [75, 65, 28, 28, 28, 28, 28, 28, 28]   # ~336mm

MAT_ORG_HDR = [
    ph("ANTIBIOTIC"), ph("CLASS"),
    ph("ESBL\nE. coli"), ph("CRE\nK. pneu."),
    ph("MDR\nP. aeru."), ph("CRAB\nA. bau."),
    ph("MRSA\nS. aur."), ph("VRE\nE. fae."),
    ph("AmpC\nEnterob."),
]

# (drug, class, ESBL-Ec, CRE-Kp, MDR-Pa, CRAB, MRSA, VRE, AmpC)
MAT_DATA = [
    # ── Penicillins ────────────────────────────────────────────────────────────
    ("Amoxicillin-Clavulanate",  "Aminopenicillin+BLI",   "R","R","R","R","R","R","R"),
    ("Piperacillin-Tazobactam",  "Ureidopenicillin+BLI",  "V*","R","V","R","R","R","V*"),
    ("Ampicillin-Sulbactam",     "Aminopenicillin+BLI",   "R","R","R","V*","R","R","R"),
    # ── Cephalosporins ────────────────────────────────────────────────────────
    ("Cefazolin (1G)",           "1st Gen Cephalosporin", "R","R","R","R","R","R","R"),
    ("Cefuroxime (2G)",          "2nd Gen Cephalosporin", "R","R","R","R","R","R","R"),
    ("Ceftriaxone (3G)",         "3rd Gen Cephalosporin", "R","R","R","R","R","R","R"),
    ("Ceftazidime (3G anti-Psa)","3rd Gen Cephalosporin", "R","R","V","R","R","R","R"),
    ("Cefepime (4G)",            "4th Gen Cephalosporin", "V*","R","V","R","R","R","V*"),
    ("Ceftaroline (5G)",         "5th Gen Cephalosporin\n(anti-MRSA)", "V","R","R","R","S","R","V"),
    ("Ceftazidime-Avibactam",    "3GC + BLI (non-MBL)",  "S","S*","S","V","R","R","S"),
    ("Ceftolozane-Tazobactam",   "3GC + BLI (Pseudo)",   "S","R","S","R","R","R","S"),
    ("Cefiderocol",              "Siderophore Cephalosporin","S","S","S","S","R","R","S"),
    # ── Carbapenems ──────────────────────────────────────────────────────────
    ("Ertapenem",                "Carbapenem (no Psa)",   "S","R","R","R","R","R","S"),
    ("Meropenem",                "Carbapenem",            "S","V*","V","R","R","R","S"),
    ("Imipenem-Cilastatin",      "Carbapenem",            "S","V*","V","R","R","R","S"),
    ("Meropenem-Vaborbactam",    "Carbapenem+BLI (KPC)",  "S","S*","V","R","R","R","S"),
    ("Imip-Cilastatin-Relebact.","Carbapenem+BLI (KPC)",  "S","S*","S","R","R","R","S"),
    ("Aztreonam-Avibactam",      "Monobactam+BLI (MBL)",  "S","S*","V","R","R","R","S"),
    # ── Glycopeptides ─────────────────────────────────────────────────────────
    ("Vancomycin",               "Glycopeptide",          "R","R","R","R","S","R","R"),
    ("Teicoplanin",              "Glycopeptide",          "R","R","R","R","S","V*","R"),
    # ── Lipopeptide / Oxazolidinone ──────────────────────────────────────────
    ("Daptomycin",               "Lipopeptide",           "R","R","R","R","S","S","R"),
    ("Linezolid",                "Oxazolidinone",         "R","R","R","R","S","S","R"),
    ("Tedizolid",                "Oxazolidinone (2G)",    "R","R","R","R","S","S","R"),
    # ── Aminoglycosides ───────────────────────────────────────────────────────
    ("Gentamicin",               "Aminoglycoside",        "V","V","V","V","R","V*","V"),
    ("Amikacin",                 "Aminoglycoside",        "V","V","S","V","R","V*","V"),
    # ── Fluoroquinolones ──────────────────────────────────────────────────────
    ("Ciprofloxacin",            "Fluoroquinolone",       "V","V","V","V","R","V","V"),
    ("Levofloxacin",             "Respiratory FQ",        "V","V","V","V","R","V","V"),
    # ── Tetracyclines ─────────────────────────────────────────────────────────
    ("Doxycycline",              "Tetracycline",          "V","V","R","V","S*","V","V"),
    ("Tigecycline",              "Glycylcycline",         "S","S","R","S","S","S","S"),
    ("Minocycline",              "Tetracycline",          "V","V","R","S","S","V","V"),
    # ── Folate inhibitors ─────────────────────────────────────────────────────
    ("TMP-SMX",                  "Sulfonamide Combo",     "V","V","R","R","V*","R","V"),
    # ── Polymyxins ────────────────────────────────────────────────────────────
    ("Colistin / Polymyxin B",   "Polymyxin",             "S","S*","S","S","R","R","S"),
    # ── Misc ──────────────────────────────────────────────────────────────────
    ("Nitrofurantoin",           "Nitrofuran (UTI only)", "S","V","R","R","V","V","S"),
    ("Fosfomycin",               "Phosphonic acid",       "S","V","V","R","S","V","S"),
    ("Rifampicin",               "Rifamycin (adjunct)",   "R","R","R","R","S","V","R"),
    ("Chloramphenicol",          "Amphenicol",            "V","V","R","V","V","V","V"),
]

def build_matrix(data):
    # Determine row count (cols for A3 landscape = up to ~520mm usable with narrow cols)
    # We'll split into two halves for readability
    all_rows = [MAT_ORG_HDR]
    cmd = [
        ("GRID",      (0,0),(-1,-1), 0.3, colors.HexColor("#aaaaaa")),
        ("BACKGROUND",(0,0),(-1,0),  GREY),
        ("VALIGN",    (0,0),(-1,-1), "MIDDLE"),
        ("ALIGN",     (0,0),(-1,-1), "CENTER"),
        ("ALIGN",     (0,1),(1,-1),  "LEFT"),
        ("TOPPADDING",    (0,0),(-1,-1), 3),
        ("BOTTOMPADDING", (0,0),(-1,-1), 3),
        ("LEFTPADDING",   (0,0),(-1,-1), 4),
        ("RIGHTPADDING",  (0,0),(-1,-1), 3),
        ("LINEBELOW", (0,0),(-1,0), 1.0, WHITE),
        ("FONTNAME",  (0,1),(1,-1), "Helvetica"),
        ("FONTSIZE",  (0,1),(1,-1), 7.5),
    ]
    # Group separators (by drug class)
    sep_indices_after = [2, 11, 17, 22, 25, 27, 30, 31, 34]  # row indices (0-based data)

    for i, (drug, cls, *sus_vals) in enumerate(data):
        ri = i + 1
        row = [p(drug), p(cls)]
        for j, val in enumerate(sus_vals):
            cell_p, cell_bg = sc_cell(val)
            row.append(cell_p)
            cmd.append(("BACKGROUND", (j+2, ri), (j+2, ri), cell_bg))
        
        row_bg = LGREY if i % 2 == 0 else WHITE
        cmd.append(("BACKGROUND", (0,ri),(1,ri), row_bg))
        all_rows.append(row)
        
        if i in sep_indices_after:
            cmd.append(("LINEBELOW", (0,ri),(-1,ri), 1.0, colors.HexColor("#888888")))

    ts = TableStyle(cmd)
    t = Table(all_rows, colWidths=MAT_CW, repeatRows=1)
    t.setStyle(ts)
    return t

# ═══════════════════════════════════════════════════════════════════════════════
# LEGEND + FOOTNOTES
# ═══════════════════════════════════════════════════════════════════════════════
LEGEND_DATA = [
    (S_CLR,  "S  = Susceptible – drug is effective"),
    (R_CLR,  "R  = Resistant – drug not effective"),
    (V_CLR,  "V  = Variable – depends on local resistance/MIC testing"),
    (I_CLR,  "I   = Intermediate susceptibility"),
    (N_CLR,  "-   = Not applicable"),
]

def legend_box(items):
    cells = []
    for col, label in items:
        box = Table([[""]], colWidths=[10], rowHeights=[10])
        box.setStyle(TableStyle([("BACKGROUND",(0,0),(0,0),col),
                                  ("GRID",(0,0),(0,0),0.5,colors.grey)]))
        cells.extend([box, Paragraph(f" {label}   ", BOX)])
    lt = Table([cells], colWidths=([12,115]*5))
    lt.setStyle(TableStyle([("VALIGN",(0,0),(-1,-1),"MIDDLE"),
                             ("TOPPADDING",(0,0),(-1,-1),3),
                             ("BOTTOMPADDING",(0,0),(-1,-1),3)]))
    return lt

NOTES = [
    "S* = Susceptible with caveats (e.g., ESBL + pip-tazo: inferior to carbapenem per RCT; CRE + meropenem: only if MIC ≤1 and no carbapenemase gene; MRSA + doxycycline/TMP-SMX: skin infections only).",
    "V* = Variable with important caveats (e.g., Gentamicin/Amikacin used synergistically for enterococcal endocarditis only; Piperacillin-tazobactam for ESBL: unreliable, use carbapenem for serious infections).",
    "CRE treatment: drug of choice depends on carbapenemase type — KPC→Ceftazidime-avibactam or Meropenem-vaborbactam; MBL (NDM/VIM/IMP)→Aztreonam-avibactam or Cefiderocol; OXA-48→Ceftazidime-avibactam.",
    "CRAB (Carbapenem-resistant A. baumannii): Sulbactam has intrinsic activity against Acinetobacter spp.; consider sulbactam-based combinations or Cefiderocol for severe infections.",
    "BLI = Beta-Lactamase Inhibitor. GPC = Gram-Positive Cocci (MRSA, VRE included for completeness). GNB = Gram-Negative Bacilli.",
    "Sources: The Harriet Lane Handbook 23e; Red Book 2021; Goldman-Cecil Medicine; Harrison's Principles of Internal Medicine 22e; Medical Microbiology 9e.",
]

# ═══════════════════════════════════════════════════════════════════════════════
# ASSEMBLE DOCUMENT
# ═══════════════════════════════════════════════════════════════════════════════
total_w = sum(OV_CW)

def make_title(text, sub, col=NAVY):
    tt = Table([
        [Paragraph(f"<b>{text}</b>",
                   sty("T1", fontSize=17, fontName="Helvetica-Bold",
                       textColor=WHITE, alignment=TA_CENTER))],
        [Paragraph(sub,
                   sty("T2", fontSize=9, fontName="Helvetica",
                       textColor=colors.HexColor("#aaccee"),
                       alignment=TA_CENTER))],
    ], colWidths=[total_w])
    tt.setStyle(TableStyle([
        ("BACKGROUND", (0,0),(0,1), col),
        ("TOPPADDING",    (0,0),(0,1), 5),
        ("BOTTOMPADDING", (0,0),(0,1), 5),
        ("LEFTPADDING",   (0,0),(0,1), 8),
    ]))
    return tt

def sec_banner(text, bg):
    tt = Table([[Paragraph(f"  <b>{text}</b>",
                           sty("SB", fontSize=9.5, fontName="Helvetica-Bold",
                               textColor=WHITE, alignment=TA_LEFT, leading=12))]],
               colWidths=[total_w])
    tt.setStyle(TableStyle([
        ("BACKGROUND", (0,0),(0,0), bg),
        ("TOPPADDING",    (0,0),(0,0), 4),
        ("BOTTOMPADDING", (0,0),(0,0), 4),
        ("LEFTPADDING",   (0,0),(0,0), 8),
    ]))
    return tt

elements = []

# ── PAGE 1: Mechanism table ───────────────────────────────────────────────────
elements.append(make_title(
    "ANTIBIOTIC RESISTANCE PATTERNS IN COMMON PATHOGENS",
    "ESBL · CRE · AmpC · MDR-Pseudomonas · CRAB · MRSA · VRE  —  Mechanisms, Genes, Treatment & Clinical Notes",
    NAVY))
elements.append(Spacer(1, 5))
elements.append(sec_banner(
    "SECTION 1 — RESISTANCE MECHANISMS: Organisms | Mechanism | Genes | Resistant-to | Active Drugs | Detection | Notes",
    DARK_BLUE))
elements.append(Spacer(1, 4))
elements.append(build_overview_table(OV_DATA))
elements.append(Spacer(1, 6))
elements.append(legend_box(LEGEND_DATA))
elements.append(Spacer(1, 4))
for n in NOTES[:3]:
    elements.append(Paragraph(n, NOTE))
    elements.append(Spacer(1,2))

# ── PAGE 2: Matrix ────────────────────────────────────────────────────────────
from reportlab.platypus import PageBreak
elements.append(PageBreak())

mat_total_w = sum(MAT_CW)
mat_title = Table([
    [Paragraph("<b>SECTION 2 — DRUG × PATHOGEN SUSCEPTIBILITY MATRIX</b>",
               sty("MT", fontSize=14, fontName="Helvetica-Bold",
                   textColor=WHITE, alignment=TA_CENTER))],
    [Paragraph("36 Antibiotics × 7 Resistance Phenotypes  ·  Colour-coded Susceptibility",
               sty("MS", fontSize=9, fontName="Helvetica",
                   textColor=colors.HexColor("#aaccee"), alignment=TA_CENTER))],
], colWidths=[mat_total_w])
mat_title.setStyle(TableStyle([
    ("BACKGROUND",(0,0),(0,1), NAVY),
    ("TOPPADDING",(0,0),(0,1),5),("BOTTOMPADDING",(0,0),(0,1),5),
    ("LEFTPADDING",(0,0),(0,1),8),
]))
elements.append(mat_title)
elements.append(Spacer(1,5))
elements.append(build_matrix(MAT_DATA))
elements.append(Spacer(1,6))
elements.append(legend_box(LEGEND_DATA))
elements.append(Spacer(1,4))
for n in NOTES[3:]:
    elements.append(Paragraph(n, NOTE))
    elements.append(Spacer(1,2))

doc.build(elements)
print(f"PDF saved: {OUTPUT}")
Running Command

cd /home/daytona/workspace/gpc-gnb-chart && python resistance_patterns.py 2>&1

Running Command

ls -lh /home/daytona/workspace/gpc-gnb-chart/Antibiotic_Resistance_Patterns.pdf

Your 2-page PDF is ready:

Antibiotic Resistance Patterns

PDF Document · PDF


What's Inside (2 Pages, Landscape A3)

Page 1 - Resistance Mechanism Table

8 resistance phenotypes with full detail per row:
PhenotypeKey OrganismsMechanismGenes
ESBLE. coli, K. pneumoniae, P. mirabilisPlasmid β-lactamases hydrolyse cephalosporinsblaTEM, blaSHV, blaCTX-M
CREK. pneumoniae (KPC), E. coli, EnterobacterCarbapenemase production OR porin loss + AmpCblaKPC, blaNDM, blaVIM, blaOXA-48
AmpCSPACE organisms (Serratia, Pseudomonas, Acinetobacter, Citrobacter, Enterobacter)Inducible chromosomal AmpC; 3rd-gen cephalosporins induce itampC, blaCMY, blaDHA
MDR-PseudomonasP. aeruginosa (ICU/CF)Porin loss + efflux pumps + beta-lactamasesOprD, MexAB-OprM, blaVIM/IMP
CRABA. baumanniiOXA carbapenemases + efflux + impermeabilityblaOXA-23, blaNDM
MRSAS. aureus (HA/CA/LA)mecA → altered PBP2a (low β-lactam affinity)mecA, PVL toxin (CA-MRSA)
VREE. faecium (VanA/B)van genes modify peptidoglycan terminusvanA (high-level), vanB (variable)
StenotrophomonasS. maltophiliaIntrinsic MBL (L1) + cephalosporinase (L2) + effluxblaL1, blaL2

Page 2 - Drug × Pathogen Susceptibility Matrix

36 antibiotics across 12 drug classes vs 7 resistance phenotypes, colour-coded:
  • 🟢 S = Susceptible
  • 🔴 R = Resistant
  • 🟡 V = Variable
  • 🟣 I = Intermediate
  • S* / V* = With important clinical caveats (explained in footnotes)
Key clinical rules summarised in the PDF footnotes:
  • ESBL → Carbapenems are DOC; piperacillin-tazobactam is unreliable even if in-vitro susceptible
  • CRE-KPC → Ceftazidime-avibactam or Meropenem-vaborbactam
  • CRE-MBL (NDM) → Aztreonam-avibactam or Cefiderocol
  • MRSA pneumonia → Linezolid/Daptomycin (vancomycin penetrates lung poorly)
  • VRE → Linezolid (DOC) or Daptomycin; resistance can emerge on therapy
  • AmpC → Never rely on 3rd-gen cephalosporins even if susceptible in vitro; use Cefepime or Carbapenem
Sources: Harriet Lane Handbook 23e; Red Book 2021; Goldman-Cecil Medicine; Harrison's 22e; Medical Microbiology 9e

gnb lf and nlf seperate data

GNB split into Lactose Fermenters (LF) vs Non-Lactose Fermenters (NLF) — a classic microbiology classification based on MacConkey agar appearance.
Searching sources...
Finding Sources
Finding Sources
Reading File
I have the textbook data. Now building the PDF with LF and NLF clearly separated.
Writing File

~/gpc-gnb-chart/gnb_lf_nlf.py

from reportlab.lib.pagesizes import A3, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (
    SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT

OUTPUT = "/home/daytona/workspace/gpc-gnb-chart/GNB_LF_vs_NLF.pdf"

# ── Palette ───────────────────────────────────────────────────────────────────
NAVY        = colors.HexColor("#0d2b45")
# LF = pink/red theme (pink colonies on MacConkey)
LF_DARK     = colors.HexColor("#7b1d38")
LF_MID      = colors.HexColor("#c0392b")
LF_LIGHT    = colors.HexColor("#fadbd8")
LF_PALE     = colors.HexColor("#fef5f4")
LF_ALT      = colors.HexColor("#fdecea")
# NLF = colourless/white on MacConkey → use teal/grey-blue
NLF_DARK    = colors.HexColor("#0e4d5c")
NLF_MID     = colors.HexColor("#117a8b")
NLF_LIGHT   = colors.HexColor("#d1ecf1")
NLF_PALE    = colors.HexColor("#f0fafc")
NLF_ALT     = colors.HexColor("#e4f4f8")
# Sub-group headers
SUB_PINK    = colors.HexColor("#922b21")
SUB_TEAL    = colors.HexColor("#0e6655")
SUB_PURPLE  = colors.HexColor("#4a235a")
SUB_OLIVE   = colors.HexColor("#4d4011")
SUB_NAVY2   = colors.HexColor("#1a3a5c")

GREY        = colors.HexColor("#2c3e50")
LGREY       = colors.HexColor("#f2f3f4")
WHITE       = colors.white
BLACK       = colors.black

def sty(name, **kw):
    return ParagraphStyle(name, parent=getSampleStyleSheet()["Normal"], **kw)

TH   = sty("TH",  fontSize=8,   fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER, leading=10)
THL  = sty("THL", fontSize=8,   fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_LEFT,   leading=10)
TD   = sty("TD",  fontSize=7.5, fontName="Helvetica",       textColor=BLACK, alignment=TA_LEFT,   leading=9)
TDI  = sty("TDI", fontSize=7.5, fontName="Helvetica-Oblique",textColor=colors.HexColor("#1a3a5c"), alignment=TA_LEFT, leading=9)
TDC  = sty("TDC", fontSize=7.5, fontName="Helvetica",       textColor=BLACK, alignment=TA_CENTER, leading=9)
TDB  = sty("TDB", fontSize=7.5, fontName="Helvetica-Bold",  textColor=BLACK, alignment=TA_LEFT,   leading=9)
NOTE = sty("NOTE",fontSize=7,   fontName="Helvetica-Oblique",textColor=colors.HexColor("#555"),    alignment=TA_LEFT, leading=9)

def ph(t): return Paragraph(t, TH)
def p(t):  return Paragraph(t, TD)
def pi(t): return Paragraph(f"<i>{t}</i>", TDI)
def pb(t): return Paragraph(f"<b>{t}</b>", TDB)
def pc(t): return Paragraph(t, TDC)

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=landscape(A3),
    leftMargin=1.0*cm, rightMargin=1.0*cm,
    topMargin=1.2*cm,  bottomMargin=1.2*cm,
    title="GNB: Lactose Fermenters vs Non-Lactose Fermenters",
    author="Orris Medical Reference"
)

# ─────────────────────────────────────────────────────────────────────────────
# COLUMN DEFINITIONS
# Cols: No. | Genus | Species | MacConkey | O2 Req | Oxidase | Other Tests |
#       Key Disease | Treatment hints
# ─────────────────────────────────────────────────────────────────────────────
CW = [10, 38, 60, 38, 32, 28, 62, 88, 80]   # total ~436mm
HDR_ROW = [ph("#"), ph("GENUS"), ph("SPECIES"),
           ph("MacConkey\nColony"), ph("O₂\nReq."),
           ph("Oxidase"), ph("KEY TESTS /\nDISTINGUISHING FEATURES"),
           ph("KEY DISEASE"), ph("TREATMENT HINTS")]

# ─────────────────────────────────────────────────────────────────────────────
# DATA: (genus, species, macconkey, o2, oxidase, tests, disease, rx)
# ─────────────────────────────────────────────────────────────────────────────

# ══ LACTOSE FERMENTERS ═══════════════════════════════════════════════════════
# MacConkey: PINK to PINK-PURPLE colonies (acid production from lactose)

LF_SUBGROUPS = [
    # (subgroup_label, subgroup_bg, rows_list)
    (
        "▶  FAST LACTOSE FERMENTERS  (Pink/Pink-Purple colonies on MacConkey within 24h)",
        LF_DARK,
        [
            ("Escherichia", "E. coli",
             "Pink-Red\n(flat, dry)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Indole+;\nIMViC: ++-−;\nTSI: A/A, gas+;\nH₂S−",
             "UTI (most common cause);\nNeonatal meningitis;\nTraverler's diarrhea (ETEC);\nBloody diarrhea + HUS (O157:H7);\nBacteremia/Sepsis",
             "UTI: TMP-SMX, FQ, nitrofurantoin;\nSerious/ESBL: Carbapenem;\nO157:H7: supportive only\n(antibiotics worsen HUS)"),

            ("Klebsiella", "K. pneumoniae",
             "Pink, mucoid\n(large, viscous)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Urease+;\nIMViC: −−++;\nMucoid capsule;\nVoges-Proskauer+;\nTSI: A/A, gas+, H₂S−",
             "Hospital pneumonia\n('currant jelly' sputum);\nUTI, liver abscess;\nNeonatal meningitis;\nSepsis (ESBL/CRKP)",
             "Non-MDR: Cephalosporins, FQ;\nESBL: Carbapenem;\nCRKP: Ceftazidime-avibactam;\nMeropenem-vaborbactam"),

            ("Klebsiella", "K. oxytoca",
             "Pink, mucoid", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Indole+;\nUrease+; ONPG+;\nVP+",
             "UTI; antibiotic-associated\nhemorrhagic colitis;\nbacteremia",
             "Similar to K. pneumoniae;\nESBL strains: Carbapenem"),

            ("Enterobacter", "E. cloacae",
             "Pink-Purple\n(mucoid)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Motile;\nVP+; Citrate+;\nAmpC β-lactamase;\nTSI: A/A, gas+",
             "Nosocomial pneumonia;\nUTI; wound infections;\nbacteremia;\nMeningitis (neonates)",
             "Cefepime (if MIC ≤2);\nCarbapenem;\nFluoroquinolones;\nAvoid 3GC (AmpC)"),

            ("Enterobacter", "E. aerogenes\n(K. aerogenes)",
             "Pink, mucoid", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; VP+;\nMotile; Urease V;\nAmpC β-lactamase",
             "Nosocomial infections;\nUTI; pneumonia;\nbacteremia",
             "Same as E. cloacae;\nAvoid 3GC"),

            ("Serratia", "S. marcescens",
             "Pink/Red\n(red pigment)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Gelatinase+;\nDNase+; Lipase+;\nRed pigment (prodigiosin)\non some strains;\nSlate white if non-pigmented",
             "Hospital pneumonia;\nUTI; wound infections;\nEndocarditis (IV drug\nusers); keratitis;\nbacteremia",
             "TMP-SMX, FQ;\nCarbapenem for MDR;\nAvoid aminoglycosides\n(intrinsic resistance)"),

            ("Citrobacter", "C. freundii",
             "Pink\n(late fermenter)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; H₂S+;\nCitrate+; Indole−;\nAmpC + ESBL producer;\nTSI: A/A or K/A, H₂S+",
             "UTI; wound infections;\nneonatal meningitis;\nbrain abscess (neonates);\nbacteremia",
             "Carbapenem preferred;\nAvoid 3GC (AmpC);\nFQ if susceptible"),

            ("Citrobacter", "C. koseri",
             "Pink", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Indole+;\nH₂S−; Citrate+;\nURBAN: neonatal\nbrain abscess marker",
             "Neonatal brain abscess;\nmeningitis; UTI",
             "Carbapenem;\nExtended infusion\nfor serious infections"),
        ]
    ),
    (
        "▶  DELAYED / SLOW LACTOSE FERMENTERS  (Pale pink after 24h; or positive ONPG test)",
        colors.HexColor("#5d1a00"),
        [
            ("Hafnia", "H. alvei",
             "Pale pink\n(delayed)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; VP+ at 22°C;\nONPG+; Indole−;\nCitrate−",
             "Rare opportunist;\ngastroenteritis;\nbacteremia in\nimmunocompromised",
             "FQ; TMP-SMX;\nCarbapenem for serious"),

            ("Cronobacter", "C. sakazakii\n(Enterobacter s.)",
             "Yellow-pink\n(mucoid)", "Fac. Anaerobe",
             "Negative",
             "Yellow pigment;\nONPG+; VP+;\nMotile",
             "Neonatal meningitis\nand sepsis (powdered\nformula contamination);\nBrain abscess",
             "Carbapenem;\nCiprofloxacin;\nHigh mortality in neonates"),
        ]
    ),
]

# ══ NON-LACTOSE FERMENTERS ═══════════════════════════════════════════════════
# MacConkey: COLOURLESS / PALE colonies (no acid from lactose)

NLF_SUBGROUPS = [
    (
        "▶  NLF — ENTEROBACTERALES  (Pale/Colourless on MacConkey; Oxidase−; Fermentative)",
        NLF_DARK,
        [
            ("Salmonella", "S. typhi",
             "Colourless\n(pale, H₂S+)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; H₂S+ on TSI;\nLactose−; Motile;\nTSI: K/A, H₂S+;\nIMViC: −−−+;\nWidal test (serology)",
             "Typhoid fever:\nfever >38.5°C ≥3 days,\nrose spots, relative\nbradycardia, splenomegaly,\nconstipation > diarrhea",
             "Ceftriaxone (DOC);\nAzithromycin (oral);\nFluoroquinolone (check\nresistance);\nNEVER aminoglycosides"),

            ("Salmonella", "S. enteritidis /\ntyphimurium\n(non-typhoidal)",
             "Colourless\n(H₂S+)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; H₂S+;\nMotile; Lactose−;\nTSI: K/A, H₂S+",
             "Foodborne gastroenteritis\n(self-limiting);\nbacteremia in sickle\ncell, HIV patients",
             "Gastro: supportive\n(antibiotics may\nprolong carrier state);\nBacteremia: Ceftriaxone"),

            ("Shigella", "S. dysenteriae\n(most severe)",
             "Colourless", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; H₂S−;\nNon-motile;\nLactose−; Indole V;\nTSI: K/A, no gas;\nShiga toxin (type 1)",
             "Bloody dysentery;\nShiga toxin → HUS;\nhigh mortality without Rx;\nfecal-oral spread",
             "Azithromycin;\nCeftriaxone;\nFluoroquinolone (check\nresistance);\nAmpicillin (if sensitive)"),

            ("Shigella", "S. flexneri / sonnei /\nboydii",
             "Colourless", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Non-motile;\nH₂S−; Gas−;\nNo toxin (flexneri/sonnei)",
             "Bacillary dysentery\n(flexneri, boydii);\nMild watery→bloody\ndiarrhea (sonnei)",
             "Azithromycin;\nCiprofloxacin;\nCeftriaxone"),

            ("Proteus", "P. mirabilis",
             "Colourless\n(swarming haze)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Urease+++;\nSwarming motility;\nIndole−; H₂S+;\nTSI: K/A, H₂S+;\nPhenylpyruvic acid+",
             "UTI (2nd most common);\nstaghorn calculi\n(urease → struvite);\nwound infections",
             "Ampicillin-sulbactam;\nCephalosporins;\nTMP-SMX; FQ;\nCarbapenem if MDR"),

            ("Proteus", "P. vulgaris",
             "Colourless\n(swarming)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Urease+;\nIndole+; H₂S+;\nSwarming less\nprominent",
             "UTI; wound infections;\nbacteremia",
             "Avoid ampicillin\n(intrinsic resistant);\nCephalosporins; FQ;\nCarbapenem for MDR"),

            ("Yersinia", "Y. pestis",
             "Colourless\n(small, grey)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Urease−;\nBipolar 'safety-pin'\nstaining (Wayson);\nGrows at 28°C;\nNon-motile at 37°C;\nFragilin antigen F1",
             "PLAGUE:\nBubonic (bubo);\nPneumonic (droplet);\nSepticemic;\nBioterrorism category A",
             "Streptomycin (DOC);\nGentamicin;\nDoxycycline;\nCiprofloxacin"),

            ("Yersinia", "Y. enterocolitica",
             "Pale pink\n(delayed)", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Urease+;\nMotile at 22°C;\nVP+ at 22°C;\nCold enrichment\n(4°C) for isolation;\nTSI: K/A or A/A",
             "Enterocolitis;\nmesenteric adenitis\n(mimics appendicitis);\nreactive arthritis;\nbacteria in cold meats/\npork products",
             "Mild: self-limiting;\nSevere: TMP-SMX,\nciprofloxacin,\ndoxycycline;\nSepsis: ceftriaxone"),

            ("Morganella", "M. morganii",
             "Colourless", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Urease+;\nIndole+; H₂S−;\nPhenylalanine\ndeaminase+;\nMotile",
             "UTI; wound infections;\nneonatal meningitis;\nnecrotizing fasciitis;\nbacteremia",
             "TMP-SMX; FQ;\nIntrinsic resistant to\npenicillin + colistin;\nCarbapenem for MDR"),

            ("Providencia", "P. stuartii /\nP. rettgeri",
             "Colourless", "Fac. Anaerobe",
             "Negative",
             "Oxidase−; Urease+;\nMotile; Indole+;\nPhenylalanine\ndeaminase+",
             "UTI in long-term\ncatheterised patients;\nwound infections;\nbacteremia;\nburn wound infections",
             "FQ; Carbapenem;\nIntrinsically resistant\nto many agents;\nAmikacin may work"),
        ]
    ),
    (
        "▶  NLF — NON-FERMENTATIVE GNB  (Pale/Colourless on MacConkey; variable Oxidase; Oxidative or non-reactive)",
        NLF_MID,
        [
            ("Pseudomonas", "P. aeruginosa",
             "Colourless/Green\n(blue-green pigment,\ngrape-like odour)", "Strict Aerobe",
             "POSITIVE",
             "Oxidase+; Pyocyanin\n(blue-green pigment);\nPyoverdin (fluorescent);\nNon-fermenter;\nGlucose: oxidative;\nTSI: K/K (no rxn);\nOdour: grape-like",
             "Burn/wound infections;\nVAP (ICU, ventilator);\nCF chronic lung disease;\nHot-tub folliculitis;\nExternal otitis\n('swimmer's ear');\nEcthyma gangrenosum\n(black skin lesions)",
             "Anti-pseudomonal\nβ-lactam (pip-tazo,\nceftazidime, cefepime,\nceftolozane-tazo);\n+ aminoglycoside for\nserious infections;\nColistin for XDR"),

            ("Pseudomonas", "P. fluorescens /\nP. putida",
             "Colourless\n(fluorescent)", "Strict Aerobe",
             "POSITIVE",
             "Oxidase+; Pyoverdin\n(fluorescent);\nNon-fermenter;\nGrows at 4°C",
             "Rare; blood/IV product\ncontamination;\nbacteremia in\nimmunocompromised",
             "Pip-tazo; FQ;\nCarbapenem"),

            ("Acinetobacter", "A. baumannii",
             "Colourless /\nPale grey\n(mucoid)", "Strict Aerobe",
             "NEGATIVE",
             "Oxidase−; Coccobacillus\n(short rods → cocci\nafter 48h);\nNon-motile;\nNon-fermenter;\nGlucose: oxidative\nor non-reactive;\nGrows on MacConkey",
             "VAP (ICU);\nWound infections\n(war wounds);\nbacteremia; UTI;\nSurvives on dry\nsurfaces 3+ weeks;\nHospital outbreaks",
             "Sulbactam-based\n(Amp-sulbactam);\nColistin/Polymyxin B;\nTigecycline;\nCefiderocol;\nMinocycline"),

            ("Stenotrophomonas", "S. maltophilia",
             "Pale yellow\n(lavender odour)", "Strict Aerobe",
             "POSITIVE",
             "Oxidase+/weak;\nDNase+; Lipase+;\nOxidative (not\nfermentative);\nLavender-green odour;\nResistant to\ncarbapenems",
             "VAP in ICU;\nPneumonia in CF;\nbacteremia in\nimmunocompromised;\nBronchiectasis",
             "TMP-SMX (DOC);\nLevofloxacin;\nMinocycline;\nTigecycline;\nCarbapenem: RESISTANT"),

            ("Burkholderia", "B. cepacia complex\n(Bcc)",
             "Pale pink /\nColourless", "Strict Aerobe",
             "POSITIVE",
             "Oxidase+; Motile;\nOxidative; Lysine+;\nONPG+; Oxidase+;\nResistant to\npolymyxins",
             "CF lung colonisation\n(poor prognosis);\nHospital infections;\nbacteremia;\nPneumonia",
             "TMP-SMX;\nMeropenem;\nCeftazidime;\nChloramphenicol;\nIntrinsic polymyxin R"),

            ("Burkholderia", "B. pseudomallei",
             "Colourless\n(wrinkled colony)", "Strict Aerobe",
             "POSITIVE",
             "Oxidase+; Bipolar\nstaining ('safety pin');\nOxidative; Motile;\nArginine+; Grows\n41–42°C;\nBiohazard L3",
             "MELIOIDOSIS:\npneumonia, sepsis,\nliver/spleen abscesses;\nendemic SE Asia,\nN. Australia;\nmimics TB",
             "IV: Ceftazidime or\nMeropenem ×14 days;\nEradication: TMP-SMX\n×3–6 months"),
        ]
    ),
    (
        "▶  NLF — FASTIDIOUS & CURVED GNB  (Require special media; slow/special growth)",
        SUB_PURPLE,
        [
            ("Haemophilus", "H. influenzae",
             "Does not grow on\nMacConkey\n(requires X+V)", "Fac. Anaerobe",
             "POSITIVE",
             "Requires hemin (X factor)\n+ NAD (V factor);\nSatellitism around\nS. aureus on blood agar;\nCapsule type b = PRP;\nOxidase+",
             "Type b: meningitis,\nepiglottitis, sepsis;\nnon-typeable:\notitis media, sinusitis,\nCOPD exacerbation;\npneumonia",
             "Type b meningitis:\nCeftriaxone;\nMild: Amoxicillin-\nclavulanate;\nβ-lactamase strains:\ncephalosporins"),

            ("Legionella", "L. pneumophila",
             "Does not grow on\nMacConkey\n(BCYE agar)", "Strict Aerobe",
             "POSITIVE\n(weak)",
             "Requires L-cysteine;\nBCYE agar only;\nUrinary antigen test\n(serogroup 1);\nSilver stain in tissue;\nDIF smear",
             "Legionnaire's disease\n(severe pneumonia);\nPontiac fever\n(self-limiting)\n(flu-like, no pneumonia);\nSource: water tanks,\nAC systems",
             "Azithromycin (DOC);\nLevofloxacin;\nDoxycycline;\nDuration: 7–10 days\n(21 days if immuno-)"),

            ("Bordetella", "B. pertussis",
             "Does not grow on\nMacConkey\n(Bordet-Gengou)", "Strict Aerobe",
             "POSITIVE",
             "Bordet-Gengou agar;\nRegan-Lowe medium;\nDFA or PCR\n(gold standard);\nLymphocytosis++\n(pertussis toxin);\nFilamentous\nhemagglutinin (FHA)",
             "Whooping cough:\nCatarrhal → Paroxysmal\n(whoop + apnoea) →\nConvalescent;\nMost severe in infants;\nVaccine-preventable",
             "Azithromycin (DOC);\nClarithromycin;\nTMP-SMX (alternative);\nTreat close contacts;\nVaccine: DTaP/Tdap"),

            ("Campylobacter", "C. jejuni",
             "Does not grow on\nstandard MacConkey\n(CCDA/Skirrow)", "Microaerophile\n(5% O₂)",
             "POSITIVE",
             "Skirrow or CCDA\nmedium; 42°C;\nComma/S-shaped rods;\nDarting motility;\nOxidase+; Hippurate+\n(distinguishes from\nC. coli)",
             "Most common bacterial\ndiarrhoea worldwide;\nbloody diarrhoea;\npost-infectious GBS\n(Guillain-Barré);\nReactive arthritis;\nZoonosis (poultry)",
             "Mild: self-limiting;\nSevere: Azithromycin;\nAlternative: FQ\n(but resistance rising);\nNEVER\ncephalosporins"),

            ("Helicobacter", "H. pylori",
             "Does not grow on\nMacConkey\n(Skirrow/CA)", "Microaerophile\n(5% O₂)",
             "POSITIVE",
             "Urease+++ (CLO test);\nOxidase+; Catalase+;\nSpiral rods;\nGrows at 37°C;\nUrea breath test;\nStool antigen test;\nHistology (Giemsa)",
             "Peptic ulcer disease\n(gastric + duodenal);\nGastric adenocarcinoma;\nMALT lymphoma;\nFunctional dyspepsia;\nPresent in ~50% world\npopulation",
             "Triple therapy:\nPPI + Clarithromycin +\nAmoxicillin ×7–14d;\nQuadruple (bismuth):\nPPI+Bismuth+Metronidazole\n+Tetracycline;\nLevo-based for resistant"),

            ("Vibrio", "V. cholerae\n(O1 / O139)",
             "Pale/colourless on\nMacConkey;\nGrows on TCBS\n(yellow colonies)", "Fac. Anaerobe",
             "POSITIVE",
             "Oxidase+; Curved rod;\nRapid darting motility;\nTCBS agar (yellow\ncolonies = cholera);\nO1 antigen: El Tor\n(El Tor biotype\nnow dominant);\nCholeragen toxin",
             "CHOLERA:\nRice-water diarrhoea;\nmassive fluid loss\n(up to 20 L/day);\nHypovolaemic shock;\nmortality without Rx",
             "ORS/IV fluids (main Rx);\nDoxycycline;\nAzithromycin;\nSingle dose cipro"),

            ("Neisseria", "N. meningitidis",
             "Does not grow\non MacConkey\n(chocolate agar)",  "Strict Aerobe",
             "POSITIVE",
             "Oxidase+; Gram-neg\ndiplococcus; Ferments\nglucose AND maltose\n(vs. N. gonorrhoeae);\nPolysaccharide capsule\nserogroups A,B,C,W,Y;\nCSF India ink−",
             "Bacterial meningitis;\nWaterhouse-Friderichsen\nsyndrome (adrenal\nhaemorrhage, DIC);\nMeningococcaemia;\nPetechial/purpuric rash;\nHigh mortality without Rx",
             "Ceftriaxone (DOC);\nPenicillin G (if sens.);\nChemoprophylaxis:\nRifampicin or\nciprofloxacin for\nclose contacts;\nVaccines: MenACWY,\nMenB"),

            ("Neisseria", "N. gonorrhoeae",
             "Does not grow\non MacConkey\n(Thayer-Martin)", "Strict Aerobe",
             "POSITIVE",
             "Oxidase+; Gram-neg\ndiplococcus; Ferments\nglucose ONLY;\nRequires CO₂;\nThayer-Martin medium;\nIntracellular in PMNs\non Gram smear;\nNuclease+",
             "Gonorrhoea (urethritis,\ncervicitis);\nPID; Fitz-Hugh-\nCurtis syndrome;\nSeptic arthritis\n(DGI); Neonatal\nophthalmia neonatorum",
             "Ceftriaxone 500mg IM\n(dual Rx: +\nazithromycin if\nchlamydia not excluded);\nNo fluoroquinolones\n(widespread resistance)"),
        ]
    ),
]

# ── Build tables ──────────────────────────────────────────────────────────────
def make_title():
    total_w = sum(CW)
    tt = Table([
        [Paragraph("<b>GRAM-NEGATIVE BACILLI (GNB)</b>",
                   sty("T1", fontSize=19, fontName="Helvetica-Bold",
                       textColor=WHITE, alignment=TA_CENTER))],
        [Paragraph("LACTOSE FERMENTERS (LF)  ⟵  MacConkey Agar  ⟶  NON-LACTOSE FERMENTERS (NLF)",
                   sty("T2", fontSize=10, fontName="Helvetica",
                       textColor=colors.HexColor("#aaccee"), alignment=TA_CENTER))],
        [Paragraph("Complete Species Reference  ·  Taxonomy · Colony Appearance · Key Tests · Disease · Treatment  ·  Orris Medical Reference 2026",
                   sty("T3", fontSize=8, fontName="Helvetica-Oblique",
                       textColor=colors.HexColor("#88aacc"), alignment=TA_CENTER))],
    ], colWidths=[total_w])
    tt.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(0,2), NAVY),
        ("TOPPADDING",   (0,0),(0,2), 5),
        ("BOTTOMPADDING",(0,0),(0,2), 5),
    ]))
    return tt

def make_macckey_banner(lf=True):
    total_w = sum(CW)
    if lf:
        text  = "🔴  LACTOSE FERMENTERS (LF)  —  PINK to PINK-PURPLE colonies on MacConkey Agar  (acid + bile precipitate = colour change)"
        bg    = LF_DARK
    else:
        text  = "⬜  NON-LACTOSE FERMENTERS (NLF)  —  COLOURLESS / PALE colonies on MacConkey Agar  (no acid from lactose)"
        bg    = NLF_DARK
    tt = Table([[Paragraph(f"  <b>{text}</b>",
                           sty("BN", fontSize=10, fontName="Helvetica-Bold",
                               textColor=WHITE, alignment=TA_LEFT, leading=12))]],
               colWidths=[total_w])
    tt.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(0,0), bg),
        ("TOPPADDING",(0,0),(0,0),5),("BOTTOMPADDING",(0,0),(0,0),5),
        ("LEFTPADDING",(0,0),(0,0),10),
    ]))
    return tt

def make_subgroup_banner(label, bg):
    total_w = sum(CW)
    tt = Table([[Paragraph(f"  <b>{label}</b>",
                           sty("SG", fontSize=8.5, fontName="Helvetica-Bold",
                               textColor=WHITE, alignment=TA_LEFT, leading=11))]],
               colWidths=[total_w])
    tt.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(0,0), bg),
        ("TOPPADDING",(0,0),(0,0),3),("BOTTOMPADDING",(0,0),(0,0),3),
        ("LEFTPADDING",(0,0),(0,0),10),
    ]))
    return tt

def build_data_table(groups, row_offset=0):
    """Build one Table object for a list of subgroups."""
    all_rows  = [HDR_ROW]
    cmd = [
        ("GRID",      (0,0),(-1,-1), 0.3, colors.HexColor("#bbbbbb")),
        ("BACKGROUND",(0,0),(-1,0), GREY),
        ("VALIGN",    (0,0),(-1,-1), "TOP"),
        ("ALIGN",     (0,0),(-1,-1), "LEFT"),
        ("ALIGN",     (0,0),(-1,0), "CENTER"),
        ("TOPPADDING",    (0,0),(-1,-1), 3),
        ("BOTTOMPADDING", (0,0),(-1,-1), 3),
        ("LEFTPADDING",   (0,0),(-1,-1), 4),
        ("RIGHTPADDING",  (0,0),(-1,-1), 3),
        ("LINEBELOW",(0,0),(-1,0), 1.0, WHITE),
    ]

    row_num = 0  # data counter (for numbering)
    table_row_idx = 1  # 0 = header

    for grp_label, grp_bg, rows in groups:
        # Sub-group separator row
        sep_row = [Paragraph(f"<b>  {grp_label}</b>",
                             sty("SR", fontSize=8.5, fontName="Helvetica-Bold",
                                 textColor=WHITE, alignment=TA_LEFT, leading=11))]
        sep_row += [p("")] * (len(CW) - 1)
        all_rows.append(sep_row)
        cmd.append(("SPAN",       (0,table_row_idx),(-1,table_row_idx)))
        cmd.append(("BACKGROUND", (0,table_row_idx),(-1,table_row_idx), grp_bg))
        cmd.append(("LINEABOVE",  (0,table_row_idx),(-1,table_row_idx), 1.0, colors.HexColor("#666")))
        table_row_idx += 1

        for row in rows:
            genus, spp, macconkey, o2, oxidase, tests, disease, rx = row
            tr = [
                pc(str(row_offset + row_num + 1)),
                pb(genus),
                pi(spp),
                p(macconkey),
                pc(o2),
                Paragraph(f"<b>{oxidase}</b>",
                          sty("OX", fontSize=7.5, fontName="Helvetica-Bold",
                              textColor=(colors.HexColor("#1e8449") if "POSITIVE" in oxidase.upper()
                                         else colors.HexColor("#c0392b")),
                              alignment=TA_CENTER, leading=9)),
                p(tests),
                p(disease),
                p(rx),
            ]
            bg = LF_LIGHT if row_num % 2 == 0 else LF_PALE
            all_rows.append(tr)
            cmd.append(("BACKGROUND", (0,table_row_idx),(-1,table_row_idx),
                        bg if "LF" in grp_label else
                        (NLF_LIGHT if row_num % 2 == 0 else NLF_PALE)))
            table_row_idx += 1
            row_num += 1

    ts = TableStyle(cmd)
    t  = Table(all_rows, colWidths=CW, repeatRows=1)
    t.setStyle(ts)
    return t, row_num

# ── Legend ────────────────────────────────────────────────────────────────────
total_w = sum(CW)
def make_legend():
    legend_data = [
        [pb("MacConkey Agar Key:"),
         p("Pink/Pink-Purple = Lactose Fermenters (acid from lactose → colour change with neutral red indicator)"),
         pb("   Colourless/Pale = Non-Lactose Fermenters (no acid production)"),
         p("Yellow on TCBS = Vibrio cholerae")],
    ]
    lt = Table(legend_data, colWidths=[60, 160, 130, 90])
    lt.setStyle(TableStyle([
        ("BACKGROUND",(0,0),(-1,-1), LGREY),
        ("BOX",(0,0),(-1,-1),0.8, colors.grey),
        ("VALIGN",(0,0),(-1,-1),"MIDDLE"),
        ("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4),
        ("LEFTPADDING",(0,0),(-1,-1),5),
    ]))
    return lt

NOTES = [
    "O₂ Req: Fac. Anaerobe = Facultative Anaerobe (grows with or without O₂). Strict Aerobe = requires O₂. Microaerophile = requires 5% O₂.",
    "TSI = Triple Sugar Iron agar: K/A = alkaline slant/acid butt; A/A = acid/acid. H₂S+ = black precipitate. IMViC = Indole, Methyl Red, Voges-Proskauer, Citrate.",
    "Oxidase+/− refers to cytochrome C oxidase test. All Enterobacteriaceae are Oxidase−. Pseudomonas, Campylobacter, Helicobacter, Neisseria, Vibrio are Oxidase+.",
    "ESBL-producing species (E. coli, Klebsiella, Proteus, Enterobacter, Citrobacter): always confirm susceptibility; carbapenem for serious infections.",
    "Sources: Medical Microbiology 9e (Murray et al.), pp. 296-298; Henry's Clinical Diagnosis & Laboratory Methods; Harriet Lane Handbook 23e.",
]

# ── Assemble ──────────────────────────────────────────────────────────────────
elements = []
elements.append(make_title())
elements.append(Spacer(1, 5))

# LF section
elements.append(make_macckey_banner(lf=True))
elements.append(Spacer(1, 4))
lf_table, lf_count = build_data_table(LF_SUBGROUPS, row_offset=0)
elements.append(lf_table)
elements.append(Spacer(1, 8))

# NLF section
elements.append(make_macckey_banner(lf=False))
elements.append(Spacer(1, 4))
nlf_table, nlf_count = build_data_table(NLF_SUBGROUPS, row_offset=lf_count)
elements.append(nlf_table)
elements.append(Spacer(1, 6))

# Legend + notes
elements.append(make_legend())
elements.append(Spacer(1, 5))
for n in NOTES:
    elements.append(Paragraph(n, NOTE))
    elements.append(Spacer(1, 2))

doc.build(elements)
print(f"PDF saved: {OUTPUT}")
Running Command

cd /home/daytona/workspace/gpc-gnb-chart && python gnb_lf_nlf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/gpc-gnb-chart/GNB_LF_vs_NLF.pdf

Your PDF is ready:

GNB LF vs NLF

PDF Document · PDF


Full Reference Summary


🔴 LACTOSE FERMENTERS (LF)

Pink/Pink-Purple colonies on MacConkey (acid from lactose → neutral red indicator turns pink)
#GenusSpeciesO₂OxidaseKey TestsKey Disease
1EscherichiaE. coliFac.Indole+; IMViC ++−−; TSI A/AUTI, neonatal meningitis, HUS (O157:H7)
2KlebsiellaK. pneumoniaeFac.Urease+; mucoid capsule; VP+; TSI A/AHospital pneumonia ("currant jelly"), UTI, liver abscess
3KlebsiellaK. oxytocaFac.Indole+; Urease+; ONPG+UTI, hemorrhagic colitis, bacteremia
4EnterobacterE. cloacaeFac.VP+; Citrate+; AmpC β-lactamaseNosocomial pneumonia, UTI, bacteremia
5EnterobacterE. aerogenesFac.VP+; motile; AmpCHospital-acquired infections
6SerratiaS. marcescensFac.DNase+; red pigment; Gelatinase+Hospital pneumonia, UTI, endocarditis (IVDU)
7CitrobacterC. freundiiFac.H₂S+; Citrate+; Indole−; AmpCUTI, neonatal meningitis, brain abscess
8CitrobacterC. koseriFac.Indole+; H₂S−; Citrate+Neonatal brain abscess
9HafniaH. alveiFac.VP+ at 22°C; ONPG+Rare opportunist, gastroenteritis
10CronobacterC. sakazakiiFac.Yellow pigment; VP+; ONPG+Neonatal meningitis (powdered formula)

⬜ NON-LACTOSE FERMENTERS (NLF)

Colourless/Pale colonies on MacConkey (no acid from lactose)
NLF Enterobacterales (Oxidase−, Fermentative):
#GenusSpeciesOxidaseKey TestsKey Disease
11SalmonellaS. typhiH₂S+; TSI K/A; non-motile at 37°C; Widal testTyphoid fever (rose spots, relative bradycardia)
12SalmonellaS. enteritidis/typhimuriumH₂S+; motile; TSI K/AFoodborne gastroenteritis
13ShigellaS. dysenteriaeNon-motile; H₂S−; gas−; Shiga toxinSevere bloody dysentery, HUS
14ShigellaS. flexneri/sonnei/boydiiNon-motile; no toxinBacillary dysentery (flexneri), mild diarrhea (sonnei)
15ProteusP. mirabilisSwarming; Urease+++; H₂S+; Indole−UTI, staghorn calculi
16ProteusP. vulgarisSwarming; Urease+; Indole+UTI, wound infections
17YersiniaY. pestisSafety-pin staining (Wayson); non-motile at 37°CPLAGUE (bubonic/pneumonic/septicemic)
18YersiniaY. enterocoliticaUrease+; motile at 22°C; cold enrichmentEnterocolitis, mesenteric adenitis
19MorganellaM. morganiiUrease+; Indole+; Phenylalanine deaminase+UTI, wound infections, necrotizing fasciitis
20ProvidenciaP. stuartiiUrease+; Phenylalanine deaminase+; Indole+UTI in catheterised patients, burn wounds
NLF Non-Fermentative (Strict Aerobes, variable Oxidase):
#GenusSpeciesOxidaseKey TestsKey Disease
21PseudomonasP. aeruginosa+Pyocyanin (blue-green); grape odour; TSI K/KBurn infections, VAP, CF lung, ecthyma gangrenosum
22AcinetobacterA. baumanniiCoccobacillus; non-motile; oxidative/non-reactiveVAP, ICU outbreaks, war wounds; CRAB
23StenotrophomonasS. maltophilia+DNase+; lavender odour; carbapenem resistantVAP, CF pneumonia; TMP-SMX
24BurkholderiaB. cepacia complex+Oxidase+; Lysine+; polymyxin RCF colonisation, bacteremia
25BurkholderiaB. pseudomallei+Safety-pin staining; wrinkled colony; grows 42°CMelioidosis (SE Asia)
Fastidious & Curved GNB (special media required):
#GenusSpeciesOxidaseKey GrowthKey Disease
26HaemophilusH. influenzae+Requires X + V factors; satellitismMeningitis (type b), epiglottitis, otitis media
27LegionellaL. pneumophila+BCYE agar only; urinary antigen testLegionnaire's disease, Pontiac fever
28BordetellaB. pertussis+Bordet-Gengou agar; lymphocytosisWhooping cough
29CampylobacterC. jejuni+Skirrow agar; 42°C; microaerophileMost common bacterial diarrhea; Guillain-Barré
30HelicobacterH. pylori+Urease+++; CLO test; Urea breath testPeptic ulcer, gastric cancer, MALT lymphoma
31VibrioV. cholerae+TCBS (yellow colonies); choleragen toxinCholera (rice-water diarrhea)
32NeisseriaN. meningitidis+Chocolate agar; ferments glucose + maltoseBacterial meningitis; Waterhouse-Friderichsen
33NeisseriaN. gonorrhoeae+Thayer-Martin; ferments glucose onlyGonorrhea, PID, neonatal ophthalmia
Source: Medical Microbiology 9e (Murray et al.), p. 296-298 — "Fermentation of lactose (detected by color changes in lactose-containing media such as MacConkey agar) is used to differentiate some enteric pathogens that do not ferment lactose (Salmonella, Shigella, Yersinia - colorless) from lactose-fermenting species (Escherichia, Klebsiella, Enterobacter, Citrobacter, Serratia - pink-purple colonies)."
This is a shared conversation. Sign in to Orris to start your own chat.