Hello orris
I’m emergency medicine final year student appearing for exams can you help me
Okay if I feel difficulty i will ask you
Can you explain all about stemi and latest stemi guidelines
"ST-elevation myocardial infarction" AND "guidelines"
ACC AHA 2025 STEMI guidelines update latest recommendations
https://www.jacc.org/doi/10.1016/j.jacc.2025.01.018
PMID: 40014670
| Feature | Classic | Atypical (watch for these!) |
|---|---|---|
| Chest pain | Crushing, pressure, radiation to arm/jaw | Absent (especially diabetics, elderly, women) |
| Associated | Diaphoresis, nausea, vomiting, dyspnea | Epigastric pain, fatigue, syncope |
| Duration | >20 minutes, not relieved by nitrates | Variable |
| Lead Group | Elevation Threshold | Territory |
|---|---|---|
| 2 contiguous limb leads | ≥1 mm | Inferior (II, III, aVF) or lateral (I, aVL) |
| 2 contiguous precordial leads (V1-V4) | ≥2 mm men, ≥1.5 mm women | Anterior |
| V4R | ≥0.5 mm | Right ventricle |
| Territory | Leads | Artery |
|---|---|---|
| Anterior | V1-V4 | LAD |
| Lateral | I, aVL, V5-V6 | LCx |
| Inferior | II, III, aVF | RCA (80%), LCx (20%) |
| Posterior | V7-V9, STD V1-V3 | RCA/LCx |
| Right ventricle | V4R | RCA |
| Scenario | Target |
|---|---|
| PCI-capable hospital | First medical contact (FMC) to balloon ≤90 minutes |
| Transfer from non-PCI hospital | FMC to balloon ≤120 minutes |
| Fibrinolysis if PCI not achievable | FMC to needle ≤30 minutes |
Note: The concept of "first medical contact to device time" replaces the old "door to balloon" or "door to needle" terminology.

| Drug | Dose | Notes |
|---|---|---|
| Aspirin | 162-325 mg loading, then 75-100 mg daily | Give immediately |
| Ticagrelor | 180 mg load, then 90 mg BD | Preferred with pPCI (2025 guidelines) |
| Prasugrel | 60 mg load, then 10 mg daily | Preferred with pPCI; avoid if prior stroke/TIA, age >75, weight <60 kg |
| Clopidogrel | 600 mg load, then 75 mg daily | Use if ticagrelor/prasugrel unavailable; no loading dose if >75 yrs + fibrinolysis |
| Drug | Setting | Dose |
|---|---|---|
| UFH (unfractionated heparin) | Primary PCI | 70-100 U/kg IV bolus (without GPI); 50-70 U/kg if with GPI |
| Bivalirudin | Primary PCI | Alternative to UFH |
| Enoxaparin | Medical/fibrinolysis | 30 mg IV + 1 mg/kg SC Q12H |
| Fondaparinux | Medical management | 2.5 mg SC daily (avoid as sole anticoagulant for PCI) |
| Drug | Indication | Notes |
|---|---|---|
| Beta-blockers | All STEMI (oral, within 24h) | Reduce VT/VF, reinfarction; avoid in cardiogenic shock, acute HF, PR >240ms, 2nd/3rd degree block, active asthma |
| ACE inhibitor / ARB | All STEMI, especially EF <40% | Start within 24h; reduces MACE |
| High-intensity statin | All STEMI | Start immediately (Class I, 2025 guidelines) |
| Nitrates | Chest pain relief | Avoid if RV infarction, hypotension, recent PDE5 inhibitor use |
| Morphine | Refractory pain | Use cautiously - may delay P2Y12 absorption |
| Oxygen | O2 sat <90% | Avoid routine O2 if sat ≥90%; may cause harm |
| Scenario | Recommendation | Class |
|---|---|---|
| Hemodynamically stable STEMI + MVD | Complete revascularization (infarct + noninfarct arteries) recommended - either at index PCI or within 45 days | Class I |
| Cardiogenic shock + MVD | Routine PCI of noninfarct artery at time of primary PCI should NOT be performed (higher risk of death/renal failure) | Class III (Harm) |
| Low-complexity MVD, hemodynamically stable | Multivessel PCI at time of primary PCI may be preferred over staged approach | Class 2b |
| Class | Signs | Mortality |
|---|---|---|
| I | No HF signs | ~5% |
| II | S3, basal rales | ~10% |
| III | Pulmonary edema | ~20-40% |
| IV | Cardiogenic shock | ~80% |
Can you give it in a pdf
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/stemi-guide && python3 -c "import reportlab; pr…
~/stemi-guide/generate_stemi_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import KeepTogether
OUTPUT = "/home/daytona/workspace/stemi-guide/STEMI_EM_Study_Guide.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=2*cm, leftMargin=2*cm,
topMargin=2.5*cm, bottomMargin=2.5*cm,
title="STEMI – Complete EM Study Guide",
author="Orris AI"
)
W = A4[0] - 4*cm # usable width
# ── Colour palette ──────────────────────────────────────────────────────────
RED = colors.HexColor("#C0392B")
DARKRED = colors.HexColor("#922B21")
BLUE = colors.HexColor("#1A5276")
LBLUE = colors.HexColor("#D6EAF8")
ORANGE = colors.HexColor("#E67E22")
GREEN = colors.HexColor("#1E8449")
LGREEN = colors.HexColor("#D5F5E3")
LGREY = colors.HexColor("#F2F3F4")
MGREY = colors.HexColor("#BDC3C7")
WHITE = colors.white
# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, parent="Normal", **kw):
return ParagraphStyle(name, parent=base[parent], **kw)
Title = S("Title2", fontSize=26, textColor=WHITE, leading=32,
alignment=TA_CENTER, fontName="Helvetica-Bold")
Sub = S("Sub", fontSize=12, textColor=WHITE, leading=16,
alignment=TA_CENTER, fontName="Helvetica")
H1 = S("H1", fontSize=14, textColor=WHITE, leading=18,
fontName="Helvetica-Bold", spaceAfter=2)
H2 = S("H2", fontSize=11, textColor=BLUE, leading=15,
fontName="Helvetica-Bold", spaceBefore=8, spaceAfter=3)
H3 = S("H3", fontSize=10, textColor=DARKRED, leading=13,
fontName="Helvetica-Bold", spaceBefore=4, spaceAfter=2)
Body = S("Body", fontSize=9, leading=13, spaceAfter=3,
alignment=TA_JUSTIFY)
Bullet = S("Bullet", fontSize=9, leading=13, leftIndent=14,
firstLineIndent=-10, spaceAfter=2)
Small = S("Small", fontSize=7.5, textColor=colors.HexColor("#555555"),
leading=10, alignment=TA_CENTER)
Bold9 = S("Bold9", fontSize=9, fontName="Helvetica-Bold", leading=13)
Warn = S("Warn", fontSize=9, textColor=RED, fontName="Helvetica-Bold",
leading=13)
Note = S("Note", fontSize=8.5, textColor=BLUE, leading=12,
leftIndent=8)
def bullet(txt):
return Paragraph(f"• {txt}", Bullet)
def h1_block(text, bg=BLUE):
tbl = Table([[Paragraph(text, H1)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [4]),
]))
return tbl
def section_table(rows, col_widths, header_bg=BLUE, alt=True):
"""Styled table with coloured header row."""
style = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("LEADING", (0,0), (-1,-1), 11),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("GRID", (0,0), (-1,-1), 0.4, MGREY),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
if alt:
for i in range(1, len(rows), 2):
style.append(("BACKGROUND", (0,i), (-1,i), LGREY))
tbl = Table(
[[Paragraph(str(c), Bold9 if r==0 else Body) for c in row]
for r, row in enumerate(rows)],
colWidths=col_widths
)
tbl.setStyle(TableStyle(style))
return tbl
def warning_box(text):
tbl = Table([[Paragraph(f"⚠ {text}", Warn)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#FDEDEC")),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 1, RED),
]))
return tbl
def info_box(text, bg=LBLUE, tc=BLUE):
style = S("IB", fontSize=9, textColor=tc, leading=13, leftIndent=4)
tbl = Table([[Paragraph(text, style)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.8, tc),
]))
return tbl
# ════════════════════════════════════════════════════════════════════════════
# CONTENT
# ════════════════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ───────────────────────────────────────────────────────────────
cover = Table(
[[Paragraph("STEMI", Title)],
[Paragraph("Complete Emergency Medicine Study Guide", Sub)],
[Spacer(1, 0.3*cm)],
[Paragraph("Based on 2025 ACC/AHA/ACEP/NAEMSP/SCAI Guidelines", Sub)],
],
colWidths=[W]
)
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), RED),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 18),
("ROUNDEDCORNERS", [6]),
]))
story += [Spacer(1, 1*cm), cover, Spacer(1, 0.5*cm)]
meta = Table([[
Paragraph("For: Emergency Medicine Final Year Students", Small),
Paragraph("Date: July 2026", Small),
Paragraph("Sources: Tintinalli · Braunwald · Fuster & Hurst · PubMed", Small),
]], colWidths=[W/3]*3)
story += [meta, Spacer(1, 0.8*cm), HRFlowable(width=W, color=MGREY), Spacer(1, 0.3*cm)]
# ── 1. DEFINITION & PATHOPHYSIOLOGY ─────────────────────────────────────────
story += [h1_block("1. Definition & Pathophysiology"), Spacer(1, 0.2*cm)]
story.append(Paragraph(
"STEMI (ST-Elevation Myocardial Infarction) is a full-thickness (transmural) MI caused by "
"complete and sustained occlusion of a coronary artery, almost always due to atherosclerotic "
"plaque rupture with superimposed thrombus formation.", Body))
story.append(Paragraph("<b>Pathological sequence:</b>", Bold9))
for b in [
"Plaque vulnerability → rupture/erosion",
"Platelet aggregation → thrombus formation → complete occlusion",
"Myocardial ischemia starts within minutes",
"Irreversible necrosis begins at ~20 min (subendocardium first) — 'wavefront phenomenon'",
"Near-complete transmural necrosis after ~6 hours without reperfusion",
]:
story.append(bullet(b))
story.append(Spacer(1, 0.4*cm))
# ── 2. CLINICAL PRESENTATION ─────────────────────────────────────────────────
story += [h1_block("2. Clinical Presentation"), Spacer(1, 0.2*cm)]
rows = [
["Feature", "Classic", "Atypical (watch for!)"],
["Chest pain", "Crushing, pressure, radiation to left arm/jaw", "Absent — especially in diabetics, elderly, women"],
["Associated", "Diaphoresis, nausea, vomiting, dyspnea", "Epigastric pain, fatigue, syncope"],
["Duration", ">20 min, not relieved by nitrates", "Variable"],
]
story.append(section_table(rows, [3*cm, 7.5*cm, 6*cm]))
story.append(Spacer(1, 0.3*cm))
story.append(warning_box("High-risk for atypical presentation: Diabetics · Elderly · Women · Post-transplant patients"))
story.append(Spacer(1, 0.4*cm))
# ── 3. ECG DIAGNOSIS ─────────────────────────────────────────────────────────
story += [h1_block("3. ECG Diagnosis"), Spacer(1, 0.2*cm)]
story.append(Paragraph("<b>STEMI Diagnostic Criteria:</b>", H2))
rows = [
["Lead Group", "Elevation Threshold", "Territory"],
["2 contiguous limb leads (II,III,aVF or I,aVL)", "≥1 mm", "Inferior or Lateral"],
["2 contiguous precordial leads V1-V4", "≥2 mm men / ≥1.5 mm women", "Anterior"],
["V4R (right-sided lead)", "≥0.5 mm", "Right Ventricle"],
["V7-V9 (posterior leads)", "≥0.5 mm", "Posterior"],
]
story.append(section_table(rows, [6.5*cm, 5*cm, 5*cm]))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("<b>ECG Evolution:</b>", H2))
evo = Table([[
Paragraph("1\nHyperacute\nT waves", Small),
Paragraph("→", Small),
Paragraph("2\nST\nElevation", Small),
Paragraph("→", Small),
Paragraph("3\nPathological\nQ waves", Small),
Paragraph("→", Small),
Paragraph("4\nT wave\nInversion", Small),
Paragraph("→", Small),
Paragraph("5\nST normalises\nQ persists", Small),
]], colWidths=[2.5*cm, 0.6*cm, 2.5*cm, 0.6*cm, 2.5*cm, 0.6*cm, 2.5*cm, 0.6*cm, 2.5*cm])
evo.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), colors.HexColor("#FDEDEC")),
("BACKGROUND", (2,0), (2,0), colors.HexColor("#FDEBD0")),
("BACKGROUND", (4,0), (4,0), colors.HexColor("#D5F5E3")),
("BACKGROUND", (6,0), (6,0), colors.HexColor("#D6EAF8")),
("BACKGROUND", (8,0), (8,0), LGREY),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTSIZE", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("BOX", (0,0), (-1,-1), 0.5, MGREY),
]))
story += [evo, Spacer(1, 0.3*cm)]
story.append(Paragraph("<b>STEMI Equivalents (Critical for EM!):</b>", H2))
rows = [
["Pattern", "ECG Finding", "Vessel / Notes"],
["De Winter", "Upsloping STD + peaked T waves V1-V6", "LAD occlusion — NO classic STE"],
["Posterior MI", "STD V1-V3 + tall R waves", "Do posterior leads V7-V9"],
["Wellens Syndrome", "Biphasic or deeply inverted T waves V2-V3", "Critical LAD stenosis — pre-infarction!"],
["New LBBB", "New or presumed new left bundle branch block", "Treat as STEMI"],
["Sgarbossa criteria", "Concordant STE ≥1 mm; STE ≥5 mm discordant", "Diagnose MI in LBBB"],
]
story.append(section_table(rows, [3.5*cm, 6*cm, 7*cm], header_bg=DARKRED))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("<b>Territory Localisation:</b>", H2))
rows = [
["Territory", "Leads", "Artery"],
["Anterior", "V1-V4", "LAD"],
["Lateral", "I, aVL, V5-V6", "LCx"],
["Inferior", "II, III, aVF", "RCA (80%), LCx (20%)"],
["Posterior", "V7-V9 / STD V1-V3","RCA or LCx"],
["Right Ventricle", "V4R", "RCA proximal"],
]
story.append(section_table(rows, [4*cm, 5*cm, 7.5*cm]))
story.append(Spacer(1, 0.4*cm))
# ── 4. ED DIAGNOSIS ──────────────────────────────────────────────────────────
story += [h1_block("4. Diagnosis in the ED"), Spacer(1, 0.2*cm)]
story.append(info_box(
"⏱ KEY: 12-lead ECG must be acquired and interpreted within <b>10 minutes</b> of arrival (Class I — 2025 ACC/AHA).",
bg=LGREEN, tc=GREEN
))
story.append(Spacer(1, 0.2*cm))
for b in [
"<b>ECG:</b> 12-lead within 10 min; serial ECGs if initial non-diagnostic",
"<b>hs-Troponin:</b> Measure ASAP — repeat at <b>1-2 hours</b> (rapid protocol) or 3-6 hours (standard)",
"<b>Labs:</b> CBC, BMP, coagulation, BNP, lipid panel",
"<b>CXR:</b> Portable — assess for pulmonary oedema, widened mediastinum",
"<b>Bedside Echo:</b> If diagnosis uncertain — assess wall motion abnormalities, EF, pericardial effusion",
]:
story.append(bullet(b))
story.append(Spacer(1, 0.4*cm))
# ── 5. REPERFUSION ──────────────────────────────────────────────────────────
story += [h1_block("5. Reperfusion Strategy — The Core of STEMI Management", bg=DARKRED), Spacer(1, 0.2*cm)]
story.append(Paragraph(
"Timely reperfusion is the most effective method to restore myocardial oxygen supply. "
"Every 30-minute delay in reperfusion increases mortality. Timely reperfusion has reduced "
"in-hospital STEMI mortality from ~20% to ~5% over three decades.", Body))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Time Targets (2025 ACC/AHA — Class I):</b>", H2))
rows = [
["Scenario", "Target", "Note"],
["PCI-capable hospital", "FMC → Balloon ≤ 90 min", "First medical contact to device"],
["Transfer from non-PCI hospital", "FMC → Balloon ≤ 120 min", "Accounts for transfer time"],
["Fibrinolysis (if PCI unavailable)", "FMC → Needle ≤ 30 min", "If PCI can't meet 120 min target"],
["Fibrinolytic bolus from diagnosis", "STEMI Dx → Bolus ≤ 10 min", "Prehospital lysis if feasible"],
]
story.append(section_table(rows, [5*cm, 5*cm, 6.5*cm], header_bg=DARKRED))
story.append(Spacer(1, 0.2*cm))
story.append(info_box(
'ℹ "First Medical Contact to Device Time" replaces the old "door to balloon" / "door to needle" terminology.',
bg=LBLUE, tc=BLUE
))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("<b>Primary PCI vs Fibrinolysis:</b>", H2))
story.append(Paragraph(
"In a large meta-analysis of 23 RCTs, pPCI was superior to thrombolytics at reducing "
"death, reinfarction, and stroke. pPCI is always preferred when achievable within time targets.", Body))
story.append(Paragraph("<b>Absolute Contraindications to Fibrinolysis:</b>", H3))
for b in [
"Prior intracranial haemorrhage (any time)",
"Ischaemic stroke within 3 months",
"Structural cerebrovascular lesion or intracranial neoplasm",
"Active internal bleeding (not menses)",
"Suspected aortic dissection",
"Significant closed-head or facial trauma within 3 months",
]:
story.append(bullet(b))
story.append(Paragraph("<b>Post-Fibrinolysis Strategy:</b>", H3))
for b in [
"Successful lysis (≥50% ST resolution at 60-90 min) → Angiography within 3-24 hours (pharmacoinvasive strategy)",
"Failed reperfusion → Rescue PCI IMMEDIATELY",
]:
story.append(bullet(b))
story.append(Spacer(1, 0.4*cm))
# ── 6. PHARMACOTHERAPY ──────────────────────────────────────────────────────
story += [h1_block("6. Pharmacotherapy"), Spacer(1, 0.2*cm)]
story.append(Paragraph("<b>Antiplatelet Therapy (DAPT — Give Immediately):</b>", H2))
rows = [
["Drug", "Loading Dose", "Maintenance", "Notes"],
["Aspirin", "162-325 mg", "75-100 mg daily", "Give immediately to all"],
["Ticagrelor", "180 mg PO", "90 mg BD", "Preferred with pPCI (2025 Class I)"],
["Prasugrel", "60 mg PO", "10 mg daily", "Preferred with pPCI; AVOID if prior stroke/TIA, age >75, wt <60 kg"],
["Clopidogrel", "600 mg PO", "75 mg daily", "If ticagrelor/prasugrel unavailable; no load >75 yrs + fibrinolysis"],
]
story.append(section_table(rows, [2.8*cm, 2.8*cm, 3.5*cm, 7.4*cm], header_bg=GREEN))
story.append(Spacer(1, 0.2*cm))
story.append(info_box(
"⭐ 2025 NEW (Class I): Transition to ticagrelor monotherapy ≥1 month post-PCI reduces bleeding risk. "
"DAPT ≥12 months for low bleeding risk; shorter (1-3 months) for high bleeding risk.", bg=LGREEN, tc=GREEN))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("<b>Anticoagulation:</b>", H2))
rows = [
["Drug", "Setting", "Dose"],
["UFH (Unfractionated Heparin)", "Primary PCI", "70-100 U/kg IV bolus (without GPI); 50-70 U/kg with GPI"],
["Bivalirudin", "Primary PCI", "Alternative to UFH; lower bleeding risk"],
["Enoxaparin", "Fibrinolysis/Medical", "30 mg IV + 1 mg/kg SC Q12H"],
["Fondaparinux", "Medical management", "2.5 mg SC daily — AVOID as sole agent for PCI"],
]
story.append(section_table(rows, [4*cm, 3.5*cm, 9*cm], header_bg=GREEN))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("<b>Other Essential Drugs:</b>", H2))
rows = [
["Drug", "Indication", "Key Notes / Contraindications"],
["Beta-blockers (oral)", "All STEMI — within 24h", "Reduce VT/VF; AVOID in cardiogenic shock, acute HF, PR >240ms, 2°/3° block, active asthma"],
["ACE inhibitor / ARB", "All STEMI, esp. EF <40%", "Start within 24h; reduces MACE"],
["High-intensity statin", "All STEMI (Class I — 2025)", "Start immediately; goal LDL <70 mg/dL (or <40 if recurrent event)"],
["Nitrates", "Chest pain relief", "AVOID in RV infarction, hypotension (SBP <90), recent PDE5 inhibitor use"],
["Morphine", "Refractory pain only", "Use cautiously — may delay P2Y12 absorption"],
["Oxygen", "SpO2 <90% only", "Do NOT give routinely if SpO2 ≥90% — may cause harm"],
]
story.append(section_table(rows, [3.5*cm, 4*cm, 9*cm], header_bg=GREEN))
story.append(Spacer(1, 0.4*cm))
# ── 7. MULTIVESSEL DISEASE ───────────────────────────────────────────────────
story += [h1_block("7. Multivessel Disease in STEMI (2025 Major Update!)", bg=ORANGE), Spacer(1, 0.2*cm)]
story.append(Paragraph(
"Approximately 50% of STEMI patients have multivessel disease (MVD). Management of noninfarct "
"arteries is now well-defined by the 2025 guidelines.", Body))
rows = [
["Scenario", "Recommendation", "Class"],
["Haemodynamically STABLE STEMI + MVD",
"Complete revascularisation recommended — at index PCI or within 45 days",
"Class I"],
["Stable STEMI + low-complexity MVD",
"Multivessel PCI at time of primary PCI may be preferred over staged approach",
"Class 2b"],
["Cardiogenic SHOCK + MVD",
"Routine PCI of noninfarct artery at time of primary PCI SHOULD NOT be performed — higher risk of death/renal failure",
"Class III (HARM)"],
]
story.append(section_table(rows, [5.5*cm, 8.5*cm, 2.5*cm], header_bg=ORANGE))
story.append(Spacer(1, 0.4*cm))
# ── 8. COMPLICATIONS ────────────────────────────────────────────────────────
story += [h1_block("8. Complications of STEMI"), Spacer(1, 0.2*cm)]
story.append(Paragraph("<b>Early Complications (0-72 hours):</b>", H2))
rows = [
["Complication", "Key Features", "Management"],
["Ventricular Fibrillation (VF)", "Leading cause of early death", "Defibrillation, ACLS"],
["Complete Heart Block (inferior MI)", "Bradycardia, hypotension, wide QRS escape", "Atropine, temporary pacing"],
["RV Infarction", "Hypotension + JVD + clear lungs — 30-50% of inferior STEMIs", "IV fluids, avoid nitrates/diuretics, early pPCI"],
["Cardiogenic Shock", "SBP <90, cold/clammy, oliguria, low CO", "Primary PCI, vasopressors (noradrenaline), MCS"],
]
story.append(section_table(rows, [4.5*cm, 6*cm, 6*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Mechanical Complications (Days 3-7 — free wall weakest):</b>", H2))
rows = [
["Complication", "Clinical Features", "Management"],
["Free Wall Rupture", "Sudden cardiac death; Beck's triad (tamponade)", "Emergency surgery / pericardiocentesis"],
["VSD (Ventricular Septal Defect)", "New harsh holosystolic murmur; step-up O2 sat RA→RV", "Emergency surgical repair; MCS bridge"],
["Papillary Muscle Rupture / Acute MR", "Acute pulmonary oedema; soft or no murmur", "Emergency MV surgery; IABP bridge"],
]
story.append(section_table(rows, [4.5*cm, 5.5*cm, 6.5*cm]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Subacute / Late Complications:</b>", H2))
rows = [
["Complication", "Timing", "Features & Treatment"],
["Dressler Syndrome (Post-MI Pericarditis)", "Weeks after MI", "Fever + pericardial rub + pleurisy; treat with aspirin/NSAIDs/colchicine"],
["LV Thrombus", "Days to weeks", "Echo diagnosis; anticoagulate with warfarin or NOAC x 3 months"],
["LV Aneurysm", "Weeks to months", "Persistent ST elevation; paradoxical wall motion; anticoagulate if thrombus"],
]
story.append(section_table(rows, [5*cm, 2.5*cm, 9*cm]))
story.append(Spacer(1, 0.4*cm))
# ── 9. KILLIP CLASSIFICATION ────────────────────────────────────────────────
story += [h1_block("9. Killip Classification"), Spacer(1, 0.2*cm)]
rows = [
["Class", "Signs", "In-Hospital Mortality"],
["I", "No heart failure signs", "~5%"],
["II", "S3 gallop, basal rales <50% lung fields", "~10%"],
["III", "Pulmonary oedema (rales >50%)", "~20-40%"],
["IV", "Cardiogenic shock", "~80%"],
]
story.append(section_table(rows, [2*cm, 9.5*cm, 5*cm]))
story.append(Spacer(1, 0.4*cm))
# ── 10. 2025 GUIDELINE KEY CHANGES ──────────────────────────────────────────
story += [h1_block("10. 2025 ACC/AHA ACS Guideline — Key Changes", bg=DARKRED), Spacer(1, 0.2*cm)]
story.append(Paragraph(
"Published February 27, 2025 in Circulation (PMID: 40014670) and JACC. This landmark unified "
"guideline replaces the 2013 STEMI, 2014 NSTEMI, 2015 PCI, and 2016 DAPT guidelines.", Body))
story.append(Spacer(1, 0.2*cm))
changes = [
("1. DAPT Transition (NEW — Class I)",
"Ticagrelor monotherapy ≥1 month post-PCI is now Class I to reduce bleeding. DAPT ≥12 months for low bleeding risk."),
("2. Complete Revascularisation in MVD-STEMI (Class I)",
"For haemodynamically stable STEMI + MVD: complete revascularisation at index PCI or within 45 days."),
("3. Cardiogenic Shock + MVD (Class III Harm)",
"Do NOT routinely PCI the noninfarct artery at the time of primary PCI — increases death/renal failure."),
("4. Lipid Targets Updated",
"High-intensity statin for all ACS (Class I). For recurrent events within 2 years on max statin: LDL target <40 mg/dL."),
("5. Aspirin Dosing",
"Low-dose aspirin (≤100 mg/day) preferred for long-term maintenance therapy."),
("6. ECG + Troponin Protocols",
"ECG within 10 minutes (Class I). Rapid hs-troponin protocols: 0h/1-2h or 0h/3-6h."),
]
for title, body in changes:
story.append(Paragraph(f"<b>{title}</b>", H3))
story.append(Paragraph(body, Body))
story.append(Spacer(1, 0.4*cm))
# ── 11. QUICK MEMORY AIDS ────────────────────────────────────────────────────
story += [h1_block("11. Quick Memory Aids for Exams"), Spacer(1, 0.2*cm)]
story.append(Paragraph("<b>Time Targets (Memorise These!):</b>", H2))
times = Table([
[Paragraph("ECG", Bold9), Paragraph("10 min", Bold9)],
[Paragraph("pPCI (PCI hospital)", Body), Paragraph("FMC → Balloon ≤ 90 min", Body)],
[Paragraph("pPCI (transfer)", Body), Paragraph("FMC → Balloon ≤ 120 min", Body)],
[Paragraph("Fibrinolysis", Body), Paragraph("FMC → Needle ≤ 30 min", Body)],
[Paragraph("Lytic bolus from Dx", Body), Paragraph("STEMI Dx → Bolus ≤ 10 min", Body)],
], colWidths=[8*cm, 8.5*cm])
times.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), RED),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("BACKGROUND", (0,1), (-1,1), colors.HexColor("#FDEDEC")),
("BACKGROUND", (0,2), (-1,2), colors.HexColor("#FDEBD0")),
("BACKGROUND", (0,3), (-1,3), colors.HexColor("#FDFEFE")),
("BACKGROUND", (0,4), (-1,4), LGREY),
("GRID", (0,0), (-1,-1), 0.5, MGREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("FONTSIZE", (0,0), (-1,-1), 9),
]))
story += [times, Spacer(1, 0.3*cm)]
story.append(Paragraph("<b>MONA — Updated for 2025:</b>", H2))
mona_data = [
["M", "Morphine", "Use CAUTIOUSLY — not routinely (delays P2Y12 absorption)"],
["O", "Oxygen", "Only if SpO2 <90% — AVOID routine O2 if ≥90%"],
["N", "Nitrates", "AVOID in RV infarction, hypotension, PDE5i use"],
["A", "Aspirin", "Give IMMEDIATELY — Class I, 162-325 mg load"],
]
mona = Table(
[[Paragraph(f"<b>{r[0]}</b>", S("MC", fontSize=18, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph(f"<b>{r[1]}</b>", S("MD", fontSize=10, textColor=DARKRED, fontName="Helvetica-Bold")),
Paragraph(r[2], Body)] for r in mona_data],
colWidths=[1.2*cm, 3*cm, 12.3*cm]
)
mona.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), DARKRED),
("BACKGROUND", (1,0), (-1,-1), LGREY),
("GRID", (0,0), (-1,-1), 0.5, MGREY),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
story += [mona, Spacer(1, 0.4*cm)]
story.append(Paragraph("<b>RV Infarction — Triad to Remember:</b>", H2))
story.append(info_box(
"Hypotension + Elevated JVP + Clear Lungs (no pulmonary oedema)\n"
"→ Occurs in 30-50% of inferior STEMIs | Check V4R lead | Give IV FLUIDS — AVOID nitrates/diuretics",
bg=colors.HexColor("#FEF9E7"), tc=ORANGE
))
story.append(Spacer(1, 0.4*cm))
# ── REFERENCES ───────────────────────────────────────────────────────────────
story += [HRFlowable(width=W, color=MGREY), Spacer(1, 0.2*cm)]
story.append(Paragraph("<b>References</b>", H2))
refs = [
"Tintinalli JE et al. Tintinalli's Emergency Medicine: A Comprehensive Study Guide, 9th Ed. McGraw-Hill.",
"Fuster V et al. Fuster and Hurst's The Heart, 15th Edition. McGraw-Hill.",
"Braunwald E et al. Braunwald's Heart Disease: A Textbook of Cardiovascular Medicine, 12th Ed. Elsevier.",
"Rao SV et al. 2025 ACC/AHA/ACEP/NAEMSP/SCAI Guideline for the Management of Patients With Acute Coronary Syndromes. Circulation. 2025. PMID: 40014670",
"Faro DC et al. Complete PCI Revascularization in ACS With MVD: Systematic Review. JACC Cardiovasc Interv. 2023. PMID: 37821180",
]
for r in refs:
story.append(bullet(r))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"Generated by Orris AI · July 2026 · For educational use only — always verify clinical decisions against current guidelines.",
Small
))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved: {OUTPUT}")
cd /home/daytona/workspace/stemi-guide && python3 generate_stemi_pdf.py
ls -lh /home/daytona/workspace/stemi-guide/STEMI_EM_Study_Guide.pdf
STEMI EM Study Guide
PDF Document · PDF
Ur great