Can you make short slides of this information for a presentation
cd /tmp/workspace && python3 -c " import pdfplumber pdf_path = '/tmp/workspace/attachments/870f6e52-3f2b-4e3c-a2de-e894bdde7080/Pulmonary embolism.pdf' with pdfplumber.open(pdf_path) as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages): text = page.extract_text() print(f'--- PAGE {i+1} ---') print(text) print() "
mkdir -p /tmp/workspace/pe-presentation && python3 << 'PYEOF' 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 io import BytesIO # Color palette DARK_BLUE = RGBColor(0x0D, 0x2B, 0x55) # deep navy MED_BLUE = RGBColor(0x1A, 0x5F, 0x9E) # medium blue ACCENT_RED = RGBColor(0xC0, 0x39, 0x2B) # alert red LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) # pale blue bg WHITE = RGBColor(0xFF, 0xFF, 0xFF) LIGHT_GRAY = RGBColor(0xF5, 0xF7, 0xFA) MID_GRAY = RGBColor(0x70, 0x7F, 0x8B) TEXT_DARK = RGBColor(0x1E, 0x2A, 0x38) prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) blank = prs.slide_layouts[6] # ─── Helper functions ─────────────────────────────────────────────────────── def fill_bg(slide, color): from pptx.oxml.ns import qn from lxml import etree bg = slide.background fill = bg.fill fill.solid() fill.fore_color.rgb = color def add_rect(slide, x, y, w, h, fill_color, line_color=None): shape = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h)) shape.fill.solid() shape.fill.fore_color.rgb = fill_color if line_color: shape.line.color.rgb = line_color shape.line.width = Pt(0.5) else: shape.line.fill.background() return shape def add_textbox(slide, x, y, w, h, text, font_size, bold=False, color=TEXT_DARK, align=PP_ALIGN.LEFT, italic=False, wrap=True, anchor=MSO_ANCHOR.TOP): tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = tb.text_frame tf.word_wrap = wrap tf.vertical_anchor = anchor tf.margin_left = 0; tf.margin_right = 0 tf.margin_top = Pt(2); tf.margin_bottom = 0 p = tf.paragraphs[0] p.alignment = align r = p.add_run() r.text = text r.font.size = Pt(font_size) r.font.bold = bold r.font.italic = italic r.font.color.rgb = color r.font.name = "Calibri" return tb def add_paragraph(tf, text, font_size, bold=False, color=TEXT_DARK, align=PP_ALIGN.LEFT, italic=False, space_before=0): p = tf.add_paragraph() p.alignment = align if space_before: p.space_before = Pt(space_before) r = p.add_run() r.text = text r.font.size = Pt(font_size) r.font.bold = bold r.font.italic = italic r.font.color.rgb = color r.font.name = "Calibri" return p def add_bullet_box(slide, x, y, w, h, items, font_size=13, title=None, title_size=14, title_color=MED_BLUE, bullet="• "): tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = tb.text_frame tf.word_wrap = True tf.margin_left = Pt(4); tf.margin_right = Pt(4) tf.margin_top = Pt(4); tf.margin_bottom = Pt(4) first = True if title: p = tf.paragraphs[0] p.alignment = PP_ALIGN.LEFT r = p.add_run() r.text = title r.font.size = Pt(title_size) r.font.bold = True 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() p.alignment = PP_ALIGN.LEFT p.space_before = Pt(3) r = p.add_run() r.text = bullet + item r.font.size = Pt(font_size) r.font.color.rgb = TEXT_DARK r.font.name = "Calibri" return tb # ════════════════════════════════════════════════════════════════════════════ # SLIDE 1 — Title # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) fill_bg(s, DARK_BLUE) # Decorative accent bar (left edge) add_rect(s, 0, 0, 0.08, 7.5, ACCENT_RED) # Bottom bar add_rect(s, 0, 6.9, 13.333, 0.6, RGBColor(0x0A, 0x1E, 0x3F)) add_textbox(s, 0.25, 1.6, 12, 0.7, "2026 AHA/ACC GUIDELINES", 16, bold=False, color=RGBColor(0x7E, 0xB8, 0xE8), align=PP_ALIGN.CENTER) add_textbox(s, 0.25, 2.2, 12, 1.4, "Pulmonary Embolism", 52, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_textbox(s, 0.25, 3.55, 12, 0.6, "Evaluation and Management of Acute PE in Adults", 20, color=RGBColor(0xB0, 0xCC, 0xE8), align=PP_ALIGN.CENTER) add_textbox(s, 0.25, 4.3, 12, 0.5, "First-ever dedicated PE guideline from AHA/ACC | February 2026", 14, italic=True, color=RGBColor(0x80, 0x9F, 0xBF), align=PP_ALIGN.CENTER) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 2 — New 5-Tier Classification # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) fill_bg(s, LIGHT_GRAY) add_rect(s, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(s, 0, 0, 0.08, 7.5, ACCENT_RED) add_textbox(s, 0.25, 0.18, 13, 0.75, "New 5-Tier Clinical Classification", 28, bold=True, color=WHITE) # Category cards cats = [ ("A", "At Risk", "No acute PE; risk factors present", RGBColor(0x27,0xAE,0x60)), ("B", "Beginning/Mild", "Hemodynamically stable\nNo RV strain, low severity score", RGBColor(0x2E,0x86,0xC1)), ("C", "Intermediate", "C1: elevated score, normal RV\nC2: RV dysfunction OR biomarkers\nC3: both RV dysfunction AND biomarkers", RGBColor(0xE6,0x7E,0x22)), ("D", "Deteriorating", "Normotensive shock or rapid clinical\ndeterioration (D1-D2 subcategories)", RGBColor(0xC0,0x39,0x2B)), ("E", "Extremis", "Overt hemodynamic collapse\nCardiac arrest (E1-E2 subcategories)", RGBColor(0x6C,0x35,0x7B)), ] cx = 0.25 for letter, name, desc, col in cats: card_w = 2.5 add_rect(s, cx, 1.35, card_w, 5.7, WHITE, col) add_rect(s, cx, 1.35, card_w, 0.85, col) # Letter add_textbox(s, cx+0.05, 1.38, 0.7, 0.75, letter, 30, bold=True, color=WHITE) # Name add_textbox(s, cx+0.65, 1.45, card_w-0.7, 0.65, name, 13, bold=True, color=WHITE) # Description add_textbox(s, cx+0.12, 2.3, card_w-0.24, 4.4, desc, 11.5, color=TEXT_DARK, wrap=True) cx += card_w + 0.13 add_textbox(s, 0.25, 7.0, 12.5, 0.45, "New parameters: CPES score, NEWS2, serum lactate, normotensive shock | Respiratory modifiers apply in C1-C3 when SpO2 < 90%", 10, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 3 — Diagnosis # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) fill_bg(s, LIGHT_GRAY) add_rect(s, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(s, 0, 0, 0.08, 7.5, ACCENT_RED) add_textbox(s, 0.25, 0.18, 13, 0.75, "Diagnosis", 28, bold=True, color=WHITE) cards = [ ("Imaging", MED_BLUE, ["CTPA: primary imaging modality", "V/Q scan: preferred in pregnancy, reduced radiation/contrast", "Echo: RV assessment drives C2/C3 vs D/E categorization"]), ("Biomarkers", RGBColor(0x1A,0x8A,0x5A), ["Troponin + BNP/NT-proBNP formally in category assignment", "BNP is new vs. ESC 2019 (which emphasized only troponin)", "Both used to classify severity tier"]), ("Pre-test Tools", RGBColor(0xE6,0x7E,0x22), ["Wells score — remains valid", "Revised Geneva score — remains valid", "D-dimer: age-adjusted cutoff (age × 10 mcg/L if >50 yrs)", "Pregnancy-adapted YEARS algorithm (use with caution)"]), ] cx = 0.25 cw = 4.2 for title, col, bullets in cards: add_rect(s, cx, 1.3, cw, 5.9, WHITE, col) add_rect(s, cx, 1.3, cw, 0.7, col) add_textbox(s, cx+0.15, 1.35, cw-0.2, 0.6, title, 15, bold=True, color=WHITE) add_bullet_box(s, cx+0.1, 2.1, cw-0.2, 4.9, bullets, font_size=12.5) cx += cw + 0.22 # ════════════════════════════════════════════════════════════════════════════ # SLIDE 4 — Anticoagulation # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) fill_bg(s, LIGHT_GRAY) add_rect(s, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(s, 0, 0, 0.08, 7.5, ACCENT_RED) add_textbox(s, 0.25, 0.18, 13, 0.75, "Anticoagulation", 28, bold=True, color=WHITE) # Left panel — DOACs add_rect(s, 0.25, 1.3, 6.1, 5.9, WHITE, MED_BLUE) add_rect(s, 0.25, 1.3, 6.1, 0.7, MED_BLUE) add_textbox(s, 0.4, 1.35, 5.8, 0.6, "DOACs — First Line (Class 1)", 15, bold=True, color=WHITE) doac_items = [ "Rivaroxaban / Apixaban — oral from day 1, no parenteral bridge", "Dabigatran / Edoxaban — require 5-10 days parenteral anticoag first", "Preferred for most patients without contraindications", ] add_bullet_box(s, 0.35, 2.1, 5.9, 2.5, doac_items, font_size=13) add_rect(s, 0.25, 4.8, 6.1, 0.6, RGBColor(0xE8, 0xF0, 0xFB)) add_textbox(s, 0.4, 4.83, 5.8, 0.55, "When to use LMWH / UFH instead:", 12, bold=True, color=DARK_BLUE) add_bullet_box(s, 0.35, 5.4, 5.9, 1.7, ["Pregnancy (LMWH throughout; DOACs contraindicated)", "Active cancer with GI involvement", "DOAC contraindicated or not available"], font_size=12) # Right panel — Duration add_rect(s, 6.7, 1.3, 6.35, 5.9, WHITE, RGBColor(0x1A,0x8A,0x5A)) add_rect(s, 6.7, 1.3, 6.35, 0.7, RGBColor(0x1A,0x8A,0x5A)) add_textbox(s, 6.85, 1.35, 6.1, 0.6, "Duration & Special Populations", 15, bold=True, color=WHITE) dur_items = [ "Minimum 3 months for provoked PE", "Extended/indefinite: unprovoked PE with low-moderate bleeding risk", "Indefinite: recurrent VTE, active cancer, antiphospholipid syndrome", "Aspirin NOT a substitute for anticoagulation", ] add_bullet_box(s, 6.85, 2.05, 6.1, 2.8, dur_items, font_size=13) add_rect(s, 6.7, 4.8, 6.35, 0.6, RGBColor(0xE8, 0xF5, 0xEE)) add_textbox(s, 6.85, 4.83, 6.1, 0.55, "Special Populations:", 12, bold=True, color=DARK_BLUE) add_bullet_box(s, 6.85, 5.4, 6.1, 1.7, ["Renal impairment: UFH or dose-adjusted LMWH; avoid dabigatran if eGFR < 30", "Cancer: LMWH or DOACs (edoxaban/rivaroxaban) — caution in luminal GI", "Right heart thrombus: consider systemic thrombolysis or surgical removal"], font_size=12) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 5 — Advanced (Reperfusion) Therapies # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) fill_bg(s, LIGHT_GRAY) add_rect(s, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(s, 0, 0, 0.08, 7.5, ACCENT_RED) add_textbox(s, 0.25, 0.18, 13, 0.75, "Advanced (Reperfusion) Therapies", 28, bold=True, color=WHITE) # Table header rows = [ ("A – C1", "Anticoagulation only", "Class 3: do NOT use mechanical thrombectomy", RGBColor(0x27,0xAE,0x60)), ("C2 – C3", "Anticoagulation ± Catheter-Directed Therapy", "CDT if deteriorating; consider if RV dysfunction", RGBColor(0xE6,0x7E,0x22)), ("D1 – D2", "CDT or Mechanical Thrombectomy (MT)", "Class 2b for MT; especially if bleeding risk high", RGBColor(0xC0,0x39,0x2B)), ("E1", "Systemic Thrombolysis OR MT", "Class 2a for MT; surgical embolectomy if available", RGBColor(0x7D,0x3C,0x98)), ("E2", "Systemic Thrombolysis + ECMO", "Surgical embolectomy (cardiac arrest)", RGBColor(0x4A,0x23,0x5A)), ] add_rect(s, 0.25, 1.3, 12.8, 0.55, DARK_BLUE) add_textbox(s, 0.35, 1.33, 1.5, 0.5, "Category", 12, bold=True, color=WHITE) add_textbox(s, 1.95, 1.33, 5.0, 0.5, "Preferred Therapy", 12, bold=True, color=WHITE) add_textbox(s, 7.1, 1.33, 5.8, 0.5, "Notes", 12, bold=True, color=WHITE) ry = 1.85 for cat, therapy, note, col in rows: rh = 0.95 add_rect(s, 0.25, ry, 1.6, rh, col) add_textbox(s, 0.3, ry+0.22, 1.5, 0.5, cat, 14, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_rect(s, 1.85, ry, 5.1, rh, WHITE, col) add_textbox(s, 1.95, ry+0.18, 4.9, 0.65, therapy, 12, bold=True, color=col, wrap=True) add_rect(s, 6.95, ry, 6.15, rh, RGBColor(0xF5,0xF5,0xF5), MID_GRAY) add_textbox(s, 7.05, ry+0.18, 5.9, 0.65, note, 11.5, color=TEXT_DARK, wrap=True) ry += rh + 0.05 add_textbox(s, 0.25, 6.75, 12.5, 0.55, "PEERLESS RCT (2025): large-bore MT vs. CDT in intermediate-high risk PE | Alteplase 100 mg IV over 2h for Category E", 10, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 6 — PERTs + Outpatient Management # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) fill_bg(s, LIGHT_GRAY) add_rect(s, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(s, 0, 0, 0.08, 7.5, ACCENT_RED) add_textbox(s, 0.25, 0.18, 13, 0.75, "PERTs & Outpatient Management", 28, bold=True, color=WHITE) # PERT panel add_rect(s, 0.25, 1.3, 6.1, 5.9, WHITE, ACCENT_RED) add_rect(s, 0.25, 1.3, 6.1, 0.7, ACCENT_RED) add_textbox(s, 0.4, 1.35, 5.8, 0.6, "Pulmonary Embolism Response Teams (PERTs)", 13.5, bold=True, color=WHITE) add_textbox(s, 0.4, 2.1, 5.7, 0.5, "CLASS 1 RECOMMENDATION", 13, bold=True, color=ACCENT_RED) pert_items = [ "Multidisciplinary rapid-response team", "Members: Cardiology, Pulmonology, EM, Hematology, IR, CT Surgery", "Rapid coordinated decisions for intermediate- and high-risk PE", "Practice-changing upgrade from ESC 2019 (where PERTs were merely 'mentioned')", ] add_bullet_box(s, 0.35, 2.65, 5.9, 4.3, pert_items, font_size=12.5) # Outpatient panel add_rect(s, 6.7, 1.3, 6.35, 5.9, WHITE, MED_BLUE) add_rect(s, 6.7, 1.3, 6.35, 0.7, MED_BLUE) add_textbox(s, 6.85, 1.35, 6.1, 0.6, "Outpatient / Early Discharge Criteria", 14, bold=True, color=WHITE) out_items = [ "Category A/B patients with no significant comorbidity", "Reliable follow-up and DOAC access", "Can be discharged from the ED", "Tools: Hestia criteria & sPESI score guide safe discharge", "Post-PE clinic at 3-6 months for CTEPH screening", "CTEPH workup: Echo → V/Q scan → Right heart catheterization if suspected", ] add_bullet_box(s, 6.85, 2.1, 6.1, 5.0, out_items, font_size=12.5) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 7 — ESC 2019 vs AHA/ACC 2026 # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) fill_bg(s, LIGHT_GRAY) add_rect(s, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(s, 0, 0, 0.08, 7.5, ACCENT_RED) add_textbox(s, 0.25, 0.18, 13, 0.75, "ESC 2019 vs. AHA/ACC 2026: Key Differences", 28, bold=True, color=WHITE) compare = [ ("Risk Classification", "Low / Intermediate-low /\nIntermediate-high / High", "New 5-tier A-E system"), ("BNP in Risk Stratif.", "Supplementary only", "Formally incorporated"), ("PERTs", "Mentioned", "Class 1 Recommendation"), ("MT for Intermed. Risk", "Not addressed", "Class 2b for D1-D2"), ("Normotensive Shock", "Not explicitly defined", "Explicitly categorized (D)"), ("Outpatient Mgmt", "Limited guidance", "Explicit ED discharge criteria"), ] add_rect(s, 0.25, 1.3, 12.8, 0.55, DARK_BLUE) add_textbox(s, 0.35, 1.35, 4.0, 0.45, "Feature", 12, bold=True, color=WHITE) add_textbox(s, 4.5, 1.35, 4.0, 0.45, "ESC 2019", 12, bold=True, color=RGBColor(0xAA,0xCC,0xFF)) add_textbox(s, 8.7, 1.35, 4.2, 0.45, "AHA/ACC 2026", 12, bold=True, color=RGBColor(0xAA,0xFF,0xCC)) row_colors = [WHITE, RGBColor(0xF0,0xF4,0xF8)] ry = 1.85 for i, (feat, old, new_) in enumerate(compare): rh = 0.82 bg = row_colors[i % 2] add_rect(s, 0.25, ry, 4.15, rh, bg, MID_GRAY) add_textbox(s, 0.35, ry+0.1, 4.0, 0.65, feat, 12, bold=True, color=TEXT_DARK, wrap=True) add_rect(s, 4.4, ry, 4.2, rh, bg, MID_GRAY) add_textbox(s, 4.5, ry+0.1, 4.0, 0.65, old, 11.5, color=ACCENT_RED, italic=True, wrap=True) add_rect(s, 8.6, ry, 4.45, rh, bg, MID_GRAY) add_textbox(s, 8.7, ry+0.1, 4.25, 0.65, new_, 11.5, color=RGBColor(0x1A,0x8A,0x5A), bold=True, wrap=True) ry += rh + 0.03 # ════════════════════════════════════════════════════════════════════════════ # SLIDE 8 — Summary / Key Takeaways # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) fill_bg(s, DARK_BLUE) add_rect(s, 0, 0, 0.08, 7.5, ACCENT_RED) add_rect(s, 0, 6.9, 13.333, 0.6, RGBColor(0x0A, 0x1E, 0x3F)) add_textbox(s, 0.3, 0.3, 12.5, 0.8, "Key Takeaways", 30, bold=True, color=WHITE) takeaways = [ ("01", "5-Tier A-E System", "Replaces old Low/Intermediate/High classification — includes normotensive shock and RV parameters"), ("02", "DOACs First Line", "Rivaroxaban & apixaban preferred; no parenteral bridge needed for most patients"), ("03", "PERTs = Class 1", "Multidisciplinary response teams now mandated for intermediate/high-risk PE"), ("04", "MT is Guideline-Backed", "Class 2b for D1-D2; Class 2a for E1 — overuse in low-risk categories actively discouraged"), ("05", "Explicit Discharge Criteria", "Category A/B with DOAC access can go home from the ED using Hestia/sPESI"), ("06", "CTEPH Screening", "All PE survivors get echo at 3-6 months; V/Q + RHC if CTEPH suspected"), ] tx = 0.3 for i, (num, title, desc) in enumerate(takeaways): row = i // 2 col = i % 2 cx_ = tx + col * 6.5 cy_ = 1.3 + row * 1.9 add_rect(s, cx_, cy_, 6.2, 1.7, RGBColor(0x12, 0x38, 0x6B)) add_rect(s, cx_, cy_, 0.55, 1.7, MED_BLUE) add_textbox(s, cx_+0.05, cy_+0.55, 0.5, 0.6, num, 11, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_textbox(s, cx_+0.65, cy_+0.12, 5.4, 0.5, title, 14, bold=True, color=RGBColor(0x7E,0xC8,0xFF)) add_textbox(s, cx_+0.65, cy_+0.62, 5.4, 0.95, desc, 11.5, color=RGBColor(0xCC,0xDD,0xEE), wrap=True) add_textbox(s, 0.25, 7.0, 12.5, 0.42, "Source: 2026 AHA/ACC/ACCP/ACEP/CHEST/SCAI/SHM/SIR/SVM/SVN Guideline | Circulation & JACC, February 2026 | PMID: 41712677", 9.5, italic=True, color=RGBColor(0x60, 0x80, 0xA0), align=PP_ALIGN.CENTER) # ─── Save ──────────────────────────────────────────────────────────────────── out_path = "/tmp/workspace/pe-presentation/Pulmonary_Embolism_2026.pptx" buf = BytesIO() prs.save(buf) with open(out_path, "wb") as f: f.write(buf.getvalue()) print(f"Saved to {out_path}") PYEOF
Pulmonary Embolism 2026
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide - 2026 AHA/ACC Guidelines overview |
| 2 | New 5-Tier Classification - Category A through E with color-coded cards |
| 3 | Diagnosis - Imaging, Biomarkers, Pre-test probability tools |
| 4 | Anticoagulation - DOACs first-line, duration, special populations |
| 5 | Advanced Therapies - Reperfusion matrix by category (table format) |
| 6 | PERTs & Outpatient Management - Class 1 PERT recommendation + ED discharge criteria |
| 7 | ESC 2019 vs AHA/ACC 2026 - Side-by-side comparison table |
| 8 | Key Takeaways - 6 numbered summary cards |
Pulmonary embolism new guidelines
"pulmonary embolism"[MeSH Terms] AND "guideline"[pt]
2026 AHA ACC pulmonary embolism guidelines summary key recommendations
https://www.jacc.org/doi/full/10.1016/j.jacc.2025.12.023
pulmonary embolism classification management algorithm diagram

This composite educational image illustrates acute pulmonary embolism and its subsequent surgical management. Panel A is a transesophageal echocardiogram (TEE) demonstrating a heterogeneous, echogenic mass within the right pulmonary artery (RPA), adjacent to the aorta (Ao) and superior vena cava (SVC). Panel B provides a labeled schematic diagram of the TEE view, identifying anatomical landmarks including the RPA, SVC, subclavian vein (SCV), and the specific location of the pulmonary artery clot. Panel C is a clinical photograph of the surgically removed specimen (embolectomy). The macroscopic specimen shows a long, organized thromboembolus, approximately 9-10 cm in length according to the included surgical ruler. The clot displays a variegated color ranging from dark red to tan, with a friable, irregular texture characteristic of a deep vein thrombosis that has embolized. The set is intended for advanced medical education focusing on cardiology, cardiothoracic surgery, and critical care, demonstrating the correlation between real-time diagnostic imaging and surgical pathology in hemodynamic instability.

This diagram illustrates a diagnostic machine learning pipeline for automated pulmonary embolism (PE) detection. The workflow begins with an axial input image from a single-energy computed tomography pulmonary angiography (SE-CTPA), showing the thorax, heart, and pulmonary vasculature. The SE-CTPA is processed by a 'Generator Network' (a ResNet encoder-decoder) to produce a Synthetic Monoenergetic Image (SMI) at 40 keV. This SMI output demonstrates enhanced iodine attenuation and increased vascular contrast compared to the input, facilitating better visualization of potential intraluminal filling defects. The SMI is then fed into a 'PE Classification Network' (ResNet50), which performs binary classification to provide a final diagnostic result (PE yes/no). The visualization highlights the use of deep learning for domain adaptation and disease identification in radiology, specifically aiming to simulate high-contrast dual-energy CT findings from standard single-energy CT scans to improve the detection of segmental and subsegmental pulmonary emboli.

This diagnostic flowchart illustrates the monoenergetic reconstruction algorithm used in Dual-Energy Computed Tomography (DECT), specifically for CT Pulmonary Angiography (CTPA). The diagram displays three axial chest CT images and two magnified insets to demonstrate a frequency-split technique. The 'High contrast attenuation' image (typically at 40 keV) shows intense vascular enhancement of the pulmonary arteries but with significant image noise. The 'Optimal image noise' image (typically at 70 keV) shows smoother soft tissue texture but reduced vascular contrast. The algorithm decomposes these into sub-images: 'Iodine attenuation' (low spatial frequency stack) and 'Image noise' (high spatial frequency stack). These components are integrated into a final reconstructed image at the bottom, which achieves a clinical balance of high vascular iodine signal and minimized background noise. This educational visual explains the pathophysiological and radiological benefit of virtual monoenergetic spectral (VMS) imaging in optimizing contrast-to-noise ratio (CNR) for diagnosing conditions like pulmonary embolism.
| Category | Name | Key Features |
|---|---|---|
| A | At Risk | No acute PE yet; risk factors present |
| B | Beginning / Mild | Hemodynamically stable, no RV strain, low severity score |
| C | Intermediate | 3 subcategories: C1 (elevated severity, normal RV + biomarkers), C2 (RV dysfunction OR abnormal biomarkers), C3 (both RV dysfunction AND elevated biomarkers) |
| D | Deteriorating | Normotensive shock or rapid clinical deterioration; D1 and D2 subcategories |
| E | Extremis / High-Risk | Overt hemodynamic collapse, cardiac arrest; E1 (pulsatile) and E2 (arrest) |
| Category | Preferred Therapy | Evidence Class |
|---|---|---|
| A-C1 | Anticoagulation only | Class 3: do NOT use MT |
| C2-C3 | Anticoag ± catheter-directed therapy if deteriorating | Class 2b |
| C3 (MAP <80 mmHg) | Escalation trigger; reassess for D-level therapy | Class 2a |
| D1-D2 | Catheter-directed thrombolysis (CDT) or mechanical thrombectomy (MT) | Class 2b for MT |
| E1 | Systemic thrombolysis OR MT; surgical embolectomy if available | Class 2a for MT |
| E2 | Systemic thrombolysis + VA-ECMO; surgical embolectomy | Emergent |
| Population | Recommendation |
|---|---|
| Pregnancy | LMWH throughout; DOACs contraindicated; CTPA preferred over V/Q if needed; thrombolysis only for life-threatening PE |
| Active cancer | LMWH or DOACs (edoxaban/rivaroxaban); caution with luminal GI malignancy (bleeding risk) |
| Renal impairment | UFH or dose-adjusted LMWH; avoid dabigatran if eGFR <30 |
| Right heart thrombus | Consider systemic thrombolysis or surgical removal; anticoagulation alone = high mortality |
| Long-haul travel history | For prior PE patients not on anticoagulation: single prophylactic DOAC/LMWH dose on day of long-haul travel (Class 2b) |
| Feature | ESC 2019 | AHA/ACC 2026 |
|---|---|---|
| Risk classification | Low/Intermediate-low/Intermediate-high/High | 5-tier A-E system |
| BNP in risk stratification | Supplementary | Formally incorporated |
| PERTs | Mentioned | Class 1 recommendation |
| MT for intermediate-risk | Not addressed | Class 2b for D1-D2 |
| Normotensive shock | Not explicitly defined | Explicitly categorized (D) |
| Outpatient management | Limited guidance | Explicit ED discharge criteria |
Note: A published erratum exists (PMID: 42441758); verify the final published version for any corrected recommendations.
Can you make me slides of this very information for presentation
mkdir -p /tmp/workspace/pe-slides2 && python3 << 'PYEOF' 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 io import BytesIO # ── Palette ────────────────────────────────────────────────────────────────── NAVY = RGBColor(0x0D, 0x2B, 0x55) BLUE = RGBColor(0x1A, 0x5F, 0x9E) RED = RGBColor(0xC0, 0x39, 0x2B) GREEN = RGBColor(0x1A, 0x8A, 0x5A) ORANGE = RGBColor(0xE6, 0x7E, 0x22) PURPLE = RGBColor(0x6C, 0x35, 0x7B) TEAL = RGBColor(0x0E, 0x7C, 0x86) WHITE = RGBColor(0xFF, 0xFF, 0xFF) OFF_WHITE = RGBColor(0xF5, 0xF7, 0xFA) LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) MID_GRAY = RGBColor(0x70, 0x7F, 0x8B) TEXT = RGBColor(0x1E, 0x2A, 0x38) prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) BL = prs.slide_layouts[6] # blank layout # ── Primitive helpers ───────────────────────────────────────────────────────── def bg(slide, color): slide.background.fill.solid() slide.background.fill.fore_color.rgb = color def rect(slide, x, y, w, h, fill, line=None, lw=0.5): sh = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h)) sh.fill.solid(); sh.fill.fore_color.rgb = fill if line: sh.line.color.rgb = line; sh.line.width = Pt(lw) else: sh.line.fill.background() return sh def tb(slide, x, y, w, h, text, sz, bold=False, color=TEXT, align=PP_ALIGN.LEFT, italic=False, wrap=True, anchor=MSO_ANCHOR.TOP, font="Calibri"): t = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = t.text_frame; tf.word_wrap = wrap; tf.vertical_anchor = anchor tf.margin_left=0; tf.margin_right=0; tf.margin_top=Pt(2); tf.margin_bottom=0 p = tf.paragraphs[0]; p.alignment = align r = p.add_run(); r.text = text r.font.size=Pt(sz); r.font.bold=bold; r.font.italic=italic r.font.color.rgb=color; r.font.name=font return t def add_p(tf, text, sz, bold=False, color=TEXT, align=PP_ALIGN.LEFT, italic=False, sp=3, font="Calibri"): p = tf.add_paragraph(); p.alignment=align if sp: p.space_before=Pt(sp) r = p.add_run(); r.text=text r.font.size=Pt(sz); r.font.bold=bold; r.font.italic=italic r.font.color.rgb=color; r.font.name=font return p def bullets(slide, x, y, w, h, items, sz=12.5, hdr=None, hdr_sz=14, hdr_col=BLUE, dot="• ", item_color=TEXT): t = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = t.text_frame; tf.word_wrap=True tf.margin_left=Pt(6); tf.margin_right=Pt(4) tf.margin_top=Pt(4); tf.margin_bottom=Pt(4) first = True if hdr: p = tf.paragraphs[0]; p.alignment=PP_ALIGN.LEFT r = p.add_run(); r.text=hdr r.font.size=Pt(hdr_sz); r.font.bold=True r.font.color.rgb=hdr_col; r.font.name="Calibri" first=False for item in items: p = tf.paragraphs[0] if first else tf.add_paragraph() first=False; p.alignment=PP_ALIGN.LEFT; p.space_before=Pt(3) r = p.add_run(); r.text=dot+item r.font.size=Pt(sz); r.font.color.rgb=item_color; r.font.name="Calibri" return t # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 1 — Title # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) # left accent bar rect(s, 0, 6.85, 13.333, 0.65, RGBColor(0x08,0x18,0x38)) # bottom bar tb(s, 0.3, 1.3, 12.5, 0.65, "2026 AHA / ACC / ACCP / ACEP / CHEST — FIRST-EVER DEDICATED GUIDELINE", 13, color=RGBColor(0x7E,0xB8,0xE8), align=PP_ALIGN.CENTER) tb(s, 0.3, 1.95, 12.5, 1.5, "Pulmonary Embolism", 54, bold=True, color=WHITE, align=PP_ALIGN.CENTER) tb(s, 0.3, 3.45, 12.5, 0.65, "New Guidelines: Evaluation & Management of Acute PE in Adults", 21, color=RGBColor(0xB0,0xCC,0xE8), align=PP_ALIGN.CENTER) tb(s, 0.3, 4.2, 12.5, 0.5, "Published in Circulation & JACC | February 19, 2026 | PMID 41712677 / 41712898", 13, italic=True, color=RGBColor(0x70,0x98,0xC0), align=PP_ALIGN.CENTER) # small tag rect(s, 4.5, 5.1, 4.35, 0.55, RGBColor(0xC0,0x39,0x2B)) tb(s, 4.5, 5.13, 4.35, 0.48, "Replaces ESC 2019 — Major Paradigm Shift", 12, bold=True, color=WHITE, align=PP_ALIGN.CENTER) # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 2 — New 5-Tier A-E Classification # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "The Biggest Change: New 5-Tier Clinical Classification (A-E)", 26, bold=True, color=WHITE) tb(s, 0.25, 0.85, 13, 0.3, "Replaces Low / Intermediate / High-Risk — introduces physiological subcategories", 12, italic=True, color=RGBColor(0xAA,0xCC,0xFF), align=PP_ALIGN.LEFT) cats = [ ("A", "At Risk", GREEN, ["No acute PE yet", "Risk factors present", "Prophylaxis focus"]), ("B", "Mild", BLUE, ["Hemodynamically stable", "No RV strain", "Low severity score"]), ("C", "Intermediate", ORANGE, ["C1: elevated score, normal RV/biomarkers", "C2: RV dysfunction OR abnormal biomarkers", "C3: BOTH RV dysfunction AND biomarkers", "Resp. modifiers if SpO2 <90%"]), ("D", "Deteriorating", RED, ["Normotensive shock", "Rapid clinical deterioration", "D1 and D2 subcategories", "NEW vs. ESC 2019"]), ("E", "Extremis", PURPLE, ["Overt hemodynamic collapse", "Cardiac arrest", "E1: pulsatile rhythm", "E2: cardiac arrest"]), ] cx = 0.25 for ltr, name, col, pts in cats: cw = 2.55 rect(s, cx, 1.28, cw, 6.0, WHITE, col, 1.2) rect(s, cx, 1.28, cw, 0.9, col) tb(s, cx+0.05, 1.33, 0.75, 0.8, ltr, 34, bold=True, color=WHITE) tb(s, cx+0.72, 1.38, cw-0.8, 0.75, name, 14, bold=True, color=WHITE) for i, pt in enumerate(pts): tb(s, cx+0.12, 2.35+i*0.9, cw-0.2, 0.82, "• "+pt, 11.5, color=TEXT, wrap=True) cx += cw + 0.12 tb(s, 0.25, 7.08, 12.5, 0.38, "New parameters: CPES score | NEWS2 | Serum lactate | Normotensive shock | Respiratory modifiers in C1–C3", 10, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER) # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 3 — Diagnosis # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "Diagnosis", 28, bold=True, color=WHITE) panels = [ ("Imaging", BLUE, ["CTPA: primary modality for confirmed PE", "V/Q scan: preferred in pregnancy & to reduce radiation/contrast", "Echo: RV assessment — drives C2/C3 vs D/E categorization"]), ("Biomarkers", GREEN, ["Troponin + BNP/NT-proBNP now formally in category assignment", "BNP is NEW vs. ESC 2019 (troponin only before)", "Both required for complete risk-tier assignment"]), ("Pre-test Probability", ORANGE, ["Wells score — remains valid", "Revised Geneva score — remains valid", "D-dimer: age-adjusted cutoff (age × 10 mcg/L if >50 yrs)", "Pregnancy-adapted YEARS algorithm (use with caution)"]), ("Empiric Treatment", TEAL, ["If imaging is delayed in suspected Category C2+", "AND bleeding risk is low:", "→ Start therapeutic anticoagulation empirically", "(Class 2a recommendation)"]), ] cx = 0.25 cw = 3.15 for title, col, items in panels: rect(s, cx, 1.28, cw, 5.95, WHITE, col, 1.0) rect(s, cx, 1.28, cw, 0.7, col) tb(s, cx+0.12, 1.33, cw-0.2, 0.62, title, 14, bold=True, color=WHITE) for i, it in enumerate(items): tb(s, cx+0.12, 2.1+i*0.95, cw-0.2, 0.88, "• "+it, 11.5, color=TEXT, wrap=True) cx += cw + 0.2 # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 4 — Anticoagulation # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "Anticoagulation", 28, bold=True, color=WHITE) # LEFT: DOACs rect(s, 0.25, 1.28, 6.15, 6.0, WHITE, BLUE, 1.0) rect(s, 0.25, 1.28, 6.15, 0.7, BLUE) tb(s, 0.4, 1.32, 5.8, 0.62, "DOACs — Preferred First Line (Class 1)", 15, bold=True, color=WHITE) doac_data = [ ("Rivaroxaban / Apixaban", "Oral from Day 1 — no parenteral bridge needed"), ("Dabigatran / Edoxaban", "Require 5–10 days parenteral anticoagulation first"), ] for i, (drug, note) in enumerate(doac_data): ry = 2.1 + i * 1.1 rect(s, 0.35, ry, 5.9, 0.95, RGBColor(0xE8,0xF2,0xFF), BLUE, 0.5) tb(s, 0.5, ry+0.05, 5.6, 0.42, drug, 13, bold=True, color=BLUE) tb(s, 0.5, ry+0.47, 5.6, 0.42, note, 11.5, color=TEXT) rect(s, 0.35, 4.35, 5.9, 0.55, RGBColor(0xFFF3CD)) tb(s, 0.5, 4.38, 5.6, 0.48, "⚠ Antiphospholipid syndrome (thrombotic): VKA over DOAC (Class 1)", 11.5, color=RGBColor(0x7A,0x4A,0x00)) tb(s, 0.4, 5.05, 5.8, 0.38, "When LMWH / UFH preferred instead:", 12, bold=True, color=NAVY) bullets(s, 0.35, 5.42, 5.85, 1.7, ["Pregnancy (DOACs contraindicated — use LMWH throughout)", "Active cancer with GI involvement", "DOAC contraindicated / unavailable", "LMWH preferred over UFH when parenteral therapy needed (Class 1)"], sz=11.5, item_color=TEXT) # RIGHT: Duration rect(s, 6.65, 1.28, 6.45, 6.0, WHITE, GREEN, 1.0) rect(s, 6.65, 1.28, 6.45, 0.7, GREEN) tb(s, 6.8, 1.32, 6.1, 0.62, "Duration & Long-Term Decisions", 15, bold=True, color=WHITE) dur_rows = [ ("Minimum 3 months", "for ALL PE — provoked or unprovoked"), ("Extended / indefinite", "First PE without major reversible risk factor (Class 1);\nrecurrent VTE; active cancer; antiphospholipid syndrome"), ("NOT recommended", "Aspirin is NOT a substitute for anticoagulation"), ] ry = 2.1 for label, note in dur_rows: rect(s, 6.75, ry, 6.2, 1.05, RGBColor(0xE8,0xF7,0xEE), GREEN, 0.5) tb(s, 6.9, ry+0.05, 5.9, 0.42, label, 13, bold=True, color=GREEN) tb(s, 6.9, ry+0.47, 5.9, 0.52, note, 11, color=TEXT, wrap=True) ry += 1.15 # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 5 — Advanced Therapies Matrix # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "Advanced (Reperfusion) Therapies — Treatment Matrix", 26, bold=True, color=WHITE) # table header rect(s, 0.25, 1.28, 12.85, 0.55, NAVY) for txt, xx, ww in [("Category",1.55,0.3),("Preferred Therapy",3.15,5.1),("Class",8.3,1.1),("Notes",9.5,3.5)]: tb(s, xx, 1.32, ww, 0.45, txt, 12, bold=True, color=WHITE) rows = [ ("A – C1", GREEN, "Anticoagulation only", "1 / Class 3", "Do NOT use MT or thrombolysis"), ("C2 – C3", ORANGE, "Anticoag ± Catheter-Directed Therapy (CDT)", "2b", "CDT if deteriorating; C3 MAP <80 mmHg = escalation trigger"), ("D1 – D2", RED, "CDT OR Mechanical Thrombectomy (MT)", "2b", "MT preferred if high bleeding risk (no thrombolysis);\nPEERLESS RCT (2025) informed this"), ("E1", PURPLE, "Systemic Thrombolysis OR MT", "2a", "Surgical embolectomy if available;\nAlteplase 100 mg IV over 2h"), ("E2", RGBColor(0x3A,0x0A,0x4A), "Systemic Thrombolysis + VA-ECMO", "Emergent", "Surgical embolectomy — cardiac arrest scenario"), ] ry = 1.83 for cat, col, therapy, cls, note in rows: rh = 0.97 rect(s, 0.25, ry, 1.25, rh, col) tb(s, 0.3, ry+0.28, 1.1, 0.42, cat, 13, bold=True, color=WHITE, align=PP_ALIGN.CENTER) rect(s, 1.5, ry, 6.7, rh, WHITE, col, 0.5) tb(s, 1.6, ry+0.22, 6.5, 0.58, therapy, 12, bold=True, color=col, wrap=True) rect(s, 8.2, ry, 1.2, rh, RGBColor(0xF0,0xF4,0xF8), col, 0.5) tb(s, 8.25, ry+0.25, 1.1, 0.5, cls, 12, bold=True, color=col, align=PP_ALIGN.CENTER) rect(s, 9.4, ry, 3.65, rh, RGBColor(0xF5,0xF5,0xF5), MID_GRAY, 0.3) tb(s, 9.5, ry+0.14, 3.5, 0.75, note, 10.5, color=TEXT, wrap=True) ry += rh + 0.05 tb(s, 0.25, 6.82, 12.5, 0.42, "MT = Mechanical Thrombectomy | CDT = Catheter-Directed Thrombolysis | PEERLESS RCT 2025: large-bore MT vs. CDT in intermediate-high risk PE", 9.5, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER) # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 6 — PERTs + Outpatient Management # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "PERTs & Outpatient Management", 28, bold=True, color=WHITE) # PERT panel rect(s, 0.25, 1.28, 6.1, 6.0, WHITE, RED, 1.0) rect(s, 0.25, 1.28, 6.1, 0.72, RED) tb(s, 0.4, 1.32, 5.7, 0.65, "Pulmonary Embolism Response Teams (PERTs)", 14.5, bold=True, color=WHITE) rect(s, 0.35, 2.1, 5.85, 0.52, RGBColor(0xFF,0xEB,0xEB)) tb(s, 0.45, 2.14, 5.7, 0.44, "CLASS 1 RECOMMENDATION — Upgraded from ESC 2019 (merely 'mentioned')", 12, bold=True, color=RED) bullets(s, 0.35, 2.72, 5.85, 4.4, ["Multidisciplinary rapid-response team", "Members: Cardiology, Pulmonology, EM, Hematology, IR, CT Surgery", "Activated for Category C2+ (intermediate & high-risk PE)", "Provides rapid, coordinated treatment decisions", "Demonstrated to improve timeliness of care"], sz=12.5) # Outpatient panel rect(s, 6.65, 1.28, 6.45, 6.0, WHITE, BLUE, 1.0) rect(s, 6.65, 1.28, 6.45, 0.72, BLUE) tb(s, 6.8, 1.32, 6.1, 0.65, "Outpatient / Early Discharge (NEW Explicit Criteria)", 14.5, bold=True, color=WHITE) rect(s, 6.75, 2.1, 6.25, 0.52, RGBColor(0xE8,0xF2,0xFF)) tb(s, 6.85, 2.14, 6.05, 0.44, "Category A/B patients may be discharged from the ED", 12, bold=True, color=BLUE) bullets(s, 6.75, 2.72, 6.25, 2.25, ["No significant comorbidity", "Reliable follow-up available", "DOAC access confirmed"], sz=12.5) tb(s, 6.8, 5.05, 6.1, 0.38, "Discharge decision tools:", 12, bold=True, color=NAVY) bullets(s, 6.75, 5.42, 6.25, 0.65, ["Hestia criteria", "sPESI score"], sz=12.5) rect(s, 6.75, 6.18, 6.25, 0.82, RGBColor(0xE8,0xF7,0xEE), GREEN, 0.5) tb(s, 6.85, 6.22, 6.05, 0.72, "Post-PE clinic at 3–6 months\nScreen for CTEPH with echo → V/Q → right heart cath", 11.5, color=GREEN, wrap=True) # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 7 — Special Populations # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "Special Populations", 28, bold=True, color=WHITE) pops = [ ("Pregnancy", TEAL, ["LMWH throughout gestation — DOACs are contraindicated", "CTPA preferred over V/Q if imaging needed", "Systemic thrombolysis only for life-threatening PE", "Pregnancy-adapted YEARS algorithm — use with caution"]), ("Active Cancer", BLUE, ["LMWH or DOACs (edoxaban / rivaroxaban) preferred", "Caution with luminal GI malignancy — high bleeding risk", "Reassess anticoagulation at each visit"]), ("Renal Impairment", ORANGE, ["Use UFH or dose-adjusted LMWH", "Avoid dabigatran if eGFR < 30 mL/min", "Dose-adjust other DOACs per renal function"]), ("Right Heart Thrombus", RED, ["Anticoagulation alone = high mortality", "Consider systemic thrombolysis or surgical removal", "Decision based on hemodynamic status"]), ("Long-Haul Travel", PURPLE, ["For prior PE patients NOT on anticoagulation", "Single prophylactic DOAC or LMWH dose on day of travel", "Class 2b recommendation"]), ] cx = 0.25 cw = 2.52 for pop, col, items in pops: rect(s, cx, 1.28, cw, 6.0, WHITE, col, 1.0) rect(s, cx, 1.28, cw, 0.72, col) tb(s, cx+0.1, 1.33, cw-0.15, 0.62, pop, 13, bold=True, color=WHITE, wrap=True) for i, it in enumerate(items): tb(s, cx+0.1, 2.12+i*0.98, cw-0.18, 0.9, "• "+it, 11.5, color=TEXT, wrap=True) cx += cw + 0.12 # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 8 — ESC 2019 vs AHA/ACC 2026 # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "ESC 2019 vs. AHA/ACC 2026: Key Differences", 26, bold=True, color=WHITE) # header row rect(s, 0.25, 1.28, 12.85, 0.58, NAVY) tb(s, 0.35, 1.33, 4.2, 0.48, "Feature", 13, bold=True, color=WHITE) tb(s, 4.65, 1.33, 4.1, 0.48, "ESC 2019", 13, bold=True, color=RGBColor(0xAA,0xCC,0xFF)) tb(s, 8.85, 1.33, 4.1, 0.48, "AHA/ACC 2026", 13, bold=True, color=RGBColor(0xAA,0xFF,0xCC)) compare = [ ("Risk Classification", "Low / Intermediate-low /\nIntermediate-high / High", "New 5-tier A–E system with subcategories"), ("BNP in Risk Stratification","Supplementary only", "Formally incorporated into category assignment"), ("PERTs", "Mentioned", "Class 1 Recommendation (major upgrade)"), ("MT for Intermediate Risk", "Not addressed", "Class 2b for D1–D2"), ("Normotensive Shock", "Not explicitly defined", "Explicitly categorized as Category D"), ("Outpatient Management", "Limited guidance", "Explicit ED discharge criteria (Hestia / sPESI)"), ("Long-haul Travel PE Ppx", "Not specifically addressed", "Class 2b — single-dose DOAC/LMWH on travel day"), ] rowcols = [WHITE, RGBColor(0xF0,0xF4,0xF8)] ry = 1.86 for i, (feat, old, new_) in enumerate(compare): rh = 0.74 bg_c = rowcols[i % 2] rect(s, 0.25, ry, 4.3, rh, bg_c, MID_GRAY, 0.3) tb(s, 0.35, ry+0.1, 4.1, 0.58, feat, 11.5, bold=True, color=TEXT, wrap=True) rect(s, 4.55, ry, 4.2, rh, bg_c, MID_GRAY, 0.3) tb(s, 4.65, ry+0.1, 4.0, 0.58, old, 11, color=RED, italic=True, wrap=True) rect(s, 8.75, ry, 4.3, rh, bg_c, MID_GRAY, 0.3) tb(s, 8.85, ry+0.1, 4.1, 0.58, new_, 11, color=GREEN, bold=True, wrap=True) ry += rh + 0.03 # ═══════════════════════════════════════════════════════════════════════════════ # SLIDE 9 — Top 10 Take-Home Messages # ═══════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) rect(s, 0, 6.88, 13.333, 0.62, RGBColor(0x08,0x18,0x38)) tb(s, 0.25, 0.18, 12.5, 0.75, "Top 10 Official Take-Home Messages (AHA/ACC 2026)", 26, bold=True, color=WHITE) messages = [ ("1", "New A–E Classification", "5-tier system replaces Low/Intermediate/High — enhances precision for all management decisions"), ("2", "Prompt Diagnosis & Rx", "Empiric anticoagulation when imaging is delayed (Category C2+, low bleeding risk) — Class 2a"), ("3", "LMWH over UFH", "When parenteral anticoagulation is needed, LMWH is preferred over UFH — Class 1"), ("4", "DOACs over VKAs", "Direct oral anticoagulants preferred for eligible patients to reduce recurrence & major bleeding — Class 1"), ("5", "Advanced Therapies — E + D", "Thrombolysis / MT / CDT / embolectomy appropriate for E1; can be considered for D1–D2"), ("6", "PERTs = Class 1", "Multidisciplinary PE response teams recommended for all intermediate/high-risk PE"), ("7", "Outpatient for A/B", "Category A/B with DOAC access + reliable follow-up can go home from the ED"), ("8", "Extended Anticoagulation", "First unprovoked PE without major reversible risk factor → continue anticoagulation beyond 3–6 months"), ("9", "CTEPH Surveillance", "Screen all PE survivors for symptoms at every visit × 1 year; echo at 3–6 months"), ("10", "Address Disparities", "Guideline specifically calls out gaps in PE management across sex, race, and socioeconomic status"), ] cols_x = [0.25, 6.7] for i, (num, title, msg) in enumerate(messages): col = i % 2 row = i // 2 cx2 = cols_x[col] cy2 = 1.15 + row * 1.16 cw2 = 6.2 rect(s, cx2, cy2, cw2, 1.08, RGBColor(0x10,0x2A,0x58)) rect(s, cx2, cy2, 0.6, 1.08, BLUE) tb(s, cx2+0.04, cy2+0.32, 0.55, 0.44, num, 14, bold=True, color=WHITE, align=PP_ALIGN.CENTER) tb(s, cx2+0.7, cy2+0.06, cw2-0.8, 0.42, title, 13, bold=True, color=RGBColor(0x7E,0xC8,0xFF)) tb(s, cx2+0.7, cy2+0.5, cw2-0.8, 0.55, msg, 10.5, color=RGBColor(0xCC,0xDD,0xEE), wrap=True) tb(s, 0.25, 7.0, 12.5, 0.40, "Source: Circulation 2026;153:e977–e1051 & JACC 2026 | doi: 10.1161/CIR.0000000000001415 | PMID 41712677", 9, italic=True, color=RGBColor(0x55,0x75,0x9A), align=PP_ALIGN.CENTER) # ─── Save ───────────────────────────────────────────────────────────────────── out = "/tmp/workspace/pe-slides2/PE_Guidelines_2026.pptx" buf = BytesIO() prs.save(buf) with open(out, "wb") as f: f.write(buf.getvalue()) print(f"Done: {out}") PYEOF
cd /tmp/workspace/pe-slides2 && python3 -c " from pptx.dml.color import RGBColor # test — find which call breaks colors = [ ('NAVY', RGBColor(0x0D, 0x2B, 0x55)), ('TEAL', RGBColor(0x0E, 0x7C, 0x86)), ('OFF_WHITE', RGBColor(0xF5, 0xF7, 0xFA)), ('LIGHT_BLUE', RGBColor(0xD6, 0xE8, 0xF7)), ('MID_GRAY', RGBColor(0x70, 0x7F, 0x8B)), ('TEXT', RGBColor(0x1E, 0x2A, 0x38)), ] for name, c in colors: print(f'{name}: ok') "
python3 << 'PYEOF' from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from io import BytesIO import os os.makedirs("/tmp/workspace/pe-slides2", exist_ok=True) # ── Palette ────────────────────────────────────────────────────────────────── NAVY = RGBColor(0x0D, 0x2B, 0x55) BLUE = RGBColor(0x1A, 0x5F, 0x9E) RED = RGBColor(0xC0, 0x39, 0x2B) GREEN = RGBColor(0x1A, 0x8A, 0x5A) ORANGE = RGBColor(0xE6, 0x7E, 0x22) PURPLE = RGBColor(0x6C, 0x35, 0x7B) TEAL = RGBColor(0x0E, 0x7C, 0x86) DPURP = RGBColor(0x3A, 0x0A, 0x4A) WHITE = RGBColor(0xFF, 0xFF, 0xFF) OFF_WHITE = RGBColor(0xF5, 0xF7, 0xFA) MID_GRAY = RGBColor(0x70, 0x7F, 0x8B) TEXT = RGBColor(0x1E, 0x2A, 0x38) CREAM = RGBColor(0xFF, 0xF3, 0xCD) LBLUE = RGBColor(0xE8, 0xF2, 0xFF) LGREEN = RGBColor(0xE8, 0xF7, 0xEE) LRED = RGBColor(0xFF, 0xEB, 0xEB) LGRAY = RGBColor(0xF0, 0xF4, 0xF8) DARK_ROW = RGBColor(0x10, 0x2A, 0x58) BTM_BAR = RGBColor(0x08, 0x18, 0x38) SUB_BLUE = RGBColor(0x7E, 0xB8, 0xE8) SUB_BLUE2 = RGBColor(0xAA, 0xCC, 0xFF) SUB_GRN = RGBColor(0xAA, 0xFF, 0xCC) PALE_NAVY = RGBColor(0x10, 0x2A, 0x58) CARD_TXT = RGBColor(0xCC, 0xDD, 0xEE) CITE_COL = RGBColor(0x55, 0x75, 0x9A) AMBER_TXT = RGBColor(0x7A, 0x4A, 0x00) LIGHT_CARD= RGBColor(0xB0, 0xCC, 0xE8) LINK_BLUE = RGBColor(0x7E, 0xC8, 0xFF) prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) BL = prs.slide_layouts[6] # ── helpers ─────────────────────────────────────────────────────────────────── def bg(slide, color): slide.background.fill.solid() slide.background.fill.fore_color.rgb = color def rect(slide, x, y, w, h, fill, line=None, lw=0.5): sh = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h)) sh.fill.solid(); sh.fill.fore_color.rgb = fill if line: sh.line.color.rgb = line; sh.line.width = Pt(lw) else: sh.line.fill.background() return sh def tb(slide, x, y, w, h, text, sz, bold=False, color=TEXT, align=PP_ALIGN.LEFT, italic=False, wrap=True): t = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = t.text_frame; tf.word_wrap = wrap tf.vertical_anchor = MSO_ANCHOR.TOP tf.margin_left=0; tf.margin_right=0; tf.margin_top=Pt(2); tf.margin_bottom=0 p = tf.paragraphs[0]; p.alignment = align r = p.add_run(); r.text = text r.font.size=Pt(sz); r.font.bold=bold; r.font.italic=italic r.font.color.rgb=color; r.font.name="Calibri" return t def blist(slide, x, y, w, h, items, sz=12, col=TEXT): t = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = t.text_frame; tf.word_wrap=True tf.margin_left=Pt(6); tf.margin_right=Pt(4) tf.margin_top=Pt(4); tf.margin_bottom=Pt(4) for i, item in enumerate(items): p = tf.paragraphs[0] if i==0 else tf.add_paragraph() p.alignment=PP_ALIGN.LEFT; p.space_before=Pt(3) r = p.add_run(); r.text="• "+item r.font.size=Pt(sz); r.font.color.rgb=col; r.font.name="Calibri" # ════════════════════════════ SLIDE 1 — Title ═════════════════════════════════ s = prs.slides.add_slide(BL) bg(s, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) rect(s, 0, 6.85, 13.333, 0.65, BTM_BAR) tb(s, 0.3, 1.3, 12.5, 0.65, "2026 AHA / ACC / ACCP / ACEP / CHEST — FIRST-EVER DEDICATED GUIDELINE", 13, color=SUB_BLUE, align=PP_ALIGN.CENTER) tb(s, 0.3, 1.95, 12.5, 1.55, "Pulmonary Embolism", 54, bold=True, color=WHITE, align=PP_ALIGN.CENTER) tb(s, 0.3, 3.5, 12.5, 0.65, "New Guidelines: Evaluation & Management of Acute PE in Adults", 21, color=LIGHT_CARD, align=PP_ALIGN.CENTER) tb(s, 0.3, 4.22, 12.5, 0.5, "Published in Circulation & JACC | February 19, 2026 | PMID 41712677", 13, italic=True, color=RGBColor(0x70, 0x98, 0xC0), align=PP_ALIGN.CENTER) rect(s, 4.5, 5.1, 4.35, 0.55, RED) tb(s, 4.5, 5.13, 4.35, 0.48, "Replaces ESC 2019 — Major Practice Change", 12, bold=True, color=WHITE, align=PP_ALIGN.CENTER) # ════════════════════════════ SLIDE 2 — Classification ════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.17, 13, 0.75, "The Biggest Change: New 5-Tier Clinical Classification (A–E)", 25, bold=True, color=WHITE) tb(s, 0.25, 0.83, 13, 0.28, "Replaces Low/Intermediate/High risk — adds physiological subcategories & normotensive shock", 11.5, italic=True, color=SUB_BLUE2) cats = [ ("A", "At Risk", GREEN, ["No acute PE yet","Risk factors present","Prophylaxis focus"]), ("B", "Mild", BLUE, ["Hemodynamically stable","No RV strain","Low severity score"]), ("C", "Intermediate", ORANGE, ["C1: elevated score, normal RV + biomarkers", "C2: RV dysfunction OR abnormal biomarkers", "C3: BOTH RV dysfunction AND biomarkers", "Resp modifier if SpO2 <90%"]), ("D", "Deteriorating",RED, ["Normotensive shock","Rapid clinical deterioration", "D1 and D2 subcategories","NEW vs. ESC 2019"]), ("E", "Extremis", PURPLE, ["Overt hemodynamic collapse","Cardiac arrest", "E1: pulsatile rhythm","E2: cardiac arrest"]), ] cx = 0.25 cw = 2.55 for ltr, name, col, pts in cats: rect(s, cx, 1.28, cw, 6.0, WHITE, col, 1.2) rect(s, cx, 1.28, cw, 0.9, col) tb(s, cx+0.05, 1.33, 0.75, 0.8, ltr, 34, bold=True, color=WHITE) tb(s, cx+0.72, 1.38, cw-0.82, 0.72, name, 14, bold=True, color=WHITE) for i, pt in enumerate(pts): tb(s, cx+0.12, 2.35+i*0.92, cw-0.22, 0.85, "• "+pt, 11.5, color=TEXT, wrap=True) cx += cw + 0.12 tb(s, 0.25, 7.08, 12.5, 0.38, "New parameters incorporated: CPES score | NEWS2 | Serum lactate | Normotensive shock | Respiratory modifiers in C1–C3", 10, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER) # ════════════════════════════ SLIDE 3 — Diagnosis ════════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "Diagnosis", 28, bold=True, color=WHITE) panels = [ ("Imaging", BLUE, ["CTPA: primary modality for confirmed PE", "V/Q scan: preferred in pregnancy & reduced radiation/contrast", "Echo: RV assessment — drives C2/C3 vs D/E categorization"]), ("Biomarkers", GREEN, ["Troponin + BNP/NT-proBNP now formally in category assignment", "BNP is NEW vs. ESC 2019 (troponin only before)", "Both required for complete risk-tier assignment"]), ("Pre-test Probability", ORANGE, ["Wells score — remains valid", "Revised Geneva score — remains valid", "D-dimer: age-adjusted cutoff (age x 10 mcg/L if >50 yrs)", "Pregnancy-adapted YEARS algorithm (use with caution)"]), ("Empiric Treatment", TEAL, ["If imaging is delayed in suspected Category C2+", "AND bleeding risk is low:", "Start therapeutic anticoagulation empirically", "(Class 2a recommendation)"]), ] cx = 0.25 cw = 3.15 for title, col, items in panels: rect(s, cx, 1.28, cw, 5.95, WHITE, col, 1.0) rect(s, cx, 1.28, cw, 0.7, col) tb(s, cx+0.12, 1.33, cw-0.22, 0.62, title, 14, bold=True, color=WHITE) for i, it in enumerate(items): tb(s, cx+0.12, 2.1+i*0.95, cw-0.22, 0.88, "• "+it, 11.5, color=TEXT, wrap=True) cx += cw + 0.2 # ════════════════════════════ SLIDE 4 — Anticoagulation ══════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "Anticoagulation", 28, bold=True, color=WHITE) # LEFT panel rect(s, 0.25, 1.28, 6.15, 6.0, WHITE, BLUE, 1.0) rect(s, 0.25, 1.28, 6.15, 0.7, BLUE) tb(s, 0.4, 1.32, 5.8, 0.62, "DOACs — Preferred First Line (Class 1)", 15, bold=True, color=WHITE) doac_rows = [ ("Rivaroxaban / Apixaban", "Oral from Day 1 — no parenteral bridge needed"), ("Dabigatran / Edoxaban", "Require 5–10 days parenteral anticoagulation first"), ] for i, (drug, note) in enumerate(doac_rows): ry = 2.1 + i * 1.1 rect(s, 0.35, ry, 5.9, 0.95, LBLUE, BLUE, 0.5) tb(s, 0.5, ry+0.05, 5.6, 0.42, drug, 13, bold=True, color=BLUE) tb(s, 0.5, ry+0.47, 5.6, 0.42, note, 11.5, color=TEXT) rect(s, 0.35, 4.35, 5.9, 0.55, CREAM) tb(s, 0.5, 4.38, 5.6, 0.48, "Antiphospholipid syndrome (thrombotic): VKA preferred over DOAC — Class 1", 11.5, color=AMBER_TXT) tb(s, 0.4, 5.05, 5.8, 0.38, "When LMWH / UFH preferred instead:", 12, bold=True, color=NAVY) blist(s, 0.35, 5.43, 5.85, 1.7, ["Pregnancy (DOACs contraindicated — LMWH throughout)", "Active cancer with GI involvement", "DOAC contraindicated / unavailable", "LMWH preferred over UFH when parenteral therapy needed (Class 1)"], sz=11.5) # RIGHT panel rect(s, 6.65, 1.28, 6.45, 6.0, WHITE, GREEN, 1.0) rect(s, 6.65, 1.28, 6.45, 0.7, GREEN) tb(s, 6.8, 1.32, 6.1, 0.62, "Duration & Long-Term Decisions", 15, bold=True, color=WHITE) dur_rows = [ ("Minimum 3 months", "for ALL PE — provoked or unprovoked"), ("Extended / indefinite", "First PE without major reversible risk factor (Class 1);\nrecurrent VTE, active cancer, antiphospholipid syndrome"), ("NOT recommended", "Aspirin is NOT a substitute for anticoagulation"), ] ry = 2.1 for label, note in dur_rows: rect(s, 6.75, ry, 6.2, 1.05, LGREEN, GREEN, 0.5) tb(s, 6.9, ry+0.05, 5.9, 0.42, label, 13, bold=True, color=GREEN) tb(s, 6.9, ry+0.47, 5.9, 0.52, note, 11, color=TEXT, wrap=True) ry += 1.17 # ════════════════════════════ SLIDE 5 — Advanced Therapies ═══════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "Advanced (Reperfusion) Therapies — Treatment Matrix", 26, bold=True, color=WHITE) rect(s, 0.25, 1.28, 12.85, 0.55, NAVY) tb(s, 1.5, 1.32, 0.35, 0.45, "Category", 12, bold=True, color=WHITE) tb(s, 1.9, 1.32, 6.2, 0.45, "Preferred Therapy", 12, bold=True, color=WHITE) tb(s, 8.2, 1.32, 1.15, 0.45, "Class", 12, bold=True, color=WHITE) tb(s, 9.45, 1.32, 3.5, 0.45, "Notes", 12, bold=True, color=WHITE) rows5 = [ ("A – C1", GREEN, "Anticoagulation only", "1 / 3", "Class 3: do NOT use MT or thrombolysis"), ("C2 – C3", ORANGE, "Anticoag +/- Catheter-Directed Therapy", "2b", "CDT if deteriorating; C3 MAP <80 mmHg = escalation trigger"), ("D1 – D2", RED, "CDT OR Mechanical Thrombectomy (MT)", "2b", "MT preferred if high bleeding risk; PEERLESS RCT 2025 informed"), ("E1", PURPLE, "Systemic Thrombolysis OR MT", "2a", "Surgical embolectomy if available; alteplase 100 mg IV over 2h"), ("E2", DPURP, "Systemic Thrombolysis + VA-ECMO", "Emergent", "Surgical embolectomy — cardiac arrest scenario"), ] ry = 1.83 for cat, col, therapy, cls, note in rows5: rh = 0.97 rect(s, 0.25, ry, 1.2, rh, col) tb(s, 0.3, ry+0.27, 1.1, 0.44, cat, 13, bold=True, color=WHITE, align=PP_ALIGN.CENTER) rect(s, 1.45, ry, 6.7, rh, WHITE, col, 0.5) tb(s, 1.58, ry+0.22, 6.5, 0.58, therapy, 12, bold=True, color=col, wrap=True) rect(s, 8.15, ry, 1.22, rh, LGRAY, col, 0.5) tb(s, 8.2, ry+0.27, 1.1, 0.44, cls, 12, bold=True, color=col, align=PP_ALIGN.CENTER) rect(s, 9.37, ry, 3.68, rh, OFF_WHITE, MID_GRAY, 0.3) tb(s, 9.47, ry+0.12, 3.5, 0.78, note, 10.5, color=TEXT, wrap=True) ry += rh + 0.05 tb(s, 0.25, 6.83, 12.5, 0.42, "MT = Mechanical Thrombectomy | CDT = Catheter-Directed Thrombolysis | PEERLESS RCT 2025: large-bore MT vs. CDT in intermediate-high risk PE", 9.5, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER) # ════════════════════════════ SLIDE 6 — PERTs + Outpatient ═══════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "PERTs & Outpatient Management", 28, bold=True, color=WHITE) # PERT rect(s, 0.25, 1.28, 6.1, 6.0, WHITE, RED, 1.0) rect(s, 0.25, 1.28, 6.1, 0.72, RED) tb(s, 0.4, 1.32, 5.7, 0.65, "Pulmonary Embolism Response Teams (PERTs)", 14.5, bold=True, color=WHITE) rect(s, 0.35, 2.1, 5.85, 0.52, LRED) tb(s, 0.45, 2.14, 5.7, 0.44, "CLASS 1 RECOMMENDATION — Upgraded from ESC 2019 (merely 'mentioned')", 12, bold=True, color=RED) blist(s, 0.35, 2.72, 5.85, 4.4, ["Multidisciplinary rapid-response team", "Members: Cardiology, Pulmonology, EM, Hematology, IR, CT Surgery", "Activated for Category C2+ (intermediate & high-risk PE)", "Provides rapid, coordinated treatment decisions", "Demonstrated to improve timeliness of care"], sz=12.5) # Outpatient rect(s, 6.65, 1.28, 6.45, 6.0, WHITE, BLUE, 1.0) rect(s, 6.65, 1.28, 6.45, 0.72, BLUE) tb(s, 6.8, 1.32, 6.1, 0.65, "Outpatient / Early Discharge (New Explicit Criteria)", 14.5, bold=True, color=WHITE) rect(s, 6.75, 2.1, 6.25, 0.52, LBLUE) tb(s, 6.85, 2.14, 6.05, 0.44, "Category A/B patients may be safely discharged from the ED", 12, bold=True, color=BLUE) blist(s, 6.75, 2.72, 6.25, 1.85, ["No significant comorbidity", "Reliable follow-up available", "DOAC access confirmed"], sz=12.5) tb(s, 6.8, 4.68, 6.1, 0.38, "Discharge decision tools:", 12, bold=True, color=NAVY) blist(s, 6.75, 5.05, 6.25, 0.62, ["Hestia criteria", "sPESI score"], sz=12.5) rect(s, 6.75, 5.8, 6.25, 1.2, LGREEN, GREEN, 0.5) tb(s, 6.85, 5.85, 6.05, 1.1, "Post-PE follow-up clinic at 3–6 months\nScreen for CTEPH: Echo -> V/Q scan -> Right heart catheterization if suspected\nAsk about symptoms at every visit x 1 year", 11, color=GREEN, wrap=True) # ════════════════════════════ SLIDE 7 — Special Populations ══════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "Special Populations", 28, bold=True, color=WHITE) pops = [ ("Pregnancy", TEAL, ["LMWH throughout — DOACs are contraindicated", "CTPA preferred over V/Q if imaging needed", "Systemic thrombolysis only for life-threatening PE", "YEARS algorithm — use with caution"]), ("Active Cancer", BLUE, ["LMWH or DOACs (edoxaban / rivaroxaban)", "Caution with luminal GI malignancy — high bleeding risk", "Reassess anticoagulation at each visit"]), ("Renal Impairment", ORANGE, ["UFH or dose-adjusted LMWH preferred", "Avoid dabigatran if eGFR < 30 mL/min", "Dose-adjust other DOACs per renal function"]), ("Right Heart Thrombus",RED, ["Anticoagulation alone = high mortality", "Consider systemic thrombolysis or surgical removal", "Decision guided by hemodynamic status"]), ("Long-Haul Travel", PURPLE, ["For prior PE patients NOT on anticoagulation", "Single prophylactic DOAC or LMWH on day of travel", "Class 2b recommendation"]), ] cx = 0.25 cw = 2.52 for pop, col, items in pops: rect(s, cx, 1.28, cw, 6.0, WHITE, col, 1.0) rect(s, cx, 1.28, cw, 0.72, col) tb(s, cx+0.1, 1.32, cw-0.18, 0.65, pop, 13, bold=True, color=WHITE, wrap=True) for i, it in enumerate(items): tb(s, cx+0.1, 2.12+i*0.98, cw-0.18, 0.9, "• "+it, 11.5, color=TEXT, wrap=True) cx += cw + 0.12 # ════════════════════════════ SLIDE 8 — ESC vs AHA ═══════════════════════════ s = prs.slides.add_slide(BL) bg(s, OFF_WHITE) rect(s, 0, 0, 13.333, 1.12, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) tb(s, 0.25, 0.18, 13, 0.8, "ESC 2019 vs. AHA/ACC 2026: Key Differences", 26, bold=True, color=WHITE) rect(s, 0.25, 1.28, 12.85, 0.58, NAVY) tb(s, 0.35, 1.33, 4.2, 0.48, "Feature", 13, bold=True, color=WHITE) tb(s, 4.65, 1.33, 4.1, 0.48, "ESC 2019", 13, bold=True, color=SUB_BLUE2) tb(s, 8.85, 1.33, 4.1, 0.48, "AHA/ACC 2026", 13, bold=True, color=SUB_GRN) compare = [ ("Risk Classification", "Low / Intermediate-low /\nIntermediate-high / High", "New 5-tier A-E system with subcategories"), ("BNP in Risk Stratification", "Supplementary only", "Formally incorporated into category assignment"), ("PERTs", "Mentioned", "Class 1 Recommendation (major upgrade)"), ("MT for Intermediate Risk", "Not addressed", "Class 2b for D1-D2 (PEERLESS RCT 2025)"), ("Normotensive Shock", "Not explicitly defined", "Explicitly categorized as Category D"), ("Outpatient Management", "Limited guidance", "Explicit ED discharge criteria (Hestia / sPESI)"), ("Long-haul Travel Ppx", "Not specifically addressed", "Class 2b: single-dose DOAC/LMWH on travel day"), ] rowcols = [WHITE, LGRAY] ry = 1.86 for i, (feat, old, new_) in enumerate(compare): rh = 0.74 bgc = rowcols[i % 2] rect(s, 0.25, ry, 4.3, rh, bgc, MID_GRAY, 0.3) tb(s, 0.35, ry+0.1, 4.1, 0.58, feat, 11.5, bold=True, color=TEXT, wrap=True) rect(s, 4.55, ry, 4.2, rh, bgc, MID_GRAY, 0.3) tb(s, 4.65, ry+0.1, 4.0, 0.58, old, 11, color=RED, italic=True, wrap=True) rect(s, 8.75, ry, 4.3, rh, bgc, MID_GRAY, 0.3) tb(s, 8.85, ry+0.1, 4.1, 0.58, new_, 11, color=GREEN, bold=True, wrap=True) ry += rh + 0.03 # ════════════════════════════ SLIDE 9 — Top 10 Messages ══════════════════════ s = prs.slides.add_slide(BL) bg(s, NAVY) rect(s, 0, 0, 0.1, 7.5, RED) rect(s, 0, 6.88, 13.333, 0.62, BTM_BAR) tb(s, 0.25, 0.18, 12.5, 0.75, "Top 10 Official Take-Home Messages (AHA/ACC 2026)", 26, bold=True, color=WHITE) messages = [ ("1", "New A-E Classification", "5-tier system replaces Low/Intermediate/High — precision for all management decisions"), ("2", "Prompt Diagnosis & Rx", "Empiric anticoagulation when imaging is delayed (Category C2+, low bleeding risk) — Class 2a"), ("3", "LMWH over UFH", "When parenteral therapy is needed, LMWH is preferred over UFH — Class 1"), ("4", "DOACs over VKAs", "Direct oral anticoagulants preferred for eligible patients — reduce recurrence & major bleeding"), ("5", "Advanced Therapies D+E", "Thrombolysis / MT / CDT / embolectomy appropriate for E1; consider for D1-D2"), ("6", "PERTs = Class 1", "Multidisciplinary PE response teams recommended for all intermediate/high-risk PE"), ("7", "Outpatient for A/B", "Category A/B with DOAC access + reliable follow-up can go home from the ED"), ("8", "Extended Anticoagulation", "First unprovoked PE without major reversible risk factor: continue beyond 3-6 months"), ("9", "CTEPH Surveillance", "Screen all PE survivors for symptoms at every visit x 1 year; echo at 3-6 months"), ("10", "Address Disparities", "Guideline explicitly calls out gaps across sex, race, and socioeconomic status"), ] cols_x = [0.25, 6.7] for i, (num, title, msg) in enumerate(messages): col = i % 2 row = i // 2 cx2 = cols_x[col] cy2 = 1.15 + row * 1.17 cw2 = 6.2 rect(s, cx2, cy2, cw2, 1.08, DARK_ROW) rect(s, cx2, cy2, 0.6, 1.08, BLUE) tb(s, cx2+0.04, cy2+0.32, 0.55, 0.44, num, 14, bold=True, color=WHITE, align=PP_ALIGN.CENTER) tb(s, cx2+0.7, cy2+0.06, cw2-0.8, 0.42, title, 13, bold=True, color=LINK_BLUE) tb(s, cx2+0.7, cy2+0.5, cw2-0.8, 0.55, msg, 10.5, color=CARD_TXT, wrap=True) tb(s, 0.25, 7.02, 12.5, 0.40, "Source: Circulation 2026;153:e977-e1051 & JACC 2026 | doi:10.1161/CIR.0000000000001415 | PMID 41712677", 9, italic=True, color=CITE_COL, align=PP_ALIGN.CENTER) # ─── Save ───────────────────────────────────────────────────────────────────── out = "/tmp/workspace/pe-slides2/PE_Guidelines_2026.pptx" buf = BytesIO() prs.save(buf) with open(out, "wb") as f: f.write(buf.getvalue()) print(f"Saved: {out} ({os.path.getsize(out):,} bytes)") PYEOF
PE Guidelines 2026
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title - 2026 AHA/ACC first-ever dedicated PE guideline |
| 2 | New 5-Tier A-E Classification - color-coded cards with subcategories |
| 3 | Diagnosis - Imaging, Biomarkers, Pre-test probability, Empiric treatment |
| 4 | Anticoagulation - DOACs first-line, duration, special considerations |
| 5 | Advanced Therapies Matrix - table mapping Category A-E to therapy + evidence class |
| 6 | PERTs & Outpatient Management - Class 1 PERT upgrade + ED discharge criteria |
| 7 | Special Populations - Pregnancy, Cancer, Renal, Right heart thrombus, Travel |
| 8 | ESC 2019 vs AHA/ACC 2026 - side-by-side comparison table |
| 9 | Top 10 Official Take-Home Messages - numbered cards on dark background |