MAKE EXAM ORIENTED POSTGRADUATE EMERGENCY MEDICINE WITH TOPIC NAME ASTHAMA NEW GUIDLINE WITH RECENT ADVANCED
"asthma" AND "emergency" AND "guidelines"
GINA 2025 2026 asthma guidelines emergency management acute severe
https://www.guidelinecentral.com/insights/may-2026-gina-asth…
"acute severe asthma" AND ("magnesium" OR "heliox" OR "ketamine" OR "NIV")
| Term | Definition |
|---|---|
| Asthma exacerbation | Acute or subacute worsening of symptoms and lung function from the patient's usual status |
| Acute severe asthma | PEF 33-50% predicted; RR >25/min; HR >110; unable to complete sentences |
| Near-fatal asthma | Raised PaCO2 and/or requiring mechanical ventilation |
| Status asthmaticus | PEF or FEV1 does not increase to >40% predicted with treatment, OR rising PaCO2 without improvement in airflow |
| Life-threatening asthma | PEF <33%; SpO2 <92%; PaO2 <60 mmHg; PaCO2 normal or raised; silent chest; cyanosis; exhaustion; coma |
| Critical asthma syndrome | Umbrella term: status asthmaticus + near-fatal asthma |
Exam trap: In asthma, a "NORMAL PaCO2" during an attack = early DANGER sign (patient is tiring, losing ability to hyperventilate). Rising PaCO2 = impending respiratory failure.
| Feature | Mild | Moderate | Severe | Life-Threatening |
|---|---|---|---|---|
| Speech | Normal sentences | Phrases | Words only | Unable to speak |
| RR | Normal | Increased | >30/min | Very increased |
| HR | <100 | 100-120 | >120 | Bradycardia (pre-arrest) |
| SpO2 (room air) | ≥95% | 92-94% | <92% | <90% |
| PEF % predicted | >70% | 40-70% | <40% | <25% |
| PaCO2 | Normal/low | Normal/low | Normal | RAISED |
| Mental status | Alert | Alert | Anxious/agitated | Drowsy/confused/cyanotic |
NEW in GINA 2026: Oxygen supplementation NOT recommended unless SpO2 <92%. Target SpO2 = 92-95% in adults/adolescents/children 6-11. Target ≥92% in children ≤5 years.
10 mmHg = significant obstruction
25 mmHg = severe
| Parameter | Target |
|---|---|
| Tidal volume | 6-8 mL/kg IBW (low) |
| RR | <10 breaths/min (low) |
| Inspiratory flow | >60 L/min (high) - maximizes expiratory time |
| FiO2 | Titrate to maintain SpO2 |
| PEEP | Generally 0-5 cmH2O (minimize auto-PEEP) |
| PaCO2 | Allow to rise (permissive hypercapnia) |
Key concept: Priority = DECREASE HYPERINFLATION, not correct hypercarbia. Auto-PEEP/breath-stacking is the main killer in intubated asthmatics. Prolonged I:E ratio (1:3 to 1:5) is critical.
| Biologic | Target | Drug |
|---|---|---|
| Anti-IgE | IgE | Omalizumab (now generic available - GINA 2026 new) |
| Anti-IL-5 | IL-5 | Mepolizumab, Reslizumab, Benralizumab |
| Anti-IL-4/13 | IL-4Rα | Dupilumab |
| Anti-IL-33 | IL-33 | Tezepelumab (established), Depemokimab (NEW in GINA 2026 - anti-IL-5 long-acting) |
GINA 2026 NEW: Depemokimab (long-acting anti-IL-5) and generic anti-IgE added to biologic options for severe eosinophilic asthma.
| # | What Changed | Clinical Impact |
|---|---|---|
| 1 | O2 only if SpO2 <92%; target 92-95% (not higher) | Avoid hyperoxia |
| 2 | ICS-formoterol as alternate to SABA for mild exacerbation in ED | Anti-SABA overuse push |
| 3 | Shake suspension pMDIs before EVERY actuation | Avoid ultra-high accidental dosing |
| 4 | If anaphylaxis + asthma: epinephrine FIRST, then bronchodilator | Clear priority rule |
| 5 | New flowcharts for 4 patient groups in primary care and ED | Structured care pathways |
| 6 | Discharge on ICS-containing therapy; SABA-only NOT recommended | Prevents early relapse |
| 7 | Follow-up: adults 2-7 days, children 2-5 days | Structured post-ED care |
| 8 | Depemokimab + generic anti-IgE added as biologic options | Severe asthma treatment expansion |
| 9 | Routine ABG + CXR not required in ED | Reduces unnecessary testing |
Exam Tip: GINA 2026 is the most current guideline (published May 2026). Focus areas for PG EM exams: severity classification, stepwise treatment, O2 targets, magnesium dosing, ketamine for RSI, permissive hypercapnia ventilation strategy, discharge criteria, and the new epinephrine-first rule for anaphylaxis+asthma. Biologics are increasingly tested in written and viva exams.
MAKE EXAM ORIENTED POSTGRADUATE EMERGENCY MEDICINE WITH TOPIC NAME APPROCH TO DYSPNEA IN ACUTE PRESENTATION IN EMERGENCY ROOM NEW GUIDLINE WITH RECENT ADVANCED AND TINTILATY REFEERENCE AND HARRISON INTERNAL MEDICINE REFERENCE
"dyspnea" AND "emergency department" AND "diagnosis"
acute dyspnea emergency department approach guidelines 2025 2026 diagnosis management
https://pmc.ncbi.nlm.nih.gov/articles/PMC12934415
"point of care ultrasound" AND "dyspnea" AND "emergency"
"Dyspnea is a subjective experience of breathing discomfort that consists of qualitatively distinct sensations that vary in intensity. The experience derives from interactions among multiple physiological, psychological, social, and environmental factors and may induce secondary physiological and behavioral responses." -- American Thoracic Society Consensus Statement, as cited in Harrison's 22E
Exam tip: "Efferent-reafferent mismatch" = the single most important mechanism for the most severe dyspnea. Appears in Harrison's 22E viva questions.
| Symptom Descriptor | Likely Pathology |
|---|---|
| Chest tightness | Asthma, bronchoconstriction, myocardial ischemia |
| Air hunger / cannot get enough air | CHF, pulmonary edema, severe airflow obstruction |
| Cannot take a deep breath | Dynamic hyperinflation (COPD), pleural effusion |
| Increased work of breathing | Pneumonia, pulmonary edema, pleural disease |
| Orthopnea (worse lying flat) | CHF, diaphragmatic weakness, obesity hypoventilation, GERD-triggered asthma |
| Paroxysmal nocturnal dyspnea | CHF, asthma |
| Platypnea (worse upright, better supine) | Hepatopulmonary syndrome, left atrial myxoma, ASD |
| Acute episodic dyspnea | PE, myocardial ischemia, bronchospasm |
| Progressive exertional dyspnea | COPD, ILD, CHF, pulmonary hypertension |
| System | Life-Threatening Cause | Key Feature |
|---|---|---|
| C - Cardiac | Acute Pulmonary Edema (ADHF), ACS, Cardiac Tamponade | BNP/NT-proBNP, ECG, echo |
| A - Airway/Pulmonary | Tension Pneumothorax, Severe Asthma, Status Asthmaticus | Absent breath sounds, tracheal deviation |
| R - Respiratory | Massive PE, ARDS, Severe Pneumonia | D-dimer, Wells, CTPA |
| D - Distributive | Sepsis with pulmonary involvement, Anaphylaxis | Shock parameters, history |
| S - Structural/Other | Aortic Dissection with hemothorax, Flail Chest | CXR widening, trauma history |
| Vital Sign | Finding | Interpretation |
|---|---|---|
| SpO2 | <90% | Severe hypoxia; immediate intervention |
| RR | >30/min | Severe distress; impending failure |
| HR | Tachycardia | Multiple causes; bradycardia in pre-arrest/tamponade |
| BP | Hypertension | ADHF trigger (hypertensive pulmonary edema) |
| BP | Hypotension | Tension PTX, massive PE, tamponade, sepsis, severe asthma |
| Temp | Fever | Pneumonia, myocarditis, sepsis |
| Pulsus paradoxus >10 mmHg | Severe asthma, tamponade | |
| Pulsus paradoxus >25 mmHg | Severe obstruction or tamponade |
| Finding | Consider |
|---|---|
| Bilateral crackles (fine, basal) | Pulmonary edema (ADHF) |
| Bilateral crackles (coarse, diffuse) | Pneumonia, ARDS |
| Expiratory wheeze (diffuse) | Asthma, COPD, cardiac asthma |
| Unilateral wheeze | Foreign body, tumor, endobronchial disease |
| Absent/reduced breath sounds | Pneumothorax, effusion, complete consolidation |
| Pleural rub | Pleuritis, PE with infarct, pneumonia |
| Biomarker | Role | Thresholds |
|---|---|---|
| BNP | Differentiates cardiac vs. non-cardiac dyspnea | BNP <100 pg/mL: NPV 90% for CHF; BNP >500: strongly supports CHF |
| NT-proBNP | Same purpose; higher values | NT-proBNP <300 pg/mL: rules out CHF; >900 (age <50), >1800 (50-75), >1800 (>75): supports CHF |
| Troponin (hs-cTnI/T) | ACS, myocarditis, RV strain in PE | 0h/1h or 0h/2h rule-in/rule-out protocols |
| D-dimer | PE rule-out in low-intermediate probability | Age-adjusted D-dimer (age × 10 µg/L if >50 years) |
| Lactate | Sepsis, shock | >2 mmol/L: elevated; >4 mmol/L: septic shock threshold |
| CRP/Procalcitonin | SFMU/FICS 2026: Insufficient evidence to recommend for antibiotic guidance in acute dyspnea with suspected LRTI | No recommendation |
Exam Alert - SFMU/FICS 2026: There is insufficient evidence to recommend CRP or procalcitonin to guide antibiotic initiation in acute dyspnea with suspected lower respiratory tract infection.
| Finding | Interpretation |
|---|---|
| A-lines (horizontal, regular artifacts) | Normal lung / asthma / COPD (dry lung) |
| B-lines (vertical, comet-tail, ≥3 per zone) | Pulmonary edema, interstitial syndrome (wet lung) |
| Absent lung sliding | Pneumothorax |
| Lung point (pathognomonic) | Pneumothorax - definitive sign |
| Consolidation (hepatization) | Pneumonia |
| Pleural effusion | Anechoic space above diaphragm |
| IVC collapse >50% | Volume depletion, obstructive shock |
| IVC distension | Right heart strain (massive PE, tamponade, tension PTX) |
If ALL 8 absent in LOW pre-test probability patient → PE excluded. No D-dimer needed.
| Criterion | Points |
|---|---|
| Clinical signs of DVT | 3 |
| PE most likely diagnosis | 3 |
| HR >100 | 1.5 |
| Immobilization/surgery <4 weeks | 1.5 |
| Prior DVT/PE | 1.5 |
| Hemoptysis | 1 |
| Active malignancy | 1 |
ACUTE DYSPNEA ARRIVES IN ED
↓
IMMEDIATE: ABC → SpO2, IV access, monitor
↓
IS PATIENT IN IMMEDIATE DANGER?
- SpO2 <90%, altered consciousness, impending arrest
↓ YES ↓ NO
Airway management Focused assessment
RSI if needed History + Exam
(Ketamine preferred CXR, ECG, SpO2
if bronchospasm) Blood tests
↓ ↓
POCUS (BLUE Protocol)
↓
A-lines? B-lines? Effusion? No lung sliding?
Asthma/COPD CHF/edema PTX/effusion Pneumothorax
↓
Biomarkers: BNP/NT-proBNP, troponin, D-dimer, lactate
↓
DIAGNOSE AND TREAT
| Modality | Indication | Notes |
|---|---|---|
| Standard nasal cannula | Mild hypoxia, SpO2 90-94% | Up to 6 L/min |
| Simple face mask | SpO2 <90%, needs higher FiO2 | 6-10 L/min, FiO2 ~40-60% |
| Non-rebreather mask | SpO2 <90%, needs FiO2 ~80-100% | 10-15 L/min |
| High-Flow Nasal Cannula (HFNC) | Moderate-severe hypoxic resp failure, post-extubation | Up to 60 L/min flow, FiO2 100%; generates ~2 cmH2O PEEP per 10 L/min |
| CPAP | Cardiogenic pulmonary edema, OSA | Reduces work of breathing; no expiratory pressure support |
| BiPAP/NIV | COPD exacerbation, CHF, mild-mod hypercapnia; status asthmaticus | Inspiratory + expiratory pressure support; reduces intubation rates |
| Endotracheal intubation + MV | Failure of above; GCS <8; impending arrest | RSI; ketamine preferred in bronchospasm |
SFMU/FICS 2026 (prehospital): NIV in prehospital setting is supported by evidence for COPD + CHF; HFNC emerging in prehospital context.
| Grade | Description |
|---|---|
| 0 | No breathlessness except with strenuous exercise |
| 1 | Breathless hurrying on level ground or walking up a slight hill |
| 2 | Walks slower than peers on level ground, or stops to rest at own pace |
| 3 | Stops to rest after 100 m or after a few minutes on level ground |
| 4 | Too breathless to leave the house, or breathless with ADLs |
CPET is the definitive tool for unexplained dyspnea when basic workup is non-diagnostic.
| Source | What it Covers |
|---|---|
| Harrison's Principles of Internal Medicine 22E (2025) - Ch. 39 | Definition, mechanisms, mMRC scale, differential diagnosis, history, physical exam, CPET, treatment |
| Tintinalli's Emergency Medicine - Ch. 53, 59, 25 | ADHF, asthma/COPD, POCUS (B-lines, lung sliding), opioids for dyspnea (palliative), IVDU-related dyspnea |
| SFMU/FICS Guideline 2026 - Ann Intensive Care 2026 Jan | RR measurement (≥30 sec), continuous vital sign monitoring, CRP/PCT insufficient evidence in LRTI, numerical dyspnea scale recommendation |
| AHA/ACC/ACEP 2026 PE Guideline - Circulation 2026 | Risk-stratified management, ED discharge for low-risk PE, PERT teams, post-PE dyspnea follow-up |
| Taheri et al., Eur J Emerg Med 2025 (PMID 39630617) | POCUS meta-analysis in prehospital non-trauma acute dyspnea |
| Russell et al., Am J Emerg Med 2024 (PMID 38522242) | Prehospital lung US for ADHF - diagnostic accuracy systematic review |
| Jeffers et al., J Emerg Med 2025 (PMID 40845678) | POCUS utility for pulmonary edema systematic review |
| Santus et al., Intern Emerg Med 2023 (PMID 37266791) | Acute dyspnea in ED - comprehensive clinical review |
Exam Strategy: In PG EM exams, acute dyspnea questions test: (1) identifying the life-threatening cause first (tension PTX, massive PE, flash pulmonary edema, tamponade), (2) correct use of POCUS BLUE protocol and biomarkers, (3) knowing cutoffs for BNP/D-dimer/PERC, (4) mechanism questions from Harrison's (efferent-reafferent mismatch), and (5) ventilation strategy selection (HFNC vs BiPAP vs ETI). Descriptors like "platypnea" and "air hunger" are classic differentiating MCQ targets from Harrison's 22E.
Generate a presentation (PPT) on acute dyspnea diagnostic algorithms for teaching
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "created"
mkdir -p /tmp/workspace/acute-dyspnea-ppt && echo "dir ready"
~/acute-dyspnea-ppt/build_ppt.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
from io import BytesIO
# ─── Colour Palette ───────────────────────────────────────────
DARK_BLUE = RGBColor(0x0A, 0x29, 0x5C) # navy header
MED_BLUE = RGBColor(0x1A, 0x5E, 0xA8) # accent
LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) # light bg
TEAL = RGBColor(0x00, 0x7A, 0x87) # teal accent
GREEN = RGBColor(0x1B, 0x7A, 0x3D) # positive / safe
RED = RGBColor(0xC0, 0x39, 0x2B) # danger / urgent
ORANGE = RGBColor(0xD3, 0x6B, 0x0B) # warning
YELLOW_BG = RGBColor(0xFF, 0xF3, 0xCD) # highlight bg
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_GRAY = RGBColor(0x2D, 0x2D, 0x2D)
MID_GRAY = RGBColor(0x60, 0x60, 0x60)
LIGHT_GRAY = RGBColor(0xF2, 0xF2, 0xF2)
LIME = RGBColor(0x27, 0xAE, 0x60)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6] # fully blank
# ─── Helper Functions ─────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_color, line_color=None, line_width=Pt(0), radius=False):
shape_type = MSO_SHAPE.ROUNDED_RECTANGLE if radius else MSO_SHAPE.RECTANGLE
shp = slide.shapes.add_shape(shape_type, Inches(x), Inches(y), Inches(w), Inches(h))
shp.fill.solid()
shp.fill.fore_color.rgb = fill_color
if line_color:
shp.line.color.rgb = line_color
shp.line.width = line_width
else:
shp.line.fill.background()
shp.shadow.inherit = False
return shp
def add_textbox(slide, x, y, w, h, text, font_size=18, bold=False, color=DARK_GRAY,
align=PP_ALIGN.LEFT, italic=False, word_wrap=True):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = word_wrap
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.size = Pt(font_size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
r.font.name = "Calibri"
return tb
def add_shape_text(shp, text, font_size=14, bold=False, color=WHITE, align=PP_ALIGN.CENTER):
tf = shp.text_frame
tf.word_wrap = True
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.size = Pt(font_size)
r.font.bold = bold
r.font.color.rgb = color
r.font.name = "Calibri"
def add_connector(slide, x1, y1, x2, y2, color=DARK_GRAY, width=Pt(2)):
ln = slide.shapes.add_connector(
MSO_CONNECTOR.STRAIGHT,
Inches(x1), Inches(y1), Inches(x2), Inches(y2))
ln.line.color.rgb = color
ln.line.width = width
def slide_header(slide, title, subtitle=None):
# Top bar
shp = add_rect(slide, 0, 0, 13.333, 0.8, DARK_BLUE)
add_shape_text(shp, title, font_size=26, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
shp.text_frame.paragraphs[0].runs[0].font.size = Pt(26)
# left margin inside bar
shp.text_frame.margin_left = Pt(20)
if subtitle:
add_textbox(slide, 0.2, 0.82, 13, 0.32, subtitle, font_size=11,
color=MED_BLUE, bold=False, italic=True)
def bottom_bar(slide, note="Tintinalli's EM | Harrison's 22E (2025) | GINA 2026 | AHA/ACC 2026"):
shp = add_rect(slide, 0, 7.2, 13.333, 0.3, DARK_BLUE)
add_shape_text(shp, note, font_size=9, color=WHITE, align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════
# SLIDE 1 – Title
# ═══════════════════════════════════════════════════════════════
s1 = prs.slides.add_slide(blank)
add_rect(s1, 0, 0, 13.333, 7.5, DARK_BLUE)
# decorative accent bar
add_rect(s1, 0, 3.8, 13.333, 0.08, MED_BLUE)
add_rect(s1, 0, 3.88, 13.333, 0.04, TEAL)
add_textbox(s1, 0.6, 1.2, 12, 1.2,
"ACUTE DYSPNEA IN THE EMERGENCY ROOM",
font_size=38, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_textbox(s1, 0.6, 2.5, 12, 0.7,
"Diagnostic Algorithms | Assessment | Management",
font_size=20, color=LIGHT_BLUE, align=PP_ALIGN.CENTER, italic=True)
add_textbox(s1, 0.6, 4.1, 12, 0.55,
"Postgraduate Emergency Medicine Teaching Module",
font_size=16, color=WHITE, align=PP_ALIGN.CENTER)
add_textbox(s1, 0.6, 4.7, 12, 0.5,
"Based on: Tintinalli's EM | Harrison's Principles 22E (2025) | GINA 2026 | AHA/ACC 2026 PE Guidelines | SFMU/FICS 2026",
font_size=11, color=LIGHT_BLUE, align=PP_ALIGN.CENTER, italic=True)
add_textbox(s1, 0.6, 5.4, 12, 0.5,
"July 2026", font_size=13, color=LIGHT_BLUE, align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════
# SLIDE 2 – Definition & Epidemiology
# ═══════════════════════════════════════════════════════════════
s2 = prs.slides.add_slide(blank)
add_rect(s2, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s2, "DEFINITION & EPIDEMIOLOGY", "Harrison's Principles of Internal Medicine 22E (2025) – Chapter 39")
bottom_bar(s2)
# Definition box
shp_def = add_rect(s2, 0.3, 1.05, 8.2, 2.1, WHITE, MED_BLUE, Pt(2), radius=True)
add_textbox(s2, 0.5, 1.1, 8.0, 0.45, "DEFINITION (ATS Consensus — Harrison's 22E)", 13, True, MED_BLUE)
add_textbox(s2, 0.5, 1.55, 7.9, 1.5,
'"A subjective experience of breathing discomfort that consists of qualitatively distinct sensations that vary in intensity. '
'The experience derives from interactions among multiple physiological, psychological, social, and environmental factors."',
12, False, DARK_GRAY, PP_ALIGN.LEFT, italic=True)
# Key distinction box
shp_dis = add_rect(s2, 0.3, 3.25, 8.2, 1.35, YELLOW_BG, ORANGE, Pt(2), radius=True)
add_textbox(s2, 0.5, 3.3, 8.0, 0.4, "KEY DISTINCTION", 12, True, ORANGE)
add_textbox(s2, 0.5, 3.7, 8.0, 0.85,
"Dyspnea = SYMPTOM (patient self-reported only)\n"
"Tachypnea / accessory muscle use = SIGNS (measured by clinicians)",
12, False, DARK_GRAY)
# Epidemiology stats
epi_items = [
("3-4M", "ED visits/year\nfor dyspnea"),
("85%", "Cardiac + pulmonary\ncauses combined"),
("37%", "Prevalence in\nadults ≥70 yrs"),
("1/3", "Have multi-\nfactorial dyspnea"),
]
colors_epi = [MED_BLUE, TEAL, ORANGE, RED]
for i, (num, label) in enumerate(epi_items):
x = 8.75 + i * 1.15
shp_n = add_rect(s2, x, 1.1, 1.05, 0.65, colors_epi[i], radius=True)
add_shape_text(shp_n, num, 20, True, WHITE)
add_textbox(s2, x, 1.78, 1.1, 0.6, label, 9, False, MID_GRAY, PP_ALIGN.CENTER)
add_textbox(s2, 8.7, 1.0, 4.4, 0.35, "EPIDEMIOLOGY", 11, True, DARK_BLUE)
# Post-COVID note
shp_c = add_rect(s2, 8.7, 3.0, 4.4, 1.6, WHITE, MED_BLUE, Pt(1.5), radius=True)
add_textbox(s2, 8.8, 3.05, 4.2, 0.4, "NEW — Post-COVID Dyspnea", 11, True, MED_BLUE)
add_textbox(s2, 8.8, 3.45, 4.2, 1.0,
"Increasing recognition of persistent dyspnea in post-COVID syndrome (Ch. 205, Harrison's 22E). Often multifactorial.",
10, False, DARK_GRAY)
# ═══════════════════════════════════════════════════════════════
# SLIDE 3 – Mechanisms
# ═══════════════════════════════════════════════════════════════
s3 = prs.slides.add_slide(blank)
add_rect(s3, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s3, "MECHANISMS OF DYSPNEA", "Harrison's 22E — Chapter 39, Fig. 39-1")
bottom_bar(s3)
mech_blocks = [
(0.3, 1.15, 3.8, 4.9, LIGHT_BLUE, MED_BLUE, "AFFERENT SIGNALS → CNS",
"• Peripheral chemoreceptors (carotid body, aortic arch)\n"
" → Hypoxemia, Hypercapnia, Acidemia\n"
" → 'Air hunger' sensation\n\n"
"• Central chemoreceptors (medulla)\n"
" → Same triggers as above\n\n"
"• Mechanoreceptors (lungs, chest wall)\n"
" → Stretch receptors, irritant receptors, J receptors\n"
" → 'Chest tightness' (asthma/COPD)\n"
" → Muscle spindles / tendon organs"),
(4.4, 1.15, 3.8, 4.9, WHITE, TEAL, "EFFERENT SIGNALS: CNS → Muscles",
"• Increased motor output from CNS\n"
" to overcome obstruction / stiffness\n\n"
"• Occurs when airway resistance ↑\n"
" or lung/chest wall compliance ↓\n\n"
"• The brain commands muscles to\n"
" work harder\n\n"
"• Perceived as increased work of\n breathing"),
(8.5, 1.15, 4.5, 4.9, WHITE, RED, "EFFERENT-REAFFERENT MISMATCH",
"= Most intense dyspnea\n\n"
"When CNS motor commands do NOT\n"
"match the mechanical response:\n\n"
"• Neuromuscular disease\n"
"• Severe airway obstruction\n"
"• Dynamic hyperinflation\n"
"• Diaphragmatic weakness\n\n"
"Also called:\n"
"'Neuromechanical dissociation'\n\n"
"★ High-yield Harrison's 22E viva topic"),
]
for bx, by, bw, bh, bg, bc, title_text, body_text in mech_blocks:
shp = add_rect(s3, bx, by, bw, bh, bg, bc, Pt(2), radius=True)
add_textbox(s3, bx+0.1, by+0.05, bw-0.2, 0.4, title_text, 12, True, bc)
add_textbox(s3, bx+0.1, by+0.5, bw-0.2, bh-0.55, body_text, 11, False, DARK_GRAY)
# Arrow between boxes
add_connector(s3, 4.2, 3.6, 4.4, 3.6, MED_BLUE, Pt(2.5))
add_connector(s3, 8.3, 3.6, 8.5, 3.6, TEAL, Pt(2.5))
add_textbox(s3, 0.3, 6.15, 13.0, 0.4,
"Key Exam Point: Efferent-reafferent mismatch = single most important mechanism for most severe dyspnea (Harrison's 22E)",
11, True, RED, PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════
# SLIDE 4 – Qualitative Descriptors
# ═══════════════════════════════════════════════════════════════
s4 = prs.slides.add_slide(blank)
add_rect(s4, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s4, "QUALITATIVE DESCRIPTORS → DIAGNOSTIC CLUES", "Harrison's 22E — History-taking in dyspnea")
bottom_bar(s4)
descriptors = [
("Chest tightness", "Asthma, COPD, Myocardial ischemia"),
("Air hunger / cannot\nget enough air", "CHF, Pulmonary edema, Severe airflow obstruction"),
("Cannot take a\ndeep breath", "Dynamic hyperinflation (COPD), Pleural effusion, Anxiety"),
("Orthopnea\n(worse lying flat)", "CHF, Diaphragmatic weakness, Obesity, GERD-asthma"),
("Paroxysmal nocturnal\ndyspnea (PND)", "CHF, Asthma (nocturnal trigger)"),
("Platypnea\n(worse UPRIGHT)", "Hepatopulmonary syndrome, Left atrial myxoma, ASD"),
("Acute episodic\ndyspnea", "PE, Myocardial ischemia, Bronchospasm, Arrhythmia"),
("Progressive exertional\ndyspnea", "COPD, ILD, CHF, Pulmonary hypertension"),
("Trepopnea\n(lateral position)", "Pleural effusion, Unilateral lung disease"),
]
cols = 3
rows_per_col = 3
for idx, (desc, cause) in enumerate(descriptors):
col = idx % cols
row = idx // cols
x = 0.25 + col * 4.37
y = 1.1 + row * 2.0
shp_box = add_rect(s4, x, y, 4.2, 1.75, WHITE, MED_BLUE, Pt(1.5), radius=True)
add_textbox(s4, x+0.1, y+0.05, 4.0, 0.55, desc, 12, True, MED_BLUE)
add_textbox(s4, x+0.1, y+0.6, 4.0, 1.05, cause, 11, False, DARK_GRAY)
add_textbox(s4, 0.3, 7.0, 13.0, 0.18,
"★ EXAM CLASSIC: Platypnea (dyspnea WORSE sitting up) → Hepatopulmonary syndrome / Left atrial myxoma / ASD",
10, True, RED, PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════
# SLIDE 5 – Differential Diagnosis
# ═══════════════════════════════════════════════════════════════
s5 = prs.slides.add_slide(blank)
add_rect(s5, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s5, "DIFFERENTIAL DIAGNOSIS — ACUTE DYSPNEA IN ED", "Harrison's 22E Table 34-3 | Tintinalli's EM")
bottom_bar(s5)
# "CARDS" framework header
shp_cards = add_rect(s5, 0.25, 0.9, 12.8, 0.5, MED_BLUE, radius=True)
add_shape_text(shp_cards, "LIFE-THREATENING CAUSES — 'CARDS' Framework (Must Not Miss)", 14, True, WHITE)
cards_items = [
("C – Cardiac", "Acute pulmonary edema (ADHF)\nACS / STEMI\nCardiac tamponade\nMalignant arrhythmia", RED),
("A – Airway", "Tension pneumothorax\nSevere asthma / Status asthmaticus\nUpper airway obstruction\nAnaphylaxis", ORANGE),
("R – Respiratory", "Massive PE\nARDS\nSevere pneumonia / Sepsis", MED_BLUE),
("D – Distributive", "Septic shock\nAnaphylactic shock\nNeurogenicc shock", TEAL),
("S – Structural", "Aortic dissection + hemothorax\nFlail chest\nMassive pleural effusion", GREEN),
]
for i, (title_c, body_c, col) in enumerate(cards_items):
x = 0.25 + i * 2.57
shp_c = add_rect(s5, x, 1.5, 2.45, 3.2, WHITE, col, Pt(2), radius=True)
add_textbox(s5, x+0.1, 1.55, 2.3, 0.45, title_c, 12, True, col)
add_textbox(s5, x+0.1, 2.0, 2.3, 2.6, body_c, 10.5, False, DARK_GRAY)
# Additional causes
add_textbox(s5, 0.25, 4.82, 13.0, 0.35, "ADDITIONAL CAUSES (Harrison's 22E)", 12, True, DARK_BLUE)
additional = [
"Metabolic/Toxic: DKA, Metabolic acidosis, CO poisoning, Salicylate toxicity, Severe anemia",
"Neuromuscular: Guillain-Barré, Myasthenic crisis, Diaphragm paralysis",
"Other: COPD exacerbation, Pleural effusion (large), ILD exacerbation, Anxiety/Panic (diagnosis of exclusion)",
]
for i, line in enumerate(additional):
y = 5.2 + i * 0.48
bg = LIGHT_BLUE if i % 2 == 0 else WHITE
shp_add = add_rect(s5, 0.25, y, 12.8, 0.42, bg, radius=False)
add_textbox(s5, 0.4, y+0.03, 12.5, 0.38, line, 10.5, False, DARK_GRAY)
# ═══════════════════════════════════════════════════════════════
# SLIDE 6 – Initial Assessment (ABCDE + Vitals)
# ═══════════════════════════════════════════════════════════════
s6 = prs.slides.add_slide(blank)
add_rect(s6, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s6, "INITIAL ASSESSMENT IN THE ED", "SFMU/FICS Guidelines 2026 (Ann Intensive Care) | Tintinalli's EM")
bottom_bar(s6)
# ABCDE
abcde = [
("A – AIRWAY", "Stridor (inspiratory=supraglottic; expiratory=infraglottic)\nTripod/sniffing position → epiglottitis\nAble to speak? (sentences/phrases/words/silent)"),
("B – BREATHING", "RR ≥30 = severe | Measure ≥30 sec (SFMU/FICS 2026)\nSymmetric expansion? | Silent chest = life-threatening\nAccessory muscles | Tracheal deviation (tension PTX)"),
("C – CIRCULATION", "Pulsus paradoxus: >10 mmHg = significant; >25 = severe\nJVP raised: ADHF / tamponade / massive PE / tension PTX\nS3 gallop = elevated LVEDP (ADHF)"),
("D – DISABILITY", "GCS / AVPU: altered consciousness + dyspnea = EMERGENCY\nAxiety/agitation: severe distress, consider hypoxia"),
("E – EXPOSURE", "Leg swelling (DVT-PE, CHF) | Rashes (anaphylaxis)\nAbdomen: ascites, hepatomegaly | Peripheral oedema"),
]
for i, (ltr, body) in enumerate(abcde):
x = 0.25 if i < 3 else (0.25 + 4.4 * (i - 3))
y = 1.05 + (i % 3) * 2.05 if i < 3 else 1.05
if i >= 3:
y = 1.05
x = 0.25 + 4.4 * (i - 3)
shp_a = add_rect(s6, x, y, 4.2, 1.9, WHITE, MED_BLUE, Pt(2), radius=True)
add_textbox(s6, x+0.1, y+0.05, 4.0, 0.42, ltr, 13, True, MED_BLUE)
add_textbox(s6, x+0.1, y+0.5, 4.0, 1.3, body, 10, False, DARK_GRAY)
# Auscultation table on right
auscult_data = [
("Bilateral fine crackles (basal)", "Pulmonary oedema / ADHF", LIGHT_BLUE),
("Bilateral coarse crackles", "Pneumonia, ARDS", LIGHT_BLUE),
("Diffuse expiratory wheeze", "Asthma, COPD, Cardiac asthma", WHITE),
("Unilateral wheeze", "Foreign body, Tumour", WHITE),
("Absent breath sounds", "Pneumothorax, Effusion", LIGHT_BLUE),
("Pleural rub", "Pleuritis, PE with infarct", LIGHT_BLUE),
]
add_textbox(s6, 8.8, 1.05, 4.3, 0.38, "AUSCULTATION GUIDE", 12, True, DARK_BLUE)
for i, (find, interp, bg) in enumerate(auscult_data):
y = 1.45 + i * 0.6
shp_au = add_rect(s6, 8.8, y, 4.3, 0.55, bg, MID_GRAY, Pt(0.5))
add_textbox(s6, 8.85, y+0.03, 2.05, 0.48, find, 9, True, DARK_GRAY)
add_textbox(s6, 10.93, y+0.03, 2.1, 0.48, interp, 9, False, MID_GRAY)
add_textbox(s6, 0.25, 7.0, 13.0, 0.18,
"SFMU/FICS 2026: RR must be measured for ≥30 seconds. Continuous vital sign monitoring reduces morbidity/mortality.",
10, True, RED, PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════
# SLIDE 7 – Investigations
# ═══════════════════════════════════════════════════════════════
s7 = prs.slides.add_slide(blank)
add_rect(s7, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s7, "INVESTIGATIONS — STEPWISE APPROACH", "Tintinalli's EM | Harrison's 22E | SFMU/FICS 2026")
bottom_bar(s7)
# Immediate
shp_imm = add_rect(s7, 0.25, 0.9, 6.1, 2.65, WHITE, RED, Pt(2), radius=True)
add_textbox(s7, 0.35, 0.95, 5.9, 0.4, "IMMEDIATE — ALL ACUTE DYSPNEA", 12, True, RED)
imm_text = ("1. SpO2 — continuous pulse oximetry (mandatory)\n"
"2. 12-lead ECG — ACS, arrhythmia, RV strain (PE), LBBB (CHF)\n"
"3. CXR (portable) — effusion, cardiomegaly, PTX, consolidation, pulmonary oedema\n"
"4. ABG / VBG — oxygenation, ventilation, acid-base\n"
" • VBG: PaCO2 <40 mmHg reliably EXCLUDES hypercapnia\n"
" • ABG: if SpO2 <92% or concern for CO2 retention")
add_textbox(s7, 0.35, 1.38, 5.9, 2.1, imm_text, 10.5, False, DARK_GRAY)
# Biomarkers
shp_bio = add_rect(s7, 6.55, 0.9, 6.55, 2.65, WHITE, MED_BLUE, Pt(2), radius=True)
add_textbox(s7, 6.65, 0.95, 6.3, 0.4, "BIOMARKERS", 12, True, MED_BLUE)
bio_text = ("BNP <100 pg/mL → NPV 90% for CHF (rules out)\n"
"BNP >500 pg/mL → strongly supports CHF\n"
"NT-proBNP <300 → rules out CHF\n"
"NT-proBNP (age-stratified cutoffs: >900 if <50y, >1800 if 50-75y)\n"
"Troponin (hs-cTnI/T) → ACS, myocarditis, RV strain in PE\n"
"D-dimer → PE rule-out (use age-adjusted: age × 10 µg/L if >50y)\n"
"Lactate → Sepsis (>2 mmol/L elevated; >4 = septic shock)\n"
"★ CRP/PCT: INSUFFICIENT evidence to guide antibiotics in\n"
" acute dyspnea + suspected LRTI (SFMU/FICS 2026)")
add_textbox(s7, 6.65, 1.38, 6.3, 2.1, bio_text, 10.0, False, DARK_GRAY)
# POCUS BLUE Protocol
shp_pocus = add_rect(s7, 0.25, 3.65, 8.0, 3.25, WHITE, TEAL, Pt(2), radius=True)
add_textbox(s7, 0.35, 3.7, 7.8, 0.45, "POCUS — BLUE PROTOCOL (Bedside Lung Ultrasound in Emergency)", 12, True, TEAL)
blue_table = [
("A-lines (horizontal)", "Normal lung — dry lung", "Asthma / COPD", WHITE),
("B-lines ≥3/zone, bilateral", "Interstitial syndrome — WET lung", "ADHF / Pulmonary oedema", LIGHT_BLUE),
("Absent lung sliding", "Pneumothorax suspected", "Confirm with Lung Point", WHITE),
("Lung point (pathognomonic)", "Definitive pneumothorax sign", "Pneumothorax", LIGHT_BLUE),
("Consolidation (hepatization)", "Lung consolidation", "Pneumonia / Atelectasis", WHITE),
("Anechoic above diaphragm", "Pleural fluid", "Effusion / Haemothorax", LIGHT_BLUE),
]
for i, (find_b, meaning_b, dx_b, bg_b) in enumerate(blue_table):
y = 4.2 + i * 0.42
shp_bl = add_rect(s7, 0.3, y, 7.85, 0.38, bg_b, MID_GRAY, Pt(0.3))
add_textbox(s7, 0.35, y+0.02, 2.5, 0.33, find_b, 9, True, DARK_GRAY)
add_textbox(s7, 2.88, y+0.02, 2.7, 0.33, meaning_b, 9, False, MID_GRAY)
add_textbox(s7, 5.6, y+0.02, 2.5, 0.33, dx_b, 9, True, TEAL)
# Evidence column
shp_ev = add_rect(s7, 8.55, 3.65, 4.55, 3.25, WHITE, ORANGE, Pt(2), radius=True)
add_textbox(s7, 8.65, 3.7, 4.3, 0.4, "RECENT EVIDENCE", 12, True, ORANGE)
ev_text = ("Taheri et al., Eur J Emerg Med 2025\n"
"POCUS in prehospital non-trauma dyspnea\n"
"→ improves diagnostic accuracy (Meta-analysis)\n\n"
"Russell et al., Am J Emerg Med 2024\n"
"Prehospital lung US for ADHF\n"
"→ High diagnostic accuracy (Systematic review)\n\n"
"Jeffers et al., J Emerg Med 2025\n"
"POCUS for pulmonary oedema\n"
"→ High sensitivity & specificity (SR)")
add_textbox(s7, 8.65, 4.15, 4.3, 2.6, ev_text, 9.5, False, DARK_GRAY)
# ═══════════════════════════════════════════════════════════════
# SLIDE 8 – Clinical Decision Tools (PERC + Wells + BNP)
# ═══════════════════════════════════════════════════════════════
s8 = prs.slides.add_slide(blank)
add_rect(s8, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s8, "CLINICAL DECISION TOOLS", "PERC Rule | Wells Score | BNP/NT-proBNP | Framingham")
bottom_bar(s8)
# PERC
shp_perc = add_rect(s8, 0.25, 0.9, 4.2, 5.1, WHITE, RED, Pt(2), radius=True)
add_textbox(s8, 0.35, 0.95, 4.0, 0.42, "PERC RULE — PE Rule-Out", 12, True, RED)
add_textbox(s8, 0.35, 1.37, 4.0, 0.32, "(All 8 absent in LOW pre-test probability = exclude PE)", 9, True, MID_GRAY)
perc_criteria = [
"1. Age < 50 years",
"2. HR < 100 bpm",
"3. SpO2 ≥ 95%",
"4. No unilateral leg swelling",
"5. No haemoptysis",
"6. No recent surgery/trauma",
"7. No prior PE/DVT",
"8. No exogenous oestrogen",
]
for i, crit in enumerate(perc_criteria):
y = 1.75 + i * 0.47
bg_p = LIGHT_BLUE if i % 2 == 0 else WHITE
shp_pc = add_rect(s8, 0.3, y, 4.1, 0.43, bg_p)
add_textbox(s8, 0.38, y+0.04, 3.9, 0.35, crit, 10.5, False, DARK_GRAY)
shp_perc_note = add_rect(s8, 0.3, 5.55, 4.1, 0.4, LIME, radius=True)
add_shape_text(shp_perc_note, "All 8 absent → PE excluded. No D-dimer needed!", 10, True, WHITE)
# Wells
shp_wells = add_rect(s8, 4.65, 0.9, 4.3, 5.1, WHITE, ORANGE, Pt(2), radius=True)
add_textbox(s8, 4.75, 0.95, 4.1, 0.42, "WELLS SCORE — PE Probability", 12, True, ORANGE)
wells_criteria = [
("Clinical DVT signs", "3 pts"),
("PE most likely Dx", "3 pts"),
("HR > 100 bpm", "1.5 pts"),
("Immobility/surgery <4wks", "1.5 pts"),
("Prior DVT/PE", "1.5 pts"),
("Haemoptysis", "1 pt"),
("Active malignancy", "1 pt"),
]
for i, (crit_w, pts_w) in enumerate(wells_criteria):
y = 1.42 + i * 0.52
bg_w = LIGHT_BLUE if i % 2 == 0 else WHITE
shp_wc = add_rect(s8, 4.7, y, 4.2, 0.48, bg_w)
add_textbox(s8, 4.78, y+0.06, 2.9, 0.36, crit_w, 10, False, DARK_GRAY)
add_textbox(s8, 7.7, y+0.06, 1.1, 0.36, pts_w, 10, True, ORANGE, PP_ALIGN.RIGHT)
shp_wells_score = add_rect(s8, 4.7, 5.07, 4.2, 0.85, YELLOW_BG, ORANGE, Pt(1.5), radius=True)
add_textbox(s8, 4.78, 5.12, 4.0, 0.75,
"Score ≤4 + D-dimer negative → PE excluded\n"
"Score >4 → CTPA required\n"
"Age-adjusted D-dimer: age × 10 µg/L (if age >50)",
9.5, False, DARK_GRAY)
# BNP + Framingham
shp_bnp = add_rect(s8, 9.2, 0.9, 3.9, 2.6, WHITE, MED_BLUE, Pt(2), radius=True)
add_textbox(s8, 9.3, 0.95, 3.7, 0.42, "BNP / NT-proBNP (CHF vs non-cardiac)", 11, True, MED_BLUE)
bnp_text = ("BNP <100 pg/mL → NPV 90% (rules OUT CHF)\n"
"BNP >500 pg/mL → strongly supports CHF\n"
"NT-proBNP <300 → rules out CHF\n"
"NT-proBNP cutoffs by age:\n"
" <50y: >900 | 50-75y: >1800 | >75y: >1800")
add_textbox(s8, 9.3, 1.4, 3.7, 2.0, bnp_text, 10, False, DARK_GRAY)
shp_fram = add_rect(s8, 9.2, 3.6, 3.9, 2.3, WHITE, TEAL, Pt(2), radius=True)
add_textbox(s8, 9.3, 3.65, 3.7, 0.42, "FRAMINGHAM CRITERIA (CHF Diagnosis)", 11, True, TEAL)
fram_text = ("Major: PND, orthopnoea, raised JVP, crackles,\nS3 gallop, cardiomegaly, acute pulmonary oedema\n\n"
"Minor: Ankle oedema, nocturnal cough, DOE,\nhepatomegaly, pleural effusion, tachycardia\n\n"
"Diagnosis: 2 Major OR 1 Major + 2 Minor")
add_textbox(s8, 9.3, 4.1, 3.7, 1.75, fram_text, 9.5, False, DARK_GRAY)
# ═══════════════════════════════════════════════════════════════
# SLIDE 9 – Master Diagnostic Algorithm
# ═══════════════════════════════════════════════════════════════
s9 = prs.slides.add_slide(blank)
add_rect(s9, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s9, "MASTER DIAGNOSTIC ALGORITHM — ACUTE DYSPNEA IN ED", "Tintinalli's EM | Harrison's 22E | SFMU/FICS 2026")
bottom_bar(s9)
# Flowchart boxes
def flow_box(slide, x, y, w, h, text, bg, text_color=WHITE, font_size=11, bold=True, line_color=None):
lc = line_color if line_color else bg
shp = add_rect(slide, x, y, w, h, bg, lc, Pt(1.5), radius=True)
add_shape_text(shp, text, font_size, bold, text_color, PP_ALIGN.CENTER)
return shp
# Row 1 - Entry
flow_box(s9, 4.9, 0.92, 3.5, 0.55, "PATIENT ARRIVES WITH ACUTE DYSPNEA", DARK_BLUE, WHITE, 12, True)
# Arrow down
add_connector(s9, 6.67, 1.47, 6.67, 1.78, DARK_GRAY, Pt(2))
# Row 2 - Immediate
flow_box(s9, 3.8, 1.78, 5.7, 0.55, "IMMEDIATE: SpO2 + IV access + Monitor + O2 if SpO2 <92%", MED_BLUE, WHITE, 11, True)
add_connector(s9, 6.67, 2.33, 6.67, 2.63, DARK_GRAY, Pt(2))
# Row 3 - Is patient in danger?
shp_danger = flow_box(s9, 4.3, 2.63, 4.7, 0.55, "Is patient in IMMEDIATE DANGER?", RED, WHITE, 12, True)
# YES branch
add_connector(s9, 4.3, 2.9, 2.8, 2.9, RED, Pt(2))
add_connector(s9, 2.8, 2.9, 2.8, 3.35, RED, Pt(2))
flow_box(s9, 1.05, 3.35, 3.4, 0.95,
"YES: Immediate Action\n• Airway: RSI if needed (Ketamine)\n• O2 / NIV / HFNC\n• POCUS + ECG simultaneously",
RED, WHITE, 9.5, False)
# NO branch
add_connector(s9, 9.0, 2.9, 10.5, 2.9, GREEN, Pt(2))
add_connector(s9, 10.5, 2.9, 10.5, 3.35, GREEN, Pt(2))
flow_box(s9, 9.2, 3.35, 2.8, 0.95,
"NO: Focused assessment\n• History (onset, character)\n• Physical examination\n• Serial vital signs",
GREEN, WHITE, 9.5, False)
# YES/NO labels
add_textbox(s9, 2.5, 2.62, 0.7, 0.28, "YES", 10, True, RED, PP_ALIGN.CENTER)
add_textbox(s9, 9.05, 2.62, 0.7, 0.28, "NO", 10, True, GREEN, PP_ALIGN.CENTER)
add_connector(s9, 6.67, 3.18, 6.67, 3.55, DARK_GRAY, Pt(2))
# Row 4 - POCUS
flow_box(s9, 4.8, 3.55, 3.7, 0.5, "POCUS — BLUE Protocol", TEAL, WHITE, 12, True)
add_connector(s9, 6.67, 4.05, 6.67, 4.25, DARK_GRAY, Pt(2))
# Row 5 - POCUS branches (4 boxes)
pocus_results = [
(0.25, "A-lines\n(Asthma/COPD)", MED_BLUE),
(3.5, "B-lines\n(ADHF/Oedema)", RED),
(6.75, "No lung sliding\n(Pneumothorax)", ORANGE),
(10.0, "Consolidation\n(Pneumonia)", GREEN),
]
for (x_p, txt_p, col_p) in pocus_results:
add_connector(s9, x_p + 1.4, 4.25, x_p + 1.4, 4.45, col_p, Pt(1.5))
flow_box(s9, x_p, 4.45, 2.8, 0.7, txt_p, col_p, WHITE, 10, True)
add_connector(s9, 6.67, 4.25, 1.65, 4.25, DARK_GRAY, Pt(1.5))
add_connector(s9, 6.67, 4.25, 11.4, 4.25, DARK_GRAY, Pt(1.5))
add_connector(s9, 4.9, 4.25, 4.9, 4.45, DARK_GRAY, Pt(1.5))
add_connector(s9, 8.45, 4.25, 8.45, 4.45, DARK_GRAY, Pt(1.5))
# Row 6 - Biomarkers
add_connector(s9, 6.67, 5.15, 6.67, 5.35, DARK_GRAY, Pt(2))
flow_box(s9, 2.5, 5.35, 8.3, 0.52,
"BIOMARKERS: BNP/NT-proBNP | Troponin | D-dimer (age-adjusted) | Lactate | Full blood count | Metabolic panel",
DARK_BLUE, WHITE, 10.5, True)
add_connector(s9, 6.67, 5.87, 6.67, 6.07, DARK_GRAY, Pt(2))
flow_box(s9, 3.5, 6.07, 6.3, 0.5,
"DIAGNOSE & TREAT — Admit / Discharge / ICU based on severity",
DARK_BLUE, WHITE, 11, True)
# ═══════════════════════════════════════════════════════════════
# SLIDE 10 – Oxygenation Strategies
# ═══════════════════════════════════════════════════════════════
s10 = prs.slides.add_slide(blank)
add_rect(s10, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s10, "OXYGENATION & VENTILATION STRATEGIES", "GINA 2026 | SFMU/FICS 2026 | Tintinalli's EM")
bottom_bar(s10)
oxy_data = [
("Nasal Cannula", "Mild hypoxia\nSpO2 90-94%", "1-6 L/min\nFiO2 ~24-44%", MED_BLUE, "Standard first step"),
("Simple Face Mask", "SpO2 <90%\nNeeds higher FiO2", "6-10 L/min\nFiO2 ~40-60%", MED_BLUE, "Step up from NC"),
("Non-rebreather\nMask", "SpO2 <90%\nNeeds high FiO2", "10-15 L/min\nFiO2 ~80-100%", ORANGE, "Emergency hypoxia"),
("HFNC\n(High-Flow NC)", "Moderate-severe\nhypoxic resp. failure", "Up to 60 L/min\nFiO2 100%", TEAL, "~2 cmH2O PEEP per 10 L/min"),
("CPAP", "Cardiogenic\npulmonary oedema", "5-10 cmH2O\nFiO2 titrated", GREEN, "Reduces WOB; no expiratory support"),
("BiPAP / NIV", "COPD exacerbation\nCHF, mild-mod hypercapnia", "IPAP 12-20 / EPAP 4-8\nFiO2 titrated", GREEN, "Reduces intubation rates"),
("Endotracheal\nIntubation + MV", "Failure of above\nGCS <8 / impending arrest", "Ketamine (RSI)\nPermissive hypercapnia", RED, "Low TV 6-8 mL/kg | RR <10"),
]
headers = ["Modality", "Indication", "Settings / FiO2", "Notes"]
col_widths = [2.1, 2.6, 2.6, 2.5]
col_starts = [0.25, 2.4, 5.05, 7.7]
# header row
for j, (hdr, cw, cx) in enumerate(zip(headers, col_widths, col_starts)):
shp_hh = add_rect(s10, cx, 0.9, cw-0.05, 0.42, DARK_BLUE)
add_shape_text(shp_hh, hdr, 11, True, WHITE)
for i, (mod, ind, sett, col, note) in enumerate(oxy_data):
bg = LIGHT_BLUE if i % 2 == 0 else WHITE
row_y = 1.35 + i * 0.82
data_cells = [mod, ind, sett, note]
for j, (cell, cw, cx) in enumerate(zip(data_cells, col_widths, col_starts)):
shp_cell = add_rect(s10, cx, row_y, cw-0.05, 0.78, bg, MID_GRAY, Pt(0.3))
add_textbox(s10, cx+0.07, row_y+0.05, cw-0.15, 0.68, cell, 9.5, j==0, col if j==0 else DARK_GRAY)
add_textbox(s10, 10.3, 0.9, 2.85, 0.4, "KEY POINTS", 11, True, DARK_BLUE)
kp_items = [
"GINA 2026: O2 only if SpO2 <92%; target 92-95%",
"Avoid hyperoxia (drives ↑PaCO2 in COPD)",
"HFNC: generates 2 cmH2O PEEP per 10 L/min",
"NIV: reduces intubation in COPD/CHF",
"RSI drug of choice (bronchospasm): KETAMINE 1-2 mg/kg",
"Permissive hypercapnia in intubated asthmatic",
]
for i, kp in enumerate(kp_items):
shp_kp = add_rect(s10, 10.3, 1.35 + i * 0.95, 2.85, 0.85,
YELLOW_BG if i % 2 == 0 else WHITE,
ORANGE, Pt(1), radius=True)
add_textbox(s10, 10.38, 1.4 + i * 0.95, 2.68, 0.75, kp, 9, False, DARK_GRAY)
# ═══════════════════════════════════════════════════════════════
# SLIDE 11 – Specific Diagnoses Management
# ═══════════════════════════════════════════════════════════════
s11 = prs.slides.add_slide(blank)
add_rect(s11, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s11, "MANAGEMENT OF KEY DIAGNOSES", "Tintinalli's EM | Harrison's 22E | GINA 2026 | AHA/ACC 2026")
bottom_bar(s11)
dx_mgmt = [
("ADHF — Acute Decompensated HF", MED_BLUE,
"• IV furosemide 0.5-1 mg/kg\n"
"• IV/SL nitrates (preload + afterload ↓)\n"
"• CPAP/BiPAP (reduces intubation)\n"
"• BNP-guided therapy improves outcomes\n"
"• Avoid aggressive fluid in HFpEF"),
("Massive PE", RED,
"• UFH anticoagulation (preferred if thrombolysis candidate)\n"
"• Systemic thrombolysis: Alteplase 100 mg IV over 2 hrs\n"
"• Low-risk PE: discharge on DOAC (rivaroxaban/apixaban)\n"
"• AHA/ACC 2026: Activate PE Response Team (PERT)\n"
"• Catheter-directed therapy for sub-massive PE"),
("COPD Exacerbation", TEAL,
"• SABA + SAMA nebulisation\n"
"• Systemic steroids (prednisolone 30-40 mg)\n"
"• Controlled O2: target SpO2 88-92%\n"
"• BiPAP: first-line for moderate-severe (reduces intubation)\n"
"• Antibiotics if purulent sputum / CXR infiltrate"),
("Tension Pneumothorax", ORANGE,
"• DO NOT WAIT for CXR — clinical diagnosis\n"
"• Immediate needle decompression:\n"
" 2nd ICS, midclavicular line\n"
" OR 4th/5th ICS, anterior axillary line\n"
"• Followed by chest tube insertion"),
("Acute Asthma (GINA 2026)", GREEN,
"• Salbutamol 4-8 puffs/5 mg neb (every 20 min x3)\n"
"• Ipratropium 4 puffs with each SABA (first 3 doses)\n"
"• Systemic corticosteroids EARLY\n"
"• IV MgSO4 2g over 20 min (severe, PEF <25%)\n"
"• O2 only if SpO2 <92%; target 92-95%"),
("Anaphylaxis + Dyspnea", RED,
"• EPINEPHRINE FIRST (IM 0.3-0.5 mg)\n"
"• THEN bronchodilators (GINA 2026 NEW rule)\n"
"• Early airway management if angioedema progressing\n"
"• Antihistamines + steroids as adjuncts\n"
"• IV access + monitor continuously"),
]
for idx, (dx_title, col_dx, mgmt_text) in enumerate(dx_mgmt):
col_n = idx % 3
row_n = idx // 3
x_dx = 0.25 + col_n * 4.37
y_dx = 0.95 + row_n * 3.1
shp_dx = add_rect(s11, x_dx, y_dx, 4.2, 2.85, WHITE, col_dx, Pt(2), radius=True)
add_textbox(s11, x_dx+0.1, y_dx+0.05, 4.0, 0.42, dx_title, 11.5, True, col_dx)
add_textbox(s11, x_dx+0.1, y_dx+0.5, 4.0, 2.25, mgmt_text, 10, False, DARK_GRAY)
# ═══════════════════════════════════════════════════════════════
# SLIDE 12 – Disposition & High-Yield Points
# ═══════════════════════════════════════════════════════════════
s12 = prs.slides.add_slide(blank)
add_rect(s12, 0, 0, 13.333, 7.5, LIGHT_GRAY)
slide_header(s12, "DISPOSITION & HIGH-YIELD EXAM POINTS", "Tintinalli's EM | Harrison's 22E | GINA 2026 | SFMU/FICS 2026")
bottom_bar(s12)
# Disposition boxes
disp_data = [
("DISCHARGE (Low Risk)", GREEN,
"• SpO2 ≥95% on room air after treatment\n"
"• Symptoms resolved, cause identified and treated\n"
"• Reliable follow-up arranged\n"
"• No high-risk ECG changes or elevated troponin"),
("ADMIT (Ward)", ORANGE,
"• SpO2 <92% despite initial treatment\n"
"• Hemodynamic instability\n"
"• Persistently abnormal vital signs\n"
"• High-risk diagnoses requiring IV treatment"),
("ICU / HDU", RED,
"• Respiratory failure: NIV failing or intubated\n"
"• Hemodynamic compromise (shock)\n"
"• Rising PaCO2 + altered consciousness\n"
"• ARDS, massive PE, cardiac tamponade"),
]
for i, (disp_title, disp_col, disp_body) in enumerate(disp_data):
x_d = 0.25 + i * 4.37
shp_d = add_rect(s12, x_d, 0.9, 4.2, 2.5, WHITE, disp_col, Pt(2), radius=True)
add_textbox(s12, x_d+0.1, 0.95, 4.0, 0.45, disp_title, 12, True, disp_col)
add_textbox(s12, x_d+0.1, 1.44, 4.0, 1.9, disp_body, 10.5, False, DARK_GRAY)
# High yield exam points
shp_hy = add_rect(s12, 0.25, 3.55, 12.8, 0.42, DARK_BLUE, radius=True)
add_shape_text(shp_hy, "HIGH-YIELD EXAM POINTS", 14, True, WHITE)
hy_points = [
("Cardiac + pulmonary causes = 85% of all dyspnea (Harrison's 22E)", MED_BLUE),
("BNP <100 pg/mL → NPV 90% for CHF rule-out", GREEN),
("Platypnea = dyspnea WORSE sitting up → hepatopulmonary syndrome / left atrial myxoma / ASD", RED),
("Silent chest in asthma = life-threatening (no air movement, not 'improved')", RED),
("Normal PaCO2 during acute asthma attack = DANGER sign (patient fatiguing)", ORANGE),
("Pregnancy: PaCO2 40 mmHg = HYPERCARBIA (normal = 28-32 mmHg in pregnancy)", ORANGE),
("POCUS Lung point = pathognomonic for pneumothorax", TEAL),
("Efferent-reafferent mismatch = most intense dyspnea mechanism (Harrison's 22E viva)", MED_BLUE),
("SFMU/FICS 2026: CRP/PCT insufficient evidence to guide antibiotics in acute dyspnea + suspected LRTI", RED),
("GINA 2026: If anaphylaxis + asthma → epinephrine FIRST, then bronchodilator", ORANGE),
("PERC: all 8 absent in low-probability → no D-dimer, no CTPA needed", GREEN),
("RSI drug of choice in bronchospasm: KETAMINE 1-2 mg/kg IV", MED_BLUE),
]
cols_hy = 2
for i, (pt_txt, pt_col) in enumerate(hy_points):
col_h = i % cols_hy
row_h = i // cols_hy
x_h = 0.25 + col_h * 6.55
y_h = 4.04 + row_h * 0.49
bg_h = WHITE if row_h % 2 == 0 else LIGHT_BLUE
shp_h = add_rect(s12, x_h, y_h, 6.4, 0.44, bg_h, pt_col, Pt(1))
add_textbox(s12, x_h+0.1, y_h+0.04, 0.3, 0.36, "★", 11, True, pt_col, PP_ALIGN.CENTER)
add_textbox(s12, x_h+0.42, y_h+0.04, 5.8, 0.36, pt_txt, 9.5, False, DARK_GRAY)
# ═══════════════════════════════════════════════════════════════
# SLIDE 13 – References & Summary
# ═══════════════════════════════════════════════════════════════
s13 = prs.slides.add_slide(blank)
add_rect(s13, 0, 0, 13.333, 7.5, DARK_BLUE)
# accent
add_rect(s13, 0, 2.0, 13.333, 0.06, MED_BLUE)
add_textbox(s13, 0.5, 0.3, 12.3, 0.75,
"REFERENCES & SOURCES",
font_size=28, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
refs = [
("Harrison's Principles of Internal Medicine 22E (2025)", "Chapter 39 — Dyspnea: Definition, Mechanisms, Differential Diagnosis, Assessment, CPET, Treatment; mMRC Scale, Table 34-3"),
("Tintinalli's Emergency Medicine — A Comprehensive Study", "Chapters 53, 59 — ADHF, Asthma/COPD; POCUS (B-lines, lung sliding); Chapter 25 — Palliative dyspnea; Chapter 24 — IVDU dyspnea"),
("SFMU/FICS Guidelines 2026", "Ann Intensive Care 2026 Jan — Guidelines for Initial Assessment of Respiratory Distress in the ED; RR measurement, biomarker guidance"),
("GINA 2026 Strategy Report", "May 5, 2026 — Acute asthma management; O2 targets; anaphylaxis+asthma: epinephrine first rule; ICS-formoterol for mild exacerbation"),
("AHA/ACC/ACEP 2026 PE Guideline", "Circulation 2026 — Risk stratification, ED discharge for low-risk PE, PERT, post-PE dyspnea follow-up"),
("Taheri et al., Eur J Emerg Med 2025 (PMID 39630617)", "POCUS in prehospital non-trauma acute dyspnea — systematic review and meta-analysis"),
("Russell et al., Am J Emerg Med 2024 (PMID 38522242)", "Prehospital lung ultrasound for ADHF — systematic review/meta-analysis"),
("Jeffers et al., J Emerg Med 2025 (PMID 40845678)", "POCUS utility for pulmonary oedema — systematic review"),
("Santus et al., Intern Emerg Med 2023 (PMID 37266791)", "Acute dyspnea in the emergency department — comprehensive clinical review"),
]
for i, (title_r, desc_r) in enumerate(refs):
y_r = 2.18 + i * 0.55
bg_r = RGBColor(0x12, 0x37, 0x6B) if i % 2 == 0 else RGBColor(0x0A, 0x29, 0x5C)
shp_r = add_rect(s13, 0.25, y_r, 12.8, 0.5, bg_r, MED_BLUE, Pt(0.5))
add_textbox(s13, 0.35, y_r+0.04, 4.5, 0.42, title_r, 9.5, True, LIGHT_BLUE)
add_textbox(s13, 4.9, y_r+0.04, 8.0, 0.42, desc_r, 9, False, WHITE)
# ═══════════════════════════════════════════════════════════════
# SAVE
# ═══════════════════════════════════════════════════════════════
output_path = "/tmp/workspace/acute-dyspnea-ppt/Acute_Dyspnea_EM_Teaching.pptx"
buf = BytesIO()
prs.save(buf)
with open(output_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {output_path}")
print(f"Slides: {len(prs.slides)}")
cd /tmp/workspace/acute-dyspnea-ppt && python build_ppt.py 2>&1
ls -lh /tmp/workspace/acute-dyspnea-ppt/
Acute Dyspnea EM Teaching
Presentation · PPTX
| Slide | Title | Content |
|---|---|---|
| 1 | Title Slide | Dark navy design with source attribution |
| 2 | Definition & Epidemiology | ATS definition (Harrison's 22E), 4 stat cards (3-4M ED visits, 85% cardiopulmonary, etc.), post-COVID note |
| 3 | Mechanisms of Dyspnea | 3-column layout: Afferent signals / Efferent signals / Efferent-reafferent mismatch (Harrison's 22E viva classic) |
| 4 | Qualitative Descriptors | 9 descriptor cards: chest tightness → asthma; platypnea → hepatopulmonary syndrome; orthopnea → CHF, etc. |
| 5 | Differential Diagnosis | Full "CARDS" framework for life-threatening causes + additional causes table |
| 6 | Initial Assessment (ABCDE) | A-B-C-D-E boxes with auscultation guide; SFMU/FICS 2026 RR measurement rule |
| 7 | Investigations | Immediate workup, biomarker cutoffs (BNP/D-dimer/troponin/lactate), BLUE protocol POCUS table, recent evidence (2024-2025 meta-analyses) |
| 8 | Clinical Decision Tools | Full PERC rule, Wells score with cutoffs, BNP/NT-proBNP thresholds, Framingham criteria |
| 9 | Master Diagnostic Algorithm | Step-by-step flowchart: arrival → danger assessment → POCUS branches → biomarkers → diagnose & treat |
| 10 | Oxygenation Strategies | 7-row table: NC → NRB → HFNC → CPAP → BiPAP → ETI with indications/settings; GINA 2026 O2 targets |
| 11 | Management of Key Diagnoses | 6 diagnosis cards: ADHF, Massive PE, COPD, Tension PTX, Acute Asthma, Anaphylaxis |
| 12 | Disposition & High-Yield Points | Discharge/Admit/ICU criteria + 12 starred exam-ready facts |
| 13 | References | All 9 sources cited with chapter/PMID details |
MAKE EXAM ORIENTED POSTGRADUATE EMERGENCY MEDICINE WITH TOPIC NAME APPROCH TO HYPOXIA IN ACUTE PRESENTATION IN EMERGENCY ROOM NEW GUIDLINE WITH RECENT ADVANCED AND TINTILATY REFEERENCE AND HARRISON INTERNAL MEDICINE REFERENCE
"hypoxemia" AND "emergency department" AND "oxygen therapy"
hypoxia hypoxemia emergency department approach guidelines 2025 2026 oxygen therapy management
"oxygen therapy" AND "critically ill" AND "target saturation"
https://pmc.ncbi.nlm.nih.gov/articles/PMC12934415
"oxygen saturation" AND "conservative oxygen" AND "critically ill"
"high flow nasal cannula" AND "acute hypoxemic respiratory failure" AND "emergency"
"pulse oximetry" AND "racial bias" OR "skin pigmentation" hypoxemia
| Term | Definition | Key Point |
|---|---|---|
| Hypoxia | Insufficient oxygen delivery to tissues (cellular level) | Can occur with NORMAL PaO2 |
| Hypoxemia | Abnormally low arterial oxygen tension: PaO2 <60 mmHg or SpO2 <90% on room air | Pulmonary problem; does NOT always = tissue hypoxia |
"Hypoxia and hypoxemia are NOT interchangeable; one can occur without the other."
- Tintinalli's EM, Chapter 62
Clinical implication: Tissue hypoxia can occur even with normal SpO2 if:
- Cardiac output is low (cardiogenic shock)
- Hemoglobin is low (severe anemia)
- Hemoglobin is non-functional (CO, MetHb)
Exam tip: Supine position (common ED patient position) raises A-a gradient even in healthy patients - factor this into interpretation (Tintinalli's EM).
| Mechanism | A-a Gradient | Response to 100% O2 | Classic Causes |
|---|---|---|---|
| 1. Hypoventilation | NORMAL | Corrects fully | Opioids, sedatives, neuromuscular disease, obesity hypoventilation |
| 2. V/Q Mismatch | INCREASED | Improves well | PE, pneumonia, asthma, COPD, CHF |
| 3. Diffusion Impairment | INCREASED | Improves | ILD, pulmonary fibrosis, emphysema |
| 4. Right-to-Left Shunt | INCREASED | Minimal/partial correction | ARDS, atelectasis, hepatopulmonary syndrome, ASD, VSD, intracardiac shunt |
| 5. Low Inspired O2 (FiO2↓) | NORMAL | Corrects fully | High altitude, aircraft cabin, confined space |
| Severity | SpO2 | PaO2 | Clinical Features |
|---|---|---|---|
| Mild | 94-90% | 60-80 mmHg | Tachycardia, tachypnea, anxiety, subtle cognitive impairment |
| Moderate | 85-90% | 45-60 mmHg | Marked tachypnea, agitation, headache, diaphoresis, somnolence |
| Severe | <85% | <45 mmHg | Cyanosis (if Hb normal), altered consciousness, seizures, bradycardia (pre-terminal) |
| Critical | <75% | <30-40 mmHg | Coma, cardiac arrhythmias, respiratory arrest, death |
| Condition | Effect on SpO2 Reading | Actual Situation |
|---|---|---|
| CO poisoning | Falsely HIGH (COHb reads as OxyHb) | Severe tissue hypoxia |
| Methemoglobinemia | Reads ~85% regardless of actual SaO2 | True SaO2 may be higher or lower |
| Dark skin pigmentation | Overestimates SaO2 (reads higher than true) | [Martin et al., Br J Anaesth 2024 - PMID 38368234] |
| Severe anemia | May be accurate for SpO2 but misleads re: O2 delivery | Tissue hypoxia despite normal SpO2 |
| Peripheral vasoconstriction/shock | Poor waveform, unreliable readings | Use ABG |
| Nail varnish | Can reduce accuracy | Remove or use finger probe carefully |
| Motion artifact | False low readings | Confirm on ABG |
2024 Landmark Evidence: Martin et al., Br J Anaesth 2024 (PMID 38368234) - Systematic review + meta-analysis: Darker skin tone associated with overestimation of arterial O2 saturation by pulse oximetry. This has implications for occult hypoxemia in dark-skinned patients (health equity issue).
| Feature | Type I (Hypoxemic) | Type II (Hypercapnic) |
|---|---|---|
| PaO2 | ↓ <60 mmHg | ↓ <60 mmHg |
| PaCO2 | Normal or ↓ | ↑ >45 mmHg |
| Mechanism | V/Q mismatch, shunt, diffusion impairment | Alveolar hypoventilation |
| A-a gradient | Increased | Normal (in pure Type II) |
| Causes | ARDS, pneumonia, PE, ADHF, ILD | COPD exacerbation, neuromuscular disease, obesity hypoventilation, sedative OD |
| Treatment | Oxygen supplementation; NIV/HFNC | NIV (BiPAP preferred); controlled low-dose O2 |
| Severity | PaO2/FiO2 Ratio | PEEP requirement | Mortality |
|---|---|---|---|
| Mild | 200-300 mmHg | ≥5 cmH2O | ~27% |
| Moderate | 100-200 mmHg | ≥5 cmH2O | ~32% |
| Severe | <100 mmHg | ≥5 cmH2O | ~45% |
| Tool | What It Measures | When to Use |
|---|---|---|
| SpO2 | Peripheral O2 saturation (proxy) | All patients |
| ABG | PaO2, PaCO2, pH, HCO3, calculated SaO2, A-a gradient | SpO2 <92%, COPD, suspected hypercapnia, uncertain diagnosis |
| VBG | PCO2 estimate, pH, lactate | NOT for hypoxemia assessment (SFMU/FICS 2026 Grade 1) |
| PaO2/FiO2 | Severity of gas exchange failure | ARDS classification, severity stratification |
| A-a gradient | Identifies cause of hypoxemia | Differentiates hypoventilation from other causes |
| Co-oximetry | MetHb, COHb, SulfHb | Suspected CO or MetHb poisoning (ABG machine with co-oximeter) |
| Lactate | Tissue O2 delivery/utilization | All shocked/hypoxic patients |
Step 1: Is PaO2 <60 mmHg? → YES = Hypoxemia confirmed
Step 2: Is PaCO2 elevated (>45 mmHg)?
→ YES = Type II (Hypoventilation component)
→ NO = Type I (Hypoxemic failure)
Step 3: Calculate A-a gradient
NORMAL → Hypoventilation OR Low FiO2
ELEVATED → V/Q mismatch / Shunt / Diffusion impairment
Step 4: Response to 100% O2 trial:
Corrects → V/Q mismatch / Diffusion / Hypoventilation
Does NOT correct → R→L Shunt (cardiac or pulmonary)
| Onset | Likely Causes |
|---|---|
| Seconds (immediate) | Tension pneumothorax, airway obstruction (FB, anaphylaxis, epiglottitis), cardiac arrest, massive haemothorax |
| Minutes | Massive PE, flash pulmonary edema, severe bronchospasm (asthma/anaphylaxis), aspiration |
| Hours | Pneumonia, COPD exacerbation, ADHF, pneumothorax (spontaneous), pleural effusion |
| Days to weeks | Worsening ILD, malignancy, ARDS (evolving), subacute PE |
| Response | Interpretation |
|---|---|
| SpO2 rapidly corrects to >95% | V/Q mismatch (commonest) - PE, asthma, COPD, pneumonia |
| SpO2 partially improves but not to >95% | Mixed V/Q + shunt - severe pneumonia, ARDS (early) |
| SpO2 fails to improve despite 100% O2 | Predominant shunt - ARDS, hepatopulmonary syndrome, intracardiac R→L shunt |
| SpO2 "normal" but patient critically ill | CO poisoning, methemoglobinemia, severe anemia, circulatory shock |
| Patient Group | Target SpO2 | Evidence |
|---|---|---|
| General acute illness | 94-98% | Avoid hyperoxia |
| COPD / Risk of hypercapnia | 88-92% | Prevents hypercapnic drive suppression |
| ARDS / ICU ventilated | 88-95% | Tintinalli's EM; UK-ROX 2025 |
| Acute MI / STEMI (no hypoxia) | Do NOT give O2 if SpO2 ≥94% | Hyperoxia causes coronary vasoconstriction |
| Stroke (no hypoxia) | Do NOT give O2 if SpO2 ≥94% | Hyperoxia associated with worse outcomes |
| Septic shock | 94-98% | Avoid ≥98-100% |
| Post-cardiac arrest | 94-98% | Avoid hyperoxia (ROSC phase) |
| Preterm neonates | 91-95% | Avoid ROP/BPD |
| CO poisoning | 100% O2 (NRM) or HBO | Saturate all Hb binding sites |
LANDMARK: UK-ROX Trial (JAMA, August 2025 - PMID 40501321): Conservative oxygen therapy (SpO2 target 90-94%) in mechanically ventilated critically ill adults - large multicenter RCT. Results showed conservative targets were safe and potentially beneficial compared to liberal O2 targets.
OXY-BREATHES Meta-analysis (Crit Care Med, May 2026 - PMID 41661051): Conservative vs liberal oxygen targets in mechanically ventilated patients - systematic review confirms conservative O2 targets are safe and reduce exposure to hyperoxia.
| Device | Flow Rate | FiO2 Delivered | Notes |
|---|---|---|---|
| Nasal cannula | 1 L/min = FiO2 ~24% (+4% per L/min) | 24-44% | 1-6 L/min; comfortable, allows talking |
| Simple face mask | 6-10 L/min | 40-60% | Min 6 L/min to prevent CO2 rebreathing |
| Partial rebreather mask | 8-12 L/min | 55-70% | With reservoir bag, no one-way valve |
| Non-rebreather mask (NRM) | 10-15 L/min | 80-100% | Emergency hypoxia; CO poisoning |
| HFNC (High-Flow NC) | Up to 60 L/min | Up to 100% FiO2 | ~2 cmH2O PEEP per 10 L/min; heated/humidified |
| CPAP | N/A (FiO2 titrated) | Varies | 5-15 cmH2O PEEP; cardiogenic pulm oedema |
| BiPAP/NIV | N/A | Varies | IPAP 10-20 / EPAP 4-8; COPD, CHF, mild ARDS |
| Endotracheal + MV | Titrated | 21-100% | FiO2 weaned once SpO2 ≥94%; lung protective |
| Hyperbaric O2 (HBO) | Chamber (2-3 ATA) | ~100% at pressure | CO poisoning, decompression sickness, gas gangrene |
| Parameter | Target | Rationale |
|---|---|---|
| Tidal volume | 4-8 mL/kg IBW (start 6 mL/kg) | Prevents VILI (ventilator-induced lung injury) |
| Plateau pressure | <30 cmH2O | Decrements by 1 mL/kg if exceeded |
| RR | 6-35 breaths/min | Adjust to maintain pH |
| FiO2 | Lowest to achieve SpO2 88-95% | Avoid O2 toxicity |
| PEEP | Titrate (see PEEP table) | Recruit collapsed alveoli |
| pH | >7.20 tolerated | Permissive hypercapnia acceptable |
| SpO2 target | 88-95% OR PaO2 55-80 mmHg | Tintinalli's EM |
Auto-PEEP: Check that expiratory flow returns to zero before next breath. If present: disconnect from ventilator 15-20 seconds + decrease RR (Tintinalli's EM).
| Lactate | Interpretation |
|---|---|
| <2 mmol/L | Normal |
| 2-4 mmol/L | Elevated; suggests impaired O2 delivery or utilization |
| >4 mmol/L | Severe; septic shock threshold; high mortality |
| Source | Key Content |
|---|---|
| Harrison's Principles of Internal Medicine 22E (2025) - Ch. 42 | Definition of hypoxia/hypoxemia; 4 types of hypoxia (respiratory, anemic, circulatory, CO); HIF-1; responses to hypoxia; cyanosis (central vs peripheral); A-a gradient interpretation |
| Tintinalli's Emergency Medicine - Ch. 62 (Hypoxia & Hypoxemia) | CaO2 = 0.0031×PaO2 + 1.38×Hb×SaO2; DO2 = CaO2×CO; 5 mechanisms of hypoxemia; A-a gradient formulae; pulse oximetry limitations; treatment targets |
| Tintinalli's EM - Ch. 29B (Severe Hypoxia/ARDS/Trauma) | ARDS Berlin definition; lung-protective ventilation; PEEP table; auto-PEEP; ARDS SpO2 target 88-95% |
| SFMU/FICS Guidelines 2026 - Ann Intensive Care 2026 Jan | R3.2.1: VBG NOT for hypoxemia assessment; R3.2.2: SpO2 >96% excludes PaO2 <60 mmHg; Type I vs II RF; SpO2 thresholds |
| UK-ROX RCT (JAMA, Aug 2025) - PMID 40501321 | Conservative O2 (90-94%) vs standard in ICU ventilated patients - safe, potentially beneficial |
| OXY-BREATHES Meta-analysis (Crit Care Med, May 2026) - PMID 41661051 | Conservative O2 targets in MV patients - systematic review |
| Martin et al., Br J Anaesth 2024 - PMID 38368234 | Pulse oximetry overestimates SaO2 in dark-skinned patients - systematic review/meta-analysis |
| Geary et al., J Emerg Med 2026 - PMID 42407213 | HFNC for apneic oxygenation during RSI in ED - systematic review |
| Yau et al., Crit Care 2023 - PMID 37605238 | ROX index for predicting HFNC failure in hypoxemic patients |
Top Exam Tips for PG EM Boards:
- Distinguish hypoxia vs hypoxemia (Harrison's - always examinable)
- Know the 5 mechanisms by A-a gradient + O2 response (Tintinalli's)
- Memorize pulse oximetry pitfalls: CO (falsely normal), MetHb (~85%), dark skin (overestimates)
- SFMU/FICS 2026: VBG cannot assess hypoxemia; SpO2 >96% excludes PaO2 <60 mmHg
- Conservative O2 targets now supported by UK-ROX (JAMA 2025) - avoid routine high-flow O2
- ARDS: target SpO2 88-95%, NOT 98-100%
- ROX Index for HFNC failure prediction (≥4.88 = success at 12 hrs)
- Cyanosis absent in anemia despite severe hypoxemia (key exam trap from Harrison's 22E)
- HIF-1 = master transcription factor governing hypoxia response (Harrison's viva)
- Critical threshold: all compensatory mechanisms activated at PaO2 = 60 mmHg; fail at PaO2 <20 mmHg
Generate a PowerPoint presentation on acute hypoxia diagnostic algorithms for teaching
mkdir -p /tmp/workspace/acute-hypoxia-ppt && echo "ready"
~/acute-hypoxia-ppt/build_hypoxia_ppt.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
from io import BytesIO
# ── Palette ────────────────────────────────────────────────────
NAVY = RGBColor(0x07, 0x22, 0x4C)
DARK_BLUE = RGBColor(0x0D, 0x3B, 0x7A)
MED_BLUE = RGBColor(0x1A, 0x5E, 0xA8)
LIGHT_BLUE = RGBColor(0xD0, 0xE6, 0xF7)
TEAL = RGBColor(0x00, 0x7B, 0x83)
TEAL_LIGHT = RGBColor(0xCF, 0xEE, 0xF0)
GREEN = RGBColor(0x1A, 0x7A, 0x3C)
GREEN_LIGHT = RGBColor(0xD4, 0xED, 0xDA)
RED = RGBColor(0xBE, 0x2A, 0x2A)
RED_LIGHT = RGBColor(0xF8, 0xD7, 0xD7)
ORANGE = RGBColor(0xC9, 0x5F, 0x0A)
ORANGE_LIGHT= RGBColor(0xFC, 0xE8, 0xD0)
PURPLE = RGBColor(0x5B, 0x2C, 0x8D)
PURPLE_LIGHT= RGBColor(0xE8, 0xD5, 0xF5)
YELLOW_BG = RGBColor(0xFF, 0xF3, 0xCD)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_GRAY = RGBColor(0xF0, 0xF2, 0xF5)
MID_GRAY = RGBColor(0x60, 0x60, 0x60)
DARK_GRAY = RGBColor(0x22, 0x22, 0x22)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# ── Helpers ───────────────────────────────────────────────────
def rect(slide, x, y, w, h, fill, line_col=None, line_w=Pt(0), radius=False):
st = MSO_SHAPE.ROUNDED_RECTANGLE if radius else MSO_SHAPE.RECTANGLE
s = slide.shapes.add_shape(st, Inches(x), Inches(y), Inches(w), Inches(h))
s.fill.solid(); s.fill.fore_color.rgb = fill
if line_col:
s.line.color.rgb = line_col; s.line.width = line_w
else:
s.line.fill.background()
s.shadow.inherit = False
return s
def tb(slide, x, y, w, h, text, size=12, bold=False, color=DARK_GRAY,
align=PP_ALIGN.LEFT, italic=False, wrap=True):
t = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = t.text_frame; tf.word_wrap = wrap
tf.margin_left = Pt(3); tf.margin_right = Pt(3)
tf.margin_top = Pt(2); tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]; p.alignment = align
r = p.add_run(); r.text = text
r.font.size = Pt(size); r.font.bold = bold
r.font.italic = italic; r.font.color.rgb = color
r.font.name = "Calibri"
return t
def shape_text(shp, text, size=13, bold=False, color=WHITE, align=PP_ALIGN.CENTER):
tf = shp.text_frame; tf.word_wrap = True
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
tf.margin_left = Pt(5); tf.margin_right = Pt(5)
tf.margin_top = Pt(3); tf.margin_bottom = Pt(3)
p = tf.paragraphs[0]; p.alignment = align
r = p.add_run(); r.text = text
r.font.size = Pt(size); r.font.bold = bold
r.font.color.rgb = color; r.font.name = "Calibri"
def connector(slide, x1, y1, x2, y2, col=DARK_GRAY, w=Pt(2)):
ln = slide.shapes.add_connector(
MSO_CONNECTOR.STRAIGHT, Inches(x1), Inches(y1), Inches(x2), Inches(y2))
ln.line.color.rgb = col; ln.line.width = w
def header(slide, title, sub=None):
s = rect(slide, 0, 0, 13.333, 0.82, NAVY)
tf = s.text_frame; tf.word_wrap = False
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
tf.margin_left = Pt(18); tf.margin_top = Pt(2); tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]
r = p.add_run(); r.text = title
r.font.size = Pt(24); r.font.bold = True
r.font.color.rgb = WHITE; r.font.name = "Calibri"
if sub:
tb(slide, 0.25, 0.83, 13, 0.3, sub, 10, False, MED_BLUE, italic=True)
def footer(slide, note="Tintinalli's EM | Harrison's 22E (2025) | SFMU/FICS 2026 | UK-ROX JAMA 2025"):
s = rect(slide, 0, 7.2, 13.333, 0.3, NAVY)
shape_text(s, note, 9, False, WHITE)
def flow_box(slide, x, y, w, h, text, bg, tc=WHITE, fs=11, bold=True, lc=None):
lc2 = lc if lc else bg
s = rect(slide, x, y, w, h, bg, lc2, Pt(1.5), radius=True)
shape_text(s, text, fs, bold, tc, PP_ALIGN.CENTER)
return s
# ══════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE
# ══════════════════════════════════════════════════════════════
s1 = prs.slides.add_slide(blank)
rect(s1, 0, 0, 13.333, 7.5, NAVY)
rect(s1, 0, 3.65, 13.333, 0.09, MED_BLUE)
rect(s1, 0, 3.74, 13.333, 0.045, TEAL)
tb(s1, 0.5, 0.9, 12.3, 1.4,
"ACUTE HYPOXIA IN THE EMERGENCY ROOM",
38, True, WHITE, PP_ALIGN.CENTER)
tb(s1, 0.5, 2.4, 12.3, 0.7,
"Diagnostic Algorithms | Mechanisms | Assessment | Management",
20, False, LIGHT_BLUE, PP_ALIGN.CENTER, italic=True)
tb(s1, 0.5, 3.9, 12.3, 0.55,
"Postgraduate Emergency Medicine Teaching Module",
15, False, WHITE, PP_ALIGN.CENTER)
tb(s1, 0.5, 4.5, 12.3, 0.5,
"Harrison's Principles 22E (2025) | Tintinalli's Emergency Medicine | SFMU/FICS 2026 | UK-ROX Trial (JAMA 2025)",
11, False, LIGHT_BLUE, PP_ALIGN.CENTER, italic=True)
tb(s1, 0.5, 5.1, 12.3, 0.5, "July 2026", 13, False, LIGHT_BLUE, PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════
# SLIDE 2 — DEFINITIONS (Key Exam Distinction)
# ══════════════════════════════════════════════════════════════
s2 = prs.slides.add_slide(blank)
rect(s2, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s2, "DEFINITIONS — KEY EXAM DISTINCTION", "Tintinalli's EM Ch.62 | Harrison's 22E Ch.42")
footer(s2)
# Two definition boxes
shp_hyp = rect(s2, 0.25, 1.0, 6.05, 2.3, WHITE, MED_BLUE, Pt(2.5), radius=True)
tb(s2, 0.35, 1.05, 5.85, 0.5, "HYPOXIA", 18, True, MED_BLUE)
tb(s2, 0.35, 1.55, 5.85, 1.65,
"Insufficient oxygen delivery to TISSUES (cellular level)\n\n"
"• Can occur with NORMAL PaO2\n"
"• Involves cardiac output, Hb, and SaO2\n"
"• DO2 = CaO2 × Cardiac Output",
12, False, DARK_GRAY)
shp_hpe = rect(s2, 6.55, 1.0, 6.55, 2.3, WHITE, RED, Pt(2.5), radius=True)
tb(s2, 6.65, 1.05, 6.35, 0.5, "HYPOXEMIA", 18, True, RED)
tb(s2, 6.65, 1.55, 6.35, 1.65,
"Abnormally low ARTERIAL oxygen tension\n\n"
"• PaO2 < 60 mmHg OR SpO2 < 90% on room air\n"
"• Pulmonary problem primarily\n"
"• Does NOT always = tissue hypoxia",
12, False, DARK_GRAY)
# NOT interchangeable banner
shp_ni = rect(s2, 0.25, 3.45, 12.8, 0.6, YELLOW_BG, ORANGE, Pt(2), radius=True)
tb(s2, 0.35, 3.5, 12.6, 0.5,
'★ "Hypoxia and hypoxemia are NOT interchangeable; one can occur without the other." — Tintinalli\'s EM, Ch.62',
13, True, ORANGE, PP_ALIGN.CENTER)
# Classic examples
examples = [
("Polycythemia", "Low PaO2 (hypoxemia)\nBut normal DO2 → NO tissue hypoxia", MED_BLUE, LIGHT_BLUE),
("Severe Anaemia", "Normal PaO2 (no hypoxemia)\nLow Hb → TISSUE HYPOXIA", RED, RED_LIGHT),
("CO Poisoning", "Normal PaO2 + normal SpO2\n(falsely normal!) → SEVERE tissue hypoxia", ORANGE, ORANGE_LIGHT),
("Cyanide Toxicity", "Normal PaO2 + high SvO2\nCells CANNOT use O2 → tissue hypoxia", PURPLE, PURPLE_LIGHT),
]
for i, (title, body, tc, bg) in enumerate(examples):
x = 0.25 + i * 3.27
s = rect(s2, x, 4.15, 3.1, 2.85, bg, tc, Pt(1.5), radius=True)
tb(s2, x+0.1, 4.2, 2.9, 0.45, title, 12, True, tc)
tb(s2, x+0.1, 4.68, 2.9, 2.2, body, 11, False, DARK_GRAY)
# ══════════════════════════════════════════════════════════════
# SLIDE 3 — OXYGEN PHYSIOLOGY FORMULAE
# ══════════════════════════════════════════════════════════════
s3 = prs.slides.add_slide(blank)
rect(s3, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s3, "OXYGEN PHYSIOLOGY — KEY FORMULAE", "Tintinalli's EM Ch.62 (CaO2, DO2, A-a Gradient)")
footer(s3)
formulae = [
("ARTERIAL OXYGEN CONTENT (CaO₂)", MED_BLUE, LIGHT_BLUE,
"CaO₂ = 0.0031 × PaO₂ + 1.38 × Hb × SaO₂\n\n"
"• Dissolved O₂ (0.0031 × PaO₂) = ~1.5% of total — tiny contribution\n"
"• Hb-bound O₂ (1.38 × Hb × SaO₂) = ~98.5% — DOMINANT factor\n\n"
"Clinical implication: Low Hb → ↓ CaO₂ even with perfect lungs"),
("OXYGEN DELIVERY (DO₂)", TEAL, TEAL_LIGHT,
"DO₂ = CaO₂ × Cardiac Output\n\n"
"• Tissue hypoxia if ANY component fails:\n"
" — Low cardiac output (cardiogenic/distributive shock)\n"
" — Low Hb (anaemia, bleeding)\n"
" — Non-functional Hb (CO poisoning, MetHb)\n"
" — Low SaO₂ (lung disease)"),
("ALVEOLAR-ARTERIAL (A-a) GRADIENT", ORANGE, ORANGE_LIGHT,
"PAO₂ = 0.21 × (760 − 47) − PaCO₂ / 0.8\n"
"A-a gradient = PAO₂ − PaO₂\n\n"
"Normal values:\n"
"• Young healthy: < 10 mmHg\n"
"• Age-adjusted: 2.5 + (0.21 × age in yrs) ± 11 mmHg\n"
"• Simplified: A-a = 145 − PaO₂ (room air, sea level)\n\n"
"Supine position raises A-a gradient even in healthy patients (Tintinalli's EM)"),
("PaO₂/FiO₂ RATIO (P/F RATIO)", RED, RED_LIGHT,
"P/F Ratio = PaO₂ / FiO₂\n\n"
"• Normal: ≥ 400 mmHg (FiO₂ = 0.21: PaO₂ ~100 / 0.21)\n"
"• Mild ALI: 200–300 mmHg\n"
"• ARDS Mild: 201–300 mmHg (+PEEP ≥5)\n"
"• ARDS Mod: 101–200 mmHg\n"
"• ARDS Sev: ≤ 100 mmHg\n\n"
"Most frequently used parameter for lung failure severity (Tintinalli's EM)"),
]
for i, (title, tc, bg, body) in enumerate(formulae):
c, r = i % 2, i // 2
x, y = 0.25 + c * 6.55, 1.0 + r * 3.1
s = rect(s3, x, y, 6.4, 2.95, bg, tc, Pt(2), radius=True)
tb(s3, x+0.12, y+0.06, 6.15, 0.42, title, 12, True, tc)
tb(s3, x+0.12, y+0.52, 6.15, 2.3, body, 10.5, False, DARK_GRAY)
# ══════════════════════════════════════════════════════════════
# SLIDE 4 — 5 MECHANISMS OF HYPOXEMIA
# ══════════════════════════════════════════════════════════════
s4 = prs.slides.add_slide(blank)
rect(s4, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s4, "5 MECHANISMS OF HYPOXEMIA", "Tintinalli's EM Ch.62 | Harrison's 22E Ch.42")
footer(s4)
# Table header row
hdr_cells = ["Mechanism", "A-a Gradient", "Response to 100% O₂", "PaCO₂", "Classic Causes"]
col_w = [2.8, 1.5, 2.5, 1.3, 4.8]
col_x = [0.22, 3.04, 4.56, 7.08, 8.4]
for j, (hdr, cw, cx) in enumerate(zip(hdr_cells, col_w, col_x)):
sh = rect(s4, cx, 0.9, cw-0.04, 0.45, NAVY)
shape_text(sh, hdr, 11, True, WHITE)
mechs = [
("1. Hypoventilation",
"NORMAL", "✓ Corrects fully", "RAISED ↑",
"Opioids, sedatives, NMJ disease, OHS, severe hypothyroidism",
MED_BLUE, LIGHT_BLUE),
("2. V/Q Mismatch\n(most common)",
"INCREASED", "✓ Improves well", "Normal/low",
"PE, Pneumonia, Asthma, COPD, CHF, pleural effusion",
TEAL, TEAL_LIGHT),
("3. Diffusion Impairment",
"INCREASED", "✓ Improves", "Normal",
"ILD, Pulmonary fibrosis, Emphysema, Pulmonary oedema",
GREEN, GREEN_LIGHT),
("4. Right-to-Left Shunt\n★ KEY EXAM",
"INCREASED", "✗ MINIMAL / FAILS", "Normal/low",
"ARDS, Atelectasis, Hepatopulmonary syn, ASD, VSD, intracardiac shunt",
RED, RED_LIGHT),
("5. Low Inspired O₂ (↓FiO₂)",
"NORMAL", "✓ Corrects fully", "Normal/low",
"High altitude, Aircraft cabin, Confined space, Non-obstructive asphyxia",
ORANGE, ORANGE_LIGHT),
]
for i, (mech, aa, o2, paco2, causes, tc, bg) in enumerate(mechs):
y = 1.39 + i * 1.14
bg2 = bg if i % 2 == 0 else WHITE
data_row = [mech, aa, o2, paco2, causes]
for j, (cell, cw, cx) in enumerate(zip(data_row, col_w, col_x)):
cell_bg = bg if j == 0 else bg2
cell_tc = tc if j == 0 else DARK_GRAY
sh = rect(s4, cx, y, cw-0.04, 1.1, cell_bg, MID_GRAY, Pt(0.3))
tb(s4, cx+0.07, y+0.06, cw-0.15, 0.98, cell,
10 if j != 0 else 10.5, j == 0, cell_tc)
# Exam trap note
shp_exam = rect(s4, 0.22, 6.72, 12.88, 0.42, YELLOW_BG, ORANGE, Pt(1.5), radius=True)
tb(s4, 0.32, 6.75, 12.68, 0.36,
"★ EXAM TRAP: SHUNT is the ONLY mechanism where 100% O₂ FAILS to correct hypoxemia | "
"HYPOVENTILATION is the ONLY mechanism with NORMAL A-a gradient + raised PaCO₂",
10.5, True, ORANGE, PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════
# SLIDE 5 — TYPES OF HYPOXIA (Harrison's Classification)
# ══════════════════════════════════════════════════════════════
s5 = prs.slides.add_slide(blank)
rect(s5, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s5, "TYPES OF HYPOXIA — HARRISON'S 22E CLASSIFICATION", "Harrison's Principles of Internal Medicine 22E, Ch.42")
footer(s5)
types_data = [
("A. Respiratory\n/ Hypoxemic", MED_BLUE, LIGHT_BLUE,
"PaO₂ ↓ | SaO₂ ↓\nA-a gradient ↑ (usually)\n\n"
"V/Q mismatch (most common)\nHypoventilation\nR→L shunt\nDiffusion impairment"),
("B. Anaemic\nHypoxia", TEAL, TEAL_LIGHT,
"PaO₂ NORMAL | SaO₂ NORMAL\nO₂ carrying capacity ↓\n\n"
"Greater O₂ extraction → venous PO₂ ↓\n\nCauses: Haemorrhage, haemolysis,\niron deficiency, thalassaemia"),
("C. Circulatory\n/ Stagnant", GREEN, GREEN_LIGHT,
"PaO₂ NORMAL | SaO₂ NORMAL\nReduced tissue perfusion → ↑ O₂ extraction\nA-V O₂ difference INCREASES\n\n"
"Causes: Cardiogenic shock, distributive\nshock, hypovolaemia, local ischaemia"),
("D. CO Poisoning\n★ SPECIAL CASE", RED, RED_LIGHT,
"PaO₂ NORMAL\nSpO₂ FALSELY NORMAL (reads COHb as OxyHb)\nCherry-red skin — NOT cyanosis\n\n"
"COHb shifts Hb-O₂ curve LEFT\n→ O₂ unloads only at lower tissue tensions\n→ Severe tissue hypoxia"),
("E. Histotoxic\nHypoxia", PURPLE, PURPLE_LIGHT,
"PaO₂ NORMAL\nSvO₂ PARADOXICALLY HIGH\n(cells cannot extract O₂)\n\n"
"Cause: Cyanide toxicity\n(blocks cytochrome c oxidase)\n→ High SvO₂ + lactic acidosis"),
("F. High Altitude\nHypoxia", ORANGE, ORANGE_LIGHT,
"Reduced FiO₂ (↓ barometric pressure)\nNormal A-a gradient\n\n"
"Denver (5400 ft): PiO₂ = 130 mmHg\n(vs 160 mmHg at sea level)\nCorrects with supplemental O₂"),
]
for i, (title, tc, bg, body) in enumerate(types_data):
c, r = i % 3, i // 3
x, y = 0.22 + c * 4.37, 1.0 + r * 3.05
s = rect(s5, x, y, 4.2, 2.92, bg, tc, Pt(2), radius=True)
tb(s5, x+0.12, y+0.06, 4.0, 0.52, title, 12, True, tc)
tb(s5, x+0.12, y+0.62, 4.0, 2.2, body, 10.5, False, DARK_GRAY)
# ══════════════════════════════════════════════════════════════
# SLIDE 6 — RESPONSES TO HYPOXIA
# ══════════════════════════════════════════════════════════════
s6 = prs.slides.add_slide(blank)
rect(s6, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s6, "PHYSIOLOGICAL RESPONSES TO HYPOXIA", "Harrison's 22E Ch.42 — Cellular, Molecular, Vascular, CNS")
footer(s6)
resp_blocks = [
("CELLULAR RESPONSE", MED_BLUE, LIGHT_BLUE,
"Aerobic → Anaerobic (Pasteur effect)\n"
"ATP production ↓ dramatically\n"
"Severe: membrane depolarisation\n"
"→ Ca²⁺ influx → phospholipases\n"
"→ Cell swelling → Apoptosis → Death\n\n"
"Critical threshold:\n"
"PaO₂ <20 mmHg = compensatory failure"),
("MOLECULAR / HIF-1", TEAL, TEAL_LIGHT,
"HIF-1 (Hypoxia-Inducible Factor-1)\n"
"= MASTER transcription factor\n\n"
"Upregulates:\n"
"• Glycolytic enzymes (PGK, PFK)\n"
"• Glucose transporters (GLUT-1, GLUT-2)\n"
"• VEGF (angiogenesis)\n"
"• Erythropoietin (↑ RBC production)\n\n"
"★ Harrison's 22E viva classic"),
("VASCULAR RESPONSE", ORANGE, ORANGE_LIGHT,
"Systemic arterioles: DILATE\n"
"(KATP channels open → ↑ tissue perfusion)\n\n"
"Pulmonary vessels: CONSTRICT\n"
"(HPV: K⁺ block → Ca²⁺ influx)\n"
"→ Redirects blood: poorly → well ventilated\n"
"→ But raises PVR + RV afterload\n"
"→ Diffuse disease = acute cor pulmonale"),
("CARDIOVASCULAR", GREEN, GREEN_LIGHT,
"Acute hypoxia:\n"
"↑ Myocardial contractility → ↑ CO\n\n"
"Prolonged hypoxia:\n"
"↓ Myocardial contractility\n\n"
"Systemic vasodilation → ↑ CO\n"
"(DANGER in pre-existing heart disease\n"
"→ can precipitate overt CHF)\n\n"
"Hypoventilation + hypoxia:\n"
"↓ PaCO₂ → cerebral vasoconstruction"),
("CNS EFFECTS", RED, RED_LIGHT,
"Mild: Impaired judgement\n"
"Motor incoordination\n"
"(resembles alcohol intoxication)\n\n"
"Moderate: Headache, dizziness\n"
"Somnolence, insomnia\n\n"
"Severe: Seizures, coma\n\n"
"Critical: Brainstem dysfunction\n"
"→ Respiratory failure → Death"),
("COMPENSATORY\nMECHANISMS", PURPLE, PURPLE_LIGHT,
"ACUTE:\n"
"① ↑ Minute ventilation (immediate)\n"
"② HPV (regional benefit)\n"
"③ ↑ Sympathetic → ↑HR → ↑CO\n\n"
"CHRONIC:\n"
"④ Polycythaemia (EPO-driven)\n"
"⑤ ↓ Tissue O₂ demands\n\n"
"All activated at PaO₂ = 60 mmHg\n"
"All FAIL at PaO₂ < 20 mmHg"),
]
for i, (title, tc, bg, body) in enumerate(resp_blocks):
c, r = i % 3, i // 3
x, y = 0.22 + c * 4.37, 1.0 + r * 3.05
s = rect(s6, x, y, 4.2, 2.92, bg, tc, Pt(2), radius=True)
tb(s6, x+0.12, y+0.06, 4.0, 0.4, title, 12, True, tc)
tb(s6, x+0.12, y+0.5, 4.0, 2.35, body, 10.5, False, DARK_GRAY)
# ══════════════════════════════════════════════════════════════
# SLIDE 7 — CLINICAL FEATURES + CYANOSIS
# ══════════════════════════════════════════════════════════════
s7 = prs.slides.add_slide(blank)
rect(s7, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s7, "CLINICAL FEATURES & CYANOSIS", "Harrison's 22E Ch.42 — Cyanosis: Central vs Peripheral")
footer(s7)
# Severity table
sev_hdr = ["Severity", "SpO₂", "PaO₂", "Clinical Features"]
sev_cw = [1.6, 1.2, 2.0, 7.7]
sev_cx = [0.22, 1.84, 3.06, 5.08]
sev_bg = [MED_BLUE, TEAL, ORANGE, RED]
for j, (h, cw, cx) in enumerate(zip(sev_hdr, sev_cw, sev_cx)):
sh = rect(s7, cx, 0.88, cw-0.04, 0.42, NAVY)
shape_text(sh, h, 11, True, WHITE)
sev_data = [
("Mild", "94–90%", "60–80 mmHg", "Tachycardia, tachypnoea, anxiety, subtle cognitive impairment", MED_BLUE, LIGHT_BLUE),
("Moderate", "85–90%", "45–60 mmHg", "Marked tachypnoea, agitation, headache, diaphoresis, somnolence", TEAL, TEAL_LIGHT),
("Severe", "<85%", "<45 mmHg", "Cyanosis (if Hb normal), altered consciousness, seizures, bradycardia (pre-terminal)", ORANGE, ORANGE_LIGHT),
("Critical", "<75%", "<35 mmHg", "Coma, cardiac arrhythmias, respiratory arrest, death", RED, RED_LIGHT),
]
for i, (sev, spo2, pao2, feat, tc, bg) in enumerate(sev_data):
y = 1.34 + i * 0.62
bg2 = bg
for j, (cell, cw, cx) in enumerate(zip([sev, spo2, pao2, feat], sev_cw, sev_cx)):
cbg = bg if j == 0 else (LIGHT_GRAY if i % 2 == 0 else WHITE)
ctc = tc if j == 0 else DARK_GRAY
sh = rect(s7, cx, y, cw-0.04, 0.58, cbg, MID_GRAY, Pt(0.3))
tb(s7, cx+0.07, y+0.05, cw-0.16, 0.48, cell, 10 if j != 0 else 11, j == 0, ctc)
# Cyanosis section
shp_cy_hdr = rect(s7, 0.22, 3.88, 12.88, 0.4, DARK_BLUE, radius=True)
shape_text(shp_cy_hdr, "CYANOSIS — Harrison's 22E Ch.42", 13, True, WHITE)
cyan_blocks = [
("CENTRAL CYANOSIS", RED, RED_LIGHT,
"SaO₂ is REDUCED or abnormal Hb present\n\n"
"Skin AND mucous membranes affected\n\n"
"Detectable when: SaO₂ ≤ 85% (fair skin)\n"
"OR SaO₂ ≤ 75% in dark-skinned patients\n\n"
"Causes: Lung disease, R→L shunt,\nhigh altitude, MetHb, SulfHb"),
("PERIPHERAL CYANOSIS", MED_BLUE, LIGHT_BLUE,
"SaO₂ is NORMAL; local ↑ O₂ extraction\n\n"
"Mucous membranes usually SPARED\n\n"
"Check sublingual mucosa + conjunctivae\n\n"
"Causes: Cold exposure, shock,\nheart failure, peripheral vascular disease"),
("SPECIAL VARIANTS", ORANGE, ORANGE_LIGHT,
"CO Poisoning: Cherry-red flush\n(NOT cyanosis)\n\n"
"Anemia: NO cyanosis despite severe\ndesaturation (absolute reduced Hb too low)\n\n"
"Polycythaemia: Cyanosis at higher\nSaO₂ levels (excess absolute reduced Hb)\n\n"
"Methaemoglobinaemia: SpO₂ reads ~85%\n regardless of actual SaO₂"),
("DARK SKIN — NEW 2024", PURPLE, PURPLE_LIGHT,
"★ Pulse oximetry OVERESTIMATES\nSaO₂ in darker-skinned patients\n\n"
"Martin et al. (Br J Anaesth 2024)\nSystematic review + meta-analysis\n(PMID 38368234)\n\n"
"→ Occult hypoxaemia risk\n→ Always check mucous membranes\n→ Consider ABG when uncertain"),
]
for i, (title, tc, bg, body) in enumerate(cyan_blocks):
x = 0.22 + i * 3.27
s = rect(s7, x, 4.32, 3.1, 2.65, bg, tc, Pt(2), radius=True)
tb(s7, x+0.1, 4.37, 2.9, 0.4, title, 11, True, tc)
tb(s7, x+0.1, 4.8, 2.9, 2.05, body, 9.5, False, DARK_GRAY)
# ══════════════════════════════════════════════════════════════
# SLIDE 8 — PULSE OXIMETRY LIMITATIONS
# ══════════════════════════════════════════════════════════════
s8 = prs.slides.add_slide(blank)
rect(s8, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s8, "PULSE OXIMETRY — PRINCIPLES & LIMITATIONS", "SFMU/FICS 2026 | Martin et al. Br J Anaesth 2024 | Harrison's 22E")
footer(s8)
# Principles box
shp_pr = rect(s8, 0.22, 0.9, 5.5, 2.3, WHITE, MED_BLUE, Pt(2), radius=True)
tb(s8, 0.32, 0.95, 5.3, 0.42, "PRINCIPLES", 12, True, MED_BLUE)
tb(s8, 0.32, 1.4, 5.3, 1.7,
"• Beer-Lambert law: light absorption at 660 nm (red)\n"
" and 940 nm (infrared)\n"
"• Measures SpO₂ as proxy for SaO₂\n\n"
"SFMU/FICS 2026 Key Recommendations:\n"
"• SpO₂ ALONE probably sufficient in most patients (Grade 2)\n"
"• SpO₂ >96% (room air) = PaO₂ <60 mmHg UNLIKELY\n"
"• COPD: SpO₂ >92% = significant hypoxaemia unlikely\n"
"• VBG NOT recommended for assessing hypoxaemia (Grade 1)",
10.5, False, DARK_GRAY)
# ABG indication box
shp_abg = rect(s8, 6.0, 0.9, 7.1, 2.3, WHITE, RED, Pt(2), radius=True)
tb(s8, 6.1, 0.95, 6.9, 0.42, "WHEN TO DO ABG (not just SpO₂)", 12, True, RED)
tb(s8, 6.1, 1.4, 6.9, 1.7,
"• SpO₂ <92% despite O₂\n"
"• COPD / risk of hypercapnia\n"
"• Suspected MetHb or CO poisoning\n"
"• Severe illness / shock with uncertain cause\n"
"• Pre-intubation assessment\n"
"• Monitoring response in mechanically ventilated patients\n"
"• Unexplained metabolic acidosis",
10.5, False, DARK_GRAY)
# Limitations table
shp_lim_hdr = rect(s8, 0.22, 3.32, 12.88, 0.42, DARK_BLUE, radius=True)
shape_text(shp_lim_hdr, "PULSE OXIMETRY LIMITATIONS — MUST KNOW", 13, True, WHITE)
lim_hdr = ["Condition", "SpO₂ Reading", "Actual Situation", "Action"]
lim_cw = [2.9, 2.3, 3.9, 3.6]
lim_cx = [0.22, 3.14, 5.46, 9.38]
for j, (h, cw, cx) in enumerate(zip(lim_hdr, lim_cw, lim_cx)):
sh = rect(s8, cx, 3.77, cw-0.05, 0.4, NAVY)
shape_text(sh, h, 10.5, True, WHITE)
lim_data = [
("CO Poisoning", "Falsely HIGH\n(COHb = OxyHb optically)", "Severe tissue hypoxia;\nO₂-carrying Hb depleted", "Co-oximetry ABG;\n100% O₂ / HBO", RED, RED_LIGHT),
("Methemoglobinaemia", "Reads ~85% REGARDLESS\nof actual SaO₂", "True SaO₂ may be higher\nor lower than 85%", "Co-oximetry ABG;\nMethylene blue tx", ORANGE, ORANGE_LIGHT),
("Dark skin pigmentation", "OVERESTIMATES SaO₂\n(Martin et al. 2024)", "Occult hypoxaemia\npossible", "Check mucous membranes;\nABG if uncertain", PURPLE, PURPLE_LIGHT),
("Peripheral vasoconstriction /\nShock / Hypothermia", "Poor waveform; may\ngive unreliable reading", "Cannot rule out\nhypoxaemia", "ABG confirmation;\ncentral SpO₂ probe", MED_BLUE, LIGHT_BLUE),
]
for i, (cond, spo2, actual, action, tc, bg) in enumerate(lim_data):
y = 4.2 + i * 0.73
row_bg = LIGHT_GRAY if i % 2 == 0 else WHITE
for j, (cell, cw, cx) in enumerate(zip([cond, spo2, actual, action], lim_cw, lim_cx)):
cbg = bg if j == 0 else row_bg
ctc = tc if j == 0 else DARK_GRAY
sh = rect(s8, cx, y, cw-0.05, 0.69, cbg, MID_GRAY, Pt(0.3))
tb(s8, cx+0.07, y+0.04, cw-0.16, 0.6, cell, 9.5, j == 0, ctc)
# ══════════════════════════════════════════════════════════════
# SLIDE 9 — MASTER DIAGNOSTIC ALGORITHM
# ══════════════════════════════════════════════════════════════
s9 = prs.slides.add_slide(blank)
rect(s9, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s9, "MASTER DIAGNOSTIC ALGORITHM — ACUTE HYPOXIA IN ED", "Tintinalli's EM | Harrison's 22E | SFMU/FICS 2026")
footer(s9)
# Entry
flow_box(s9, 4.65, 0.9, 3.8, 0.52, "ACUTE HYPOXIA DETECTED IN ED", NAVY, WHITE, 12, True)
connector(s9, 6.55, 1.42, 6.55, 1.72, DARK_GRAY, Pt(2))
# SpO2 measure
flow_box(s9, 3.9, 1.72, 5.2, 0.5, "Measure SpO₂ (continuous) + vital signs + IV access + monitor", MED_BLUE, WHITE, 10.5, True)
connector(s9, 6.5, 2.22, 6.5, 2.52, DARK_GRAY, Pt(2))
# Immediate danger
flow_box(s9, 4.3, 2.52, 4.4, 0.5, "Immediate life threat?", RED, WHITE, 12, True)
# YES
connector(s9, 4.3, 2.77, 1.85, 2.77, RED, Pt(2))
connector(s9, 1.85, 2.77, 1.85, 3.1, RED, Pt(2))
flow_box(s9, 0.22, 3.1, 3.2, 1.55,
"YES — IMMEDIATE ACTION\n• Airway: RSI (Ketamine)\n• 100% O₂ via NRM\n• Needle decompression (PTX)\n• CPAP/BiPAP/HFNC\n• Epinephrine (anaphylaxis)",
RED, WHITE, 9.5, False)
tb(s9, 2.55, 2.6, 0.65, 0.3, "YES", 10, True, RED, PP_ALIGN.CENTER)
# NO
connector(s9, 8.7, 2.77, 11.0, 2.77, GREEN, Pt(2))
connector(s9, 11.0, 2.77, 11.0, 3.1, GREEN, Pt(2))
flow_box(s9, 9.5, 3.1, 3.6, 1.55,
"NO — Focused assessment\n• History (onset, character)\n• Exam + auscultation\n• SpO₂ trend monitoring\n• Serial vital signs\n• A-a gradient calculation",
GREEN, WHITE, 9.5, False)
tb(s9, 8.7, 2.6, 0.6, 0.3, "NO", 10, True, GREEN, PP_ALIGN.CENTER)
connector(s9, 6.5, 3.02, 6.5, 3.3, DARK_GRAY, Pt(2))
# ABG step
flow_box(s9, 3.9, 3.3, 5.2, 0.5,
"ABG + Co-oximetry (if CO/MetHb suspected)", TEAL, WHITE, 10.5, True)
connector(s9, 6.5, 3.8, 6.5, 4.08, DARK_GRAY, Pt(2))
# A-a gradient decision
flow_box(s9, 4.2, 4.08, 4.5, 0.5, "A-a Gradient: Normal or Raised?", DARK_BLUE, WHITE, 11, True)
# NORMAL branch
connector(s9, 4.2, 4.33, 1.9, 4.33, MED_BLUE, Pt(2))
connector(s9, 1.9, 4.33, 1.9, 4.65, MED_BLUE, Pt(2))
flow_box(s9, 0.22, 4.65, 3.2, 0.95,
"NORMAL A-a gradient\n→ Hypoventilation (PaCO₂↑)\n→ Low FiO₂ (high altitude)\nCheck PaCO₂!",
MED_BLUE, WHITE, 9.5, False)
tb(s9, 1.5, 4.18, 1.4, 0.3, "NORMAL", 9.5, True, MED_BLUE, PP_ALIGN.CENTER)
# RAISED branch
connector(s9, 8.7, 4.33, 11.1, 4.33, ORANGE, Pt(2))
connector(s9, 11.1, 4.33, 11.1, 4.65, ORANGE, Pt(2))
flow_box(s9, 9.5, 4.65, 3.6, 0.95,
"RAISED A-a gradient\n→ V/Q mismatch / Shunt\n→ Diffusion impairment\nTest: O₂ response!",
ORANGE, WHITE, 9.5, False)
tb(s9, 8.7, 4.18, 1.35, 0.3, "RAISED", 9.5, True, ORANGE, PP_ALIGN.CENTER)
connector(s9, 6.5, 4.58, 6.5, 4.8, DARK_GRAY, Pt(2))
# O2 response test
flow_box(s9, 3.9, 4.8, 5.2, 0.5, "Give O₂: Does SpO₂ / PaO₂ correct?", TEAL, WHITE, 10.5, True)
connector(s9, 6.5, 5.3, 6.5, 5.55, DARK_GRAY, Pt(2))
# Two final branches
connector(s9, 6.5, 5.55, 2.5, 5.55, GREEN, Pt(2))
connector(s9, 2.5, 5.55, 2.5, 5.78, GREEN, Pt(2))
flow_box(s9, 0.22, 5.78, 4.6, 1.1,
"✓ CORRECTS\nV/Q Mismatch | Diffusion impairment\nHypoventilation | Low FiO₂\n→ Treat underlying cause",
GREEN, WHITE, 10, False)
tb(s9, 1.6, 5.42, 1.8, 0.3, "✓ CORRECTS", 9.5, True, GREEN, PP_ALIGN.CENTER)
connector(s9, 6.5, 5.55, 10.5, 5.55, RED, Pt(2))
connector(s9, 10.5, 5.55, 10.5, 5.78, RED, Pt(2))
flow_box(s9, 5.0, 5.78, 8.1, 1.1,
"✗ FAILS TO CORRECT = RIGHT-TO-LEFT SHUNT\n"
"ARDS | Atelectasis | Intracardiac shunt | Hepatopulmonary syn\n"
"→ Lung-protective ventilation (PEEP) → POCUS → Echocardiography",
RED, WHITE, 10, False)
tb(s9, 8.7, 5.42, 1.9, 0.3, "✗ FAILS", 9.5, True, RED, PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════
# SLIDE 10 — ABG INTERPRETATION FRAMEWORK
# ══════════════════════════════════════════════════════════════
s10 = prs.slides.add_slide(blank)
rect(s10, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s10, "ABG INTERPRETATION FRAMEWORK FOR HYPOXIA", "Tintinalli's EM Ch.62 | SFMU/FICS 2026")
footer(s10)
# Step-by-step
steps = [
("STEP 1", "Is PaO₂ < 60 mmHg?", "YES = Hypoxaemia confirmed\nNO = No hypoxaemia (but may still have tissue hypoxia if low CO/Hb)", MED_BLUE, LIGHT_BLUE),
("STEP 2", "Is PaCO₂ > 45 mmHg?", "YES = Type II respiratory failure (Hypoventilation component)\nNO = Type I (Hypoxaemic failure)", TEAL, TEAL_LIGHT),
("STEP 3", "Calculate A-a Gradient", "NORMAL = Hypoventilation OR Low FiO₂ (check history)\nELEVATED = V/Q mismatch / Shunt / Diffusion impairment", ORANGE, ORANGE_LIGHT),
("STEP 4", "Response to 100% O₂ trial", "CORRECTS = V/Q mismatch / Diffusion / Hypoventilation / Low FiO₂\nFAILS = Right-to-Left Shunt (cardiac or intrapulmonary)", RED, RED_LIGHT),
("STEP 5", "Co-oximetry (if available)", "Check COHb level (CO poisoning)\nCheck MetHb level (methemoglobinaemia)\nRoutine ABG misses these — always order co-oximetry if suspected", PURPLE, PURPLE_LIGHT),
("STEP 6", "Check Lactate", "Normal: < 2 mmol/L\nElevated (2–4): impaired O₂ delivery\nSevere (>4): septic shock, critical tissue hypoxia\nParadoxically HIGH SvO₂ + high lactate → Cyanide toxicity", GREEN, GREEN_LIGHT),
]
for i, (step, q, ans, tc, bg) in enumerate(steps):
c, r = i % 2, i // 2
x, y = 0.22 + c * 6.55, 1.0 + r * 2.05
s = rect(s10, x, y, 6.4, 1.92, bg, tc, Pt(2), radius=True)
step_box = rect(s10, x, y, 1.2, 0.42, tc)
shape_text(step_box, step, 11, True, WHITE)
tb(s10, x+1.25, y+0.05, 4.95, 0.4, q, 12, True, tc)
tb(s10, x+0.12, y+0.5, 6.15, 1.3, ans, 10.5, False, DARK_GRAY)
# Type I vs Type II table at bottom
shp_t12 = rect(s10, 0.22, 7.05, 12.88, 0.36, DARK_BLUE, radius=True)
shape_text(shp_t12,
"Type I RF: PaO₂↓ + PaCO₂ Normal/↓ (V/Q, shunt, diffusion) | "
"Type II RF: PaO₂↓ + PaCO₂↑ (alveolar hypoventilation) | "
"Both types may coexist",
9.5, True, WHITE)
# ══════════════════════════════════════════════════════════════
# SLIDE 11 — OXYGEN TARGETS + DELIVERY DEVICES
# ══════════════════════════════════════════════════════════════
s11 = prs.slides.add_slide(blank)
rect(s11, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s11, "OXYGEN TARGETS & DELIVERY DEVICES", "SFMU/FICS 2026 | UK-ROX JAMA 2025 | Tintinalli's EM")
footer(s11)
# Target table header
shp_t_hdr = rect(s11, 0.22, 0.88, 8.2, 0.42, NAVY, radius=True)
shape_text(shp_t_hdr, "SpO₂ TARGET RANGES BY PATIENT GROUP (2025–2026 Evidence)", 12, True, WHITE)
targets = [
("General acute illness", "94–98%", "Avoid hyperoxia", MED_BLUE),
("COPD / Risk of hypercapnia", "88–92%", "Prevents suppression of hypoxic drive", TEAL),
("ARDS / ICU ventilated", "88–95%", "UK-ROX Trial JAMA 2025; Tintinalli's EM", ORANGE),
("Acute MI / STEMI (no hypoxia)", "Do NOT give O₂ if SpO₂ ≥94%", "Hyperoxia → coronary vasoconstriction", RED),
("Stroke (no hypoxia)", "Do NOT give O₂ if SpO₂ ≥94%", "Hyperoxia worsens outcomes", RED),
("CO Poisoning", "100% O₂ (NRM) or HBO", "Displace CO from Hb; HBO if severe", GREEN),
("Post-cardiac arrest (ROSC)", "94–98%", "Avoid hyperoxia-reperfusion injury", PURPLE),
("Septic shock", "94–98%", "Avoid SpO₂ ≥98–100%", MED_BLUE),
]
for i, (group, tgt, note, tc) in enumerate(targets):
c, r = i % 2, i // 2
x = 0.22 + c * 4.11
y = 1.34 + r * 0.66
row_bg = LIGHT_GRAY if r % 2 == 0 else WHITE
sh = rect(s11, x, y, 4.06, 0.6, row_bg, tc, Pt(0.5))
tb(s11, x+0.08, y+0.05, 1.55, 0.5, group, 9.5, True, tc)
tb(s11, x+1.65, y+0.05, 1.35, 0.5, tgt, 9.5, True, DARK_GRAY)
tb(s11, x+3.02, y+0.05, 1.0, 0.5, note, 8.5, False, MID_GRAY)
# DANGER of Hyperoxia
shp_hox = rect(s11, 0.22, 4.07, 8.2, 0.9, YELLOW_BG, ORANGE, Pt(2), radius=True)
tb(s11, 0.32, 4.12, 8.0, 0.35, "DANGERS OF HYPEROXIA (O₂ Toxicity)", 11, True, ORANGE)
tb(s11, 0.32, 4.47, 8.0, 0.45,
"ROS lung toxicity | Absorption atelectasis | COPD hypercapnia (Haldane) | "
"Coronary/cerebral vasoconstriction | Reperfusion injury (post-ROSC) | Neonatal ROP",
10, False, DARK_GRAY)
# Delivery devices
shp_dev_hdr = rect(s11, 8.55, 0.88, 4.55, 0.42, DARK_BLUE, radius=True)
shape_text(shp_dev_hdr, "O₂ DELIVERY DEVICES", 12, True, WHITE)
devices = [
("Nasal cannula", "1–6 L/min", "24–44%", MED_BLUE),
("Simple face mask", "6–10 L/min", "40–60%", MED_BLUE),
("Non-rebreather mask", "10–15 L/min", "80–100%", ORANGE),
("HFNC", "Up to 60 L/min", "Up to 100%", TEAL),
("CPAP", "FiO₂ titrated", "Varies", GREEN),
("BiPAP / NIV", "FiO₂ titrated", "Varies", GREEN),
("Endotracheal + MV", "FiO₂ 21–100%", "Titrated", RED),
("Hyperbaric O₂ (HBO)", "2–3 ATA chamber", "100% at pressure", PURPLE),
]
for i, (dev, flow, fio2, tc) in enumerate(devices):
y = 1.34 + i * 0.62
bg_d = LIGHT_BLUE if i % 2 == 0 else WHITE
sh = rect(s11, 8.55, y, 4.55, 0.58, bg_d, tc, Pt(0.5))
tb(s11, 8.62, y+0.05, 1.85, 0.48, dev, 10, True, tc)
tb(s11, 10.5, y+0.05, 1.1, 0.48, flow, 9, False, MID_GRAY)
tb(s11, 11.65, y+0.05, 1.38, 0.48, fio2, 9, True, DARK_GRAY)
# HFNC + ROX note
shp_rox = rect(s11, 8.55, 6.35, 4.55, 0.62, TEAL_LIGHT, TEAL, Pt(1.5), radius=True)
tb(s11, 8.63, 6.4, 4.38, 0.52,
"ROX Index = (SpO₂/FiO₂) / RR\n"
"≥4.88 at 12h = HFNC success | <3.85 = high failure risk → consider intubation",
9.5, False, DARK_GRAY)
# UK-ROX note
shp_ukr = rect(s11, 0.22, 5.05, 8.2, 1.2, WHITE, MED_BLUE, Pt(2), radius=True)
tb(s11, 0.32, 5.1, 8.0, 0.4, "UK-ROX Trial (JAMA, August 2025 — PMID 40501321)", 11, True, MED_BLUE)
tb(s11, 0.32, 5.52, 8.0, 0.65,
"Conservative O₂ (SpO₂ 90–94%) vs standard care in mechanically ventilated ICU patients — large multicenter RCT. "
"Conservative targets shown to be safe + potentially beneficial. Supported by OXY-BREATHES Meta-analysis "
"(Crit Care Med May 2026 — PMID 41661051).",
10, False, DARK_GRAY)
# ══════════════════════════════════════════════════════════════
# SLIDE 12 — ARDS + SPECIAL CONDITIONS
# ══════════════════════════════════════════════════════════════
s12 = prs.slides.add_slide(blank)
rect(s12, 0, 0, 13.333, 7.5, LIGHT_GRAY)
header(s12, "ARDS BERLIN DEFINITION + SPECIAL CONDITIONS", "Tintinalli's EM Ch.29B | Harrison's 22E")
footer(s12)
# ARDS Berlin table
shp_ards_hdr = rect(s12, 0.22, 0.88, 6.2, 0.42, DARK_BLUE, radius=True)
shape_text(shp_ards_hdr, "ARDS — BERLIN DEFINITION (2012)", 12, True, WHITE)
ards_hdr2 = ["Severity", "P/F Ratio", "PEEP", "Mortality"]
ards_cw = [1.5, 2.1, 1.2, 1.3]
ards_cx = [0.22, 1.74, 3.86, 5.08]
for j, (h, cw, cx) in enumerate(zip(ards_hdr2, ards_cw, ards_cx)):
sh = rect(s12, cx, 1.34, cw-0.04, 0.38, NAVY)
shape_text(sh, h, 10.5, True, WHITE)
ards_data = [
("Mild", "200–300 mmHg\n(+ PEEP ≥5)", "≥5 cmH₂O", "~27%", ORANGE_LIGHT, ORANGE),
("Moderate", "100–200 mmHg\n(+ PEEP ≥5)", "≥5 cmH₂O", "~32%", RED_LIGHT, RED),
("Severe", "≤100 mmHg\n(+ PEEP ≥5)", "≥5 cmH₂O", "~45%", RED_LIGHT, RED),
]
for i, (sev, pf, peep, mort, bg, tc) in enumerate(ards_data):
y = 1.76 + i * 0.72
for j, (cell, cw, cx) in enumerate(zip([sev, pf, peep, mort], ards_cw, ards_cx)):
cbg = bg if j != 0 else (LIGHT_BLUE if i % 2 == 0 else WHITE)
ctc = tc if j == 1 else DARK_GRAY
sh = rect(s12, cx, y, cw-0.04, 0.68, cbg, MID_GRAY, Pt(0.3))
tb(s12, cx+0.06, y+0.06, cw-0.14, 0.56, cell, 10, j == 0 or j == 3, ctc)
# ARDS management
shp_ards_mg = rect(s12, 0.22, 3.95, 6.2, 2.98, WHITE, RED, Pt(2), radius=True)
tb(s12, 0.32, 4.0, 6.0, 0.42, "LUNG-PROTECTIVE VENTILATION (ARDSNet)", 11, True, RED)
tb(s12, 0.32, 4.45, 6.0, 2.4,
"• Tidal volume: 4–8 mL/kg IBW (start 6 mL/kg)\n"
"• Plateau pressure: < 30 cmH₂O\n"
" (↓ by 1 mL/kg if exceeded → min 4 mL/kg)\n"
"• Permissive hypercapnia: pH ≥ 7.20\n"
"• SpO₂ target: 88–95% OR PaO₂ 55–80 mmHg\n"
"• PEEP: use ARDS Network PEEP/FiO₂ table\n"
"• RR: up to 30–35/min if restrictive physiology\n"
"• AVOID hyperoxia (do NOT target SpO₂ 98–100%)\n"
"• Auto-PEEP: disconnect 15–20 sec if hypotension",
10.5, False, DARK_GRAY)
# Special conditions column
special = [
("CO POISONING", RED,
"• SpO₂ FALSELY NORMAL (pulse ox)\n"
"• Dx: Co-oximetry (ABG) → COHb level\n"
"• 100% O₂ via NRM (COHb t½: 5h → 90 min)\n"
"• Severe / neuro signs / pregnancy: HBO\n"
"• Cherry-red skin ≠ cyanosis"),
("METHEMOGLOBINAEMIA", ORANGE,
"• SpO₂ reads ~85% regardless\n"
"• Chocolate-brown blood (visual)\n"
"• PaO₂ may be NORMAL on ABG\n"
"• Treat: Methylene blue 1–2 mg/kg IV\n"
"• Fails in G6PD → Ascorbic acid"),
("TENSION PNEUMOTHORAX", PURPLE,
"• Clinical diagnosis — DO NOT wait for CXR\n"
"• Tracheal deviation + absent BS + ↓BP\n"
"• Needle decompression: 2nd ICS MCL\n"
"• Then chest drain\n"
"• Shunt-like hypoxia: O₂ may not correct"),
("CYANIDE TOXICITY", DARK_BLUE,
"• High SvO₂ + lactic acidosis (paradox)\n"
"• Fire victims / industrial exposure\n"
"• PaO₂ normal; cells cannot use O₂\n"
"• Treat: Hydroxocobalamin 5g IV\n"
" OR Sodium thiosulfate + sodium nitrite"),
]
for i, (title, tc, body) in enumerate(special):
c, r = i % 2, i // 2
x = 6.7 + c * 3.27
y = 0.88 + r * 3.15
s = rect(s12, x, y, 3.12, 2.98, WHITE, tc, Pt(2), radius=True)
tb(s12, x+0.1, y+0.06, 2.92, 0.4, title, 11, True, tc)
tb(s12, x+0.1, y+0.5, 2.92, 2.38, body, 10, False, DARK_GRAY)
# ══════════════════════════════════════════════════════════════
# SLIDE 13 — HIGH-YIELD EXAM POINTS + REFERENCES
# ══════════════════════════════════════════════════════════════
s13 = prs.slides.add_slide(blank)
rect(s13, 0, 0, 13.333, 7.5, NAVY)
rect(s13, 0, 1.95, 13.333, 0.06, MED_BLUE)
tb(s13, 0.3, 0.12, 12.7, 0.68, "HIGH-YIELD EXAM POINTS & REFERENCES",
24, True, WHITE, PP_ALIGN.CENTER)
hy_pts = [
("Hypoxia ≠ Hypoxaemia — one can occur without the other (Tintinalli's EM Ch.62 + Harrison's 22E Ch.42)", MED_BLUE),
("SHUNT = only mechanism where 100% O₂ FAILS to correct hypoxaemia", RED),
("HYPOVENTILATION = only mechanism with NORMAL A-a gradient + raised PaCO₂", TEAL),
("CO poisoning: SpO₂ FALSELY NORMAL; cherry-red skin (NOT cyanosis) — use co-oximetry", RED),
("MetHb: SpO₂ reads ~85% regardless; chocolate-brown blood; treat with methylene blue", ORANGE),
("HIF-1 = master transcription factor governing hypoxia response (Harrison's 22E viva)", MED_BLUE),
("Critical thresholds: compensatory mechanisms activate at PaO₂ = 60 mmHg; fail at <20 mmHg", TEAL),
("Dark skin: pulse oximetry OVERESTIMATES SpO₂ → occult hypoxaemia risk (Martin et al. 2024)", PURPLE),
("VBG NOT recommended for assessing hypoxaemia degree (SFMU/FICS 2026, Grade 1)", ORANGE),
("ARDS target: SpO₂ 88–95% or PaO₂ 55–80 mmHg — NOT 98–100% (avoid hyperoxia)", RED),
("ROX Index ≥4.88 at 12h = HFNC likely success; <3.85 = failure risk → consider intubation", TEAL),
("UK-ROX (JAMA 2025): Conservative O₂ (90–94%) safe + beneficial in ICU ventilated patients", GREEN),
]
for i, (pt, c) in enumerate(hy_pts):
col, row = i % 2, i // 2
x = 0.22 + col * 6.55
y = 2.1 + row * 0.52
bg = RGBColor(0x12, 0x3A, 0x70) if row % 2 == 0 else RGBColor(0x0A, 0x29, 0x5C)
sh = rect(s13, x, y, 6.4, 0.47, bg, c, Pt(0.7))
tb(s13, x+0.1, y+0.04, 0.3, 0.38, "★", 11, True, c, PP_ALIGN.CENTER)
tb(s13, x+0.42, y+0.04, 5.88, 0.38, pt, 9.5, False, WHITE)
# References
tb(s13, 0.3, 5.28, 12.7, 0.35, "REFERENCES", 12, True, LIGHT_BLUE)
refs_s13 = [
("Harrison's Principles of Internal Medicine 22E (2025)", "Ch.42: Hypoxia, Cyanosis — HIF-1, types of hypoxia, cyanosis, A-a gradient, responses"),
("Tintinalli's Emergency Medicine", "Ch.62: CaO₂/DO₂ formulae; 5 mechanisms; A-a gradient; pulse oximetry; treatment targets"),
("Tintinalli's EM Ch.29B", "ARDS Berlin definition; lung-protective ventilation; PEEP table; SpO₂ target 88–95%"),
("SFMU/FICS 2026 (Ann Intensive Care Jan 2026)", "VBG not for hypoxaemia; SpO₂ >96% excludes PaO₂<60; Type I vs II RF definition"),
("UK-ROX RCT — JAMA Aug 2025 (PMID 40501321)", "Conservative O₂ (90–94%) safe in ICU MV patients — multicenter RCT"),
("OXY-BREATHES — Crit Care Med May 2026 (PMID 41661051)", "Meta-analysis: conservative O₂ targets reduce hyperoxia exposure — SR + MA"),
("Martin et al. — Br J Anaesth 2024 (PMID 38368234)", "Skin tone and pulse oximetry accuracy: overestimation in darker skin — SR + MA"),
("Geary et al. — J Emerg Med 2026 (PMID 42407213)", "HFNC for apneic oxygenation during RSI in ED — systematic review"),
]
for i, (src, desc) in enumerate(refs_s13):
y_r = 5.65 + i * 0.22
bg_r = RGBColor(0x12, 0x37, 0x6B) if i % 2 == 0 else NAVY
sh = rect(s13, 0.22, y_r, 12.88, 0.2, bg_r)
tb(s13, 0.3, y_r+0.02, 4.6, 0.18, src, 8, True, LIGHT_BLUE)
tb(s13, 4.95, y_r+0.02, 8.0, 0.18, desc, 8, False, WHITE)
# ══════════════════════════════════════════════════════════════
# SAVE
# ══════════════════════════════════════════════════════════════
output_path = "/tmp/workspace/acute-hypoxia-ppt/Acute_Hypoxia_EM_Teaching.pptx"
buf = BytesIO()
prs.save(buf)
with open(output_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {output_path}")
print(f"Slides: {len(prs.slides)}")
cd /tmp/workspace/acute-hypoxia-ppt && python build_hypoxia_ppt.py 2>&1
ls -lh /tmp/workspace/acute-hypoxia-ppt/
Acute Hypoxia EM Teaching
Presentation · PPTX
| # | Slide Title | Key Content |
|---|---|---|
| 1 | Title Slide | Navy design, full source attribution |
| 2 | Definitions — Key Exam Distinction | Hypoxia vs Hypoxemia (NOT interchangeable); 4 classic examples: Polycythaemia, Anaemia, CO poisoning, Cyanide toxicity |
| 3 | Oxygen Physiology Formulae | CaO₂ = 0.0031×PaO₂ + 1.38×Hb×SaO₂; DO₂ = CaO₂×CO; A-a gradient formulae; P/F ratio + ARDS thresholds |
| 4 | 5 Mechanisms of Hypoxaemia | Full colour-coded table: A-a gradient + O₂ response + PaCO₂ + causes for each mechanism; exam trap banner |
| 5 | Types of Hypoxia (Harrison's) | 6 types: Respiratory, Anaemic, Circulatory, CO, Histotoxic (cyanide), High altitude |
| 6 | Physiological Responses to Hypoxia | 6 blocks: Cellular (Pasteur effect), HIF-1, Vascular (HPV), Cardiovascular, CNS effects, Compensatory mechanisms |
| 7 | Clinical Features & Cyanosis | Severity table (Mild→Critical); Central vs Peripheral cyanosis; dark skin; CO cherry-red; MetHb; new 2024 evidence |
| 8 | Pulse Oximetry Limitations | SFMU/FICS 2026 SpO₂ thresholds; full limitations table: CO, MetHb, dark skin, shock; when to order ABG |
| 9 | Master Diagnostic Algorithm | Step-by-step flowchart: SpO₂ → danger? → ABG → A-a gradient → O₂ response → diagnosis |
| 10 | ABG Interpretation Framework | 6-step structured approach: PaO₂ → PaCO₂ → A-a → O₂ trial → co-oximetry → lactate |
| 11 | O₂ Targets & Delivery Devices | 8 patient group targets; danger of hyperoxia; 8 devices with flows/FiO₂; ROX Index; UK-ROX Trial (JAMA 2025) |
| 12 | ARDS Berlin + Special Conditions | Berlin severity table; lung-protective ventilation settings; CO, MetHb, Tension PTX, Cyanide management |
| 13 | High-Yield Exam Points + References | 12 starred exam facts; 8 cited references with PMIDs |
DESCRIBE THE FUNCTIONAL ANATOMY OF MUSCLE OF RESPRATION ,EXPLAIN EXTERNAL AND INTERNAL RESPIRATION ,PATHOPHYSIOLOGY OF HYPOXAEMIA AND MANAGEMENT OF HYPOXAEMIA MAKE EXAM ORIENTED POSTGRADUATE EMERGENCY MEDICINE TINTILATY REFEERENCE AND HARRISON INTERNAL MEDICINE REFERENCE
"hypoxaemia" AND "management" AND "emergency" AND "oxygen"
"acute hypoxaemia" AND "HFNC" OR "high flow nasal" AND "NIV" treatment
| Feature | Detail |
|---|---|
| Origin | Costal portion: ribs around bottom of thoracic cage; Crural portion: ligaments along vertebrae |
| Insertion | Central tendon (also the inferior part of the pericardium) |
| Action | Contracts downward like a piston → increases vertical diameter of thorax |
| Excursion | 1.5 cm (quiet breathing) → up to 7 cm (deep inspiration) |
| Innervation | Phrenic nerve (C3, C4, C5) — "C3, 4, 5 keeps the diaphragm alive" |
| Parts | Costal + Crural + Central tendon |
| Clinical pearl | Costal fibres increase intra-abdominal pressure during vomiting; crural fibres remain relaxed to allow gastric-esophageal content passage |
| Muscle | Action |
|---|---|
| Sternocleidomastoid | Elevates the sternum and upper thoracic cage |
| Scalenes (anterior, middle, posterior) | Elevate and fix the first two ribs |
| Serratus anterior | Elevates ribs during forceful inspiration |
| Pectoralis minor | Can elevate ribs when arms are fixed |
| Trapezius | Assists with shoulder girdle stabilisation |
| Muscle | Action |
|---|---|
| Internal intercostals | Run obliquely downward and posteriorly → pull rib cage downward → reduce thoracic volume |
| Anterior abdominal wall muscles (rectus abdominis, external and internal obliques, transversus abdominis) | Pull rib cage downward and inward; increase intra-abdominal pressure → push diaphragm upward |
| Phase | Primary Muscles | Accessory/Forced |
|---|---|---|
| Inspiration | Diaphragm (75%), External intercostals | SCM, scalenes, serratus anterior, laryngeal abductors |
| Expiration (quiet) | Passive (elastic recoil) | — |
| Expiration (forced) | Internal intercostals | Rectus abdominis, external/internal obliques, transversus abdominis |
Exam Definition Pair — Frequently Asked
Atmosphere → Conducting Airways → Alveoli
↓ (ventilation)
Alveolar O₂ diffuses across alveolar-capillary membrane → Pulmonary capillary blood
↓ (pulmonary gas exchange)
O₂ bound to Hb in RBC → carried in systemic arterial blood
↓
O₂ released to tissues; CO₂ diffuses from tissues → venous blood → lungs → exhaled
PAO₂ = FiO₂ × (PB − PH₂O) − PaCO₂ / RQ
= FiO₂ × (760 − 47) − PaCO₂ / 0.8
| FiO₂ | Expected PaO₂ (mmHg) |
|---|---|
| 0.21 (Room air) | ~105 |
| 0.40 | ~200 |
| 0.60 | ~300 |
| 0.80 | ~400 |
| 1.0 | ~500 |
| Feature | External Respiration | Internal Respiration |
|---|---|---|
| Location | Alveoli ↔ Pulmonary capillaries | Cells ↔ Mitochondria |
| O₂ direction | Alveolus → Blood | Blood → Cells/Mitochondria |
| CO₂ direction | Blood → Alveolus | Mitochondria → Blood |
| Driving force | PO₂ gradient (alveolar PO₂ > capillary PO₂) | PO₂ gradient (capillary PO₂ > tissue PO₂) |
| Organ | Lungs | All metabolically active tissues |
| Process | Ventilation + Diffusion | Oxidative phosphorylation (Krebs cycle + ETC) |
| Failure → | Hypoxaemia (↓ PaO₂) | Tissue hypoxia (↑ lactate, organ failure) |
| Measured by | PaO₂, SpO₂, A-a gradient | Lactate, ScvO₂, SvO₂, base deficit |
Definition: PaO₂ < 60 mmHg on room air OR SpO₂ < 90% on room air
| PaO₂ (on FiO₂0.4) | P/F Ratio | Shunt (Qs/Qt) | Severity |
|---|---|---|---|
| 240 | 600 | 5% | None |
| 120 | 300 | 10% | Minimal |
| 100 | 250 | 15% | Mild |
| 80 | 200 | 20% | Moderate |
| 60 | 150 | 30% | Severe* |
| 40 | 100 | 40% | Very severe* |
| Mechanism | A-a Gradient | O₂ Response | PaCO₂ | Corrects with O₂? |
|---|---|---|---|---|
| Hypoventilation | NORMAL | Yes | ↑ RAISED | Yes |
| V/Q Mismatch | ELEVATED | Yes | Normal/↓ | Yes |
| Diffusion Impairment | ELEVATED | Yes | Normal | Yes |
| Right-to-Left Shunt | ELEVATED | FAILS | Normal/↓ | NO |
| Low FiO₂ | NORMAL | Yes | Normal/↓ | Yes |
A — Airway: Open and maintain. Intubate if cannot protect.
B — Breathing: SpO₂ continuous. ABG (if CO/MetHb suspected: co-oximetry).
C — Circulation: IV access, cardiac monitor. Address shock → DO₂ = CaO₂ × CO.
D — Disability: GCS, pupils. Hypoxia → confusion/coma.
E — Exposure + Environment: History, CXR, ECG, point-of-care USS (POCUS BLUE protocol).
| Patient Group | SpO₂ Target | Rationale |
|---|---|---|
| General acute illness | 94–98% | Avoid hyperoxia |
| COPD / hypercapnia risk | 88–92% | Prevent Haldane effect hypercapnia |
| ARDS / ICU ventilated | 88–95% | UK-ROX RCT (JAMA 2025, PMID 40501321) |
| AMI/STEMI (no hypoxia) | Do NOT give O₂ if SpO₂ ≥94% | Hyperoxia → coronary vasoconstriction |
| Stroke (no hypoxia) | Do NOT give O₂ if SpO₂ ≥94% | Hyperoxia worsens outcomes |
| CO Poisoning | 100% O₂ (NRM) ± HBO | Displace COHb; t½ falls 5h → 90 min |
| Post-ROSC | 94–98% | Avoid hyperoxia/reperfusion injury |
SFMU/FICS 2026 (Grade 1 evidence): VBG should NOT be used to assess the degree of hypoxaemia. SpO₂ >96% (room air) makes PaO₂ < 60 mmHg unlikely.
| Device | Flow Rate | FiO₂ Delivered | Clinical Use |
|---|---|---|---|
| Nasal cannula | 1–6 L/min | 24–44% | Mild hypoxia; COPD maintenance |
| Simple face mask | 6–10 L/min | 40–60% | Moderate hypoxia |
| Non-rebreather mask (NRM) | 10–15 L/min | 80–100% | Severe hypoxia; CO poisoning |
| HFNC | Up to 60 L/min | Up to 100% | Acute hypoxic RF; HFNC > NRM for O₂ delivery; also apnoeic oxygenation during RSI |
| CPAP | FiO₂ titrated | Variable | Cardiogenic pulmonary oedema; OSA |
| BiPAP / NIV | FiO₂ titrated | Variable | COPD exacerbation; Type II RF; cardiogenic oedema |
| Invasive MV (ETT) | FiO₂ 21–100% | Precisely titrated | Failure of non-invasive measures; airway protection |
| HBO | 2–3 ATA | 100% at pressure | CO poisoning; decompression sickness; gas gangrene |
| Mechanism | Specific ED Treatment |
|---|---|
| V/Q Mismatch (COPD) | Bronchodilators (salbutamol + ipratropium), corticosteroids, BiPAP if Type II RF, LTOT if PaO₂ ≤55 mmHg |
| V/Q Mismatch (PE) | Anticoagulation; thrombolysis if massive PE with shock/cardiac arrest; catheter-directed therapy |
| Shunt (ARDS) | PEEP (recruits collapsed alveoli), lung-protective ventilation, prone positioning |
| Shunt (Tension PTX) | Immediate needle decompression (2nd ICS MCL) → chest drain |
| Shunt (Cardiogenic pulmonary oedema) | CPAP/BiPAP, furosemide, GTN, treat underlying cause |
| Hypoventilation (opioids) | Naloxone 0.4–2 mg IV/IM/intranasal; supportive ventilation |
| CO Poisoning | 100% O₂ via NRM (t½ COHb: 5h RA → 90 min 100% O₂); HBO if severe/neurological/pregnant |
| MetHb | Methylene blue 1–2 mg/kg IV over 5 min; ascorbic acid if G6PD deficient |
| Cyanide toxicity | Hydroxocobalamin 5g IV; sodium thiosulphate + sodium nitrite (as alternative) |
| # | Key Point | Source |
|---|---|---|
| 1 | Diaphragm = 75% of quiet inspiratory volume change; excursion 1.5–7 cm | Ganong's 26E p.624 |
| 2 | C3,4,5 keeps diaphragm alive — cord transection below C5 survivable | Ganong's 26E p.625 |
| 3 | External intercostals + diaphragm = either alone can maintain quiet ventilation | Ganong's 26E p.625 |
| 4 | Quiet expiration is PASSIVE (elastic recoil); forced expiration uses internal intercostals + abdominals | Tintinalli's EM Ch.127 |
| 5 | CO₂ is 20× more soluble than O₂ → pulmonary oedema affects O₂ diffusion more than CO₂ | Tintinalli's EM Ch.16 |
| 6 | SHUNT = ONLY mechanism where 100% O₂ FAILS to correct hypoxaemia | Tintinalli's EM Ch.16 |
| 7 | HYPOVENTILATION = ONLY mechanism with NORMAL A-a gradient + raised PaCO₂ | Harrison's 22E Ch.42 |
| 8 | V/Q mismatch = most common cause; corrects with modest O₂ supplementation | Harrison's 22E COPD chapter |
| 9 | HIF-1 = master transcription factor; upregulates EPO, VEGF, glycolytic enzymes | Harrison's 22E Ch.42 |
| 10 | VBG NOT recommended for assessing degree of hypoxaemia (SFMU/FICS 2026, Grade 1) | SFMU/FICS 2026 |
| 11 | UK-ROX Trial (JAMA 2025): Conservative O₂ (90–94%) safe in ICU ventilated patients | PMID 40501321 |
| 12 | ROX Index <3.85 at 12h = HFNC failure risk → consider intubation | PMID 37605238 |
| 13 | HFNC non-inferior to NIV in acute hypoxaemic RF (RENOVATE Trial JAMA 2025) | PMID 39657981 |
| 14 | CO poisoning: SpO₂ falsely NORMAL; cherry-red skin (NOT cyanosis); use co-oximetry | Tintinalli's EM Ch.222 |
| 15 | Cyanide: HIGH SvO₂ + lactic acidosis (paradox); cells cannot use O₂ | Harrison's 22E Ch.42 |
ATMOSPHERE (FiO₂ = 0.21)
↓ VENTILATION (External Respiration - Phase 1)
ALVEOLUS (PAO₂ ~100 mmHg)
↓ DIFFUSION (External Respiration - Phase 2)
PULMONARY CAPILLARY (PaO₂ ~95 mmHg)
↓ O₂ bound to Hb (1.38×Hb×SaO₂) + dissolved (0.0031×PaO₂)
SYSTEMIC ARTERIAL BLOOD (CaO₂ ~20 mL/dL)
↓ DELIVERY: DO₂ = CaO₂ × CO (Normal ~1000 mL/min)
CAPILLARY BED (PO₂ drops 95 → 40 mmHg)
↓ TISSUE GAS EXCHANGE (Internal Respiration)
MITOCHONDRIA → ATP via Krebs + ETC (PO₂ ~5 mmHg)
↓ CO₂ produced → venous blood → lungs → exhaled
VENOUS BLOOD (PvO₂ ~40 mmHg; SvO₂ ~75%)
Search for and compile images of respiratory muscles and alveolar gas exchange for visual learning