Write a lecture on these *TOPIC: DETECTION METHODS OF MICROBES* *Topic Content:* Principles of microbial detection (e.g., culture media, microscopy, biochemical tests) *Learning Objectives:* - List of common methods of microbial detection - Defines culture, staining, and sensitivity testing - Discuss various principles of microbial detection - Demonstrated staining, sensitivity and culture
"Bacteriological Techniques"[MeSH Terms] AND "Microbial Sensitivity Tests"[MeSH Terms]
Gram stain gram-positive cocci and gram-negative bacilli microscopy
disk diffusion antibiotic susceptibility zone of inhibition Mueller-Hinton agar
| Group | Methods | Main purpose |
|---|---|---|
| Microscopy | Gram stain, acid-fast (Ziehl-Neelsen) stain, negative stain (India ink/nigrosin), wet mount, fluorescence (auramine-rhodamine), dark-field | Rapid, direct look at morphology |
| Culture | Blood agar, MacConkey, selective, enrichment and differential media; broth culture; blood culture bottles | Isolate and grow the organism |
| Biochemical tests | Catalase, coagulase, oxidase, urease, indole, citrate, sugar fermentation, triple sugar iron (TSI) | Identify species |
| Sensitivity testing | Disk diffusion, broth/agar dilution (MIC), gradient strip (E-test) | Guide drug choice |
| Immunological | Antigen detection, ELISA, latex agglutination, serology | Detect antigen or antibody |
| Molecular | PCR, real-time PCR, sequencing, MALDI-TOF mass spectrometry | Rapid, sensitive identification, resistance genes |
| Type | Function | Example |
|---|---|---|
| Basal / non-selective | Grows most organisms | Nutrient agar; blood agar (5% sheep blood is the standard clinical medium) |
| Enriched | Supports fastidious organisms | Chocolate agar (Haemophilus, Neisseria) |
| Selective | Inhibits unwanted flora, allows target growth | TCBS for Vibrio cholerae; bismuth sulfite for Salmonella |
| Differential | Colony colour or appearance separates organisms | MacConkey, EMB (lactose fermenters versus non-fermenters) |
| Enrichment (liquid) | Favours a small number of target organisms | Alkaline peptone water for Vibrio |
| Transport | Preserves organisms in transit | Stuart's, Amies |
| Test | Principle | Typical use |
|---|---|---|
| Catalase | Catalase splits H₂O₂ into O₂ (bubbles) | Staphylococci (positive) versus streptococci (negative) |
| Coagulase | Clots plasma | S. aureus (positive) |
| Oxidase | Cytochrome oxidase oxidizes a dye (purple) | Pseudomonas, Neisseria (positive) |
| Urease | Urea → ammonia, raises pH | Proteus, H. pylori |
| Indole | Tryptophanase makes indole | E. coli (positive) |
| Citrate | Uses citrate as sole carbon source | Klebsiella (positive), E. coli (negative) |
| Sugar fermentation / TSI | Acid production changes indicator colour | Enterobacterales |

| Method | Strength | Limitation |
|---|---|---|
| Gram stain | Fast, cheap, guides early therapy | Needs about 10⁵ organisms/mL; cannot identify species |
| Culture | Gold standard, gives an isolate for AST | Slow (1-3 days or more); fastidious organisms may fail; prior antibiotics reduce yield |
| Biochemical tests | Cheap, reliable identification | Takes extra time after culture |
| Disk diffusion | Simple, low cost | Qualitative; strict standardization needed |
| MIC methods | Quantitative | More labour or cost |
| Molecular | Very fast, sensitive | Costly; detects DNA from dead organisms; does not always show phenotypic resistance |
Make a PPT presentation of this lecture
~/
mkdir -p /tmp/workspace/microbe-detection-ppt/assets /tmp/workspace/microbe-detection-ppt/output && cd /tmp/workspace/microbe-detection-ppt && python /tmp/skills/shared/scripts/fetch_images.py "https://cdn.orris.care/cdss_images/HARRISON_1763035966873_8460ba69-de47-4ffd-8e86-a36f06bb7d86.png" > assets/img.json; python - <<'E' import json,base64 d=json.load(open('assets/img.json')) for x in d: print(x['url'][-20:],x['error']) if x['base64']: h,b=x['base64'].split(',',1) if ',' in x['base64'] else x['base64'].split(';base64,') open('assets/fig.png','wb').write(base64.b64decode(b)) from PIL import Image print(Image.open('assets/fig.png').size) E
~/microbe-detection-ppt/build.py
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
NAVY = RGBColor(0x0B, 0x25, 0x45)
TEAL = RGBColor(0x13, 0x8A, 0x8C)
LIGHT = RGBColor(0xF2, 0xF7, 0xF9)
CORAL = RGBColor(0xE0, 0x5A, 0x3A)
GREY = RGBColor(0x44, 0x4F, 0x5A)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
PALE_TEAL = RGBColor(0xDC, 0xEF, 0xEF)
FONT = "Calibri"
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
BLANK = prs.slide_layouts[6]
page = [0]
def rect(slide, x, y, w, h, fill, shape=MSO_SHAPE.RECTANGLE, line=None):
s = slide.shapes.add_shape(shape, Inches(x), Inches(y), Inches(w), Inches(h))
s.fill.solid()
s.fill.fore_color.rgb = fill
if line is None:
s.line.fill.background()
else:
s.line.color.rgb = line
s.line.width = Pt(1)
s.shadow.inherit = False
return s
def text(slide, x, y, w, h, content, size=18, bold=False, color=GREY,
align=PP_ALIGN.LEFT, anchor=MSO_ANCHOR.TOP, spacing=None):
"""content: str or list of str / (str, dict) paragraphs."""
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.vertical_anchor = anchor
tf.margin_left = tf.margin_right = Inches(0.05)
tf.margin_top = tf.margin_bottom = Inches(0.03)
items = content if isinstance(content, list) else [content]
for i, it in enumerate(items):
opts = {}
if isinstance(it, tuple):
it, opts = it
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.alignment = opts.get("align", align)
if spacing:
p.space_after = Pt(spacing)
r = p.add_run()
r.text = it
r.font.name = FONT
r.font.size = Pt(opts.get("size", size))
r.font.bold = opts.get("bold", bold)
r.font.color.rgb = opts.get("color", color)
return tb
def bullets(slide, x, y, w, h, items, size=18, color=GREY, gap=8):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = tf.margin_right = Inches(0.05)
for i, it in enumerate(items):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.space_after = Pt(gap)
if isinstance(it, tuple):
head, rest = it
r1 = p.add_run()
r1.text = "\u2022 " + head
r1.font.bold = True
r1.font.color.rgb = NAVY
r1.font.size = Pt(size)
r1.font.name = FONT
r2 = p.add_run()
r2.text = " " + rest
r2.font.size = Pt(size)
r2.font.color.rgb = color
r2.font.name = FONT
else:
r = p.add_run()
r.text = "\u2022 " + it
r.font.size = Pt(size)
r.font.color.rgb = color
r.font.name = FONT
return tb
def new_slide(title, source=None, notes=None):
s = prs.slides.add_slide(BLANK)
page[0] += 1
rect(s, 0, 0, 13.333, 7.5, WHITE)
rect(s, 0, 0, 0.25, 7.5, TEAL)
text(s, 0.6, 0.35, 12.2, 0.8, title, size=32, bold=True, color=NAVY,
anchor=MSO_ANCHOR.MIDDLE)
rect(s, 0.65, 1.2, 1.4, 0.06, CORAL)
if source:
text(s, 0.6, 7.0, 11.2, 0.35, source, size=11, color=RGBColor(0x7A, 0x86, 0x90))
text(s, 12.2, 7.0, 0.8, 0.35, str(page[0] + 1), size=11,
color=RGBColor(0x7A, 0x86, 0x90), align=PP_ALIGN.RIGHT)
if notes:
s.notes_slide.notes_text_frame.text = notes
return s
def table(slide, x, y, w, col_w, rows, size=14, row_h=0.55, header_size=None):
nrows, ncols = len(rows), len(rows[0])
gs = slide.shapes.add_table(nrows, ncols, Inches(x), Inches(y), Inches(w),
Inches(row_h * nrows))
t = gs.table
tblPr = gs._element.graphic.graphicData.tbl.tblPr
# remove built-in style banding look by explicit fills
for ci, cw in enumerate(col_w):
t.columns[ci].width = Inches(cw)
for ri, row in enumerate(rows):
t.rows[ri].height = Inches(row_h)
for ci, val in enumerate(row):
c = t.cell(ri, ci)
c.fill.solid()
if ri == 0:
c.fill.fore_color.rgb = NAVY
else:
c.fill.fore_color.rgb = LIGHT if ri % 2 else WHITE
c.margin_left = c.margin_right = Inches(0.1)
c.margin_top = c.margin_bottom = Inches(0.04)
c.vertical_anchor = MSO_ANCHOR.MIDDLE
tf = c.text_frame
tf.word_wrap = True
p = tf.paragraphs[0]
r = p.add_run()
r.text = val
r.font.name = FONT
r.font.size = Pt(header_size or size) if ri == 0 else Pt(size)
r.font.bold = (ri == 0) or (ci == 0)
r.font.color.rgb = WHITE if ri == 0 else (NAVY if ci == 0 else GREY)
return t
def card(slide, x, y, w, h, head, body, head_fill=TEAL, body_size=16):
rect(slide, x, y, w, h, LIGHT)
rect(slide, x, y, w, 0.6, head_fill)
text(slide, x + 0.1, y, w - 0.2, 0.6, head, size=19, bold=True, color=WHITE,
anchor=MSO_ANCHOR.MIDDLE)
text(slide, x + 0.15, y + 0.7, w - 0.3, h - 0.8, body, size=body_size, color=GREY)
def steps(slide, x, y, w, items, size=15, h=1.0, fill=PALE_TEAL):
n = len(items)
gap = 0.15
bw = (w - gap * (n - 1)) / n
for i, (head, body) in enumerate(items):
bx = x + i * (bw + gap)
rect(slide, bx, y, bw, h, fill)
circ = rect(slide, bx + 0.08, y + 0.08, 0.38, 0.38, TEAL, MSO_SHAPE.OVAL)
tf = circ.text_frame
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
p = tf.paragraphs[0]
p.alignment = PP_ALIGN.CENTER
r = p.add_run()
r.text = str(i + 1)
r.font.size = Pt(14)
r.font.bold = True
r.font.color.rgb = WHITE
r.font.name = FONT
text(slide, bx + 0.5, y + 0.05, bw - 0.55, 0.45, head, size=size, bold=True,
color=NAVY, anchor=MSO_ANCHOR.MIDDLE)
text(slide, bx + 0.1, y + 0.52, bw - 0.2, h - 0.55, body, size=size - 2)
# ---------------- 1. Title ----------------
s = prs.slides.add_slide(BLANK)
rect(s, 0, 0, 13.333, 7.5, NAVY)
rect(s, 0, 0, 0.35, 7.5, TEAL)
rect(s, 1.0, 3.85, 1.6, 0.07, CORAL)
text(s, 1.0, 1.6, 11, 0.5, "MICROBIOLOGY LECTURE", size=18, bold=True, color=RGBColor(0x7F, 0xD1, 0xD2))
text(s, 1.0, 2.1, 11.3, 1.7, "Detection Methods of Microbes", size=52, bold=True, color=WHITE,
anchor=MSO_ANCHOR.MIDDLE)
text(s, 1.0, 4.1, 11, 1.0,
"Principles of microbial detection: culture media, microscopy and staining, biochemical tests, sensitivity testing",
size=22, color=RGBColor(0xD5, 0xE3, 0xEA))
text(s, 1.0, 6.4, 11, 0.4, "Includes practical demonstrations: Gram stain, streak culture, disk diffusion",
size=16, color=RGBColor(0x9F, 0xB6, 0xC4))
s.notes_slide.notes_text_frame.text = ("Welcome. This lecture follows the laboratory pathway from specimen to "
"report and ends with three bench demonstrations.")
# ---------------- 2. Objectives ----------------
s = new_slide("Learning objectives",
notes="Read the four objectives and tell students the practicals are at the end.")
objs = [
("List", "the common methods of microbial detection"),
("Define", "culture, staining and sensitivity testing"),
("Discuss", "the principles behind each detection method"),
("Demonstrate", "staining, sensitivity testing and culture"),
]
for i, (h, b) in enumerate(objs):
y = 1.65 + i * 1.3
rect(s, 0.9, y, 11.6, 1.1, LIGHT)
rect(s, 0.9, y, 0.12, 1.1, TEAL)
text(s, 1.3, y, 2.6, 1.1, h, size=26, bold=True, color=NAVY, anchor=MSO_ANCHOR.MIDDLE)
text(s, 3.9, y, 8.4, 1.1, b, size=22, anchor=MSO_ANCHOR.MIDDLE)
# ---------------- 3. Why detect ----------------
s = new_slide("Why detect microbes?",
notes="Four clinical questions drive every microbiology request. Then show the workflow.")
qs = [("Is a microbe present?", "Presence"), ("Which microbe is it?", "Identity"),
("How much is there?", "Quantity"), ("Which drugs kill it?", "Susceptibility")]
for i, (q, tag) in enumerate(qs):
x = 0.9 + i * 3.0
rect(s, x, 1.6, 2.8, 1.6, PALE_TEAL)
text(s, x + 0.1, 1.65, 2.6, 0.4, tag.upper(), size=13, bold=True, color=TEAL)
text(s, x + 0.1, 2.05, 2.6, 1.1, q, size=20, bold=True, color=NAVY)
text(s, 0.9, 3.6, 11, 0.5, "Routine laboratory pathway", size=22, bold=True, color=NAVY)
flow = ["Specimen", "Direct microscopy\n(stain)", "Culture", "Identification\n(biochemical)",
"Sensitivity\ntesting", "Report"]
bw, gap = 1.7, 0.25
for i, f in enumerate(flow):
x = 0.9 + i * (bw + gap)
b = rect(s, x, 4.3, bw, 1.3, NAVY if i not in (0, 5) else TEAL, MSO_SHAPE.ROUNDED_RECTANGLE)
tf = b.text_frame
tf.word_wrap = True
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
for j, line in enumerate(f.split("\n")):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.alignment = PP_ALIGN.CENTER
r = p.add_run()
r.text = line
r.font.size = Pt(16)
r.font.bold = True
r.font.color.rgb = WHITE
r.font.name = FONT
if i < len(flow) - 1:
text(s, x + bw - 0.02, 4.55, gap + 0.04, 0.6, "\u203A", size=30, bold=True, color=CORAL,
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
text(s, 0.9, 5.95, 11.5, 0.8,
"Each step narrows the answer: stain gives a quick clue, culture gives the isolate, "
"biochemical tests name it, sensitivity testing guides treatment.", size=18)
# ---------------- 4. Common methods ----------------
s = new_slide("Common methods of microbial detection",
source="Sources: Jawetz, Melnick & Adelberg's Medical Microbiology 28E; Sherris & Ryan's Medical Microbiology 8E",
notes="This answers objective 1. Walk across the six groups.")
rows = [
["Group", "Methods", "Main purpose"],
["Microscopy", "Gram, acid-fast, negative stain, wet mount, fluorescence, dark-field", "Rapid look at morphology"],
["Culture", "Blood agar, MacConkey, selective and enrichment media, broth, blood culture", "Isolate and grow organism"],
["Biochemical tests", "Catalase, coagulase, oxidase, urease, indole, citrate, TSI", "Identify species"],
["Sensitivity testing", "Disk diffusion, broth or agar dilution (MIC), E-test", "Guide drug choice"],
["Immunological", "Antigen detection, ELISA, latex agglutination, serology", "Detect antigen or antibody"],
["Molecular", "PCR, real-time PCR, sequencing, MALDI-TOF", "Fast, sensitive identification"],
]
table(s, 0.9, 1.6, 11.6, [2.5, 6.0, 3.1], rows, size=15, row_h=0.72)
# ---------------- 5. Definitions ----------------
s = new_slide("Key definitions",
source="MIC definition: Henry's Clinical Diagnosis and Management by Laboratory Methods",
notes="This answers objective 2. Ask students to restate each definition in one sentence.")
card(s, 0.9, 1.6, 3.7, 3.5, "Culture",
"Growing microbes on or in nutrient media under suitable temperature, atmosphere and time, "
"so they can be isolated, identified and tested.", body_size=17)
card(s, 4.8, 1.6, 3.7, 3.5, "Staining",
"Applying dyes to a smear to make microbes visible and to separate them by structure. "
"Examples: Gram stain, acid-fast stain.", head_fill=NAVY, body_size=17)
card(s, 8.7, 1.6, 3.7, 3.5, "Sensitivity testing",
"Exposing an isolate to antimicrobial drugs in vitro to see if growth is inhibited. "
"Reported as susceptible, intermediate or resistant.", head_fill=CORAL, body_size=17)
rect(s, 0.9, 5.4, 11.5, 1.3, PALE_TEAL)
text(s, 1.1, 5.45, 11.1, 1.2,
[("MIC (minimum inhibitory concentration)", {"bold": True, "color": NAVY, "size": 20}),
("The lowest concentration of an antibiotic that inhibits visible growth of an organism in vitro.",
{"size": 18})], anchor=MSO_ANCHOR.MIDDLE)
# ---------------- 6. Microscopy principles ----------------
s = new_slide("Principles: microscopy and dyes",
source="Jawetz, Melnick & Adelberg's Medical Microbiology 28E, p. 43 and Ch. 47",
notes="Emphasise the sensitivity threshold: about 10^5 organisms per mL are needed to see bacteria on a smear.")
text(s, 0.9, 1.6, 6.2, 0.5, "How dyes work", size=24, bold=True, color=NAVY)
bullets(s, 0.9, 2.2, 6.3, 4.6, [
("Basic stains", "have a coloured cation (e.g., methylene blue) that binds the negatively charged phosphate groups of nucleic acids."),
("Acidic stains", "do not stain the cells, so they colour the background (negative staining, e.g., nigrosin)."),
("Special stains", "can show flagella, capsules, spores, granules and cell walls."),
], size=18, gap=12)
rect(s, 7.7, 1.6, 4.8, 4.9, NAVY)
text(s, 7.95, 1.8, 4.3, 0.5, "SENSITIVITY OF A SMEAR", size=14, bold=True, color=RGBColor(0x7F, 0xD1, 0xD2))
text(s, 7.95, 2.3, 4.3, 1.2, "10\u2075", size=66, bold=True, color=WHITE)
text(s, 7.95, 3.6, 4.3, 0.9, "organisms per mL are needed before bacteria are likely to be seen on a smear",
size=17, color=WHITE)
text(s, 7.95, 4.9, 4.3, 1.4,
"Solid media can grow from 10\u00B2 to 10\u00B3 organisms/mL, so culture is far more sensitive than microscopy.",
size=15, color=RGBColor(0xD5, 0xE3, 0xEA))
# ---------------- 7. Gram stain ----------------
s = new_slide("Gram stain: a differential stain",
source="Jawetz, Melnick & Adelberg's Medical Microbiology 28E, p. 43-44; Medical Microbiology 9E",
notes="Stress that the difference is cell wall structure. Over-decolorizing makes Gram-positive cells look Gram-negative.")
steps(s, 0.9, 1.6, 11.6, [
("Crystal violet", "Stains all cells purple"),
("Gram's iodine", "Forms crystal violet-iodine complex"),
("Decolorize", "Alcohol or acetone washes out Gram-negative cells"),
("Safranin", "Counterstain colours Gram-negative cells red"),
], size=16, h=1.9)
rect(s, 0.9, 3.9, 5.6, 2.8, LIGHT)
rect(s, 0.9, 3.9, 0.1, 2.8, RGBColor(0x6A, 0x3D, 0x9A))
text(s, 1.2, 3.95, 5.2, 0.5, "Gram-positive: purple-blue", size=21, bold=True, color=RGBColor(0x6A, 0x3D, 0x9A))
text(s, 1.2, 4.5, 5.2, 2.1,
"Thick peptidoglycan layer traps the crystal violet-iodine complex, so the cell resists decolorizing.",
size=17)
rect(s, 6.9, 3.9, 5.6, 2.8, LIGHT)
rect(s, 6.9, 3.9, 0.1, 2.8, CORAL)
text(s, 7.2, 3.95, 5.2, 0.5, "Gram-negative: red-pink", size=21, bold=True, color=CORAL)
text(s, 7.2, 4.5, 5.2, 2.1,
"Decolorizer disrupts the outer membrane and the thin peptidoglycan layer lets the dye wash out.",
size=17)
# ---------------- 8. Interpreting + acid fast ----------------
s = new_slide("Reading smears and the acid-fast stain",
source="Jawetz, Melnick & Adelberg's Medical Microbiology 28E, Ch. 2 and Ch. 47",
notes="Gram stain suggests but does not prove identity. Mycobacteria need a special stain because of mycolic acid.")
card(s, 0.9, 1.6, 5.7, 5.1, "Interpreting a Gram smear", "", head_fill=NAVY)
bullets(s, 1.05, 2.4, 5.4, 4.2, [
"Gram-positive cocci in clusters suggest staphylococci",
"Gram-positive cocci in chains suggest streptococci",
"Species cannot be identified from a smear",
"Some nonviable Gram-positive cells stain Gram-negative",
"Note pus cells; many squamous cells suggest a poor sputum or wound sample",
], size=16, gap=8)
card(s, 6.9, 1.6, 5.6, 5.1, "Acid-fast (Ziehl-Neelsen) stain", "")
bullets(s, 7.05, 2.4, 5.3, 4.2, [
"Mycobacteria have mycolic acid-rich walls",
"They keep hot carbolfuchsin despite acid-alcohol decolorizing",
"Acid-fast bacilli appear red on a blue background",
"Fluorescent auramine-rhodamine is an alternative",
"Negative stain (nigrosin, India ink) shows capsules, e.g., Cryptococcus",
], size=16, gap=8)
# ---------------- 9. Culture media ----------------
s = new_slide("Principles: culture media",
source="Jawetz, Melnick & Adelberg's Medical Microbiology 28E, Ch. 1, 16 and 47",
notes="Principle: given nutrients, pH, temperature and atmosphere, one cell grows into one visible colony.")
text(s, 0.9, 1.45, 11.6, 0.6,
"Principle: with the right nutrients, pH, temperature and gas atmosphere, a single cell grows into a visible colony.",
size=17, color=NAVY, bold=True)
rows = [
["Type", "Function", "Example"],
["Basal / non-selective", "Grows most organisms", "Nutrient agar; blood agar (5% sheep blood)"],
["Enriched", "Supports fastidious organisms", "Chocolate agar (Haemophilus, Neisseria)"],
["Selective", "Inhibits unwanted flora", "TCBS (V. cholerae); bismuth sulfite (Salmonella)"],
["Differential", "Colony colour separates organisms", "MacConkey, EMB (lactose fermenters)"],
["Enrichment (liquid)", "Favours few target organisms", "Alkaline peptone water (Vibrio)"],
["Transport", "Preserves organisms in transit", "Stuart's, Amies"],
]
table(s, 0.9, 2.15, 11.6, [2.9, 3.7, 5.0], rows, size=15, row_h=0.62)
text(s, 0.9, 6.55, 11.6, 0.4,
"Read: colony shape and colour, haemolysis (alpha, beta, gamma), lactose fermentation (pink vs pale).",
size=15)
# ---------------- 10. Biochemical ----------------
s = new_slide("Principles: biochemical tests",
notes="Each species has a characteristic enzyme set. We add a substrate and watch for colour, gas or precipitate.")
text(s, 0.9, 1.45, 11.6, 0.6,
"Principle: each species has a characteristic set of enzymes. A substrate is added and a colour change, gas or precipitate is read.",
size=17, color=NAVY, bold=True)
rows = [
["Test", "Principle", "Typical use"],
["Catalase", "Catalase splits H\u2082O\u2082 into O\u2082 (bubbles)", "Staphylococci +, streptococci \u2212"],
["Coagulase", "Clots plasma", "S. aureus +"],
["Oxidase", "Cytochrome oxidase oxidizes dye (purple)", "Pseudomonas, Neisseria +"],
["Urease", "Urea to ammonia, raises pH", "Proteus, H. pylori"],
["Indole", "Tryptophanase makes indole", "E. coli +"],
["Citrate", "Citrate used as sole carbon source", "Klebsiella +, E. coli \u2212"],
["Sugar fermentation / TSI", "Acid production changes indicator colour", "Enterobacterales"],
]
table(s, 0.9, 2.2, 11.6, [2.9, 5.0, 3.7], rows, size=15, row_h=0.58)
# ---------------- 11. Sensitivity methods ----------------
s = new_slide("Principles: sensitivity testing methods",
source="Henry's Clinical Diagnosis and Management by Laboratory Methods (susceptibility testing chapter)",
notes="The isolate is exposed to a standard drug concentration and growth inhibition is measured.")
card(s, 0.9, 1.6, 2.75, 4.2, "Disk diffusion",
"Kirby-Bauer. Drug diffuses from a disk into inoculated agar. Zone diameter is compared with CLSI breakpoints. Qualitative.", body_size=15)
card(s, 3.8, 1.6, 2.75, 4.2, "Dilution",
"Broth or agar dilution with doubling drug concentrations. Lowest concentration with no visible growth is the MIC.", head_fill=NAVY, body_size=15)
card(s, 6.7, 1.6, 2.75, 4.2, "Gradient strip",
"E-test. Strip with a continuous drug gradient. MIC is read where the inhibition ellipse meets the strip.", head_fill=CORAL, body_size=15)
card(s, 9.6, 1.6, 2.9, 4.2, "Automated / molecular",
"Fast, high volume. PCR detects resistance genes (e.g., mecA, rpoB) but gives no MIC.", head_fill=GREY, body_size=15)
rect(s, 0.9, 6.0, 11.6, 0.8, PALE_TEAL)
text(s, 1.1, 6.0, 11.2, 0.8,
"Results are reported as Susceptible (S), Intermediate (I) or Resistant (R).",
size=18, bold=True, color=NAVY, anchor=MSO_ANCHOR.MIDDLE)
# ---------------- 12. Standardization ----------------
s = new_slide("Standardization and when to test",
source="Henry's Clinical Diagnosis and Management by Laboratory Methods, Key Points",
notes="CLSI standards are what make results reproducible between laboratories.")
text(s, 0.9, 1.55, 5.6, 0.5, "Variables that must be standardized", size=22, bold=True, color=NAVY)
bullets(s, 0.9, 2.2, 5.6, 4.5, [
"Media (e.g., Mueller-Hinton agar)",
"Inoculum density (0.5 McFarland)",
"Incubation time and temperature",
"Atmosphere",
"Supplements for fastidious organisms, e.g., defibrinated sheep blood",
], size=18, gap=10)
text(s, 7.0, 1.55, 5.5, 0.5, "Why test?", size=22, bold=True, color=NAVY)
bullets(s, 7.0, 2.2, 5.5, 4.5, [
"Test when susceptibility cannot be predicted reliably from the organism's identity",
"Cumulative antibiograms guide empirical therapy before results are ready",
"They help pharmacists and stewardship teams track resistance trends",
], size=18, gap=10)
# ---------------- 13. Immuno / molecular ----------------
s = new_slide("Immunological and molecular methods",
notes="Overview only. These complement culture, especially for organisms that are slow or hard to grow.")
card(s, 0.9, 1.6, 3.7, 4.6, "Antigen / serology",
"Antibodies bind microbial antigens, or the reverse. Examples: latex agglutination, ELISA, rapid antigen tests. Useful when organisms are hard to culture.", body_size=17)
card(s, 4.8, 1.6, 3.7, 4.6, "PCR",
"Amplifies microbial DNA or RNA. Very sensitive and fast, and does not need live organisms.", head_fill=NAVY, body_size=17)
card(s, 8.7, 1.6, 3.7, 4.6, "MALDI-TOF",
"Matches a protein mass spectrum to a database. Identifies cultured colonies in minutes.", head_fill=CORAL, body_size=17)
# ---------------- 14. Demo A: Gram ----------------
s = new_slide("Demonstration A: Gram stain",
source="Procedure per Jawetz, Melnick & Adelberg's Medical Microbiology 28E, Table 47-1",
notes="Wear gloves and coat; discard slides in disinfectant. Decolorizing is the most critical step.")
steps(s, 0.9, 1.6, 11.6, [
("Smear", "Thin smear, air dry, heat fix"),
("Crystal violet", "10-30 s, rinse"),
("Iodine", "10-30 s, rinse"),
("Decolorize", "30% acetone-alcohol, 10-30 s, rinse"),
("Safranin", "10-30 s, rinse, dry"),
], size=15, h=1.7)
rect(s, 0.9, 3.65, 5.6, 3.1, LIGHT)
text(s, 1.1, 3.7, 5.2, 0.5, "Key points", size=21, bold=True, color=NAVY)
bullets(s, 1.1, 4.25, 5.3, 2.5, [
"Do not blot between rinses",
"Over-decolorizing makes Gram-positive cells look Gram-negative",
"Examine under oil immersion (100x)",
], size=16, gap=6)
rect(s, 6.9, 3.65, 5.6, 3.1, PALE_TEAL)
text(s, 7.1, 3.7, 5.2, 0.5, "Expected result", size=21, bold=True, color=NAVY)
bullets(s, 7.1, 4.25, 5.3, 2.5, [
"Gram-positive cocci: purple",
"Gram-negative bacilli: pink-red",
"Report shape, arrangement and pus cells",
], size=16, gap=6)
# ---------------- 15. Demo B/C ----------------
s = new_slide("Demonstration B and C: Ziehl-Neelsen and streak culture",
source="Ziehl-Neelsen steps per Jawetz 28E, Table 47-1",
notes="Streaking dilutes the inoculum so single cells give isolated colonies and a pure culture.")
card(s, 0.9, 1.6, 5.7, 5.1, "B. Ziehl-Neelsen stain", "", head_fill=NAVY)
bullets(s, 1.05, 2.4, 5.4, 4.2, [
"Heat-fix the smear",
"Carbolfuchsin with gentle heat, 5 min (do not boil or dry)",
"Rinse; decolorize with 3% acid-alcohol until faint pink",
"Counterstain with methylene blue, 1 min",
"Result: red acid-fast bacilli on blue background",
], size=16, gap=8)
card(s, 6.9, 1.6, 5.6, 5.1, "C. Streak plate (blood agar)", "")
bullets(s, 7.05, 2.4, 5.3, 4.2, [
"Label the base of the plate",
"Flame and cool the loop; inoculate quadrant 1",
"Reflame; drag from quadrant 1 into 2, then 3 and 4",
"Incubate inverted, 35-37 \u00B0C, 18-24 h",
"Read colonies and haemolysis; pick one colony for Gram stain, biochemical tests and AST",
], size=16, gap=8)
# ---------------- 16. Demo D with figure ----------------
s = new_slide("Demonstration D: disk diffusion",
source="Figure: Harrison's Principles of Internal Medicine. Method per Henry's and CLSI standards",
notes="Blood agar with a penicillin disk and a clear zone; inset shows Gram-positive cocci in clusters.")
steps_items = [
"Suspend 3-5 colonies in saline; adjust to 0.5 McFarland",
"Swab entire Mueller-Hinton plate in 3 directions; dry 3-5 min",
"Apply disks with sterile forceps; press gently",
"Incubate inverted at 35 \u00B0C, 16-18 h",
"Measure zones (mm); compare with CLSI tables; report S, I or R",
]
for i, t in enumerate(steps_items):
y = 1.6 + i * 0.82
c = rect(s, 0.9, y + 0.08, 0.5, 0.5, TEAL, MSO_SHAPE.OVAL)
p = c.text_frame.paragraphs[0]
c.text_frame.margin_left = c.text_frame.margin_right = 0
p.alignment = PP_ALIGN.CENTER
r = p.add_run()
r.text = str(i + 1)
r.font.size = Pt(16)
r.font.bold = True
r.font.color.rgb = WHITE
r.font.name = FONT
text(s, 1.55, y, 5.6, 0.75, t, size=16, anchor=MSO_ANCHOR.MIDDLE)
rect(s, 0.9, 5.8, 6.3, 1.0, RGBColor(0xFD, 0xEE, 0xE9))
text(s, 1.05, 5.8, 6.0, 1.0,
"Errors: heavy inoculum gives small zones; light inoculum gives large zones; wrong agar depth or pH alters results.",
size=14, color=CORAL, anchor=MSO_ANCHOR.MIDDLE, bold=True)
s.shapes.add_picture("/tmp/workspace/microbe-detection-ppt/assets/fig.png", Inches(7.9), Inches(1.5),
height=Inches(4.7))
text(s, 7.9, 6.25, 4.7, 0.6,
"Blood agar with penicillin disk and zone of inhibition; inset: Gram-positive cocci in clusters",
size=12, color=RGBColor(0x7A, 0x86, 0x90))
# ---------------- 17. Strengths and limits ----------------
s = new_slide("Strengths and limits at a glance",
notes="Use this table to link the methods together as a pathway.")
rows = [
["Method", "Strength", "Limitation"],
["Gram stain", "Fast, cheap, guides early therapy", "Needs about 10\u2075 organisms/mL; no species ID"],
["Culture", "Gold standard; gives isolate for AST", "Slow; fastidious organisms may fail; prior antibiotics reduce yield"],
["Biochemical tests", "Cheap, reliable identification", "Extra time after culture"],
["Disk diffusion", "Simple, low cost", "Qualitative; strict standardization"],
["MIC methods", "Quantitative", "More labour or cost"],
["Molecular", "Very fast, sensitive", "Costly; detects DNA of dead organisms; may not show phenotypic resistance"],
]
table(s, 0.9, 1.6, 11.6, [2.6, 4.2, 4.8], rows, size=15, row_h=0.72)
# ---------------- 18. Summary ----------------
s = new_slide("Summary",
notes="Recap the five take-home points.")
pts = [
("Pathway:", "microscopy, then culture, then identification, then sensitivity testing."),
("Staining:", "Gram stain splits bacteria by cell wall; acid-fast stain finds mycobacteria."),
("Culture:", "isolates and grows organisms on non-selective, enriched, selective or differential media."),
("Sensitivity:", "disk diffusion is qualitative; dilution and gradient methods give the MIC."),
("Standardization:", "inoculum, media and timing decide whether results can be trusted."),
]
for i, (h, b) in enumerate(pts):
y = 1.55 + i * 1.03
rect(s, 0.9, y, 11.6, 0.9, LIGHT)
rect(s, 0.9, y, 0.1, 0.9, TEAL)
text(s, 1.2, y, 2.8, 0.9, h, size=20, bold=True, color=NAVY, anchor=MSO_ANCHOR.MIDDLE)
text(s, 4.0, y, 8.4, 0.9, b, size=17, anchor=MSO_ANCHOR.MIDDLE)
# ---------------- 19. Review questions ----------------
s = new_slide("Review questions",
notes="Answers: 6) catalase (negative would suggest streptococci; positive for staphylococci) and coagulase (positive for S. aureus).")
qs = [
"Define culture, staining and sensitivity testing.",
"Why does a Gram-negative bacterium lose crystal violet while a Gram-positive one keeps it?",
"How does a selective medium differ from a differential medium? Name an example of each.",
"Why is acid-alcohol used in the Ziehl-Neelsen stain?",
"List three variables that must be standardized in disk diffusion testing.",
"A smear shows Gram-positive cocci in clusters. Which two bench tests come next, and what results fit S. aureus?",
]
for i, q in enumerate(qs):
y = 1.5 + i * 0.9
c = rect(s, 0.9, y + 0.1, 0.55, 0.55, NAVY, MSO_SHAPE.OVAL)
c.text_frame.margin_left = c.text_frame.margin_right = 0
p = c.text_frame.paragraphs[0]
p.alignment = PP_ALIGN.CENTER
r = p.add_run()
r.text = str(i + 1)
r.font.size = Pt(18)
r.font.bold = True
r.font.color.rgb = WHITE
r.font.name = FONT
text(s, 1.65, y, 10.8, 0.8, q, size=19, anchor=MSO_ANCHOR.MIDDLE)
prs.save("/tmp/workspace/microbe-detection-ppt/output/Detection_Methods_of_Microbes.pptx")
print("saved", len(prs.slides))