Write a literature review on aspergillosis
"aspergillosis"[MeSH Terms] AND "diagnosis"[MeSH Terms]
"invasive aspergillosis"[MeSH Terms] AND "antifungal agents"[MeSH Terms]
PMID: 38935907
PMID: 42012594
PMID: 38898129
PMID: 40792442
"COVID-19 associated aspergillosis" OR "influenza associated aspergillosis"
aspergillosis 2024 2025 epidemiology global burden resistance guidelines
| Category | Clinical Forms |
|---|---|
| Acute invasive aspergillosis | Invasive pulmonary aspergillosis, invasive sinusitis, tracheobronchitis, cerebral aspergillosis, endocarditis, osteomyelitis |
| Chronic aspergillosis | Aspergilloma, chronic necrotizing pulmonary aspergillosis (CNPA), chronic cavitary pulmonary aspergillosis (CCPA) |
| Allergic forms | ABPA, allergic Aspergillus sinusitis, extrinsic allergic alveolitis (hypersensitivity pneumonitis) |
Make a ppt
mkdir -p /tmp/workspace/aspergillosis-ppt
~/aspergillosis-ppt/build_ppt.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
from io import BytesIO
# ── Palette ──────────────────────────────────────────────
DARK_TEAL = RGBColor(0x00, 0x5F, 0x73) # main header bg
MID_TEAL = RGBColor(0x0A, 0x93, 0x96) # accent bar
LIGHT_TEAL = RGBColor(0x94, 0xD2, 0xBD) # light accent
ORANGE = RGBColor(0xEE, 0x9B, 0x00) # highlight
OFF_WHITE = RGBColor(0xF5, 0xF5, 0xF0) # slide background
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_TEXT = RGBColor(0x1C, 0x1C, 0x1C)
MID_TEXT = RGBColor(0x3A, 0x3A, 0x4A)
GRAY_LINE = RGBColor(0xCC, 0xCC, 0xCC)
LIGHT_BG = RGBColor(0xE8, 0xF4, 0xF4) # table row alt
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
title_layout = prs.slide_layouts[0] # Title Slide
body_layout = prs.slide_layouts[1] # Title + Content
# ─────────────────────────────────────────────────────────
# helpers
# ─────────────────────────────────────────────────────────
def bg(slide, color=OFF_WHITE):
"""Solid background rectangle behind everything."""
shp = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,
0, 0,
prs.slide_width, prs.slide_height)
shp.fill.solid(); shp.fill.fore_color.rgb = color
shp.line.fill.background()
shp.shadow.inherit = False
return shp
def header_bar(slide, title_text, subtitle_text=""):
"""Dark teal header spanning the top of the slide."""
bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,
0, 0,
prs.slide_width, Inches(1.25))
bar.fill.solid(); bar.fill.fore_color.rgb = DARK_TEAL
bar.line.fill.background(); bar.shadow.inherit = False
# accent left stripe
stripe = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,
0, 0, Inches(0.18), Inches(1.25))
stripe.fill.solid(); stripe.fill.fore_color.rgb = ORANGE
stripe.line.fill.background(); stripe.shadow.inherit = False
tb = slide.shapes.add_textbox(Inches(0.3), Inches(0.0),
Inches(12.8), Inches(1.25))
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left = Inches(0.12); tf.margin_top = 0
tf.margin_right = 0; tf.margin_bottom = 0
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p = tf.paragraphs[0]
p.text = title_text
r = p.runs[0]
r.font.name = "Calibri"; r.font.size = Pt(26)
r.font.bold = True; r.font.color.rgb = WHITE
if subtitle_text:
p2 = tf.add_paragraph(); p2.text = subtitle_text
r2 = p2.runs[0]
r2.font.name = "Calibri"; r2.font.size = Pt(13)
r2.font.bold = False; r2.font.color.rgb = LIGHT_TEAL
def body_tb(slide, text_lines, x, y, w, h, font_size=15,
bold_first=False, color=DARK_TEXT, line_spacing=None):
"""Multi-line text box; text_lines = list of (text, level, bold)."""
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left = Inches(0.05); tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.05); tf.margin_bottom = 0
for i, item in enumerate(text_lines):
if isinstance(item, str):
text, level, bold = item, 0, False
else:
text, level, bold = item
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.text = text
p.level = level
if line_spacing:
from pptx.util import Pt as _Pt
from pptx.oxml.ns import qn
from lxml import etree
pPr = p._pPr if p._pPr is not None else p._p.get_or_add_pPr()
lnSpc = etree.SubElement(pPr, qn('a:lnSpc'))
spcPts = etree.SubElement(lnSpc, qn('a:spcPts'))
spcPts.set('val', str(int(line_spacing * 100)))
r = p.runs[0]
r.font.name = "Calibri"; r.font.size = Pt(font_size)
r.font.bold = bold or (bold_first and i == 0)
r.font.color.rgb = color
return tb
def accent_box(slide, x, y, w, h, fill=LIGHT_BG, border=MID_TEAL, radius=True):
shape_type = MSO_SHAPE.ROUNDED_RECTANGLE if radius else MSO_SHAPE.RECTANGLE
shp = slide.shapes.add_shape(shape_type, x, y, w, h)
shp.fill.solid(); shp.fill.fore_color.rgb = fill
shp.line.color.rgb = border; shp.line.width = Pt(1.2)
shp.shadow.inherit = False
return shp
def footer(slide, text="Literature Review on Aspergillosis | Orris Medical"):
line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,
0, Inches(7.15),
prs.slide_width, Inches(0.35))
line.fill.solid(); line.fill.fore_color.rgb = DARK_TEAL
line.line.fill.background(); line.shadow.inherit = False
tb = slide.shapes.add_textbox(Inches(0.2), Inches(7.15),
Inches(13.0), Inches(0.35))
tf = tb.text_frame
tf.margin_top = 0; tf.margin_bottom = 0
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p = tf.paragraphs[0]; p.text = text; p.alignment = PP_ALIGN.CENTER
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(9)
r.font.color.rgb = LIGHT_TEAL
# ─────────────────────────────────────────────────────────
# SLIDE 1 – Title slide
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s, DARK_TEAL)
# decorative gradient band
band = s.shapes.add_shape(MSO_SHAPE.RECTANGLE,
0, Inches(4.8), prs.slide_width, Inches(2.35))
band.fill.solid(); band.fill.fore_color.rgb = RGBColor(0x00, 0x40, 0x50)
band.line.fill.background(); band.shadow.inherit = False
accent = s.shapes.add_shape(MSO_SHAPE.RECTANGLE,
0, Inches(4.8), Inches(0.35), Inches(2.35))
accent.fill.solid(); accent.fill.fore_color.rgb = ORANGE
accent.line.fill.background(); accent.shadow.inherit = False
# Title
tb = s.shapes.add_textbox(Inches(0.6), Inches(1.4), Inches(12.0), Inches(2.0))
tf = tb.text_frame; tf.word_wrap = True
p = tf.paragraphs[0]; p.text = "ASPERGILLOSIS"
p.alignment = PP_ALIGN.LEFT
r = p.runs[0]; r.font.name = "Calibri Light"; r.font.size = Pt(60)
r.font.bold = True; r.font.color.rgb = WHITE
# Subtitle
tb2 = s.shapes.add_textbox(Inches(0.6), Inches(3.3), Inches(11), Inches(1.2))
tf2 = tb2.text_frame; tf2.word_wrap = True
p2 = tf2.paragraphs[0]
p2.text = "A Comprehensive Literature Review"
r2 = p2.runs[0]; r2.font.name = "Calibri"; r2.font.size = Pt(26)
r2.font.color.rgb = LIGHT_TEAL
# Byline
tb3 = s.shapes.add_textbox(Inches(0.6), Inches(5.1), Inches(11), Inches(0.7))
tf3 = tb3.text_frame
p3 = tf3.paragraphs[0]
p3.text = "Microbiology | Infectious Disease | Clinical Management | Antifungal Resistance"
r3 = p3.runs[0]; r3.font.name = "Calibri"; r3.font.size = Pt(14)
r3.font.color.rgb = RGBColor(0xAA, 0xDD, 0xDD)
tb4 = s.shapes.add_textbox(Inches(0.6), Inches(5.8), Inches(11), Inches(0.5))
tf4 = tb4.text_frame
p4 = tf4.paragraphs[0]; p4.text = "July 2026"
r4 = p4.runs[0]; r4.font.name = "Calibri"; r4.font.size = Pt(13)
r4.font.color.rgb = RGBColor(0x88, 0xBB, 0xBB)
# ─────────────────────────────────────────────────────────
# SLIDE 2 – Table of Contents
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Overview", "Contents of this presentation")
sections = [
("1", "Introduction & Microbiology"),
("2", "Epidemiology & Risk Factors"),
("3", "Pathogenesis"),
("4", "Clinical Manifestations"),
("5", "Diagnosis"),
("6", "Treatment"),
("7", "Antifungal Resistance"),
("8", "Special Topics & Prognosis"),
]
cols = [sections[:4], sections[4:]]
col_x = [Inches(0.8), Inches(7.0)]
for ci, col in enumerate(cols):
for ri, (num, title) in enumerate(col):
y = Inches(1.55) + ri * Inches(1.2)
# number circle
circ = s.shapes.add_shape(MSO_SHAPE.OVAL,
col_x[ci], y, Inches(0.65), Inches(0.65))
circ.fill.solid(); circ.fill.fore_color.rgb = DARK_TEAL
circ.line.fill.background(); circ.shadow.inherit = False
ct = circ.text_frame
ct.vertical_anchor = MSO_ANCHOR.MIDDLE
cp = ct.paragraphs[0]; cp.text = num; cp.alignment = PP_ALIGN.CENTER
cr = cp.runs[0]; cr.font.name = "Calibri"; cr.font.size = Pt(16)
cr.font.bold = True; cr.font.color.rgb = WHITE
tb = s.shapes.add_textbox(col_x[ci] + Inches(0.78), y + Inches(0.03),
Inches(5.5), Inches(0.62))
tf = tb.text_frame; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
tf.margin_top = 0; tf.margin_bottom = 0
p = tf.paragraphs[0]; p.text = title
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(16)
r.font.bold = False; r.font.color.rgb = MID_TEXT
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 3 – Introduction & Microbiology
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Introduction & Microbiology", "The Genus Aspergillus")
# Left column – intro text
accent_box(s, Inches(0.35), Inches(1.4), Inches(6.1), Inches(5.55), LIGHT_BG, MID_TEAL)
body_tb(s, [
("What is Aspergillosis?", 0, True),
("Spectrum of diseases caused by filamentous fungi (molds) of genus Aspergillus", 0, False),
("Conidia (spores) are inhaled continuously by all humans", 0, False),
("Disease outcome depends primarily on host immune status", 0, False),
("", 0, False),
("Key Species", 0, True),
("A. fumigatus — most common pathogen (>90% of IA)", 0, False),
("A. flavus — sinusitis, superficial infections", 0, False),
("A. terreus — intrinsically resistant to amphotericin B", 0, False),
("A. niger — ear infections, occasionally invasive", 0, False),
], Inches(0.5), Inches(1.5), Inches(5.8), Inches(5.3), font_size=14)
# Right column – morphology & virulence
accent_box(s, Inches(6.85), Inches(1.4), Inches(6.15), Inches(2.55), LIGHT_BG, MID_TEAL)
body_tb(s, [
("Morphology in Tissue", 0, True),
("Dichotomously branching septate hyphae at ~45°", 0, False),
("Differentiates Aspergillus from Mucorales (aseptate)", 0, False),
("Grows at temperatures up to 40–50°C", 0, False),
("Small conidia (2–3 µm) reach deep alveoli", 0, False),
], Inches(7.0), Inches(1.5), Inches(5.85), Inches(2.4), font_size=14)
accent_box(s, Inches(6.85), Inches(4.15), Inches(6.15), Inches(2.8), LIGHT_BG, MID_TEAL)
body_tb(s, [
("Virulence Factors", 0, True),
("Thermotolerance at physiologic temperatures", 0, False),
("Galactomannan & β-glucan: immune evasion", 0, False),
("Gliotoxin: suppresses oxidative burst, induces apoptosis", 0, False),
("Angioinvasion: vascular penetration → infarction", 0, False),
("Hematogenous dissemination to brain, kidney, heart", 0, False),
], Inches(7.0), Inches(4.25), Inches(5.85), Inches(2.6), font_size=14)
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 4 – Epidemiology & Risk Factors
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Epidemiology & Risk Factors")
# Global burden boxes
stats = [
("3 million", "affected by Chronic\nPulmonary Aspergillosis (CPA)"),
("4.8 million", "affected by ABPA\nglobally"),
("1–3%", "of asthma patients\nhave ABPA"),
("31–36%", "6-week mortality\nin Invasive Aspergillosis"),
]
for i, (num, label) in enumerate(stats):
bx = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
Inches(0.3 + i * 3.2), Inches(1.4),
Inches(3.0), Inches(1.7))
bx.fill.solid(); bx.fill.fore_color.rgb = DARK_TEAL
bx.line.fill.background(); bx.shadow.inherit = False
tb = s.shapes.add_textbox(Inches(0.35 + i * 3.2), Inches(1.45),
Inches(2.9), Inches(0.75))
tf = tb.text_frame; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p = tf.paragraphs[0]; p.text = num; p.alignment = PP_ALIGN.CENTER
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(30)
r.font.bold = True; r.font.color.rgb = ORANGE
tb2 = s.shapes.add_textbox(Inches(0.35 + i * 3.2), Inches(2.2),
Inches(2.9), Inches(0.8))
tf2 = tb2.text_frame; tf2.word_wrap = True
tf2.vertical_anchor = MSO_ANCHOR.MIDDLE
p2 = tf2.paragraphs[0]; p2.text = label; p2.alignment = PP_ALIGN.CENTER
r2 = p2.runs[0]; r2.font.name = "Calibri"; r2.font.size = Pt(11)
r2.font.color.rgb = LIGHT_TEAL
# Risk factor section
accent_box(s, Inches(0.3), Inches(3.3), Inches(12.75), Inches(3.5), LIGHT_BG, MID_TEAL, False)
tb = s.shapes.add_textbox(Inches(0.45), Inches(3.35), Inches(4.0), Inches(0.45))
tf = tb.text_frame
p = tf.paragraphs[0]; p.text = "Major Risk Factors for Invasive Aspergillosis"
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(14); r.font.bold = True
r.font.color.rgb = DARK_TEAL
risks = [
("Prolonged neutropenia (>10 days, ANC <500/µL)", "Hematologic malignancy (acute leukemia)"),
("Hematopoietic stem cell transplantation (HSCT)", "Graft-versus-host disease (GVHD)"),
("Solid organ transplant (lung, heart, liver)", "High-dose corticosteroids"),
("Chronic granulomatous disease (CGD)", "COVID-19 / Influenza (CAPA, IAPA)"),
("Advanced HIV (CD4 <50)", "PTX3 gene haplotype h2/h2 (genetic risk)"),
]
for ri, (left, right) in enumerate(risks):
y = Inches(3.85) + ri * Inches(0.48)
# dot left
dot = s.shapes.add_shape(MSO_SHAPE.OVAL, Inches(0.5), y + Inches(0.1),
Inches(0.18), Inches(0.18))
dot.fill.solid(); dot.fill.fore_color.rgb = ORANGE
dot.line.fill.background(); dot.shadow.inherit = False
body_tb(s, [(left, 0, False)], Inches(0.75), y, Inches(5.5), Inches(0.45), font_size=13)
# dot right
dot2 = s.shapes.add_shape(MSO_SHAPE.OVAL, Inches(6.7), y + Inches(0.1),
Inches(0.18), Inches(0.18))
dot2.fill.solid(); dot2.fill.fore_color.rgb = ORANGE
dot2.line.fill.background(); dot2.shadow.inherit = False
body_tb(s, [(right, 0, False)], Inches(6.95), y, Inches(5.8), Inches(0.45), font_size=13)
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 5 – Pathogenesis
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Pathogenesis", "From inhaled conidia to invasive disease")
steps = [
(DARK_TEAL, "1", "Inhalation", "Conidia (2–3 µm) inhaled; deposit in\nalveolar spaces & bronchioles"),
(MID_TEAL, "2", "Immune Check", "Alveolar macrophages engulf conidia.\nNeutrophils kill germinating hyphae."),
(ORANGE, "3", "Germination\n(immune failure)", "In neutropenia/immunosuppression,\nconidia germinate to hyphae"),
(RGBColor(0xC5, 0x44, 0x00), "4", "Angioinvasion", "Hyphae penetrate vessel walls →\nthrombosis, hemorrhagic infarction"),
(RGBColor(0x80, 0x20, 0x00), "5", "Dissemination", "Hematogenous spread to brain, kidney,\nheart, liver, GI tract"),
]
for i, (col, num, title, desc) in enumerate(steps):
x = Inches(0.3 + i * 2.6)
# box
bx = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
x, Inches(1.45), Inches(2.4), Inches(4.5))
bx.fill.solid(); bx.fill.fore_color.rgb = col
bx.line.fill.background(); bx.shadow.inherit = False
# number
tb = s.shapes.add_textbox(x, Inches(1.5), Inches(2.4), Inches(0.7))
tf = tb.text_frame; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p = tf.paragraphs[0]; p.text = num; p.alignment = PP_ALIGN.CENTER
r = p.runs[0]; r.font.name = "Calibri Light"; r.font.size = Pt(36)
r.font.bold = True; r.font.color.rgb = WHITE
# title
tb2 = s.shapes.add_textbox(x + Inches(0.1), Inches(2.25), Inches(2.2), Inches(0.65))
tf2 = tb2.text_frame; tf2.word_wrap = True; tf2.vertical_anchor = MSO_ANCHOR.MIDDLE
p2 = tf2.paragraphs[0]; p2.text = title; p2.alignment = PP_ALIGN.CENTER
r2 = p2.runs[0]; r2.font.name = "Calibri"; r2.font.size = Pt(14)
r2.font.bold = True; r2.font.color.rgb = WHITE
# desc
tb3 = s.shapes.add_textbox(x + Inches(0.1), Inches(3.0), Inches(2.2), Inches(2.7))
tf3 = tb3.text_frame; tf3.word_wrap = True
p3 = tf3.paragraphs[0]; p3.text = desc; p3.alignment = PP_ALIGN.CENTER
r3 = p3.runs[0]; r3.font.name = "Calibri"; r3.font.size = Pt(12)
r3.font.color.rgb = RGBColor(0xF0, 0xF0, 0xF0)
# arrow (except last)
if i < 4:
arr = s.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW,
x + Inches(2.42), Inches(3.4),
Inches(0.14), Inches(0.38))
arr.fill.solid(); arr.fill.fore_color.rgb = GRAY_LINE
arr.line.fill.background(); arr.shadow.inherit = False
# ABPA note
accent_box(s, Inches(0.3), Inches(6.1), Inches(12.75), Inches(0.95), LIGHT_BG, MID_TEAL, False)
body_tb(s, [
("ABPA / Allergic pathway: Th2-skewed hypersensitivity in sensitized hosts (asthma, CF) "
"→ IgE-mediated mast cell degranulation → bronchial inflammation, mucus plugging, proximal bronchiectasis",
0, False)
], Inches(0.45), Inches(6.15), Inches(12.5), Inches(0.85), font_size=13)
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 6 – Clinical Manifestations (table)
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Clinical Manifestations", "Disease spectrum by host immune status")
rows = [
("Category", "Clinical Forms", "Typical Host", "Key Features", True),
("Invasive\nAspergillosis (IA)", "IPA, sinusitis,\ntracheobronchitis,\ncerebral, endocarditis",
"Neutropenic, HSCT,\nSOT, CGD", "Fever, cough, pleurisy,\nhemoptysis; halo sign on CT", False),
("Aspergilloma", "Single fungal ball\nin cavity", "Immunocompetent\nwith structural lung Dz",
"Asymptomatic or hemoptysis;\nair-crescent sign on CT", False),
("Chronic Pulmonary\nAspergillosis (CPA)", "CNPA, CCPA\n(± aspergilloma)", "Mild immune defects,\nCOPD, TB sequela",
"Weight loss, cough, low-grade\nfever over months–years", False),
("ABPA", "Allergic\nbronchopulmonary\naspergillosis", "Asthma, cystic fibrosis",
"IgE ≥1000 IU/mL, eosinophilia,\nproximal bronchiectasis", False),
("Allergic Sinusitis /\nHypersensitivity\nPneumonitis", "Extrinsic allergic alveolitis,\nallergic fungal sinusitis",
"Atopic individuals", "Recurrent wheeze, nasal polyps,\nmucosal eosinophilia", False),
]
col_w = [Inches(2.2), Inches(3.0), Inches(2.5), Inches(4.45)]
col_x_pos = [Inches(0.35), Inches(2.6), Inches(5.65), Inches(8.2)]
row_h = Inches(0.88)
start_y = Inches(1.38)
for ri, row_data in enumerate(rows):
*cells, is_header = row_data
y = start_y + ri * row_h
for ci, (cell_text, cw, cx) in enumerate(zip(cells, col_w, col_x_pos)):
fill_col = DARK_TEAL if is_header else (LIGHT_BG if ri % 2 == 0 else WHITE)
bx = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, cx, y, cw, row_h)
bx.fill.solid(); bx.fill.fore_color.rgb = fill_col
bx.line.color.rgb = GRAY_LINE; bx.line.width = Pt(0.5)
bx.shadow.inherit = False
tb = s.shapes.add_textbox(cx + Inches(0.08), y + Inches(0.04),
cw - Inches(0.12), row_h - Inches(0.08))
tf = tb.text_frame; tf.word_wrap = True
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
tf.margin_top = 0; tf.margin_bottom = 0; tf.margin_left = Inches(0.05)
p = tf.paragraphs[0]; p.text = cell_text
r = p.runs[0]; r.font.name = "Calibri"
r.font.size = Pt(12 if is_header else 11)
r.font.bold = is_header
r.font.color.rgb = WHITE if is_header else DARK_TEXT
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 7 – Diagnosis
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Diagnosis", "Integrated multimodal approach")
diag_items = [
(MID_TEAL, "CT Thorax", "Halo sign (hemorrhagic infarction around nodule)\nAir-crescent sign (late)\nNodules, wedge infarcts, cavitation"),
(DARK_TEAL, "Galactomannan", "Cell wall polysaccharide released by hyphae\nSensitivity ~60–70% (serum); higher in BAL\nSerial monitoring tracks treatment response"),
(MID_TEAL, "β-D-Glucan", "Pan-fungal marker (Aspergillus, Candida, PCP)\nNot specific to Aspergillus\nReduced specificity: dialysis, antibiotics"),
(DARK_TEAL, "Aspergillus PCR", "High sensitivity; included in EORTC/MSGERC criteria\nEspecially useful during azole prophylaxis\nLaboratory standardization still evolving"),
(MID_TEAL, "Culture &\nHistopathology", "Gold standard for species ID & susceptibility testing\nBranching septate hyphae in tissue (45° angles)\nBAL, biopsy, needle aspirate"),
(DARK_TEAL, "Bronchoscopy\n& BAL", "BAL: GM, β-glucan, culture, cytology, PCR\nEssential in ventilated patients\nKeystone when surgical biopsy not feasible"),
]
for i, (col, title, desc) in enumerate(diag_items):
row = i // 3; col_i = i % 3
x = Inches(0.35 + col_i * 4.33)
y = Inches(1.42 + row * 2.7)
bx = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, Inches(4.1), Inches(2.55))
bx.fill.solid(); bx.fill.fore_color.rgb = LIGHT_BG
bx.line.color.rgb = col; bx.line.width = Pt(2)
bx.shadow.inherit = False
# color top bar
top = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, y, Inches(4.1), Inches(0.42))
top.fill.solid(); top.fill.fore_color.rgb = col
top.line.fill.background(); top.shadow.inherit = False
tb = s.shapes.add_textbox(x + Inches(0.1), y + Inches(0.04), Inches(3.9), Inches(0.38))
tf = tb.text_frame; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p = tf.paragraphs[0]; p.text = title
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(13)
r.font.bold = True; r.font.color.rgb = WHITE
tb2 = s.shapes.add_textbox(x + Inches(0.12), y + Inches(0.5), Inches(3.88), Inches(2.0))
tf2 = tb2.text_frame; tf2.word_wrap = True
lines = desc.split('\n')
for li, line in enumerate(lines):
p2 = tf2.paragraphs[0] if li == 0 else tf2.add_paragraph()
p2.text = line
r2 = p2.runs[0]; r2.font.name = "Calibri"; r2.font.size = Pt(12)
r2.font.color.rgb = DARK_TEXT
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 8 – Treatment
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Treatment of Aspergillosis", "Antifungal therapy, immune reconstitution & surgery")
# Triad boxes
triad = [
(DARK_TEAL, "1. Antifungal\nTherapy", "Voriconazole (first-line)\nIsavuconazole (alternative, better tolerated)\nPosaconazole (alternative)\nL-AmB (if azoles contraindicated)"),
(MID_TEAL, "2. Immune\nReconstitution", "Reduce corticosteroids\nTreat underlying neutropenia\nManage GVHD\nAntiretroviral therapy (HIV)"),
(ORANGE, "3. Surgical\nIntervention", "Localized disease / hemoptysis\nOsteomyelitis / diskitis\nEndocarditis\nPleural aspergillosis"),
]
for i, (col, title, desc) in enumerate(triad):
x = Inches(0.3 + i * 4.35)
bx = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, x, Inches(1.4), Inches(4.1), Inches(2.8))
bx.fill.solid(); bx.fill.fore_color.rgb = col
bx.line.fill.background(); bx.shadow.inherit = False
tb = s.shapes.add_textbox(x + Inches(0.15), Inches(1.48), Inches(3.85), Inches(0.65))
tf = tb.text_frame; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p = tf.paragraphs[0]; p.text = title; p.alignment = PP_ALIGN.CENTER
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(15); r.font.bold = True
r.font.color.rgb = WHITE
tb2 = s.shapes.add_textbox(x + Inches(0.15), Inches(2.15), Inches(3.85), Inches(1.9))
tf2 = tb2.text_frame; tf2.word_wrap = True
lines = desc.split('\n')
for li, line in enumerate(lines):
p2 = tf2.paragraphs[0] if li == 0 else tf2.add_paragraph()
p2.text = line; p2.alignment = PP_ALIGN.CENTER
r2 = p2.runs[0]; r2.font.name = "Calibri"; r2.font.size = Pt(12)
r2.font.color.rgb = WHITE
# Bottom section: additional details
accent_box(s, Inches(0.3), Inches(4.45), Inches(12.75), Inches(2.7), LIGHT_BG, MID_TEAL, False)
cols_data = [
("Dosing & Monitoring", [
"Voriconazole trough: 2–6 µg/mL",
"High interpatient variability (CYP2C19)",
"TDM essential for efficacy & toxicity",
"Duration: min 6–12 weeks (individualized)",
]),
("ABPA Treatment", [
"Oral corticosteroids (acute flares)",
"Itraconazole / azoles (reduce Aspergillus load)",
"Omalizumab: reduces exacerbations & IgE",
"Dupilumab / mepolizumab (emerging)",
]),
("Prophylaxis (high-risk)", [
"Posaconazole (extended-release preferred)",
"Voriconazole or itraconazole alternatives",
"HSCT, acute leukemia induction",
"Lung/heart transplant recipients",
]),
]
for ci, (col_title, bullets) in enumerate(cols_data):
cx = Inches(0.45 + ci * 4.3)
tb = s.shapes.add_textbox(cx, Inches(4.5), Inches(4.1), Inches(0.42))
tf = tb.text_frame
p = tf.paragraphs[0]; p.text = col_title
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(13); r.font.bold = True
r.font.color.rgb = DARK_TEAL
for bi, bullet in enumerate(bullets):
dot = s.shapes.add_shape(MSO_SHAPE.OVAL,
cx, Inches(5.02 + bi * 0.48) + Inches(0.08),
Inches(0.14), Inches(0.14))
dot.fill.solid(); dot.fill.fore_color.rgb = MID_TEAL
dot.line.fill.background(); dot.shadow.inherit = False
body_tb(s, [(bullet, 0, False)],
cx + Inches(0.22), Inches(5.02 + bi * 0.48),
Inches(3.8), Inches(0.44), font_size=12)
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 9 – Antifungal Resistance
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Antifungal Resistance", "A growing global threat — azole-resistant A. fumigatus")
# Left panel
accent_box(s, Inches(0.3), Inches(1.4), Inches(6.1), Inches(5.55), LIGHT_BG, MID_TEAL)
body_tb(s, [
("Resistance Mechanisms", 0, True),
("TR34/L98H cyp51A mutation — most prevalent globally", 0, False),
("TR46/Y121F/T289A — second most common", 0, False),
("Environmental route: agricultural azole fungicide use", 0, False),
("'One Health' issue: soil → air → humans", 0, False),
("", 0, False),
("Clinical Impact", 0, True),
("Cross-resistance: 85% VOR-R also ITR-R", 0, False),
("92.8% VOR-R also POS-R", 0, False),
("100% VOR-R also ISA-R", 0, False),
("53.5% of TRAF are pan-triazole resistant", 0, False),
("", 0, False),
("Management in Resistant Cases", 0, True),
("Empiric: voriconazole + echinocandin", 0, False),
("Liposomal amphotericin B (non-azole)", 0, False),
("Routine susceptibility testing essential", 0, False),
], Inches(0.45), Inches(1.5), Inches(5.8), Inches(5.3), font_size=13)
# Right panel: data cards
right_data = [
(DARK_TEAL, "VOR susceptibility: Netherlands", "22.2%", "Vs. 94.7–99.7%\nin Asia/UK/Brazil"),
(MID_TEAL, "TRAF rate: clinical isolates\n(Asia, meta-analysis 2025)", "4%", "(95% CI 3–6%)"),
(DARK_TEAL, "TRAF rate: environmental\nisolates (Asia)", "14%", "(95% CI 9–20%)"),
(MID_TEAL, "12-wk mortality VOR-R vs.\nVOR-susceptible IA", "54.5%\nvs 30.7%", "p = 0.035"),
]
for ri, (col, label, stat, note) in enumerate(right_data):
y = Inches(1.4 + ri * 1.42)
bx = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
Inches(6.7), y, Inches(6.28), Inches(1.32))
bx.fill.solid(); bx.fill.fore_color.rgb = col
bx.line.fill.background(); bx.shadow.inherit = False
tb = s.shapes.add_textbox(Inches(6.85), y + Inches(0.07), Inches(3.8), Inches(0.55))
tf = tb.text_frame; tf.word_wrap = True; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p = tf.paragraphs[0]; p.text = label
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(12); r.font.color.rgb = LIGHT_TEAL
tb2 = s.shapes.add_textbox(Inches(10.65), y + Inches(0.07), Inches(2.0), Inches(0.7))
tf2 = tb2.text_frame; tf2.vertical_anchor = MSO_ANCHOR.MIDDLE
p2 = tf2.paragraphs[0]; p2.text = stat; p2.alignment = PP_ALIGN.RIGHT
r2 = p2.runs[0]; r2.font.name = "Calibri"; r2.font.size = Pt(22)
r2.font.bold = True; r2.font.color.rgb = ORANGE
tb3 = s.shapes.add_textbox(Inches(6.85), y + Inches(0.75), Inches(5.8), Inches(0.45))
tf3 = tb3.text_frame; tf3.vertical_anchor = MSO_ANCHOR.MIDDLE
p3 = tf3.paragraphs[0]; p3.text = note
r3 = p3.runs[0]; r3.font.name = "Calibri"; r3.font.size = Pt(11)
r3.font.color.rgb = WHITE
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 10 – Special Topics & Prognosis
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Special Topics & Prognosis")
topics = [
(MID_TEAL, "COVID-19-Associated\nPulmonary Aspergillosis (CAPA)",
"Critically ill, ventilated COVID-19 patients\n"
"Corticosteroids + IL-6 inhibitors → permissive host\n"
"Atypical CT; lower GM sensitivity (non-neutropenic)\n"
"Antifungal therapy same as standard IA"),
(DARK_TEAL, "Pediatric Aspergillosis",
"Classic halo/air-crescent signs often absent in children\n"
"Voriconazole DOC; amphotericin B for neonates\n"
"Posaconazole PKs not fully established in young children\n"
"TDM especially critical — high CYP2C19 variability"),
(MID_TEAL, "Nosocomial & Occupational\nRisk",
"Outbreaks linked to hospital construction/renovation\n"
"Contaminated HVAC and water systems\n"
"HEPA filtration + positive-pressure rooms critical\n"
"Immunocompromised wards need strict air standards"),
]
for i, (col, title, desc) in enumerate(topics):
x = Inches(0.3 + i * 4.35)
bx = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, x, Inches(1.4), Inches(4.1), Inches(3.6))
bx.fill.solid(); bx.fill.fore_color.rgb = LIGHT_BG
bx.line.color.rgb = col; bx.line.width = Pt(2)
bx.shadow.inherit = False
top = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, Inches(1.4), Inches(4.1), Inches(0.5))
top.fill.solid(); top.fill.fore_color.rgb = col
top.line.fill.background(); top.shadow.inherit = False
tb = s.shapes.add_textbox(x + Inches(0.1), Inches(1.44), Inches(3.9), Inches(0.45))
tf = tb.text_frame; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p = tf.paragraphs[0]; p.text = title; p.alignment = PP_ALIGN.CENTER
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(12)
r.font.bold = True; r.font.color.rgb = WHITE
lines = desc.split('\n')
for li, line in enumerate(lines):
dot = s.shapes.add_shape(MSO_SHAPE.OVAL,
x + Inches(0.15),
Inches(2.05 + li * 0.68) + Inches(0.08),
Inches(0.14), Inches(0.14))
dot.fill.solid(); dot.fill.fore_color.rgb = col
dot.line.fill.background(); dot.shadow.inherit = False
body_tb(s, [(line, 0, False)],
x + Inches(0.36), Inches(2.05 + li * 0.68),
Inches(3.6), Inches(0.62), font_size=12)
# Prognosis section
accent_box(s, Inches(0.3), Inches(5.2), Inches(12.75), Inches(1.95), LIGHT_BG, DARK_TEAL, False)
tb = s.shapes.add_textbox(Inches(0.45), Inches(5.26), Inches(4.0), Inches(0.42))
tf = tb.text_frame
p = tf.paragraphs[0]; p.text = "Prognosis"
r = p.runs[0]; r.font.name = "Calibri"; r.font.size = Pt(14); r.font.bold = True
r.font.color.rgb = DARK_TEAL
prog = [
("Invasive aspergillosis", "6-week mortality 31–36%; up to 65% in hematologic malignancy"),
("Aspergilloma", "Excellent if no hemoptysis; surgery for life-threatening bleeding"),
("ABPA", "Progressive fibrosis without treatment; good with corticosteroids ± azoles"),
("CPA", "20–40% 5-year mortality driven by underlying comorbidities"),
]
for pi, (form, outcome) in enumerate(prog):
x_off = Inches(0.45 + pi * 3.2)
body_tb(s, [(form, 0, True), (outcome, 0, False)],
x_off, Inches(5.72), Inches(3.0), Inches(1.25), font_size=11)
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 11 – Key References
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s)
header_bar(s, "Key References")
refs = [
"1. Walsh TJ, Patterson TF. Aspergillosis. Goldman-Cecil Medicine, 27th ed. Chapter 311.",
"2. Harrison TR. Aspergillosis. Harrison's Principles of Internal Medicine, 22nd ed. Chapter 223.",
"3. Murray & Nadel's Textbook of Respiratory Medicine, 7th ed.",
"4. Red Book 2021: Report of the Committee on Infectious Diseases. AAP.",
"5. Morrissey CO et al. Aspergillus fumigatus — WHO priority fungal pathogens review. Med Mycol. 2024. PMID: 38935907",
"6. Gu Q et al. Antifungal treatment regimens for IA: systematic review & NMA. Drugs. 2026. PMID: 42012594",
"7. Chen X et al. Efficacy of biologics in ABPA: systematic review & meta-analysis. Lung. 2024. PMID: 38898129",
"8. Swain S et al. Epidemiology of triazole-resistant A. fumigatus in Asia. Mycoses. 2025. PMID: 40792442",
"9. Song Y et al. Antifungal susceptibility & resistance in aspergillosis. Mycoses. 2025. PMID: 41108579",
"10. Koulenti D et al. Severe mold infections in critically ill COVID-19 patients. Future Microbiol. 2024. PMID: 38700287",
]
for ri, ref in enumerate(refs):
y = Inches(1.45) + ri * Inches(0.55)
dot = s.shapes.add_shape(MSO_SHAPE.OVAL,
Inches(0.4), y + Inches(0.12),
Inches(0.16), Inches(0.16))
dot.fill.solid(); dot.fill.fore_color.rgb = ORANGE
dot.line.fill.background(); dot.shadow.inherit = False
body_tb(s, [(ref, 0, False)],
Inches(0.65), y, Inches(12.35), Inches(0.5), font_size=12)
# divider line
ln_shp = s.shapes.add_shape(MSO_SHAPE.RECTANGLE,
Inches(0.35), Inches(1.35),
Inches(12.65), Inches(0.04))
ln_shp.fill.solid(); ln_shp.fill.fore_color.rgb = MID_TEAL
ln_shp.line.fill.background(); ln_shp.shadow.inherit = False
footer(s)
# ─────────────────────────────────────────────────────────
# SLIDE 12 – Thank you / Summary
# ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
bg(s, DARK_TEAL)
band2 = s.shapes.add_shape(MSO_SHAPE.RECTANGLE,
0, Inches(5.5), prs.slide_width, Inches(2.0))
band2.fill.solid(); band2.fill.fore_color.rgb = RGBColor(0x00, 0x3A, 0x4A)
band2.line.fill.background(); band2.shadow.inherit = False
accent3 = s.shapes.add_shape(MSO_SHAPE.RECTANGLE,
0, Inches(5.5), Inches(0.35), Inches(2.0))
accent3.fill.solid(); accent3.fill.fore_color.rgb = ORANGE
accent3.line.fill.background(); accent3.shadow.inherit = False
tb = s.shapes.add_textbox(Inches(0.6), Inches(1.2), Inches(12.0), Inches(1.2))
tf = tb.text_frame
p = tf.paragraphs[0]; p.text = "Key Takeaways"
r = p.runs[0]; r.font.name = "Calibri Light"; r.font.size = Pt(42)
r.font.bold = True; r.font.color.rgb = WHITE
takeaways = [
"Aspergillus fumigatus causes the vast majority of invasive disease; outcome is determined primarily by host immune status.",
"Diagnosis requires integration of CT imaging, galactomannan, β-glucan, PCR, culture, and histopathology.",
"Voriconazole and isavuconazole are equivalent first-line therapies; isavuconazole has a more favorable safety profile.",
"Triazole resistance (TR34/L98H) is an emerging global threat — especially via the environmental/agricultural route.",
"Biologics (omalizumab, dupilumab, mepolizumab) are effective adjuncts in steroid-dependent ABPA.",
]
for i, t in enumerate(takeaways):
dot = s.shapes.add_shape(MSO_SHAPE.OVAL,
Inches(0.6), Inches(2.55 + i * 0.54) + Inches(0.1),
Inches(0.16), Inches(0.16))
dot.fill.solid(); dot.fill.fore_color.rgb = ORANGE
dot.line.fill.background(); dot.shadow.inherit = False
body_tb(s, [(t, 0, False)],
Inches(0.88), Inches(2.55 + i * 0.54),
Inches(11.85), Inches(0.5), font_size=13, color=LIGHT_TEAL)
# save
out_path = "/tmp/workspace/aspergillosis-ppt/Aspergillosis_Literature_Review.pptx"
from io import BytesIO
buf = BytesIO()
prs.save(buf)
with open(out_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out_path}")
cd /tmp/workspace/aspergillosis-ppt && python build_ppt.py 2>&1
~/aspergillosis-ppt/build_ppt.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/aspergillosis-ppt/build_ppt.py'
cd /tmp/workspace/aspergillosis-ppt && python build_ppt.py 2>&1
ls -lh /tmp/workspace/aspergillosis-ppt/Aspergillosis_Literature_Review.pptx
Aspergillosis Literature Review
Presentation · PPTX
| # | Slide |
|---|---|
| 1 | Title slide |
| 2 | Table of Contents |
| 3 | Introduction & Microbiology (species, morphology, virulence factors) |
| 4 | Epidemiology & Risk Factors (global burden stats + risk factor grid) |
| 5 | Pathogenesis (5-step visual flow: inhalation → dissemination) |
| 6 | Clinical Manifestations (colour-coded table: IA, aspergilloma, CPA, ABPA, allergic sinusitis) |
| 7 | Diagnosis (6 modality cards: CT, galactomannan, β-glucan, PCR, culture/histo, BAL) |
| 8 | Treatment (triad boxes: antifungals, immune reconstitution, surgery + dosing/prophylaxis/ABPA columns) |
| 9 | Antifungal Resistance (TR34/L98H mechanism + resistance rate data cards) |
| 10 | Special Topics & Prognosis (CAPA, pediatrics, nosocomial + prognosis by form) |
| 11 | Key References (10 textbook + PubMed citations) |
| 12 | Key Takeaways |