cOPd PowerPoint for postgraduate internal medicine students
"COPD" AND "management" AND "GOLD"
GOLD 2025 COPD management guidelines pharmacotherapy update
https://www.ajmc.com/view/updated-gold-guidelines-and-novel-…
mkdir -p /tmp/workspace/copd-pptx && ls /tmp/workspace/copd-pptx/
~/copd-pptx/build_copd.py
"""
COPD Management & Pharmacotherapy
Postgraduate Internal Medicine - 22 slides
Based on GOLD 2025 + Harrison's 22E
"""
import subprocess, json, base64
from io import BytesIO
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
# ── Palette (deep respiratory blue) ────────────────────────────────────────
NAVY = RGBColor(0x0D, 0x2B, 0x52) # title bg
SKY = RGBColor(0x27, 0x7D, 0xBB) # accent / headers
ACCENT2 = RGBColor(0xE8, 0x7E, 0x1B) # orange call-outs
LITE_BG = RGBColor(0xEF, 0xF6, 0xFC) # slide background
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK = RGBColor(0x1A, 0x1A, 0x2E)
MID_GREY = RGBColor(0x55, 0x60, 0x6E)
LIGHT_LINE= RGBColor(0xCC, 0xDE, 0xED)
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
blank = prs.slide_layouts[6]
# ── Helper utilities ────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill=None, line=None, line_w=None):
shape = slide.shapes.add_shape(1, x, y, w, h) # MSO_SHAPE_TYPE.RECTANGLE=1
shape.line.fill.background()
if fill:
shape.fill.solid()
shape.fill.fore_color.rgb = fill
else:
shape.fill.background()
if line:
shape.line.color.rgb = line
if line_w:
shape.line.width = line_w
else:
shape.line.fill.background()
return shape
def add_text(slide, text, x, y, w, h,
size=18, bold=False, color=DARK,
align=PP_ALIGN.LEFT, wrap=True, italic=False):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.size = Pt(size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
r.font.name = "Calibri"
return tb
def add_multiline(slide, lines, x, y, w, h,
size=16, bold_first=False, color=DARK,
line_space=1.15, indent=False):
"""lines = list of strings; first line optionally bold."""
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
for i, line in enumerate(lines):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
from pptx.util import Pt as _Pt
from pptx.oxml.ns import qn
from lxml import etree
pPr = p._pPr
if pPr is None:
pPr = p._p.get_or_add_pPr()
# bullet indent
if indent and i > 0:
pPr.set('indent', '-342900')
pPr.set('marL', '342900')
r = p.add_run()
r.text = line
r.font.size = _Pt(size)
r.font.bold = (bold_first and i == 0)
r.font.color.rgb = color
r.font.name = "Calibri"
return tb
def header_bar(slide, title, subtitle=None):
"""Top navy bar with title."""
add_rect(slide, 0, 0, W, Inches(1.3), fill=NAVY)
add_text(slide, title, Inches(0.45), Inches(0.12), W - Inches(1.5),
Inches(0.75), size=30, bold=True, color=WHITE)
if subtitle:
add_text(slide, subtitle, Inches(0.45), Inches(0.85),
W - Inches(1.5), Inches(0.4),
size=14, color=RGBColor(0xAA, 0xCC, 0xEE))
# sky accent stripe
add_rect(slide, 0, Inches(1.3), W, Inches(0.05), fill=SKY)
# light bg
add_rect(slide, 0, Inches(1.35), W, H - Inches(1.35), fill=LITE_BG)
def pill_box(slide, label, x, y, w, h, fill=SKY, txt_color=WHITE, size=14, bold=True):
add_rect(slide, x, y, w, h, fill=fill)
add_text(slide, label, x + Inches(0.08), y + Inches(0.05),
w - Inches(0.16), h - Inches(0.1),
size=size, bold=bold, color=txt_color, align=PP_ALIGN.CENTER, wrap=True)
def footer(slide, txt="GOLD 2025 | Harrison's 22E | Postgraduate IM"):
add_rect(slide, 0, H - Inches(0.32), W, Inches(0.32),
fill=RGBColor(0xD6, 0xE9, 0xF5))
add_text(slide, txt, Inches(0.3), H - Inches(0.3),
W - Inches(0.6), Inches(0.28),
size=9, color=MID_GREY, align=PP_ALIGN.LEFT)
def bullet_list(slide, items, x, y, w, available_h,
size=15, icon="▸", color=DARK, title=None, title_color=SKY):
tb = slide.shapes.add_textbox(x, y, w, available_h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
first = True
if title:
p = tf.paragraphs[0]
r = p.add_run()
r.text = title
r.font.bold = True
r.font.size = Pt(size + 1)
r.font.color.rgb = title_color
r.font.name = "Calibri"
first = False
for item in items:
if first:
p = tf.paragraphs[0]
first = False
else:
p = tf.add_paragraph()
r = p.add_run()
r.text = f"{icon} {item}"
r.font.size = Pt(size)
r.font.color.rgb = color
r.font.name = "Calibri"
return tb
# ── Download images ─────────────────────────────────────────────────────────
IMG_URLS = {
"abe_init": "https://cdn.orris.care/cdss_images/5a1c213ac406b58d7a6c1fbddc3194c514be8664a6f4ed4bc46136e4fe4ba8ac.png",
"followup": "https://cdn.orris.care/cdss_images/f84de61fde441170f700d58b0f9e50a1ca1ecea13055498682b43e0b1058fd9f.png",
"gold_abe": "https://cdn.orris.care/cdss_images/5e03596acc5a3716921eba73478fa5afae638a53c475f125533e77dc3b019ece.png",
}
raw = subprocess.check_output(
["python", "/tmp/skills/shared/scripts/fetch_images.py"] + list(IMG_URLS.values())
)
imgs = json.loads(raw)
img_data = {}
for key, info in zip(IMG_URLS.keys(), imgs):
if info.get("base64"):
header, b64 = info["base64"].split(",", 1)
img_data[key] = base64.b64decode(b64)
def embed_img(slide, key, x, y, w, h=None):
if key not in img_data:
return
buf = BytesIO(img_data[key])
if h:
slide.shapes.add_picture(buf, x, y, width=w, height=h)
else:
slide.shapes.add_picture(buf, x, y, width=w)
# ═══════════════════════════════════════════════════════════════════════════
# SLIDES
# ═══════════════════════════════════════════════════════════════════════════
# ── 1. TITLE SLIDE ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, fill=NAVY)
add_rect(s, 0, Inches(4.0), W, Inches(0.06), fill=SKY)
add_text(s, "COPD", Inches(1.0), Inches(1.2), Inches(11.3), Inches(1.5),
size=72, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, "Management & Pharmacotherapy",
Inches(1.0), Inches(2.65), Inches(11.3), Inches(0.9),
size=30, bold=False, color=RGBColor(0xAA, 0xCC, 0xEE),
align=PP_ALIGN.CENTER)
add_text(s, "Postgraduate Internal Medicine | Based on GOLD 2025 & Harrison's 22E",
Inches(1.0), Inches(3.5), Inches(11.3), Inches(0.5),
size=16, color=RGBColor(0x80, 0xA8, 0xCC), align=PP_ALIGN.CENTER)
add_text(s, "July 2026",
Inches(1.0), Inches(4.2), Inches(11.3), Inches(0.4),
size=14, color=RGBColor(0x70, 0x90, 0xAA), align=PP_ALIGN.CENTER)
# ── 2. LEARNING OBJECTIVES ─────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Learning Objectives")
bullet_list(s, [
"Understand the GOLD ABE classification and how it drives initial treatment",
"Select appropriate bronchodilator therapy (SABA, SAMA, LABA, LAMA, combination)",
"Know when to add ICS and how blood eosinophil counts guide that decision",
"Apply the follow-up pharmacological treatment algorithm",
"Recognize the role of roflumilast, azithromycin, ensifentrine, and dupilumab",
"Manage acute exacerbations: antibiotics, corticosteroids, ventilatory support",
"Implement non-pharmacological therapies: pulmonary rehab, oxygen, smoking cessation",
"Recognise special populations: PH-COPD, asthma-COPD overlap, LABA+ICS patients",
],
x=Inches(0.6), y=Inches(1.55), w=Inches(12.1), available_h=Inches(5.5),
size=16)
footer(s)
# ── 3. WHY MANAGEMENT MATTERS ──────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "The Disease Burden of COPD",
subtitle="Context for aggressive management")
# 3 stat boxes
for i, (stat, label, bg) in enumerate([
("3rd", "Leading cause of death globally", NAVY),
(">$40B", "Annual US direct & indirect costs", SKY),
("50%", "Exacerbations involve bacterial infection", ACCENT2),
]):
x = Inches(0.5 + i * 4.27)
add_rect(s, x, Inches(1.7), Inches(3.9), Inches(2.0), fill=bg)
add_text(s, stat, x, Inches(1.72), Inches(3.9), Inches(1.1),
size=48, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, label, x + Inches(0.1), Inches(2.82), Inches(3.7), Inches(0.7),
size=13, color=WHITE, align=PP_ALIGN.CENTER, wrap=True)
bullet_list(s, [
"Three interventions proven to improve survival: smoking cessation, long-term O₂ (in hypoxaemic patients), lung volume reduction surgery (LVRS) in selected emphysema",
"Triple inhaled therapy (LABA + LAMA + ICS) reduces mortality in selected patients",
"Pulmonary rehabilitation after hospitalisation reduces re-admission and mortality",
],
x=Inches(0.6), y=Inches(3.9), w=Inches(12.1), available_h=Inches(2.8), size=15)
footer(s)
# ── 4. GOLD ABE ASSESSMENT ─────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "GOLD ABE Assessment Framework",
subtitle="Two dimensions: airflow obstruction (GOLD grade) + symptoms/exacerbation risk")
embed_img(s, "gold_abe", Inches(0.5), Inches(1.5), Inches(12.2), Inches(5.6))
footer(s)
# ── 5. SPIROMETRY & GOLD GRADES ────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "GOLD Spirometric Grades",
subtitle="Post-bronchodilator FEV1/FVC < 0.7 confirms obstruction")
data = [
("GOLD 1", "Mild", "FEV₁ ≥ 80% predicted", SKY),
("GOLD 2", "Moderate","50% ≤ FEV₁ < 80%", RGBColor(0x27, 0x9D, 0x8E)),
("GOLD 3", "Severe", "30% ≤ FEV₁ < 50%", ACCENT2),
("GOLD 4", "Very Severe","FEV₁ < 30%", RGBColor(0xC0, 0x39, 0x2B)),
]
for i, (grade, label, fev, col) in enumerate(data):
y = Inches(1.7 + i * 1.2)
add_rect(s, Inches(0.5), y, Inches(2.2), Inches(1.0), fill=col)
add_text(s, grade, Inches(0.5), y + Inches(0.05), Inches(2.2), Inches(0.5),
size=20, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, label, Inches(0.5), y + Inches(0.52), Inches(2.2), Inches(0.42),
size=13, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, Inches(3.0), y, Inches(9.8), Inches(1.0), fill=RGBColor(0xE0, 0xEE, 0xF8))
add_text(s, fev, Inches(3.1), y + Inches(0.22), Inches(9.5), Inches(0.56),
size=18, color=DARK)
add_text(s, "⚠ Z-score method now preferred over fixed ratio (LLN) — GOLD 2025 update",
Inches(0.5), Inches(6.7), Inches(12.3), Inches(0.45),
size=13, bold=True, color=ACCENT2)
footer(s)
# ── 6. SYMPTOM SCORING TOOLS ───────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Symptom Assessment Tools",
subtitle="mMRC Dyspnoea Scale and COPD Assessment Test (CAT)")
# mMRC box
add_rect(s, Inches(0.5), Inches(1.55), Inches(5.8), Inches(5.5), fill=WHITE,
line=SKY, line_w=Pt(1.5))
add_text(s, "mMRC Dyspnoea Scale", Inches(0.6), Inches(1.65), Inches(5.5), Inches(0.45),
size=16, bold=True, color=SKY)
mmrc = [
"Grade 0: Breathless only on strenuous exercise",
"Grade 1: Short of breath hurrying or on slight incline",
"Grade 2: Walks slower than peers / stops on flat ground",
"Grade 3: Stops for breath after ~100 m on flat",
"Grade 4: Too breathless to leave house / dressing",
]
bullet_list(s, mmrc, Inches(0.65), Inches(2.15), Inches(5.5), Inches(4.6), size=14)
add_rect(s, Inches(0.5), Inches(5.9), Inches(5.8), Inches(0.45),
fill=RGBColor(0xD0, 0xE9, 0xF8))
add_text(s, "Score ≥ 2 → HIGH symptom burden (Group B/E)",
Inches(0.6), Inches(5.93), Inches(5.6), Inches(0.38),
size=12, bold=True, color=NAVY)
# CAT box
add_rect(s, Inches(6.8), Inches(1.55), Inches(6.0), Inches(5.5), fill=WHITE,
line=ACCENT2, line_w=Pt(1.5))
add_text(s, "COPD Assessment Test (CAT)", Inches(6.95), Inches(1.65), Inches(5.7), Inches(0.45),
size=16, bold=True, color=ACCENT2)
cat = [
"8 items: cough, phlegm, chest tightness, breathlessness, activity, confidence, sleep, energy",
"Score 0–40 (higher = worse)",
"< 10: Low impact",
"10–20: Medium impact",
"21–30: High impact",
"> 30: Very high impact",
"",
"CAT ≥ 10 → HIGH symptom burden (Group B/E)",
]
bullet_list(s, cat, Inches(6.95), Inches(2.15), Inches(5.7), Inches(4.7), size=14)
footer(s)
# ── 7. INITIAL PHARMACOLOGICAL TREATMENT (ABE GRID) ────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Initial Pharmacological Treatment — ABE Groups",
subtitle="GOLD 2025 recommendation")
embed_img(s, "abe_init", Inches(0.5), Inches(1.5), Inches(12.2), Inches(5.5))
footer(s)
# ── 8. BRONCHODILATORS — OVERVIEW ──────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Bronchodilator Therapy — Overview",
subtitle="Cornerstone of COPD pharmacotherapy")
cols = [
("SABA", "Short-Acting\nβ₂-Agonists", ["Salbutamol (albuterol)", "Terbutaline", "For acute relief / PRN use", "Onset: 5-15 min", "Duration: 4-6 h"], RGBColor(0x27, 0x8A, 0xD4)),
("SAMA", "Short-Acting\nMuscarinic Antagonists", ["Ipratropium bromide", "Acute symptom relief", "Can combine with SABA", "Duration: 6-8 h"], RGBColor(0x2E, 0x86, 0xAB)),
("LABA", "Long-Acting\nβ₂-Agonists", ["Salmeterol, Formoterol", "Indacaterol, Olodaterol", "Vilanterol, Arformoterol", "Reduce exacerbations", "Main SE: tremor, tachycardia"], RGBColor(0x0D, 0x70, 0x9B)),
("LAMA", "Long-Acting\nMuscarinic Antagonists", ["Tiotropium, Aclidinium", "Glycopyrronium, Umeclidinium", "Revefenacin (nebulised)", "Preferred over LABA alone", "SE: dry mouth"], NAVY),
]
for i, (abbr, full, items, col) in enumerate(cols):
x = Inches(0.32 + i * 3.25)
add_rect(s, x, Inches(1.55), Inches(3.05), Inches(0.9), fill=col)
add_text(s, abbr, x, Inches(1.57), Inches(3.05), Inches(0.45),
size=22, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, full, x, Inches(2.0), Inches(3.05), Inches(0.42),
size=10, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, x, Inches(2.48), Inches(3.05), Inches(4.55), fill=RGBColor(0xE8, 0xF4, 0xFD),
line=col, line_w=Pt(1))
bullet_list(s, items, x + Inches(0.1), Inches(2.55), Inches(2.85), Inches(4.4), size=13)
footer(s)
# ── 9. LABA + LAMA DUAL THERAPY ────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Dual Bronchodilator Therapy: LABA + LAMA",
subtitle="Preferred initial treatment for Group B and Group E (first line)")
# summary statement
add_rect(s, Inches(0.5), Inches(1.55), Inches(12.3), Inches(0.75),
fill=RGBColor(0xD0, 0xEA, 0xF8))
add_text(s, "GOLD 2025: Dual LABA+LAMA is the recommended starting point for Group B and Group E patients",
Inches(0.65), Inches(1.6), Inches(12.0), Inches(0.65),
size=15, bold=True, color=NAVY)
# Available FDCs
combos = [
("Indacaterol / Glycopyrronium", "Ultibro, Xoterna", "OD"),
("Umeclidinium / Vilanterol", "Anoro Ellipta", "OD"),
("Tiotropium / Olodaterol", "Spiolto Respimat", "OD"),
("Formoterol / Aclidinium", "Brimica Genuair", "BD"),
("Formoterol / Glycopyrronium", "Bevespi Aerosphere","BD"),
]
add_text(s, "Fixed-Dose Combinations (FDC)", Inches(0.5), Inches(2.45), Inches(7.0), Inches(0.4),
size=15, bold=True, color=SKY)
for i, (name, brand, freq) in enumerate(combos):
y = Inches(2.9 + i * 0.65)
add_rect(s, Inches(0.5), y, Inches(6.5), Inches(0.55),
fill=WHITE, line=LIGHT_LINE, line_w=Pt(0.75))
add_text(s, name, Inches(0.65), y + Inches(0.07), Inches(4.5), Inches(0.42), size=13)
add_text(s, brand, Inches(5.2), y + Inches(0.07), Inches(1.0), Inches(0.42),
size=12, color=MID_GREY, italic=True)
add_rect(s, Inches(6.3), y, Inches(0.55), Inches(0.55),
fill=SKY if freq=="OD" else ACCENT2)
add_text(s, freq, Inches(6.3), y + Inches(0.08), Inches(0.55), Inches(0.38),
size=11, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Benefits
bullet_list(s, [
"Greater improvement in FEV₁, symptoms, and health-related quality of life vs monotherapy",
"Reduced exacerbation rate compared with either drug alone",
"Single inhaler improves adherence over multiple devices",
"LAMA superior to LABA alone in preventing exacerbations",
],
x=Inches(7.2), y=Inches(2.45), w=Inches(5.6), available_h=Inches(4.5),
size=14, title="Key Evidence Points", title_color=SKY)
footer(s)
# ── 10. ICS IN COPD — WHEN TO ADD ──────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Inhaled Corticosteroids (ICS) in COPD",
subtitle="Targeted use guided by blood eosinophil count")
add_rect(s, Inches(0.5), Inches(1.55), Inches(12.3), Inches(0.75), fill=RGBColor(0xFF, 0xF0, 0xD6))
add_text(s, "⚠ ICS SHOULD NEVER BE USED AS MONOTHERAPY IN COPD",
Inches(0.65), Inches(1.6), Inches(12.0), Inches(0.65),
size=15, bold=True, color=ACCENT2)
# Blood eos guide
eos_data = [
("< 100 cells/μL", "ICS unlikely to benefit — avoid or withdraw", RGBColor(0xC0, 0x39, 0x2B), WHITE),
("100–299 cells/μL","Consider adding ICS if frequent exacerbations", ACCENT2, WHITE),
("≥ 300 cells/μL", "Strong predictor of ICS benefit — add ICS", RGBColor(0x27, 0x9D, 0x8E), WHITE),
]
add_text(s, "Blood Eosinophil Count — Guide to ICS Use", Inches(0.5), Inches(2.45), Inches(6.5), Inches(0.4),
size=15, bold=True, color=SKY)
for i, (eos, rec, col, tc) in enumerate(eos_data):
y = Inches(2.95 + i * 0.95)
add_rect(s, Inches(0.5), y, Inches(2.8), Inches(0.8), fill=col)
add_text(s, eos, Inches(0.55), y + Inches(0.12), Inches(2.7), Inches(0.56),
size=13, bold=True, color=tc, align=PP_ALIGN.CENTER)
add_rect(s, Inches(3.4), y, Inches(9.0), Inches(0.8), fill=RGBColor(0xF5, 0xF8, 0xFB),
line=col, line_w=Pt(1))
add_text(s, rec, Inches(3.55), y + Inches(0.15), Inches(8.7), Inches(0.5), size=14)
bullet_list(s, [
"ICS combined with LABA or LAMA (triple therapy) — not alone",
"ICS associated with increased pneumonia risk — monitor closely",
"De-escalate ICS if pneumonia, significant side effects, or blood eos < 100",
"Asthma-COPD overlap: ICS should be part of regimen regardless of eos",
],
x=Inches(0.5), y=Inches(5.85), w=Inches(12.3), available_h=Inches(1.4), size=13)
footer(s)
# ── 11. TRIPLE THERAPY ─────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Triple Therapy: LABA + LAMA + ICS",
subtitle="Reduces mortality in selected patients — Harrison's 22E")
# arrow diagram
for i, (label, col) in enumerate([
("LAMA\n(e.g. Tiotropium)", NAVY),
("LABA\n(e.g. Salmeterol)", SKY),
("ICS\n(e.g. Fluticasone)", RGBColor(0x27, 0x9D, 0x8E)),
]):
x = Inches(0.4 + i * 2.5)
add_rect(s, x, Inches(1.6), Inches(2.1), Inches(1.1), fill=col)
add_text(s, label, x, Inches(1.65), Inches(2.1), Inches(1.0),
size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
if i < 2:
add_text(s, "+", Inches(2.55 + i * 2.5), Inches(1.8), Inches(0.4), Inches(0.7),
size=30, bold=True, color=SKY, align=PP_ALIGN.CENTER)
# single inhaler products
add_rect(s, Inches(8.1), Inches(1.55), Inches(4.7), Inches(1.2), fill=NAVY)
add_text(s, "Single-Inhaler Triple Therapy", Inches(8.2), Inches(1.6), Inches(4.5), Inches(0.45),
size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
trifds = ["Fluticasone/Umeclidinium/Vilanterol (Trelegy Ellipta — OD)",
"Budesonide/Glycopyrronium/Formoterol (Breztri Aerosphere — BD)",
"Beclometasone/Glycopyrronium/Formoterol (Trimbow — BD)"]
bullet_list(s, trifds, Inches(8.2), Inches(2.1), Inches(4.5), Inches(1.1), size=11)
bullet_list(s, [
"Indication: persistent exacerbations on LABA+LAMA, or blood eos ≥ 300",
"IMPACT trial: triple therapy reduced all-cause mortality vs LABA+ICS or LAMA alone",
"ETHOS trial: single-inhaler triple reduced moderate/severe exacerbations by 24%",
"Single-device preferred — improves adherence and reduces technique errors",
"Monitor for oral candidiasis, dysphonia, and bacterial pneumonia (ICS-related)",
"De-escalation: consider withdrawing ICS if eos < 100 without frequent exacerbations",
],
x=Inches(0.5), y=Inches(2.9), w=Inches(12.3), available_h=Inches(4.0), size=14)
footer(s)
# ── 12. FOLLOW-UP PHARMACOLOGICAL TREATMENT ────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Follow-Up Pharmacological Treatment",
subtitle="GOLD 2025 — based on dominant clinical problem at review")
embed_img(s, "followup", Inches(0.5), Inches(1.5), Inches(12.2), Inches(5.6))
footer(s)
# ── 13. ICS ESCALATION / DE-ESCALATION ─────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Managing Patients on LABA + ICS",
subtitle="GOLD 2025: New Figure 3.22 — Switch, escalate, or de-escalate")
bullet_list(s, [
"Patients on LABA + ICS who are still symptomatic or exacerbating should be reviewed",
"Option 1 — ESCALATE: Add LAMA to achieve triple therapy (LABA + LAMA + ICS)",
"Option 2 — SWITCH: If eos < 100 or recurrent pneumonia, replace ICS with LAMA (→ LABA + LAMA)",
"Option 3 — MAINTAIN: If well-controlled on LABA + ICS with eos ≥ 300, continue",
"Abrupt ICS withdrawal carries risk of exacerbation, especially if eos ≥ 300 cells/μL",
"Structured tapering preferred over abrupt discontinuation when de-escalating ICS",
],
x=Inches(0.5), y=Inches(1.6), w=Inches(12.3), available_h=Inches(3.5), size=15)
# Decision table
rows = [
("Blood eos ≥ 300 + exacerbations", "Keep or escalate to triple", RGBColor(0x27, 0x9D, 0x8E)),
("Blood eos < 100", "Switch ICS → LAMA (de-escalate)", RGBColor(0xC0, 0x39, 0x2B)),
("Recurrent pneumonia", "De-escalate / remove ICS", ACCENT2),
("Well-controlled, eos 100–299", "Reassess in 3–6 months", SKY),
]
add_text(s, "Decision Guide", Inches(0.5), Inches(5.2), Inches(12.3), Inches(0.4),
size=14, bold=True, color=SKY)
for i, (cond, action, col) in enumerate(rows):
y = Inches(5.7 + i * 0.42)
add_rect(s, Inches(0.5), y, Inches(6.3), Inches(0.38), fill=RGBColor(0xF0, 0xF5, 0xFA),
line=LIGHT_LINE)
add_text(s, cond, Inches(0.6), y + Inches(0.04), Inches(6.0), Inches(0.3), size=12)
add_rect(s, Inches(6.9), y, Inches(5.9), Inches(0.38), fill=col)
add_text(s, action, Inches(7.0), y + Inches(0.04), Inches(5.7), Inches(0.3),
size=12, bold=True, color=WHITE)
footer(s)
# ── 14. PDE INHIBITORS & ANTI-INFECTIVE PROPHYLAXIS ────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Add-On Therapies: PDE Inhibitors & Macrolide Prophylaxis",
subtitle="For patients with persistent exacerbations despite triple therapy")
# 2 panels
for x, (drug, mechanism, indications, sideeffects, bg) in [
(Inches(0.5), ("Roflumilast\n(PDE-4 Inhibitor)", "Selective PDE-4 inhibition → ↓ cAMP degradation → anti-inflammatory",
["FEV₁ < 50% predicted (GOLD 3–4)", "Chronic bronchitis phenotype", "≥ 2 exacerbations/year on triple therapy"],
["Nausea, diarrhoea, weight loss (common)", "Depression / suicidal ideation (monitor)", "Not for concomitant theophylline use"],
NAVY)),
(Inches(6.9), ("Ensifentrine\n(PDE-3 & PDE-4 Inhibitor — NEW)", "Dual PDE3/4 inhibitor via nebuliser — first new inhaled class in 30 yrs",
["Added to standard maintenance therapy", "Persistent dyspnoea on bronchodilators", "Stable COPD — GOLD 2025 approved"],
["Generally well tolerated in Phase 3 trials", "ENHANCE-1 & ENHANCE-2 trials: improved FEV₁ + dyspnoea", "No significant safety signals"],
RGBColor(0x27, 0x6A, 0x99))),
]:
add_rect(s, x, Inches(1.55), Inches(6.2), Inches(5.5), fill=WHITE,
line=bg, line_w=Pt(1.5))
add_rect(s, x, Inches(1.55), Inches(6.2), Inches(0.65), fill=bg)
add_text(s, drug, x + Inches(0.1), Inches(1.6), Inches(6.0), Inches(0.55),
size=14, bold=True, color=WHITE)
add_text(s, "Mechanism: " + mechanism,
x + Inches(0.1), Inches(2.25), Inches(6.0), Inches(0.6),
size=12, color=MID_GREY, italic=True, wrap=True)
bullet_list(s, indications, x + Inches(0.1), Inches(2.9), Inches(6.0), Inches(1.5),
size=12, title="Indications", title_color=bg)
bullet_list(s, sideeffects, x + Inches(0.1), Inches(4.1), Inches(6.0), Inches(1.7),
size=12, title="Notes / Side Effects", title_color=ACCENT2)
# azithromycin
add_rect(s, Inches(0.5), Inches(7.15), Inches(12.7), Inches(0.35),
fill=RGBColor(0xFF, 0xF0, 0xD6))
add_text(s, "Azithromycin prophylaxis: 250 mg every 2 days (or 500 mg 3×/week) — in former smokers, older patients with ≥1 exacerbation; monitor QTc, hearing, mycobacterial resistance",
Inches(0.65), Inches(7.16), Inches(12.4), Inches(0.32),
size=11, color=DARK)
footer(s)
# ── 15. BIOLOGICS: DUPILUMAB & MEPOLIZUMAB ─────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Biologic Therapies in COPD — GOLD 2025 Update",
subtitle="For patients with eosinophilic phenotype refractory to standard triple therapy")
for x, (drug, target, trial, key_result, ind, bg) in [
(Inches(0.5), (
"Dupilumab\n(anti-IL-4Rα)",
"Blocks shared IL-4 / IL-13 receptor component",
"BOREAS & NOTUS trials",
"Reduced moderate/severe exacerbations by ~30% vs placebo; improved FEV₁ and QoL",
"Blood eos ≥ 300 cells/μL + refractory exacerbations on triple therapy",
SKY)),
(Inches(6.9), (
"Mepolizumab\n(anti-IL-5)",
"Blocks IL-5 → reduces eosinophil production",
"METREX / METREO trials",
"Reduced exacerbations in eos ≥ 150 cells/μL subgroup; FDA approved for COPD 2024",
"Blood eos ≥ 150 cells/μL (METREX) / ≥ 300 cells/μL (METREO); ≥ 2 exacerbations/yr",
RGBColor(0x27, 0x9D, 0x8E))),
]:
add_rect(s, x, Inches(1.55), Inches(6.2), Inches(5.6), fill=WHITE,
line=bg, line_w=Pt(1.5))
add_rect(s, x, Inches(1.55), Inches(6.2), Inches(0.65), fill=bg)
add_text(s, drug, x + Inches(0.1), Inches(1.6), Inches(6.0), Inches(0.55),
size=14, bold=True, color=WHITE)
bullet_list(s, [
f"Target: {target}",
f"Key Trial(s): {trial}",
f"Result: {key_result}",
f"Indication: {ind}",
],
x=x + Inches(0.1), y=Inches(2.3), w=Inches(6.0), available_h=Inches(4.7),
size=13, icon="•")
footer(s)
# ── 16. NON-PHARMACOLOGICAL THERAPIES ──────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Non-Pharmacological Management",
subtitle="Essential co-interventions — some proven to improve survival")
tiles = [
("🚭", "Smoking Cessation", ["Most impactful intervention", "NRT (patch, gum, inhaler)", "Varenicline — most effective pharmacotherapy", "Bupropion — second line"], NAVY),
("🏃", "Pulmonary Rehabilitation", ["Exercise training + education + self-management", "Reduces dyspnoea, hospitalisation, mortality", "Indicated after any COPD exacerbation", "In-person or virtual (GOLD 2025 allows both)"], SKY),
("💨", "Long-Term Oxygen Therapy", ["SpO₂ ≤ 88% at rest: indicated (any patient)", "SpO₂ ≤ 89% + cor pulmonale / polycythaemia", "≥ 15 h/day — mortality benefit proportional to hours", "Moderate hypoxaemia at rest: no mortality benefit"], RGBColor(0x27, 0x9D, 0x8E)),
("💉", "Vaccinations (GOLD 2025)", ["Influenza (annual)", "SARS-CoV-2 (per CDC schedule)", "Pneumococcal (PCV15 or PCV20)", "RSV vaccine", "Tdap if not vaccinated as adolescent", "Herpes zoster vaccine"], ACCENT2),
]
for i, (icon, title, items, col) in enumerate(tiles):
row, col_i = divmod(i, 2)
x = Inches(0.4 + col_i * 6.45)
y = Inches(1.6 + row * 2.85)
add_rect(s, x, y, Inches(6.1), Inches(2.6), fill=WHITE, line=col, line_w=Pt(1.2))
add_rect(s, x, y, Inches(6.1), Inches(0.55), fill=col)
add_text(s, f"{icon} {title}", x + Inches(0.1), y + Inches(0.07),
Inches(5.9), Inches(0.44), size=14, bold=True, color=WHITE)
bullet_list(s, items, x + Inches(0.15), y + Inches(0.62), Inches(5.8), Inches(1.9), size=12)
footer(s)
# ── 17. SURGICAL & INTERVENTIONAL OPTIONS ──────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Surgical & Interventional Options",
subtitle="Reserved for selected patients with severe disease")
ops = [
("Lung Volume Reduction Surgery (LVRS)",
["Upper-lobe predominant emphysema + low exercise capacity after rehab",
"NETT trial: reduced mortality and improved exercise capacity vs medical therapy",
"5-year mortality benefit in upper-lobe disease with low exercise capacity"],
SKY),
("Bronchoscopic Lung Volume Reduction (BLVR)",
["Endobronchial valves (Zephyr) — lobar occlusion in hyperinflation",
"Coils — mechanical lung reduction",
"Requires fissure integrity assessment (CT/nuclear scan)",
"Improves FEV₁, 6MWT, and QoL"],
RGBColor(0x0D, 0x70, 0x9B)),
("Lung Transplantation",
["End-stage COPD (GOLD 4) with progressive decline despite maximal therapy",
"Improves QoL; survival benefit less clear than in other indications",
"Single or bilateral lung transplant"],
NAVY),
("Non-Invasive Ventilation (NIV)",
["Stable severe hypercapnia (PaCO₂ > 55 mmHg or 50–54 with nocturnal desaturation)",
"Reduces hospitalisation and may reduce mortality",
"Mandates polysomnography to exclude OSA before initiating"],
RGBColor(0x27, 0x9D, 0x8E)),
]
for i, (title, items, col) in enumerate(ops):
row, c = divmod(i, 2)
x = Inches(0.4 + c * 6.45)
y = Inches(1.6 + row * 2.75)
add_rect(s, x, y, Inches(6.1), Inches(2.5), fill=WHITE, line=col, line_w=Pt(1))
add_rect(s, x, y, Inches(6.1), Inches(0.5), fill=col)
add_text(s, title, x + Inches(0.1), y + Inches(0.06), Inches(5.9), Inches(0.42),
size=13, bold=True, color=WHITE)
bullet_list(s, items, x + Inches(0.1), y + Inches(0.58), Inches(5.8), Inches(1.85), size=12)
footer(s)
# ── 18. ACUTE EXACERBATION — ASSESSMENT ────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Acute Exacerbation of COPD (AECOPD) — Assessment",
subtitle="Defined as an acute worsening requiring change in treatment beyond regular medications")
# Severity classification
add_text(s, "Severity Classification", Inches(0.5), Inches(1.6), Inches(12.3), Inches(0.4),
size=15, bold=True, color=SKY)
sev = [
("Mild", "Treated with SABA alone; no hospitalisation", RGBColor(0x27, 0x9D, 0x8E)),
("Moderate", "Requires SABA + antibiotics and/or systemic corticosteroids", ACCENT2),
("Severe", "Hospitalisation; may require ventilatory support", RGBColor(0xC0, 0x39, 0x2B)),
]
for i, (grade, desc, col) in enumerate(sev):
x = Inches(0.5 + i * 4.2)
add_rect(s, x, Inches(2.1), Inches(3.9), Inches(0.55), fill=col)
add_text(s, grade, x, Inches(2.13), Inches(3.9), Inches(0.48),
size=15, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, x, Inches(2.68), Inches(3.9), Inches(1.0), fill=RGBColor(0xF0, 0xF5, 0xFA),
line=col, line_w=Pt(1))
add_text(s, desc, x + Inches(0.1), Inches(2.73), Inches(3.7), Inches(0.9), size=12, wrap=True)
bullet_list(s, [
"Indications for hospitalisation: hypercarbia, acidaemia, or significant respiratory distress unresponsive to bronchodilators",
"Investigations: oximetry, ABG (if SpO₂ < 92% or suspected hypercarbia), CXR, ECG, BNP if heart failure suspected",
"CRP point-of-care testing: guides antibiotic prescribing, reduces unnecessary courses",
"CT pulmonary angiography: if PE is a serious consideration (sudden onset, haemodynamic compromise)",
"Bacterial infection implicated in ~50% of AECOPD; viral triggers also common",
],
x=Inches(0.5), y=Inches(3.85), w=Inches(12.3), available_h=Inches(3.2), size=14)
footer(s)
# ── 19. AECOPD TREATMENT ───────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Acute Exacerbation Treatment",
subtitle="Antibiotics + corticosteroids + bronchodilators + ventilatory support")
# Antibiotics panel
add_rect(s, Inches(0.5), Inches(1.55), Inches(5.9), Inches(5.5), fill=WHITE,
line=SKY, line_w=Pt(1.5))
add_rect(s, Inches(0.5), Inches(1.55), Inches(5.9), Inches(0.55), fill=SKY)
add_text(s, "Antibiotics", Inches(0.6), Inches(1.6), Inches(5.7), Inches(0.48),
size=15, bold=True, color=WHITE)
ab_items = [
"Indicated if: ↑dyspnoea + ↑sputum volume + ↑sputum purulence (all 3 or any 2 including purulence)",
"Amoxicillin-clavulanate 875/125 mg BD × 5–7 days (1st line)",
"Azithromycin 500 mg OD × 5 days (alternative)",
"Doxycycline 100 mg BD × 7 days (alternative)",
"Severe COPD / recent hospitalisation / Pseudomonas risk: Levofloxacin 750 mg OD × 7–10 days",
"Cover: S. pneumoniae, H. influenzae, M. catarrhalis",
"Post-exacerbation azithromycin: 250 mg every 2 days × 3 months — reduces treatment failure",
]
bullet_list(s, ab_items, Inches(0.6), Inches(2.2), Inches(5.7), Inches(4.7), size=12)
# Corticosteroids panel
add_rect(s, Inches(6.6), Inches(1.55), Inches(6.2), Inches(2.6), fill=WHITE,
line=ACCENT2, line_w=Pt(1.5))
add_rect(s, Inches(6.6), Inches(1.55), Inches(6.2), Inches(0.55), fill=ACCENT2)
add_text(s, "Systemic Corticosteroids", Inches(6.7), Inches(1.6), Inches(6.0), Inches(0.48),
size=15, bold=True, color=WHITE)
bullet_list(s, [
"Prednisolone 40 mg PO OD × 5 days — standard course",
"5-day course non-inferior to 14-day course (REDUCE trial)",
"For patients requiring emergency care or hospitalisation",
"IV methylprednisolone if oral route not possible",
], Inches(6.7), Inches(2.2), Inches(6.0), Inches(1.8), size=12)
# Bronchodilators panel
add_rect(s, Inches(6.6), Inches(4.25), Inches(6.2), Inches(2.8), fill=WHITE,
line=NAVY, line_w=Pt(1.5))
add_rect(s, Inches(6.6), Inches(4.25), Inches(6.2), Inches(0.55), fill=NAVY)
add_text(s, "Bronchodilators & Ventilation", Inches(6.7), Inches(4.3), Inches(6.0), Inches(0.48),
size=15, bold=True, color=WHITE)
bullet_list(s, [
"SABA (salbutamol) via MDI/nebuliser — first-line bronchodilator",
"Add ipratropium if inadequate response to SABA",
"Controlled O₂: target SpO₂ 88–92% (avoid hyperoxia → hypercapnia)",
"NIV (BiPAP): pH < 7.35 + PaCO₂ > 45 mmHg — reduces intubation & mortality",
"Invasive ventilation: if NIV fails or contraindicated",
], Inches(6.7), Inches(4.9), Inches(6.0), Inches(2.0), size=12)
footer(s)
# ── 20. AECOPD HOSPITAL MANAGEMENT TABLE ───────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "AECOPD — Hospital Management Summary",
subtitle="Goldman-Cecil Medicine framework")
table_data = [
("Diagnostic Testing", "CXR; oximetry; ABG; ECG\nOther tests as clinically warranted"),
("Bronchodilators", "Inhaled SABA (salbutamol)\nAdd ipratropium if inadequate response"),
("Antibiotics", "If ≥2 of: ↑dyspnoea / ↑sputum volume / ↑sputum purulence\nAmoxicillin-clavulanate, macrolide, or doxycycline"),
("Corticosteroids", "Prednisolone 40 mg/day × 5 days\nIV methylprednisolone if oral not tolerated"),
("O₂ Therapy", "Target SpO₂ 88–92% to avoid hypercapnia\nTitrate with ABG monitoring"),
("NIV / Invasive Ventilation", "NIV for pH < 7.35 + PaCO₂ > 45 mmHg\nInvasive ventilation if NIV fails"),
("Anticoagulation", "Prophylactic LMWH / mechanical if immobile"),
("Discharge Criteria", "Stable on oral bronchodilators; SpO₂ ≥ 90% on room air or baseline O₂\nPatient/carer education; follow-up arranged"),
]
add_rect(s, Inches(0.3), Inches(1.55), Inches(12.8), Inches(0.42), fill=NAVY)
add_text(s, "Component", Inches(0.4), Inches(1.58), Inches(3.5), Inches(0.36),
size=13, bold=True, color=WHITE)
add_text(s, "Management", Inches(4.0), Inches(1.58), Inches(9.0), Inches(0.36),
size=13, bold=True, color=WHITE)
for i, (comp, mgmt) in enumerate(table_data):
y = Inches(2.0 + i * 0.6)
bg = WHITE if i % 2 == 0 else RGBColor(0xEF, 0xF6, 0xFC)
add_rect(s, Inches(0.3), y, Inches(12.8), Inches(0.58), fill=bg, line=LIGHT_LINE)
add_text(s, comp, Inches(0.4), y + Inches(0.04), Inches(3.4), Inches(0.5),
size=12, bold=True, color=NAVY)
add_text(s, mgmt, Inches(4.0), y + Inches(0.04), Inches(9.0), Inches(0.52),
size=11, color=DARK, wrap=True)
footer(s)
# ── 21. PH-COPD & SPECIAL POPULATIONS ─────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Special Situations: PH-COPD & Comorbidities",
subtitle="GOLD 2025: New sections on cardiovascular risk and pulmonary hypertension in COPD")
bullet_list(s, [
"Pulmonary hypertension in COPD (PH-COPD): vasodilators NOT recommended — worsen oxygenation",
"Drugs approved for PAH (sildenafil, riociguat, etc.) should not be routinely used for PH-COPD",
"GOLD 2025 Figure 5.1: Treatable Traits in PH-COPD — focus on optimising bronchodilators, O₂, and comorbidity management",
"Cardiovascular disease: COPD patients have 2–3× higher CV risk; statins, ACE-inhibitors benefit",
"Asthma-COPD Overlap (ACO): ICS should always be included; allergist/immunologist co-management",
"Alpha-1 Antitrypsin Deficiency: consider augmentation therapy (IV A1AT) in confirmed deficiency",
"Anxiety/Depression: screen all COPD patients; CBT and pharmacotherapy appropriate",
"Sarcopenia / nutritional depletion: nutritional support + resistance training as part of PR",
],
x=Inches(0.5), y=Inches(1.55), w=Inches(12.3), available_h=Inches(5.6), size=15)
footer(s)
# ── 22. MONITORING & FOLLOW-UP ─────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Monitoring & Follow-Up",
subtitle="GOLD 2025 updated follow-up checklist")
cols2 = [
("At Every Visit", [
"Inhaler technique assessment",
"Adherence check",
"Smoking status — offer cessation support",
"Symptom scores: CAT or mMRC",
"Exacerbation history since last visit",
"O₂ saturation (SpO₂)",
"Comorbidity review",
], SKY),
("Annually", [
"Spirometry to track FEV₁ decline",
"Blood eosinophil count (guides ICS decisions)",
"CXR if clinically indicated",
"6-Minute Walk Test",
"Review ongoing O₂ therapy eligibility",
"Pulmonary rehabilitation referral if not yet enrolled",
"Vaccine status review",
], NAVY),
("After Exacerbation", [
"Review within 4 weeks of discharge",
"Confirm appropriate maintenance inhaler intensification",
"ABG if hypercapnia persists (consider NIV)",
"Pulmonary rehabilitation referral (ideally within 4 weeks)",
"Consider step-up of pharmacotherapy",
"Psychosocial assessment",
], ACCENT2),
]
for i, (title, items, col) in enumerate(cols2):
x = Inches(0.35 + i * 4.33)
add_rect(s, x, Inches(1.55), Inches(4.1), Inches(0.6), fill=col)
add_text(s, title, x, Inches(1.58), Inches(4.1), Inches(0.54),
size=15, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, x, Inches(2.18), Inches(4.1), Inches(4.85),
fill=WHITE, line=col, line_w=Pt(1))
bullet_list(s, items, x + Inches(0.15), Inches(2.26), Inches(3.85), Inches(4.6), size=13)
footer(s)
# ── 23. SUMMARY / TAKE-HOME MESSAGES ───────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Take-Home Messages",
subtitle="COPD Management — Key Principles for Clinical Practice")
messages = [
("1", "Classify with ABE Tool", "Post-BD FEV₁/FVC < 0.7 confirms COPD; then stratify by CAT/mMRC and exacerbation history"),
("2", "Start with bronchodilators", "Group A: LAMA or LABA monotherapy; Group B/E: dual LABA+LAMA in single inhaler"),
("3", "ICS: use eosinophil-guided", "Blood eos ≥ 300: add ICS; eos < 100: avoid ICS (pneumonia risk, limited benefit)"),
("4", "Triple therapy in high-risk", "LABA+LAMA+ICS reduces mortality in selected patients (GOLD 3–4, frequent exacerbators)"),
("5", "New GOLD 2025 drugs", "Ensifentrine (PDE3/4 — nebulised, for persistent dyspnoea); Dupilumab (eos ≥ 300, refractory exacerbations)"),
("6", "Treat exacerbations promptly", "5-day prednisolone + antibiotics (if ≥2 Anthonisen criteria); NIV for pH < 7.35"),
("7", "Non-pharmacological is essential", "Smoking cessation, pulmonary rehabilitation, and vaccinations are non-negotiable"),
]
for i, (num, title, detail) in enumerate(messages):
y = Inches(1.6 + i * 0.78)
add_rect(s, Inches(0.4), y, Inches(0.55), Inches(0.65), fill=SKY)
add_text(s, num, Inches(0.4), y + Inches(0.05), Inches(0.55), Inches(0.55),
size=20, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, title, Inches(1.1), y + Inches(0.04), Inches(3.2), Inches(0.57),
size=13, bold=True, color=NAVY)
add_text(s, detail, Inches(4.4), y + Inches(0.06), Inches(8.5), Inches(0.55),
size=12, color=DARK, wrap=True)
add_rect(s, Inches(0.4), y + Inches(0.65), Inches(12.5), Inches(0.02), fill=LIGHT_LINE)
footer(s, "GOLD 2025 | Harrison's 22E | Goldman-Cecil Medicine | Postgraduate IM")
# ── 24. REFERENCES ─────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "References & Further Reading")
refs = [
"Global Initiative for Chronic Obstructive Lung Disease (GOLD). Global Strategy for the Diagnosis, Management, and Prevention of Chronic Obstructive Pulmonary Disease. 2025 Report. goldcopd.org",
"Loscalzo J et al. Harrison's Principles of Internal Medicine, 22nd Edition. McGraw-Hill, 2025. Chapter 303: Chronic Obstructive Pulmonary Disease.",
"Katzung BG. Basic and Clinical Pharmacology, 16th Edition. McGraw-Hill. Treatment of COPD.",
"Goldman L, Cooney KA. Goldman-Cecil Medicine, 27th Edition. Elsevier. Chapter 76.",
"Lipson DA et al. Once-Daily Single-Inhaler Triple versus Dual Therapy in COPD (IMPACT). N Engl J Med 2018;378:1671-1680.",
"Rabe KF et al. Dupilumab in COPD with Type 2 Inflammation — BOREAS trial. N Engl J Med 2023;389:205-214.",
"Calverley PM et al. Salmeterol and Fluticasone Propionate and Survival in COPD (TORCH). N Engl J Med 2007;356:775-789.",
"GOLD 2025 Key Changes Summary. goldcopd.org/wp-content/uploads/2024/11/KEY-CHANGES-GOLD-2025-11Nov2024.pdf",
"Wedzicha JA et al. Indacaterol-Glycopyrronium versus Salmeterol-Fluticasone for COPD (FLAME). N Engl J Med 2016;374:2222-2234.",
]
bullet_list(s, refs, Inches(0.6), Inches(1.6), Inches(12.1), Inches(5.6), size=12, icon="•")
footer(s, "GOLD 2025 | Harrison's 22E | Goldman-Cecil Medicine | Postgraduate IM")
# ── SAVE ────────────────────────────────────────────────────────────────────
out = "/tmp/workspace/copd-pptx/COPD_Management_Pharmacotherapy.pptx"
buf = BytesIO()
prs.save(buf)
with open(out, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out} ({len(prs.slides)} slides)")
cd /tmp/workspace/copd-pptx && python build_copd.py 2>&1
**/fetch_images.py in /tmp/skills
mkdir -p /tmp/workspace/copd-pptx/imgs && \ curl -s -o /tmp/workspace/copd-pptx/imgs/abe_init.png "https://cdn.orris.care/cdss_images/5a1c213ac406b58d7a6c1fbddc3194c514be8664a6f4ed4bc46136e4fe4ba8ac.png" && \ curl -s -o /tmp/workspace/copd-pptx/imgs/followup.png "https://cdn.orris.care/cdss_images/f84de61fde441170f700d58b0f9e50a1ca1ecea13055498682b43e0b1058fd9f.png" && \ curl -s -o /tmp/workspace/copd-pptx/imgs/gold_abe.png "https://cdn.orris.care/cdss_images/5e03596acc5a3716921eba73478fa5afae638a53c475f125533e77dc3b019ece.png" && \ ls -lh /tmp/workspace/copd-pptx/imgs/
~/copd-pptx/build_copd.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/copd-pptx/build_copd.py'
~/copd-pptx/build_copd.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/copd-pptx/build_copd.py'
~/copd-pptx/build_copd.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/copd-pptx/build_copd.py'
cd /tmp/workspace/copd-pptx && python build_copd.py 2>&1
COPD Management Pharmacotherapy
Presentation · PPTX
| # | Slide |
|---|---|
| 1 | Title slide |
| 2 | Learning objectives |
| 3 | Disease burden - why management matters |
| 4 | GOLD ABE Assessment Tool (Harrison's diagram, embedded) |
| 5 | GOLD spirometric grades 1-4 + z-score note |
| 6 | Symptom scoring - mMRC and CAT |
| 7 | Initial pharmacotherapy - ABE grid (Harrison's figure, embedded) |
| 8 | Bronchodilator overview - SABA / SAMA / LABA / LAMA columns |
| 9 | Dual LABA+LAMA - FDC table + evidence |
| 10 | ICS in COPD - blood eosinophil-guided decision |
| 11 | Triple therapy (LABA+LAMA+ICS) - IMPACT/ETHOS data |
| 12 | Follow-up pharmacotherapy algorithm (GOLD 2025 flowchart, embedded) |
| 13 | Managing patients on LABA+ICS - escalate / switch / de-escalate |
| 14 | PDE inhibitors: Roflumilast + Ensifentrine (new GOLD 2025) + Azithromycin |
| 15 | Biologics: Dupilumab + Mepolizumab (GOLD 2025 additions) |
| 16 | Non-pharmacological: smoking cessation, pulm rehab, LTOT, vaccines |
| 17 | Surgical/interventional: LVRS, BLVR, transplant, NIV |
| 18 | AECOPD - assessment and severity classification |
| 19 | AECOPD treatment - antibiotics, steroids, bronchodilators, ventilation |
| 20 | Hospital management summary table (Goldman-Cecil format) |
| 21 | Special populations: PH-COPD, ACO, alpha-1 AT deficiency, CV risk |
| 22 | Monitoring and follow-up checklist |
| 23 | Take-home messages (7 key principles) |
| 24 | References |
Peripheral vascular disease power point for post graduate students
AHA ACC 2024 2025 peripheral artery disease PAD guidelines update management
https://www.hmpgloballearningnetwork.com/site/cathlab/what-y…
mkdir -p /tmp/workspace/pad-pptx && ls /tmp/workspace/pad-pptx/
~/pad-pptx/build_pad.py
"""
Peripheral Arterial Disease (PAD) — Management Focus
Postgraduate Internal Medicine | 24 slides
Sources: 2024 ACC/AHA LE-PAD Guideline, Braunwald's Heart Disease,
Mulholland & Greenfield Surgery 7e, Katzung Pharmacology 16e
"""
from io import BytesIO
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
# ── Palette (deep burgundy-red vascular theme) ─────────────────────────────
CRIMSON = RGBColor(0x8B, 0x00, 0x00) # title bar
SCARLET = RGBColor(0xC0, 0x25, 0x2D) # accent / headers
GOLD = RGBColor(0xD4, 0x8E, 0x0A) # call-out orange
LITE_BG = RGBColor(0xFD, 0xF0, 0xF0) # slide bg
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK = RGBColor(0x1A, 0x1A, 0x2E)
MID_GREY = RGBColor(0x55, 0x60, 0x6E)
LIGHT_LINE= RGBColor(0xE8, 0xCC, 0xCC)
TEAL = RGBColor(0x00, 0x7A, 0x7A)
NAVY = RGBColor(0x0D, 0x2B, 0x52)
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
blank = prs.slide_layouts[6]
# ── Helpers ─────────────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill=None, line=None, line_w=None):
shape = slide.shapes.add_shape(1, x, y, w, h)
shape.line.fill.background()
if fill:
shape.fill.solid()
shape.fill.fore_color.rgb = fill
else:
shape.fill.background()
if line:
shape.line.color.rgb = line
if line_w:
shape.line.width = line_w
else:
shape.line.fill.background()
return shape
def add_text(slide, text, x, y, w, h,
size=18, bold=False, color=DARK,
align=PP_ALIGN.LEFT, wrap=True, italic=False):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.size = Pt(size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
r.font.name = "Calibri"
return tb
def header_bar(slide, title, subtitle=None):
add_rect(slide, 0, 0, W, Inches(1.3), fill=CRIMSON)
add_text(slide, title, Inches(0.45), Inches(0.1), W - Inches(1.5),
Inches(0.78), size=30, bold=True, color=WHITE)
if subtitle:
add_text(slide, subtitle, Inches(0.45), Inches(0.86),
W - Inches(1.5), Inches(0.4),
size=14, color=RGBColor(0xF0, 0xBB, 0xBB))
add_rect(slide, 0, Inches(1.3), W, Inches(0.05), fill=GOLD)
add_rect(slide, 0, Inches(1.35), W, H - Inches(1.35), fill=LITE_BG)
def footer(slide, txt="2024 ACC/AHA PAD Guideline | Braunwald's Heart Disease | Postgraduate IM"):
add_rect(slide, 0, H - Inches(0.32), W, Inches(0.32),
fill=RGBColor(0xF5, 0xE0, 0xE0))
add_text(slide, txt, Inches(0.3), H - Inches(0.3),
W - Inches(0.6), Inches(0.28),
size=9, color=MID_GREY, align=PP_ALIGN.LEFT)
def bullet_list(slide, items, x, y, w, available_h,
size=15, icon="▸", color=DARK, title=None, title_color=SCARLET):
tb = slide.shapes.add_textbox(x, y, w, available_h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
first = True
if title:
p = tf.paragraphs[0]
r = p.add_run()
r.text = title
r.font.bold = True
r.font.size = Pt(size + 1)
r.font.color.rgb = title_color
r.font.name = "Calibri"
first = False
for item in items:
if first:
p = tf.paragraphs[0]; first = False
else:
p = tf.add_paragraph()
r = p.add_run()
r.text = f"{icon} {item}"
r.font.size = Pt(size)
r.font.color.rgb = color
r.font.name = "Calibri"
return tb
# ═══════════════════════════════════════════════════════════════════════════
# SLIDES
# ═══════════════════════════════════════════════════════════════════════════
# ── 1. TITLE ────────────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, fill=CRIMSON)
add_rect(s, 0, Inches(4.1), W, Inches(0.07), fill=GOLD)
add_text(s, "Peripheral Arterial Disease",
Inches(0.8), Inches(1.0), Inches(11.7), Inches(1.6),
size=56, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, "PAD of the Lower Extremity",
Inches(0.8), Inches(2.6), Inches(11.7), Inches(0.8),
size=30, color=RGBColor(0xF5, 0xBB, 0xBB), align=PP_ALIGN.CENTER)
add_text(s, "Diagnosis · Risk Stratification · Medical Therapy · Revascularisation",
Inches(0.8), Inches(3.4), Inches(11.7), Inches(0.55),
size=18, color=RGBColor(0xE0, 0xA0, 0xA0), align=PP_ALIGN.CENTER)
add_text(s, "Postgraduate Internal Medicine | Based on 2024 ACC/AHA Guideline",
Inches(0.8), Inches(4.3), Inches(11.7), Inches(0.42),
size=14, color=RGBColor(0xCC, 0x88, 0x88), align=PP_ALIGN.CENTER)
add_text(s, "July 2026",
Inches(0.8), Inches(4.85), Inches(11.7), Inches(0.38),
size=13, color=RGBColor(0xCC, 0x88, 0x88), align=PP_ALIGN.CENTER)
# ── 2. LEARNING OBJECTIVES ──────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Learning Objectives")
bullet_list(s, [
"Define PAD, understand its clinical subsets, and quantify its epidemiological burden",
"Identify risk factors, understand the pathophysiology of atherosclerotic occlusion",
"Perform and interpret the Ankle-Brachial Index (ABI) and other non-invasive tests",
"Differentiate asymptomatic PAD, claudication, chronic limb-threatening ischaemia (CLTI), and acute limb ischaemia (ALI)",
"Apply the WIfI classification to grade CLTI severity and guide revascularisation decisions",
"Prescribe evidence-based medical therapy: statins, antiplatelets, rivaroxaban, SGLT2i, GLP-1 RA",
"Know the indications and options for revascularisation: endovascular vs. open surgical bypass",
"Manage acute limb ischaemia: recognise the 6 P's, timing of intervention",
"Understand the 2024 ACC/AHA LE-PAD guideline updates and COMPASS/VOYAGER evidence",
],
x=Inches(0.6), y=Inches(1.55), w=Inches(12.1), available_h=Inches(5.6), size=16)
footer(s)
# ── 3. DEFINITION & EPIDEMIOLOGY ────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Definition & Epidemiology",
subtitle="Third leading cause of atherosclerotic morbidity worldwide")
for i, (stat, label, bg) in enumerate([
("200M+", "People affected globally", CRIMSON),
("12%", "US adult prevalence (>20% if age >70)", SCARLET),
("~10M", "Americans with symptomatic claudication", GOLD),
("1–3%", "Develop CLTI (rest pain / tissue loss)", TEAL),
]):
x = Inches(0.35 + i * 3.25)
add_rect(s, x, Inches(1.65), Inches(3.0), Inches(1.8), fill=bg)
add_text(s, stat, x, Inches(1.68), Inches(3.0), Inches(1.0),
size=40, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, label, x + Inches(0.1), Inches(2.65), Inches(2.8), Inches(0.72),
size=12, color=WHITE, align=PP_ALIGN.CENTER, wrap=True)
bullet_list(s, [
"PAD = ABI < 0.90 — atherosclerotic stenosis/occlusion of aorta and peripheral arteries (excl. coronaries)",
"19% of persons >55 yrs have PAD; up to 55% of those >80 yrs — yet only 6% have classic claudication",
"Atypical/absent leg symptoms predominate: 50% atypical, 40% asymptomatic (Rotterdam Study)",
"Polyvascular disease: 25–30% of PAD patients also have coronary artery disease or cerebrovascular disease",
"Strong independent predictor of MACE (MI, stroke, CV death) — 20% nonfatal MI/stroke over 5 years",
],
x=Inches(0.5), y=Inches(3.7), w=Inches(12.3), available_h=Inches(3.0), size=14)
footer(s)
# ── 4. PATHOPHYSIOLOGY ──────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Pathophysiology",
subtitle="Atherosclerosis as the dominant mechanism")
# Two-column layout
add_rect(s, Inches(0.4), Inches(1.55), Inches(6.2), Inches(5.6),
fill=WHITE, line=SCARLET, line_w=Pt(1.5))
add_rect(s, Inches(0.4), Inches(1.55), Inches(6.2), Inches(0.55), fill=SCARLET)
add_text(s, "Atherosclerotic Disease Progression",
Inches(0.55), Inches(1.6), Inches(6.0), Inches(0.48),
size=14, bold=True, color=WHITE)
bullet_list(s, [
"Intimal injury → endothelial dysfunction → LDL oxidation",
"Monocyte recruitment → foam cell formation → fatty streak",
"Smooth muscle cell migration → fibrous plaque",
"Calcification and plaque instability → stenosis",
"Reduced perfusion → ischaemia with exertion (claudication)",
"Progressive occlusion → rest pain → tissue loss",
"Thrombosis on ruptured plaque → acute limb ischaemia",
],
x=Inches(0.55), y=Inches(2.2), w=Inches(5.9), available_h=Inches(4.7), size=14)
add_rect(s, Inches(6.9), Inches(1.55), Inches(6.0), Inches(5.6),
fill=WHITE, line=GOLD, line_w=Pt(1.5))
add_rect(s, Inches(6.9), Inches(1.55), Inches(6.0), Inches(0.55), fill=GOLD)
add_text(s, "Key Risk Factors",
Inches(7.05), Inches(1.6), Inches(5.8), Inches(0.48),
size=14, bold=True, color=WHITE)
# Risk factor table with relative risk
rf_data = [
("Cigarette Smoking", "4×", CRIMSON),
("Diabetes Mellitus", "2–4×", SCARLET),
("Hypertension", "1.5–2×", RGBColor(0xC0, 0x60, 0x30)),
("Hyperlipidaemia", "1.5–2×", GOLD),
("Age > 65 years", "3–5×", TEAL),
("CKD (eGFR < 60)", "2–3×", NAVY),
("Homocysteinaemia", "1.5×", MID_GREY),
("Male sex / Family Hx", "1.5×", MID_GREY),
]
for i, (rf, rr, col) in enumerate(rf_data):
y = Inches(2.2 + i * 0.52)
add_rect(s, Inches(6.9), y, Inches(4.5), Inches(0.48),
fill=RGBColor(0xFB, 0xF0, 0xF0), line=LIGHT_LINE)
add_text(s, rf, Inches(7.05), y + Inches(0.06), Inches(3.5), Inches(0.38), size=13)
add_rect(s, Inches(11.45), y, Inches(1.3), Inches(0.48), fill=col)
add_text(s, rr, Inches(11.45), y + Inches(0.07), Inches(1.3), Inches(0.34),
size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
footer(s)
# ── 5. CLINICAL SUBSETS (2024 GUIDELINE) ────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Clinical Subsets of PAD — 2024 ACC/AHA Classification",
subtitle="The 2024 guideline emphasises subset-specific management")
subsets = [
("Asymptomatic PAD",
"ABI < 0.9 without exertional symptoms\nMay have functional impairment (limits activities to avoid pain)\nDiagnosed by screening",
NAVY, "Low"),
("Chronic Exertional\nLeg Symptoms\n(Claudication)",
"Reproducible muscle aching/cramping with exertion, relieved by rest\nmMRC walking distance-limited\nNatural history: benign — only 1–2% progress to CLTI in 5 yrs",
TEAL, "Moderate"),
("Chronic Limb-Threatening\nIschaemia (CLTI)",
"Rest pain + / or tissue loss (ulcer, gangrene)\nABI typically < 0.4\nHigh risk of major amputation if untreated\nUse WIfI classification",
SCARLET, "High"),
("Acute Limb\nIschaemia (ALI)",
"Sudden reduction in perfusion threatening limb viability\nThe 6 P's: Pain, Pallor, Pulselessness, Paraesthesia, Paralysis, Perishing cold\nVascular emergency — requires immediate intervention",
CRIMSON, "Critical"),
]
for i, (title, desc, col, risk) in enumerate(subsets):
x = Inches(0.3 + i * 3.27)
add_rect(s, x, Inches(1.6), Inches(3.1), Inches(0.7), fill=col)
add_text(s, title, x, Inches(1.62), Inches(3.1), Inches(0.66),
size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, x, Inches(2.32), Inches(3.1), Inches(4.4),
fill=WHITE, line=col, line_w=Pt(1.2))
add_text(s, desc, x + Inches(0.1), Inches(2.4), Inches(2.9), Inches(4.1),
size=12, color=DARK, wrap=True)
add_rect(s, x, Inches(6.72), Inches(3.1), Inches(0.38), fill=col)
add_text(s, f"Risk: {risk}", x, Inches(6.74), Inches(3.1), Inches(0.3),
size=11, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
footer(s)
# ── 6. ABI — INTERPRETATION & TECHNIQUE ────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Ankle-Brachial Index (ABI)",
subtitle="Primary non-invasive diagnostic and prognostic test — ABI ≤ 0.90 = PAD")
# Technique box
add_rect(s, Inches(0.4), Inches(1.55), Inches(5.5), Inches(5.5),
fill=WHITE, line=SCARLET, line_w=Pt(1.5))
add_rect(s, Inches(0.4), Inches(1.55), Inches(5.5), Inches(0.5), fill=SCARLET)
add_text(s, "How to Measure ABI", Inches(0.55), Inches(1.6),
Inches(5.3), Inches(0.43), size=14, bold=True, color=WHITE)
bullet_list(s, [
"Patient supine for ≥ 10 minutes",
"Measure bilateral brachial systolic BP",
"Measure systolic BP at both ankles (dorsalis pedis AND posterior tibial arteries)",
"ABI = Ankle systolic pressure ÷ Highest brachial systolic pressure",
"Calculate separately for each limb; use HIGHER ankle pressure per limb",
"Abnormal: < 0.90 | Borderline: 0.91–0.99 | Normal: 1.00–1.40",
"Non-compressible arteries (calcification): ABI > 1.40 — use toe-brachial index (TBI < 0.70 = PAD)",
"Exercise ABI: useful if resting ABI normal but claudication suspected",
],
x=Inches(0.55), y=Inches(2.15), w=Inches(5.2), available_h=Inches(4.7), size=13)
# Interpretation table
add_rect(s, Inches(6.2), Inches(1.55), Inches(6.7), Inches(5.5),
fill=WHITE, line=GOLD, line_w=Pt(1.5))
add_rect(s, Inches(6.2), Inches(1.55), Inches(6.7), Inches(0.5), fill=GOLD)
add_text(s, "ABI Interpretation & Clinical Correlation",
Inches(6.35), Inches(1.6), Inches(6.5), Inches(0.43),
size=14, bold=True, color=WHITE)
rows = [
("> 1.40", "Non-compressible (calcification) — use TBI", RGBColor(0x60, 0x60, 0x60)),
("1.00 – 1.40","Normal", RGBColor(0x27, 0x9D, 0x8E)),
("0.91 – 0.99","Borderline — consider exercise ABI", TEAL),
("≤ 0.90", "PAD (diagnostic threshold)", GOLD),
("0.71 – 0.90","Mild PAD — usually claudication", GOLD),
("0.41 – 0.70","Moderate PAD — claudication / rest pain", SCARLET),
("< 0.40", "Severe PAD — rest pain / CLTI", CRIMSON),
("Exercise drop","Post-exercise ABI drops ≥ 0.20 = significant", NAVY),
]
for i, (val, interp, col) in enumerate(rows):
y = Inches(2.15 + i * 0.54)
add_rect(s, Inches(6.2), y, Inches(1.8), Inches(0.5), fill=col)
add_text(s, val, Inches(6.25), y + Inches(0.08), Inches(1.7), Inches(0.34),
size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, Inches(8.05), y, Inches(4.7), Inches(0.5),
fill=RGBColor(0xFD, 0xF0, 0xF0), line=LIGHT_LINE)
add_text(s, interp, Inches(8.15), y + Inches(0.08), Inches(4.5), Inches(0.34), size=12)
footer(s)
# ── 7. NON-INVASIVE IMAGING & ADVANCED DIAGNOSTICS ─────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Non-Invasive Imaging & Advanced Diagnostics",
subtitle="After ABI — for lesion localisation, severity, and pre-procedural planning")
tests = [
("Duplex Ultrasound",
["First-line imaging after ABI", "Real-time B-mode + Doppler waveforms",
"Localise and grade stenosis (velocity ratios)", "Assess graft patency post-revascularisation",
"No ionising radiation; limited by calcification/obesity"],
NAVY),
("CT Angiography (CTA)",
["Excellent spatial resolution — 'roadmap' for intervention",
"Rapid, widely available", "Highly accurate for degree and extent of stenosis",
"Risk: iodinated contrast, radiation, CKD caution",
"Best for complex aorto-iliac and multi-level disease"],
TEAL),
("MR Angiography (MRA)",
["No ionising radiation; excellent soft-tissue contrast",
"Gadolinium-enhanced MRA — high accuracy for infrainguinal disease",
"Avoid in eGFR < 30 (NSF risk with gadolinium)",
"Time-of-flight MRA: useful if contrast contraindicated"],
SCARLET),
("Invasive Angiography\n(DSA / IVUS)",
["Gold standard for anatomical detail",
"Reserved for patients proceeding to endovascular intervention",
"Allows simultaneous treatment",
"IVUS: evaluates vessel wall, calcification, stent apposition"],
CRIMSON),
]
for i, (title, items, col) in enumerate(tests):
row, c = divmod(i, 2)
x = Inches(0.3 + c * 6.55)
y = Inches(1.6 + row * 2.8)
add_rect(s, x, y, Inches(6.2), Inches(2.6), fill=WHITE, line=col, line_w=Pt(1.2))
add_rect(s, x, y, Inches(6.2), Inches(0.52), fill=col)
add_text(s, title, x + Inches(0.1), y + Inches(0.06), Inches(6.0), Inches(0.43),
size=14, bold=True, color=WHITE)
bullet_list(s, items, x + Inches(0.15), y + Inches(0.58), Inches(5.9), Inches(1.9),
size=12, icon="•")
footer(s)
# ── 8. WIFI CLASSIFICATION ─────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "WIfI Classification — Chronic Limb-Threatening Ischaemia",
subtitle="Wound · Ischaemia · foot Infection — 2024 ACC/AHA endorsed; SVS developed")
add_rect(s, Inches(0.4), Inches(1.55), Inches(12.5), Inches(0.65),
fill=RGBColor(0xF5, 0xE0, 0xE0))
add_text(s,
"WIfI grades each component 0–3. Combined score → Amputation Risk (Very Low / Low / Moderate / High) & Revascularisation Benefit",
Inches(0.55), Inches(1.62), Inches(12.2), Inches(0.55),
size=14, bold=True, color=CRIMSON)
# Three component columns
components = [
("W — WOUND", [
"0: No wound / ulcer",
"1: Small shallow ulcer, no gangrene",
"2: Deeper ulcer (tendon/capsule/bone), heel ulcer, or multiple small ulcers",
"3: Extensive deep ulcer, extensive gangrene",
], SCARLET),
("I — ISCHAEMIA (ABI)", [
"0: ABI ≥ 0.80 | TP ≥ 100 mmHg",
"1: ABI 0.60–0.79 | TP 70–99 mmHg",
"2: ABI 0.40–0.59 | TP 50–69 mmHg",
"3: ABI < 0.40 | TP < 50 mmHg",
], TEAL),
("fI — foot INFECTION", [
"0: No symptoms/signs of infection",
"1: Local infection — skin/subcutaneous, < 2 cm cellulitis",
"2: Local infection — deeper (fascia, muscle, tendon, bone, joint)",
"3: Sepsis syndrome — SIRS criteria met",
], GOLD),
]
for i, (title, items, col) in enumerate(components):
x = Inches(0.4 + i * 4.3)
add_rect(s, x, Inches(2.35), Inches(4.1), Inches(0.52), fill=col)
add_text(s, title, x, Inches(2.38), Inches(4.1), Inches(0.44),
size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, x, Inches(2.9), Inches(4.1), Inches(3.5),
fill=WHITE, line=col, line_w=Pt(1.0))
bullet_list(s, items, x + Inches(0.1), Inches(2.95), Inches(3.9), Inches(3.4),
size=13, icon="•", color=DARK)
bullet_list(s, [
"Combined WIfI grade predicts 1-year major amputation risk and likelihood of benefit from revascularisation",
"High WIfI score (W3 + I3 + fI3) = very high amputation risk — aggressive revascularisation warranted",
"Restage WIfI post-revascularisation to assess wound healing trajectory",
],
x=Inches(0.4), y=Inches(6.55), w=Inches(12.5), available_h=Inches(0.8), size=12)
footer(s)
# ── 9. MEDICAL THERAPY OVERVIEW ─────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Guideline-Directed Medical Therapy (GDMT) — Overview",
subtitle="2024 ACC/AHA — Multiple pillars; reduces MACE and MALE")
pillars = [
("🚭 Smoking\nCessation", "Greatest modifiable risk factor\nNRT + varenicline\nReduces amputation risk by 50%", CRIMSON),
("💊 Lipid Lowering", "High-intensity statin (Class I)\nEzetimibe if LDL ≥ 70 mg/dL on statin\nPCSK9 inhibitor if goal not met", SCARLET),
("💉 Antiplatelet /\nAnticoagulant",
"SAPT (aspirin or clopidogrel)\nRivaroxaban 2.5 mg BD + aspirin 100 mg OD\n(COMPASS & VOYAGER trials — Class I in 2024)", GOLD),
("🩺 BP Control", "Target < 130/80 mmHg (Class I)\nACE-i/ARB preferred (CV benefit)\nBeta-blockers: safe in PAD", TEAL),
("🩸 Glycaemic Control", "HbA1c target < 7% generally\nSGLT2 inhibitors: ↓MACE + limb outcomes\nGLP-1 RAs: ↓CV events in T2DM + PAD", NAVY),
("🏃 Exercise\nTherapy", "Supervised Exercise Therapy (SET): Class I\n≥ 36 sessions over 12 weeks\nImproves walking distance + QoL", RGBColor(0x5B, 0x0A, 0x8F)),
]
for i, (title, detail, col) in enumerate(pillars):
row, c = divmod(i, 3)
x = Inches(0.3 + c * 4.35)
y = Inches(1.6 + row * 2.7)
add_rect(s, x, y, Inches(4.1), Inches(2.5), fill=WHITE, line=col, line_w=Pt(1.3))
add_rect(s, x, y, Inches(4.1), Inches(0.62), fill=col)
add_text(s, title, x, y + Inches(0.06), Inches(4.1), Inches(0.54),
size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, detail, x + Inches(0.12), y + Inches(0.7), Inches(3.85), Inches(1.7),
size=12, color=DARK, wrap=True)
footer(s)
# ── 10. STATINS & LIPID MANAGEMENT ──────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Lipid Management in PAD",
subtitle="2024 ACC/AHA: High-intensity statin = Class I recommendation for all PAD patients")
add_rect(s, Inches(0.4), Inches(1.55), Inches(12.5), Inches(0.65),
fill=RGBColor(0xF5, 0xE0, 0xE0))
add_text(s,
"PAD = established ASCVD → LDL target < 70 mg/dL (< 1.8 mmol/L); many guidelines now target < 55 mg/dL in very high-risk",
Inches(0.6), Inches(1.62), Inches(12.2), Inches(0.55),
size=14, bold=True, color=CRIMSON)
statin_data = [
("Atorvastatin 40–80 mg", "High-intensity", "↓LDL ~50%", CRIMSON),
("Rosuvastatin 20–40 mg", "High-intensity", "↓LDL ~55%", SCARLET),
("Ezetimibe 10 mg", "Add-on if LDL not at goal", "↓LDL additional 20–25%", TEAL),
("Evolocumab / Alirocumab","PCSK9 inhibitor — if LDL still ≥ 70 on max statin + ezetimibe",
"↓LDL additional 50–60%", NAVY),
]
add_text(s, "Drug Choices", Inches(0.5), Inches(2.35), Inches(7.0), Inches(0.4),
size=14, bold=True, color=SCARLET)
for i, (drug, ind, effect, col) in enumerate(statin_data):
y = Inches(2.85 + i * 0.75)
add_rect(s, Inches(0.5), y, Inches(3.5), Inches(0.65), fill=col)
add_text(s, drug, Inches(0.55), y + Inches(0.1), Inches(3.4), Inches(0.48),
size=13, bold=True, color=WHITE)
add_rect(s, Inches(4.1), y, Inches(4.2), Inches(0.65),
fill=RGBColor(0xFD, 0xF0, 0xF0), line=LIGHT_LINE)
add_text(s, ind, Inches(4.2), y + Inches(0.1), Inches(4.1), Inches(0.5), size=12)
add_rect(s, Inches(8.4), y, Inches(4.5), Inches(0.65), fill=RGBColor(0xF0, 0xF8, 0xF0),
line=LIGHT_LINE)
add_text(s, effect, Inches(8.5), y + Inches(0.12), Inches(4.3), Inches(0.45), size=12,
bold=True, color=TEAL)
bullet_list(s, [
"Statins reduce total mortality, nonfatal MI/stroke, and limb events in PAD (Rotterdam Study, meta-analyses)",
"Statin therapy also reduces need for peripheral revascularisation",
"At age >75 years: moderate-intensity statin acceptable (consider risk-benefit)",
"Non-statin lipid therapy: ezetimibe (IMPROVE-IT) and PCSK9 inhibitors (FOURIER, ODYSSEY) demonstrate CV benefit",
],
x=Inches(0.5), y=Inches(6.0), w=Inches(12.3), available_h=Inches(1.3), size=13)
footer(s)
# ── 11. ANTIPLATELET & ANTITHROMBOTIC THERAPY ───────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Antiplatelet & Antithrombotic Therapy",
subtitle="2024 ACC/AHA: Rivaroxaban 2.5 mg BD + Aspirin = new Class I recommendation")
# COMPASS / VOYAGER evidence boxes
for x, (trial, population, result, bg) in [
(Inches(0.4), (
"COMPASS Trial",
"Medically managed patients with stable vascular disease including PAD (n=27,395)",
"Rivaroxaban 2.5 mg BD + ASA 100 mg vs ASA alone:\n↓MACE by 24% | ↓MALE by 46% | ↑major bleeding (but no fatal/critical organ bleeding excess)",
NAVY)),
(Inches(6.9), (
"VOYAGER-PAD Trial",
"PAD patients post-revascularisation (endovascular or surgical; n=6,564)",
"Rivaroxaban 2.5 mg BD + ASA 100 mg vs ASA alone:\n↓composite MACE/MALE by 15% | ↓ALI by 33% | Modest increase in TIMI non-major bleeding",
SCARLET)),
]:
add_rect(s, x, Inches(1.55), Inches(6.2), Inches(3.4), fill=WHITE,
line=bg, line_w=Pt(1.5))
add_rect(s, x, Inches(1.55), Inches(6.2), Inches(0.55), fill=bg)
add_text(s, trial, x + Inches(0.1), Inches(1.6), Inches(6.0), Inches(0.47),
size=15, bold=True, color=WHITE)
add_text(s, "Population: " + population,
x + Inches(0.15), Inches(2.18), Inches(5.9), Inches(0.65),
size=12, color=MID_GREY, italic=True, wrap=True)
add_text(s, result,
x + Inches(0.15), Inches(2.9), Inches(5.9), Inches(1.9),
size=12, color=DARK, wrap=True)
bullet_list(s, [
"SAPT (aspirin 75–100 mg OR clopidogrel 75 mg) — Class I for all symptomatic PAD",
"DAPT (aspirin + clopidogrel) — reasonable for limited periods post-stenting; EUCLID trial: ticagrelor not superior to clopidogrel in PAD",
"Rivaroxaban 2.5 mg BD + ASA: Class I for PAD — particularly if post-revascularisation or polyvascular disease",
"Do NOT use rivaroxaban in patients with high bleeding risk or who require full-dose anticoagulation (e.g. AF → use standard-dose DOAC)",
"Warfarin/DOAC for AF co-management: DOACs preferred; avoid DAPT + anticoagulant unless post-stenting within 1 month",
],
x=Inches(0.5), y=Inches(5.1), w=Inches(12.3), available_h=Inches(2.0), size=13)
footer(s)
# ── 12. NEW PHARMACOTHERAPY — SGLT2i, GLP-1, BP ────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "New Pharmacotherapy in PAD — 2024 Guideline Updates",
subtitle="SGLT2 inhibitors, GLP-1 RAs, and antihypertensives")
for x, (cls, drugs, mechanism, evidence, ind, bg) in [
(Inches(0.4), (
"SGLT2 Inhibitors\n(NEW — 2024 Guideline)",
"Empagliflozin, Dapagliflozin, Canagliflozin",
"Reduce glucose via glucosuria; also reduce preload/afterload, weight, inflammation",
"EMPA-REG OUTCOME, CANVAS, CREDENCE: ↓CV death, ↓HF hospitalisation, ↓limb outcomes in diabetic PAD",
"T2DM with PAD — reduce MACE + limb events; also benefit in HF/CKD",
TEAL)),
(Inches(4.6), (
"GLP-1 Receptor Agonists\n(NEW — 2024 Guideline)",
"Semaglutide, Liraglutide, Dulaglutide",
"Incretin mimetic — improves glycaemia, weight loss, anti-inflammatory",
"LEADER (liraglutide), SUSTAIN-6 (semaglutide): ↓MACE in T2DM; semaglutide ↓PAD events",
"T2DM with PAD or high CV risk — particularly with obesity",
SCARLET)),
(Inches(8.8), (
"Antihypertensives",
"ACE-i / ARB | Calcium Channel Blockers | Beta-blockers",
"BP < 130/80 mmHg target\nACE-i/ARB preferred for CV protection",
"HOPE trial (ramipril): ↓MI, stroke, CV death by 22% in high-risk vascular patients\nBeta-blockers: not contraindicated in claudication",
"All PAD patients regardless of diabetes status",
NAVY)),
]:
add_rect(s, x, Inches(1.55), Inches(4.1), Inches(5.6), fill=WHITE,
line=bg, line_w=Pt(1.5))
add_rect(s, x, Inches(1.55), Inches(4.1), Inches(0.75), fill=bg)
add_text(s, cls, x + Inches(0.1), Inches(1.6), Inches(3.9), Inches(0.68),
size=13, bold=True, color=WHITE)
bullet_list(s, [
"Drugs: " + drugs,
"Mechanism: " + mechanism,
"Evidence: " + evidence,
"Indication: " + ind,
], x + Inches(0.12), Inches(2.38), Inches(3.85), Inches(4.5),
size=11, icon="•", color=DARK)
footer(s)
# ── 13. CILOSTAZOL & EXERCISE THERAPY FOR CLAUDICATION ──────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Management of Claudication",
subtitle="Conservative first — supervised exercise then pharmacotherapy; revascularisation for refractory cases")
# Supervised exercise panel
add_rect(s, Inches(0.4), Inches(1.55), Inches(6.0), Inches(5.5),
fill=WHITE, line=TEAL, line_w=Pt(1.5))
add_rect(s, Inches(0.4), Inches(1.55), Inches(6.0), Inches(0.55), fill=TEAL)
add_text(s, "🏃 Supervised Exercise Therapy (SET) — Class I",
Inches(0.55), Inches(1.6), Inches(5.8), Inches(0.46),
size=13, bold=True, color=WHITE)
bullet_list(s, [
"Most effective non-pharmacological intervention for claudication",
"Minimum 36 sessions over 12 weeks; 3 sessions/week",
"Treadmill or track walking — 'walk through pain', rest, repeat",
"Improves pain-free walking distance by 150–200%",
"CMS-approved cardiac rehab programme for PAD since 2017",
"Also improves: QoL, ankle/brachial pressure, CV fitness, depression",
"Home-based structured exercise also beneficial (HONOR trial)",
"Resistance training improves walking ability in older patients",
],
x=Inches(0.55), y=Inches(2.2), w=Inches(5.7), available_h=Inches(4.6), size=13)
# Pharmacotherapy panel
add_rect(s, Inches(6.8), Inches(1.55), Inches(6.1), Inches(5.5),
fill=WHITE, line=GOLD, line_w=Pt(1.5))
add_rect(s, Inches(6.8), Inches(1.55), Inches(6.1), Inches(0.55), fill=GOLD)
add_text(s, "💊 Pharmacotherapy for Claudication",
Inches(6.95), Inches(1.6), Inches(5.9), Inches(0.46),
size=13, bold=True, color=WHITE)
drugs_c = [
("Cilostazol 100 mg BD", "PDE-3 inhibitor + vasodilator", "↑pain-free walking distance ~50–67%; ↑QoL", "Class I; avoid in HF (EF < 40%)"),
("Pentoxifylline 400 mg TDS", "Rheologic agent (↓RBC rigidity)", "Modest benefit; conflicting data", "Class IIb; less preferred than cilostazol"),
("Naftidrofuryl 200 mg TDS", "5-HT2 antagonist (Europe)", "↑pain-free walking distance", "Widely used in Europe, not FDA-approved"),
]
for i, (drug, mech, effect, note) in enumerate(drugs_c):
y = Inches(2.25 + i * 1.55)
add_rect(s, Inches(6.8), y, Inches(6.1), Inches(0.42), fill=GOLD)
add_text(s, drug, Inches(6.95), y + Inches(0.05), Inches(5.9), Inches(0.35),
size=13, bold=True, color=WHITE)
add_text(s, f"Mechanism: {mech}",
Inches(6.95), y + Inches(0.48), Inches(5.9), Inches(0.35),
size=11, color=MID_GREY, italic=True)
add_text(s, f"Effect: {effect}",
Inches(6.95), y + Inches(0.83), Inches(5.9), Inches(0.35),
size=12, color=DARK)
add_text(s, f"⚑ {note}",
Inches(6.95), y + Inches(1.18), Inches(5.9), Inches(0.3),
size=11, bold=True, color=SCARLET)
footer(s)
# ── 14. REVASCULARISATION OVERVIEW ──────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Revascularisation — Indications & Decision Framework",
subtitle="2024 ACC/AHA: Endovascular-first for most; surgery for complex/TASC D lesions and CLTI")
# Indications
add_text(s, "Indications for Revascularisation", Inches(0.5), Inches(1.6), Inches(12.3), Inches(0.4),
size=15, bold=True, color=SCARLET)
for i, (ind, detail, col) in enumerate([
("Lifestyle-Limiting Claudication", "Failed ≥ 3 months supervised exercise + medical therapy; significant functional disability", TEAL),
("Chronic Limb-Threatening Ischaemia (CLTI)", "Rest pain (ABI < 0.4) or tissue loss (ulcer/gangrene) — urgent revascularisation to achieve limb salvage", SCARLET),
("Acute Limb Ischaemia (ALI)", "Surgical/endovascular emergency within 6 hours of onset of motor/sensory deficit", CRIMSON),
]):
y = Inches(2.1 + i * 0.75)
add_rect(s, Inches(0.5), y, Inches(3.5), Inches(0.65), fill=col)
add_text(s, ind, Inches(0.55), y + Inches(0.1), Inches(3.4), Inches(0.5),
size=12, bold=True, color=WHITE)
add_rect(s, Inches(4.1), y, Inches(8.7), Inches(0.65),
fill=RGBColor(0xFD, 0xF0, 0xF0), line=LIGHT_LINE)
add_text(s, detail, Inches(4.2), y + Inches(0.12), Inches(8.5), Inches(0.5),
size=12, color=DARK, wrap=True)
# TASC classification note
add_rect(s, Inches(0.5), Inches(4.75), Inches(5.8), Inches(2.35),
fill=WHITE, line=NAVY, line_w=Pt(1.2))
add_rect(s, Inches(0.5), Inches(4.75), Inches(5.8), Inches(0.5), fill=NAVY)
add_text(s, "TASC Lesion Classification (Aorto-Iliac / Femoro-Popliteal)",
Inches(0.65), Inches(4.8), Inches(5.6), Inches(0.42), size=12, bold=True, color=WHITE)
bullet_list(s, [
"TASC A/B: Short lesions → endovascular preferred",
"TASC C: Intermediate → discuss with patient; endovascular reasonable",
"TASC D: Complex long-segment occlusions → surgical bypass preferred",
"Anatomical location, runoff, co-morbidities, and patient preference all factor in",
],
x=Inches(0.65), y=Inches(5.32), w=Inches(5.5), available_h=Inches(1.65), size=12)
add_rect(s, Inches(6.6), Inches(4.75), Inches(6.3), Inches(2.35),
fill=WHITE, line=TEAL, line_w=Pt(1.2))
add_rect(s, Inches(6.6), Inches(4.75), Inches(6.3), Inches(0.5), fill=TEAL)
add_text(s, "Key Principle: GDMT Before (and After) All Revascularisation",
Inches(6.75), Inches(4.8), Inches(6.1), Inches(0.42), size=12, bold=True, color=WHITE)
bullet_list(s, [
"Medical therapy reduces MACE and MALE regardless of procedure",
"Rivaroxaban 2.5 + ASA: Class I post-revascularisation (VOYAGER)",
"Shared decision-making with patient about risk/benefit",
"Multidisciplinary team (vascular surgery, cardiology, wound care, DM team)",
],
x=Inches(6.75), y=Inches(5.32), w=Inches(6.1), available_h=Inches(1.65), size=12)
footer(s)
# ── 15. ENDOVASCULAR INTERVENTIONS ──────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Endovascular Interventions",
subtitle="Minimally invasive — first-line for most claudication and many CLTI cases")
endo = [
("Percutaneous\nTransluminal Angioplasty\n(PTA / Balloon)",
["Inflate balloon to dilate stenosis", "Suitable for TASC A/B lesions", "Aorto-iliac: excellent durability", "Femoro-popliteal: restenosis risk ~30–40% at 1 yr", "Drug-Coated Balloons (DCB): reduce restenosis"],
TEAL),
("Bare-Metal &\nDrug-Eluting Stents",
["BMS: used for residual stenosis/dissection post-PTA", "DES (paclitaxel-eluting): improved patency in SFA", "Self-expanding nitinol stents for SFA", "Covered stents (PTFE): for aorto-iliac occlusions", "Avoid stenting across the knee joint (fracture risk)"],
NAVY),
("Atherectomy\n(Plaque Removal)",
["Directional / rotational / laser atherectomy", "Reduces plaque burden before stenting", "Useful in heavily calcified lesions", "Orbital atherectomy: for tibial disease", "Adjunct to PTA/stenting"],
SCARLET),
("Thrombolysis\n(Catheter-Directed)",
["For ALI — catheter into thrombus", "Alteplase (tPA) infusion 0.5–1 mg/hr", "Lyses thrombus in 24–72 hours", "Identifies underlying stenosis → treat", "Contraindicated: stroke < 3 months, active bleeding"],
CRIMSON),
]
for i, (title, items, col) in enumerate(endo):
row, c = divmod(i, 2)
x = Inches(0.3 + c * 6.55)
y = Inches(1.6 + row * 2.8)
add_rect(s, x, y, Inches(6.2), Inches(2.6), fill=WHITE, line=col, line_w=Pt(1.2))
add_rect(s, x, y, Inches(6.2), Inches(0.62), fill=col)
add_text(s, title, x + Inches(0.1), y + Inches(0.06), Inches(6.0), Inches(0.54),
size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
bullet_list(s, items, x + Inches(0.15), y + Inches(0.68), Inches(5.9), Inches(1.85),
size=12, icon="•")
footer(s)
# ── 16. SURGICAL BYPASS ──────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Open Surgical Revascularisation",
subtitle="Preferred for complex lesions (TASC C/D), failed endovascular, or CLTI with long occlusions")
add_rect(s, Inches(0.4), Inches(1.55), Inches(5.9), Inches(5.5),
fill=WHITE, line=CRIMSON, line_w=Pt(1.5))
add_rect(s, Inches(0.4), Inches(1.55), Inches(5.9), Inches(0.55), fill=CRIMSON)
add_text(s, "Bypass Graft Options", Inches(0.55), Inches(1.6), Inches(5.7), Inches(0.47),
size=14, bold=True, color=WHITE)
graft_rows = [
("Aorto-Bifemoral Bypass", "Aorta → femoral arteries", "TASC D aorto-iliac", "Gold standard — 90% 5-yr patency"),
("Ilio-Femoral Bypass", "Iliac → femoral", "Unilateral iliac occlusion", "Lower morbidity than aortic surgery"),
("Femoro-Popliteal (above-K)","Femoral → popliteal (above knee)", "SFA occlusion, patent popliteal", "GSV first choice; PTFE alternative"),
("Femoro-Popliteal (below-K)","Femoral → popliteal (below knee)", "CLTI, tibial involvement", "GSV strongly preferred — better patency"),
("Femoro-Tibial/Pedal", "Femoral → tibial/peroneal arteries","Severe CLTI + tibial disease", "Technically demanding; 60–80% 5-yr limb salvage"),
]
add_rect(s, Inches(0.4), Inches(2.13), Inches(5.9), Inches(0.42), fill=RGBColor(0xDD, 0xAA, 0xAA))
for lbl, val in [("Bypass", Inches(0.55)), ("Route", Inches(1.5)), ("Indication", Inches(2.8)), ("Notes", Inches(4.3))]:
add_text(s, lbl, val, Inches(2.15), Inches(1.8), Inches(0.37), size=10, bold=True, color=DARK)
for i, (name, route, ind, note) in enumerate(graft_rows):
y = Inches(2.6 + i * 0.76)
bg = WHITE if i%2==0 else RGBColor(0xFD, 0xF0, 0xF0)
add_rect(s, Inches(0.4), y, Inches(5.9), Inches(0.72), fill=bg, line=LIGHT_LINE)
add_text(s, name, Inches(0.5), y+Inches(0.1), Inches(1.0), Inches(0.55), size=10, bold=True, color=CRIMSON, wrap=True)
add_text(s, route, Inches(1.5), y+Inches(0.1), Inches(1.3), Inches(0.55), size=10, color=DARK, wrap=True)
add_text(s, ind, Inches(2.8), y+Inches(0.1), Inches(1.5), Inches(0.55), size=10, color=DARK, wrap=True)
add_text(s, note, Inches(4.3), y+Inches(0.1), Inches(1.8), Inches(0.55), size=10, color=TEAL, italic=True, wrap=True)
add_rect(s, Inches(6.6), Inches(1.55), Inches(6.3), Inches(5.5),
fill=WHITE, line=NAVY, line_w=Pt(1.5))
add_rect(s, Inches(6.6), Inches(1.55), Inches(6.3), Inches(0.55), fill=NAVY)
add_text(s, "Conduit Choice & Perioperative Care", Inches(6.75), Inches(1.6), Inches(6.1), Inches(0.47),
size=14, bold=True, color=WHITE)
bullet_list(s, [
"Great Saphenous Vein (GSV): best conduit — 70–80% 10-yr patency",
"Reversed GSV or in-situ GSV (valve lysis) — both acceptable",
"PTFE / Dacron: used when GSV unavailable; lower patency infrainguinally",
"Anticoagulation: systemic heparin intra-op; consider warfarin post-op for tibial bypasses",
"Aspirin or aspirin + clopidogrel post-bypass (graft surveillance)",
"Duplex graft surveillance: 1, 3, 6, 12 months then annually",
"Perioperative cardiac risk: AHA-approved risk stratification, beta-blockers if appropriate",
"Endovascular hybrid procedures: increasingly used for complex multi-level disease",
],
x=Inches(6.75), y=Inches(2.2), w=Inches(6.1), available_h=Inches(4.7), size=13)
footer(s)
# ── 17. ACUTE LIMB ISCHAEMIA ─────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Acute Limb Ischaemia (ALI)",
subtitle="Vascular emergency — limb viability threatened; intervention within 6 hours of motor/sensory deficit")
# 6 P's
add_text(s, "The 6 P's of ALI", Inches(0.5), Inches(1.6), Inches(12.3), Inches(0.4),
size=15, bold=True, color=SCARLET)
p6 = [("Pain", CRIMSON), ("Pallor", SCARLET), ("Pulselessness", GOLD),
("Paraesthesia", TEAL), ("Paralysis", NAVY), ("Perishing Cold", RGBColor(0x5B, 0x0A, 0x8F))]
for i, (p, col) in enumerate(p6):
x = Inches(0.4 + i * 2.15)
add_rect(s, x, Inches(2.1), Inches(2.0), Inches(0.7), fill=col)
add_text(s, p, x, Inches(2.13), Inches(2.0), Inches(0.62),
size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Rutherford classification
add_text(s, "Rutherford Severity Classification", Inches(0.5), Inches(3.0), Inches(12.3), Inches(0.4),
size=14, bold=True, color=SCARLET)
rut = [
("Class I — Viable", "No sensory/motor loss; doppler audible", "Not immediately threatened — monitor/anticoagulate", RGBColor(0x27, 0x9D, 0x8E)),
("Class IIa — Marginal", "Minimal sensory loss (toes only); audible doppler", "Threatened — urgent revascularisation (hours)", GOLD),
("Class IIb — Immediate", "Sensory loss beyond toes; rest pain; muscle weakness", "Immediately threatened — emergency revascularisation", SCARLET),
("Class III — Irreversible","Profound motor + sensory loss; no Doppler signal", "Irreversible — amputation; reperfusion injury risk", CRIMSON),
]
for i, (cls, features, action, col) in enumerate(rut):
y = Inches(3.5 + i * 0.62)
add_rect(s, Inches(0.4), y, Inches(2.8), Inches(0.57), fill=col)
add_text(s, cls, Inches(0.45), y+Inches(0.08), Inches(2.7), Inches(0.42), size=11, bold=True, color=WHITE)
add_rect(s, Inches(3.3), y, Inches(4.6), Inches(0.57), fill=RGBColor(0xFD, 0xF0, 0xF0), line=LIGHT_LINE)
add_text(s, features, Inches(3.4), y+Inches(0.08), Inches(4.4), Inches(0.42), size=11)
add_rect(s, Inches(8.05), y, Inches(5.1), Inches(0.57), fill=RGBColor(0xF0, 0xF0, 0xFD), line=LIGHT_LINE)
add_text(s, action, Inches(8.15), y+Inches(0.08), Inches(4.9), Inches(0.42), size=11, bold=True, color=col)
bullet_list(s, [
"Causes: Embolism (cardiac source, e.g. AF — 50%) | Thrombosis in-situ on pre-existing plaque (40%) | Trauma/Iatrogenic",
"Immediate: IV heparin, urgent vascular surgery consult; CTAngiography if Class I/IIa and no motor deficit",
"Treatment options: Surgical embolectomy (Fogarty catheter) | Catheter-directed thrombolysis (CDT) | Surgical bypass",
"Reperfusion injury risk: hyperkalaemia, myoglobinuria, compartment syndrome — monitor and treat",
],
x=Inches(0.5), y=Inches(6.05), w=Inches(12.3), available_h=Inches(1.25), size=12)
footer(s)
# ── 18. FOOT CARE & WOUND MANAGEMENT IN CLTI ────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Foot Care & Wound Management in CLTI",
subtitle="Multidisciplinary approach — wound care, offloading, infection control, revascularisation")
add_rect(s, Inches(0.4), Inches(1.55), Inches(5.9), Inches(5.5),
fill=WHITE, line=SCARLET, line_w=Pt(1.5))
add_rect(s, Inches(0.4), Inches(1.55), Inches(5.9), Inches(0.55), fill=SCARLET)
add_text(s, "Wound Management Principles", Inches(0.55), Inches(1.6), Inches(5.7), Inches(0.47),
size=14, bold=True, color=WHITE)
bullet_list(s, [
"Wound debridement: remove necrotic/infected tissue (sharp, enzymatic, or larval therapy)",
"Moist wound healing: appropriate dressings (alginate, foam, silver-containing)",
"Offloading: total contact cast (TCC) — gold standard for neuropathic/ischaemic foot ulcers",
"Infection control: culture-directed antibiotics; IV if osteomyelitis suspected",
"Osteomyelitis: MRI (sensitivity 90%); prolonged antibiotics ± surgical debridement",
"Negative pressure wound therapy (NPWT/VAC): promotes granulation post-debridement",
"Hyperbaric oxygen therapy: adjunct in refractory ischaemic wounds",
],
x=Inches(0.55), y=Inches(2.2), w=Inches(5.7), available_h=Inches(4.6), size=13)
add_rect(s, Inches(6.6), Inches(1.55), Inches(6.3), Inches(5.5),
fill=WHITE, line=GOLD, line_w=Pt(1.5))
add_rect(s, Inches(6.6), Inches(1.55), Inches(6.3), Inches(0.55), fill=GOLD)
add_text(s, "Multidisciplinary Team (MDT) & Special Considerations",
Inches(6.75), Inches(1.6), Inches(6.1), Inches(0.47), size=14, bold=True, color=WHITE)
bullet_list(s, [
"MDT: Vascular surgeon + Podiatrist + Endocrinologist/Diabetologist + Infectious disease + Wound care nurse",
"Revascularisation is the priority — wound healing unlikely without adequate perfusion",
"Diabetic foot: neuropathy + ischaemia + infection — Charcot neuropathic arthropathy mimics infection",
"Amputation level determination: TBI ≥ 0.45 or transcutaneous oxygen (TcPO₂) ≥ 25 mmHg predicts healing",
"Minor amputation: digit / ray / transmetatarsal — preserves function",
"Major amputation (BKA or AKA): when revascularisation not feasible or failed; limb non-viable",
"Post-amputation: early prosthetic rehabilitation essential for function and survival",
"Palliative care: for patients who are not revascularisation candidates — pain management, QoL focus",
],
x=Inches(6.75), y=Inches(2.2), w=Inches(6.1), available_h=Inches(4.6), size=12)
footer(s)
# ── 19. SCREENING & SPECIAL POPULATIONS ─────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Screening & Special Populations",
subtitle="2024 ACC/AHA & ACC 2025 Scientific Statement (PAD in Diabetes)")
# Screening criteria
add_rect(s, Inches(0.4), Inches(1.55), Inches(5.9), Inches(3.5),
fill=WHITE, line=NAVY, line_w=Pt(1.5))
add_rect(s, Inches(0.4), Inches(1.55), Inches(5.9), Inches(0.55), fill=NAVY)
add_text(s, "ABI Screening — Who to Screen?", Inches(0.55), Inches(1.6), Inches(5.7), Inches(0.47),
size=14, bold=True, color=WHITE)
bullet_list(s, [
"Age ≥ 65 years (any person)",
"Age 50–64 with smoking history or diabetes",
"Age < 50 with diabetes + ≥1 other CV risk factor",
"Exertional leg symptoms or non-healing lower limb wound",
"Abnormal lower extremity pulses on exam",
"Family history of AAA",
"Known atherosclerosis elsewhere (CAD, stroke)",
],
x=Inches(0.55), y=Inches(2.2), w=Inches(5.7), available_h=Inches(2.7), size=13)
# PAD in Diabetes
add_rect(s, Inches(0.4), Inches(5.2), Inches(5.9), Inches(1.85),
fill=WHITE, line=TEAL, line_w=Pt(1.2))
add_rect(s, Inches(0.4), Inches(5.2), Inches(5.9), Inches(0.48), fill=TEAL)
add_text(s, "2025 ACC Statement: PAD in Diabetes", Inches(0.55), Inches(5.24), Inches(5.7), Inches(0.4),
size=13, bold=True, color=WHITE)
bullet_list(s, [
"Multidisciplinary screening starting at age 35 in T2DM patients",
"SGLT2i + GLP-1 RA strongly recommended to reduce limb events",
"Aggressive glycaemic + lipid + BP targets in diabetic PAD",
],
x=Inches(0.55), y=Inches(5.75), w=Inches(5.7), available_h=Inches(1.2), size=12)
# PAD Health Disparities
add_rect(s, Inches(6.6), Inches(1.55), Inches(6.3), Inches(5.5),
fill=WHITE, line=SCARLET, line_w=Pt(1.5))
add_rect(s, Inches(6.6), Inches(1.55), Inches(6.3), Inches(0.55), fill=SCARLET)
add_text(s, "Health Disparities & Monitoring",
Inches(6.75), Inches(1.6), Inches(6.1), Inches(0.47), size=14, bold=True, color=WHITE)
bullet_list(s, [
"Women: historically underdiagnosed — atypical symptoms, fewer revascularisation procedures, worse outcomes",
"Black/Hispanic populations: 2× higher PAD prevalence; higher amputation rates; lower revascularisation rates",
"2024 guideline: explicit focus on reducing disparities in diagnosis and treatment",
"Older adults (>75 yrs): high prevalence, polypharmacy, functional decline — individualise targets",
"CKD patients: ABI may be falsely high (calcification) → use TBI or TcPO₂",
"Follow-up ABI: annually in stable PAD; 3-monthly post-revascularisation",
"CLTI follow-up: wound assessment + duplex surveillance at 1, 3, 6 months",
"National PAD Action Plan (AHA 2024): coordinated effort to improve PAD awareness and care",
],
x=Inches(6.75), y=Inches(2.2), w=Inches(6.1), available_h=Inches(4.6), size=13)
footer(s)
# ── 20. MONITORING & FOLLOW-UP ───────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Post-Intervention Monitoring & Follow-Up",
subtitle="Graft surveillance, ABI, medical optimisation, GDMT compliance")
cols3 = [
("After Endovascular Procedure", [
"Duplex ultrasound at 1, 6, 12 months, then annually",
"ABI at each visit to detect restenosis",
"Aspirin + clopidogrel (1 month post-stent); then SAPT or rivaroxaban + ASA",
"Wound assessment in CLTI patients",
"Reassess GDMT at every visit",
"WIfI restaging: 4–6 weeks post-intervention",
], TEAL),
("After Surgical Bypass", [
"Duplex graft surveillance: 1, 3, 6, 12 months, then annual",
"ABI at each visit",
"Antiplatelet therapy mandatory (aspirin); warfarin for tibial bypasses",
"Wound and limb inspection at every follow-up",
"Diabetes / glycaemia optimisation — accelerates wound healing",
"Rehab: walking programme post-claudication bypass",
], CRIMSON),
("Long-Term Stable PAD", [
"Annual ABI",
"CV risk factor review: lipids, BP, HbA1c, smoking status",
"Foot inspection every visit (esp. diabetic patients)",
"Supervised exercise programme maintenance",
"Medication adherence: statin, antiplatelet/rivaroxaban",
"Screen for CV events (MI, stroke): ECG, echo if symptoms",
], NAVY),
]
for i, (title, items, col) in enumerate(cols3):
x = Inches(0.3 + i * 4.35)
add_rect(s, x, Inches(1.55), Inches(4.1), Inches(0.6), fill=col)
add_text(s, title, x, Inches(1.57), Inches(4.1), Inches(0.56),
size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, x, Inches(2.18), Inches(4.1), Inches(4.9),
fill=WHITE, line=col, line_w=Pt(1))
bullet_list(s, items, x + Inches(0.15), Inches(2.26), Inches(3.85), Inches(4.7), size=13)
footer(s)
# ── 21. PROGNOSIS & NATURAL HISTORY ─────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Prognosis & Natural History of PAD",
subtitle="PAD = systemic atherosclerosis marker; CV mortality dominates over limb loss")
for i, (stat, label, bg) in enumerate([
("20%", "5-year nonfatal MI / stroke rate in claudication", CRIMSON),
("30%", "10-year mortality in PAD patients (mostly CV)", SCARLET),
("1–2%", "Annual rate of claudication → CLTI progression", GOLD),
("~25%", "CLTI 1-year amputation rate without revascularisation", TEAL),
]):
x = Inches(0.35 + i * 3.25)
add_rect(s, x, Inches(1.65), Inches(3.0), Inches(1.8), fill=bg)
add_text(s, stat, x, Inches(1.68), Inches(3.0), Inches(0.9),
size=40, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, label, x + Inches(0.1), Inches(2.55), Inches(2.8), Inches(0.72),
size=12, color=WHITE, align=PP_ALIGN.CENTER, wrap=True)
bullet_list(s, [
"Most patients with claudication: stable symptoms over 5 years; only 1–2% annual progression to critical ischaemia",
"Main risk to life is cardiovascular — PAD patients have 3–5× higher CV mortality than age-matched controls",
"CLTI: 1-year outcomes: 25% major amputation, 25% death, 50% alive with limb salvage",
"Polyvascular disease (PAD + CAD + cerebrovascular): worst prognosis; aggressive secondary prevention essential",
"Prognostic tools: ABI < 0.40, Fontaine stage III/IV, WIfI grade 4 — identify highest-risk patients",
"Revascularisation + GDMT: significantly improves outcomes in CLTI (80–90% limb salvage in experienced centres)",
"Smoking cessation: single most impactful intervention — halves amputation risk",
],
x=Inches(0.5), y=Inches(3.65), w=Inches(12.3), available_h=Inches(3.1), size=14)
footer(s)
# ── 22. SUMMARY — TAKE-HOME MESSAGES ────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "Take-Home Messages",
subtitle="PAD — Lower Extremity Peripheral Arterial Disease")
messages = [
("1", "PAD = Systemic Disease",
"ABI < 0.9 confirms PAD; 25–30% have concomitant CAD/cerebrovascular disease — treat the whole patient"),
("2", "ABI + WIfI — Your Core Tools",
"ABI for diagnosis/screening; WIfI for CLTI severity — guides amputation risk and revascularisation benefit"),
("3", "GDMT Is Non-Negotiable",
"High-intensity statin + SAPT (or rivaroxaban 2.5 mg + aspirin) + BP control + smoking cessation in ALL PAD patients"),
("4", "Rivaroxaban 2.5 mg + ASA — Class I",
"COMPASS and VOYAGER trials: reduces MACE and MALE; first appearance in 2024 guideline — prescribe in eligible PAD patients"),
("5", "Supervised Exercise First in Claudication",
"≥ 36 sessions of supervised exercise before considering revascularisation; cilostazol adjunct if exercise alone insufficient"),
("6", "CLTI = Limb Emergency",
"Rest pain / tissue loss (WIfI ≥ grade 2) requires urgent revascularisation; MDT wound care and WIfI restaging mandatory"),
("7", "ALI = Vascular Emergency",
"6 P's; Rutherford class IIb/III → surgery/CDT within hours; heparin immediately; compartment syndrome post-reperfusion"),
]
for i, (num, title, detail) in enumerate(messages):
y = Inches(1.6 + i * 0.78)
add_rect(s, Inches(0.4), y, Inches(0.55), Inches(0.65), fill=SCARLET)
add_text(s, num, Inches(0.4), y + Inches(0.05), Inches(0.55), Inches(0.55),
size=20, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, title, Inches(1.1), y + Inches(0.05), Inches(3.1), Inches(0.55),
size=13, bold=True, color=CRIMSON)
add_text(s, detail, Inches(4.3), y + Inches(0.06), Inches(8.6), Inches(0.55),
size=12, color=DARK, wrap=True)
add_rect(s, Inches(0.4), y + Inches(0.66), Inches(12.5), Inches(0.02),
fill=LIGHT_LINE)
footer(s, "2024 ACC/AHA LE-PAD Guideline | Braunwald's Heart Disease | Mulholland & Greenfield Surgery 7e | Postgraduate IM")
# ── 23. REFERENCES ──────────────────────────────────────────────────────────
s = prs.slides.add_slide(blank)
header_bar(s, "References & Further Reading")
refs = [
"Gornik HL et al. 2024 ACC/AHA/Multisociety Guideline for the Management of Lower Extremity Peripheral Artery Disease. Circulation. 2024;149:e1313–e1410. PMID: 38743805",
"Das S, Bonaca M, Creager M et al. Management of Peripheral Artery Disease in Adults With Diabetes: 2025 ACC Scientific Statement. JACC. 2025. doi:10.1016/j.jacc.2025.11.027",
"Eikelboom JW et al. Rivaroxaban with or without Aspirin in Stable Cardiovascular Disease (COMPASS). N Engl J Med 2017;377:1319-1330.",
"Bonaca MP et al. Rivaroxaban in Peripheral Artery Disease after Revascularization (VOYAGER). N Engl J Med 2020;382:1994-2004.",
"Fuster V et al. Braunwald's Heart Disease, 12th Edition. Elsevier. Chapter 44: Peripheral Arterial Disease.",
"Mulholland MW et al. Mulholland and Greenfield's Surgery, 7th Edition. Chapter 108: Infrainguinal Arterial Occlusive Disease.",
"Katzung BG. Basic and Clinical Pharmacology, 16th Edition. Treatment of Peripheral Artery Disease & Intermittent Claudication.",
"Mills JL et al. The Society for Vascular Surgery Lower Extremity Threatened Limb Classification System: Risk stratification based on Wound, Ischemia, and foot Infection (WIfI). J Vasc Surg 2014;59:220-234.",
"Norgren L et al. Inter-Society Consensus for the Management of PAD (TASC II). J Vasc Surg 2007;45(Suppl S):S5–S67.",
"Hiatt WR et al. Ticagrelor versus Clopidogrel in PAD (EUCLID). N Engl J Med 2017;376:32-40.",
]
bullet_list(s, refs, Inches(0.6), Inches(1.6), Inches(12.1), Inches(5.6), size=11.5, icon="•")
footer(s, "2024 ACC/AHA LE-PAD Guideline | Braunwald's Heart Disease | Mulholland & Greenfield Surgery 7e | Postgraduate IM")
# ── SAVE ────────────────────────────────────────────────────────────────────
out = "/tmp/workspace/pad-pptx/PAD_Peripheral_Arterial_Disease.pptx"
buf = BytesIO()
prs.save(buf)
with open(out, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out} ({len(prs.slides)} slides)")
cd /tmp/workspace/pad-pptx && python build_pad.py 2>&1
PAD Peripheral Arterial Disease
Presentation · PPTX
| # | Slide |
|---|---|
| 1 | Title slide |
| 2 | Learning objectives |
| 3 | Definition & Epidemiology (global burden stats) |
| 4 | Pathophysiology — atherosclerosis cascade + risk factor table with relative risks |
| 5 | 2024 ACC/AHA Clinical Subsets — Asymptomatic / Claudication / CLTI / ALI |
| 6 | Ankle-Brachial Index (ABI) — technique + full interpretation table (ABI 0–>1.4) |
| 7 | Non-invasive imaging — Duplex, CTA, MRA, Invasive Angiography |
| 8 | WIfI Classification — Wound + Ischaemia + foot Infection grading (0–3 each) |
| 9 | GDMT Overview — 6 pillars (smoking, lipids, antithrombotic, BP, glycaemia, exercise) |
| 10 | Lipid Management — Statins, ezetimibe, PCSK9 inhibitors + LDL targets |
| 11 | Antiplatelet & Antithrombotic Therapy — COMPASS & VOYAGER trial summaries |
| 12 | New drugs 2024 — SGLT2 inhibitors, GLP-1 RAs, antihypertensives |
| 13 | Claudication management — Supervised Exercise Therapy (SET) + cilostazol/pharmacotherapy |
| 14 | Revascularisation indications + TASC classification decision framework |
| 15 | Endovascular interventions — PTA, DCB, stents, atherectomy, CDT |
| 16 | Open surgical bypass — graft options, conduit choice, patency data |
| 17 | Acute Limb Ischaemia — 6 P's + Rutherford classification + management |
| 18 | Foot care & wound management in CLTI — MDT, offloading, infection, amputation levels |
| 19 | Screening criteria + Special populations (diabetes, women, CKD, elderly, disparities) |
| 20 | Post-intervention monitoring & follow-up |
| 21 | Prognosis & natural history (outcome statistics) |
| 22 | Take-home messages (7 key clinical principles) |
| 23 | References (10 key papers including COMPASS, VOYAGER, EUCLID, TASC II, WIfI) |