A 65-year-old man presents with a sudden onset of Severe pain in the right lower limb. The limb is cold peripherally. The right femoral pulse is palpable, but the right popliteal and dorsalis pedis pulses are absent. He is a known patient with diabetes mellitus and has a long history of smoking. What is the most appropriate investigation? A. Ankle–Brachial Pressure Index (ABPI) B. CT angiography C. Digital Subtraction Angiography D. Doppler ultrasound E. Magnetic Resonance Angiography (MRA)
| Option | Why Not the Best Answer |
|---|---|
| A. ABPI | ABPI is a screening/monitoring tool for chronic peripheral arterial disease (PAD), not appropriate for acute emergencies. It gives a ratio but no anatomical detail. |
| B. CT Angiography (CTA) | CTA is useful and increasingly used for imaging the arterial tree, but it is purely diagnostic - it cannot be used therapeutically. DSA remains superior when intervention is planned in the same sitting. In the context of a surgical exam question, DSA is the "most appropriate" single investigation. |
| D. Doppler Ultrasound | Bedside Doppler may confirm absent signals and classify Rutherford grade (I/IIA/IIB/III), but cannot provide the complete arterial roadmap needed for intervention planning. |
| E. MRA | MRA is time-consuming, poorly suited for emergency use, and contraindicated in patients with metallic implants. Not practical for acute management. |
| Grade | Category | Sensory Loss | Motor Deficit | Prognosis |
|---|---|---|---|---|
| I | Viable | None | None | No immediate threat |
| IIA | Marginally threatened | Minimal (toes) | None | Salvageable if promptly treated |
| IIB | Immediately threatened | More than toes | Mild/moderate | Needs immediate revascularisation |
| III | Irreversible | Profound/insensate | Paralysed | Amputation likely |
This presentation is acute limb ischaemia (ALI) — sudden onset severe pain, cold limb, with a palpable femoral pulse but absent popliteal and dorsalis pedis pulses, localizing the occlusion to the femoropopliteal segment. This is a vascular emergency requiring rapid, definitive imaging to plan urgent intervention (embolectomy, thrombolysis, angioplasty, or bypass) — time is critical to salvage the limb. CT angiography is the investigation of choice in acute limb ischaemia because it: Is fast and widely available, even out of hours Provides detailed anatomical mapping of the entire arterial tree (inflow, occlusion site, outflow, collateral circulation) in one study Allows immediate surgical/endovascular planning without the delay of other modalities Is non-invasive compared to conventional angiography Why not the others: A. ABPI — Useful for assessing chronic peripheral arterial disease severity, but in acute severe ischaemia, it doesn't provide anatomical detail needed for emergency intervention planning, and obtaining accurate readings can be difficult/unreliable in an acutely ischaemic, painful limb. It's a bedside screening tool, not a definitive pre-intervention investigation. C. Digital Subtraction Angiography (DSA) — Historically the gold standard for arterial imaging and still used, especially when combined with therapeutic intervention (catheter-directed thrombolysis or angioplasty can be done in the same sitting). However, it's invasive, more time-consuming to set up, and requires specialist interventional radiology availability — CT angiography has largely superseded it as the initial diagnostic step, with DSA reserved for cases proceeding directly to endovascular treatment. D. Doppler ultrasound — Can assess flow and locate occlusion but is operator-dependent, doesn't give the detailed roadmap of collaterals and distal run-off needed for surgical planning, and is generally used more for chronic PAD assessment or initial bedside confirmation rather than definitive pre-operative imaging in an emergency. E. MRA — Provides good anatomical detail but is too slow for an acute emergency (limited availability, longer acquisition times, harder to arrange urgently at most centers), and isn't practical when rapid decision-making is needed to salvage a threatened limb. Key teaching point: In acute limb ischaemia, rapid diagnosis and revascularization are critical (the classic "6 P's" — pain, pallor, pulselessness, paralysis, paresthesia, perishing cold — and the window for limb salvage is often just a few hours). CT angiography is now the standard first-line imaging modality in most centers due to its speed and comprehensive anatomical detail, guiding urgent surgical or endovascular management.
acute limb ischemia investigation CT angiography vs DSA first line 2023 2024 guidelines
https://pmc.ncbi.nlm.nih.gov/articles/PMC6723825
https://www.ejves.com/article/S1078-5884(23)00741-4/fulltext
| Factor | CTA Advantage |
|---|---|
| Speed | Available 24/7, scan takes minutes, no theatre/IR setup time |
| Non-invasive | No arterial puncture, no risk of access-site complications |
| Full roadmap | Aorta to foot in one acquisition - inflow, occlusion site, outflow, collaterals all visualized |
| Pre-op planning | Allows surgeons to plan embolectomy vs. bypass vs. endovascular approach before entering theatre |
| Calcification detection | Unlike MRA, CTA shows calcified plaques - important in a diabetic patient |
| Widely available | Available in most hospitals out of hours; IR suites for DSA are not always immediately accessible |
| Investigation | Role in ALI |
|---|---|
| CTA | First-line imaging - fast, non-invasive, complete anatomical roadmap |
| DSA | Second step - used when proceeding directly to endovascular intervention |
| Doppler USS | Bedside confirmation of absent flow, Rutherford grading, not for pre-op planning |
| ABPI | Chronic PAD screening only - not useful acutely |
| MRA | Too slow for acute emergencies |
Create a diagnostic algorithm for ALI: when to use DUS, CTA, and DSA
ESVS 2020 acute limb ischaemia guidelines imaging algorithm DUS CTA DSA Rutherford classification
mkdir -p /tmp/workspace/ali-algorithm && ls /tmp/workspace/ali-algorithm/
~/ali-algorithm/generate_algorithm.py
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch
import matplotlib.patheffects as pe
fig, ax = plt.subplots(figsize=(20, 26))
ax.set_xlim(0, 20)
ax.set_ylim(0, 26)
ax.axis('off')
fig.patch.set_facecolor('#F8F9FA')
# ─── Color palette ───────────────────────────────────────────────────────────
C_HEADER = '#1A237E' # deep navy
C_ENTRY = '#1565C0' # blue - entry / clinical step
C_VIABLE = '#2E7D32' # green - Grade I
C_MARG = '#F57F17' # amber - Grade IIa
C_IMMED = '#B71C1C' # red - Grade IIb
C_IRREV = '#4A148C' # purple - Grade III
C_DUS = '#00838F' # teal - DUS boxes
C_CTA = '#1565C0' # blue - CTA boxes
C_DSA = '#6A1B9A' # purple - DSA boxes
C_TX = '#37474F' # grey - treatment boxes
C_ARROW = '#455A64'
C_BG_LIGHT = '#ECEFF1'
C_WHITE = '#FFFFFF'
C_SOURCE = '#78909C'
def box(ax, x, y, w, h, text, facecolor, textcolor='white', fontsize=10,
bold=False, radius=0.4, alpha=1.0, ha='center', va='center',
linespacing=1.4):
fancy = FancyBboxPatch((x - w/2, y - h/2), w, h,
boxstyle=f"round,pad=0.05,rounding_size={radius}",
facecolor=facecolor, edgecolor='white',
linewidth=1.5, alpha=alpha, zorder=3)
ax.add_patch(fancy)
weight = 'bold' if bold else 'normal'
ax.text(x, y, text, ha=ha, va=va, fontsize=fontsize, color=textcolor,
fontweight=weight, zorder=4, linespacing=linespacing,
multialignment='center')
def arrow(ax, x1, y1, x2, y2, color=C_ARROW, lw=2, label='', label_side='right'):
ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
arrowprops=dict(arrowstyle='->', color=color,
lw=lw, connectionstyle='arc3,rad=0.0'),
zorder=2)
if label:
mx, my = (x1+x2)/2, (y1+y2)/2
dx = 0.35 if label_side == 'right' else -0.35
ax.text(mx+dx, my, label, ha='center', va='center',
fontsize=8, color=color, fontstyle='italic', zorder=5)
def side_arrow(ax, x1, y1, x2, y2, color=C_ARROW, lw=1.8, label='', label_side='right'):
ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
arrowprops=dict(arrowstyle='->', color=color,
lw=lw, connectionstyle='arc3,rad=0.0'),
zorder=2)
if label:
mx = (x1+x2)/2 + (0.4 if label_side=='right' else -0.4)
my = (y1+y2)/2
ax.text(mx, my, label, ha='center', va='center',
fontsize=8, color=color, fontstyle='italic', zorder=5)
# ═══════════════════════════════════════════════════════════════════════════════
# TITLE BANNER
# ═══════════════════════════════════════════════════════════════════════════════
title_bg = FancyBboxPatch((0.3, 24.7), 19.4, 1.1,
boxstyle="round,pad=0.1", facecolor=C_HEADER,
edgecolor='none', zorder=3)
ax.add_patch(title_bg)
ax.text(10, 25.25, 'DIAGNOSTIC IMAGING ALGORITHM IN ACUTE LIMB ISCHAEMIA (ALI)',
ha='center', va='center', fontsize=14, color='white',
fontweight='bold', zorder=4)
ax.text(10, 24.85, 'Based on ESVS 2020 Guidelines & Rutherford Classification',
ha='center', va='center', fontsize=9, color='#B0BEC5', zorder=4)
# ═══════════════════════════════════════════════════════════════════════════════
# STEP 1 — Presentation
# ═══════════════════════════════════════════════════════════════════════════════
box(ax, 10, 23.8, 14, 0.85,
'PATIENT PRESENTS: Sudden onset limb pain | Cold, pale limb | Absent distal pulses',
C_ENTRY, fontsize=10, bold=True)
arrow(ax, 10, 23.38, 10, 22.8)
# ═══════════════════════════════════════════════════════════════════════════════
# STEP 2 — Initial management
# ═══════════════════════════════════════════════════════════════════════════════
box(ax, 10, 22.45, 14, 0.65,
'IMMEDIATE: IV Heparin 5000 IU | Analgesia | Oxygen | Bloods (FBC, U&E, CK, coag, ECG)',
'#0277BD', fontsize=9.5, bold=False)
arrow(ax, 10, 22.12, 10, 21.5)
# ═══════════════════════════════════════════════════════════════════════════════
# STEP 3 — Clinical Assessment + Handheld Doppler
# ═══════════════════════════════════════════════════════════════════════════════
box(ax, 10, 21.15, 14, 0.65,
'BEDSIDE CLINICAL ASSESSMENT + Handheld Doppler (audible arterial/venous signals?)\n'
'Assess: Pain · Pallor · Pulselessness · Paraesthesia · Paralysis · Perishing cold',
C_DUS, fontsize=9.5)
arrow(ax, 10, 20.82, 10, 20.15)
# ═══════════════════════════════════════════════════════════════════════════════
# RUTHERFORD GRADE — central diamond-ish box
# ═══════════════════════════════════════════════════════════════════════════════
box(ax, 10, 19.8, 8.5, 0.6,
'CLASSIFY: Rutherford Grade (I / IIa / IIb / III)',
C_ENTRY, fontsize=10, bold=True)
# Grade labels below
grades = [
(3.0, 18.85, 'Grade I\nViable', C_VIABLE),
(7.2, 18.85, 'Grade IIa\nMarginal', C_MARG),
(12.8, 18.85, 'Grade IIb\nImmediate threat',C_IMMED),
(17.5, 18.85, 'Grade III\nIrreversible', C_IRREV),
]
for gx, gy, gtxt, gc in grades:
box(ax, gx, gy, 3.2, 0.95, gtxt, gc, fontsize=9, bold=True)
arrow(ax, gx, 19.5, gx, 19.32)
# Horizontal line connecting grade boxes — drawn as a line
ax.plot([1.4, 18.6], [19.25, 19.25], color=C_ARROW, lw=1.5, zorder=2)
# short drops to each grade box
for gx in [3.0, 7.2, 12.8, 17.5]:
ax.plot([gx, gx], [19.25, 19.32], color=C_ARROW, lw=1.5, zorder=2)
# main arrow down from Rutherford box
ax.plot([10, 10], [19.5, 19.25], color=C_ARROW, lw=1.5, zorder=2)
# ═══════════════════════════════════════════════════════════════════════════════
# GRADE I — Viable
# ═══════════════════════════════════════════════════════════════════════════════
arrow(ax, 3.0, 18.37, 3.0, 17.75)
box(ax, 3.0, 17.42, 3.8, 0.6,
'DUS\n(Duplex Ultrasound)',
C_DUS, fontsize=9, bold=True)
ax.text(3.0, 17.0, '• Confirm & localize occlusion\n• Assess collaterals\n• Operator-dependent',
ha='center', va='top', fontsize=7.8, color='#263238', linespacing=1.5, zorder=4)
arrow(ax, 3.0, 16.35, 3.0, 15.8)
box(ax, 3.0, 15.5, 3.8, 0.55,
'Anticoagulation alone\nor elective work-up',
C_VIABLE, fontsize=8.5)
# ═══════════════════════════════════════════════════════════════════════════════
# GRADE IIa — Marginal
# ═══════════════════════════════════════════════════════════════════════════════
arrow(ax, 7.2, 18.37, 7.2, 17.75)
box(ax, 7.2, 17.42, 3.8, 0.6,
'DUS then CTA',
C_CTA, fontsize=9, bold=True)
ax.text(7.2, 17.0,
'• DUS: bedside, rapid confirm\n• CTA: full anatomical roadmap\n• Plan endovasc. or open Rx',
ha='center', va='top', fontsize=7.8, color='#263238', linespacing=1.5, zorder=4)
arrow(ax, 7.2, 16.35, 7.2, 15.8)
box(ax, 7.2, 15.5, 3.8, 0.55,
'Endovascular or\nOpen revascularisation',
C_MARG, fontsize=8.5)
# ═══════════════════════════════════════════════════════════════════════════════
# GRADE IIb — Immediate threat
# ═══════════════════════════════════════════════════════════════════════════════
arrow(ax, 12.8, 18.37, 12.8, 17.75)
box(ax, 12.8, 17.42, 3.8, 0.6,
'CTA (first-line)',
C_CTA, fontsize=9, bold=True)
ax.text(12.8, 17.0,
'• Fast, widely available\n• Full inflow-to-foot map\n• Guides theatre planning\n• If CTA unavailable → go direct to DSA',
ha='center', va='top', fontsize=7.8, color='#263238', linespacing=1.5, zorder=4)
arrow(ax, 12.8, 16.2, 12.8, 15.8)
box(ax, 12.8, 15.5, 3.8, 0.55,
'Urgent revascularisation\n(embolectomy / bypass / endo)',
C_IMMED, fontsize=8.5)
# ═══════════════════════════════════════════════════════════════════════════════
# GRADE III — Irreversible
# ═══════════════════════════════════════════════════════════════════════════════
arrow(ax, 17.5, 18.37, 17.5, 17.75)
box(ax, 17.5, 17.42, 3.2, 0.6,
'No imaging needed',
C_IRREV, fontsize=9, bold=True)
ax.text(17.5, 17.0,
'• Diagnosis is clinical\n• Imaging will not change\n management',
ha='center', va='top', fontsize=7.8, color='#263238', linespacing=1.5, zorder=4)
arrow(ax, 17.5, 16.45, 17.5, 15.8)
box(ax, 17.5, 15.5, 3.2, 0.55,
'Palliative care /\nPrimary amputation',
C_IRREV, fontsize=8.5)
# ═══════════════════════════════════════════════════════════════════════════════
# DSA SECTION — therapeutic role
# ═══════════════════════════════════════════════════════════════════════════════
ax.plot([0.3, 19.7], [14.85, 14.85], color='#B0BEC5', lw=1.0, ls='--', zorder=2)
box(ax, 10, 14.38, 19.4, 0.7,
'WHEN IS DSA USED? (Therapeutic / Confirmatory Role — Not First-Line Diagnosis)',
C_DSA, fontsize=10, bold=True)
dsa_items = [
(4.0, 13.4, 'Patient proceeds\nto endovascular Rx\n(thrombolysis /\nthrombectomy /\nangioplasty)',
'DSA provides access\nand real-time roadmap\nduring the procedure'),
(10.0, 13.4, 'CTA unavailable\nor contraindicated\n(contrast allergy,\nrenal failure)',
'DSA is the alternative\nfor anatomical mapping\nbefore surgery'),
(16.0, 13.4, 'Intraoperative\ncompletion check\nafter embolectomy\nor bypass',
'Confirms distal flow\nrestoration and\ndetects residual lesions'),
]
for dx, dy, title, subtitle in dsa_items:
box(ax, dx, dy, 4.8, 1.05, title, C_DSA, fontsize=8.8, bold=True)
ax.text(dx, dy - 0.72, subtitle,
ha='center', va='top', fontsize=7.8, color='#37474F', linespacing=1.5, zorder=4)
# small arrows from DSA header to each item
for dx in [4.0, 10.0, 16.0]:
arrow(ax, dx, 14.03, dx, 13.92)
# ═══════════════════════════════════════════════════════════════════════════════
# IMAGING MODALITY COMPARISON TABLE
# ═══════════════════════════════════════════════════════════════════════════════
ax.plot([0.3, 19.7], [12.25, 12.25], color='#B0BEC5', lw=1.0, ls='--', zorder=2)
box(ax, 10, 11.88, 19.4, 0.6,
'IMAGING MODALITY QUICK REFERENCE',
C_HEADER, fontsize=10, bold=True)
# Table
col_x = [1.7, 5.6, 9.4, 13.2, 17.0]
col_w = [2.8, 3.2, 3.2, 3.2, 3.2]
headers = ['', 'DUS', 'CTA', 'DSA', 'MRA']
hdr_colors = [C_BG_LIGHT, C_DUS, C_CTA, C_DSA, '#00695C']
for i, (hx, hw, ht, hc) in enumerate(zip(col_x, col_w, headers, hdr_colors)):
box(ax, hx, 11.28, hw-0.15, 0.45, ht, hc,
textcolor='white' if hc != C_BG_LIGHT else '#263238',
fontsize=9, bold=True)
rows = [
('Availability', '24/7, bedside', '24/7 most centres', 'IR hours / on-call', 'Limited out-of-hours'),
('Invasive?', 'No', 'No', 'Yes', 'No'),
('Speed', 'Immediate', '5–10 min scan', '30–60 min setup', '20–40 min'),
('Roadmap quality', 'Operator-depend.', 'Excellent (full)', 'Excellent (dynamic)', 'Excellent'),
('Therapeutic?', 'No', 'No', 'Yes', 'No'),
('Key limitation', 'No distal detail\nif calcified',
'Contrast/radiation', 'Risk: access-site\nbleed/dissection',
'Slow; MRI exclusions'),
]
row_colors = ['#ECEFF1', '#FFFFFF']
row_ys = [10.82, 10.38, 9.95, 9.52, 9.09, 8.55]
row_hs = [0.38, 0.38, 0.38, 0.38, 0.38, 0.6]
for ri, (row, ry, rh) in enumerate(zip(rows, row_ys, row_hs)):
rc = row_colors[ri % 2]
for ci, (cx, cw, cell) in enumerate(zip(col_x, col_w, row)):
fc = rc if ci != 0 else '#CFD8DC'
tc = '#263238'
box(ax, cx, ry, cw-0.15, rh-0.04, cell, fc,
textcolor=tc, fontsize=7.8, bold=(ci==0), radius=0.15)
# ═══════════════════════════════════════════════════════════════════════════════
# KEY DECISION RULES footer
# ═══════════════════════════════════════════════════════════════════════════════
ax.plot([0.3, 19.7], [7.95, 7.95], color='#B0BEC5', lw=1.0, ls='--', zorder=2)
box(ax, 10, 7.6, 19.4, 0.55,
'KEY DECISION RULES',
C_HEADER, fontsize=10, bold=True)
rules = [
(C_VIABLE, 'Grade I (Viable)', 'DUS first. Non-invasive bedside\nconfirmation. No rush imaging.'),
(C_MARG, 'Grade IIa (Marginal)', 'DUS → CTA. Time allows full\nanatomical planning before Rx.'),
(C_IMMED, 'Grade IIb (Immediate)', 'CTA first-line. Do NOT delay\nfor DUS. DSA if going endovasc.'),
(C_IRREV, 'Grade III (Irrevers.)', 'No imaging. Clinical diagnosis.\nDirect to palliation/amputation.'),
(C_DSA, 'DSA — When?', 'Therapeutic endovascular Rx,\ncontra-indications to CTA,\nor intraop completion check.'),
]
rx = [1.9, 5.7, 9.5, 13.3, 17.1]
for i, (rc, rt, rd) in enumerate(rules):
box(ax, rx[i], 6.7, 3.4, 1.5, rt + '\n\n' + rd, rc, fontsize=8.0,
bold=False, radius=0.3)
# bold header inside — draw a separate text
ax.text(rx[i], 7.48, rt, ha='center', va='center',
fontsize=8.5, color='white', fontweight='bold', zorder=5)
# ═══════════════════════════════════════════════════════════════════════════════
# SOURCE footnote
# ═══════════════════════════════════════════════════════════════════════════════
ax.text(0.5, 0.25,
'Sources: ESVS 2020 Clinical Practice Guidelines on ALI (Björck et al., EJVES 2020) · '
'Bailey & Love\'s Short Practice of Surgery, 28th Ed. · '
'Björck et al., Acute Limb Ischaemia Update (EJVES 2022)',
ha='left', va='bottom', fontsize=7.2, color=C_SOURCE,
style='italic', zorder=4)
plt.tight_layout(pad=0.3)
plt.savefig('/tmp/workspace/ali-algorithm/ALI_Diagnostic_Algorithm.png',
dpi=180, bbox_inches='tight', facecolor=fig.get_facecolor())
print("Saved successfully.")
cd /tmp/workspace/ali-algorithm && python generate_algorithm.py 2>&1
ALI Diagnostic Algorithm
Image · PNG
| Grade | Modality | Rationale |
|---|---|---|
| I - Viable | DUS alone | No urgency. Bedside, non-invasive, confirms and localizes the occlusion. Anticoagulation may suffice. |
| IIa - Marginally threatened | DUS then CTA | Time allows a full anatomical roadmap. DUS confirms the diagnosis; CTA maps inflow, occlusion site, outflow, and collaterals for elective-urgent intervention planning. |
| IIb - Immediately threatened | CTA first-line | Speed is everything. CTA in 5-10 min gives the surgeon the full picture. Skip DUS - do not add delays. If CTA is unavailable or contrast is contraindicated, go directly to DSA. |
| III - Irreversible | No imaging | Clinical diagnosis. Imaging changes nothing. Direct to palliation or primary amputation. |