Antimicrobial susceptibility test from apurva sastry
"Antimicrobial Susceptibility Testing"[MeSH Terms]
CLSI antimicrobial susceptibility testing disk diffusion broth microdilution standards overview
https://clsi.org/shop/standards/m07
| Feature | Disk diffusion | Dilution |
|---|---|---|
| Result | Zone diameter | MIC |
| Output | S/I/R category | Exact inhibitory concentration plus S/I/R |
| Cost | Low | Higher |
| Routine use | Very common | Common in microdilution/automated systems |
| Reference status | Standard method but generally not reference method | Broth microdilution is reference for many organisms |
| Best use | Routine screening of non-fastidious bacteria | Precise MIC, difficult drugs/organisms, automated testing |
Create a one-page AST quick-reference PDF
~/
mkdir -p "/tmp/workspace/ast-quick-reference/src" "/tmp/workspace/ast-quick-reference/output" && python - <<'PY' from reportlab.lib.pagesizes import A4 from reportlab.pdfgen import canvas from reportlab.lib import colors from reportlab.pdfbase.pdfmetrics import stringWidth from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase import pdfmetrics from reportlab.lib.units import mm from reportlab.pdfbase.pdfmetrics import stringWidth from pypdf import PdfReader out='/tmp/workspace/ast-quick-reference/output/AST_Quick_Reference.pdf' W,H=A4 c=canvas.Canvas(out,pagesize=A4) c.setTitle('Antimicrobial Susceptibility Testing - Quick Reference') c.setAuthor('Orris') # Palette navy=colors.HexColor('#123047'); blue=colors.HexColor('#1B5E7A'); teal=colors.HexColor('#087E8B') light=colors.HexColor('#F2F7F9'); pale=colors.HexColor('#E3F1F3'); line=colors.HexColor('#BCD2D9') ink=colors.HexColor('#162B36'); muted=colors.HexColor('#516B77'); green=colors.HexColor('#177A48'); amber=colors.HexColor('#B36B00'); red=colors.HexColor('#B93636') m=12*mm content_w=W-2*m # helpers def txt(x,y,s,font='Helvetica',size=8,color=ink): c.setFont(font,size); c.setFillColor(color); c.drawString(x,y,s) def rtxt(x,y,s,font='Helvetica',size=8,color=ink): c.setFont(font,size); c.setFillColor(color); c.drawRightString(x,y,s) def wrap(s,font,size,maxw): words=s.split(); lines=[]; cur='' for word in words: test=(cur+' '+word).strip() if stringWidth(test,font,size)<=maxw: cur=test else: lines.append(cur); cur=word if cur: lines.append(cur) return lines def para(x,y,s,width,size=7.4,leading=9.2,color=ink,font='Helvetica'): c.setFont(font,size); c.setFillColor(color) for ln in wrap(s,font,size,width): c.drawString(x,y,ln); y-=leading return y def section(x,y,w,title,accent=teal): c.setFillColor(accent); c.roundRect(x,y-4,w,15,3,fill=1,stroke=0) txt(x+6,y+1,title,'Helvetica-Bold',8.4,colors.white) return y-12 def box(x,y,w,h,fill=light,stroke=line): c.setFillColor(fill); c.setStrokeColor(stroke); c.roundRect(x,y-h,w,h,4,fill=1,stroke=1) def bullet(x,y,label,body,width, color=ink): txt(x,y,u'•','Helvetica-Bold',8.5,teal) txt(x+7,y,label,'Helvetica-Bold',7.5,color) lw=stringWidth(label,'Helvetica-Bold',7.5) return para(x+7+lw+3,y,body,width-lw-10,7.5,9,color) # Header c.setFillColor(navy); c.rect(0,H-37*mm,W,37*mm,fill=1,stroke=0) txt(m,H-16*mm,'ANTIMICROBIAL SUSCEPTIBILITY TESTING','Helvetica-Bold',18,colors.white) txt(m,H-23*mm,'AST QUICK REFERENCE | routine bacteriology laboratory','Helvetica',8.4,colors.HexColor('#D7EDF2')) # small metric cards cards=[('S','Likely response at standard exposure',green),('I','Increased exposure / selected settings',amber),('R','High likelihood of failure',red)] x=W-m-95*mm for k,lab,col in cards: c.setFillColor(colors.white); c.roundRect(x,H-29.5*mm,29*mm,11*mm,3,fill=1,stroke=0) txt(x+4,H-24.7*mm,k,'Helvetica-Bold',10,col) para(x+10,H-22.5*mm,lab,17*mm,5.5,6.3,muted) x+=31.5*mm # Layout colgap=6*mm; cw=(content_w-colgap)/2; lx=m; rx=m+cw+colgap top=H-44*mm # Left column: essentials and methods y=top y=section(lx,y,cw,'1. WHAT AST REPORTS') box(lx,y,cw,43*mm) y-=7 bullet(lx+5,y,'MIC:', 'lowest antimicrobial concentration that prevents visible growth.',cw-10); y-=11 bullet(lx+5,y,'MBC:', 'lowest concentration that kills 99.9% of the starting inoculum.',cw-10); y-=11 bullet(lx+5,y,'Endpoint:', 'usually growth inhibition; interpret every organism-drug pair using current CLSI or EUCAST breakpoints.',cw-10); y-=18 y=section(lx,y,cw,'2. METHODS AT A GLANCE',blue) # table rows=[ ('Disk diffusion','Zone diameter (mm)','Routine, low cost'), ('Broth microdilution','MIC (mg/L)','Reference method for many bacteria'), ('Agar dilution','MIC (mg/L)','Selected drugs / organisms'), ('Gradient strip (E-test)','MIC (mg/L)','Small volume or fastidious isolates'), ('Automated AST','MIC + S/I/R','High-throughput workflow'), ('Molecular assay','Resistance gene / mutation','Rapid targeted detection')] rowh=10.2*mm box(lx,y,cw,7*mm+len(rows)*rowh,colors.white,line) # header c.setFillColor(pale); c.roundRect(lx,y-7*mm,cw,7*mm,4,fill=1,stroke=0) txt(lx+4,y-4.6*mm,'METHOD','Helvetica-Bold',6.5,navy) txt(lx+43*mm,y-4.6*mm,'OUTPUT','Helvetica-Bold',6.5,navy) txt(lx+71*mm,y-4.6*mm,'BEST USE','Helvetica-Bold',6.5,navy) ry=y-7*mm for i,(a,b,d) in enumerate(rows): ry-=rowh if i%2==0: c.setFillColor(light); c.rect(lx+1,ry+1,cw-2,rowh-2,fill=1,stroke=0) txt(lx+4,ry+4.5*mm,a,'Helvetica-Bold',6.6,ink) para(lx+43*mm,ry+5.6*mm,b,24*mm,6.15,7.2,muted) para(lx+71*mm,ry+5.6*mm,d,cw-75*mm,6.15,7.2,muted) y=ry-5*mm y=section(lx,y,cw,'3. KIRBY-BAUER: CORE WORKFLOW') box(lx,y,cw,46*mm,light,line) steps=[ ('1','Fresh pure culture','3-5 similar colonies.'), ('2','Standardize inoculum','0.5 McFarland suspension.'), ('3','Inoculate plate','Confluent lawn on Mueller-Hinton agar.'), ('4','Apply disks','Correct content, spacing, and storage.'), ('5','Incubate','Usually 35 ± 2°C, 16-18 h for non-fastidious bacteria.'), ('6','Measure + interpret','Measure complete zone in mm; apply current breakpoint table.')] sy=y-6*mm for n,head,desc in steps: c.setFillColor(teal); c.circle(lx+8,sy+1.5,3.2,fill=1,stroke=0) c.setFillColor(colors.white); c.setFont('Helvetica-Bold',6); c.drawCentredString(lx+8,sy-.3,n) txt(lx+14,sy,head,'Helvetica-Bold',6.8,ink) para(lx+14+stringWidth(head,'Helvetica-Bold',6.8)+3,sy,desc,cw-27-stringWidth(head,'Helvetica-Bold',6.8),6.65,7.9,muted) sy-=6.4*mm # Right column ry=top ry=section(rx,ry,cw,'4. QUALITY CHECKS THAT CHANGE RESULTS') box(rx,ry,cw,61*mm,colors.white,line) checks=[ ('Inoculum','Too heavy can falsely increase resistance.'), ('Medium','Use validated Mueller-Hinton media. pH and cation content matter.'), ('Agar depth','Target 4 mm. Deep agar can give false resistance; shallow agar can give false susceptibility.'), ('Incubation','Use prescribed time, temperature, and atmosphere.'), ('Disks / strips','Confirm potency, expiry, and correct storage.'), ('QC strains','Run specified ATCC controls; results must fall within accepted ranges.'), ('Unusual results','Confirm with a validated alternative/reference method and assess intrinsic resistance.')] cy=ry-7 for head,desc in checks: txt(rx+5,cy,'✓','Helvetica-Bold',8,green) txt(rx+12,cy,head+':','Helvetica-Bold',7.2,ink) para(rx+12+stringWidth(head+':','Helvetica-Bold',7.2)+3,cy,desc,cw-20-stringWidth(head+':','Helvetica-Bold',7.2),7.1,8.3,muted) cy-=7.6*mm ry-=67*mm ry=section(rx,ry,cw,'5. WHEN TO TEST AND WHEN NOT TO') box(rx,ry,cw,45*mm,light,line) txt(rx+5,ry-7,'TEST when:', 'Helvetica-Bold',7.6,green) ry1=para(rx+5,ry-15,'• resistance is variable or commonly acquired (e.g., Enterobacterales, Pseudomonas, staphylococci, enterococci).\n• infection is severe, invasive, or in an immunocompromised host.\n• resistance may emerge during treatment.',cw-10,7.05,8.6,ink) txt(rx+5,ry-35,'DO NOT routinely test when:', 'Helvetica-Bold',7.6,red) para(rx+5,ry-43,'• susceptibility is predictably uniform (e.g., S. pyogenes to penicillin).\n• mixed growth suggests colonization, contamination, or a poor specimen.',cw-10,7.05,8.6,ink) ry-=51*mm ry=section(rx,ry,cw,'6. INTERPRETATION SAFETY') box(rx,ry,cw,42*mm,colors.white,line) notes=[ ('Never use one universal cutoff.','Breakpoints are specific to the organism, drug, method, indication, and standard used.'), ('Do not equate in-vitro with clinical cure.','Consider source control, site penetration, dose/exposure, host status, and infection severity.'), ('Check intrinsic resistance and selective reporting.','Some drug-organism pairs should not be reported even if an in-vitro value is generated.'), ('Update tables.','CLSI/EUCAST breakpoints and reporting guidance are revised regularly.')] ny=ry-7 for head,desc in notes: txt(rx+5,ny,u'•','Helvetica-Bold',8,blue) txt(rx+12,ny,head,'Helvetica-Bold',7,ink) ny=para(rx+12,ny-8,desc,cw-18,6.8,8,muted)-2 # footer fy=12*mm c.setStrokeColor(line); c.line(m,fy+7*mm,W-m,fy+7*mm) txt(m,fy+2.5*mm,'Source basis: Tietz Textbook of Laboratory Medicine, 7th ed., Ch. 85; Henry\'s Clinical Diagnosis and Management by Laboratory Methods; CLSI M02/M07/M100 concepts.', 'Helvetica',5.9,muted) rtxt(W-m,fy+2.5*mm,'Educational aid - use current local CLSI/EUCAST procedures.', 'Helvetica-Bold',5.9,navy) c.showPage(); c.save() reader=PdfReader(out) assert len(reader.pages)==1, f'Expected 1 page, got {len(reader.pages)}' text=reader.pages[0].extract_text() assert 'ANTIMICROBIAL SUSCEPTIBILITY TESTING' in text and 'KIRBY-BAUER' in text print(out) print('pages',len(reader.pages),'bytes',__import__('os').path.getsize(out),'textchars',len(text)) PY
AST Quick Reference
PDF Document · PDF