Pulmonary embolism
Overview and new guidelines
"pulmonary embolism"[MeSH Terms] AND "guideline"[pt]
pulmonary embolism new guidelines 2024 2025 ESC AHA management
pulmonary embolism CT angiography saddle embolus diagram

This diagnostic axial CT angiography (CTA) scan of the chest reveals a classic saddle pulmonary embolism. The primary visual finding is a large, low-attenuation filling defect centrally located at the bifurcation of the main pulmonary artery. This thrombus straddles the carina and extends into both the right and left pulmonary arteries. Two red arrows indicate the specific sites where the hypodense embolus obstructs the contrast-enhanced pulmonary vasculature. The surrounding mediastinal structures, including the ascending aorta and the superior vena cava, are visible and show normal contrast enhancement. This imaging modality is the gold standard for diagnosing acute pulmonary embolism, and the 'saddle' configuration demonstrated here indicates a massive or submassive embolic event with high clinical significance for hemodynamic instability.

This diagnostic image is an axial cut from a CT Pulmonary Angiography (CTPA) demonstrating extensive pulmonary embolism. The primary visual finding is a large, low-attenuation filling defect appearing as a 'saddle embolus' at the bifurcation of the main pulmonary artery, extending into both the right and left main pulmonary arteries (indicated by red arrows). The central filling defects are characterized by absent or significantly reduced contrast enhancement within the vessel lumens, which are otherwise surrounded by hyperdense contrast material. Additional thromboembolic material is visible in the lobar and segmental branches bilaterally. The main pulmonary artery shows evidence of distension secondary to the large obstructive clot burden. This image serves as a classic clinical example of acute, high-burden pulmonary embolism in a patient with risk factors such as prolonged immobility, illustrating the critical role of CTPA in diagnosing life-threatening vascular obstructions.

**Imaging Modality:** Contrast-enhanced Computed Tomography (CT) of the chest, specifically a CT Pulmonary Angiography (CTPA) protocol. **Anatomical Region:** Axial section of the thorax at the level of the pulmonary artery bifurcation. **Observed Pathology:** Large, bilateral pulmonary embolism. A prominent "saddle" embolus is visible, characterized by low-attenuation (hypodense) filling defects within the lumen of the main pulmonary artery, extending into both the right and left main pulmonary arteries. **Characteristic Visual Features:** * **Filling Defects:** Central non-opacified areas surrounded by radiopaque contrast media, creating the classic "Polo Mint" sign in cross-section or "railway track" sign in longitudinal views. * **Vascular Anatomy:** The pulmonary trunk appears dilated. * **Surrounding Structures:** The ascending and descending aorta, superior vena cava, and vertebral body are visible and unremarkable in this single slice. Metal streak artifacts are present anteriorly from sternal wires, suggesting prior cardiac surgery. **Key Diagnostic Features:** The presence of a large, centrally located thrombus straddling the bifurcation of the pulmonary trunk (saddle embolus) is the pathognomonic finding for acute major pulmonary embolism.

This diagnostic image is an axial contrast-enhanced CT Pulmonary Angiography (CTPA) of the chest. It demonstrates significant bilateral acute pulmonary emboli within the pulmonary arterial tree. Key findings include prominent, low-attenuation filling defects (darker regions) contrasted against the bright, opacified blood in the pulmonary arteries. Specifically, white arrows highlight large clots obstructing the main right and left pulmonary arteries, consistent with a saddle embolus configuration. Smaller peripheral filling defects are also visible in the branching segments of the arterial tree. Other visible thoracic structures include the ascending and descending aorta, the heart, and the superior vena cava, which show normal contrast enhancement. The image serves as a clinical illustration of massive pulmonary embolism causing significant vascular obstruction, often associated with hemodynamic instability and right ventricular strain in an acute clinical setting.
https://www.ecccp.org/infographic-aha-acc-2026-guidelines-ac…
PMID: 41712677
https://www.ecccp.org/infographic-aha-acc-2026-guidelines-ac…
| Symptom | Prevalence |
|---|---|
| Dyspnea | 75-80% |
| Chest pain (pleuritic or non-specific) | ~50-65% |
| Cough | ~25% |
| Hemoptysis | ~10-15% |
| Syncope | <5% of syncopal presentations |
| Unilateral leg swelling | <30%, but specific when present |
| Criterion | Points |
|---|---|
| Clinical signs of DVT | 3 |
| PE most likely diagnosis | 3 |
| Heart rate >100 | 1.5 |
| Immobilization >3 days or surgery in 4 weeks | 1.5 |
| Prior DVT/PE | 1.5 |
| Hemoptysis | 1 |
| Malignancy | 1 |

The 2026 AHA/ACC/ACCP/ACEP/CHEST/SCAI/SHM/SIR/SVM/SVN Guideline (Circulation. 2026;153:e977-e1051, PMID 41712677) is the first dedicated, de novo joint PE guideline from the AHA/ACC - replacing decades of fragmented society statements. It introduces several major changes.
| Category | Description | Key Feature | Recommended Setting |
|---|---|---|---|
| A | Asymptomatic PE | Incidentally detected (e.g., cancer staging) | ED discharge to outpatient |
| B | Symptomatic, low severity | sPESI = 0, PESI class I-II, no RV dysfunction | Early discharge + outpatient anticoagulation |
| C | Elevated clinical severity ± RV involvement | sPESI ≥ 1, RV changes on imaging/echo, elevated troponin | Hospitalization, standard anticoagulation |
| D1/D2 | Hemodynamically compromised - submassive/intermediate-high | RV dysfunction + biomarker elevation, SBP trend declining | ICU or monitored bed, consider advanced therapy |
| E1 | Hemodynamically unstable - massive | SBP <90 mmHg, shock, cardiac arrest | Critical care, urgent reperfusion |
| Population | Recommended Agent |
|---|---|
| Pregnancy | LMWH or UFH (DOACs are Class 3 - Harm) |
| Antiphospholipid Syndrome | VKA (warfarin) preferred over DOACs (inferior outcomes with DOACs) |
| Severe CKD (stages 4-5) / ESRD on HD | VKA (apixaban vs VKA uncertain - Class 2b) |
| Population | Key Recommendation |
|---|---|
| Pregnancy | LMWH/UFH; avoid DOACs and warfarin |
| APS | VKA preferred (Class I, LOE A) |
| Cancer-associated PE | LMWH or DOACs (apixaban/rivaroxaban preferred) |
| Severe CKD/ESRD | VKA; DOAC selection uncertain in advanced CKD |
| Feature | ESC 2019 | AHA/ACC 2026 |
|---|---|---|
| Risk classification | Low/Intermediate/High | 5 categories (A-E) |
| PERT | No formal recommendation | Class I |
| DOACs | Preferred | Preferred (more explicit) |
| MT | Emerging | Class 2a (Cat E1), 2b (Cat D), Class 3 (Cat A-C) |
| Asymptomatic PE | No dedicated guidance | Category A - ED discharge |
| Follow-up | Mentioned | Formally structured |
Note: An erratum to the 2026 guideline was published (PMID 42441758) - check for minor corrections if referencing specific recommendation text.
Can you make slides of this information for presentation
mkdir -p /tmp/workspace/pe-presentation && ls /tmp/workspace/pe-presentation/
~/pe-presentation/build_pe_slides.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
import json, subprocess, base64
from io import BytesIO
# ── Colour palette (deep medical theme) ──────────────────────────────────────
NAVY = RGBColor(0x0D, 0x2B, 0x55) # dark navy
TEAL = RGBColor(0x00, 0x7A, 0x8A) # teal accent
LIGHT_BG = RGBColor(0xF0, 0xF6, 0xFA) # near-white blue tint
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_TEXT = RGBColor(0x1A, 0x1A, 0x2E)
MID_GREY = RGBColor(0x55, 0x65, 0x75)
RED_ALERT = RGBColor(0xC0, 0x39, 0x2B)
AMBER = RGBColor(0xE6, 0x7E, 0x22)
GREEN_OK = RGBColor(0x1E, 0x8B, 0x4C)
GOLD = RGBColor(0xF3, 0xC6, 0x22)
LIGHT_TEAL= RGBColor(0xE0, 0xF4, 0xF7)
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
blank = prs.slide_layouts[6] # fully blank
# ─── Helpers ──────────────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill=NAVY, line_color=None, line_width=0):
shp = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, y, w, h)
shp.fill.solid(); shp.fill.fore_color.rgb = fill
if line_color:
shp.line.color.rgb = line_color
shp.line.width = Pt(line_width)
else:
shp.line.fill.background()
shp.shadow.inherit = False
return shp
def add_text(slide, text, x, y, w, h, size=18, bold=False, color=WHITE,
align=PP_ALIGN.LEFT, italic=False, wrap=True, anchor=MSO_ANCHOR.TOP,
font="Calibri"):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = anchor
tf.margin_left = 0; tf.margin_right = 0
tf.margin_top = 0; tf.margin_bottom = 0
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.name = font
r.font.size = Pt(size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
return tf
def add_bullet_box(slide, items, x, y, w, h, size=15, color=DARK_TEXT,
bullet_color=TEAL, indent=False, font="Calibri"):
"""items: list of str. Each gets a coloured bullet dot prefix."""
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.05)
tf.margin_bottom= Inches(0.05)
first = True
for item in items:
p = tf.paragraphs[0] if first else tf.add_paragraph()
first = False
p.space_before = Pt(3)
# bullet dot
r1 = p.add_run(); r1.text = " " if indent else ""
r2 = p.add_run(); r2.text = "\u25CF "
r2.font.color.rgb = bullet_color
r2.font.size = Pt(size - 3)
r2.font.name = font
r3 = p.add_run(); r3.text = item
r3.font.color.rgb = color
r3.font.size = Pt(size)
r3.font.name = font
return tf
def header_bar(slide, title, subtitle=None):
"""Dark navy header spanning full width."""
add_rect(slide, 0, 0, W, Inches(1.15), fill=NAVY)
add_rect(slide, 0, Inches(1.15), W, Inches(0.06), fill=TEAL)
add_text(slide, title, Inches(0.4), Inches(0.1), Inches(10), Inches(0.9),
size=30, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
if subtitle:
add_text(slide, subtitle, Inches(0.4), Inches(0.1), Inches(12.5), Inches(1.0),
size=13, bold=False, color=GOLD, align=PP_ALIGN.RIGHT, anchor=MSO_ANCHOR.MIDDLE)
def footer(slide, text="Pulmonary Embolism | 2026 AHA/ACC Guidelines"):
add_rect(slide, 0, Inches(7.18), W, Inches(0.32), fill=NAVY)
add_text(slide, text, Inches(0.3), Inches(7.19), Inches(12), Inches(0.28),
size=9, color=RGBColor(0xBB, 0xCC, 0xDD), anchor=MSO_ANCHOR.MIDDLE)
def section_label(slide, label, x, y, w=Inches(3.5), color=TEAL):
add_rect(slide, x, y, w, Inches(0.34), fill=color)
add_text(slide, label, x + Inches(0.12), y + Inches(0.02), w - Inches(0.2), Inches(0.3),
size=12, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
def colored_card(slide, title, items, x, y, w, h, hdr_color=TEAL, txt_size=13):
add_rect(slide, x, y, w, Inches(0.38), fill=hdr_color)
add_text(slide, title, x+Inches(0.1), y+Inches(0.04), w-Inches(0.2), Inches(0.3),
size=13, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, x, y+Inches(0.38), w, h-Inches(0.38), fill=LIGHT_BG,
line_color=hdr_color, line_width=1)
add_bullet_box(slide, items, x+Inches(0.15), y+Inches(0.42),
w-Inches(0.25), h-Inches(0.52), size=txt_size, color=DARK_TEXT)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 – TITLE
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=NAVY)
# decorative teal bar left
add_rect(sl, 0, 0, Inches(0.18), H, fill=TEAL)
add_rect(sl, Inches(0.18), 0, Inches(0.06), H, fill=GOLD)
# central panel
add_rect(sl, Inches(1.0), Inches(1.8), Inches(11.3), Inches(4.0),
fill=RGBColor(0x06, 0x1A, 0x40))
add_text(sl, "PULMONARY EMBOLISM",
Inches(1.3), Inches(2.0), Inches(10.8), Inches(1.3),
size=52, bold=True, color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_text(sl, "Overview, Pathophysiology & 2026 AHA/ACC Guidelines",
Inches(1.3), Inches(3.3), Inches(10.8), Inches(0.7),
size=22, bold=False, color=GOLD, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_text(sl, "Based on 2026 AHA/ACC/ACCP/ACEP/CHEST/SCAI/SHM/SIR/SVM/SVN Guideline | Circulation. 2026;153:e977-e1051",
Inches(1.0), Inches(4.2), Inches(11.3), Inches(0.5),
size=11, color=RGBColor(0xAA, 0xBB, 0xCC), align=PP_ALIGN.CENTER)
add_text(sl, "July 2026",
Inches(1.0), Inches(6.8), Inches(11.3), Inches(0.4),
size=13, color=MID_GREY, align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 – WHAT IS PE?
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "What is Pulmonary Embolism?", "Overview")
footer(sl)
# definition box
add_rect(sl, Inches(0.3), Inches(1.35), Inches(12.7), Inches(1.05), fill=TEAL)
add_text(sl, "Pulmonary embolism (PE) is an acute obstruction of the pulmonary arterial tree, "
"most commonly caused by a thrombus originating from deep veins of the legs or pelvis "
"that embolizes to the lungs.",
Inches(0.5), Inches(1.4), Inches(12.3), Inches(0.95),
size=16, bold=False, color=WHITE, wrap=True, anchor=MSO_ANCHOR.MIDDLE)
# 3 cards row
cards = [
("Epidemiology", ["3rd most common acute cardiovascular syndrome",
"Leading cause of preventable in-hospital death",
"~25% of sudden cardiac deaths attributed to PE",
"VTE incidence: ~1-2 per 1,000 person-years"]),
("Common Sources", ["Deep vein thrombosis (DVT) – lower limbs/pelvis (most common)",
"Upper limb DVT (central venous catheters)",
"Fat emboli (long bone fractures)",
"Air emboli, amniotic fluid (rare)"]),
("Virchow's Triad", ["Hypercoagulability: malignancy, thrombophilia, OCP, pregnancy",
"Venous stasis: immobility, long travel, heart failure",
"Endothelial injury: surgery, trauma, IV catheters"]),
]
for i, (title, items) in enumerate(cards):
colored_card(sl, title, items, Inches(0.3 + i*4.35), Inches(2.55), Inches(4.15), Inches(4.3))
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 – PATHOPHYSIOLOGY
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "Pathophysiology", "Haemodynamic Consequences")
footer(sl)
steps = [
("1", "Thrombus embolises to pulmonary artery", TEAL),
("2", "Mechanical obstruction → ↑ pulmonary vascular resistance", TEAL),
("3", "RV pressure overload → RV dilation & dysfunction", AMBER),
("4", "Interventricular septum shifts left → ↓ LV filling", AMBER),
("5", "V/Q mismatch → hypoxia, ↑ dead space", AMBER),
("6", "↓ Cardiac output → haemodynamic collapse (massive PE)", RED_ALERT),
]
box_w = Inches(3.9)
box_h = Inches(0.7)
start_y = Inches(1.4)
x_left = Inches(0.35)
x_right = Inches(6.9)
for i, (num, text, col) in enumerate(steps):
row = i % 3
col_x = x_left if i < 3 else x_right
y = start_y + row * Inches(1.7)
add_rect(sl, col_x, y, box_w, box_h, fill=col)
add_text(sl, num, col_x + Inches(0.08), y, Inches(0.5), box_h,
size=24, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_text(sl, text, col_x + Inches(0.55), y + Inches(0.05), Inches(3.3), box_h - Inches(0.1),
size=13, bold=False, color=WHITE, wrap=True, anchor=MSO_ANCHOR.MIDDLE)
# arrow (except last in each column)
if row < 2:
add_rect(sl, col_x + Inches(1.8), y + box_h, Inches(0.3), Inches(1.0), fill=col)
# consequence box
add_rect(sl, Inches(0.35), Inches(6.4), Inches(12.6), Inches(0.55), fill=RGBColor(0x1A, 0x1A, 0x2E))
add_text(sl, "In extreme cases, PE can obstruct the entire RV outflow tract → sudden cardiac arrest | "
"Shock index >1 (HR > SBP) is an ominous sign of impending collapse",
Inches(0.55), Inches(6.42), Inches(12.2), Inches(0.5),
size=12, color=GOLD, anchor=MSO_ANCHOR.MIDDLE, wrap=True)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 – CLINICAL FEATURES
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "Clinical Features", "Symptoms & Signs")
footer(sl)
# Symptoms table
sym_data = [
("Dyspnoea", "75 – 80%", "Most common; may be subtle or exertional only"),
("Chest pain (pleuritic/non-specific)", "50 – 65%", "Pleuritic pain suggests peripheral PE with infarction"),
("Cough", "~25%", "Usually dry"),
("Haemoptysis", "10 – 15%", "Small volume; frank haemoptysis suggests infarction"),
("Syncope", "<5%", "Suggests massive PE; haemodynamic compromise"),
("Unilateral leg swelling", "<30%", "Relatively specific when present with dyspnoea"),
]
col_widths = [Inches(3.3), Inches(1.4), Inches(7.5)]
hdr_colors = [NAVY, NAVY, NAVY]
row_h = Inches(0.47)
start_y = Inches(1.35)
# header row
xs = [Inches(0.3), Inches(3.65), Inches(5.1)]
headers = ["Symptom", "Prevalence", "Clinical Note"]
for j, (hd, cw, x) in enumerate(zip(headers, col_widths, xs)):
add_rect(sl, x, start_y, cw, row_h, fill=NAVY)
add_text(sl, hd, x+Inches(0.1), start_y+Inches(0.05), cw-Inches(0.15), row_h-Inches(0.1),
size=13, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
for r, (sym, prev, note) in enumerate(sym_data):
y = start_y + row_h * (r + 1)
bg = LIGHT_BG if r % 2 == 0 else WHITE
data = [sym, prev, note]
for j, (val, cw, x) in enumerate(zip(data, col_widths, xs)):
add_rect(sl, x, y, cw, row_h, fill=bg, line_color=MID_GREY, line_width=0.5)
add_text(sl, val, x+Inches(0.1), y+Inches(0.04), cw-Inches(0.15), row_h-Inches(0.08),
size=12, color=DARK_TEXT, anchor=MSO_ANCHOR.MIDDLE)
# Signs box
add_rect(sl, Inches(0.3), Inches(5.05), Inches(12.6), Inches(0.32), fill=TEAL)
add_text(sl, "KEY SIGNS", Inches(0.5), Inches(5.06), Inches(2.0), Inches(0.28),
size=12, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_text(sl, "Tachycardia (most common sign) | Tachypnoea | Hypoxia | Hypotension (massive PE) | "
"Raised JVP | RV heave | Loud P2 | Pleural rub",
Inches(2.6), Inches(5.07), Inches(10.0), Inches(0.27),
size=11, color=WHITE, anchor=MSO_ANCHOR.MIDDLE, wrap=True)
# warning note
add_rect(sl, Inches(0.3), Inches(5.5), Inches(12.6), Inches(0.55), fill=RGBColor(0xFE, 0xF9, 0xE7))
add_rect(sl, Inches(0.3), Inches(5.5), Inches(0.08), Inches(0.55), fill=AMBER)
add_text(sl, "No single symptom rules PE in or out. Dyspnoea is absent in ~25% of confirmed cases. "
"Symptoms must always be interpreted in the full clinical context.",
Inches(0.5), Inches(5.52), Inches(12.2), Inches(0.5),
size=12, color=DARK_TEXT, italic=True, anchor=MSO_ANCHOR.MIDDLE, wrap=True)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 – DIAGNOSIS
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "Diagnosis", "Pre-test Probability → Biomarkers → Imaging")
footer(sl)
# Step 1 – PTP
section_label(sl, "STEP 1 – Pre-test Probability (PTP)", Inches(0.3), Inches(1.35), Inches(5.5))
wells = ["Clinical signs of DVT +3", "PE most likely diagnosis +3",
"Heart rate >100 +1.5", "Immobilisation >3 d or surgery in 4 wks +1.5",
"Prior DVT/PE +1.5", "Haemoptysis +1", "Malignancy +1",
"Score <2 = Low | 2-6 = Moderate | >6 = High"]
add_bullet_box(sl, wells, Inches(0.35), Inches(1.75), Inches(5.4), Inches(2.45),
size=12, color=DARK_TEXT, bullet_color=TEAL)
# PERC Rule
section_label(sl, "PERC Rule (if Low PTP)", Inches(0.3), Inches(4.3), Inches(4.0), color=NAVY)
perc = ["Age <50 | HR <100 | SaO₂ >94%",
"No leg swelling | No haemoptysis",
"No recent trauma/surgery | No prior PE/DVT | No hormone use",
"ALL 8 absent → PE excluded (no further testing)"]
add_bullet_box(sl, perc, Inches(0.35), Inches(4.7), Inches(5.4), Inches(2.2),
size=12, color=DARK_TEXT, bullet_color=NAVY)
# Step 2 – D-dimer
section_label(sl, "STEP 2 – D-Dimer", Inches(5.9), Inches(1.35), Inches(3.2))
ddimer = ["Sensitivity 95-98%, Specificity 40-55%",
"Negative rules out PE in non-high PTP",
"Age-adjusted cutoff: Age × 10 ng/mL",
"YEARS algorithm: 0 criteria → cutoff 1000 ng/mL",
"Not reliable in pregnancy (physiologically elevated)"]
add_bullet_box(sl, ddimer, Inches(5.95), Inches(1.75), Inches(3.5), Inches(2.45),
size=12, color=DARK_TEXT, bullet_color=TEAL)
# Step 3 – Imaging
section_label(sl, "STEP 3 – Imaging", Inches(5.9), Inches(4.3), Inches(3.0))
imaging = ["CTPA – gold standard; shows filling defects",
"V/Q scan – if CTPA contraindicated (renal failure, allergy, pregnancy)",
"Echo – detects RV dysfunction; not diagnostic alone",
"Lower limb USS – confirms DVT, supports indirect diagnosis"]
add_bullet_box(sl, imaging, Inches(5.95), Inches(4.7), Inches(3.5), Inches(2.2),
size=12, color=DARK_TEXT, bullet_color=TEAL)
# Biomarkers box
add_rect(sl, Inches(9.55), Inches(1.35), Inches(3.45), Inches(5.6), fill=NAVY)
add_text(sl, "BIOMARKERS", Inches(9.65), Inches(1.42), Inches(3.25), Inches(0.38),
size=13, bold=True, color=GOLD, anchor=MSO_ANCHOR.MIDDLE)
bio_items = [
("Troponin I/T", "RV myocardial injury → intermediate-high risk"),
("BNP / NT-proBNP", "RV pressure overload"),
("Lactate", "Elevated in cardiogenic/distributive shock"),
("D-dimer", "Rule-out tool (not confirmatory)"),
("ABG", "Hypoxia, hypocapnia, respiratory alkalosis"),
]
y_offset = Inches(1.9)
for marker, desc in bio_items:
add_rect(sl, Inches(9.65), y_offset, Inches(3.1), Inches(0.28), fill=TEAL)
add_text(sl, marker, Inches(9.72), y_offset+Inches(0.03), Inches(3.0), Inches(0.23),
size=11, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_text(sl, desc, Inches(9.72), y_offset+Inches(0.3), Inches(3.1), Inches(0.45),
size=11, color=RGBColor(0xCC, 0xDD, 0xEE), wrap=True)
y_offset += Inches(0.82)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 – 2026 GUIDELINE: NEW CLASSIFICATION
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "2026 AHA/ACC Guideline", "New Five-Tier Clinical Category System (A–E)")
footer(sl)
add_rect(sl, Inches(0.3), Inches(1.32), Inches(12.7), Inches(0.42),
fill=RGBColor(0x06, 0x1A, 0x40))
add_text(sl,
"The first dedicated AHA/ACC PE guideline replaces low/intermediate/high-risk with a "
"five-category physiopathological framework. Circulation. 2026;153:e977-e1051 (PMID 41712677)",
Inches(0.5), Inches(1.33), Inches(12.3), Inches(0.38),
size=11, color=GOLD, anchor=MSO_ANCHOR.MIDDLE, wrap=True)
cat_data = [
("A", "Asymptomatic PE", "Incidentally detected (e.g. cancer staging)",
"ED discharge – no hospitalisation required", GREEN_OK),
("B", "Symptomatic\nLow Severity", "sPESI = 0 | PESI class I-II | No RV dysfunction",
"Early discharge + outpatient anticoagulation", GREEN_OK),
("C", "Elevated Severity\n±RV Involvement", "sPESI ≥1 | RV changes | ↑Troponin/BNP",
"Hospitalisation | Standard anticoagulation", AMBER),
("D1/D2", "Haemodynamically\nCompromised", "RV dysfunction + biomarkers | Declining SBP",
"ICU/monitored bed | Consider advanced therapy", RED_ALERT),
("E1", "Haemodynamically\nUnstable (Massive)", "SBP <90 | Shock | Cardiac arrest",
"Critical care | Urgent reperfusion", RGBColor(0x8B, 0x00, 0x00)),
]
box_w = Inches(2.42)
box_y_top = Inches(1.88)
for i, (cat, name, criteria, mgmt, col) in enumerate(cat_data):
x = Inches(0.28 + i * 2.55)
# category letter header
add_rect(sl, x, box_y_top, box_w, Inches(0.55), fill=col)
add_text(sl, f"Cat. {cat}", x, box_y_top, box_w, Inches(0.55),
size=20, bold=True, color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
# name
add_rect(sl, x, box_y_top+Inches(0.55), box_w, Inches(0.65), fill=RGBColor(0x1A, 0x1A, 0x2E))
add_text(sl, name, x+Inches(0.07), box_y_top+Inches(0.57), box_w-Inches(0.1), Inches(0.62),
size=12, bold=True, color=WHITE, wrap=True, anchor=MSO_ANCHOR.MIDDLE)
# criteria
add_rect(sl, x, box_y_top+Inches(1.2), box_w, Inches(1.7), fill=LIGHT_BG,
line_color=col, line_width=1.5)
add_text(sl, "Criteria:", x+Inches(0.1), box_y_top+Inches(1.25), box_w-Inches(0.15), Inches(0.28),
size=10, bold=True, color=col)
add_text(sl, criteria, x+Inches(0.1), box_y_top+Inches(1.52), box_w-Inches(0.15), Inches(1.3),
size=11, color=DARK_TEXT, wrap=True)
# management
add_rect(sl, x, box_y_top+Inches(2.9), box_w, Inches(1.5), fill=col,
line_color=col, line_width=1)
add_text(sl, "Management:", x+Inches(0.1), box_y_top+Inches(2.95), box_w-Inches(0.15), Inches(0.3),
size=10, bold=True, color=WHITE)
add_text(sl, mgmt, x+Inches(0.1), box_y_top+Inches(3.25), box_w-Inches(0.15), Inches(1.1),
size=11, color=WHITE, wrap=True)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 – 2026 GUIDELINE: KEY RECOMMENDATIONS
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "2026 AHA/ACC Guideline", "Key Recommendations")
footer(sl)
recs = [
("PERT – Class I", TEAL,
["Multidisciplinary Pulmonary Embolism Response Teams (PERTs) now Class I",
"Teams: cardiologist, pulmonologist, EM physician, IR, haematologist, cardiac surgery",
"For all intermediate- and high-risk categories (C, D, E)",
"Enables rapid, coordinated, evidence-based decision-making"]),
("DOACs – Preferred", NAVY,
["DOACs are first-line anticoagulants for most patients",
"Apixaban: 10 mg BID x7d → 5 mg BID",
"Rivaroxaban: 15 mg BID x21d → 20 mg OD",
"Exceptions: Pregnancy (LMWH/UFH), APS (VKA), severe CKD (VKA/uncertain)"]),
("Advanced Therapy Matrix", AMBER,
["Systemic thrombolysis (tPA): Class I in Cat E1 (massive PE)",
"Catheter-directed thrombolysis: Class 2a in Cat D/E",
"Mechanical thrombectomy (MT): Class 2a in Cat E1; Class 2b in selected D1-D2",
"MT Class 3 (not recommended) in Cat A-C – guardrail vs. overuse"]),
("Follow-up Care", RGBColor(0x27, 0x6B, 0x53),
["Structured follow-up formalised (previously institution-dependent)",
"Clinic visit at ~4–6 weeks post-discharge for all patients",
"Evaluate for CTEPH at 3–6 months if symptomatic",
"Screen for occult malignancy in unprovoked PE"]),
]
for i, (title, col, items) in enumerate(recs):
row = i // 2; cidx = i % 2
x = Inches(0.28 + cidx * 6.5)
y = Inches(1.35 + row * 3.0)
colored_card(sl, title, items, x, y, Inches(6.2), Inches(2.75), hdr_color=col, txt_size=13)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 8 – TREATMENT ALGORITHM
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "Management Algorithm", "Acute PE – Risk-Stratified Approach")
footer(sl)
# Three columns: Low risk | Intermediate | High risk
col_data = [
("LOW RISK\n(Cat A–B)", GREEN_OK, [
"PERC negative + low PTP → discharge",
"Cat A (asymptomatic): ED discharge, outpatient DOAC",
"Cat B (symptomatic, sPESI=0): Early discharge",
"Anticoagulation: DOAC preferred",
"Apixaban or Rivaroxaban first-line",
"Follow-up at 4-6 weeks",
]),
("INTERMEDIATE RISK\n(Cat C–D)", AMBER, [
"Hospitalise; monitor closely",
"Anticoagulation: DOAC or LMWH bridge",
"Echo + troponin for RV assessment",
"PERT consultation (Class I)",
"Cat D: Consider CDT or MT if deteriorating",
"ICU for Cat D2 (haemodynamically borderline)",
]),
("HIGH RISK\n(Cat E – Massive)", RED_ALERT, [
"Critical care / ICU mandatory",
"UFH anticoagulation immediately",
"Systemic thrombolysis (tPA) – Class I if no contraindication",
"If thrombolysis contraindicated: CDT or surgical embolectomy",
"MT: Class 2a alternative; avoid in low-risk",
"Mechanical circulatory support (ECMO) if refractory",
]),
]
for i, (title, col, items) in enumerate(col_data):
x = Inches(0.28 + i * 4.35)
add_rect(sl, x, Inches(1.35), Inches(4.15), Inches(0.65), fill=col)
add_text(sl, title, x, Inches(1.35), Inches(4.15), Inches(0.65),
size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, wrap=True)
add_rect(sl, x, Inches(2.0), Inches(4.15), Inches(4.9), fill=WHITE,
line_color=col, line_width=2)
add_bullet_box(sl, items, x+Inches(0.12), Inches(2.08), Inches(3.95), Inches(4.75),
size=13, color=DARK_TEXT, bullet_color=col)
# special pops note
add_rect(sl, Inches(0.28), Inches(7.0), Inches(12.7), Inches(0.35), fill=RGBColor(0x1A, 0x1A, 0x2E))
add_text(sl, "Special populations: Pregnancy → LMWH/UFH | APS → VKA (Class I) | "
"Cancer-associated PE → LMWH or DOAC | Severe CKD/ESRD → VKA",
Inches(0.5), Inches(7.01), Inches(12.2), Inches(0.32),
size=11, color=GOLD, anchor=MSO_ANCHOR.MIDDLE, wrap=True)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 9 – OLD vs NEW GUIDELINES COMPARISON
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "ESC 2019 vs. AHA/ACC 2026", "What Has Changed?")
footer(sl)
comp_rows = [
("Risk Classification", "Low / Intermediate / High", "5 Categories: A–E (physiopathological)"),
("PERT", "No formal recommendation", "Class I – mandatory for Cat C–E"),
("DOACs", "Preferred in most patients", "Preferred – more explicit algorithm"),
("Mechanical Thrombectomy", "Emerging / limited guidance", "Class 2a (Cat E1), 2b (Cat D) — Class 3 in Cat A-C"),
("Asymptomatic PE", "No dedicated guidance", "Category A → safe ED discharge"),
("Outpatient Management", "Mentioned briefly", "Formally structured with criteria"),
("Follow-up", "Mentioned", "Structured 4–6 wk visit; CTEPH eval 3–6 mo"),
("Special Populations", "Covered", "Expanded with explicit anticoagulant guidance"),
("Equity & Disparities", "Not addressed", "AHA Scientific Statement – March 2025"),
]
row_h = Inches(0.53)
ys = Inches(1.35)
col_xs = [Inches(0.28), Inches(3.9), Inches(8.55)]
col_ws = [Inches(3.55), Inches(4.5), Inches(4.5)]
headers_row = ["Feature", "ESC 2019", "AHA/ACC 2026"]
hdr_cols_bg = [NAVY, RGBColor(0x44, 0x44, 0x77), TEAL]
for j, (hd, cw, x, hbc) in enumerate(zip(headers_row, col_ws, col_xs, hdr_cols_bg)):
add_rect(sl, x, ys, cw, row_h, fill=hbc)
add_text(sl, hd, x+Inches(0.1), ys+Inches(0.08), cw-Inches(0.15), row_h-Inches(0.1),
size=13, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
for r, (feat, old, new) in enumerate(comp_rows):
y = ys + row_h * (r + 1)
bg = LIGHT_BG if r % 2 == 0 else WHITE
for j, (val, cw, x) in enumerate(zip([feat, old, new], col_ws, col_xs)):
txt_col = DARK_TEXT if j < 2 else RGBColor(0x00, 0x55, 0x33)
add_rect(sl, x, y, cw, row_h, fill=bg, line_color=MID_GREY, line_width=0.3)
add_text(sl, val, x+Inches(0.1), y+Inches(0.04), cw-Inches(0.15), row_h-Inches(0.08),
size=11, color=txt_col, anchor=MSO_ANCHOR.MIDDLE, wrap=True)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 10 – SPECIAL POPULATIONS & FOLLOW-UP
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=LIGHT_BG)
header_bar(sl, "Special Populations & Follow-up", "2026 AHA/ACC Recommendations")
footer(sl)
sp_cards = [
("Pregnancy", RGBColor(0x6A, 0x0D, 0x6A), [
"LMWH or UFH throughout pregnancy",
"DOACs: Class 3 – Harm (fetal anomalies, miscarriage risk)",
"Warfarin: Class 3 – Harm (especially 1st trimester)",
"VTE risk 5x higher than non-pregnant women",
"Pregnancy-adapted YEARS algorithm for diagnosis",
]),
("Antiphospholipid Syndrome (APS)", NAVY, [
"VKA (warfarin) is preferred over DOACs",
"Class I recommendation, Level of Evidence A",
"DOACs associated with inferior outcomes in APS",
"Confirm triple-positive antibody status before switching",
]),
("Cancer-Associated PE", RGBColor(0x7D, 0x1C, 0x00), [
"LMWH or DOAC (apixaban / rivaroxaban) preferred",
"DOAC: lower risk of recurrent VTE vs LMWH in many cancers",
"Caution: GI malignancy (higher bleeding risk with DOACs)",
"Duration typically ≥6 months; reassess continuously",
]),
("Chronic Kidney Disease", TEAL, [
"Mild-moderate CKD (stages 2-3): DOACs preferred",
"Severe CKD (stages 4-5): VKA recommended",
"ESRD / haemodialysis: apixaban vs VKA uncertain (Class 2b)",
"Monitor renal function regularly during DOAC therapy",
]),
]
for i, (title, col, items) in enumerate(sp_cards):
row = i // 2; cidx = i % 2
x = Inches(0.28 + cidx * 6.5)
y = Inches(1.35 + row * 2.8)
colored_card(sl, title, items, x, y, Inches(6.2), Inches(2.55), hdr_color=col, txt_size=12)
# Follow-up strip
add_rect(sl, Inches(0.28), Inches(7.0), Inches(12.7), Inches(0.35), fill=RGBColor(0x06, 0x1A, 0x40))
add_text(sl,
"FOLLOW-UP: 4–6 wk clinic visit for ALL patients | Evaluate for CTEPH at 3–6 months if symptomatic | "
"Screen for occult malignancy in unprovoked PE | Reassess anticoagulation duration (provoked vs unprovoked)",
Inches(0.5), Inches(7.01), Inches(12.2), Inches(0.32),
size=11, color=GOLD, anchor=MSO_ANCHOR.MIDDLE, wrap=True)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 11 – KEY TAKEAWAYS
# ══════════════════════════════════════════════════════════════════════════════
sl = prs.slides.add_slide(blank)
add_rect(sl, 0, 0, W, H, fill=NAVY)
add_rect(sl, 0, 0, Inches(0.18), H, fill=TEAL)
add_rect(sl, Inches(0.18), 0, Inches(0.06), H, fill=GOLD)
header_bar(sl, "Key Takeaways", "Pulmonary Embolism – 2026 Guidelines")
footer(sl)
takeaways = [
"PE severity is now defined by a five-tier Clinical Category system (A–E) — not just haemodynamics",
"Category A (asymptomatic) patients can be safely discharged from the ED on outpatient anticoagulation",
"PERTs are now a Class I recommendation for intermediate- and high-risk PE",
"DOACs (apixaban, rivaroxaban) are the preferred anticoagulants for most patients",
"Mechanical thrombectomy is Class 2a in massive PE (Cat E1) — but Class 3 (avoid) in low-risk categories",
"Systemic thrombolysis remains Class I in haemodynamically unstable massive PE without contraindication",
"Pregnancy → LMWH/UFH; APS → VKA (Class I, LOE A); Cancer → LMWH or DOAC",
"Structured follow-up at 4–6 weeks is now formally recommended for all patients",
"Health equity in PE care remains a significant ongoing challenge (AHA Scientific Statement, March 2025)",
]
add_bullet_box(sl, takeaways, Inches(0.6), Inches(1.35), Inches(12.2), Inches(5.6),
size=15, color=WHITE, bullet_color=GOLD)
add_rect(sl, Inches(0.3), Inches(7.0), Inches(12.7), Inches(0.35),
fill=RGBColor(0x06, 0x1A, 0x40))
add_text(sl,
"Source: 2026 AHA/ACC/ACCP/ACEP/CHEST/SCAI/SHM/SIR/SVM/SVN Guideline | "
"Circulation. 2026;153:e977-e1051 | DOI: 10.1161/CIR.0000000000001415 | PMID: 41712677",
Inches(0.5), Inches(7.01), Inches(12.2), Inches(0.32),
size=10, color=RGBColor(0xAA, 0xBB, 0xCC), anchor=MSO_ANCHOR.MIDDLE)
# ─── SAVE ─────────────────────────────────────────────────────────────────────
out = "/tmp/workspace/pe-presentation/Pulmonary_Embolism_2026_Guidelines.pptx"
buf = BytesIO()
prs.save(buf)
with open(out, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out}")
import os
print(f"Size: {os.path.getsize(out):,} bytes | Slides: {len(prs.slides)}")
cd /tmp/workspace/pe-presentation && python build_pe_slides.py 2>&1
Pulmonary Embolism 2026 Guidelines
Presentation · PPTX
| Slide | Title |
|---|---|
| 1 | Title slide - Pulmonary Embolism: Overview & 2026 AHA/ACC Guidelines |
| 2 | What is PE? - Definition, Epidemiology, Virchow's Triad |
| 3 | Pathophysiology - Step-by-step haemodynamic cascade |
| 4 | Clinical Features - Symptoms table with prevalence + key signs |
| 5 | Diagnosis - Wells Score, PERC Rule, D-Dimer (age-adjusted/YEARS), Imaging, Biomarkers |
| 6 | 2026 Guideline: New Five-Tier Category System (A-E) - colour-coded cards |
| 7 | 2026 Guideline: Key Recommendations (PERT Class I, DOACs, Advanced Therapy Matrix, Follow-up) |
| 8 | Management Algorithm - three-column risk-stratified approach (Low / Intermediate / High) |
| 9 | ESC 2019 vs. AHA/ACC 2026 - side-by-side comparison table |
| 10 | Special Populations (Pregnancy, APS, Cancer, CKD) + Follow-up recommendations |
| 11 | Key Takeaways - 9 core points on dark navy background |