Give answer and explain it
CaO₂ = (Hb × 1.34 × SaO₂) + (PaO₂ × 0.003)
10 g × 1.34 mL/g × 0.97 = 13.0 mL
100 × 0.003 = 0.3 mL (negligible)
| Option | Value | Reasoning |
|---|---|---|
| A. 20.7 mL | Too high | This is the normal value when Hb = 15 g/dL (15 × 1.34 × 0.97 ≈ 19.5 + dissolved ≈ 20.7 mL) |
| B. 13 mL | Correct | Hb 10 g/dL × 1.34 × 0.97 ≈ 13 mL |
| C. 10 mL | Too low | Would imply each gram of Hb only carries 1 mL O₂ - incorrect coefficient |
| D. 7.4 mL | Too low | Roughly corresponds to Hb ~6 g/dL, not 10 g/dL |
Create a quick reference PDF for oxygen content calculations
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "workspace ready"
mkdir -p /tmp/workspace/oxygen-content-pdf && cat > /tmp/workspace/oxygen-content-pdf/build_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.units import cm, mm from reportlab.platypus import ( SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether ) from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY from reportlab.platypus import FrameBreak from reportlab.lib.colors import HexColor # ── Colour palette ────────────────────────────────────────────────────────── DARK_BLUE = HexColor("#1a3a5c") MED_BLUE = HexColor("#2e6da4") LIGHT_BLUE = HexColor("#ddeeff") ACCENT = HexColor("#e8f4fd") RED = HexColor("#c0392b") GREEN = HexColor("#1a7a4a") ORANGE = HexColor("#d35400") GREY_LIGHT = HexColor("#f5f5f5") GREY_MED = HexColor("#cccccc") WHITE = colors.white BLACK = colors.black # ── Document ───────────────────────────────────────────────────────────────── OUTPUT = "/tmp/workspace/oxygen-content-pdf/Oxygen_Content_Quick_Reference.pdf" doc = SimpleDocTemplate( OUTPUT, pagesize=A4, leftMargin=1.8*cm, rightMargin=1.8*cm, topMargin=1.5*cm, bottomMargin=1.5*cm ) # ── Base styles ────────────────────────────────────────────────────────────── base = getSampleStyleSheet() def S(name, **kw): ps = ParagraphStyle(name, **kw) return ps title_style = S("Title", fontName="Helvetica-Bold", fontSize=20, textColor=WHITE, alignment=TA_CENTER, spaceAfter=4) subtitle_style = S("Subtitle", fontName="Helvetica", fontSize=11, textColor=LIGHT_BLUE, alignment=TA_CENTER, spaceAfter=2) section_hdr = S("SectionHdr", fontName="Helvetica-Bold", fontSize=12, textColor=WHITE, alignment=TA_LEFT, spaceAfter=2, spaceBefore=2) body = S("Body", fontName="Helvetica", fontSize=9.5, textColor=BLACK, leading=14, spaceAfter=4) body_bold = S("BodyBold", fontName="Helvetica-Bold", fontSize=9.5, textColor=DARK_BLUE, leading=14, spaceAfter=4) small = S("Small", fontName="Helvetica", fontSize=8.5, textColor=colors.grey, leading=12, spaceAfter=2) formula_style = S("Formula", fontName="Helvetica-Bold", fontSize=11, textColor=DARK_BLUE, alignment=TA_CENTER, spaceAfter=6, spaceBefore=6) note_style = S("Note", fontName="Helvetica-Oblique", fontSize=8.5, textColor=HexColor("#555555"), leading=12, spaceAfter=2) bullet_style = S("Bullet", fontName="Helvetica", fontSize=9.5, textColor=BLACK, leading=14, spaceAfter=3, leftIndent=12, bulletIndent=0) # ── Helper: section header row (full-width blue band) ──────────────────────── def section_header(text): t = Table([[Paragraph(text, section_hdr)]], colWidths=[17.4*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), DARK_BLUE), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 8), ("RIGHTPADDING", (0,0), (-1,-1), 8), ("BOX", (0,0), (-1,-1), 0.5, MED_BLUE), ])) return t # ── Helper: formula box ─────────────────────────────────────────────────────── def formula_box(lines): rows = [[Paragraph(l, formula_style)] for l in lines] t = Table(rows, colWidths=[17.4*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), ACCENT), ("BOX", (0,0), (-1,-1), 1.5, MED_BLUE), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("LEFTPADDING", (0,0), (-1,-1), 10), ("RIGHTPADDING", (0,0), (-1,-1), 10), ])) return t # ── TITLE BANNER ───────────────────────────────────────────────────────────── banner_data = [[ Paragraph("OXYGEN CONTENT OF BLOOD", title_style), Paragraph("Quick Reference Guide", subtitle_style), Paragraph("Physiology • Anaesthesia • Critical Care • Emergency Medicine", subtitle_style), ]] banner = Table([ [Paragraph("OXYGEN CONTENT OF BLOOD", title_style)], [Paragraph("Quick Reference Guide", subtitle_style)], [Paragraph("Physiology • Anaesthesia • Critical Care • Emergency Medicine", subtitle_style)], ], colWidths=[17.4*cm]) banner.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), DARK_BLUE), ("BOX", (0,0), (-1,-1), 2, MED_BLUE), ("TOPPADDING", (0,0), (-1,-1), 10), ("BOTTOMPADDING", (0,0), (-1,-1), 10), ("LEFTPADDING", (0,0), (-1,-1), 8), ("RIGHTPADDING", (0,0), (-1,-1), 8), ])) # ═══════════════════════════════════════════════════════════════════════════════ # BUILD STORY # ═══════════════════════════════════════════════════════════════════════════════ story = [] story.append(banner) story.append(Spacer(1, 0.35*cm)) # ── SECTION 1: CORE FORMULA ────────────────────────────────────────────────── story.append(section_header("1. CORE FORMULA — Arterial Oxygen Content (CaO₂)")) story.append(Spacer(1, 0.2*cm)) story.append(formula_box([ "CaO₂ = (Hb × 1.34 × SaO₂) + (PaO₂ × 0.003)", "Units: mL O₂ per 100 mL blood (mL/dL)" ])) story.append(Spacer(1, 0.2*cm)) # Variables table var_data = [ [Paragraph("<b>Variable</b>", body_bold), Paragraph("<b>Meaning</b>", body_bold), Paragraph("<b>Normal Value</b>", body_bold), Paragraph("<b>Units</b>", body_bold)], [Paragraph("Hb", body), Paragraph("Haemoglobin concentration", body), Paragraph("15 (male) / 13 (female)", body), Paragraph("g/dL", body)], [Paragraph("1.34", body), Paragraph("O₂-binding capacity of Hb (Hüfner's constant)", body), Paragraph("Fixed constant", body), Paragraph("mL O₂/g Hb", body)], [Paragraph("SaO₂", body), Paragraph("Arterial O₂ saturation", body), Paragraph("0.97 (97%)", body), Paragraph("fraction (0–1)", body)], [Paragraph("0.003", body), Paragraph("O₂ solubility coefficient in plasma", body), Paragraph("Fixed constant", body), Paragraph("mL O₂/dL/mmHg", body)], [Paragraph("PaO₂", body), Paragraph("Partial pressure of arterial O₂", body), Paragraph("80–100", body), Paragraph("mmHg", body)], ] var_table = Table(var_data, colWidths=[2.2*cm, 6.5*cm, 4.5*cm, 4.2*cm]) var_table.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), MED_BLUE), ("TEXTCOLOR", (0,0), (-1,0), WHITE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREY_LIGHT]), ("BOX", (0,0), (-1,-1), 0.5, GREY_MED), ("INNERGRID", (0,0), (-1,-1), 0.3, GREY_MED), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 6), ("RIGHTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ])) story.append(var_table) story.append(Spacer(1, 0.3*cm)) # Note on Hüfner's constant story.append(Paragraph( "★ Hüfner's constant: Theoretical maximum is 1.39 mL/g; in vivo value used clinically is <b>1.34</b> " "(accounts for methaemoglobin and other minor variants).", note_style)) story.append(Spacer(1, 0.3*cm)) # ── SECTION 2: VENOUS & MIXED VENOUS ───────────────────────────────────────── story.append(section_header("2. VENOUS OXYGEN CONTENT (CvO₂)")) story.append(Spacer(1, 0.2*cm)) story.append(formula_box([ "CvO₂ = (Hb × 1.34 × SvO₂) + (PvO₂ × 0.003)", ])) story.append(Spacer(1, 0.15*cm)) venous_data = [ [Paragraph("<b>Parameter</b>", body_bold), Paragraph("<b>Normal Range</b>", body_bold), Paragraph("<b>Clinical Significance</b>", body_bold)], [Paragraph("CvO₂", body), Paragraph("12–15 mL/dL", body), Paragraph("Mixed venous O₂ content from PA catheter", body)], [Paragraph("SvO₂", body), Paragraph("70–75%", body), Paragraph("Mixed venous saturation; ↓ = ↑ O₂ extraction or ↓ delivery", body)], [Paragraph("PvO₂", body), Paragraph("35–45 mmHg", body), Paragraph("Partial pressure in mixed venous blood", body)], ] v_table = Table(venous_data, colWidths=[2.5*cm, 4.2*cm, 10.7*cm]) v_table.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), MED_BLUE), ("TEXTCOLOR", (0,0), (-1,0), WHITE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREY_LIGHT]), ("BOX", (0,0), (-1,-1), 0.5, GREY_MED), ("INNERGRID", (0,0), (-1,-1), 0.3, GREY_MED), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 6), ("RIGHTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ])) story.append(v_table) story.append(Spacer(1, 0.3*cm)) # ── SECTION 3: OXYGEN DELIVERY & FICK ──────────────────────────────────────── story.append(section_header("3. OXYGEN DELIVERY (DO₂) & FICK PRINCIPLE")) story.append(Spacer(1, 0.2*cm)) left_col = [ formula_box(["DO₂ = CaO₂ × CO × 10"]), Spacer(1, 0.15*cm), Paragraph("<b>DO₂</b> = Oxygen delivery (mL/min)", body), Paragraph("<b>CO</b> = Cardiac output (L/min)", body), Paragraph("<b>×10</b> = unit conversion (dL → L)", body), Spacer(1, 0.15*cm), Paragraph("<b>Normal DO₂:</b> 950–1150 mL/min", body_bold), ] right_col = [ formula_box(["VO₂ = CO × (CaO₂ − CvO₂) × 10"]), Spacer(1, 0.15*cm), Paragraph("<b>VO₂</b> = Oxygen consumption (mL/min)", body), Paragraph("Normal VO₂: <b>200–250 mL/min</b>", body), Spacer(1, 0.15*cm), Paragraph("<b>O₂ Extraction Ratio (ERO₂):</b>", body_bold), Paragraph("ERO₂ = VO₂ / DO₂ [Normal: 20–30%]", body), ] two_col = Table( [[left_col, right_col]], colWidths=[8.5*cm, 8.9*cm] ) two_col.setStyle(TableStyle([ ("VALIGN", (0,0), (-1,-1), "TOP"), ("LEFTPADDING", (0,0), (-1,-1), 0), ("RIGHTPADDING", (0,0), (-1,-1), 4), ("TOPPADDING", (0,0), (-1,-1), 0), ("BOTTOMPADDING", (0,0), (-1,-1), 0), ])) story.append(two_col) story.append(Spacer(1, 0.3*cm)) # ── SECTION 4: WORKED EXAMPLES ──────────────────────────────────────────────── story.append(section_header("4. WORKED EXAMPLES")) story.append(Spacer(1, 0.2*cm)) ex_data = [ # Header [Paragraph("<b>Scenario</b>", body_bold), Paragraph("<b>Hb (g/dL)</b>", body_bold), Paragraph("<b>SaO₂ (%)</b>", body_bold), Paragraph("<b>PaO₂ (mmHg)</b>", body_bold), Paragraph("<b>CaO₂ (mL/dL)</b>", body_bold), Paragraph("<b>Key Point</b>", body_bold)], # Normal adult [Paragraph("Normal adult", body), Paragraph("15", body), Paragraph("97", body), Paragraph("100", body), Paragraph("15 × 1.34 × 0.97 + 0.3\n= <b>19.8 + 0.3 = 20.1</b>", body), Paragraph("Baseline reference", body)], # Anaemia Hb 10 [Paragraph("Anaemia (Hb 10)", body), Paragraph("10", body), Paragraph("97", body), Paragraph("100", body), Paragraph("10 × 1.34 × 0.97 + 0.3\n= <b>13.0 + 0.3 ≈ 13</b>", body), Paragraph("~35% ↓ vs normal", body)], # Severe anaemia [Paragraph("Severe anaemia (Hb 7)", body), Paragraph("7", body), Paragraph("97", body), Paragraph("100", body), Paragraph("7 × 1.34 × 0.97 + 0.3\n= <b>9.1 + 0.3 ≈ 9.4</b>", body), Paragraph("Transfusion threshold", body)], # Hypoxia low sat [Paragraph("Hypoxia (SaO₂ 85%)", body), Paragraph("15", body), Paragraph("85", body), Paragraph("50", body), Paragraph("15 × 1.34 × 0.85 + 0.15\n= <b>17.1 + 0.15 ≈ 17.2</b>", body), Paragraph("Low sat despite normal Hb", body)], # Hyperoxia [Paragraph("Hyperoxia (PaO₂ 500)", body), Paragraph("15", body), Paragraph("100", body), Paragraph("500", body), Paragraph("15 × 1.34 × 1.0 + 1.5\n= <b>20.1 + 1.5 = 21.6</b>", body), Paragraph("Dissolved O₂ still minor", body)], # CO poisoning [Paragraph("CO poisoning (50% COHb)", body), Paragraph("15", body), Paragraph("50", body), Paragraph("100", body), Paragraph("15 × 1.34 × 0.50 + 0.3\n= <b>10.1 + 0.3 ≈ 10.4</b>", body), Paragraph("SpO₂ may read falsely normal", body)], ] ex_table = Table(ex_data, colWidths=[3.5*cm, 1.8*cm, 1.8*cm, 2.2*cm, 4.5*cm, 3.6*cm]) ex_table.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), MED_BLUE), ("TEXTCOLOR", (0,0), (-1,0), WHITE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREY_LIGHT]), ("BOX", (0,0), (-1,-1), 0.5, GREY_MED), ("INNERGRID", (0,0), (-1,-1), 0.3, GREY_MED), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 5), ("RIGHTPADDING", (0,0), (-1,-1), 5), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), # Highlight the Hb 10 row (exam question row) ("BACKGROUND", (0,2), (-1,2), HexColor("#fff3cd")), ("TEXTCOLOR", (4,2), (4,2), RED), ])) story.append(ex_table) story.append(Spacer(1, 0.15*cm)) story.append(Paragraph("★ Yellow row = the MCQ scenario (Hb 10 g/dL) — answer is ~13 mL/100 mL blood.", note_style)) story.append(Spacer(1, 0.3*cm)) # ── SECTION 5: NORMAL VALUES SUMMARY ───────────────────────────────────────── story.append(section_header("5. NORMAL VALUES AT A GLANCE")) story.append(Spacer(1, 0.2*cm)) norm_data = [ [Paragraph("<b>Parameter</b>", body_bold), Paragraph("<b>Arterial</b>", body_bold), Paragraph("<b>Mixed Venous</b>", body_bold), Paragraph("<b>Unit</b>", body_bold)], [Paragraph("O₂ content (C)", body), Paragraph("18–21", body), Paragraph("12–15", body), Paragraph("mL/dL", body)], [Paragraph("O₂ saturation (S)", body), Paragraph("97%", body), Paragraph("70–75%", body), Paragraph("%", body)], [Paragraph("PO₂", body), Paragraph("80–100", body), Paragraph("35–45", body), Paragraph("mmHg", body)], [Paragraph("Haemoglobin (Hb)", body), Paragraph("13–17", body), Paragraph("—", body), Paragraph("g/dL", body)], [Paragraph("Hüfner's constant", body), Paragraph("1.34", body), Paragraph("1.34", body), Paragraph("mL O₂/g Hb", body)], [Paragraph("O₂ solubility", body), Paragraph("0.003", body), Paragraph("0.003", body), Paragraph("mL/dL/mmHg", body)], [Paragraph("DO₂", body), Paragraph("950–1150", body), Paragraph("—", body), Paragraph("mL/min", body)], [Paragraph("VO₂", body), Paragraph("200–250", body), Paragraph("—", body), Paragraph("mL/min", body)], [Paragraph("O₂ Extraction Ratio", body), Paragraph("20–30%", body), Paragraph("—", body), Paragraph("%", body)], ] norm_table = Table(norm_data, colWidths=[5.0*cm, 4.0*cm, 4.5*cm, 3.9*cm]) norm_table.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), MED_BLUE), ("TEXTCOLOR", (0,0), (-1,0), WHITE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREY_LIGHT]), ("BOX", (0,0), (-1,-1), 0.5, GREY_MED), ("INNERGRID", (0,0), (-1,-1), 0.3, GREY_MED), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 6), ("RIGHTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ])) story.append(norm_table) story.append(Spacer(1, 0.3*cm)) # ── SECTION 6: CLINICAL PEARLS ──────────────────────────────────────────────── story.append(section_header("6. CLINICAL PEARLS & EXAM TIPS")) story.append(Spacer(1, 0.15*cm)) pearls = [ ("<b>Hb dominates CaO₂:</b>", "Dissolved O₂ (PaO₂ × 0.003) contributes <2% under normal conditions. " "Raising Hb from 10 → 15 g/dL adds ~7 mL/dL O₂; raising PaO₂ from 100 → 500 mmHg only adds ~1.2 mL/dL."), ("<b>Quick mental maths:</b>", "CaO₂ ≈ Hb × 1.34 × 0.97 ≈ Hb × 1.3. " "So Hb 15 → ~19.5, Hb 10 → ~13, Hb 7 → ~9.1"), ("<b>Proportional scaling:</b>", "CaO₂ scales nearly linearly with Hb (at fixed saturation). " "CaO₂ at Hb 10 ≈ (10/15) × 20.1 ≈ 13.4 mL/dL"), ("<b>CO poisoning trap:</b>", "Pulse oximetry reads COHb as oxyHb → falsely normal SpO₂. " "True SaO₂ is much lower; must use co-oximetry ABG."), ("<b>Anaemia vs hypoxia:</b>", "Both reduce DO₂ but via different components. " "Anaemia targets the Hb term; hypoxia targets SaO₂. Tissue compensates via ↑ ERO₂."), ("<b>Fick equation:</b>", "CO = VO₂ / [(CaO₂ − CvO₂) × 10]. Gold standard for cardiac output measurement."), ("<b>Transfusion trigger:</b>", "Hb <7–8 g/dL in stable patients (restrictive strategy); " "higher threshold in cardiac/ACS patients (Hb <10 often used)."), ] for bold_label, text in pearls: row_data = [[ Paragraph(bold_label, body_bold), Paragraph(text, body), ]] row_t = Table(row_data, colWidths=[4.2*cm, 13.2*cm]) row_t.setStyle(TableStyle([ ("VALIGN", (0,0), (-1,-1), "TOP"), ("LEFTPADDING", (0,0), (0,-1), 6), ("RIGHTPADDING", (0,0), (0,-1), 4), ("TOPPADDING", (0,0), (-1,-1), 3), ("BOTTOMPADDING", (0,0), (-1,-1), 3), ("LINEBELOW", (0,0), (-1,-1), 0.3, GREY_MED), ])) story.append(row_t) story.append(Spacer(1, 0.3*cm)) # ── FOOTER ─────────────────────────────────────────────────────────────────── story.append(HRFlowable(width="100%", thickness=1, color=MED_BLUE)) story.append(Spacer(1, 0.1*cm)) footer_data = [[ Paragraph("Sources: Guyton & Hall Medical Physiology | Harrison's Principles | Frameworks for Internal Medicine | Barash Clinical Anaesthesia", small), Paragraph("Orris Quick Reference | Oxygen Content of Blood | v1.0", small), ]] footer_t = Table(footer_data, colWidths=[11*cm, 6.4*cm]) footer_t.setStyle(TableStyle([ ("ALIGN", (1,0), (1,0), "RIGHT"), ("VALIGN", (0,0), (-1,-1), "TOP"), ("LEFTPADDING", (0,0), (-1,-1), 0), ("RIGHTPADDING", (0,0), (-1,-1), 0), ("TOPPADDING", (0,0), (-1,-1), 3), ])) story.append(footer_t) # ── BUILD ───────────────────────────────────────────────────────────────────── doc.build(story) print(f"PDF created: {OUTPUT}") PYEOF python /tmp/workspace/oxygen-content-pdf/build_pdf.py
Oxygen Content Quick Reference
PDF Document · PDF