Oncological emergancies ppt with 20 plus slides from standard critical care textbooks
mkdir -p /tmp/workspace/oncological-emergencies && ls /tmp/workspace/oncological-emergencies/
~/oncological-emergencies/build_pptx.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 io import BytesIO
# ─── Colour Palette ────────────────────────────────────────────────────────────
DARK_NAVY = RGBColor(0x0D, 0x1B, 0x3E) # slide background / title bar
TEAL = RGBColor(0x00, 0x8B, 0x8B) # accent / sub-headings
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_GRAY = RGBColor(0xF2, 0xF4, 0xF7)
RED_ALERT = RGBColor(0xC0, 0x39, 0x2B)
YELLOW_HL = RGBColor(0xFF, 0xD7, 0x00)
TEXT_DARK = RGBColor(0x1A, 0x1A, 0x2E)
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 layout
# ═══════════════════════════════════════════════════════════════════════════════
# HELPERS
# ═══════════════════════════════════════════════════════════════════════════════
def add_rect(slide, x, y, w, h, fill_color, transparency=0):
shape = slide.shapes.add_shape(
1, # MSO_SHAPE_TYPE.RECTANGLE
x, y, w, h
)
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
shape.line.fill.background()
if transparency:
shape.fill.fore_color.theme_color = None
return shape
def add_text_box(slide, x, y, w, h, text, font_size=18, bold=False,
color=WHITE, align=PP_ALIGN.LEFT, wrap=True, italic=False):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.02)
tf.margin_bottom= Inches(0.02)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
run.font.name = "Calibri"
return tb
def add_multiline_textbox(slide, x, y, w, h, lines, font_size=16,
color=WHITE, bold_first=False, bullet_char="▸ "):
"""lines = list of strings; first item optionally bolded."""
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.08)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.04)
tf.margin_bottom= Inches(0.02)
for i, line in enumerate(lines):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.space_before = Pt(2)
run = p.add_run()
prefix = "" if (bold_first and i == 0) else bullet_char
run.text = prefix + line
run.font.size = Pt(font_size)
run.font.bold = (bold_first and i == 0)
run.font.color.rgb = color
run.font.name = "Calibri"
return tb
def standard_slide(title_text, subtitle_text=None):
"""Creates a new slide with the dark header bar and returns (slide, y_start)."""
slide = prs.slides.add_slide(blank)
# full bg
add_rect(slide, 0, 0, W, H, LIGHT_GRAY)
# header bar
add_rect(slide, 0, 0, W, Inches(1.15), DARK_NAVY)
# teal accent strip
add_rect(slide, 0, Inches(1.15), W, Inches(0.06), TEAL)
# title
add_text_box(slide, Inches(0.4), Inches(0.12), Inches(12.5), Inches(0.9),
title_text, font_size=30, bold=True, color=WHITE)
y_start = Inches(1.3)
if subtitle_text:
add_text_box(slide, Inches(0.4), y_start, Inches(12.5), Inches(0.45),
subtitle_text, font_size=17, bold=False, color=TEAL,
italic=True)
y_start += Inches(0.5)
return slide, y_start
def section_divider(title, subtitle=""):
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, W, H, DARK_NAVY)
add_rect(slide, 0, Inches(3.2), W, Inches(0.08), TEAL)
add_text_box(slide, Inches(1), Inches(2.4), Inches(11), Inches(1.0),
title, font_size=40, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
if subtitle:
add_text_box(slide, Inches(1), Inches(3.4), Inches(11), Inches(0.7),
subtitle, font_size=22, bold=False, color=TEAL,
align=PP_ALIGN.CENTER)
def two_column_slide(title, left_lines, right_lines, left_head="", right_head="",
font_size=15):
slide, y = standard_slide(title)
col_w = Inches(6.2)
gap = Inches(0.3)
lx = Inches(0.4)
rx = Inches(0.4) + col_w + gap
ch = H - y - Inches(0.3)
# left column box
add_rect(slide, lx, y, col_w, ch, DARK_NAVY)
if left_head:
add_text_box(slide, lx + Inches(0.1), y + Inches(0.05),
col_w - Inches(0.2), Inches(0.4),
left_head, font_size=15, bold=True, color=TEAL)
add_multiline_textbox(slide, lx + Inches(0.1), y + Inches(0.5),
col_w - Inches(0.2), ch - Inches(0.6),
left_lines, font_size=font_size, color=WHITE)
else:
add_multiline_textbox(slide, lx + Inches(0.1), y + Inches(0.15),
col_w - Inches(0.2), ch - Inches(0.25),
left_lines, font_size=font_size, color=WHITE)
# right column box
add_rect(slide, rx, y, col_w, ch, DARK_NAVY)
if right_head:
add_text_box(slide, rx + Inches(0.1), y + Inches(0.05),
col_w - Inches(0.2), Inches(0.4),
right_head, font_size=15, bold=True, color=TEAL)
add_multiline_textbox(slide, rx + Inches(0.1), y + Inches(0.5),
col_w - Inches(0.2), ch - Inches(0.6),
right_lines, font_size=font_size, color=WHITE)
else:
add_multiline_textbox(slide, rx + Inches(0.1), y + Inches(0.15),
col_w - Inches(0.2), ch - Inches(0.25),
right_lines, font_size=font_size, color=WHITE)
def bullet_slide(title, bullets, subtitle=None, font_size=16, color=TEXT_DARK,
bg=LIGHT_GRAY, box_bg=None):
slide, y = standard_slide(title, subtitle)
bx = Inches(0.4)
bw = Inches(12.5)
bh = H - y - Inches(0.25)
if box_bg:
add_rect(slide, bx, y, bw, bh, box_bg)
txt_color = WHITE
else:
txt_color = TEXT_DARK
add_multiline_textbox(slide, bx + Inches(0.15), y + Inches(0.1),
bw - Inches(0.3), bh - Inches(0.2),
bullets, font_size=font_size, color=txt_color)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, W, H, DARK_NAVY)
# decorative teal bar
add_rect(slide, 0, Inches(3.8), W, Inches(0.12), TEAL)
add_rect(slide, 0, Inches(4.05), W, Inches(0.04), YELLOW_HL)
add_text_box(slide, Inches(0.8), Inches(1.5), Inches(11.5), Inches(1.5),
"ONCOLOGICAL EMERGENCIES", font_size=48, bold=True, color=WHITE,
align=PP_ALIGN.CENTER)
add_text_box(slide, Inches(0.8), Inches(3.2), Inches(11.5), Inches(0.65),
"Critical Recognition, Assessment & Management", font_size=24,
bold=False, color=TEAL, align=PP_ALIGN.CENTER, italic=True)
add_text_box(slide, Inches(0.8), Inches(4.25), Inches(11.5), Inches(0.5),
"Based on Rosen's Emergency Medicine | Tintinalli's Emergency Medicine | Goldman-Cecil Medicine | Harrison's Principles",
font_size=13, color=RGBColor(0xAA, 0xBB, 0xCC),
align=PP_ALIGN.CENTER)
add_text_box(slide, Inches(0.8), Inches(5.0), Inches(11.5), Inches(0.4),
"Critical Care & Oncology | 2025–2026 Edition",
font_size=14, color=RGBColor(0x88, 0x99, 0xAA),
align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 — OVERVIEW / TABLE OF CONTENTS
# ═══════════════════════════════════════════════════════════════════════════════
slide, y = standard_slide("Overview: Oncological Emergencies",
"Eight life-threatening conditions requiring immediate recognition")
add_rect(slide, Inches(0.4), y, Inches(12.5), H - y - Inches(0.25), DARK_NAVY)
topics = [
("1", "Febrile Neutropenia", "Infection in immunocompromised host"),
("2", "Tumor Lysis Syndrome (TLS)", "Metabolic emergency post-chemotherapy"),
("3", "Metastatic Spinal Cord Compression","Neurological emergency requiring urgent RT/surgery"),
("4", "Superior Vena Cava Syndrome", "Obstructive vascular emergency"),
("5", "Hypercalcemia of Malignancy", "Most common metabolic emergency in cancer"),
("6", "Malignant Pericardial Disease","Tamponade & haemodynamic compromise"),
("7", "Leukostasis", "Hyperviscosity in haematological malignancy"),
("8", "Immunotherapy Complications", "CAR-T, checkpoint inhibitor toxicities"),
]
row_h = Inches(0.56)
for i, (num, name, desc) in enumerate(topics):
ry = y + Inches(0.08) + i * row_h
add_rect(slide, Inches(0.5), ry, Inches(0.48), Inches(0.44), TEAL)
add_text_box(slide, Inches(0.5), ry, Inches(0.48), Inches(0.44),
num, font_size=18, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text_box(slide, Inches(1.1), ry, Inches(4.5), Inches(0.44),
name, font_size=16, bold=True, color=WHITE)
add_text_box(slide, Inches(5.7), ry, Inches(7.0), Inches(0.44),
"— " + desc, font_size=14, color=RGBColor(0xAA, 0xCC, 0xEE),
italic=True)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 — SECTION: FEBRILE NEUTROPENIA
# ═══════════════════════════════════════════════════════════════════════════════
section_divider("FEBRILE NEUTROPENIA",
"Section 1 of 8 | Rosen's & Tintinalli's Emergency Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 — Febrile Neutropenia: Definitions & Pathophysiology
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Febrile Neutropenia: Definitions & Pathophysiology",
left_head="DEFINITIONS",
left_lines=[
"Neutropenia: ANC < 500 cells/mm³ (or < 1000 expected to drop within 48 h)",
"Severe: ANC < 500 cells/mm³",
"Profound: ANC < 100 cells/mm³",
"Fever: Single temp ≥ 38.3°C OR ≥ 38.0°C sustained × 1–2 h",
"Febrile Neutropenia = both criteria met",
],
right_head="PATHOPHYSIOLOGY",
right_lines=[
"Chemotherapy nadir: lowest ANC 5–10 days after last dose",
"Recovery: usually within 5 days of nadir",
"Impaired inflammatory response → signs/symptoms blunted",
"Pulmonary infection may have no cough, no infiltrate",
"UTI may lack pyuria",
"Risk rises sharply below ANC 500; greatest below 100",
],
font_size=15,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 — Febrile Neutropenia: Risk Stratification & Management
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Febrile Neutropenia: Risk Stratification & Management",
left_head="HIGH-RISK FEATURES",
left_lines=[
"Prolonged neutropenia (> 7 days)",
"MASCC score < 21",
"Pneumonia",
"Hypotension / haemodynamic instability",
"Abdominal pain",
"Neurological changes",
"Inpatient at time of fever onset",
"→ ADMIT and start IV antipseudomonal β-lactam",
],
right_head="MANAGEMENT",
right_lines=[
"Draw 2 blood cultures (1 from central line if present)",
"Urinalysis, urine culture, CXR",
"Empirical: cefepime OR pip-tazo OR antipseudomonal carbapenem",
"Gram-positive cover (vancomycin): only if skin/line infection, haemodynamic instability",
"Antifungal: only if persistent fever > 4–7 days",
"Low-risk: consider oral antibiotics (fluoroquinolone) + outpatient",
"Source control: remove infected catheters",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 — SECTION: TUMOR LYSIS SYNDROME
# ═══════════════════════════════════════════════════════════════════════════════
section_divider("TUMOR LYSIS SYNDROME",
"Section 2 of 8 | Rosen's Emergency Medicine | Goldman-Cecil Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 — TLS: Pathophysiology & Cairo-Bishop Criteria
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Tumor Lysis Syndrome: Pathophysiology & Criteria",
left_head="PATHOPHYSIOLOGY",
left_lines=[
"Massive tumour cell lysis → release of intracellular contents",
"Hyperkalaemia: K⁺ released from lysed cells",
"Hyperphosphataemia: phosphate released → complexes with Ca²⁺",
"Hypocalcaemia (secondary): Ca²⁺ chelated by phosphate",
"Hyperuricaemia: nucleic acid breakdown → xanthine → uric acid",
"Uric acid & calcium-phosphate crystals → AKI, arrhythmia, seizure",
"Most common: haematological malignancies (Burkitt lymphoma, AML, ALL)",
],
right_head="CAIRO-BISHOP CRITERIA",
right_lines=[
"LABORATORY TLS (≥ 2 of the following within 3 days before – 7 days after tx):",
"Uric acid ≥ 8.0 mg/dL (or 25% increase)",
"Potassium ≥ 6.0 mEq/L (or 25% increase)",
"Phosphate ≥ 6.5 mg/dL (or 25% increase)",
"Calcium ≤ 7.0 mg/dL (or 25% decrease)",
"CLINICAL TLS = Laboratory TLS + ≥ 1 of:",
"Creatinine ≥ 1.5× ULN",
"Cardiac arrhythmia / sudden death",
"Seizure",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 8 — TLS: Prevention & Treatment
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Tumor Lysis Syndrome: Prevention & Treatment",
left_head="PREVENTION (High-Risk Patients)",
left_lines=[
"Aggressive IV hydration: 2–3 L/m²/day to maintain UO > 100 mL/h",
"Allopurinol: reduce uric acid production (start 24–48 h before chemo)",
"Rasburicase: recombinant urate oxidase — converts uric acid to allantoin",
"Rasburicase preferred in very high risk (Burkitt, AML, high tumour burden)",
"Avoid urinary alkalinisation (increases Ca-phosphate precipitation)",
"Monitor electrolytes q4–6 h once chemotherapy started",
],
right_head="TREATMENT",
right_lines=[
"IV hydration (mainstay): correct volume depletion, flush crystals",
"Hyperkalaemia: calcium gluconate, insulin/dextrose, sodium bicarbonate, Kayexalate, dialysis",
"Hyperphosphataemia: dietary restriction, phosphate binders",
"Hypocalcaemia: treat only if symptomatic (cramps, tetany, arrhythmia)",
"Hyperuricaemia: rasburicase (0.2 mg/kg IV) — most effective",
"AKI refractory to fluids → haemodialysis",
"ECG monitoring for arrhythmias",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 9 — SECTION: METASTATIC SPINAL CORD COMPRESSION
# ═══════════════════════════════════════════════════════════════════════════════
section_divider("METASTATIC SPINAL CORD COMPRESSION (MSCC)",
"Section 3 of 8 | Rosen's Emergency Medicine | Bailey & Love's Surgery")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 10 — MSCC: Overview & Clinical Features
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Metastatic Spinal Cord Compression: Overview & Features",
left_head="EPIDEMIOLOGY & AETIOLOGY",
left_lines=[
"Occurs in 5–10% of all cancer patients",
"Most common cancers: lung, breast, prostate (80% of cases)",
"Also: myeloma, lymphoma, renal cell, colorectal",
"Thoracic spine most common (70%), followed by lumbar (20%), cervical (10%)",
"Mechanism: haematogenous spread to vertebral body → posterior extension",
"Epidural space compression → venous congestion → cord oedema → ischaemia",
],
right_head="CLINICAL FEATURES",
right_lines=[
"Pain: hallmark symptom (95%); localised back pain or radicular pain",
"Pain worsens with recumbency (unlike disc disease)",
"Motor weakness: asymmetric at onset → paraplegia",
"Sensory loss: ascending anaesthesia below level of compression",
"Autonomic dysfunction: urinary retention (late sign), constipation, incontinence",
"Bowel/bladder dysfunction = very late sign — poor prognosis for recovery",
"Spinal percussion tenderness correlates with level",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 11 — MSCC: Investigations & Management
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"MSCC: Investigations & Management",
left_head="INVESTIGATIONS",
left_lines=[
"MRI whole spine: gold standard — defines level, extent of compression",
"Sensitivity > 93%; must image entire spine (skip lesions in 17%)",
"Plain radiographs: insensitive — only show 50% of lesions",
"CT myelography: if MRI contraindicated",
"CT chest/abdomen/pelvis: extent of systemic disease",
"Bloods: FBC, CRP, LFTs, ALP, calcium, PSA/tumour markers",
],
right_head="MANAGEMENT",
right_lines=[
"High-dose dexamethasone immediately (16 mg IV loading → 4 mg q6h)",
"Steroids reduce cord oedema — start BEFORE imaging in suspected MSCC",
"Radiotherapy: mainstay treatment — 20 Gy in 5 fractions standard",
"Surgery (decompression + stabilisation): ambulatory, single level, radio-resistant tumour, spinal instability",
"SINS score guides surgical decision",
"Prognosis: ability to walk at diagnosis is the strongest predictor",
"Ambulatory patients → 80% remain ambulatory after treatment",
"Non-ambulatory > 24 h → < 30% chance of recovery",
],
font_size=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 12 — SECTION: SVC SYNDROME
# ═══════════════════════════════════════════════════════════════════════════════
section_divider("SUPERIOR VENA CAVA (SVC) SYNDROME",
"Section 4 of 8 | Rosen's Emergency Medicine | Pye's Surgical Handicraft")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 13 — SVC Syndrome: Pathophysiology, Causes & Features
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"SVC Syndrome: Causes, Features & Investigations",
left_head="CAUSES",
left_lines=[
"Malignancy (80–90% of cases):",
" Lung carcinoma (most common, esp. SCLC ~40%)",
" Non-Hodgkin lymphoma",
" Metastatic disease",
" Primary mediastinal germ cell tumour",
"Non-malignant:",
" Thrombosis from central venous catheters / pacemaker leads",
" Fibrosing mediastinitis (histoplasmosis, TB)",
],
right_head="CLINICAL FEATURES",
right_lines=[
"Facial oedema, plethora and cyanosis",
"Arm and neck oedema",
"Dilated neck and chest wall veins",
"Headache (worsened by bending forward/lying down)",
"Dyspnoea",
"Hoarse voice, stridor (if airway compression)",
"Pemberton's sign: facial congestion on raising both arms",
"Severe: cerebral oedema, coma, laryngeal oedema → emergency",
"Investigations: CT chest with contrast (gold standard)",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 14 — SVC Syndrome: Management
# ═══════════════════════════════════════════════════════════════════════════════
bullet_slide(
"SVC Syndrome: Management",
subtitle="Rosen's Emergency Medicine | Bailey & Love's Surgery | Braunwald's Heart Disease",
bullets=[
"IMMEDIATE: Head elevation, O₂, avoid IV access in upper limbs (venous pressure elevated)",
"Tissue diagnosis before treatment whenever possible (histology guides therapy)",
"STENT: Endovascular SVC stenting — rapid symptom relief (24–72 h); treatment of choice for emergency",
"Steroids (dexamethasone 8–16 mg/day): reduce oedema, especially if lymphoma suspected",
"Radiotherapy: for radio-sensitive tumours (NSCLC, lymphoma) — relief in 72 h",
"Chemotherapy: first-line for SCLC, lymphoma, germ cell tumours (chemo-sensitive)",
"Anticoagulation: if catheter-related thrombosis — LMWH ± catheter removal",
"Diuretics: limited role (may worsen hypotension); use cautiously",
"Surgery: rarely needed; reserved for benign disease refractory to other measures",
"Prognosis: depends on underlying malignancy; stenting gives immediate palliation",
],
font_size=15,
box_bg=DARK_NAVY,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 15 — SECTION: HYPERCALCAEMIA OF MALIGNANCY
# ═══════════════════════════════════════════════════════════════════════════════
section_divider("HYPERCALCAEMIA OF MALIGNANCY",
"Section 5 of 8 | Harrison's Principles | Goldman-Cecil Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 16 — Hypercalcaemia: Mechanisms & Clinical Features
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Hypercalcaemia of Malignancy: Mechanisms & Features",
left_head="MECHANISMS (Harrison's 22e)",
left_lines=[
"Most common metabolic emergency in cancer (~20–30% of patients)",
"1. PTHrP-mediated (humoral hypercalcaemia): lung, renal, breast, squamous — PTHrP activates PTH receptors → bone resorption + renal Ca reabsorption",
"2. Local osteolytic metastases: breast, myeloma — cytokines (IL-1, IL-6, TNF) stimulate osteoclasts",
"3. Calcitriol-mediated: lymphomas — tumour produces 1,25(OH)₂D₃",
"4. True ectopic PTH secretion: rare",
"Corrected Ca = measured Ca + 0.8 × (4 − albumin)",
],
right_head="CLINICAL FEATURES ('Bones, Groans, Moans, Stones')",
right_lines=[
"BONES: bone pain, pathological fractures",
"GROANS: nausea, vomiting, anorexia, constipation, pancreatitis",
"MOANS: confusion, lethargy, stupor, coma (neuropsychiatric)",
"STONES: nephrolithiasis, polyuria, polydipsia, nephrogenic DI",
"CARDIAC: QT shortening → arrhythmias, PR prolongation",
"Severity: Mild < 12 mg/dL | Moderate 12–14 | Severe > 14 mg/dL",
"Severe / symptomatic → requires urgent treatment",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 17 — Hypercalcaemia: Treatment
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Hypercalcaemia of Malignancy: Treatment",
left_head="ACUTE MANAGEMENT",
left_lines=[
"IV Normal Saline hydration: 200–500 mL/h (mainstay) — corrects volume depletion, enhances calciuresis",
"Furosemide: only after adequate rehydration; prevents fluid overload",
"Calcitonin (4 IU/kg SC/IM q12h): rapid onset (4–6 h), short-lived (tachyphylaxis 48 h), useful as bridge",
"Bisphosphonates: zoledronic acid 4 mg IV over 15 min (onset 48–72 h, duration 2–4 wks) — mainstay of definitive treatment",
"Denosumab: anti-RANKL; use if bisphosphonate-refractory or renal failure",
"Dialysis: life-threatening hypercalcaemia + renal failure",
],
right_head="SPECIFIC TREATMENTS",
right_lines=[
"Glucocorticoids (hydrocortisone 200–300 mg/day): effective for lymphoma, myeloma, calcitriol-mediated hypercalcaemia",
"Chloroquine / hydroxychloroquine: reduce calcitriol synthesis in granulomatous disease / lymphoma",
"Treat underlying malignancy: most important long-term strategy",
"Monitor: Ca, renal function, urine output",
"Target corrected Ca < 12 mg/dL",
"Recurrence common if underlying tumour not controlled",
"Prognostic significance: median survival < 3 months after first episode",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 18 — SECTION: MALIGNANT PERICARDIAL DISEASE
# ═══════════════════════════════════════════════════════════════════════════════
section_divider("MALIGNANT PERICARDIAL DISEASE",
"Section 6 of 8 | Rosen's Emergency Medicine | Braunwald's Heart Disease")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 19 — Malignant Pericardial Disease: Overview & Management
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Malignant Pericardial Disease & Cardiac Tamponade",
left_head="FEATURES & DIAGNOSIS",
left_lines=[
"Malignant pericardial effusion → 5–10% of cancer patients at autopsy",
"Most common cancers: lung (most common), breast, lymphoma, leukaemia, melanoma",
"Beck's Triad: hypotension + muffled heart sounds + raised JVP",
"Pulsus paradoxus: drop > 10 mmHg systolic on inspiration",
"ECG: low voltage, electrical alternans (pathognomonic of tamponade)",
"CXR: globular 'water-bottle' cardiac silhouette",
"Echo: gold standard — confirms effusion, RV collapse (tamponade)",
"Kussmaul's sign absent in tamponade (present in constrictive pericarditis)",
],
right_head="MANAGEMENT",
right_lines=[
"EMERGENCY: Pericardiocentesis (subxiphoid approach, echo-guided)",
"Drain > 250 mL rapidly to relieve haemodynamic compromise",
"Send pericardial fluid: cytology, cultures, LDH, glucose, protein",
"Pericardial window: recurrent effusions → surgical or percutaneous balloon pericardiostomy",
"Systemic anticancer therapy: treat underlying malignancy",
"Intrapericardial instillation: cisplatin / thiotepa (prevent recurrence)",
"Local radiotherapy: lymphoma with pericardial involvement",
"IV fluid challenge: temporising measure before drainage (expands venous return)",
"Avoid positive pressure ventilation — worsens tamponade physiology",
],
font_size=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 20 — SECTION: LEUKOSTASIS
# ═══════════════════════════════════════════════════════════════════════════════
section_divider("LEUKOSTASIS",
"Section 7 of 8 | Rosen's Emergency Medicine | Goldman-Cecil Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 21 — Leukostasis: Pathophysiology, Features & Management
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Leukostasis: Pathophysiology, Features & Management",
left_head="PATHOPHYSIOLOGY & FEATURES",
left_lines=[
"Leukostasis = hyperviscosity from extreme leukocytosis → end-organ damage",
"WBC > 100,000/mm³ (AML most common); myeloblasts more viscous than lymphoblasts",
"Blast cells aggregate in microvasculature → ischaemia",
"Most at risk: AML (WBC > 50,000), CML blast crisis, hyperleucocytic ALL",
"CNS: headache, visual changes, dizziness, stupor, stroke (most common)",
"Pulmonary: hypoxia, dyspnoea, diffuse pulmonary infiltrates → ARDS",
"Retinal haemorrhage, priapism, limb ischaemia (less common)",
"Pseudo-hypoxia: metabolic consumption of O₂ by blasts in sample tube",
],
right_head="MANAGEMENT",
right_lines=[
"EMERGENCY: leukapheresis — rapidly reduces WBC count",
"Cytoreduction: hydroxyurea 50–100 mg/kg/day (PO) — reduces WBC over 24–48 h",
"Avoid RBC transfusion acutely (increases viscosity) — transfuse only if Hb < 8 g/dL after leukapheresis",
"Aggressive IV hydration + allopurinol (prevent TLS)",
"Definitive: urgent induction chemotherapy",
"Low-dose cranial irradiation (controversial, rarely used now)",
"Platelet transfusion: if < 20,000 and bleeding",
"Mortality: up to 40% in the first 24–48 h if untreated",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 22 — SECTION: IMMUNOTHERAPY COMPLICATIONS
# ═══════════════════════════════════════════════════════════════════════════════
section_divider("IMMUNOTHERAPY COMPLICATIONS",
"Section 8 of 8 | Rosen's Emergency Medicine | Goldman-Cecil Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 23 — CRS & Checkpoint Inhibitor Toxicities
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Immunotherapy Complications: CRS & irAEs",
left_head="CYTOKINE RELEASE SYNDROME (CRS) — CAR-T",
left_lines=[
"After CAR-T cell or bispecific antibody therapy",
"Massive cytokine release: IL-6, IFN-γ, TNF-α",
"Features: fever, hypotension, hypoxia, multi-organ dysfunction",
"CRS Grading (ASTCT): Grade 1 fever; Grade 2 + hypotension/O₂; Grade 3–4 vasopressors/mechanical ventilation",
"Treatment:",
" Tocilizumab (IL-6R antagonist): 8 mg/kg IV — first-line for Grade ≥ 2",
" Corticosteroids: dexamethasone 10 mg IV q6h for Grade ≥ 3",
" ICU support: vasopressors, O₂, mechanical ventilation if needed",
"ICANS (immune effector cell-associated neurotoxicity): encephalopathy, seizures, cerebral oedema",
],
right_head="CHECKPOINT INHIBITOR irAEs",
right_lines=[
"PD-1/PD-L1/CTLA-4 inhibitors → immune-mediated toxicities (any organ)",
"Pneumonitis: dyspnoea, cough, ground-glass opacity on CT — steroids (prednisolone 1–2 mg/kg)",
"Colitis: diarrhoea, abdominal pain — steroids ± infliximab",
"Hepatitis: elevated transaminases — withhold agent, steroids",
"Endocrinopathies: thyroiditis, hypophysitis, adrenal insufficiency — hormone replacement",
"Myocarditis: rare but fatal — high-dose steroids + withhold immunotherapy",
"Dermatitis: rash, Stevens-Johnson (rare) — topical or systemic steroids",
"General principle: grade irAE → withhold or permanently discontinue + immunosuppression",
],
font_size=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 24 — Quick Reference: Electrolyte Targets in Oncological Emergencies
# ═══════════════════════════════════════════════════════════════════════════════
slide, y = standard_slide("Quick Reference: Metabolic Targets & Key Labs",
"Summary of critical values for monitoring and treatment goals")
add_rect(slide, Inches(0.4), y, Inches(12.5), H - y - Inches(0.25), DARK_NAVY)
rows = [
("Emergency", "Key Electrolyte / Lab", "Critical Threshold", "Action"),
("Tumor Lysis Syndrome", "K⁺, PO₄, Ca, Uric acid, Creatinine","K ≥ 6.0 | PO₄ ≥ 6.5 | Ca ≤ 7.0","Hydration, rasburicase, dialysis"),
("Febrile Neutropenia", "ANC, Temperature, MASCC score", "ANC < 500, Temp ≥ 38.3°C", "Antipseudomonal β-lactam"),
("Hypercalcaemia", "Corrected Ca, PTHrP, PTH", "Ca > 14 mg/dL (severe)", "IVF, zoledronic acid, calcitonin"),
("MSCC", "MRI spine (STAT)", "New neurological deficit", "Dexamethasone 16 mg IV stat"),
("SVC Syndrome", "CT chest with contrast", "Severe: cerebral oedema", "Stent ± dexamethasone"),
("Cardiac Tamponade", "Echo, ECG (electrical alternans)", "RV diastolic collapse", "Pericardiocentesis"),
("Leukostasis", "WBC, blast count", "WBC > 100,000 (AML)", "Leukapheresis + hydroxyurea"),
]
col_widths = [Inches(2.6), Inches(3.2), Inches(3.0), Inches(3.4)]
col_xs = [Inches(0.45), Inches(3.1), Inches(6.35), Inches(9.4)]
row_height = Inches(0.56)
header_h = Inches(0.45)
for ci, (cx, cw) in enumerate(zip(col_xs, col_widths)):
add_rect(slide, cx, y + Inches(0.02), cw - Inches(0.05), header_h, TEAL)
add_text_box(slide, cx + Inches(0.05), y + Inches(0.02),
cw - Inches(0.1), header_h,
rows[0][ci], font_size=13, bold=True, color=WHITE)
for ri, row in enumerate(rows[1:], 1):
bg = DARK_NAVY if ri % 2 == 1 else RGBColor(0x0A, 0x14, 0x30)
ry = y + header_h + Inches(0.08) + (ri-1)*row_height
add_rect(slide, Inches(0.45), ry, Inches(12.45), row_height - Inches(0.04), bg)
for ci, (cx, cw) in enumerate(zip(col_xs, col_widths)):
add_text_box(slide, cx + Inches(0.05), ry + Inches(0.04),
cw - Inches(0.1), row_height - Inches(0.08),
row[ci], font_size=12, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 25 — Approach to the Oncological Emergency Patient
# ═══════════════════════════════════════════════════════════════════════════════
bullet_slide(
"Clinical Approach to the Oncological Emergency",
subtitle="A systematic framework for emergency assessment",
bullets=[
"1. IDENTIFY risk: Known malignancy + acute presentation = assume oncological emergency until proven otherwise",
"2. VITALS & TRIAGE: Temperature (febrile neutropenia), BP (tamponade, SVC), O₂ (leukostasis, pneumonitis), neuro status (MSCC, ICANS)",
"3. KEY HISTORY: Type of malignancy, stage, current chemotherapy/immunotherapy, last WBC count, recent procedures",
"4. FOCUSSED EXAM: Neck veins (SVC), spinal tenderness (MSCC), muffled heart sounds (tamponade), pulsus paradoxus",
"5. EMERGENCY LABS: FBC (ANC, blast count), BMP (Ca, K, PO₄, uric acid, creatinine), LFTs, LDH, coagulation",
"6. IMAGING: CXR (effusion, SVC, pulmonary leukostasis), MRI spine (MSCC), CT chest contrast (SVC), Echo (tamponade)",
"7. TREAT BEFORE CONFIRM when clinical urgency demands (e.g., dexamethasone for MSCC, IVF for TLS)",
"8. CONSULT early: Oncology, haematology, intensivist, radiation oncology, spinal surgery, interventional radiology",
"9. GOALS OF CARE: Discuss prognosis, reversibility, patient wishes — early palliative care involvement",
],
font_size=14,
box_bg=DARK_NAVY,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 26 — Summary Mnemonics & Key Points
# ═══════════════════════════════════════════════════════════════════════════════
two_column_slide(
"Summary: Key Mnemonics & Exam Points",
left_head="MNEMONICS",
left_lines=[
"CHIPES (Oncological emergencies):",
" C — Cardiac tamponade",
" H — Hypercalcaemia",
" I — Increased ICP / MSCC",
" P — Pericardial effusion",
" E — Embolism (SVCo)",
" S — Sepsis / Febrile neutropenia",
"",
"TLS: 'KPCU' → K↑ · PO₄↑ · Ca↓ · Uric acid↑",
"Hypercalcaemia: 'Bones, Groans, Moans, Stones'",
"MSCC: 'Walking in, walking out' — ambulatory status = key prognostic marker",
],
right_head="HIGH-YIELD EXAM POINTS",
right_lines=[
"Febrile neutropenia: MASCC < 21 = HIGH risk → admit + IV cefepime",
"TLS: Rasburicase NOT in G6PD deficiency (haemolysis of H₂O₂ by-product)",
"Hypercalcaemia: Bisphosphonate onset 48–72 h; calcitonin = rapid bridge",
"MSCC: Start dexamethasone BEFORE imaging; MRI whole spine (skip lesions!)",
"SVC: Stenting = fastest relief; SCLC/lymphoma → chemo first",
"Tamponade: Do NOT start positive pressure ventilation before drainage",
"Leukostasis: Avoid RBC transfusion before leukapheresis",
"CRS: Tocilizumab for Grade ≥ 2; do NOT give corticosteroids first (may blunt CAR-T efficacy)",
],
font_size=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 27 — References
# ═══════════════════════════════════════════════════════════════════════════════
slide, y = standard_slide("References & Source Textbooks")
add_rect(slide, Inches(0.4), y, Inches(12.5), H - y - Inches(0.25), DARK_NAVY)
refs = [
"1. Rosen's Emergency Medicine: Concepts and Clinical Practice, 10th ed. (2023) — Chapter: Oncologic Emergencies (Block 22)",
"2. Tintinalli's Emergency Medicine: A Comprehensive Study Guide, 9th ed. (2020) — Febrile Neutropenia & Oncologic Emergencies",
"3. Goldman-Cecil Medicine International Edition, 2 Volume Set (2024) — Chapters on TLS, Hypercalcaemia, Febrile Neutropenia",
"4. Harrison's Principles of Internal Medicine, 22nd Edition (2025, McGraw Hill) — Hypercalcaemia of Malignancy",
"5. Bailey and Love's Short Practice of Surgery, 28th Edition — Oncological Emergencies",
"6. Pye's Surgical Handicraft, 22nd Edition — SVC Syndrome, Oncological Emergencies",
"7. Braunwald's Heart Disease, 2-Vol Set (2022) — Superior Vena Cava Syndrome, Cardiac Tamponade",
"8. Murray & Nadel's Textbook of Respiratory Medicine, 2-Volume Set — SVC Syndrome",
"9. Brenner and Rector's The Kidney, 2-Volume Set — Tumor Lysis Syndrome",
"10. Miller's Anesthesia, 10th Edition — Tumor Lysis Syndrome (perioperative management)",
]
add_multiline_textbox(slide, Inches(0.55), y + Inches(0.1), Inches(12.2),
H - y - Inches(0.4),
refs, font_size=14, color=RGBColor(0xCC, 0xDD, 0xEE),
bullet_char="")
# ═══════════════════════════════════════════════════════════════════════════════
# SAVE
# ═══════════════════════════════════════════════════════════════════════════════
output_path = "/tmp/workspace/oncological-emergencies/Oncological_Emergencies.pptx"
buf = BytesIO()
prs.save(buf)
with open(output_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved to {output_path}")
print(f"Total slides: {len(prs.slides)}")
cd /tmp/workspace/oncological-emergencies && python build_pptx.py
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/oncological-emergencies/Oncological_Emergencies.pptx') for i, slide in enumerate(prs.slides, 1): texts = [] for shape in slide.shapes: if shape.has_text_frame: t = shape.text_frame.text.strip() if t: texts.append(t[:60]) print(f'Slide {i:02d}: {\" | \".join(texts[:3])}') "
Oncological Emergencies
Presentation · PPTX
| # | Slide | Source |
|---|---|---|
| 1 | Title Slide | - |
| 2 | Overview / Contents (8 emergencies) | - |
| 3 | Section Divider: Febrile Neutropenia | |
| 4 | FN: Definitions & Pathophysiology | Rosen's EM, Tintinalli's |
| 5 | FN: Risk Stratification & Management (MASCC, antibiotics) | Rosen's EM, Tintinalli's |
| 6 | Section Divider: Tumor Lysis Syndrome | |
| 7 | TLS: Cairo-Bishop Criteria & Pathophysiology | Rosen's EM, Goldman-Cecil |
| 8 | TLS: Prevention & Treatment (rasburicase, dialysis) | Rosen's EM |
| 9 | Section Divider: MSCC | |
| 10 | MSCC: Epidemiology & Clinical Features | Rosen's EM, Bailey & Love |
| 11 | MSCC: Investigations & Management (dexamethasone, RT, surgery) | Rosen's EM |
| 12 | Section Divider: SVC Syndrome | |
| 13 | SVC: Causes, Features & Investigations | Rosen's EM, Pye's |
| 14 | SVC: Management (stent, chemo, steroids) | Rosen's EM, Braunwald's |
| 15 | Section Divider: Hypercalcaemia | |
| 16 | Hypercalcaemia: Mechanisms (PTHrP, osteolytic, calcitriol) & Features | Harrison's 22e |
| 17 | Hypercalcaemia: Treatment (IVF, zoledronic acid, calcitonin, denosumab) | Harrison's, Goldman-Cecil |
| 18 | Section Divider: Malignant Pericardial Disease | |
| 19 | Cardiac Tamponade: Beck's Triad, Echo, Pericardiocentesis | Rosen's EM, Braunwald's |
| 20 | Section Divider: Leukostasis | |
| 21 | Leukostasis: Pathophysiology, Features & Management (leukapheresis) | Rosen's EM, Goldman-Cecil |
| 22 | Section Divider: Immunotherapy Complications | |
| 23 | CRS (CAR-T) & Checkpoint Inhibitor irAEs (tocilizumab, steroids) | Rosen's EM |
| 24 | Quick Reference Table: All 8 emergencies, critical thresholds, actions | - |
| 25 | Clinical Approach Framework (9-step systematic approach) | - |
| 26 | Summary Mnemonics & High-Yield Exam Points | - |
| 27 | References (10 source textbooks cited) | - |
VT in cardiology ppt with 20 plus slides from standard cardiology referance books
~/oncological-emergencies/build_vt_pptx.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 io import BytesIO
# ─── Palette (deep-red/crimson cardiac theme) ──────────────────────────────────
CRIMSON = RGBColor(0x8B, 0x00, 0x00)
DARK_RED = RGBColor(0x6B, 0x0E, 0x0E)
DARK_BG = RGBColor(0x12, 0x0A, 0x0A)
CARD_BG = RGBColor(0x1E, 0x10, 0x10)
ACCENT = RGBColor(0xE8, 0x4A, 0x4A)
GOLD = RGBColor(0xF5, 0xC5, 0x18)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_GRAY = RGBColor(0xF5, 0xF0, 0xF0)
TEXT_DARK = RGBColor(0x1A, 0x0A, 0x0A)
PALE_ACCENT = RGBColor(0xFF, 0xCC, 0xCC)
TEAL_ACCENT = RGBColor(0x1A, 0xBF, 0xA0)
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
blank = prs.slide_layouts[6]
# ═══════════════════════════════════════════════════════════════════════════════
# HELPERS
# ═══════════════════════════════════════════════════════════════════════════════
def add_rect(slide, x, y, w, h, color):
s = slide.shapes.add_shape(1, x, y, w, h)
s.fill.solid()
s.fill.fore_color.rgb = color
s.line.fill.background()
return s
def add_tb(slide, x, y, w, h, text, sz=18, bold=False, color=WHITE,
align=PP_ALIGN.LEFT, italic=False, wrap=True):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = tf.margin_right = Inches(0.04)
tf.margin_top = tf.margin_bottom = Inches(0.02)
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 tb
def add_bullets(slide, x, y, w, h, lines, sz=15, color=WHITE,
head=None, head_color=None, bullet="▸ "):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = tf.margin_right = Inches(0.06)
tf.margin_top = tf.margin_bottom = Inches(0.04)
first = True
if head:
p = tf.paragraphs[0]
p.space_after = Pt(2)
r = p.add_run()
r.text = head
r.font.size = Pt(sz + 1)
r.font.bold = True
r.font.color.rgb = head_color or GOLD
r.font.name = "Calibri"
first = False
for i, line in enumerate(lines):
p = tf.paragraphs[0] if (first and i == 0) else tf.add_paragraph()
p.space_before = Pt(1)
r = p.add_run()
r.text = bullet + line
r.font.size = Pt(sz)
r.font.color.rgb = color
r.font.name = "Calibri"
return tb
def std_slide(title, subtitle=None):
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, W, H, LIGHT_GRAY)
add_rect(slide, 0, 0, W, Inches(1.1), DARK_BG)
add_rect(slide, 0, Inches(1.1), W, Inches(0.06), ACCENT)
add_tb(slide, Inches(0.4), Inches(0.1), Inches(12.5), Inches(0.9),
title, sz=30, bold=True, color=WHITE)
y = Inches(1.25)
if subtitle:
add_tb(slide, Inches(0.4), y, Inches(12.5), Inches(0.4),
subtitle, sz=15, color=ACCENT, italic=True)
y += Inches(0.45)
return slide, y
def divider(title, sub=""):
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, W, H, DARK_BG)
add_rect(slide, 0, Inches(2.9), W, Inches(0.1), ACCENT)
add_rect(slide, 0, Inches(3.05), W, Inches(0.04), GOLD)
add_tb(slide, Inches(0.8), Inches(1.8), Inches(11.5), Inches(1.1),
title, sz=42, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
if sub:
add_tb(slide, Inches(0.8), Inches(3.2), Inches(11.5), Inches(0.7),
sub, sz=20, color=ACCENT, align=PP_ALIGN.CENTER, italic=True)
def two_col(title, l_head, l_lines, r_head, r_lines, subtitle=None, sz=14):
slide, y = std_slide(title, subtitle)
cw = Inches(6.2)
gap = Inches(0.3)
lx = Inches(0.4)
rx = lx + cw + gap
ch = H - y - Inches(0.25)
# left
add_rect(slide, lx, y, cw, ch, CARD_BG)
add_tb(slide, lx + Inches(0.1), y + Inches(0.08),
cw - Inches(0.2), Inches(0.42),
l_head, sz=14, bold=True, color=GOLD)
add_bullets(slide, lx + Inches(0.08), y + Inches(0.55),
cw - Inches(0.16), ch - Inches(0.65),
l_lines, sz=sz, color=WHITE)
# right
add_rect(slide, rx, y, cw, ch, CARD_BG)
add_tb(slide, rx + Inches(0.1), y + Inches(0.08),
cw - Inches(0.2), Inches(0.42),
r_head, sz=14, bold=True, color=GOLD)
add_bullets(slide, rx + Inches(0.08), y + Inches(0.55),
cw - Inches(0.16), ch - Inches(0.65),
r_lines, sz=sz, color=WHITE)
def full_box(title, bullets_list, subtitle=None, sz=15):
slide, y = std_slide(title, subtitle)
bh = H - y - Inches(0.25)
add_rect(slide, Inches(0.4), y, Inches(12.5), bh, CARD_BG)
add_bullets(slide, Inches(0.55), y + Inches(0.12),
Inches(12.2), bh - Inches(0.25),
bullets_list, sz=sz, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE
# ═══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, DARK_BG)
# ECG-line decorative strip
add_rect(s, 0, Inches(3.6), W, Inches(0.08), ACCENT)
add_rect(s, 0, Inches(3.75), W, Inches(0.03), GOLD)
add_tb(s, Inches(0.8), Inches(1.0), Inches(11.5), Inches(1.2),
"VENTRICULAR TACHYCARDIA", sz=52, bold=True, color=WHITE,
align=PP_ALIGN.CENTER)
add_tb(s, Inches(0.8), Inches(2.35), Inches(11.5), Inches(0.8),
"Classification | Mechanisms | ECG Diagnosis | Management",
sz=22, color=ACCENT, align=PP_ALIGN.CENTER, italic=True)
add_tb(s, Inches(0.8), Inches(3.9), Inches(11.5), Inches(0.55),
"Based on: Braunwald's Heart Disease | Goldman-Cecil Medicine | Harrison's Principles | Rosen's Emergency Medicine",
sz=13, color=RGBColor(0xAA, 0x88, 0x88), align=PP_ALIGN.CENTER)
add_tb(s, Inches(0.8), Inches(4.6), Inches(11.5), Inches(0.4),
"Cardiology / Electrophysiology • 2025–2026 Edition",
sz=14, color=RGBColor(0x88, 0x66, 0x66), align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 — OUTLINE
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("Contents: Ventricular Tachycardia",
"A comprehensive review across 8 clinical modules")
add_rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD_BG)
topics = [
("1","Definition, Classification & Epidemiology"),
("2","Mechanisms of VT (Reentry, Automaticity, Triggered Activity)"),
("3","ECG Diagnosis & Wide Complex Tachycardia Approach"),
("4","VT vs SVT Differentiation (Brugada, Vereckei, aVR algorithms)"),
("5","Monomorphic VT — Ischaemic & Non-ischaemic Causes"),
("6","Polymorphic VT, Torsades de Pointes & CPVT"),
("7","Idiopathic VT — Outflow Tract, Fascicular & Special Forms"),
("8","Acute Management — Haemodynamically Stable & Unstable"),
("9","Long-term Management — Antiarrhythmics, ICD, Ablation"),
("10","Special Situations — Structural Heart Disease, VT Storm"),
]
rh = Inches(0.52)
for i, (n, t) in enumerate(topics):
ry = y + Inches(0.1) + i * rh
add_rect(s, Inches(0.5), ry, Inches(0.45), Inches(0.42), ACCENT)
add_tb(s, Inches(0.5), ry, Inches(0.45), Inches(0.42),
n, sz=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_tb(s, Inches(1.1), ry + Inches(0.04), Inches(11.5), Inches(0.38),
t, sz=15, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("DEFINITION, CLASSIFICATION\n& EPIDEMIOLOGY",
"Module 1 | Braunwald's Heart Disease, 2-Vol Set")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 — Definition & Classification
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"VT: Definition & Classification",
"DEFINITION",
[
"Ventricular tachycardia = ≥ 3 consecutive beats of ventricular origin at rate > 100 bpm",
"Wide QRS complex (≥ 120 ms) by definition (ventricular origin)",
"Sustained VT: lasts > 30 seconds OR requires termination due to haemodynamic compromise",
"Non-sustained VT (NSVT): ≥ 3 beats, < 30 seconds, terminates spontaneously",
"Incessant VT: present for > 50% of any given 24-hour period",
"Monomorphic VT: uniform QRS morphology (single reentry circuit or focus)",
"Polymorphic VT: beat-to-beat changes in QRS morphology",
],
"CLASSIFICATION BY MORPHOLOGY",
[
"Monomorphic VT — most common; uniform QRS; reentry in scar",
"Polymorphic VT — varying QRS; ischaemia, channelopathies, electrolyte abnormalities",
"Torsades de Pointes — polymorphic VT with twisting axis; long QT",
"Bidirectional VT — beat-to-beat QRS axis alternans; digitalis toxicity or CPVT",
"Bundle branch re-entry VT — wide LBBB pattern; dilated cardiomyopathy",
"Accelerated idioventricular rhythm (AIVR) — VT 60–100 bpm; reperfusion",
],
sz=14,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 — Epidemiology & Risk Factors
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"VT: Epidemiology, Aetiology & Risk Factors",
"EPIDEMIOLOGY",
[
"VT accounts for majority of sudden cardiac death (SCD) in structurally abnormal hearts",
"Ischaemic heart disease: most common substrate (CAD → scar → reentry)",
"Dilated cardiomyopathy: second most common cause of sustained VT",
"Prior MI with EF < 35% → highest risk of sudden death (MADIT, MUSTT trials)",
"Estimated 300,000 SCD/year in the US, majority VT/VF",
"NSVT: found in 40–60% of patients with prior MI; often marker, not cause",
"Idiopathic VT in structurally normal hearts: 10% of all VT presentations",
],
"CAUSES & STRUCTURAL SUBSTRATES",
[
"Ischaemic cardiomyopathy: post-MI scar (most common)",
"Dilated cardiomyopathy (ischaemic and non-ischaemic)",
"Hypertrophic cardiomyopathy (HCM)",
"Arrhythmogenic right ventricular cardiomyopathy (ARVC/ARVD)",
"Cardiac sarcoidosis, Chagas disease",
"Valvular heart disease (mitral prolapse — papillary muscle VT)",
"Congenital heart disease (repaired Tetralogy of Fallot)",
"Channelopathies: Long QT, Brugada, CPVT, Short QT syndrome",
"Metabolic: hypokalaemia, hypomagnesaemia, drug toxicity, ischaemia",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("MECHANISMS OF VT",
"Module 2 | Braunwald's Heart Disease | Guyton & Hall Physiology")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 — Mechanisms
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Mechanisms of Ventricular Tachycardia",
"1. REENTRY (most common)",
[
"Requires: two pathways with different refractoriness + conduction velocity",
"Unidirectional block in one pathway; slow conduction in the other",
"Electrical wavefront re-enters and perpetuates the circuit",
"Scar-related reentry: most common mechanism in post-MI VT",
"Isthmus of slowly conducting tissue within scar = ablation target",
"Bundle branch reentry: uses His–Purkinje system as circuit; seen in DCM",
"ECG: sudden onset, constant cycle length, terminated by pacing",
],
"2. AUTOMATICITY & TRIGGERED ACTIVITY",
[
"ENHANCED AUTOMATICITY:",
"Abnormal cells fire spontaneously at accelerated rates",
"Seen in: AIVR (reperfusion), digitalis toxicity, ischaemia",
"TRIGGERED ACTIVITY:",
"Early afterdepolarisations (EADs): occur during action potential phase 2/3",
"EADs → long QT syndrome, hypomagnesaemia, class III drugs → TdP",
"Delayed afterdepolarisations (DADs): occur after full repolarisation",
"DADs → digoxin toxicity, catecholamine excess, CPVT",
"Idiopathic RVOT VT: cyclic AMP-mediated triggered activity",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 8 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("ECG DIAGNOSIS OF VT\n& WIDE COMPLEX TACHYCARDIA",
"Module 3 | Braunwald's Heart Disease | Goldman-Cecil Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 9 — ECG Features of VT
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"ECG Features Favouring Ventricular Tachycardia",
"MAJOR ECG CRITERIA FOR VT",
[
"AV dissociation: atrial rate independent of ventricular rate (pathognomonic)",
"Fusion beats: hybrid of sinus and VT QRS = confirms AV dissociation",
"Capture beats: narrow QRS during VT = sinus beat capturing ventricle",
"QRS duration > 160 ms (or > 140 ms with RBBB pattern)",
"Absence of RS complex in ALL precordial leads (V1–V6)",
"R-to-S nadir interval > 100 ms in any precordial lead",
"Negative concordance (QS in all V1–V6): strongly suggests VT",
"Positive concordance (tall R in all V1–V6): VT from basal LV origin",
],
"aVR ALGORITHM (Vereckei)",
[
"Initial R wave in aVR → VT",
"Initial r or q width > 40 ms in aVR → VT",
"Notching on initial downstroke of a predominantly negative QRS in aVR → VT",
"Vi/Vt ratio ≤ 1: velocity of initial 40 ms < terminal 40 ms → VT",
"aVR criteria: sensitivity 96%, specificity 95% for VT",
"ECG TIP: 'If in doubt — treat as VT'",
"Never give verapamil for wide complex tachycardia without confirmed SVT",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 10 — Brugada ECG Algorithm
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("VT vs SVT: Brugada Criteria (4-Step Algorithm)",
"Braunwald's Heart Disease | Goldman-Cecil Medicine — Step-by-step approach to WCT")
add_rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD_BG)
steps = [
("STEP 1", "Absence of RS complex in ALL precordial leads (V1–V6)?",
"YES → VT (100% specificity) | NO → go to Step 2"),
("STEP 2", "R-to-S nadir interval > 100 ms in ANY precordial lead?",
"YES → VT | NO → go to Step 3"),
("STEP 3", "AV dissociation present?",
"YES → VT | NO → go to Step 4"),
("STEP 4", "QRS morphology criteria for VT in V1 AND V6?",
"RBBB pattern: V1 = monophasic R / biphasic qR or RS / R > r'; V6 = QS or rS (R:S < 1)"),
("", "LBBB pattern: V1 = R > 30 ms or RS > 60 ms; V6 = QR or QS",
"If criteria MET → VT | If NOT met → SVT with aberrancy"),
]
row_h = Inches(0.88)
for i, (lbl, q, ans) in enumerate(steps):
ry = y + Inches(0.12) + i * row_h
if lbl:
add_rect(s, Inches(0.5), ry, Inches(1.3), Inches(0.78), ACCENT)
add_tb(s, Inches(0.5), ry, Inches(1.3), Inches(0.78),
lbl, sz=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_tb(s, Inches(1.95), ry + Inches(0.05), Inches(6.5), Inches(0.4),
q, sz=14, bold=True, color=GOLD)
add_tb(s, Inches(1.95), ry + Inches(0.42), Inches(10.5), Inches(0.38),
ans, sz=13, color=PALE_ACCENT)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 11 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("MONOMORPHIC VT",
"Module 4 | Braunwald's Heart Disease | Harrison's Principles")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 12 — Ischaemic Monomorphic VT
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Monomorphic VT: Ischaemic Aetiology (Post-MI)",
"SUBSTRATE & MECHANISM",
[
"Most common cause: previous MI with healed scar (months–years later)",
"Scar: electrically inert but bordered by viable myocardium (border zone)",
"Border zone = slow conduction → classic reentry circuit",
"Critical isthmus between dense scar segments = ablation target",
"VT commonly arises from the endocardial surface of MI scar",
"LBBB morphology → likely RV origin; RBBB morphology → likely LV origin",
"Inferior axis → superior wall origin; Superior axis → inferior wall origin",
"Anterior MI: most common substrate for sustained monomorphic VT",
],
"CLINICAL FEATURES",
[
"Presentation: palpitations, presyncope, syncope, cardiac arrest",
"ECG: wide regular tachycardia, uniform QRS morphology",
"Rate: typically 120–250 bpm",
"Haemodynamic tolerance depends on rate + underlying LV function",
"EF < 35%: poor haemodynamic tolerance, high SCD risk",
"ICD recipients: often detected on device monitoring",
"NSVT in post-MI patients: increased risk marker (MADIT criteria)",
"Electrophysiology study: inducible sustained VT = risk stratification",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 13 — Non-Ischaemic & Special Monomorphic VT
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Monomorphic VT: Non-Ischaemic & Special Forms",
"NON-ISCHAEMIC CARDIOMYOPATHY",
[
"Dilated cardiomyopathy (DCM): midmyocardial fibrosis → reentry",
"Bundle branch re-entry VT: uses His–Purkinje; LBBB pattern",
" → most common VT mechanism in DCM",
" → His–Purkinje ablation: curative for BBR-VT",
"ARVC/ARVD: RV fibrofatty replacement → LBBB VT (RV origin)",
" → Epsilon waves on ECG, T-wave inversion V1–V4",
" → High risk of SCD in young athletes",
"Cardiac sarcoidosis: septal involvement → multiple VT morphologies",
"HCM: septal hypertrophy, myocyte disarray → reentry or triggered",
],
"BUNDLE BRANCH REENTRY VT",
[
"Circuit: antegrade via right bundle → retrograde via left bundle",
"Substrate: His–Purkinje disease (prolonged HV interval > 60 ms)",
"Most common non-scar VT in DCM",
"ECG: LBBB morphology, QRS identical to conducted sinus beat",
"Diagnosis: EP study — HV interval same as during sinus rhythm",
"Treatment: right bundle branch ablation (curative)",
"But underlying DCM still requires ICD for SCD prevention",
"Chagas disease: apical aneurysm → endocardial VT substrate",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 14 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("POLYMORPHIC VT &\nTORSADES DE POINTES",
"Module 5 | Braunwald's Heart Disease | Harrison's Principles")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 15 — Polymorphic VT & TdP
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Polymorphic VT & Torsades de Pointes (TdP)",
"POLYMORPHIC VT",
[
"Beat-to-beat changes in QRS morphology during tachycardia",
"Causes: acute myocardial ischaemia (most common), electrolyte disorders",
"Acute MI → most dangerous cause of polymorphic VT → VF → SCD",
"Short-coupled PVCs (R-on-T phenomenon) initiating polymorphic VT/VF",
"Treatment: URGENT cardioversion + treat underlying ischaemia",
"Revascularisation (PCI) is the definitive treatment in ischaemic setting",
"IV amiodarone or lidocaine: antiarrhythmic adjuncts in acute ischaemia",
"IV beta-blocker: reduces sympathetically-triggered polymorphic VT",
],
"TORSADES DE POINTES",
[
"Polymorphic VT with 'twisting of the points' around the isoelectric line",
"Always associated with prolonged QT interval",
"Mechanism: early afterdepolarisations (EADs) → triggered activity",
"CAUSES — 'HALT' mnemonic:",
" H — Hypokalaemia / Hypomagnesaemia",
" A — Anti-arrhythmics (class Ia: quinidine, class III: sotalol, dofetilide)",
" L — Long QT syndrome (congenital: LQT1, LQT2, LQT3)",
" T — Tricyclics, antibiotics (azithromycin, clarithromycin), antipsychotics",
"Typical: pause-dependent — long-short RR sequence triggers TdP",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 16 — TdP Treatment & CPVT
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"TdP Treatment & CPVT",
"TORSADES DE POINTES — TREATMENT",
[
"IV Magnesium sulphate 2 g IV over 2–5 min → FIRST LINE (even if Mg normal)",
"Correct hypokalaemia: K⁺ target > 4.5 mEq/L",
"STOP all QT-prolonging drugs immediately",
"Cardiac pacing (overdrive pacing): 90–100 bpm → shorten QT, prevent pause",
"Isoproterenol infusion: 2–10 mcg/min → increases heart rate → shortens QT",
"Avoid class Ia and class III antiarrhythmics (prolong QT further)",
"Congenital LQTS: beta-blockers (LQT1, LQT2) / mexiletine (LQT3)",
"ICD implant: congenital LQTS with recurrent syncope or resuscitated arrest",
],
"CATECHOLAMINERGIC POLYMORPHIC VT (CPVT)",
[
"Rare; caused by RyR2 (ryanodine receptor) or CASQ2 mutations",
"Triggers: exercise or emotional stress → bidirectional or polymorphic VT",
"Exercise stress test: bidirectional VT at 100–120 bpm = diagnostic",
"ECG at rest: completely normal (no QT prolongation, no Brugada pattern)",
"Mechanism: DAD-mediated triggered activity from Ca²⁺ overload",
"Treatment: nadolol or propranolol (high-dose beta-blocker) — first line",
"Flecainide: reduces SR Ca²⁺ leak — add-on to beta-blockers",
"ICD in all high-risk patients (resuscitated arrest, recurrent syncope on meds)",
"Avoid exercise and emotional stress (lifestyle advice critical)",
],
sz=12,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 17 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("IDIOPATHIC VT",
"Module 6 | Braunwald's Heart Disease — Structurally normal hearts")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 18 — Idiopathic VT
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Idiopathic VT: Outflow Tract & Fascicular Forms",
"RVOT & LVOT VT",
[
"Most common idiopathic VT — structurally normal heart",
"RVOT VT: LBBB morphology + inferior axis (tall R in II, III, aVF)",
" → Triggered by exercise, stress, catecholamines",
" → Mechanism: cAMP-mediated triggered activity (DADs)",
" → Terminates with vagal manoeuvres or adenosine",
" → Beta-blockers, verapamil, or flecainide first-line",
" → Catheter ablation: > 80% success rate",
"LVOT VT: RBBB morphology; arises from aortic cusp, LV summit, LV endocardium",
],
"FASCICULAR VT (LEFT)",
[
"Verapamil-sensitive left fascicular VT (Belhassen's VT)",
"Origin: posterior fascicle (most common) → RBBB + left axis deviation",
"Origin: anterior fascicle (rare) → RBBB + right axis deviation",
"Mechanism: reentry involving the left Purkinje network",
"ECG: relatively narrow QRS (110–140 ms) with RBBB + left superior axis",
"Unique: responds to IV verapamil (unlike most VTs)",
"Adenosine: can terminate but less reliable",
"Catheter ablation: curative, high success rates (> 90%)",
"Prognosis: excellent — no structural disease, no SCD risk",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 19 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("ACUTE MANAGEMENT OF VT",
"Module 7 | Braunwald's Heart Disease | Rosen's Emergency Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 20 — Acute Management
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Acute Management of VT",
"HAEMODYNAMICALLY UNSTABLE VT",
[
"Signs: hypotension, altered consciousness, chest pain, pulmonary oedema",
"IMMEDIATE: Synchronised DC cardioversion (starting at 100–200 J biphasic)",
"Pulseless VT: treat as VF — unsynchronised shock 200 J + CPR",
"Sedation/anaesthesia before cardioversion if conscious",
"IV access, O₂, monitoring, defibrillator pads placed",
"Treat reversible causes: electrolytes, ischaemia (STEMI → PCI)",
"After cardioversion: IV amiodarone to prevent recurrence",
"Haemodynamic support: noradrenaline if ongoing hypotension",
],
"HAEMODYNAMICALLY STABLE VT",
[
"IV Amiodarone: 150 mg over 10 min, then 1 mg/min × 6 h, then 0.5 mg/min",
" → First-line for stable monomorphic VT in structural heart disease",
"IV Lidocaine: 1–1.5 mg/kg bolus (alternative, especially in acute ischaemia)",
"IV Procainamide: 10–15 mg/kg over 20 min (avoid in LV dysfunction)",
"IV Sotalol: class III — effective but avoid in prolonged QT or LV dysfunction",
"Adenosine: use only if uncertain — terminates RVOT/idiopathic VT; NOT ischaemic VT",
"Verapamil IV: ONLY for confirmed fascicular (verapamil-sensitive) VT",
"NEVER give verapamil for wide complex tachycardia unless SVT confirmed",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 21 — ACLS VT Algorithm
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("ACLS Algorithm: Sustained VT Management",
"Rosen's Emergency Medicine | AHA ACLS guidelines")
add_rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD_BG)
flow = [
("ASSESS HAEMODYNAMICS",
"Pulse present? Hypotension? Altered consciousness? Chest pain? Pulmonary oedema?"),
("UNSTABLE (any of above)",
"→ Sedation → Synchronised cardioversion 100–200 J biphasic → Reassess"),
("STABLE MONOMORPHIC VT",
"→ IV Amiodarone 150 mg / 10 min OR IV Procainamide OR IV Sotalol → Reassess at 20–30 min"),
("STABLE POLYMORPHIC VT (normal QTc)",
"→ Treat underlying ischaemia → IV Amiodarone → IV Beta-blocker → Consider cardioversion"),
("TORSADES DE POINTES",
"→ IV Magnesium 2 g → Correct K⁺ → Overdrive pacing → Stop QT-prolonging drugs"),
("REFRACTORY VT",
"→ Cardioversion → Consider repeat amiodarone or add lidocaine → Urgent EP consult"),
("AFTER TERMINATION",
"→ Identify and treat cause → Consider ICD → Long-term antiarrhythmic therapy → EP study"),
]
rh = Inches(0.71)
for i, (hd, txt) in enumerate(flow):
ry = y + Inches(0.1) + i * rh
add_rect(s, Inches(0.5), ry + Inches(0.06), Inches(3.0), Inches(0.52), ACCENT)
add_tb(s, Inches(0.5), ry + Inches(0.06), Inches(3.0), Inches(0.52),
hd, sz=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_tb(s, Inches(3.65), ry + Inches(0.1), Inches(9.0), Inches(0.5),
txt, sz=13, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 22 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("LONG-TERM MANAGEMENT",
"Module 8 | Braunwald's Heart Disease | Goldman-Cecil Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 23 — ICD Therapy
# ═══════════════════════════════════════════════================================================================
two_col(
"Long-term Management: ICD Therapy",
"ICD — INDICATIONS",
[
"SECONDARY PREVENTION (Class I):",
"Resuscitated VF or haemodynamically unstable VT",
"Spontaneous sustained VT with structural heart disease",
"PRIMARY PREVENTION (Class I — MADIT II, SCD-HeFT criteria):",
"Ischaemic CM: EF ≤ 35% + NYHA II–III (on optimal medical therapy ≥ 3 months)",
"Non-ischaemic CM: EF ≤ 35% + NYHA II–III (> 1 year after diagnosis)",
"Post-MI: EF ≤ 30% + NYHA I (MADIT II) or inducible VT on EP study (MUSTT)",
"Channelopathies: LQTS, Brugada, CPVT, ARVC (high-risk features)",
"HCM: ≥ 2 major SCD risk factors",
],
"ICD THERAPY — PRACTICAL POINTS",
[
"Device detects and treats VT/VF with ATP (antitachycardia pacing) or shock",
"ATP (burst or ramp pacing): terminates slow VT painlessly — patient unaware",
"Shock: reserved for faster VT or VF; painful but life-saving",
"Programming: detection intervals, therapy tiers, SVT discrimination",
"Inappropriate shocks: AF/sinus tachycardia sensed as VT — morbid; reduce with programming",
"Subcutaneous ICD (S-ICD): no leads in heart — for patients without pacing/ATP need",
"Wearable defibrillator vest: bridge to ICD implant (e.g., newly diagnosed DCM)",
"ICD does NOT eliminate VT — antiarrhythmic therapy or ablation often needed",
],
sz=12,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 24 — Antiarrhythmic Drug Therapy
# ═══════════════════════════════════════════════================================================================
two_col(
"Long-term Antiarrhythmic Drug Therapy for VT",
"AMIODARONE",
[
"Most effective antiarrhythmic for sustained VT/VF prevention",
"Class III (K⁺ channel block) + class I, II, IV properties (multi-channel)",
"Loading: 400–600 mg/day × 1–3 months → maintenance 100–200 mg/day",
"Reduces VT frequency but does not reduce mortality in most trials",
"Major toxicities: pulmonary fibrosis, thyroid (hypo/hyper), hepatotoxicity",
"Ophthalmology: corneal microdeposits, optic neuropathy",
"Interactions: warfarin (increases INR), digoxin toxicity",
"Drug of choice for VT in structural heart disease when ICD alone insufficient",
],
"OTHER ANTIARRHYTHMIC DRUGS",
[
"BETA-BLOCKERS: first-line for idiopathic RVOT VT, CPVT, post-MI VT prevention",
" Metoprolol or carvedilol — reduce sympathetically triggered VT",
"SOTALOL: class III + beta-blocker; effective for VT; avoid in LV dysfunction, long QT",
"MEXILETINE: class IB; add-on to amiodarone for refractory VT; reduces shock burden",
"QUINIDINE: class IA; for Brugada syndrome (prevents VF), short QT syndrome",
"FLECAINIDE/PROPAFENONE: idiopathic VT (RVOT) ONLY — AVOID in structural heart disease",
" (CAST trial: increased mortality post-MI with class IC drugs)",
"RANOLAZINE: late INa blocker; adjunct in LV dysfunction; reduces ICD shocks",
],
sz=12,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 25 — Catheter Ablation
# ═══════════════════════════════════════════════================================================================
two_col(
"Catheter Ablation for VT",
"TECHNIQUE & TARGETS",
[
"Radiofrequency catheter ablation (RFA): heat applied via catheter tip → lesion",
"Endocardial mapping: 3D electroanatomical mapping (CARTO, Ensite)",
"Identifies: dense scar, border zone, critical isthmus",
"Activation mapping (VT ongoing): locate earliest activation = exit site",
"Pace mapping: QRS matches VT morphology = stimulus site near origin",
"Entrainment mapping: identifies isthmus during sustained VT",
"Substrate mapping (when VT non-inducible or haemodynamically unstable)",
"Epicardial ablation: required for ARVC, Chagas, post-MI epicardial substrate",
],
"INDICATIONS & OUTCOMES",
[
"Indications (ACC/AHA/HRS Guidelines):",
" Recurrent VT despite antiarrhythmic drugs (Class I)",
" VT storm (≥ 3 episodes in 24 h) — urgent ablation",
" Preferred over chronic drug therapy for idiopathic VT (Class I)",
" BBR-VT in DCM: ablation curative (right bundle branch target)",
"Success rates by substrate:",
" Idiopathic RVOT VT: > 85%",
" Post-MI scar VT: 65–80% (freedom from VT recurrence)",
" DCM: 65–80%",
" ARVC: 50–70% (high recurrence due to progressive disease)",
"Serious complications: ~5% (cardiac perforation, stroke, AV block)",
],
sz=12,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 26 — SECTION DIVIDER
# ═══════════════════════════════════════════════════════════════════════════════
divider("VT STORM & SPECIAL SITUATIONS",
"Module 9 | Braunwald's Heart Disease | Goldman-Cecil Medicine")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 27 — VT Storm
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"VT Storm: Definition, Causes & Management",
"DEFINITION & CAUSES",
[
"VT storm = ≥ 3 separate episodes of VT/VF in 24 hours requiring intervention",
"Also: incessant VT; multiple appropriate ICD shocks in 24 h",
"Common precipitants:",
" Acute ischaemia / ACS",
" Electrolyte disturbances (hypokalaemia, hypomagnesaemia)",
" HF decompensation",
" Antiarrhythmic drug proarrhythmia",
" Infection / sepsis",
" Drug toxicity",
"Most common substrate: ischaemic cardiomyopathy with scar",
],
"MANAGEMENT",
[
"Immediate: IV sedation → reduces sympathetic tone (stellate ganglion activity)",
"Deep sedation (propofol, benzodiazepines, opioids): often dramatically effective",
"Treat triggers: urgent revascularisation if ACS, correct electrolytes",
"IV Amiodarone: 150 mg bolus × 2–3, then continuous infusion",
"IV Beta-blocker: propranolol or metoprolol — reduces sympathetically-driven VT",
"Stellate ganglion block / surgical stellectomy: last resort for refractory storm",
"Urgent catheter ablation: definitive treatment for recurrent monomorphic VT storm",
"Mechanical circulatory support (IABP, Impella): haemodynamic support before ablation",
"ICU admission: continuous monitoring, pacing, antiarrhythmic titration",
],
sz=12,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 28 — Summary: Drug Doses & Quick Reference
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("Quick Reference: Key VT Drug Doses",
"Braunwald's Heart Disease | Rosen's Emergency Medicine")
add_rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.25), CARD_BG)
rows = [
("Drug", "Indication", "IV Dose", "Notes"),
("Amiodarone", "Stable/unstable monomorphic VT", "150 mg/10 min → 1 mg/min × 6h", "First-line for structural HD"),
("Lidocaine", "VT in acute ischaemia / post-shock","1–1.5 mg/kg bolus; 1–4 mg/min infusion","Less effective than amiodarone"),
("Procainamide", "Stable monomorphic VT", "10–15 mg/kg @ 25–50 mg/min", "Avoid if LV dysfunction"),
("Magnesium", "TdP / Hypomagnesaemia", "2 g IV over 2–5 min", "First-line TdP even if Mg normal"),
("Sotalol", "Stable VT, no QTc prolongation", "1.5 mg/kg over 5 min", "Avoid if QTc > 440 ms"),
("Isoproterenol", "TdP (pause-dependent)", "2–10 mcg/min infusion", "Increases HR → shortens QT"),
("Beta-blocker", "CPVT, RVOT VT, polymorphic VT", "Propranolol 0.1 mg/kg IV", "Esmolol: short-acting option"),
("Verapamil", "Fascicular VT ONLY", "5–10 mg IV", "NEVER for unknown WCT"),
("Cardioversion", "Unstable VT", "100–200 J synchronised biphasic", "Unsynchronised if pulseless"),
]
col_w = [Inches(1.8), Inches(2.5), Inches(3.6), Inches(4.0)]
col_x = [Inches(0.45), Inches(2.3), Inches(4.85), Inches(8.5)]
rh2 = Inches(0.52)
for ci, (cxv, cwv) in enumerate(zip(col_x, col_w)):
add_rect(s, cxv, y + Inches(0.02), cwv - Inches(0.04), Inches(0.42), ACCENT)
add_tb(s, cxv + Inches(0.04), y + Inches(0.02), cwv - Inches(0.08), Inches(0.42),
rows[0][ci], sz=13, bold=True, color=WHITE)
for ri, row in enumerate(rows[1:], 1):
bg = CARD_BG if ri % 2 == 1 else RGBColor(0x28, 0x14, 0x14)
ry = y + Inches(0.48) + (ri-1)*rh2
add_rect(s, Inches(0.45), ry, Inches(12.45), rh2 - Inches(0.04), bg)
for ci, (cxv, cwv) in enumerate(zip(col_x, col_w)):
add_tb(s, cxv + Inches(0.04), ry + Inches(0.04), cwv - Inches(0.08), rh2 - Inches(0.08),
row[ci], sz=11, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 29 — Key Mnemonics & High-Yield Points
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Key Mnemonics & High-Yield Exam Points",
"MNEMONICS",
[
"TdP Causes — 'HALT QT':",
" H — Hypokalaemia / Hypomagnesaemia",
" A — Antiarrhythmics (Ia, III)",
" L — Long QT congenital (LQT1/2/3)",
" T — Tricyclics, antibiotics, antipsychotics",
"",
"VT on ECG — 'BAVID':",
" B — Broad QRS (> 160 ms)",
" A — AV dissociation",
" V — Variation concordance",
" I — Initial R wave in aVR",
" D — Deep S or QS in V6",
"",
"Idiopathic VT Sites — 'RVOT, LVOT, Fascicular'",
],
"HIGH-YIELD EXAM POINTS",
[
"AV dissociation = pathognomonic of VT",
"Fusion + capture beats = CONFIRM VT diagnosis",
"NEVER give verapamil for WCT without confirmed SVT",
"RVOT VT: LBBB + inferior axis; responds to adenosine & verapamil",
"Fascicular VT: RBBB + left axis; only VT that responds to verapamil",
"TdP: IV Mg FIRST even if Mg normal; overdrive pacing prevents recurrence",
"CAST trial: class IC drugs increased mortality post-MI → AVOID in structural HD",
"ICD: primary prevention if EF ≤ 35% on OMT (MADIT II, SCD-HeFT)",
"VT storm: IV sedation + beta-blocker often effective; urgent ablation if refractory",
"CPVT: exercise-triggered bidirectional VT; normal resting ECG; nadolol + flecainide",
"ARVC: epsilon wave + LBBB VT + RV failure in young athlete",
"BBR-VT: LBBB in DCM with HV > 60 ms → ablate right bundle branch",
],
sz=12,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 30 — References
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("References & Source Textbooks")
add_rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.25), CARD_BG)
refs = [
"1. Braunwald's Heart Disease: A Textbook of Cardiovascular Medicine, 2-Vol Set (2022, Elsevier) — Chapters 64, 67",
"2. Goldman-Cecil Medicine International Edition, 2-Volume Set (2024, Elsevier) — Chapters 52, 53, 54",
"3. Harrison's Principles of Internal Medicine, 22nd Edition (2025, McGraw Hill) — Arrhythmia chapters",
"4. Rosen's Emergency Medicine: Concepts and Clinical Practice, 10th Edition (2023) — Chapter 11 (Arrhythmias)",
"5. Tintinalli's Emergency Medicine: A Comprehensive Study Guide, 9th Ed. — Wide Complex Tachycardia",
"6. Guyton and Hall Textbook of Medical Physiology (2021, Elsevier) — Cardiac arrhythmia mechanisms",
"7. ACC/AHA/HRS Guideline for Management of Patients with Ventricular Arrhythmias (2017, JACC)",
"8. ESC Guidelines on Ventricular Arrhythmias and Prevention of SCD (2022, European Heart Journal)",
]
add_bullets(s, Inches(0.55), y + Inches(0.1), Inches(12.2),
H - y - Inches(0.4), refs, sz=15,
color=RGBColor(0xFF, 0xCC, 0xCC), bullet="")
# ═══════════════════════════════════════════════════════════════════════════════
# SAVE
# ═══════════════════════════════════════════════════════════════════════════════
out = "/tmp/workspace/oncological-emergencies/Ventricular_Tachycardia.pptx"
buf = BytesIO()
prs.save(buf)
with open(out, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out}")
print(f"Total slides: {len(prs.slides)}")
cd /tmp/workspace/oncological-emergencies && python build_vt_pptx.py 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/oncological-emergencies/Ventricular_Tachycardia.pptx') for i, slide in enumerate(prs.slides, 1): texts = [] for shape in slide.shapes: if shape.has_text_frame: t = shape.text_frame.text.strip() if t: texts.append(t[:65]) print(f'Slide {i:02d}: {\" | \".join(texts[:2])}') "
Ventricular Tachycardia
Presentation · PPTX
| # | Slide | Source |
|---|---|---|
| 1 | Title Slide | |
| 2 | Contents (10-module overview) | |
| 3 | Section Divider: Definition & Epidemiology | |
| 4 | VT: Definition & Classification (sustained, NSVT, mono, polymorphic, bidirectional) | Braunwald's |
| 5 | Epidemiology, Aetiology & Risk Factors (CAD, DCM, ARVC, channelopathies) | Braunwald's |
| 6 | Section Divider: Mechanisms | |
| 7 | Mechanisms: Reentry, Enhanced Automaticity, EADs & DADs | Braunwald's, Guyton & Hall |
| 8 | Section Divider: ECG Diagnosis | |
| 9 | ECG Criteria for VT — AV dissociation, concordance, aVR algorithm | Braunwald's, Goldman-Cecil |
| 10 | Brugada 4-Step Algorithm (VT vs SVT) | Goldman-Cecil |
| 11 | Section Divider: Monomorphic VT | |
| 12 | Post-MI Ischaemic Monomorphic VT — scar substrate, mapping | Braunwald's |
| 13 | Non-ischaemic VT — DCM, Bundle Branch Reentry, ARVC, Sarcoidosis | Braunwald's |
| 14 | Section Divider: Polymorphic VT | |
| 15 | Polymorphic VT & Torsades de Pointes — causes, HALT mnemonic | Braunwald's, Harrison's |
| 16 | TdP Treatment + CPVT (Mg, overdrive pacing, nadolol, flecainide) | Braunwald's |
| 17 | Section Divider: Idiopathic VT | |
| 18 | RVOT/LVOT VT & Fascicular (Belhassen's) VT | Braunwald's |
| 19 | Section Divider: Acute Management | |
| 20 | Acute Management — Unstable vs Stable VT, drug choices | Rosen's EM |
| 21 | ACLS Algorithm Flowchart — step-by-step VT management | Rosen's EM |
| 22 | Section Divider: Long-term Management | |
| 23 | ICD Therapy — Primary & Secondary Prevention (MADIT II, SCD-HeFT) | Braunwald's |
| 24 | Antiarrhythmic Drugs — Amiodarone, sotalol, mexiletine, flecainide (CAST!) | Goldman-Cecil |
| 25 | Catheter Ablation — technique, targets, success rates by substrate | Braunwald's |
| 26 | Section Divider: VT Storm | |
| 27 | VT Storm — definition, triggers, sedation, stellate ganglion block, urgent ablation | Braunwald's |
| 28 | Drug Dose Reference Table (9 drugs with doses and indications) | |
| 29 | Mnemonics & High-Yield Points (HALT QT, BAVID, exam pearls) | |
| 30 | References (8 standard cardiology textbooks) |
Ecmo trials and there indications used in each trial to initiate ecmo as a ppt presentation
ECMO extracorporeal membrane oxygenation randomized controlled trial
ECMO major clinical trials CESAR EOLIA ARREST INCEPTION ECPR indications 2024
PMID: 29791822
PMID: 19762075
PMID: 33197396
PMID: 37634145
PMID: 35191923
PMID: 36335478
PMID: 37334659
PMID: 33021684
PMID: 37643628
INCEPTION trial ECPR 2023 NEJM inclusion criteria results ECMO cardiac arrest
ls /tmp/workspace/oncological-emergencies/
~/oncological-emergencies/build_ecmo_pptx.py
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from io import BytesIO
# ── Palette (teal/navy evidence-medicine theme) ────────────────────────────────
NAVY = RGBColor(0x04, 0x26, 0x4A)
TEAL = RGBColor(0x00, 0x7E, 0x8A)
TEAL_DARK = RGBColor(0x00, 0x56, 0x60)
GOLD = RGBColor(0xF0, 0xAB, 0x00)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BG = RGBColor(0xF0, 0xF5, 0xF8)
CARD = RGBColor(0x09, 0x30, 0x50)
PALE_TEAL = RGBColor(0xCC, 0xED, 0xF0)
RED_NEG = RGBColor(0xC0, 0x39, 0x2B)
GREEN_POS = RGBColor(0x1A, 0x7A, 0x3C)
AMBER = RGBColor(0xE6, 0x7E, 0x22)
TEXT_DARK = RGBColor(0x08, 0x20, 0x38)
MID_BLUE = RGBColor(0x12, 0x4E, 0x78)
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
blank = prs.slide_layouts[6]
# ═══════════════════════════════════════════════════════════════════════════════
# HELPERS
# ═══════════════════════════════════════════════════════════════════════════════
def rect(slide, x, y, w, h, color):
s = slide.shapes.add_shape(1, x, y, w, h)
s.fill.solid(); s.fill.fore_color.rgb = color
s.line.fill.background(); return s
def tb(slide, x, y, w, h, text, sz=16, bold=False, color=WHITE,
align=PP_ALIGN.LEFT, italic=False):
t = slide.shapes.add_textbox(x, y, w, h)
tf = t.text_frame; tf.word_wrap = True
tf.margin_left = tf.margin_right = Inches(0.05)
tf.margin_top = tf.margin_bottom = Inches(0.02)
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 bullets(slide, x, y, w, h, lines, sz=14, color=WHITE, head=None,
head_sz=15, head_color=None, bchar="▸ "):
t = slide.shapes.add_textbox(x, y, w, h)
tf = t.text_frame; tf.word_wrap = True
tf.margin_left = tf.margin_right = Inches(0.06)
tf.margin_top = tf.margin_bottom = Inches(0.04)
started = False
if head:
p = tf.paragraphs[0]; p.space_after = Pt(3)
r = p.add_run(); r.text = head
r.font.size = Pt(head_sz); r.font.bold = True
r.font.color.rgb = head_color or GOLD; r.font.name = "Calibri"
started = True
for i, line in enumerate(lines):
p = tf.add_paragraph() if started else tf.paragraphs[0]
started = True; p.space_before = Pt(1)
r = p.add_run(); r.text = bchar + line
r.font.size = Pt(sz); r.font.color.rgb = color; r.font.name = "Calibri"
return t
def header_slide(title, subtitle=None):
s = prs.slides.add_slide(blank)
rect(s, 0, 0, W, H, LIGHT_BG)
rect(s, 0, 0, W, Inches(1.08), NAVY)
rect(s, 0, Inches(1.08), W, Inches(0.06), TEAL)
tb(s, Inches(0.4), Inches(0.1), Inches(12.5), Inches(0.88),
title, sz=30, bold=True, color=WHITE)
y = Inches(1.25)
if subtitle:
tb(s, Inches(0.4), y, Inches(12.5), Inches(0.4),
subtitle, sz=14, color=TEAL, italic=True)
y += Inches(0.44)
return s, y
def divider_slide(title, sub="", color=TEAL_DARK):
s = prs.slides.add_slide(blank)
rect(s, 0, 0, W, H, NAVY)
rect(s, 0, Inches(2.8), W, Inches(0.1), TEAL)
rect(s, 0, Inches(2.95), W, Inches(0.04), GOLD)
tb(s, Inches(0.8), Inches(1.5), Inches(11.5), Inches(1.3),
title, sz=38, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
if sub:
tb(s, Inches(0.8), Inches(3.1), Inches(11.5), Inches(0.65),
sub, sz=18, color=TEAL, align=PP_ALIGN.CENTER, italic=True)
def two_col(title, lh, lb, rh, rb, subtitle=None, sz=13):
s, y = header_slide(title, subtitle)
cw = Inches(6.2); gap = Inches(0.3)
lx = Inches(0.4); rx = lx + cw + gap
ch = H - y - Inches(0.25)
rect(s, lx, y, cw, ch, CARD)
tb(s, lx+Inches(0.1), y+Inches(0.08), cw-Inches(0.2), Inches(0.4),
lh, sz=14, bold=True, color=GOLD)
bullets(s, lx+Inches(0.08), y+Inches(0.54), cw-Inches(0.16), ch-Inches(0.64),
lb, sz=sz, color=WHITE)
rect(s, rx, y, cw, ch, CARD)
tb(s, rx+Inches(0.1), y+Inches(0.08), cw-Inches(0.2), Inches(0.4),
rh, sz=14, bold=True, color=GOLD)
bullets(s, rx+Inches(0.08), y+Inches(0.54), cw-Inches(0.16), ch-Inches(0.64),
rb, sz=sz, color=WHITE)
def full_box(title, blist, subtitle=None, sz=14):
s, y = header_slide(title, subtitle)
bh = H - y - Inches(0.25)
rect(s, Inches(0.4), y, Inches(12.5), bh, CARD)
bullets(s, Inches(0.55), y+Inches(0.12), Inches(12.2), bh-Inches(0.25),
blist, sz=sz, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# TRIAL CARD SLIDE — dedicated layout for each trial
# ═══════════════════════════════════════════════════════════════════════════════
def trial_slide(trial_name, year, journal, n, ecmo_type,
indication_lines, key_results_lines,
verdict, verdict_color=GREEN_POS, pmid=""):
s = prs.slides.add_slide(blank)
rect(s, 0, 0, W, H, LIGHT_BG)
# Header bar
rect(s, 0, 0, W, Inches(0.95), NAVY)
rect(s, 0, Inches(0.95), W, Inches(0.05), TEAL)
tb(s, Inches(0.4), Inches(0.07), Inches(8.5), Inches(0.82),
trial_name, sz=28, bold=True, color=WHITE)
# Year / Journal badge
rect(s, Inches(9.3), Inches(0.1), Inches(3.8), Inches(0.72), TEAL_DARK)
tb(s, Inches(9.35), Inches(0.12), Inches(3.7), Inches(0.68),
f"{year} | {journal}", sz=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
y = Inches(1.1)
# ── ECMO TYPE & N pill ───────────────────────────────────────────────────
rect(s, Inches(0.4), y, Inches(2.5), Inches(0.48), TEAL)
tb(s, Inches(0.4), y, Inches(2.5), Inches(0.48),
ecmo_type, sz=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
rect(s, Inches(3.1), y, Inches(1.6), Inches(0.48), MID_BLUE)
tb(s, Inches(3.1), y, Inches(1.6), Inches(0.48),
f"n = {n}", sz=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
if pmid:
tb(s, Inches(5.0), y, Inches(4.0), Inches(0.48),
f"PMID: {pmid}", sz=12, color=TEAL, italic=True)
y += Inches(0.6)
# ── LEFT: INCLUSION / INDICATIONS ────────────────────────────────────────
lh = H - y - Inches(0.85)
lw = Inches(6.2)
rect(s, Inches(0.4), y, lw, lh, CARD)
tb(s, Inches(0.5), y+Inches(0.08), lw-Inches(0.2), Inches(0.4),
"ECMO INITIATION CRITERIA / INCLUSION", sz=13, bold=True, color=GOLD)
bullets(s, Inches(0.48), y+Inches(0.54), lw-Inches(0.16), lh-Inches(0.64),
indication_lines, sz=12.5, color=WHITE)
# ── RIGHT: KEY RESULTS ───────────────────────────────────────────────────
rx = Inches(6.9)
rw = Inches(6.2)
rect(s, rx, y, rw, lh, CARD)
tb(s, rx+Inches(0.1), y+Inches(0.08), rw-Inches(0.2), Inches(0.4),
"KEY RESULTS", sz=13, bold=True, color=GOLD)
bullets(s, rx+Inches(0.08), y+Inches(0.54), rw-Inches(0.16), lh-Inches(0.64),
key_results_lines, sz=12.5, color=WHITE)
# ── VERDICT banner ───────────────────────────────────────────────────────
vy = H - Inches(0.72)
rect(s, Inches(0.4), vy, Inches(12.5), Inches(0.55), verdict_color)
tb(s, Inches(0.55), vy, Inches(12.3), Inches(0.55),
verdict, sz=13, bold=True, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE
# ═══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
rect(s, 0, 0, W, H, NAVY)
rect(s, 0, Inches(3.45), W, Inches(0.1), TEAL)
rect(s, 0, Inches(3.6), W, Inches(0.04), GOLD)
tb(s, Inches(0.8), Inches(0.9), Inches(11.5), Inches(1.2),
"ECMO CLINICAL TRIALS", sz=52, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
tb(s, Inches(0.8), Inches(2.2), Inches(11.5), Inches(0.8),
"Indications, Design, Results & Clinical Implications",
sz=22, color=TEAL, align=PP_ALIGN.CENTER, italic=True)
tb(s, Inches(0.8), Inches(3.75), Inches(11.5), Inches(0.55),
"VV-ECMO for ARDS | VA-ECMO for Cardiogenic Shock | ECPR for Cardiac Arrest",
sz=16, color=PALE_TEAL, align=PP_ALIGN.CENTER)
tb(s, Inches(0.8), Inches(4.4), Inches(11.5), Inches(0.45),
"Evidence-based Review • CESAR · EOLIA · ECLS-SHOCK · ECMO-CS · EURO SHOCK · ARREST · Prague (OHCA) · INCEPTION",
sz=12.5, color=RGBColor(0x88, 0xAA, 0xBB), align=PP_ALIGN.CENTER)
tb(s, Inches(0.8), Inches(5.1), Inches(11.5), Inches(0.4),
"Critical Care / Cardiology • 2025–2026 Edition",
sz=13, color=RGBColor(0x66, 0x88, 0x99), align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 — ECMO OVERVIEW
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"ECMO: Overview & Types",
"WHAT IS ECMO?",
[
"Extracorporeal Membrane Oxygenation — life support via external pump + membrane oxygenator",
"Provides gas exchange and/or haemodynamic support outside the body",
"Circuit: cannulae → centrifugal pump → membrane oxygenator → patient",
"Anticoagulation (heparin) required to prevent circuit thrombosis",
"Managed by specialised ECMO centres (ELSO-affiliated)",
"Bridge to recovery, bridge to decision, or bridge to transplant",
"ELSO registry: > 150,000 ECMO runs logged since 1989",
],
"TYPES OF ECMO",
[
"VV-ECMO (Veno-Venous):",
" Drainage from venous system → oxygenated blood returned to vein",
" Provides respiratory support ONLY (no cardiac support)",
" Indication: severe ARDS, refractory hypoxaemia/hypercapnia",
"",
"VA-ECMO (Veno-Arterial):",
" Drainage from vein → returned to artery (bypasses heart + lungs)",
" Provides BOTH cardiac and respiratory support",
" Indication: cardiogenic shock, cardiac arrest (ECPR)",
"",
"ECPR (Extracorporeal CPR): VA-ECMO during active cardiac arrest",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 — CONTENTS
# ═══════════════════════════════════════════════════════════════════════════════
s, y = header_slide("Trial Index: ECMO Clinical Trials",
"Categorised by indication — Respiratory | Cardiogenic Shock | Cardiac Arrest")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
rows = [
("RESPIRATORY FAILURE (VV-ECMO)", "", "GOLD"),
("CESAR Trial", "2009, Lancet", "Severe ARDS / respiratory failure — Murray Score > 3 or pH < 7.20"),
("EOLIA Trial", "2018, NEJM", "Very severe ARDS — PaO₂/FiO₂ < 50 for 3 h, < 80 for 6 h, or pH < 7.25 + PaCO₂ ≥ 60"),
("CESAR + EOLIA Meta-analysis", "2020, ICM", "Combined analysis — ECMO significantly reduces 90-day mortality in severe ARDS"),
("CARDIOGENIC SHOCK (VA-ECMO)", "", "GOLD"),
("ECMO-CS Trial", "2023, Circulation", "Rapidly deteriorating or severe cardiogenic shock — immediate VA-ECMO vs conservative"),
("ECLS-SHOCK Trial", "2023, NEJM", "AMI-related cardiogenic shock with planned early revascularisation"),
("EURO SHOCK Trial", "2023, EuroIntervention", "Persistent CGS 30 min after PPCI of culprit lesion"),
("VA-ECMO IPD Meta-analysis", "2023, Lancet", "4 RCTs (n=567) — no mortality benefit; increased bleeding/vascular complications"),
("CARDIAC ARREST (ECPR)", "", "GOLD"),
("ARREST Trial", "2020, Lancet", "OHCA + refractory VF (≥ 3 shocks) — no ROSC — age 18–75 — transport < 30 min"),
("Prague OHCA Trial", "2022, JAMA", "Witnessed OHCA, presumed cardiac, no ROSC — intra-arrest transport + ECPR strategy"),
("INCEPTION Trial", "2023, NEJM", "Witnessed OHCA, initial ventricular arrhythmia, age 18–70, no ROSC — early ECPR"),
]
col_xs = [Inches(0.5), Inches(2.85), Inches(5.85)]
col_ws = [Inches(2.3), Inches(3.0), Inches(7.2)]
rh = Inches(0.42)
for i, row in enumerate(rows):
ry = y + Inches(0.08) + i * rh
if row[2] == "GOLD":
rect(s, Inches(0.45), ry, Inches(12.5), Inches(0.36), TEAL_DARK)
tb(s, Inches(0.55), ry, Inches(12.3), Inches(0.36),
row[0], sz=13, bold=True, color=GOLD)
else:
bg = CARD if i % 2 == 0 else RGBColor(0x0C, 0x3A, 0x5C)
rect(s, Inches(0.45), ry, Inches(12.45), rh-Inches(0.04), bg)
for ci, (cx, cw) in enumerate(zip(col_xs, col_ws)):
tb(s, cx+Inches(0.04), ry+Inches(0.04), cw, rh-Inches(0.08),
row[ci], sz=12, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 — SECTION DIVIDER: ARDS / VV-ECMO
# ═══════════════════════════════════════════════════════════════════════════════
divider_slide("VV-ECMO FOR SEVERE ARDS",
"CESAR Trial (2009) • EOLIA Trial (2018) • Meta-Analysis (2020)")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 — CESAR Trial
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="CESAR Trial — Conventional vs ECMO for Severe Respiratory Failure",
year="2009", journal="Lancet", n="180", ecmo_type="VV-ECMO",
indication_lines=[
"Age: 18–65 years",
"Severe but POTENTIALLY REVERSIBLE respiratory failure",
"Murray Score > 3.0 (combined PaO₂/FiO₂, PEEP, compliance, CXR score)",
"OR arterial pH < 7.20 on optimal conventional management",
"Exclusion:",
" High-pressure ventilation (PIP > 30 cmH₂O) or FiO₂ > 0.8 for > 7 days",
" Intracranial bleeding",
" Contraindication to limited heparinisation",
" No active treatment being continued",
],
key_results_lines=[
"63% ECMO arm vs 47% control survived to 6 months without severe disability",
"Relative Risk 0.69 (95% CI 0.05–0.97; p = 0.03) — SIGNIFICANT",
"68/90 patients (75%) actually received ECMO",
"Cost-effective: £19,252 per QALY (well within NHS threshold)",
"NOTE: ECMO arm received protocol-based mechanical ventilation",
"Not purely an ECMO vs no-ECMO comparison — confounded by referral + protocol",
"LANDMARK: First adult RCT to show ECMO benefit for ARDS",
],
verdict="POSITIVE: Referral to ECMO centre improves survival. Murray > 3 or pH < 7.20 = indication. (PMID 19762075)",
verdict_color=GREEN_POS, pmid="19762075",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 — EOLIA Trial
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="EOLIA Trial — ECMO for Very Severe ARDS",
year="2018", journal="NEJM", n="249", ecmo_type="VV-ECMO",
indication_lines=[
"ECMO initiated if ANY ONE of 3 criteria met AFTER ≥ 6 h optimal conventional care:",
"",
"Criterion 1: PaO₂/FiO₂ < 50 mmHg for > 3 hours",
"Criterion 2: PaO₂/FiO₂ < 80 mmHg for > 6 hours",
"Criterion 3: Arterial pH < 7.25 AND PaCO₂ ≥ 60 mmHg for > 6 hours",
" (despite RR ≤ 35/min, tidal volume 6 mL/kg, PEEP ≥ 10 cmH₂O)",
"",
"Additional requirements: Mechanical ventilation ≤ 7 days",
"Exclusion: Chronic respiratory disease, contraindication to anticoagulation",
],
key_results_lines=[
"60-day mortality: 35% ECMO vs 46% control (RR 0.76; 95% CI 0.55–1.04; p = 0.09)",
"Primary endpoint NOT met (p = 0.09) — trial underpowered due to high crossover",
"28% of control group crossed over to rescue ECMO (57% of those died)",
"ECMO group: more bleeding (46% vs 28%) + thrombocytopenia",
"ECMO group: FEWER ischaemic strokes (0% vs 5%)",
"Bayesian analysis: 97% posterior probability of ECMO benefit",
"Combined meta-analysis with CESAR: 90-day mortality significantly reduced (RR 0.75; p = 0.013)",
],
verdict="NEAR-MISS: Non-significant p = 0.09 due to 28% crossover — Bayesian analysis and meta-analysis support VV-ECMO benefit for very severe ARDS. (PMID 29791822)",
verdict_color=AMBER, pmid="29791822",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 — CESAR + EOLIA Meta-Analysis
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="CESAR + EOLIA Individual Patient Data Meta-Analysis",
year="2020", journal="Intensive Care Medicine", n="429", ecmo_type="VV-ECMO",
indication_lines=[
"Combined patient-level data from both RCTs (CESAR + EOLIA)",
"Consistent ECMO inclusion criteria applied:",
" Murray Score > 3.0 (CESAR) OR",
" PaO₂/FiO₂ < 50 mmHg × 3h / < 80 mmHg × 6h / pH < 7.25 + PaCO₂ ≥ 60 (EOLIA)",
"Systematic review methodology (PROSPERO-registered)",
"Primary outcome: 90-day mortality",
"Subgroup: patients with ≤ 2 organ failures at randomisation",
],
key_results_lines=[
"90-day mortality: 36% ECMO vs 48% control (RR 0.75; 95% CI 0.60–0.94; p = 0.013)",
"STATISTICALLY SIGNIFICANT — overcomes individual trial underpowering",
"RR for 90-day treatment failure: 0.65 (95% CI 0.52–0.80) — significant",
"ECMO patients: more days alive out of ICU",
"ECMO: fewer days with respiratory, cardiovascular, renal, neurological failure",
"KEY SUBGROUP: Benefit greatest in patients with ≤ 2 organ failures",
"CONCLUSION: VV-ECMO reduces 90-day mortality in severe ARDS",
],
verdict="POSITIVE (Meta-Analysis): VV-ECMO significantly reduces 90-day mortality vs conventional management in severe ARDS. (PMID 33021684)",
verdict_color=GREEN_POS, pmid="33021684",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 8 — SECTION DIVIDER: CARDIOGENIC SHOCK
# ═══════════════════════════════════════════════════════════════════════════════
divider_slide("VA-ECMO FOR CARDIOGENIC SHOCK",
"ECMO-CS • ECLS-SHOCK • EURO SHOCK • IPD Meta-Analysis (2023)")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 9 — ECLS-SHOCK Trial
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="ECLS-SHOCK Trial — ECMO in AMI-Related Cardiogenic Shock",
year="2023", journal="NEJM", n="420", ecmo_type="VA-ECMO",
indication_lines=[
"Acute Myocardial Infarction complicated by Cardiogenic Shock",
"Early revascularisation (PCI or CABG) planned",
"Cardiogenic shock criteria (≥ 1 of):",
" Systolic BP < 90 mmHg for > 30 min OR vasopressor use to maintain SBP ≥ 90",
" Clinical signs of tissue hypoperfusion (cold extremities, cyanosis, oliguria)",
" Serum lactate > 2 mmol/L OR cardiac index < 2.2 L/min/m² on Swan-Ganz",
"Randomisation BEFORE revascularisation (early strategy)",
"Exclusion: ECMO contraindication, CPR > 45 min, prior cardiac surgery",
],
key_results_lines=[
"30-day all-cause mortality: 47.8% ECMO vs 49.0% control (RR 0.98; p = 0.81)",
"PRIMARY ENDPOINT NOT MET — NO MORTALITY BENEFIT",
"Median ventilation: 7 days ECMO vs 5 days control",
"ECMO group — significantly MORE complications:",
" Moderate/severe bleeding: 23.4% vs 9.6% (RR 2.44)",
" Peripheral vascular complications: 11.0% vs 3.8% (RR 2.86)",
"ECMO group: more ICU days, more adverse events",
"CONCLUSION: Routine VA-ECMO not supported in AMI cardiogenic shock",
],
verdict="NEGATIVE: No mortality benefit + significantly higher bleeding and vascular complications. Routine VA-ECMO NOT recommended in AMI cardiogenic shock. (PMID 37634145)",
verdict_color=RED_NEG, pmid="37634145",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 10 — ECMO-CS Trial
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="ECMO-CS Trial — Immediate vs Conservative VA-ECMO in Cardiogenic Shock",
year="2023", journal="Circulation", n="117", ecmo_type="VA-ECMO",
indication_lines=[
"RAPIDLY DETERIORATING or SEVERE Cardiogenic Shock",
"Rapidly deteriorating = haemodynamic deterioration despite initial treatment",
"Severe cardiogenic shock = cardiogenic shock NOT improving",
"Standard cardiogenic shock definition applied:",
" SBP < 90 mmHg OR vasopressor-dependent",
" Clinical hypoperfusion (lactate > 2, oliguria, altered consciousness)",
" Any aetiology of cardiogenic shock included (not only AMI)",
"IMMEDIATE VA-ECMO arm vs conservative (allow downstream ECMO if worsening)",
],
key_results_lines=[
"Composite endpoint (death, resuscitated arrest, other MCS): 63.8% vs 71.2%",
"Hazard ratio 0.72 (95% CI 0.46–1.12; p = 0.21) — NOT significant",
"39% of conservative arm crossed over to VA-ECMO",
"30-day mortality: 50.0% vs 47.5% — NO difference",
"No difference in safety outcomes (bleeding, stroke, vascular complications)",
"Trial underpowered (n = 117 vs planned n = 120)",
"CONCLUSION: Immediate VA-ECMO does not improve outcomes vs selective use",
],
verdict="NEGATIVE: Immediate VA-ECMO does not improve composite outcomes vs conservative strategy in cardiogenic shock. (PMID 36335478)",
verdict_color=RED_NEG, pmid="36335478",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 11 — EURO SHOCK Trial
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="EURO SHOCK Trial — VA-ECMO After PPCI in Persistent Cardiogenic Shock",
year="2023", journal="EuroIntervention", n="35", ecmo_type="VA-ECMO",
indication_lines=[
"AMI-related Cardiogenic Shock PERSISTING 30 minutes after PPCI",
"Culprit lesion treated by PPCI first",
"Persistent cardiogenic shock defined as:",
" SBP < 90 mmHg OR vasopressor-dependent AFTER revascularisation",
" Signs of tissue hypoperfusion (lactate, oliguria, mental status)",
"Multicentre pan-European trial (Spain, UK, Germany, Czech Republic)",
"Randomisation: VA-ECMO vs continue standard therapy",
"Trial stopped early due to COVID-19 pandemic (target n = 428)",
],
key_results_lines=[
"30-day mortality: 43.8% ECMO vs 61.1% standard (HR 0.56; p = 0.22) — NS",
"1-year mortality: 51.8% ECMO vs 81.5% standard (HR 0.52; p = 0.14) — NS",
"SEVERELY UNDERPOWERED — only 35/428 planned patients enrolled",
"Numerically favours ECMO at 1 year (but non-significant, very wide CI)",
"Vascular/bleeding complications more common in ECMO arm",
"Demonstrates feasibility of RCT design for VA-ECMO in CGS",
"CONCLUSION: Inconclusive — underpowered due to pandemic; inspires future trials",
],
verdict="INCONCLUSIVE (underpowered): Numerically favours ECMO at 1 year but stopped early — no definitive conclusions possible. (PMID 37334659)",
verdict_color=AMBER, pmid="37334659",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 12 — VA-ECMO IPD Meta-Analysis (Lancet 2023)
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="VA-ECMO in Infarct CGS — Individual Patient Data Meta-Analysis",
year="2023", journal="Lancet", n="567", ecmo_type="VA-ECMO",
indication_lines=[
"Pooled analysis of 4 RCTs comparing VA-ECMO vs optimal medical therapy",
"In patients with INFARCT-RELATED CARDIOGENIC SHOCK:",
" ECMO-CS trial (n = 117)",
" ECLS-SHOCK trial (n = 420)",
" PRAGUE OHCA (cardiogenic shock subset)",
" EURO SHOCK trial (n = 35)",
"Common inclusion criteria across trials:",
" AMI or infarct-related origin of cardiogenic shock",
" SBP < 90 or vasopressor requirement + signs of hypoperfusion",
],
key_results_lines=[
"Primary outcome (30-day death): OR 0.93 (95% CI 0.66–1.29) — NOT significant",
"No mortality benefit with routine VA-ECMO",
"Major bleeding: OR 2.44 (95% CI 1.55–3.84) — significantly higher with ECMO",
"Peripheral ischaemic complications: OR 3.53 (95% CI 1.70–7.34) — sig. higher",
"All prespecified subgroups CONSISTENT — no beneficial subgroup identified",
"CONCLUSION: Routine early VA-ECMO should NOT be standard of care in AMI-CGS",
"Authors: 'Careful review of VA-ECMO indication is warranted'",
],
verdict="NEGATIVE (High-quality Meta-Analysis): No mortality benefit; significant harm. Routine VA-ECMO in infarct cardiogenic shock is NOT supported. (PMID 37643628)",
verdict_color=RED_NEG, pmid="37643628",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 13 — SECTION DIVIDER: ECPR
# ═══════════════════════════════════════════════════════════════════════════════
divider_slide("ECPR — ECMO FOR CARDIAC ARREST",
"ARREST Trial (2020) • Prague OHCA (2022) • INCEPTION Trial (2023)")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 14 — ARREST Trial
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="ARREST Trial — ECMO-Facilitated Resuscitation for Refractory VF",
year="2020", journal="Lancet", n="30", ecmo_type="ECPR (VA-ECMO)",
indication_lines=[
"Out-of-Hospital Cardiac Arrest (OHCA) with refractory Ventricular Fibrillation",
"Inclusion criteria:",
" Age: 18–75 years",
" Initial rhythm: Ventricular Fibrillation (shockable)",
" Refractory VF: NO ROSC after ≥ 3 shocks delivered",
" Automated CPR device in use (LUCAS)",
" Estimated transfer time to hospital < 30 min",
"ECMO arm: early transfer to cath lab → VA-ECMO → immediate coronary angiography",
"Control arm: standard ACLS in emergency department",
],
key_results_lines=[
"Survival to hospital discharge: 43% ECMO vs 7% standard ACLS",
"Risk difference 36.2% (95% CI 3.7–59.2%)",
"Posterior probability of ECMO superiority: 0.9861",
"Trial STOPPED at first interim analysis — unanimous DSMB recommendation",
"6-month cumulative survival significantly better in ECMO group",
"NO unanticipated serious adverse events",
"MAJOR LIMITATION: Very small trial (n = 30); single centre; Phase 2 only",
"CONCLUSION: Early ECPR dramatically improved survival in refractory VF",
],
verdict="STRONGLY POSITIVE: 43% vs 7% survival — trial stopped early. First US RCT showing ECPR benefit in refractory VF. (PMID 33197396)",
verdict_color=GREEN_POS, pmid="33197396",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 15 — Prague OHCA Trial
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="Prague OHCA Trial — Invasive Strategy + ECPR vs Standard Care",
year="2022", journal="JAMA", n="256", ecmo_type="ECPR (VA-ECMO)",
indication_lines=[
"Witnessed Out-of-Hospital Cardiac Arrest of PRESUMED CARDIAC ORIGIN",
"Inclusion criteria:",
" Age: 18–65 years",
" Witnessed arrest",
" No ROSC despite standard CPR",
" Presumed cardiac aetiology",
" Both shockable AND non-shockable rhythms included",
" Prehospital hypothermia protocol implemented",
"Invasive strategy arm: intra-arrest transport + ECPR + immediate invasive assessment",
"Standard arm: conventional ACLS on-scene (2/3 of patients received ECMO)",
],
key_results_lines=[
"180-day survival with good neuro outcome (CPC 1–2): 31.5% vs 22.0%",
"OR 1.63 (95% CI 0.93–2.85; p = 0.09) — PRIMARY ENDPOINT NOT MET",
"30-day neurological recovery (secondary): 30.6% vs 18.2% (OR 1.99; p = 0.02) — SIG.",
"Trial stopped for FUTILITY at interim analysis (not harm)",
"Bleeding: 31% invasive vs 15% standard (significantly more)",
"Time from arrest to ECMO ranged 12–61 min",
"Only 64% of invasive arm actually received ECMO",
"CONCLUSION: Non-significant primary endpoint; possibly underpowered",
],
verdict="NEUTRAL: Primary endpoint missed (p = 0.09); significant 30-day neurological benefit; underpowered. Prehospital hypothermia may have blunted benefit. (PMID 35191923)",
verdict_color=AMBER, pmid="35191923",
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 16 — INCEPTION Trial
# ═══════════════════════════════════════════════════════════════════════════════
trial_slide(
trial_name="INCEPTION Trial — Early ECPR for Refractory OHCA (Netherlands)",
year="2023", journal="NEJM", n="160", ecmo_type="ECPR (VA-ECMO)",
indication_lines=[
"Witnessed Out-of-Hospital Cardiac Arrest with initial VENTRICULAR ARRHYTHMIA",
"Inclusion criteria:",
" Age: 18–70 years",
" Witnessed arrest",
" Initial rhythm: Shockable (VF or pVT) — primary cardiac cause",
" No ROSC despite standard CPR",
" Randomised WHILE IN TRANSPORT to hospital",
" Included even if transport time > 60 min (unlike ARREST)",
"Multicentre Dutch trial (11 centres)",
"ECPR arm: VA-ECMO in hospital → immediate coronary angiography if indicated",
],
key_results_lines=[
"30-day survival with CPC 1–2: 20% ECPR vs 16% conventional CPR",
"Risk difference 4% (95% CI -7 to 15%; p = 0.53) — NOT SIGNIFICANT",
"6-month survival with CPC 1–2: same pattern — non-significant",
"ECMO successfully initiated in 86% of ECPR arm",
"Median arrest-to-ECMO flow: 74 minutes",
"Mean age: 54–57 years; 90% male; most had MI as cause",
"Longer low-flow time vs ARREST (74 min vs 21–59 min) — key difference",
"CONCLUSION: ECPR did not significantly improve survival vs conventional CPR",
],
verdict="NEGATIVE: No significant benefit at 30 days. Slower ECMO initiation (74 min low-flow) may explain worse outcomes vs ARREST. Time-to-ECMO is critical. (PMID: 36662579)",
verdict_color=RED_NEG,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 17 — HEAD-TO-HEAD COMPARISON: ECPR TRIALS
# ═══════════════════════════════════════════════════════════════════════════════
s, y = header_slide("ECPR Trial Comparison: ARREST vs Prague vs INCEPTION",
"Key differences in inclusion criteria, design, and low-flow time")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
heads = ["Feature", "ARREST (2020)", "Prague OHCA (2022)", "INCEPTION (2023)"]
rows2 = [
("Journal", "Lancet", "JAMA", "NEJM"),
("N enrolled", "30", "256", "160"),
("Age", "18–75 yrs", "18–65 yrs", "18–70 yrs"),
("Witnessed arrest", "Not required (24/30 witnessed)", "Required", "Required"),
("Initial rhythm", "VF only (shockable)", "Shockable + non-shockable", "Shockable only (VF/pVT)"),
("Arrest location", "OHCA", "OHCA", "OHCA"),
("Randomisation", "On hospital arrival", "On-scene / in transport", "In transport"),
("Arrest-to-ECMO (median)", "21–59 min", "12–61 min", "74 min"),
("Survival (ECMO arm)", "43%", "31.5% (CPC 1–2 @ 6 mo)", "20% (CPC 1–2 @ 30 d)"),
("Primary outcome", "POSITIVE (p < 0.01)", "NEUTRAL (p = 0.09)", "NEGATIVE (p = 0.53)"),
]
col_xs2 = [Inches(0.5), Inches(3.3), Inches(6.3), Inches(9.55)]
col_ws2 = [Inches(2.75), Inches(2.95), Inches(3.2), Inches(3.6)]
rh2 = Inches(0.5)
# header row
rect(s, Inches(0.45), y+Inches(0.06), Inches(12.5), Inches(0.42), TEAL_DARK)
for ci, (cx, cw) in enumerate(zip(col_xs2, col_ws2)):
tb(s, cx, y+Inches(0.06), cw, Inches(0.42), heads[ci], sz=13, bold=True, color=GOLD)
for ri, row in enumerate(rows2):
ry = y + Inches(0.54) + ri * rh2
bg = CARD if ri % 2 == 0 else RGBColor(0x0B, 0x38, 0x5A)
rect(s, Inches(0.45), ry, Inches(12.45), rh2-Inches(0.04), bg)
for ci, (cx, cw) in enumerate(zip(col_xs2, col_ws2)):
c = GOLD if (ri == 9 and ci > 0) else WHITE
sz2 = 11.5
tb(s, cx+Inches(0.04), ry+Inches(0.04), cw-Inches(0.08), rh2-Inches(0.08),
row[ci], sz=sz2, color=c)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 18 — Clinical Implications Summary
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Clinical Implications: What the Trials Tell Us",
"VV-ECMO FOR SEVERE ARDS",
[
"VV-ECMO INDICATED when:",
" PaO₂/FiO₂ < 80 mmHg despite ≥ 6 h of optimal protective ventilation",
" Murray Score > 3.0 OR pH < 7.20 on optimal ventilation",
" Failure of prone positioning + neuromuscular blockade",
"Meta-analysis of CESAR + EOLIA: 25% relative mortality reduction",
"ELSO/ESICM: recommend ECMO at experienced centres only",
"Avoid ECMO after > 7 days of aggressive ventilation",
"KEY: Referral to ECMO centre (not just ECMO itself) improves outcomes",
"",
"VA-ECMO FOR CARDIOGENIC SHOCK",
"Current evidence does NOT support routine VA-ECMO in AMI cardiogenic shock",
"ECLS-SHOCK, ECMO-CS, Meta-analysis: no mortality benefit + more harm",
"Selective use may be appropriate (bridge to transplant, fulminant myocarditis)",
],
"ECPR FOR CARDIAC ARREST",
[
"ECPR most promising in highly selected patients:",
" Witnessed arrest",
" Initial shockable rhythm (VF/pVT)",
" Short no-flow interval (< 5 min) + immediate bystander CPR",
" Arrest-to-ECMO flow < 60 min (ideally < 45 min)",
" Age < 65–70 years, no major comorbidities",
" Identifiable reversible cause (AMI, PE, hypothermia)",
"",
"ARREST showed dramatic benefit in HIGHLY selected, FAST CENTRES",
"INCEPTION: longer cannulation time → no benefit",
"KEY LESSON: Time to ECMO is the critical determinant",
"Current guidelines: ECPR reasonable in select OHCA at experienced centres",
"ELSO Go Criteria: defines minimum selection standard for ECPR",
],
sz=12.5,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 19 — ELSO ECPR Criteria (practical)
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"ELSO Criteria for ECPR & ECMO Contraindications",
"ELSO GO CRITERIA FOR ECPR",
[
"Age < 70 years",
"Witnessed cardiac arrest",
"No-flow interval < 5 min (bystander CPR immediately initiated)",
"Initial rhythm: VF, pVT, or PEA (shockable preferred)",
"Low-flow interval (arrest to ECMO flow) < 60 min",
"End-tidal CO₂ > 10 mmHg during CPR (indicates adequate perfusion)",
"No severe comorbidities (terminal illness, severe neurological impairment)",
"No pre-existing contraindication to ECMO or anticoagulation",
"Centre capability: ECMO team available < 20 min from activation",
],
"GENERAL ECMO CONTRAINDICATIONS",
[
"ABSOLUTE:",
" Terminal illness / no chance of recovery or bridge to therapy",
" Unwitnessed cardiac arrest (no-flow time unknown)",
" Severe aortic regurgitation (VA-ECMO — increases afterload)",
" Aortic dissection (access-site conflict)",
"",
"RELATIVE:",
" Advanced age (> 70–75 yrs) — centre-specific policies",
" Prolonged CPR > 60 min without adequate perfusion markers",
" Severe peripheral arterial disease (limb ischaemia risk)",
" Contraindication to systemic anticoagulation (active major bleeding)",
" Morbid obesity (cannulation difficulty)",
" Multi-organ failure prior to arrest",
],
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 20 — Master Summary Table
# ═══════════════════════════════════════════════════════════════════════════════
s, y = header_slide("Master Summary: All Major ECMO Trials",
"Indication, N, Primary Outcome, Verdict")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
cols_h = ["Trial (Year)", "Type", "N", "Indication to Start ECMO", "Primary Outcome", "Verdict"]
col_xs3 = [Inches(0.45), Inches(2.35), Inches(3.35), Inches(3.9), Inches(7.65), Inches(10.5)]
col_ws3 = [Inches(1.85), Inches(0.95), Inches(0.5), Inches(3.7), Inches(2.8), Inches(2.6)]
rh3 = Inches(0.5)
# header
rect(s, Inches(0.4), y+Inches(0.05), Inches(12.5), Inches(0.42), TEAL_DARK)
for ci, (cx, cw) in enumerate(zip(col_xs3, col_ws3)):
tb(s, cx+Inches(0.02), y+Inches(0.05), cw, Inches(0.42),
cols_h[ci], sz=11.5, bold=True, color=GOLD)
data = [
("CESAR\n(2009)", "VV", "180", "Murray > 3.0 OR pH < 7.20", "63% vs 47% (6 mo)", "✓ POSITIVE"),
("EOLIA\n(2018)", "VV", "249", "PaO₂/FiO₂ < 50 ×3h / <80 ×6h / pH < 7.25", "35% vs 46% (p=0.09)", "~ NEAR-MISS"),
("CESAR+EOLIA\nMeta (2020)", "VV", "429", "Combined criteria (above)", "36% vs 48% (p=0.013)", "✓ POSITIVE"),
("ECLS-SHOCK\n(2023)", "VA", "420", "AMI + CGS + planned PCI (SBP<90 or vasopressor)", "48% vs 49% (p=0.81)", "✗ NEGATIVE"),
("ECMO-CS\n(2023)", "VA", "117", "Rapidly deteriorating or severe CGS", "63% vs 71% (p=0.21)", "✗ NEGATIVE"),
("EURO SHOCK\n(2023)", "VA", "35", "AMI + persistent CGS after PPCI ×30 min", "44% vs 61% (p=0.22)", "~ INCONCLUSIVE"),
("VA-ECMO IPD\nMeta (2023)", "VA", "567", "Infarct-related CGS (pooled)", "OR 0.93 (p=NS)", "✗ NEGATIVE"),
("ARREST\n(2020)", "ECPR", "30", "OHCA + refractory VF (≥3 shocks) + age<75 + fast transfer", "43% vs 7% (p<0.01)", "✓✓ POSITIVE"),
("Prague OHCA\n(2022)", "ECPR", "256", "Witnessed OHCA + no ROSC (shockable + non-shockable)", "31% vs 22% (p=0.09)", "~ NEUTRAL"),
("INCEPTION\n(2023)", "ECPR", "160", "Witnessed OHCA + VF/pVT + age<70 + no ROSC", "20% vs 16% (p=0.53)", "✗ NEGATIVE"),
]
for ri, row in enumerate(data):
ry = y + Inches(0.52) + ri * rh3
bg = CARD if ri % 2 == 0 else RGBColor(0x0C, 0x38, 0x5A)
rect(s, Inches(0.4), ry, Inches(12.5), rh3-Inches(0.04), bg)
for ci, (cx, cw) in enumerate(zip(col_xs3, col_ws3)):
vc = WHITE
if ci == 5:
if "✓✓" in row[ci]: vc = RGBColor(0x80, 0xFF, 0xAA)
elif "✓" in row[ci]: vc = GREEN_POS
elif "✗" in row[ci]: vc = RGBColor(0xFF, 0x88, 0x88)
else: vc = GOLD
tb(s, cx+Inches(0.03), ry+Inches(0.03), cw-Inches(0.04), rh3-Inches(0.07),
row[ci], sz=10.5, color=vc)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 21 — Key Lessons & Future Directions
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Key Lessons from ECMO Trials",
"LESSONS LEARNED",
[
"1. ARDS: VV-ECMO benefits HIGHLY SELECTED patients (meta-analysis confirms, single trials borderline)",
"2. Cardiogenic Shock: Routine VA-ECMO does NOT reduce mortality; causes harm — patient selection critical",
"3. ECPR: Dramatic benefit ONLY when initiated rapidly (< 45–60 min low-flow) in highly selected OHCA",
"4. CROSSOVER BIAS: High crossover rates in control arms (28% EOLIA, 39% ECMO-CS) dilute treatment effects",
"5. COMPLICATION COST: Every ECMO study reports significantly more bleeding and vascular complications",
"6. TIME IS CRITICAL: Faster cannulation = better neurological outcomes in ECPR",
"7. CENTRE EXPERTISE: Benefits seen only at experienced high-volume ECMO centres",
],
"CURRENT GUIDELINES (2024/2025)",
[
"VV-ECMO (ARDS):",
" ELSO/ESICM: Recommend VV-ECMO for severe ARDS (PaO₂/FiO₂ < 80) at expert centres",
"",
"VA-ECMO (Cardiogenic Shock):",
" ESC/ACC: No routine recommendation; selective use (bridge to transplant, fulminant myocarditis)",
" 2024 ESC CGS Guidelines: VA-ECMO not routinely recommended in AMI-CGS",
"",
"ECPR (Cardiac Arrest):",
" AHA/ERC: ECPR may be considered in select OHCA with short low-flow times (Class IIb)",
" ELSO Go Criteria: Practical selection framework",
"",
"ONGOING: ECMO-ARDS trial, ANCHOR trial (CGS), REVERSE trial (ECPR)",
],
sz=12.5,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 22 — References
# ═══════════════════════════════════════════════════════════════════════════════
s, y = header_slide("References")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.25), CARD)
refs = [
"1. Peek GJ et al. CESAR Trial. Lancet. 2009;374:1351-1363. PMID: 19762075",
"2. Combes A et al. EOLIA Trial — ECMO for Severe ARDS. NEJM. 2018;378:1965-1975. PMID: 29791822",
"3. Combes A, Peek GJ et al. ECMO for Severe ARDS: IPD Meta-Analysis. Intensive Care Med. 2020;46:2048-2057. PMID: 33021684",
"4. Thiele H et al. ECLS-SHOCK — Extracorporeal Life Support in Infarct-Related CGS. NEJM. 2023;389:1286-1297. PMID: 37634145",
"5. Ostadal P et al. ECMO-CS Trial. Circulation. 2023;147:454-464. PMID: 36335478",
"6. Banning AS et al. EURO SHOCK Trial. EuroIntervention. 2023;19:482-492. PMID: 37334659",
"7. Zeymer U et al. VA-ECMO in Infarct CGS: IPD Meta-Analysis. Lancet. 2023;402:1338-1347. PMID: 37643628",
"8. Yannopoulos D et al. ARREST Trial — ECMO vs ACLS in Refractory VF. Lancet. 2020;396:1807-1816. PMID: 33197396",
"9. Belohlavek J et al. Prague OHCA Trial. JAMA. 2022;327:737-747. PMID: 35191923",
"10. Suverein MM et al. INCEPTION Trial — Early ECPR for Refractory OHCA. NEJM. 2023;388:299-309.",
"11. Thiele H, Møller JE et al. Temporary MCS in Infarct CGS: IPD Meta-Analysis at 6 months. Lancet. 2024. PMID: 39236726",
]
bullets(s, Inches(0.55), y+Inches(0.1), Inches(12.2), H-y-Inches(0.4),
refs, sz=13, color=PALE_TEAL, bchar="")
# ═══════════════════════════════════════════════════════════════════════════════
# SAVE
# ═══════════════════════════════════════════════════════════════════════════════
out = "/tmp/workspace/oncological-emergencies/ECMO_Clinical_Trials.pptx"
buf = BytesIO()
prs.save(buf)
with open(out, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out}")
print(f"Total slides: {len(prs.slides)}")
cd /tmp/workspace/oncological-emergencies && python build_ecmo_pptx.py 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/oncological-emergencies/ECMO_Clinical_Trials.pptx') for i, slide in enumerate(prs.slides, 1): texts = [s.text_frame.text.strip()[:65] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] print(f'Slide {i:02d}: {\" | \".join(texts[:2])}') "
ECMO Clinical Trials
Presentation · PPTX
| # | Slide | Trial/Content |
|---|---|---|
| 1 | Title Slide | |
| 2 | ECMO Overview: VV vs VA vs ECPR | |
| 3 | Trial Index — all 10 trials organised by indication | |
| 4 | Section Divider: VV-ECMO for ARDS | |
| 5 | CESAR Trial (Lancet 2009, n=180) — Murray > 3.0 or pH < 7.20 → ✅ POSITIVE | |
| 6 | EOLIA Trial (NEJM 2018, n=249) — PaO₂/FiO₂ < 50 ×3h / < 80 ×6h / pH < 7.25 → 🟡 NEAR-MISS (p=0.09) | |
| 7 | CESAR+EOLIA Meta-Analysis (ICM 2020, n=429) → ✅ POSITIVE (p=0.013) | |
| 8 | Section Divider: VA-ECMO for Cardiogenic Shock | |
| 9 | ECLS-SHOCK (NEJM 2023, n=420) — AMI + CGS + planned PCI → ❌ NEGATIVE (p=0.81) | |
| 10 | ECMO-CS (Circulation 2023, n=117) — rapidly deteriorating CGS → ❌ NEGATIVE (p=0.21) | |
| 11 | EURO SHOCK (EuroIntervention 2023, n=35) — persistent CGS post-PPCI → 🟡 INCONCLUSIVE | |
| 12 | VA-ECMO IPD Meta-Analysis (Lancet 2023, n=567) → ❌ NEGATIVE (no benefit + more harm) | |
| 13 | Section Divider: ECPR for Cardiac Arrest | |
| 14 | ARREST Trial (Lancet 2020, n=30) — refractory VF + fast transfer → ✅✅ STRONGLY POSITIVE (43% vs 7%) | |
| 15 | Prague OHCA (JAMA 2022, n=256) — witnessed OHCA, any rhythm → 🟡 NEUTRAL (p=0.09) | |
| 16 | INCEPTION (NEJM 2023, n=160) — witnessed OHCA + shockable rhythm → ❌ NEGATIVE (p=0.53) | |
| 17 | Head-to-Head Comparison Table — ARREST vs Prague vs INCEPTION (inclusion criteria, low-flow time, outcomes) | |
| 18 | Clinical Implications — what each ECMO category tells us in practice | |
| 19 | ELSO ECPR Go Criteria + General ECMO Contraindications | |
| 20 | Master Summary Table — all 10 trials in one view | |
| 21 | Key Lessons + Current Guidelines (ESC/AHA/ELSO 2024/2025) | |
| 22 | References (11 primary sources with PMIDs) |
Cesar Eolia and Elso trial indication to initiate ECMO Create a ppt Explaining in detail
PMID: 19762075
PMID: 29791822
ELSO guidelines ECMO indications 2021 2024 criteria initiation VV VA adult
https://pmc.ncbi.nlm.nih.gov/articles/PMC8315725
~/oncological-emergencies/build_cesar_eolia_elso.py
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from io import BytesIO
# ── Palette ─────────────────────────────────────────────────────────────────
NAVY = RGBColor(0x04, 0x20, 0x45)
TEAL = RGBColor(0x00, 0x7E, 0x8A)
TEAL_LIGHT = RGBColor(0x00, 0xB4, 0xC8)
GOLD = RGBColor(0xF0, 0xAB, 0x00)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BG = RGBColor(0xEE, 0xF4, 0xF8)
CARD = RGBColor(0x07, 0x2A, 0x4A)
PALE_BLUE = RGBColor(0xCC, 0xE5, 0xF0)
GREEN = RGBColor(0x14, 0x73, 0x3A)
RED = RGBColor(0xB0, 0x2A, 0x20)
AMBER = RGBColor(0xCC, 0x6E, 0x00)
TEXT = RGBColor(0x08, 0x1C, 0x34)
ELSO_COLOR = RGBColor(0x1A, 0x5C, 0x8A) # distinct blue for ELSO
CESAR_COLOR = RGBColor(0x2D, 0x6A, 0x4F) # green for CESAR
EOLIA_COLOR = RGBColor(0x6B, 0x21, 0x5E) # purple for EOLIA
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
blank = prs.slide_layouts[6]
# ═══════════════════════════════════════════════════════════════════════════════
# HELPERS
# ═══════════════════════════════════════════════════════════════════════════════
def rect(slide, x, y, w, h, color):
s = slide.shapes.add_shape(1, x, y, w, h)
s.fill.solid(); s.fill.fore_color.rgb = color
s.line.fill.background(); return s
def tb(slide, x, y, w, h, text, sz=16, bold=False, color=WHITE,
align=PP_ALIGN.LEFT, italic=False):
t = slide.shapes.add_textbox(x, y, w, h)
tf = t.text_frame; tf.word_wrap = True
tf.margin_left = tf.margin_right = Inches(0.05)
tf.margin_top = tf.margin_bottom = Inches(0.02)
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 buls(slide, x, y, w, h, lines, sz=13, color=WHITE, head=None,
hc=None, hs=14, bchar=" ▸ ", space=1):
t = slide.shapes.add_textbox(x, y, w, h)
tf = t.text_frame; tf.word_wrap = True
tf.margin_left = tf.margin_right = Inches(0.06)
tf.margin_top = tf.margin_bottom = Inches(0.04)
started = False
if head:
p = tf.paragraphs[0]; p.space_after = Pt(3)
r = p.add_run(); r.text = head
r.font.size = Pt(hs); r.font.bold = True
r.font.color.rgb = hc or GOLD; r.font.name = "Calibri"
started = True
for i, line in enumerate(lines):
p = tf.add_paragraph() if started else tf.paragraphs[0]
started = True; p.space_before = Pt(space)
r = p.add_run()
prefix = "" if line.startswith(" ") else bchar
r.text = prefix + line
r.font.size = Pt(sz); r.font.color.rgb = color; r.font.name = "Calibri"
def std_slide(title, accent_color=TEAL, subtitle=None):
s = prs.slides.add_slide(blank)
rect(s, 0, 0, W, H, LIGHT_BG)
rect(s, 0, 0, W, Inches(1.05), NAVY)
rect(s, 0, Inches(1.05), W, Inches(0.07), accent_color)
tb(s, Inches(0.4), Inches(0.1), Inches(12.5), Inches(0.85),
title, sz=30, bold=True, color=WHITE)
y = Inches(1.22)
if subtitle:
tb(s, Inches(0.4), y, Inches(12.5), Inches(0.4),
subtitle, sz=14, color=accent_color, italic=True)
y += Inches(0.44)
return s, y
def divider(title, sub="", accent=TEAL):
s = prs.slides.add_slide(blank)
rect(s, 0, 0, W, H, NAVY)
rect(s, 0, Inches(2.9), W, Inches(0.12), accent)
rect(s, 0, Inches(3.07), W, Inches(0.04), GOLD)
tb(s, Inches(0.6), Inches(1.5), Inches(12), Inches(1.4),
title, sz=40, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
if sub:
tb(s, Inches(0.6), Inches(3.2), Inches(12), Inches(0.7),
sub, sz=18, color=accent, align=PP_ALIGN.CENTER, italic=True)
def two_col(title, lh, lb, rh, rb, accent=TEAL, subtitle=None, sz=13):
s, y = std_slide(title, accent, subtitle)
cw = Inches(6.2); gap = Inches(0.3)
lx = Inches(0.4); rx = lx + cw + gap
ch = H - y - Inches(0.25)
rect(s, lx, y, cw, ch, CARD)
tb(s, lx+Inches(0.1), y+Inches(0.08), cw-Inches(0.2), Inches(0.42),
lh, sz=14, bold=True, color=accent)
buls(s, lx+Inches(0.08), y+Inches(0.54), cw-Inches(0.16), ch-Inches(0.64),
lb, sz=sz, color=WHITE)
rect(s, rx, y, cw, ch, CARD)
tb(s, rx+Inches(0.1), y+Inches(0.08), cw-Inches(0.2), Inches(0.42),
rh, sz=14, bold=True, color=accent)
buls(s, rx+Inches(0.08), y+Inches(0.54), cw-Inches(0.16), ch-Inches(0.64),
rb, sz=sz, color=WHITE)
# Highlighted criterion box
def criterion_box(slide, x, y, w, h, number, title, detail_lines,
box_color=CARD, num_color=GOLD, sz=13):
rect(slide, x, y, w, h, box_color)
# number circle
rect(slide, x+Inches(0.1), y+Inches(0.1), Inches(0.52), Inches(0.52), num_color)
tb(slide, x+Inches(0.1), y+Inches(0.1), Inches(0.52), Inches(0.52),
str(number), sz=16, bold=True, color=NAVY, align=PP_ALIGN.CENTER)
tb(slide, x+Inches(0.72), y+Inches(0.12), w-Inches(0.85), Inches(0.44),
title, sz=14, bold=True, color=GOLD)
buls(slide, x+Inches(0.18), y+Inches(0.62), w-Inches(0.3), h-Inches(0.75),
detail_lines, sz=sz, color=WHITE, bchar="")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE
# ═══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
rect(s, 0, 0, W, H, NAVY)
# decorative gradient bars
rect(s, 0, Inches(3.7), W, Inches(0.1), CESAR_COLOR)
rect(s, 0, Inches(3.83), W, Inches(0.08), EOLIA_COLOR)
rect(s, 0, Inches(3.94), W, Inches(0.08), ELSO_COLOR)
rect(s, 0, Inches(4.05), W, Inches(0.04), GOLD)
tb(s, Inches(0.5), Inches(0.8), Inches(12.2), Inches(1.2),
"ECMO INITIATION CRITERIA", sz=50, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
tb(s, Inches(0.5), Inches(2.1), Inches(12.2), Inches(0.75),
"CESAR ● EOLIA ● ELSO Guidelines",
sz=28, bold=True, color=GOLD, align=PP_ALIGN.CENTER)
tb(s, Inches(0.5), Inches(2.95), Inches(12.2), Inches(0.65),
"A detailed side-by-side analysis of inclusion criteria, thresholds, and clinical reasoning",
sz=17, color=PALE_BLUE, align=PP_ALIGN.CENTER, italic=True)
tb(s, Inches(0.5), Inches(4.25), Inches(12.2), Inches(0.5),
"CESAR Trial 2009 (Lancet) | EOLIA Trial 2018 (NEJM) | ELSO VV-ECMO Guidelines 2021",
sz=13, color=RGBColor(0x88, 0xAA, 0xCC), align=PP_ALIGN.CENTER)
tb(s, Inches(0.5), Inches(5.0), Inches(12.2), Inches(0.4),
"Critical Care • Respiratory Support • Evidence-Based Medicine • 2025 Edition",
sz=12, color=RGBColor(0x66, 0x88, 0xAA), align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 — WHY THESE 3 MATTER
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("Why CESAR, EOLIA & ELSO Define ECMO Practice", TEAL)
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
items = [
(CESAR_COLOR, "CESAR Trial (2009)", "The FIRST adult RCT for ECMO in severe respiratory failure. Established Murray Score > 3.0 and pH < 7.20 as the original threshold for ECMO referral. Landmark evidence that shaped a decade of practice."),
(EOLIA_COLOR, "EOLIA Trial (2018)", "The LARGEST RCT of VV-ECMO in very severe ARDS (n=249). Defined the 3 precise physiological criteria (PaO₂/FiO₂ < 50, < 80, or pH < 7.25 + hypercapnia). Controversial result (p=0.09) — now the most cited ECMO trial."),
(ELSO_COLOR, "ELSO Guidelines (2021)", "The OFFICIAL international society guidelines for ECMO practice. Synthesise all RCT data including CESAR and EOLIA. Define minimum thresholds, contraindications, timing, and operational criteria. The bedside reference for ECMO teams worldwide."),
]
rh = Inches(1.5)
for i, (ac, title, desc) in enumerate(items):
ry = y + Inches(0.12) + i * rh
rect(s, Inches(0.5), ry, Inches(0.08), rh - Inches(0.15), ac)
rect(s, Inches(0.65), ry, Inches(12.15), rh - Inches(0.15), RGBColor(0x09, 0x32, 0x52))
tb(s, Inches(0.82), ry + Inches(0.12), Inches(11.8), Inches(0.45),
title, sz=17, bold=True, color=ac)
tb(s, Inches(0.82), ry + Inches(0.6), Inches(11.8), Inches(0.8),
desc, sz=13.5, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 — SECTION DIVIDER: CESAR
# ═══════════════════════════════════════════════════════════════════════════════
divider("CESAR TRIAL\n(2009 · Lancet)",
"Conventional Ventilatory Support vs ECMO for Severe Adult Respiratory Failure",
accent=CESAR_COLOR)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 — CESAR: Background & Design
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"CESAR Trial: Background & Study Design",
"BACKGROUND",
[
"UK-based multicentre RCT — 5 NHS centres",
"Time period: July 2001 – August 2006",
"Population: adults with severe acute respiratory failure",
"Pre-CESAR context: ECMO used only anecdotally in adults",
"No RCT evidence existed for adult ECMO at time of trial",
"Conventional care: mechanical ventilation ± steroids, prone, nitric oxide",
"ECMO centre: Glenfield Hospital, Leicester (single ECMO centre in UK)",
"Randomisation: 1:1 allocation — ECMO referral vs continued conventional care",
"Primary outcome: Death or severe disability at 6 months",
],
"KEY TRIAL DETAILS",
[
"FUNDING: UK NHS Health Technology Assessment",
"ISRCTN registration: ISRCTN47279827",
"N enrolled: 180 patients (90 ECMO / 90 control)",
"N screened: 766 patients",
"N who received ECMO: 68/90 (75%) in ECMO arm",
"ECMO TYPE: VV-ECMO (venovenous)",
"ECMO centre followed a structured protocol for ALL patients referred",
"Control group: conventional management continued at local hospital",
"6-month follow-up assessment by blinded researchers",
"Cost-effectiveness analysis included (QALYs measured)",
],
accent=CESAR_COLOR,
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 — CESAR: Inclusion Criteria (DETAILED)
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("CESAR Trial: ECMO Initiation Criteria — In Detail", CESAR_COLOR,
"Severe but potentially reversible respiratory failure requiring ECMO consideration")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
# Big header
tb(s, Inches(0.5), y + Inches(0.08), Inches(12.2), Inches(0.45),
"ECMO REFERRAL CRITERIA (BOTH must be met: Age criterion + Severity criterion)",
sz=14, bold=True, color=GOLD)
y2 = y + Inches(0.6)
# Criterion A — Age
criterion_box(s, Inches(0.45), y2, Inches(4.0), Inches(1.6),
"A", "AGE CRITERION",
["Age: 18 – 65 years",
"",
"Upper age limit of 65 reflects:",
" • Reversibility more likely in younger patients",
" • UK NHS resource allocation context (2001–2006)",
" • Excluded elderly patients due to less reversible disease"],
box_color=RGBColor(0x0B, 0x3D, 0x28), num_color=CESAR_COLOR, sz=12)
# Criterion B — Murray OR pH (OR logic — either triggers referral)
criterion_box(s, Inches(4.6), y2, Inches(8.1), Inches(1.6),
"B", "SEVERITY CRITERION — Either ONE of the following triggers ECMO referral:",
["CRITERION 1: Murray Lung Injury Score > 3.0",
" The Murray Score combines: PaO₂/FiO₂ ratio + PEEP + Lung Compliance + CXR quadrants",
" Score range 0–4. Score > 3 = severe lung injury with high mortality",
"",
"CRITERION 2: Arterial pH < 7.20",
" Despite optimal mechanical ventilation",
" Reflects severe hypercapnic respiratory failure — CO₂ retention unmanageable by MV"],
box_color=RGBColor(0x0B, 0x3D, 0x28), num_color=CESAR_COLOR, sz=12)
# Criterion C — Reversibility
y3 = y2 + Inches(1.72)
criterion_box(s, Inches(0.45), y3, Inches(12.1), Inches(1.25),
"C", "REVERSIBILITY REQUIREMENT — The condition must be POTENTIALLY REVERSIBLE",
["Not due to end-stage irreversible lung disease",
"Not due to terminal malignancy or no active treatment being continued",
"Reversibility assessed clinically: treatable cause (pneumonia, ARDS, trauma, aspiration)",
"Key concept: ECMO is a BRIDGE to recovery — not a destination therapy",
"Reversibility = the cornerstone of ECMO candidate selection"],
box_color=RGBColor(0x0B, 0x3D, 0x28), num_color=CESAR_COLOR, sz=12)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 — CESAR: Exclusion Criteria in Detail
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("CESAR Trial: Exclusion Criteria — In Detail", CESAR_COLOR,
"Patients excluded from ECMO referral despite meeting severity criteria")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
tb(s, Inches(0.5), y+Inches(0.06), Inches(12.2), Inches(0.4),
"EXCLUSION CRITERIA — Any ONE of the following excludes the patient:", sz=14, bold=True, color=GOLD)
excl = [
("1", RGBColor(0x8B, 0x00, 0x00),
"Injurious Ventilation > 7 Days",
["Peak Inspiratory Pressure (PIP) > 30 cmH₂O AND FiO₂ > 0.8 for MORE than 7 days",
"Rationale: Prolonged high-pressure ventilation creates irreversible VILI",
"After 7 days of injurious settings, lung recovery is unlikely even with ECMO",
"This criterion prevents futile ECMO in patients with established VILI",
"Clinical clue: If lung protective strategy failed for > 7 days → ECMO unlikely to help"]),
("2", RGBColor(0x8B, 0x00, 0x00),
"Intracranial Bleeding",
["Active intracranial haemorrhage (any type)",
"Rationale: ECMO requires continuous systemic anticoagulation (heparin)",
"Anticoagulation in the setting of ICH → catastrophic haemorrhagic extension",
"Any confirmed ICH on CT head = absolute exclusion in CESAR context",
"Uncontrolled CNS bleeding + heparin = unacceptable risk"]),
("3", RGBColor(0x8B, 0x00, 0x00),
"Contraindication to Anticoagulation",
["Any other reason heparin cannot be given (e.g., HIT, active major haemorrhage)",
"ECMO circuit requires heparin to prevent thrombosis in tubing/oxygenator",
"Without anticoagulation → rapid clotting of the circuit",
"This covers: active haemorrhage, severe coagulopathy, thrombocytopenia < 50"]),
("4", RGBColor(0x8B, 0x00, 0x00),
"No Active Treatment",
["Contraindication to continuation of active treatment",
"Includes: patient with DNAR order, terminal disease, next-of-kin withdrawal",
"ECMO is aggressive invasive support — must align with goals of care",
"If escalation of care is not intended, ECMO is inappropriate"]),
]
col_w = Inches(6.0); row_h = Inches(1.45)
positions = [(Inches(0.45), y+Inches(0.55)), (Inches(6.75), y+Inches(0.55)),
(Inches(0.45), y+Inches(2.1)), (Inches(6.75), y+Inches(2.1))]
for (ex, ey), (num, nc, etitle, elines) in zip(positions, excl):
criterion_box(s, ex, ey, col_w, row_h,
num, etitle, elines, box_color=RGBColor(0x2A, 0x09, 0x09),
num_color=nc, sz=11.5)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 — MURRAY SCORE EXPLAINED
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("Murray Lung Injury Score — The CESAR Threshold Explained", CESAR_COLOR,
"Murray Score > 3.0 = trigger for ECMO referral in the CESAR trial")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
tb(s, Inches(0.5), y+Inches(0.06), Inches(12.2), Inches(0.4),
"4 COMPONENTS — Each scored 0 to 4. Final score = sum ÷ 4 (Range: 0 – 4)",
sz=14, bold=True, color=GOLD)
components = [
("PaO₂/FiO₂ Ratio", [
"≥ 300 mmHg → Score 0 (mild impairment)",
"225–299 → Score 1",
"175–224 → Score 2",
"100–174 → Score 3",
"< 100 mmHg → Score 4 ← WORST",
]),
("PEEP (Positive End-Expiratory Pressure)", [
"≤ 5 cmH₂O → Score 0",
"6–8 → Score 1",
"9–11 → Score 2",
"12–14 → Score 3",
"≥ 15 cmH₂O → Score 4 ← WORST",
]),
("Lung Compliance (mL/cmH₂O)", [
"≥ 80 → Score 0",
"60–79 → Score 1",
"40–59 → Score 2",
"20–39 → Score 3",
"≤ 19 → Score 4 ← WORST",
]),
("CXR: Consolidation Quadrants", [
"No consolidation → Score 0",
"1 quadrant → Score 1",
"2 quadrants → Score 2",
"3 quadrants → Score 3",
"4 quadrants → Score 4 ← WORST",
]),
]
cw = Inches(2.95); ch = Inches(3.8)
col_xs = [Inches(0.45), Inches(3.5), Inches(6.55), Inches(9.6)]
yb = y + Inches(0.55)
for cx, (comp_title, comp_lines) in zip(col_xs, components):
rect(s, cx, yb, cw, ch, RGBColor(0x0B, 0x35, 0x55))
tb(s, cx+Inches(0.08), yb+Inches(0.06), cw-Inches(0.16), Inches(0.45),
comp_title, sz=12.5, bold=True, color=CESAR_COLOR)
buls(s, cx+Inches(0.06), yb+Inches(0.55), cw-Inches(0.12), ch-Inches(0.65),
comp_lines, sz=12, color=WHITE, bchar="")
# Interpretation box at bottom
yb2 = yb + ch + Inches(0.15)
rect(s, Inches(0.45), yb2, Inches(12.45), Inches(0.6), RGBColor(0x2D, 0x6A, 0x4F))
tb(s, Inches(0.6), yb2+Inches(0.08), Inches(12.1), Inches(0.44),
"INTERPRETATION: Score 0–1 = Mild | Score 1–2.5 = Moderate | "
"Score > 2.5 = Severe ARDS | Score > 3.0 = ECMO THRESHOLD (CESAR) | Score 4 = Most Severe",
sz=13, bold=True, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 8 — CESAR: Results & What They Proved
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"CESAR Trial: Results & Clinical Significance",
"PRIMARY OUTCOME (6-Month Survival Without Disability)",
[
"ECMO group: 63% (57/90) survived without severe disability",
"Control group: 47% (41/87) survived without severe disability",
"Relative Risk: 0.69 (95% CI 0.05–0.97)",
"p-value = 0.03 ← STATISTICALLY SIGNIFICANT",
"Absolute Risk Reduction: 16%",
"Number Needed to Treat (NNT) = ~6",
"",
"COST-EFFECTIVENESS:",
"Cost per QALY = £19,252 (well within £30,000 UK NICE threshold)",
"Lifetime model: cost-effective at 3.5% discount rate",
"Conclusion: ECMO referral is BOTH clinically effective AND cost-effective",
],
"LIMITATIONS & INTERPRETATION CAVEATS",
[
"IMPORTANT: Only 75% of ECMO arm actually received ECMO (68/90)",
"25% received ECMO centre protocol management without ECMO itself",
"Result = benefit of ECMO REFERRAL + protocol, not ECMO alone",
"No uniform protocol in control arm — management varied between hospitals",
"Single ECMO centre (Glenfield) — may not generalise to less experienced centres",
"Prone positioning, paralysis not standardised in control arm",
"These limitations led to the EOLIA trial (more rigorous design)",
"",
"LEGACY: CESAR proved ECMO centre referral with Murray > 3 or pH < 7.20",
"is safe, beneficial, and cost-effective — shaped UK and global policy",
],
accent=CESAR_COLOR,
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 9 — SECTION DIVIDER: EOLIA
# ═══════════════════════════════════════════════════════════════════════════════
divider("EOLIA TRIAL\n(2018 · NEJM)",
"ECMO for Severe Acute Respiratory Distress Syndrome — The Definitive RCT",
accent=EOLIA_COLOR)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 10 — EOLIA: Background & Design
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"EOLIA Trial: Background & Study Design",
"BACKGROUND & RATIONALE",
[
"International, multicentre RCT — France, Canada, Belgium, Czech Republic",
"22 ICUs (all high-volume ECMO centres)",
"Time period: 2011 – 2017",
"Designed to overcome CESAR's limitations:",
" • Pure ECMO vs no-ECMO comparison",
" • All centres followed same protective ventilation protocol",
" • Mandatory lung-protective ventilation in BOTH arms",
" • Rescue crossover allowed (pragmatic design)",
"Population: mechanically ventilated adults with VERY SEVERE ARDS",
"Pre-trial strategy: prone positioning + neuromuscular blockade mandatory before ECMO",
"Funded: French Ministry of Health",
],
"STUDY DESIGN",
[
"Design: Open-label RCT, 1:1 randomisation",
"N enrolled: 249 patients (124 ECMO / 125 control)",
"ECMO arm: immediate VV-ECMO + lung-protective ventilation",
"Control arm: continued conventional MV (rescue ECMO allowed)",
"Ventilation protocol BOTH arms: tidal volume 6 mL/kg IBW, plateau pressure ≤ 30 cmH₂O",
"MANDATORY before ECMO (in absence of contraindication):",
" • Prone positioning trial",
" • Neuromuscular blockade",
" • Optimised PEEP",
"Primary endpoint: 60-day all-cause mortality",
"ClinicalTrials.gov: NCT01470703",
],
accent=EOLIA_COLOR,
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 11 — EOLIA: The 3 Criteria in Detail
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("EOLIA Trial: ECMO Initiation Criteria — The 3 Thresholds", EOLIA_COLOR,
"ECMO initiated if ANY ONE of 3 criteria met — after ≥ 6 hours of optimal conventional management")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
# Preamble
rect(s, Inches(0.45), y+Inches(0.06), Inches(12.45), Inches(0.55), RGBColor(0x3A, 0x10, 0x38))
tb(s, Inches(0.55), y+Inches(0.06), Inches(12.2), Inches(0.55),
"PREREQUISITE: Optimal conventional management must be in place — Tidal volume 6 mL/kg IBW | "
"Plateau pressure ≤ 30 cmH₂O | PEEP ≥ 10 cmH₂O | Respiratory rate ≤ 35 bpm | FiO₂ = 1.0",
sz=12.5, bold=False, color=PALE_BLUE)
y2 = y + Inches(0.7)
crit_h = Inches(2.65)
crit_w = Inches(4.0)
crit_xs = [Inches(0.45), Inches(4.6), Inches(8.75)]
# Criterion 1
criterion_box(s, crit_xs[0], y2, crit_w, crit_h,
"1", "SEVERE HYPOXAEMIA (PaO₂/FiO₂ < 50 mmHg for > 3 hours)",
["PaO₂/FiO₂ ratio < 50 mmHg",
"Duration: must persist for > 3 consecutive hours",
"Despite FiO₂ = 1.0 and optimised ventilator settings",
"",
"WHY this threshold?",
"PaO₂/FiO₂ < 50 = most severe hypoxaemia category",
"Mortality > 60–70% with conventional therapy alone",
"Shorter duration (3h) due to extreme severity",
"Corresponds to Murray Score ≈ 3.5–4.0"],
box_color=RGBColor(0x25, 0x0A, 0x3A), num_color=EOLIA_COLOR, sz=11.5)
# Criterion 2
criterion_box(s, crit_xs[1], y2, crit_w, crit_h,
"2", "MODERATE-SEVERE HYPOXAEMIA (PaO₂/FiO₂ < 80 mmHg for > 6 hours)",
["PaO₂/FiO₂ ratio < 80 mmHg",
"Duration: must persist for > 6 consecutive hours",
"Despite FiO₂ = 1.0 and optimised settings",
"",
"WHY this threshold?",
"Less severe than Criterion 1 — hence longer duration required",
"Mortality in this range: 40–55% with conventional therapy",
"6-hour window allows adequate trial of optimal therapy",
"Current ELSO minimum threshold for VV-ECMO consideration"],
box_color=RGBColor(0x25, 0x0A, 0x3A), num_color=EOLIA_COLOR, sz=11.5)
# Criterion 3
criterion_box(s, crit_xs[2], y2, crit_w, crit_h,
"3", "SEVERE HYPERCAPNIC RESPIRATORY FAILURE (pH < 7.25 + PaCO₂ ≥ 60 mmHg)",
["Arterial pH < 7.25",
"AND PaCO₂ ≥ 60 mmHg",
"Duration: both conditions for > 6 consecutive hours",
"Despite optimised MV: RR ≤ 35/min, Pplat ≤ 30 cmH₂O",
"",
"WHY this threshold?",
"Reflects CO₂ retention unmanageable by ventilator alone",
"Acidaemia causes cardiac dysfunction and vasoplegia",
"Permissive hypercapnia has limits — pH < 7.25 is the accepted floor",
"VV-ECMO removes CO₂ via sweep gas — corrects hypercapnia immediately"],
box_color=RGBColor(0x25, 0x0A, 0x3A), num_color=EOLIA_COLOR, sz=11.5)
# Footer box
yf = y2 + crit_h + Inches(0.12)
rect(s, Inches(0.45), yf, Inches(12.45), Inches(0.52), EOLIA_COLOR)
tb(s, Inches(0.6), yf+Inches(0.09), Inches(12.1), Inches(0.38),
"TRIGGER LOGIC: ANY ONE of the 3 criteria = initiate VV-ECMO | "
"Criteria must be met AFTER maximal optimisation | "
"Rescue crossover from control arm allowed for refractory hypoxaemia",
sz=12.5, bold=True, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 12 — EOLIA: Exclusion Criteria
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"EOLIA Trial: Exclusion Criteria — In Detail",
"RESPIRATORY / VENTILATORY EXCLUSIONS",
[
"Mechanical ventilation > 7 days at time of enrolment",
" Rationale: > 7 days of MV → high risk of irreversible VILI",
" Beyond this window, ECMO benefit markedly diminishes",
"",
"Chronic respiratory disease with limited life expectancy",
" e.g., end-stage COPD, severe pulmonary fibrosis",
" These patients lack reversibility — ECMO cannot bridge to recovery",
"",
"BMI > 45 kg/m² (morbid obesity)",
" Technical difficulties with cannulation and positioning",
" High oxygen consumption — ECMO may be insufficient to meet demand",
],
"SYSTEMIC / CLINICAL EXCLUSIONS",
[
"Contraindication to systemic anticoagulation",
" Active major haemorrhage, HIT, severe coagulopathy",
" Heparin is essential — without it, circuit clots rapidly",
"",
"Immunosuppression (relative exclusion)",
" Severe immunocompromised state (e.g., active leukaemia, aplasia)",
" High infection risk on ECMO circuit",
"",
"Chronic conditions with high mortality risk",
" Active metastatic malignancy",
" End-stage organ failure (unless transplant candidate)",
" No possibility of meaningful recovery",
"",
"Pregnancy (not enrolled — specific paediatric protocols for foetus)",
"Age: no upper age limit stated (unlike CESAR's 65 yr limit)",
],
accent=EOLIA_COLOR,
sz=12.5,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 13 — EOLIA: Results in Detail
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("EOLIA Trial: Results — What Happened", EOLIA_COLOR,
"Primary endpoint: 60-day all-cause mortality | Secondary endpoints and crossover analysis")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
# Three result boxes
box_data = [
(Inches(0.45), "PRIMARY OUTCOME", "60-Day All-Cause Mortality",
["ECMO group: 35% (44/124 patients)",
"Control group: 46% (57/125 patients)",
"Relative Risk: 0.76 (95% CI 0.55–1.04)",
"p-value = 0.09 ← NOT STATISTICALLY SIGNIFICANT",
"",
"BUT... Bayesian re-analysis showed:",
"97% posterior probability of ECMO benefit",
"Most experts interpret this as clinically significant"],
EOLIA_COLOR),
(Inches(4.65), "CROSSOVER ANALYSIS", "28% of Controls Crossed to ECMO",
["35 control patients (28%) received rescue ECMO",
"Crossover occurred mean 6.5 ± 9.7 days after randomisation",
"57% of crossover patients died despite rescue ECMO",
"This high crossover diluted the treatment effect",
"If crossover patients removed: benefit larger and likely significant",
"",
"This is why p = 0.09 — NOT because ECMO didn't work",
"Intent-to-treat analysis hides the true ECMO benefit"],
AMBER),
(Inches(8.85), "COMPLICATIONS", "ECMO vs Control Adverse Events",
["Bleeding requiring transfusion: 46% vs 28% (ECMO more)",
"Severe thrombocytopenia: 27% vs 16% (ECMO more)",
"Ischaemic stroke: 0% vs 5% (ECMO FEWER)",
"Deep vein thrombosis: similar",
"Leg ischaemia: similar",
"",
"Net interpretation: ECMO trades one risk (bleeding)",
"for a benefit in stroke prevention and survival"],
RGBColor(0x2A, 0x5A, 0x8A)),
]
bw = Inches(3.95); bh = Inches(4.6)
for bx, bhead, bsub, blines, bc in box_data:
rect(s, bx, y + Inches(0.06), bw, bh, RGBColor(0x0D, 0x2E, 0x4A))
rect(s, bx, y + Inches(0.06), bw, Inches(0.42), bc)
tb(s, bx+Inches(0.08), y+Inches(0.06), bw-Inches(0.16), Inches(0.42),
bhead, sz=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
tb(s, bx+Inches(0.08), y+Inches(0.54), bw-Inches(0.16), Inches(0.42),
bsub, sz=12, bold=True, color=bc if bc != AMBER else GOLD)
buls(s, bx+Inches(0.06), y+Inches(1.0), bw-Inches(0.12), bh-Inches(1.1),
blines, sz=12, color=WHITE, bchar="")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 14 — EOLIA: Why p=0.09 Does Not Mean ECMO Fails
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"EOLIA: Why p = 0.09 Does Not Mean ECMO Is Ineffective",
"THE CROSSOVER PROBLEM",
[
"EOLIA design allowed rescue ECMO for refractory hypoxaemia in control arm",
"28% of control patients received rescue ECMO — 35 patients",
"These patients APPEAR in the 'control group' in intent-to-treat analysis",
"But they actually received ECMO — diluting the control arm's mortality",
"This is called CROSSOVER DILUTION BIAS",
"",
"Without crossover: 57% of rescues died — mortality in true controls was higher",
"Statistical model shows: true treatment effect is larger than reported",
"",
"Bayesian posterior probability of ECMO superiority: 97%",
"99.4% probability of ≥ 3% absolute risk reduction with ECMO",
],
"WHAT THE EVIDENCE NOW SHOWS",
[
"CESAR + EOLIA combined meta-analysis (Combes et al. 2020, ICM):",
" n = 429 combined patients",
" 90-day mortality: 36% ECMO vs 48% control",
" RR 0.75 (95% CI 0.60–0.94) ← p = 0.013 SIGNIFICANT",
"",
"Meta-analysis conclusion: VV-ECMO DOES reduce 90-day mortality in severe ARDS",
"",
"ELSO/ESICM position (2021–2024):",
" EOLIA criteria (PaO₂/FiO₂ < 80 or pH < 7.25 + PaCO₂ ≥ 60) are the",
" recommended minimum thresholds for VV-ECMO initiation",
" Murray Score > 3 (CESAR) remains valid for referral decisions",
"",
"Both criteria now endorsed by ELSO guidelines (Table 1)",
],
accent=EOLIA_COLOR,
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 15 — SECTION DIVIDER: ELSO
# ═══════════════════════════════════════════════════════════════════════════════
divider("ELSO GUIDELINES\n(2021 · ASAIO Journal)",
"Management of Adult Patients on VV-ECMO — The Official International Framework",
accent=ELSO_COLOR)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 16 — ELSO: Overview & Authority
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"ELSO Guidelines: Overview & Authority",
"WHAT IS ELSO?",
[
"Extracorporeal Life Support Organization",
"Founded 1989 — the international body governing ECMO practice",
"Maintains the largest ECMO registry: > 150,000 runs worldwide",
"Publishes guidelines for ALL aspects of ECMO management",
"2021 VV-ECMO guideline authors: Tonna, Abrams, Brodie, Fan et al.",
"Published: ASAIO Journal 2021 (American Society for Artificial Internal Organs)",
"Evidence base: synthesises CESAR, EOLIA, observational data, expert consensus",
"",
"Key concept: ELSO guidelines are the CLINICAL BEDSIDE reference",
"They translate RCT data into actionable practice recommendations",
"Adopted by NHS England, ELSO centres worldwide, ESC, ESICM",
],
"HOW ELSO INCORPORATED CESAR & EOLIA",
[
"CESAR (2009):",
" Murray Score > 3 → valid indication for ECMO referral",
" pH < 7.20 → valid indication for ECMO referral",
" ELSO endorses BOTH as triggers for evaluation at ECMO centre",
"",
"EOLIA (2018):",
" PaO₂/FiO₂ < 80 mmHg after optimised MV → ECMO consideration",
" pH < 7.25 + PaCO₂ ≥ 60 mmHg → ECMO consideration",
" ELSO adopts EOLIA criteria as the MINIMUM threshold",
"",
"ELSO ADDITION: Hypercapnic respiratory failure alone (pH < 7.25)",
"even without severe hypoxaemia — ECMO for pure CO₂ removal",
"",
"ELSO expands beyond trial criteria to cover real-world indications",
],
accent=ELSO_COLOR,
sz=13,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 17 — ELSO: Full Indication Table
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("ELSO 2021 VV-ECMO: Full Indication Table (Table 1)", ELSO_COLOR,
"Common indications for VV-ECMO — one or more of the following (after optimal management)")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
tb(s, Inches(0.5), y+Inches(0.06), Inches(12.2), Inches(0.42),
"PREREQUISITES: Severity threshold met after optimal conventional management (including prone positioning trial if not contraindicated)",
sz=13, bold=True, color=GOLD)
# 3 main indication boxes
ind_data = [
("INDICATION 1 — Hypoxaemic Respiratory Failure",
ELSO_COLOR,
["PaO₂/FiO₂ < 80 mmHg",
"After optimal mechanical ventilation",
"Including prone positioning trial (if feasible)",
"FiO₂ at 1.0 (100% oxygen)",
"This threshold directly adopted from EOLIA Criterion 2",
"",
"Clinical context:",
"Severe ARDS (Berlin definition: PaO₂/FiO₂ < 100)",
"Viral pneumonia (H1N1, COVID-19, RSV)",
"Aspiration, near-drowning, inhalation injury",
"Post-lung transplant primary graft dysfunction"]),
("INDICATION 2 — Hypercapnic Respiratory Failure",
ELSO_COLOR,
["Arterial pH < 7.25",
"Despite optimal conventional MV:",
" RR up to 35 bpm and Pplat ≤ 30 cmH₂O",
"PaCO₂ ≥ 60 mmHg (adopted from EOLIA Criterion 3)",
"",
"Clinical context:",
"ARDS with high dead space fraction",
"Severe asthma (life-threatening status asthmaticus)",
"COPD acute exacerbation (as bridge to transplant)",
"Post-cardiac surgery CO₂ retention",
"Neuromuscular disease with respiratory failure"]),
("INDICATION 3 — Bridge Indications",
TEAL_LIGHT,
["Bridge to lung transplant:",
" Patients with end-stage lung disease",
" Awaiting transplant with deteriorating gas exchange",
" Awake ECMO preferred (avoid MV if possible)",
"",
"Bridge to decision:",
" When reversibility is uncertain",
" ECMO buys time for workup/diagnosis",
" e.g., undiagnosed cause of ARDS",
"",
"Bridge to recovery:",
" Classic indication — treat underlying cause",
" ECMO maintains oxygenation during recovery"]),
]
iw = Inches(4.0); ih = Inches(3.95)
ixs = [Inches(0.45), Inches(4.6), Inches(8.75)]
yb = y + Inches(0.55)
for ix, (ititle, ic, ilines) in zip(ixs, ind_data):
rect(s, ix, yb, iw, ih, RGBColor(0x0A, 0x30, 0x50))
rect(s, ix, yb, iw, Inches(0.45), ic)
tb(s, ix+Inches(0.08), yb, iw-Inches(0.16), Inches(0.45),
ititle, sz=12, bold=True, color=WHITE)
buls(s, ix+Inches(0.06), yb+Inches(0.5), iw-Inches(0.12), ih-Inches(0.6),
ilines, sz=11.5, color=WHITE, bchar="")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 18 — ELSO: Contraindications
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("ELSO 2021: Contraindications to VV-ECMO", ELSO_COLOR,
"From ELSO Table 1 — balancing futility, harm, and access to resources")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
# Absolute
rect(s, Inches(0.45), y+Inches(0.06), Inches(6.0), Inches(5.4), RGBColor(0x2A, 0x09, 0x09))
rect(s, Inches(0.45), y+Inches(0.06), Inches(6.0), Inches(0.45), RED)
tb(s, Inches(0.55), y+Inches(0.06), Inches(5.8), Inches(0.45),
"ABSOLUTE CONTRAINDICATION", sz=14, bold=True, color=WHITE)
buls(s, Inches(0.52), y+Inches(0.56), Inches(5.85), Inches(4.8),
["Non-recovery without viable decannulation plan",
"",
"This is the ONLY true absolute contraindication per ELSO 2021",
"",
"Applies when:",
" • Terminal illness with no transplant option",
" • Multi-organ failure — no path to decannulation",
" • Goals of care clearly limited (DNAR / withdrawal plan)",
"",
"Concept: ECMO can be initiated as 'bridge to decision'",
"even if reversibility is uncertain — as long as a",
"multidisciplinary discussion about decannulation options",
"is ongoing and documented",
"",
"Without a decannulation plan = futile ECMO = contraindicated"],
sz=12.5, color=WHITE, bchar="")
# Relative
rect(s, Inches(6.65), y+Inches(0.06), Inches(6.2), Inches(5.4), RGBColor(0x25, 0x1A, 0x05))
rect(s, Inches(6.65), y+Inches(0.06), Inches(6.2), Inches(0.45), AMBER)
tb(s, Inches(6.75), y+Inches(0.06), Inches(6.0), Inches(0.45),
"RELATIVE CONTRAINDICATIONS (ELSO Table 1)", sz=14, bold=True, color=WHITE)
buls(s, Inches(6.72), y+Inches(0.56), Inches(6.05), Inches(4.8),
["Contraindication to anticoagulation",
" Active major haemorrhage, HIT, coagulopathy",
" Cannot maintain heparin → circuit thrombosis",
"",
"Immunosuppression",
" Not absolute — clinical judgement required",
" Consider risk of circuit-related infection",
"",
"Older age",
" No definitive age cutoff in ELSO 2021",
" Risk increases with age; centre-specific policies",
" CESAR excluded > 65 yrs; EOLIA had no upper limit",
"",
"Mechanical ventilation > 7 days",
" Pplat > 30 cmH₂O AND FiO₂ > 90% for > 7 days",
" Sustained VILI → reduced likelihood of lung recovery",
" Clinical judgement: reversible cause still present?",
"",
"Others: morbid obesity, advanced directives, poor prognosis"],
sz=12, color=WHITE, bchar="")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 19 — ELSO: Decision Framework + RESP Score
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"ELSO Decision Framework: When to Initiate VV-ECMO",
"ELSO DECISION ALGORITHM",
[
"STEP 1 — Is the patient on optimal mechanical ventilation?",
" Tidal volume: 6 mL/kg IBW",
" Plateau pressure: ≤ 30 cmH₂O",
" PEEP: optimised (typically 10–15 cmH₂O)",
" FiO₂: 1.0 (maximum oxygen delivery)",
"",
"STEP 2 — Have rescue strategies been attempted?",
" Prone positioning: ≥ 16 hours (if not contraindicated)",
" Neuromuscular blockade",
" Recruitment manoeuvres",
" Inhaled nitric oxide / prostacyclin (if available)",
"",
"STEP 3 — Is the threshold met?",
" PaO₂/FiO₂ < 80 (EOLIA Criterion 2 / ELSO minimum)",
" OR pH < 7.25 + PaCO₂ ≥ 60",
" OR Murray Score > 3.0 (CESAR threshold)",
"",
"STEP 4 — Is there a viable decannulation plan?",
" YES → initiate ECMO",
" UNCERTAIN → initiate as 'bridge to decision' with MDT",
],
"RESP SCORE — Survival Prediction Tool",
[
"RESP = Respiratory ECMO Survival Prediction Score",
"Validated in 2355 VV-ECMO patients (ELSO registry)",
"",
"RESP Score Components (selected):",
" Age < 49 yrs = +3",
" Immunocompromised = -2",
" Acute viral/bacterial pneumonia = +3",
" Asthma = +11 (best prognosis)",
" Non-pulmonary sepsis = -3",
" Duration of acute respiratory failure < 48h = +3",
" Duration > 7 days = -2",
"",
"ELSO RECOMMENDATION:",
"Use Murray Score + RESP Score together for initiation decisions",
"RESP score predicts IN-HOSPITAL SURVIVAL after ECMO",
"RESP < -2 → predicted mortality > 60% — consider carefully",
"RESP ≥ 6 → predicted survival > 90%",
"Helps counsel families and guide resource allocation",
],
accent=ELSO_COLOR,
sz=12.5,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 20 — ELSO: Timing and Transfer
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"ELSO: Timing of ECMO Initiation & Transfer Principles",
"THE 'WAIT TOO LONG' PROBLEM",
[
"Common clinical mistake: delaying ECMO referral/initiation",
"ELSO explicitly warns: 'Do not wait too long for cannulation'",
"",
"Why timing matters:",
" Every additional hour of injurious ventilation → VILI accumulation",
" 7-day ventilation threshold (CESAR/EOLIA) is an EXCLUSION criterion",
" Sicker patients tolerate ECMO worse (more organ failure at cannulation)",
"",
"ELSO recommendation on timing:",
" If ECMO criteria are met and patient is deteriorating → act early",
" Do NOT wait until the patient is haemodynamically unstable",
" Do NOT try 'one more intervention' once criteria are clearly met",
"",
"Transfer for ECMO: should occur EARLY, before criteria become irreversible",
"If transport time > 1–2 hours: consider mobile ECMO team / ECMO retrieval",
],
"AWAKE ECMO & CANNULATION NOTES",
[
"Awake ECMO (avoiding MV):",
" Emerging indication — particularly for bridge to transplant",
" Patient breathes spontaneously on ECMO with high-flow oxygen",
" Avoids VILI from mechanical ventilation entirely",
" Requires cooperative patient, sedation-free protocol",
" ELSO supports awake ECMO as a viable strategy",
"",
"Cannulation strategies:",
" Bicaval dual-lumen cannula (e.g., Avalon): single-vein insertion",
" Femoro-jugular: drainage from femoral vein + return via internal jugular",
" Femoro-femoral: both cannulae in femoral veins (suboptimal recirculation)",
"",
"Prone positioning on ECMO:",
" Feasible and beneficial — ECMO does not preclude proning",
" Significant recirculation risk when proning — adjust cannulae position",
" ELSO advocates proning on ECMO if lung recovery ongoing",
],
accent=ELSO_COLOR,
sz=12.5,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 21 — SIDE-BY-SIDE COMPARISON: CESAR vs EOLIA vs ELSO
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("Head-to-Head Comparison: CESAR vs EOLIA vs ELSO Criteria", TEAL,
"Detailed comparison of ECMO initiation thresholds across all three sources")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
rows_c = [
("Feature", "CESAR (2009)", "EOLIA (2018)", "ELSO Guidelines (2021)"),
("Evidence type", "RCT (n=180, UK)", "RCT (n=249, international)", "Clinical guideline (evidence synthesis)"),
("Primary threshold 1", "Murray Score > 3.0", "PaO₂/FiO₂ < 50 for > 3 h", "PaO₂/FiO₂ < 80 mmHg (EOLIA-derived)"),
("Primary threshold 2", "Arterial pH < 7.20", "PaO₂/FiO₂ < 80 for > 6 h", "pH < 7.25 + PaCO₂ ≥ 60 (EOLIA-derived)"),
("Primary threshold 3", "—", "pH < 7.25 + PaCO₂ ≥ 60 for > 6 h", "Murray Score > 3 (CESAR-derived)"),
("Trigger logic", "Murray > 3 OR pH < 7.20", "ANY ONE of 3 criteria", "One or more of stated criteria"),
("Age limit", "18–65 years", "Not specified / no upper limit", "No absolute age cutoff"),
("MV duration exclusion", "> 7 days at high settings", "> 7 days at enrolment", "> 7 days, Pplat > 30, FiO₂ > 90%"),
("Reversibility", "Explicit requirement", "Implied (acute, treatable cause)", "Explicit requirement"),
("Anticoag contraindication","Exclusion", "Exclusion", "Relative contraindication"),
("Absolute contraindication","ICH, no active tx, anticoag", "Anticoag CI, BMI > 45, immunosupp", "Non-recovery without decannulation plan"),
("Prone prior to ECMO", "Not mandated", "Mandatory (if feasible)", "Strongly recommended"),
("Referral vs direct ECMO", "Referral to ECMO centre", "Direct ECMO initiation at trial site", "Both options supported"),
]
hdrs = rows_c[0]; col_xs4 = [Inches(0.45), Inches(3.35), Inches(6.5), Inches(9.75)]
col_ws4 = [Inches(2.85), Inches(3.1), Inches(3.2), Inches(3.4)]
rh4 = Inches(0.44)
# Header row
header_colors = [NAVY, CESAR_COLOR, EOLIA_COLOR, ELSO_COLOR]
for ci, (cx, cw) in enumerate(zip(col_xs4, col_ws4)):
rect(s, cx, y+Inches(0.05), cw-Inches(0.05), Inches(0.38), header_colors[ci])
tb(s, cx+Inches(0.04), y+Inches(0.05), cw-Inches(0.09), Inches(0.38),
hdrs[ci], sz=12.5, bold=True, color=WHITE if ci == 0 else NAVY)
for ri, row in enumerate(rows_c[1:]):
ry = y + Inches(0.5) + ri * rh4
bg = CARD if ri % 2 == 0 else RGBColor(0x0C, 0x38, 0x5C)
rect(s, Inches(0.4), ry, Inches(12.5), rh4-Inches(0.04), bg)
for ci, (cx, cw) in enumerate(zip(col_xs4, col_ws4)):
tc = WHITE
if ci == 1 and row[ci] not in ["—", ""]: tc = RGBColor(0x80, 0xFF, 0xB0)
if ci == 2 and row[ci] not in ["—", ""]: tc = RGBColor(0xDD, 0xBB, 0xFF)
if ci == 3 and row[ci] not in ["—", ""]: tc = RGBColor(0x99, 0xDD, 0xFF)
tb(s, cx+Inches(0.04), ry+Inches(0.03), cw-Inches(0.08), rh4-Inches(0.06),
row[ci], sz=11, color=tc)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 22 — Unified Decision Pathway
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("Unified Clinical Decision Pathway for VV-ECMO", TEAL,
"Integrating CESAR + EOLIA + ELSO into a single bedside algorithm")
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.2), CARD)
steps_p = [
(TEAL_LIGHT, "STEP 1", "Confirm ARDS / Respiratory Failure",
"Meets Berlin criteria for ARDS? or Severe hypercapnic failure? Identify underlying reversible cause (pneumonia, ARDS, aspiration, viral, trauma)."),
(TEAL, "STEP 2", "Optimise Conventional Management",
"Tidal volume 6 mL/kg IBW | Pplat ≤ 30 cmH₂O | PEEP optimised | FiO₂ = 1.0 | Prone positioning ≥ 16h | Neuromuscular blockade | Optimise PEEP by P-V curve or PEEP ladder"),
(ELSO_COLOR, "STEP 3", "Check ECMO Threshold (EOLIA / ELSO minimum)",
"PaO₂/FiO₂ < 80 mmHg for > 6h OR PaO₂/FiO₂ < 50 mmHg for > 3h OR pH < 7.25 + PaCO₂ ≥ 60 for > 6h | OR Murray Score > 3.0 (CESAR)"),
(CESAR_COLOR, "STEP 4", "Assess Reversibility & Exclusions",
"Is the condition reversible? Duration of MV < 7 days at high settings? No intracranial bleeding? Anticoagulation safe? Viable decannulation plan exists?"),
(GOLD, "STEP 5", "RESP Score + MDT Discussion",
"Calculate RESP score (survival prediction). Multidisciplinary team discussion: intensivist + ECMO specialist + transplant team if applicable. Inform family."),
(GREEN, "STEP 6", "Transfer to ECMO Centre or Cannulate",
"If at referring centre: URGENT transfer (mobile ECMO team if > 60 min transport). If at ECMO centre: initiate VV-ECMO now. Document indication, ECMO type, decannulation plan."),
]
rh5 = Inches(0.75)
for i, (sc, slbl, stitle, sdesc) in enumerate(steps_p):
ry = y + Inches(0.1) + i * rh5
rect(s, Inches(0.5), ry, Inches(1.35), Inches(0.65), sc)
tb(s, Inches(0.5), ry, Inches(1.35), Inches(0.65),
slbl, sz=13, bold=True, color=NAVY if sc == GOLD else WHITE, align=PP_ALIGN.CENTER)
tb(s, Inches(2.0), ry+Inches(0.04), Inches(3.5), Inches(0.35),
stitle, sz=13, bold=True, color=sc if sc != GOLD else GOLD)
tb(s, Inches(5.7), ry+Inches(0.04), Inches(7.0), Inches(0.58),
sdesc, sz=11.5, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 23 — Key Clinical Pearls
# ═══════════════════════════════════════════════════════════════════════════════
two_col(
"Key Clinical Pearls: Putting It All Together",
"HIGH-YIELD EXAM & CLINICAL POINTS",
[
"1. CESAR uses MURRAY SCORE > 3.0 as the trigger — a composite score (PaO₂/FiO₂ + PEEP + compliance + CXR)",
"2. EOLIA uses 3 PRECISE CRITERIA based purely on ABG and pH values — no composite score",
"3. ELSO adopts EOLIA criteria as minimum thresholds AND endorses CESAR's Murray > 3",
"4. The PaO₂/FiO₂ < 80 threshold from EOLIA is now the STANDARD minimum for ECMO consideration",
"5. EOLIA p = 0.09 — not because ECMO failed, but because 28% crossover diluted the effect",
"6. Bayesian analysis of EOLIA shows 97% probability of benefit → clinical practice follows this",
"7. CESAR + EOLIA meta-analysis (2020): confirms 90-day mortality reduction (p = 0.013)",
"8. Prone positioning MUST be attempted before ECMO (EOLIA/ELSO requirement)",
"9. ELSO: Only absolute contraindication = no viable decannulation plan",
"10. > 7 days of injurious ventilation = relative/absolute exclusion in ALL three sources",
],
"COMMON CLINICAL MISTAKES TO AVOID",
[
"DO NOT delay ECMO beyond 7 days of high-pressure ventilation",
"DO NOT give verapamil thinking ECMO is only for cardiac failure",
"DO NOT initiate ECMO without a clear decannulation plan (ELSO absolute CI)",
"DO NOT skip prone positioning — it is mandatory before ECMO in EOLIA/ELSO",
"DO NOT use Murray Score without understanding its 4 components",
"DO NOT interpret EOLIA p = 0.09 as 'ECMO doesn't work'",
"DO NOT forget: CESAR result includes the benefit of the entire ECMO-centre protocol",
"DO NOT initiate ECMO in patients with terminal illness / no recovery pathway",
"REMEMBER: PaO₂/FiO₂ must be checked on FiO₂ 1.0 and optimal PEEP",
"REMEMBER: pH < 7.25 + PaCO₂ ≥ 60 = hypercapnic indication EVEN if PaO₂/FiO₂ is adequate",
],
accent=TEAL,
sz=12.5,
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 24 — References
# ═══════════════════════════════════════════════════════════════════════════════
s, y = std_slide("References", TEAL)
rect(s, Inches(0.4), y, Inches(12.5), H - y - Inches(0.25), CARD)
refs = [
"1. Peek GJ, Mugford M, Tiruvoipati R, et al. Efficacy and economic assessment of conventional ventilatory support versus extracorporeal membrane oxygenation for severe adult respiratory failure (CESAR). Lancet. 2009;374(9698):1351–1363. PMID: 19762075",
"2. Combes A, Hajage D, Capellier G, et al. Extracorporeal Membrane Oxygenation for Severe Acute Respiratory Distress Syndrome (EOLIA). N Engl J Med. 2018;378(21):1965–1975. PMID: 29791822. DOI: 10.1056/NEJMoa1800385",
"3. Tonna JE, Abrams D, Brodie D, et al. Management of Adult Patients Supported with Venovenous Extracorporeal Membrane Oxygenation (VV ECMO): Guideline from the Extracorporeal Life Support Organization (ELSO). ASAIO Journal. 2021;67(6):601–610.",
"4. Combes A, Peek GJ, Hajage D, et al. ECMO for severe ARDS: systematic review and individual patient data meta-analysis (CESAR + EOLIA). Intensive Care Med. 2020;46:2048–2057. PMID: 33021684",
"5. Murray JF, Matthay MA, Luce JM, Flick MR. An expanded definition of the adult respiratory distress syndrome. Am Rev Respir Dis. 1988;138(3):720–723. [Murray Score original publication]",
"6. Schmidt M, Bailey M, Sheldrake J, et al. Predicting survival after extracorporeal membrane oxygenation for severe acute respiratory failure: the Respiratory ECMO Survival Prediction (RESP) Score. Am J Respir Crit Care Med. 2014;189(11):1374–1382. [RESP Score]",
"7. Ranieri VM, Rubenfeld GD, Thompson BT, et al. Acute respiratory distress syndrome: The Berlin definition. JAMA. 2012;307(23):2526–2533. [Berlin ARDS criteria]",
"8. Extracorporeal Life Support Organization. ELSO Guidelines for Adult Respiratory Failure. ELSO Registry. https://www.elso.org/ecmo-resources/elso-ecmo-guidelines.aspx [Accessed 2025]",
]
buls(s, Inches(0.55), y+Inches(0.1), Inches(12.2), H-y-Inches(0.4),
refs, sz=13, color=PALE_BLUE, bchar="")
# ═══════════════════════════════════════════════════════════════════════════════
# SAVE
# ═══════════════════════════════════════════════════════════════════════════════
out = "/tmp/workspace/oncological-emergencies/CESAR_EOLIA_ELSO_ECMO_Criteria.pptx"
buf = BytesIO()
prs.save(buf)
with open(out, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out}")
print(f"Total slides: {len(prs.slides)}")
cd /tmp/workspace/oncological-emergencies && python build_cesar_eolia_elso.py 2>&1