Streptokinase 150000
streptokinase thrombolysis dosing

| Indication | Dose |
|---|---|
| Acute MI (STEMI) | 1.5 million units IV over 30-60 min |
| DVT / Pulmonary Embolism | 150,000 IU/hour IV infusion for 12-72 hours (loading dose approach) |
| Arterial occlusion | Variable, catheter-directed |
| Effect | Details |
|---|---|
| Bleeding | Most serious risk; systemic lytic state increases hemorrhagic risk |
| Hypotension | Common; from plasmin-mediated release of bradykinin from kininogen. Treat with leg elevation, IV fluids, low-dose vasopressors (dopamine/norepinephrine) |
| Allergic reactions | ~5-6% of patients; rash, fever, chills, rigors. Rare anaphylaxis |
| Antibody formation | Develops ~5 days post-treatment, persists 6 months. Reduces efficacy on re-exposure |
| Feature | Streptokinase | Alteplase (tPA) |
|---|---|---|
| Generation | 1st | 2nd |
| Fibrin selectivity | No (non-specific) | Yes (fibrin-specific) |
| Antigenicity | Yes | No |
| Systemic lytic state | Prolonged | Shorter |
| Administration | Infusion | Infusion (weight-based) |
| Heparin timing | Delayed | Early |
| Allergic reactions | ~5-6% | <2% |
Create a quick reference dosing guide for fibrinolytic agents
mkdir -p /tmp/workspace/fibrinolytic-guide && ls /tmp/workspace/
~/fibrinolytic-guide/build_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
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_RIGHT
from reportlab.platypus import PageTemplate, Frame
from reportlab.pdfgen import canvas
from reportlab.lib.colors import HexColor
# ── Colour palette ────────────────────────────────────────────────────────────
NAVY = HexColor('#1B3A6B')
TEAL = HexColor('#0E7B82')
ORANGE = HexColor('#D95F02')
RED_DARK = HexColor('#B00020')
YELLOW_BG = HexColor('#FFF8E1')
TEAL_BG = HexColor('#E0F4F5')
NAVY_BG = HexColor('#EEF2FA')
GREY_ROW = HexColor('#F5F5F5')
WHITE = colors.white
BLACK = colors.black
PAGE_W, PAGE_H = A4
MARGIN = 1.8 * cm
# ── Document setup ─────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
'/tmp/workspace/fibrinolytic-guide/Fibrinolytic_Dosing_Guide.pdf',
pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=2.2 * cm, bottomMargin=2.0 * cm,
title='Quick Reference: Fibrinolytic Agents Dosing Guide',
author='Orris Medical Reference'
)
styles = getSampleStyleSheet()
W = PAGE_W - 2 * MARGIN # usable width
# ── Custom paragraph styles ───────────────────────────────────────────────────
def pstyle(name, parent='Normal', **kw):
s = ParagraphStyle(name, parent=styles[parent], **kw)
return s
title_style = pstyle('Title2', fontSize=18, textColor=WHITE,
alignment=TA_CENTER, fontName='Helvetica-Bold',
spaceAfter=2, leading=22)
subtitle_style= pstyle('Subtitle', fontSize=10, textColor=HexColor('#CCE4F7'),
alignment=TA_CENTER, fontName='Helvetica',
spaceAfter=4, leading=13)
sec_head = pstyle('SecHead', fontSize=11, textColor=WHITE,
fontName='Helvetica-Bold', alignment=TA_LEFT,
spaceBefore=6, spaceAfter=2, leading=14)
body = pstyle('Body', fontSize=8.5, leading=12,
fontName='Helvetica', spaceAfter=1)
bold_body = pstyle('BoldBody', fontSize=8.5, leading=12,
fontName='Helvetica-Bold')
small = pstyle('Small', fontSize=7.5, leading=10,
fontName='Helvetica', textColor=HexColor('#555555'))
footnote = pstyle('Footnote', fontSize=7, leading=9,
fontName='Helvetica-Oblique', textColor=HexColor('#666666'))
warn_style = pstyle('Warn', fontSize=8.5, leading=12,
fontName='Helvetica-Bold', textColor=RED_DARK)
label_style = pstyle('Label', fontSize=7.5, leading=10,
fontName='Helvetica-Bold', textColor=NAVY, alignment=TA_CENTER)
# ── Helper: section header bar ─────────────────────────────────────────────────
def section_bar(text, bg=NAVY, text_col=WHITE, width=None):
w = width or W
tbl = Table([[Paragraph(text, pstyle('_sh', fontSize=10,
fontName='Helvetica-Bold',
textColor=text_col,
leading=13))]],
colWidths=[w])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bg),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 8),
]))
return tbl
# ── Helper: coloured badge cell ────────────────────────────────────────────────
def badge(text, bg, fg=WHITE):
return Paragraph(
f'<font color="{fg.hexval() if hasattr(fg,"hexval") else fg}">'
f'<b>{text}</b></font>',
pstyle('_badge', fontSize=7.5, fontName='Helvetica-Bold',
alignment=TA_CENTER, leading=10,
backColor=bg, borderPadding=(2,4,2,4))
)
# ═══════════════════════════════════════════════════════════════════════════════
# PAGE BACKGROUND callback
# ═══════════════════════════════════════════════════════════════════════════════
def draw_bg(canv, doc):
"""Draw header banner + footer on every page."""
canv.saveState()
# Header banner
canv.setFillColor(NAVY)
canv.rect(0, PAGE_H - 1.6*cm, PAGE_W, 1.6*cm, fill=1, stroke=0)
canv.setFillColor(TEAL)
canv.rect(0, PAGE_H - 1.75*cm, PAGE_W, 0.15*cm, fill=1, stroke=0)
# Header text
canv.setFillColor(WHITE)
canv.setFont('Helvetica-Bold', 13)
canv.drawString(MARGIN, PAGE_H - 1.15*cm,
'Quick Reference: Fibrinolytic Agents Dosing Guide')
canv.setFont('Helvetica', 8)
canv.setFillColor(HexColor('#AACCE8'))
canv.drawRightString(PAGE_W - MARGIN, PAGE_H - 1.15*cm,
'For Clinical Use — Verify locally')
# Footer
canv.setFillColor(NAVY)
canv.rect(0, 0, PAGE_W, 1.1*cm, fill=1, stroke=0)
canv.setFillColor(TEAL)
canv.rect(0, 1.1*cm, PAGE_W, 0.1*cm, fill=1, stroke=0)
canv.setFillColor(HexColor('#AACCE8'))
canv.setFont('Helvetica', 7)
canv.drawString(MARGIN, 0.45*cm,
'Sources: Harrison\'s 22E · Braunwald\'s Heart Disease · Tintinalli\'s EM · Goldman-Cecil · Goodman & Gilman\'s')
canv.drawRightString(PAGE_W - MARGIN, 0.45*cm,
f'Page {doc.page}')
canv.restoreState()
# ═══════════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ═══════════════════════════════════════════════════════════════════════════════
story = []
# ── Intro paragraph ─────────────────────────────────────────────────────────
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
'Fibrinolytic (thrombolytic) agents activate plasminogen to plasmin, which degrades fibrin clots. '
'Doses vary significantly by indication. Always confirm the correct indication before ordering — '
'do not use abbreviations (rtPA, TNK) to avoid medication errors.',
body))
story.append(Spacer(1, 0.35*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — DRUG COMPARISON TABLE
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar('1. FIBRINOLYTIC AGENTS — OVERVIEW & STEMI DOSING', NAVY))
story.append(Spacer(1, 0.25*cm))
col_w = [3.0*cm, 2.6*cm, 2.6*cm, 2.6*cm, 2.6*cm]
hdr = [
Paragraph('<b>Property</b>', label_style),
Paragraph('<b>Streptokinase</b>', label_style),
Paragraph('<b>Alteplase\n(t-PA)</b>', label_style),
Paragraph('<b>Reteplase\n(r-PA)</b>', label_style),
Paragraph('<b>Tenecteplase\n(TNK)</b>', label_style),
]
overview_data = [
hdr,
['Generation',
Paragraph('1st', body), Paragraph('2nd', body),
Paragraph('3rd', body), Paragraph('3rd', body)],
['Source',
Paragraph('β-hemolytic streptococci', small),
Paragraph('Recombinant t-PA', small),
Paragraph('Deletion mutant of alteplase', small),
Paragraph('Modified alteplase', small)],
['Fibrin selectivity',
Paragraph('Non-specific', body), Paragraph('Moderate', body),
Paragraph('Moderate', body), Paragraph('High', body)],
['Systemic fibrinogen\ndepletion',
Paragraph('Severe', warn_style), Paragraph('Mild–moderate', body),
Paragraph('Moderate', body), Paragraph('Minimal', body)],
[Paragraph('Half-life', body),
Paragraph('~23 min\n(effect ≤24 h)', small),
Paragraph('<5 min\n(effect ~4–6 h)', small),
Paragraph('13–16 min', small),
Paragraph('~20 min', small)],
[Paragraph('Antigenic /\nAllergic reactions', body),
Paragraph('YES (~5–6%)', warn_style),
Paragraph('No (<2%)', body),
Paragraph('No', body),
Paragraph('No', body)],
[Paragraph('ICH rate\n(STEMI)', body),
Paragraph('~0.4%', body), Paragraph('~0.7%', body),
Paragraph('~0.8%', body), Paragraph('~0.7%', body)],
[Paragraph('TIMI 2/3 patency\n@ 90 min (STEMI)', body),
Paragraph('~51%', body), Paragraph('73–84%', body),
Paragraph('~83%', body), Paragraph('77–88%', body)],
[Paragraph('<b>STEMI dose</b>', bold_body),
Paragraph('<b>1.5 MU IV\nover 30–60 min</b>', bold_body),
Paragraph('<b>15 mg bolus → 0.75 mg/kg over 30 min (max 50 mg) → 0.50 mg/kg over 60 min (max 35 mg)</b>', bold_body),
Paragraph('<b>10 U IV over 2 min; repeat ×1 after 30 min</b>', bold_body),
Paragraph('<b>Weight-based single bolus over 5 sec:\n<60 kg: 30 mg\n60–70 kg: 35 mg\n70–80 kg: 40 mg\n80–90 kg: 45 mg\n>90 kg: 50 mg</b>', bold_body)],
[Paragraph('Heparin post-\nthrombolysis', body),
Paragraph('Delay\n(prolonged lytic state)', small),
Paragraph('Start early', small),
Paragraph('Start early', small),
Paragraph('Start early', small)],
[Paragraph('Re-treatment\nrestriction', body),
Paragraph('Avoid within 6 months\n(antibody formation)', warn_style),
Paragraph('None', body),
Paragraph('None', body),
Paragraph('None', body)],
]
tbl1 = Table(overview_data, colWidths=col_w, repeatRows=1)
row_bg = []
for i in range(1, len(overview_data)):
c = GREY_ROW if i % 2 == 0 else WHITE
row_bg.append(('BACKGROUND', (0, i), (-1, i), c))
tbl1.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), TEAL),
('TEXTCOLOR', (0, 0), (-1, 0), WHITE),
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
('FONTSIZE', (0, 0), (-1, 0), 8),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('GRID', (0, 0), (-1, -1), 0.4, HexColor('#CCCCCC')),
('TOPPADDING', (0, 0), (-1, -1), 4),
('BOTTOMPADDING', (0, 0), (-1, -1), 4),
('LEFTPADDING', (0, 0), (-1, -1), 4),
('RIGHTPADDING', (0, 0), (-1, -1), 4),
('BACKGROUND', (0, len(overview_data)-3), (-1, len(overview_data)-3), NAVY_BG),
('FONTNAME', (0, len(overview_data)-3), (-1, len(overview_data)-3), 'Helvetica-Bold'),
] + row_bg))
story.append(tbl1)
story.append(Paragraph(
'* Alteplase accelerated regimen (STEMI). Tenecteplase doses supplied in 5 mg/mL vials. '
'ICH = intracranial haemorrhage. TIMI = Thrombolysis in Myocardial Infarction.',
footnote))
story.append(Spacer(1, 0.4*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — DOSING BY INDICATION
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar('2. DOSING BY INDICATION', TEAL))
story.append(Spacer(1, 0.25*cm))
ind_col = [3.2*cm, 5.4*cm, 5.4*cm]
ind_hdr = [
Paragraph('<b>Indication</b>', label_style),
Paragraph('<b>Agent & Dose</b>', label_style),
Paragraph('<b>Notes / Time Window</b>', label_style),
]
ind_data = [
ind_hdr,
# STEMI
[Paragraph('<b>STEMI\n(Acute MI)</b>', bold_body),
Paragraph(
'<b>Streptokinase:</b> 1.5 MU IV over 30–60 min<br/>'
'<b>Alteplase:</b> Accelerated 100 mg total (see above)<br/>'
'<b>Reteplase:</b> 10 U + 10 U, 30 min apart<br/>'
'<b>Tenecteplase:</b> Weight-based single bolus', small),
Paragraph(
'Use when PCI unavailable or door-to-balloon time >120 min.<br/>'
'Best within 3 h of symptom onset; benefit up to 12 h.<br/>'
'Avoid within 12 months of streptococcal infection (SK).', small)],
# Ischemic Stroke
[Paragraph('<b>Acute Ischemic\nStroke</b>', bold_body),
Paragraph(
'<b>Alteplase:</b> 0.9 mg/kg IV (max 90 mg)<br/>'
'→ 10% as bolus over 1 min<br/>'
'→ Remaining 90% over 60 min<br/><br/>'
'<b>Tenecteplase</b> (off-label in some regions):<br/>'
'0.25 mg/kg IV single bolus (max 25 mg)', small),
Paragraph(
'Alteplase: within 3–4.5 h of symptom onset.<br/>'
'Tenecteplase: within 4.5 h; used as alternative in some guidelines.<br/>'
'ICH occurs in ~6% of stroke patients treated with alteplase.<br/>'
'NIHSS 4–22 typically used as criterion.<br/>'
'Check blood glucose before administering.', small)],
# PE
[Paragraph('<b>Pulmonary\nEmbolism (PE)</b>', bold_body),
Paragraph(
'<b>Alteplase:</b> 100 mg IV over 2 h<br/>'
'<i>or</i> 0.6 mg/kg over 15 min (max 50 mg — rapid/submassive)<br/><br/>'
'<b>Streptokinase:</b> 250,000 IU loading over 30 min,<br/>'
'then 100,000 IU/h for 24 h<br/><br/>'
'<b>Reteplase:</b> 10 U + 10 U, 30 min apart<br/><br/>'
'<b>Tenecteplase:</b> Weight-based bolus', small),
Paragraph(
'Indicated for massive (haemodynamically unstable) PE.<br/>'
'Considered for submassive PE with clinical deterioration.<br/>'
'Start heparin after alteplase; delay after streptokinase.', small)],
# DVT
[Paragraph('<b>Deep Vein\nThrombosis (DVT)</b>', bold_body),
Paragraph(
'<b>Streptokinase:</b> 250,000 IU loading over 30 min,<br/>'
'then <b>150,000 IU/h</b> IV × 12–72 h<br/><br/>'
'<b>Alteplase:</b> Catheter-directed; variable dose', small),
Paragraph(
'Systemic thrombolysis rarely used for DVT; catheter-directed preferred.<br/>'
'Greatest benefit in ilio-femoral DVT within 14 days of onset.<br/>'
'Streptokinase antibodies develop ~5 days post-treatment (persist 6 mo).', small)],
# Arterial occlusion
[Paragraph('<b>Peripheral\nArterial\nOcclusion</b>', bold_body),
Paragraph(
'<b>Alteplase:</b> Catheter-directed 0.05–0.1 mg/kg/h<br/>'
'<b>Streptokinase:</b> Catheter-directed (rarely used)', small),
Paragraph(
'Catheter-directed thrombolysis preferred over systemic.<br/>'
'Limb viability assessment determines urgency.<br/>'
'Higher bleeding risk with prolonged infusions.', small)],
]
tbl2 = Table(ind_data, colWidths=ind_col, repeatRows=1)
ind_row_bg = []
for i in range(1, len(ind_data)):
c = NAVY_BG if i % 2 == 0 else WHITE
ind_row_bg.append(('BACKGROUND', (0, i), (-1, i), c))
tbl2.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), NAVY),
('TEXTCOLOR', (0, 0), (-1, 0), WHITE),
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
('FONTSIZE', (0, 0), (-1, 0), 8.5),
('ALIGN', (0, 0), (0, -1), 'CENTER'),
('ALIGN', (1, 0), (-1, -1), 'LEFT'),
('VALIGN', (0, 0), (-1, -1), 'TOP'),
('GRID', (0, 0), (-1, -1), 0.4, HexColor('#CCCCCC')),
('TOPPADDING', (0, 0), (-1, -1), 5),
('BOTTOMPADDING', (0, 0), (-1, -1), 5),
('LEFTPADDING', (0, 0), (-1, -1), 5),
('RIGHTPADDING', (0, 0), (-1, -1), 5),
('BACKGROUND', (0, 1), (0, -1), TEAL_BG),
('FONTNAME', (0, 1), (0, -1), 'Helvetica-Bold'),
] + ind_row_bg))
story.append(tbl2)
story.append(Spacer(1, 0.4*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — CONTRAINDICATIONS (two-column)
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar('3. CONTRAINDICATIONS TO FIBRINOLYTIC THERAPY', NAVY))
story.append(Spacer(1, 0.25*cm))
abs_items = [
'Active or recent (<14 d) internal bleeding',
'Any prior haemorrhagic stroke',
'Ischaemic stroke within past 2–6 months',
'Intracranial/intraspinal surgery or trauma <2 months',
'Intracranial neoplasm, aneurysm, or AVM',
'Known severe bleeding diathesis',
'Platelet count <100,000/mm³',
'Uncontrolled hypertension (BP >185/110 mmHg)',
'Suspected aortic dissection or pericarditis',
'Pregnancy',
'Warfarin with INR >1.7 or heparin with ↑ aPTT',
'Direct anticoagulant with evidence of anticoagulant effect',
]
rel_items = [
'Active peptic ulcer disease',
'CPR >10 minutes',
'Haemorrhagic ophthalmic conditions',
'Puncture of non-compressible vessel <10 days',
'Significant trauma or major surgery <2 wk–2 months',
'Advanced renal or hepatic disease',
'Severe, uncontrolled hypertension on presentation',
'Current use of anticoagulants (INR 2–3)',
'Known intracranial pathology not listed as absolute',
'Diabetic haemorrhagic retinopathy',
]
def bullet_list(items, style):
lines = ''.join(f'• {i}<br/>' for i in items)
return Paragraph(lines, style)
abs_col_hdr = section_bar('ABSOLUTE', RED_DARK, WHITE, W/2 - 0.2*cm)
rel_col_hdr = section_bar('RELATIVE', ORANGE, WHITE, W/2 - 0.2*cm)
abs_body = bullet_list(abs_items, small)
rel_body = bullet_list(rel_items, small)
ci_tbl = Table(
[[abs_col_hdr, rel_col_hdr],
[abs_body, rel_body]],
colWidths=[W/2 - 0.15*cm, W/2 - 0.15*cm],
hAlign='LEFT'
)
ci_tbl.setStyle(TableStyle([
('VALIGN', (0,0), (-1,-1), 'TOP'),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('GRID', (0,0), (-1,-1), 0.4, HexColor('#CCCCCC')),
('BACKGROUND', (0,1), (0,1), HexColor('#FFF0F0')),
('BACKGROUND', (1,1), (1,1), HexColor('#FFF8EE')),
]))
story.append(ci_tbl)
story.append(Paragraph('* Concurrent menses is NOT a contraindication.', footnote))
story.append(Spacer(1, 0.4*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — BLEEDING MANAGEMENT
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar('4. MANAGEMENT OF FIBRINOLYTIC-INDUCED BLEEDING', TEAL))
story.append(Spacer(1, 0.25*cm))
bleed_data = [
[Paragraph('<b>Severity</b>', label_style),
Paragraph('<b>Action</b>', label_style)],
[Paragraph('Minor external\n(e.g. IV site ooze)', small),
Paragraph('Manual pressure', body)],
[Paragraph('Significant\ninternal bleeding', small),
Paragraph(
'1. Stop fibrinolytic, antiplatelet, and heparin immediately\n'
'2. Reverse heparin with protamine if applicable\n'
'3. Order type & cross-match; check aPTT, CBC, fibrinogen, TCT\n'
'4. Volume replacement with crystalloid and pRBC as needed', small)],
[Paragraph('Major bleeding /\nHaemodynamic\ncompromise', warn_style),
Paragraph(
'1. All measures above\n'
'2. Fibrinogen concentrate 70 mg/kg IV; recheck — if <100 mg/dL, repeat\n'
'3. If bleeding persists: FFP 2 units IV\n'
'4. If still ongoing: Aminocaproic acid 5 g IV over 60 min → 1 g/h × 8 h\n'
' OR Tranexamic acid 10 mg/kg IV over 20 min → 1 mg/kg/h × 8 h\n'
'5. Neurosurgery/IR consultation for intracranial haemorrhage', small)],
]
bleed_tbl = Table(bleed_data, colWidths=[3.5*cm, W - 3.5*cm], repeatRows=1)
bleed_tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), NAVY),
('TEXTCOLOR', (0,0), (-1,0), WHITE),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,0), 8.5),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('ALIGN', (0,0), (0,-1), 'CENTER'),
('GRID', (0,0), (-1,-1), 0.4, HexColor('#CCCCCC')),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('BACKGROUND', (0,1), (-1,1), GREY_ROW),
('BACKGROUND', (0,3), (-1,3), HexColor('#FFF0F0')),
('BACKGROUND', (0,3), (0,3), HexColor('#FFCCCC')),
]))
story.append(bleed_tbl)
story.append(Spacer(1, 0.4*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — KEY CLINICAL REMINDERS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar('5. KEY CLINICAL REMINDERS', NAVY))
story.append(Spacer(1, 0.2*cm))
reminders = [
('Dose is indication-specific.',
'Alteplase 0.9 mg/kg for stroke ≠ alteplase 100 mg for PE or STEMI. Always verify.'),
('No abbreviations when ordering.',
'Use full names: alteplase, tenecteplase. "rtPA" and "TNK" cause medication errors.'),
('Streptokinase antibodies.',
'Antibodies develop ~5 days post-treatment, persist 6 months. Avoid re-use in that window. '
'Also avoid within 12 months of streptococcal infection.'),
('Streptokinase hypotension.',
'Caused by plasmin-mediated bradykinin release. Treat with leg elevation, IV fluids, '
'low-dose dopamine or norepinephrine.'),
('Heparin timing.',
'Delay heparin after streptokinase (prolonged systemic lytic state). Start early after '
'alteplase, reteplase, or tenecteplase.'),
('ICH in stroke vs MI.',
'ICH occurs in ~6% of stroke patients treated with alteplase, vs <1% in MI patients. '
'Higher baseline risk demands careful exclusion criterion review.'),
('Fibrin selectivity.',
'Tenecteplase > alteplase > reteplase > streptokinase. Less fibrin selectivity = more '
'systemic fibrinogen depletion and bleeding risk.'),
]
rem_data = [[
Paragraph(f'<b>{t}</b> {d}', small)
] for t, d in reminders]
for i, row in enumerate(rem_data):
bg = NAVY_BG if i % 2 == 0 else WHITE
rem_tbl_row = Table([row], colWidths=[W])
rem_tbl_row.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bg),
('LEFTPADDING', (0,0), (-1,-1), 8),
('RIGHTPADDING', (0,0), (-1,-1), 8),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('GRID', (0,0), (-1,-1), 0.3, HexColor('#DDDDDD')),
]))
story.append(rem_tbl_row)
story.append(Spacer(1, 0.4*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 6 — PHARMACOKINETICS SUMMARY
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar('6. PHARMACOKINETICS SUMMARY', TEAL))
story.append(Spacer(1, 0.25*cm))
pk_data = [
[Paragraph('<b>Agent</b>', label_style),
Paragraph('<b>Half-life</b>', label_style),
Paragraph('<b>Lytic effect duration</b>', label_style),
Paragraph('<b>Administration</b>', label_style),
Paragraph('<b>Fibrin selectivity</b>', label_style)],
['Streptokinase', '~23 min', 'Up to 24 h', 'IV infusion 30–60 min',
Paragraph('Non-selective', warn_style)],
['Alteplase (t-PA)', '<5 min', '4–6 h', 'IV infusion 60–90 min',
Paragraph('Moderate', body)],
['Reteplase (r-PA)', '13–16 min', '~3–4 h', 'Double IV bolus × 2',
Paragraph('Moderate', body)],
['Tenecteplase (TNK)', '~20 min', '~4–6 h', 'Single IV bolus (5 sec)',
Paragraph('High', pstyle('_gn', fontSize=8.5, textColor=TEAL, fontName='Helvetica-Bold'))],
]
pk_tbl = Table(pk_data,
colWidths=[3.0*cm, 2.2*cm, 2.5*cm, 3.5*cm, 2.8*cm],
repeatRows=1)
pk_row_bg = []
for i in range(1, len(pk_data)):
c = GREY_ROW if i % 2 == 0 else WHITE
pk_row_bg.append(('BACKGROUND', (0, i), (-1, i), c))
pk_tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), TEAL),
('TEXTCOLOR', (0,0), (-1,0), WHITE),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,0), 8),
('ALIGN', (0,0), (-1,-1), 'CENTER'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('GRID', (0,0), (-1,-1), 0.4, HexColor('#CCCCCC')),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('FONTNAME', (0,1), (0,-1), 'Helvetica-Bold'),
] + pk_row_bg))
story.append(pk_tbl)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
'DISCLAIMER: This guide is a quick reference for educational and clinical decision-support purposes. '
'Always verify doses against current institutional protocols, approved product information, and '
'applicable clinical guidelines before administration. Individual patient factors may alter dosing.',
footnote))
# ─── Build ────────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=draw_bg, onLaterPages=draw_bg)
print("PDF built successfully.")
cd /tmp/workspace/fibrinolytic-guide && python build_pdf.py 2>&1
ls -lh /tmp/workspace/fibrinolytic-guide/Fibrinolytic_Dosing_Guide.pdf
Fibrinolytic Dosing Guide
PDF Document · PDF
I want to learn all icu management
~/fibrinolytic-guide/build_icu_roadmap.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, ListFlowable, ListItem
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT, TA_JUSTIFY
from reportlab.lib.colors import HexColor
# ── Palette ────────────────────────────────────────────────────────────────────
NAVY = HexColor('#1B3A6B')
TEAL = HexColor('#0D7377')
GREEN = HexColor('#1E7E34')
ORANGE = HexColor('#C95F02')
RED = HexColor('#B00020')
PURPLE = HexColor('#5B2D8E')
NAVY_BG = HexColor('#EEF2FA')
TEAL_BG = HexColor('#E0F4F4')
GREEN_BG = HexColor('#E8F5E9')
ORANGE_BG= HexColor('#FFF3E0')
RED_BG = HexColor('#FFEBEE')
GREY = HexColor('#F5F5F5')
WHITE = colors.white
BLACK = colors.black
PAGE_W, PAGE_H = A4
MARGIN = 1.8 * cm
W = PAGE_W - 2 * MARGIN
doc = SimpleDocTemplate(
'/tmp/workspace/fibrinolytic-guide/ICU_Management_Learning_Roadmap.pdf',
pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=2.4*cm, bottomMargin=2.0*cm,
title='ICU Management — Complete Learning Roadmap',
author='Orris Medical Reference'
)
styles = getSampleStyleSheet()
def ps(name, **kw):
return ParagraphStyle(name, parent=styles.get('Normal', styles['Normal']), **kw)
title_s = ps('T', fontSize=16, textColor=WHITE, fontName='Helvetica-Bold',
alignment=TA_CENTER, leading=20)
h1 = ps('H1', fontSize=10.5, textColor=WHITE, fontName='Helvetica-Bold',
leading=13, alignment=TA_LEFT)
h2 = ps('H2', fontSize=9, textColor=NAVY, fontName='Helvetica-Bold',
leading=12, spaceBefore=4)
body = ps('B', fontSize=8.5, fontName='Helvetica', leading=12)
bold_b = ps('BB', fontSize=8.5, fontName='Helvetica-Bold', leading=12)
small = ps('S', fontSize=7.5, fontName='Helvetica', leading=10,
textColor=HexColor('#444444'))
fn = ps('FN', fontSize=7, fontName='Helvetica-Oblique',
textColor=HexColor('#666666'), leading=9)
warn = ps('W', fontSize=8.5, fontName='Helvetica-Bold',
textColor=RED, leading=12)
tip = ps('TP', fontSize=8, fontName='Helvetica-Oblique',
textColor=TEAL, leading=11)
label = ps('LB', fontSize=8, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_CENTER, leading=11)
num_s = ps('NUM', fontSize=18, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_CENTER, leading=22)
# ── Header/Footer ──────────────────────────────────────────────────────────────
def draw_page(canv, doc):
canv.saveState()
canv.setFillColor(NAVY)
canv.rect(0, PAGE_H-1.8*cm, PAGE_W, 1.8*cm, fill=1, stroke=0)
canv.setFillColor(TEAL)
canv.rect(0, PAGE_H-1.95*cm, PAGE_W, 0.15*cm, fill=1, stroke=0)
canv.setFillColor(WHITE)
canv.setFont('Helvetica-Bold', 12)
canv.drawString(MARGIN, PAGE_H-1.2*cm, 'ICU Management — Complete Learning Roadmap')
canv.setFont('Helvetica', 8)
canv.setFillColor(HexColor('#AAD4F0'))
canv.drawRightString(PAGE_W-MARGIN, PAGE_H-1.2*cm, 'For Interns & Junior Residents')
# footer
canv.setFillColor(NAVY)
canv.rect(0, 0, PAGE_W, 1.0*cm, fill=1, stroke=0)
canv.setFillColor(HexColor('#AAD4F0'))
canv.setFont('Helvetica', 7)
canv.drawString(MARGIN, 0.38*cm,
'Sources: Harrison\'s 22E · Tintinalli\'s EM · Goldman-Cecil · Washington Manual · Miller\'s Anesthesia · Braunwald\'s')
canv.drawRightString(PAGE_W-MARGIN, 0.38*cm, f'Page {doc.page}')
canv.restoreState()
# ── Helpers ────────────────────────────────────────────────────────────────────
def sec_bar(text, bg=NAVY, fg=WHITE, w=None):
w = w or W
t = Table([[Paragraph(text, ps('_s', fontSize=10, fontName='Helvetica-Bold',
textColor=fg, leading=13))]],
colWidths=[w])
t.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), bg),
('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6),
('LEFTPADDING',(0,0),(-1,-1),9),
]))
return t
def two_col_bullets(left_items, right_items, bg_l=WHITE, bg_r=WHITE):
left = Paragraph(''.join(f'• {i}<br/>' for i in left_items), small)
right = Paragraph(''.join(f'• {i}<br/>' for i in right_items), small)
t = Table([[left, right]], colWidths=[W/2-0.15*cm, W/2-0.15*cm])
t.setStyle(TableStyle([
('VALIGN',(0,0),(-1,-1),'TOP'),
('BACKGROUND',(0,0),(0,0),bg_l),('BACKGROUND',(1,0),(1,0),bg_r),
('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
('LEFTPADDING',(0,0),(-1,-1),6),('RIGHTPADDING',(0,0),(-1,-1),6),
('GRID',(0,0),(-1,-1),0.3,HexColor('#CCCCCC')),
]))
return t
def module_table(rows, col_widths, header_bg=NAVY):
"""rows[0] = header row, rest = data."""
t = Table(rows, colWidths=col_widths, repeatRows=1)
row_styles = []
for i in range(1, len(rows)):
c = GREY if i % 2 == 0 else WHITE
row_styles.append(('BACKGROUND',(0,i),(-1,i),c))
t.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0), header_bg),
('TEXTCOLOR',(0,0),(-1,0), WHITE),
('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'),
('FONTSIZE',(0,0),(-1,0),8),
('ALIGN',(0,0),(-1,-1),'LEFT'),
('VALIGN',(0,0),(-1,-1),'TOP'),
('GRID',(0,0),(-1,-1),0.3,HexColor('#CCCCCC')),
('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4),
('LEFTPADDING',(0,0),(-1,-1),5),('RIGHTPADDING',(0,0),(-1,-1),5),
] + row_styles))
return t
# ══════════════════════════════════════════════════════════════════════════════
# STORY
# ══════════════════════════════════════════════════════════════════════════════
story = []
# ── INTRO ──────────────────────────────────────────────────────────────────────
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
'This roadmap organises ICU management into <b>10 core modules</b>. '
'Work through them in order — earlier modules provide the physiology and monitoring '
'foundation that later modules depend on. Each module includes key concepts, '
'clinical decision frameworks, must-know drug doses, and common pitfalls.',
body))
story.append(Spacer(1, 0.3*cm))
# ── CURRICULUM OVERVIEW ────────────────────────────────────────────────────────
story.append(sec_bar('CURRICULUM OVERVIEW — 10 CORE MODULES', NAVY))
story.append(Spacer(1, 0.2*cm))
overview_data = [
[Paragraph('<b>#</b>', label), Paragraph('<b>Module</b>', label),
Paragraph('<b>Core Focus</b>', label), Paragraph('<b>Priority</b>', label)],
['1', Paragraph('<b>ICU Fundamentals</b>', bold_b),
Paragraph('Monitoring, lines, scoring systems (APACHE, SOFA, GCS)', small),
Paragraph('★★★ Start here', ps('_p', fontSize=8, textColor=GREEN, fontName='Helvetica-Bold', leading=10))],
['2', Paragraph('<b>Airway & Ventilation</b>', bold_b),
Paragraph('Intubation, mechanical ventilation modes, weaning', small),
Paragraph('★★★ Essential', ps('_p2', fontSize=8, textColor=GREEN, fontName='Helvetica-Bold', leading=10))],
['3', Paragraph('<b>Sepsis & Septic Shock</b>', bold_b),
Paragraph('Sepsis-3 definition, Surviving Sepsis bundles, vasopressors', small),
Paragraph('★★★ Most common', ps('_p3', fontSize=8, textColor=GREEN, fontName='Helvetica-Bold', leading=10))],
['4', Paragraph('<b>Shock States</b>', bold_b),
Paragraph('Hypovolaemic, cardiogenic, obstructive, distributive — diagnosis & resuscitation', small),
Paragraph('★★★ Essential', ps('_p4', fontSize=8, textColor=GREEN, fontName='Helvetica-Bold', leading=10))],
['5', Paragraph('<b>ARDS & Respiratory Failure</b>', bold_b),
Paragraph('Berlin definition, lung-protective ventilation, prone positioning', small),
Paragraph('★★★ High yield', ps('_p5', fontSize=8, textColor=GREEN, fontName='Helvetica-Bold', leading=10))],
['6', Paragraph('<b>Haemodynamic Monitoring</b>', bold_b),
Paragraph('Arterial lines, CVP, ScvO2, cardiac output, fluid responsiveness', small),
Paragraph('★★ Important', ps('_p6', fontSize=8, textColor=TEAL, fontName='Helvetica-Bold', leading=10))],
['7', Paragraph('<b>AKI & Renal Support</b>', bold_b),
Paragraph('KDIGO staging, indications for RRT, CRRT vs IHD', small),
Paragraph('★★ Important', ps('_p7', fontSize=8, textColor=TEAL, fontName='Helvetica-Bold', leading=10))],
['8', Paragraph('<b>Neurological Emergencies</b>', bold_b),
Paragraph('Raised ICP, status epilepticus, stroke in ICU, brain death', small),
Paragraph('★★ Important', ps('_p8', fontSize=8, textColor=TEAL, fontName='Helvetica-Bold', leading=10))],
['9', Paragraph('<b>Metabolic & Endocrine Crises</b>', bold_b),
Paragraph('DKA, HHS, adrenal crisis, thyroid storm, electrolytes', small),
Paragraph('★★ Important', ps('_p9', fontSize=8, textColor=TEAL, fontName='Helvetica-Bold', leading=10))],
['10', Paragraph('<b>ICU Pharmacology & Procedures</b>', bold_b),
Paragraph('Sedation/analgesia, anticoagulation, nutrition, line insertion', small),
Paragraph('★★ Practical', ps('_p10', fontSize=8, textColor=TEAL, fontName='Helvetica-Bold', leading=10))],
]
ov_tbl = module_table(overview_data, [1.0*cm, 3.5*cm, 7.2*cm, 2.3*cm])
story.append(ov_tbl)
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 1 — ICU FUNDAMENTALS
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 1 — ICU FUNDAMENTALS', NAVY))
story.append(Spacer(1, 0.2*cm))
m1_data = [
[Paragraph('<b>Topic</b>', label), Paragraph('<b>What to Know</b>', label)],
[Paragraph('Scoring Systems', bold_b),
Paragraph(
'<b>SOFA score</b> (Sepsis-3): 6 organ systems (resp, coag, liver, CV, CNS, renal). '
'Score ≥2 = organ dysfunction. Used to define sepsis.<br/>'
'<b>qSOFA</b>: RR ≥22, AMS, SBP ≤100 — ≥2 = high-risk screen outside ICU.<br/>'
'<b>APACHE II</b>: predicts ICU mortality (12 physiologic variables + age + chronic health).<br/>'
'<b>GCS</b>: E(4)+V(5)+M(6)=15. GCS ≤8 = consider intubation.', small)],
[Paragraph('ICU Monitoring\nEssentials', bold_b),
Paragraph(
'• Continuous ECG, SpO2, BP (arterial line preferred in unstable pts)<br/>'
'• End-tidal CO2 (EtCO2) — confirms ETT placement; normal 35–45 mmHg<br/>'
'• Temperature: target normothermia (36–37.5°C)<br/>'
'• Urine output: target ≥0.5 mL/kg/h<br/>'
'• ABG interpretation: assess oxygenation (PaO2, P/F ratio) and ventilation (PaCO2)', small)],
[Paragraph('Vascular Access', bold_b),
Paragraph(
'<b>Central venous catheter (CVC)</b>: IJV, subclavian, femoral. Confirm with CXR.<br/>'
'Complications: pneumothorax, arterial puncture, infection (CLABSI), thrombosis.<br/>'
'<b>Arterial line</b>: radial (first choice), femoral. Continuous BP + ABG sampling.<br/>'
'<b>Intraosseous (IO)</b>: emergency access when IV unavailable — tibia/sternum.', small)],
[Paragraph('ICU Daily Goals', bold_b),
Paragraph(
'Use the "FAST HUGS" mnemonic:<br/>'
'<b>F</b>eeding · <b>A</b>nalgesia · <b>S</b>edation · <b>T</b>hromboprophylaxis · '
'<b>H</b>ead of bed 30–45° · <b>U</b>lcer prophylaxis · <b>G</b>lycaemic control · '
'<b>S</b>pontaneous breathing trial daily', small)],
[Paragraph('Glycaemic Control', bold_b),
Paragraph(
'Target blood glucose: <b>140–180 mg/dL</b> (7.8–10 mmol/L) in most ICU patients.<br/>'
'Tight control (<110 mg/dL) increases hypoglycaemia risk — avoid.<br/>'
'Use insulin infusion protocols for continuous monitoring.', small)],
]
story.append(module_table(m1_data, [2.8*cm, W-2.8*cm], NAVY))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 2 — AIRWAY & MECHANICAL VENTILATION
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 2 — AIRWAY & MECHANICAL VENTILATION', TEAL))
story.append(Spacer(1, 0.2*cm))
m2_data = [
[Paragraph('<b>Topic</b>', label), Paragraph('<b>What to Know</b>', label)],
[Paragraph('RSI\n(Rapid Sequence\nIntubation)', bold_b),
Paragraph(
'<b>Pre-oxygenate</b> 3–5 min with 100% O2 (NRB or BVM)<br/>'
'<b>Sedative agents</b>: Ketamine 1–2 mg/kg IV (preferred in haemodynamic instability) '
'| Etomidate 0.3 mg/kg (avoid in sepsis — adrenal suppression) '
'| Propofol 1.5–2.5 mg/kg (avoid if hypotensive)<br/>'
'<b>Paralytic</b>: Succinylcholine 1–1.5 mg/kg (avoid if hyperkalaemia, burns >48 h, '
'neuromuscular disease) | Rocuronium 1.2 mg/kg (use if succinylcholine contraindicated)', small)],
[Paragraph('Ventilator Modes', bold_b),
Paragraph(
'<b>AC/VC (Assist-Control Volume Control)</b>: set TV, RR, FiO2, PEEP — full support '
'for each breath. Most common for initial intubation.<br/>'
'<b>SIMV</b>: set mandatory breaths + allows spontaneous breaths between — '
'less used due to ↑ WOB.<br/>'
'<b>PSV (Pressure Support)</b>: patient-triggered, pressure-augmented — used for weaning.<br/>'
'<b>PRVC</b>: dual-control mode targeting set VT with minimum pressure.', small)],
[Paragraph('Initial Vent\nSettings', bold_b),
Paragraph(
'• <b>Tidal volume (TV)</b>: 6–8 mL/kg IBW (lung-protective; 4–6 mL/kg in ARDS)<br/>'
'• <b>RR</b>: 12–16 breaths/min (adjust for PaCO2 target)<br/>'
'• <b>FiO2</b>: start at 1.0 (100%), titrate down to SpO2 92–96% (88–92% in ARDS)<br/>'
'• <b>PEEP</b>: 5 cmH2O baseline; ↑ in ARDS (8–15 cmH2O)<br/>'
'• <b>I:E ratio</b>: 1:2 standard; 1:3 or longer in obstructive disease (asthma/COPD)', small)],
[Paragraph('Lung-Protective\nVentilation\n(ARDS)', bold_b),
Paragraph(
'<b>ARDSNet protocol</b>: TV 6 mL/kg IBW, plateau pressure ≤30 cmH2O<br/>'
'Target PaO2 55–80 mmHg or SpO2 88–95%<br/>'
'Higher PEEP tables guided by FiO2 requirements<br/>'
'<b>Prone positioning</b>: ≥16 h/day in moderate-severe ARDS (P/F <150) — '
'reduces mortality (PROSEVA trial)<br/>'
'<b>Neuromuscular blockade</b>: consider cisatracurium 48 h in severe ARDS (P/F <150)', small)],
[Paragraph('Weaning &\nExtubation', bold_b),
Paragraph(
'Daily <b>SAT</b> (spontaneous awakening trial) + <b>SBT</b> (spontaneous breathing trial)<br/>'
'<b>SBT criteria</b>: FiO2 ≤0.4, PEEP ≤5–8, haemodynamically stable, '
'able to follow commands, intact cough<br/>'
'<b>RSBI</b> (rapid shallow breathing index) = RR ÷ TV(L): <105 predicts successful extubation<br/>'
'Extubate if passes 30–120 min SBT on T-piece or low PS', small)],
[Paragraph('Vent Complications', bold_b),
Paragraph(
'<b>Barotrauma</b>: pneumothorax, pneumomediastinum — ↑ peak pressures<br/>'
'<b>Volutrauma</b>: alveolar overdistension — large TV<br/>'
'<b>VAP</b> (ventilator-associated pneumonia): HOB 30–45°, oral care, '
'daily SBT to minimise ventilator days<br/>'
'<b>Auto-PEEP</b> (air-trapping): in COPD/asthma — ↓ RR and ↑ expiratory time', small)],
]
story.append(module_table(m2_data, [2.8*cm, W-2.8*cm], TEAL))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 3 — SEPSIS & SEPTIC SHOCK
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 3 — SEPSIS & SEPTIC SHOCK', RED))
story.append(Spacer(1, 0.2*cm))
m3_data = [
[Paragraph('<b>Topic</b>', label), Paragraph('<b>What to Know</b>', label)],
[Paragraph('Definitions\n(Sepsis-3)', bold_b),
Paragraph(
'<b>Sepsis</b>: life-threatening organ dysfunction (SOFA ↑≥2) caused by dysregulated '
'host response to infection.<br/>'
'<b>Septic shock</b>: sepsis + vasopressor requirement to maintain MAP ≥65 mmHg AND '
'lactate >2 mmol/L despite adequate fluid resuscitation.<br/>'
'<b>SIRS</b> is no longer used to define sepsis (Sepsis-3, 2016).', small)],
[Paragraph('Hour-1 Bundle\n(SSC 2018)', bold_b),
Paragraph(
'1. Measure lactate; re-measure if initial >2 mmol/L<br/>'
'2. Blood cultures BEFORE antibiotics (×2 sets)<br/>'
'3. Broad-spectrum antibiotics within <b>1 hour</b><br/>'
'4. IV crystalloid 30 mL/kg for hypotension or lactate ≥4 mmol/L<br/>'
'5. Vasopressors if MAP <65 mmHg despite fluids', small)],
[Paragraph('Vasopressors', bold_b),
Paragraph(
'<b>Norepinephrine (NE)</b>: FIRST-LINE. 0.01–3 mcg/kg/min. α1>β1. '
'Target MAP ≥65 mmHg.<br/>'
'<b>Vasopressin</b>: ADD-ON to NE when NE ≥0.25–0.5 mcg/kg/min. '
'Fixed dose 0.03–0.04 units/min. V1 receptor. Spares NE dose.<br/>'
'<b>Epinephrine</b>: second-line add-on. Caution — ↑ lactate (β2 effect).<br/>'
'<b>Dopamine</b>: no longer first-line (↑ arrhythmias). Consider in bradycardic shock.<br/>'
'<b>Phenylephrine</b>: pure α1; use in tachycardia or NE unavailable.', small)],
[Paragraph('Antibiotic\nStrategy', bold_b),
Paragraph(
'Start within <b>1 hour</b> of sepsis recognition (every hour delay ↑ mortality ~7%).<br/>'
'Cover suspected source: community pneumonia (ceftriaxone + azithromycin), '
'hospital/VAP (piperacillin-tazobactam or meropenem ± vancomycin), '
'intra-abdominal (pip-tazo or meropenem ± metronidazole), '
'UTI (ceftriaxone or ciprofloxacin).<br/>'
'Add antifungal (fluconazole/micafungin) if immunocompromised or prolonged ICU stay.<br/>'
'<b>De-escalate</b> at 48–72 h based on cultures and clinical response.', small)],
[Paragraph('Corticosteroids', bold_b),
Paragraph(
'Consider <b>hydrocortisone 200 mg/day</b> IV (50 mg q6h or 200 mg continuous) '
'if septic shock refractory to fluids + ≥2 vasopressors.<br/>'
'ADRENAL and APROCCHSS trials: hydrocortisone shortens shock duration but no clear '
'mortality benefit in all patients. Still recommended in refractory shock.', small)],
[Paragraph('Fluid\nResuscitation', bold_b),
Paragraph(
'Initial: <b>30 mL/kg crystalloid</b> (balanced crystalloids preferred — LR or PlasmaLyte '
'over 0.9% saline — ↓ hyperchloraemic acidosis and AKI).<br/>'
'Re-assess with dynamic fluid responsiveness tests: <b>PLR</b> (passive leg raise) — '
'if CO ↑>10%, fluid responsive. Or pulse pressure variation (PPV >13% = responsive).<br/>'
'Avoid albumin as primary resuscitation fluid in sepsis (no mortality benefit). '
'4% albumin may be used in refractory shock.', small)],
]
story.append(module_table(m3_data, [2.8*cm, W-2.8*cm], RED))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 4 — SHOCK STATES
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 4 — SHOCK STATES', ORANGE))
story.append(Spacer(1, 0.2*cm))
shock_data = [
[Paragraph('<b>Type</b>', label),
Paragraph('<b>Mechanism</b>', label),
Paragraph('<b>Haemodynamics (CO / SVR / PCWP)</b>', label),
Paragraph('<b>Management</b>', label)],
[Paragraph('Hypovolaemic', bold_b),
Paragraph('↓ preload (haemorrhage, dehydration, burns)', small),
Paragraph('↓CO · ↑SVR · ↓PCWP', small),
Paragraph('Fluid/blood replacement. Haemorrhagic: pRBC + FFP + platelets (1:1:1). '
'Control source of bleeding.', small)],
[Paragraph('Distributive\n(Septic)', bold_b),
Paragraph('Vasodilation, maldistribution of flow', small),
Paragraph('↑CO · ↓SVR · ↓PCWP (early)', small),
Paragraph('Fluids + vasopressors (NE first-line). Antibiotics + source control.', small)],
[Paragraph('Cardiogenic', bold_b),
Paragraph('Pump failure (MI, myocarditis, arrhythmia)', small),
Paragraph('↓CO · ↑SVR · ↑PCWP', small),
Paragraph('Treat cause. Dobutamine (inotrope). IABP or Impella for refractory shock. '
'Early revascularisation in MI.', small)],
[Paragraph('Obstructive', bold_b),
Paragraph('Mechanical obstruction to flow (PE, tamponade, tension PTX)', small),
Paragraph('↓CO · ↑SVR · variable PCWP', small),
Paragraph('<b>PE</b>: systemic thrombolysis or embolectomy.<br/>'
'<b>Tamponade</b>: pericardiocentesis (needle or surgical).<br/>'
'<b>Tension PTX</b>: immediate needle decompression → chest tube.', small)],
[Paragraph('Neurogenic', bold_b),
Paragraph('Loss of sympathetic tone (spinal cord injury)', small),
Paragraph('↓CO · ↓SVR · normal PCWP; bradycardia', small),
Paragraph('IV fluids + vasopressors (phenylephrine or NE). '
'Atropine for bradycardia. Avoid hypotension — maintain MAP ≥85 mmHg in spinal injury.', small)],
]
story.append(module_table(shock_data, [2.2*cm, 2.8*cm, 3.5*cm, W-8.5*cm], ORANGE))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
'<b>Key pearl:</b> Use RUSH exam (Rapid Ultrasound in Shock and Hypotension) — '
'FAST + cardiac ECHO + IVC assessment — to rapidly classify shock type at bedside.',
tip))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 5 — ARDS & RESPIRATORY FAILURE
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 5 — ARDS & RESPIRATORY FAILURE', TEAL))
story.append(Spacer(1, 0.2*cm))
m5_data = [
[Paragraph('<b>Topic</b>', label), Paragraph('<b>What to Know</b>', label)],
[Paragraph('Berlin Definition\nof ARDS (2012)', bold_b),
Paragraph(
'All 4 criteria required:<br/>'
'1. Acute onset ≤7 days<br/>'
'2. Bilateral opacities on CXR/CT (not fully explained by effusion/collapse/nodules)<br/>'
'3. Not fully explained by cardiac failure or fluid overload<br/>'
'4. P/F ratio (PaO2/FiO2): Mild 200–300, Moderate 100–200, Severe <100 (on PEEP ≥5)', small)],
[Paragraph('Types of\nRespiratory\nFailure', bold_b),
Paragraph(
'<b>Type 1 (Hypoxaemic)</b>: ↓PaO2, normal or ↓PaCO2. Causes: pneumonia, ARDS, PE, '
'pulmonary oedema. Rx: supplemental O2, NIV, intubation.<br/>'
'<b>Type 2 (Hypercapnic)</b>: ↑PaCO2 (>45 mmHg) + ↓PaO2. '
'Causes: COPD exacerbation, asthma, neuromuscular disease. '
'Rx: NIV (BiPAP) first-line in COPD exacerbation.', small)],
[Paragraph('NIV / High-Flow\nO2', bold_b),
Paragraph(
'<b>CPAP</b>: continuous positive pressure, single level. Use in OSA, cardiogenic pulm oedema.<br/>'
'<b>BiPAP</b>: IPAP (inspiratory) + EPAP (expiratory). Use in COPD exacerbation, '
'hypercapnic failure. IPAP 10–20, EPAP 4–8 cmH2O initially.<br/>'
'<b>High-flow nasal cannula (HFNC)</b>: up to 60 L/min 100% O2. For hypoxaemic failure. '
'Can reduce intubation rate in non-hypercapnic patients.', small)],
[Paragraph('ARDS: Beyond\nVentilation', bold_b),
Paragraph(
'<b>Prone positioning</b>: ≥16 h/day — survival benefit when P/F <150 (PROSEVA trial)<br/>'
'<b>Conservative fluid strategy</b>: after resuscitation, target net-even or negative balance '
'(FACTT trial showed ↓ ventilator days)<br/>'
'<b>Neuromuscular blockade</b>: cisatracurium infusion 48 h for severe ARDS (P/F <150)<br/>'
'<b>Corticosteroids</b>: methylprednisolone may be considered in moderate-severe ARDS '
'not resolving (controversial; some benefit in early ARDS)<br/>'
'<b>ECMO</b>: veno-venous ECMO as rescue therapy for severe refractory ARDS (P/F <80)', small)],
[Paragraph('Status\nAsthmaticus', bold_b),
Paragraph(
'Continuous nebulised salbutamol + ipratropium. IV magnesium sulphate 2 g over 20 min.<br/>'
'IV hydrocortisone 200 mg or methylprednisolone 1–2 mg/kg.<br/>'
'Heliox, ketamine infusion for bronchospasm.<br/>'
'<b>If intubated</b>: permissive hypercapnia acceptable. Low RR (8–12), long expiratory '
'time (I:E 1:4), monitor for auto-PEEP. Avoid excessive PEEP.', small)],
]
story.append(module_table(m5_data, [2.8*cm, W-2.8*cm], TEAL))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 6 — HAEMODYNAMIC MONITORING
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 6 — HAEMODYNAMIC MONITORING', PURPLE))
story.append(Spacer(1, 0.2*cm))
m6_data = [
[Paragraph('<b>Parameter</b>', label),
Paragraph('<b>Normal</b>', label),
Paragraph('<b>Clinical Significance</b>', label)],
['MAP', '65–90 mmHg',
Paragraph('MAP = DBP + 1/3(PP). Target ≥65 in shock; ≥85 in neurogenic shock/TBI', small)],
['CVP', '2–8 mmHg',
Paragraph('Reflects right atrial pressure. Limited value alone. Trend more useful than single value. '
'Very high CVP: RV failure, cardiac tamponade', small)],
['ScvO2', '≥70%',
Paragraph('Central venous O2 saturation (SVC). <70% = ↑ O2 extraction (↑ demand or ↓ supply). '
'Used as target in early sepsis resuscitation.', small)],
['Cardiac Output\n(CO)', '4–8 L/min',
Paragraph('CO = HR × SV. Measured by PA catheter (thermodilution), PiCCO, or echo. '
'Cardiac index = CO/BSA; normal 2.4–4.0 L/min/m²', small)],
['SVR', '800–1200 dyn·s/cm⁵',
Paragraph('SVR = (MAP-CVP) × 80 / CO. ↑SVR in cardiogenic/hypovolaemic shock; '
'↓SVR in distributive shock.', small)],
['Pulse Pressure\nVariation (PPV)', '<13%',
Paragraph('PPV >13% during mechanical ventilation predicts fluid responsiveness '
'(only valid in sinus rhythm, no spontaneous breathing, TV ≥8 mL/kg)', small)],
['Passive Leg\nRaise (PLR)', 'CO ↑>10%',
Paragraph('Reversible volume challenge. Most reliable fluid responsiveness test. '
'Effective in AF, spontaneous breathing, and small TV.', small)],
['Lactate', '<2 mmol/L',
Paragraph('Marker of tissue hypoperfusion. >2 = concern; >4 = high-risk. '
'Target clearance ≥10% per 2 h in sepsis. '
'Elevated lactate ≠ always anaerobic (epinephrine, liver failure also ↑ lactate)', small)],
]
story.append(module_table(m6_data, [2.5*cm, 2.2*cm, W-4.7*cm], PURPLE))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 7 — AKI & RENAL SUPPORT
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 7 — AKI & RENAL SUPPORT', NAVY))
story.append(Spacer(1, 0.2*cm))
m7_data = [
[Paragraph('<b>Topic</b>', label), Paragraph('<b>What to Know</b>', label)],
[Paragraph('KDIGO AKI\nStaging', bold_b),
Paragraph(
'<b>Stage 1</b>: SCr ×1.5–1.9 baseline OR ↑ ≥0.3 mg/dL in 48 h OR UO <0.5 mL/kg/h ×6 h<br/>'
'<b>Stage 2</b>: SCr ×2–2.9 OR UO <0.5 mL/kg/h ×12 h<br/>'
'<b>Stage 3</b>: SCr ×3 or ≥4 mg/dL OR UO <0.3 mL/kg/h ×24 h or anuria ×12 h<br/>'
'Or initiation of RRT or eGFR <35 mL/min/1.73 m²', small)],
[Paragraph('Causes &\nWorkup', bold_b),
Paragraph(
'<b>Pre-renal</b>: hypovolaemia, sepsis, cardiorenal syndrome. FENa <1%, FeUrea <35%<br/>'
'<b>Intrinsic</b>: ATN (most common in ICU — ischaemia or nephrotoxins), GN, AIN<br/>'
'<b>Post-renal</b>: obstruction — bladder US essential<br/>'
'Check nephrotoxins: aminoglycosides, contrast, NSAIDs, vancomycin, ACEi<br/>'
'Avoid contrast if AKI; use iso-osmolar contrast + hydration if necessary', small)],
[Paragraph('Indications\nfor RRT\n(AEIOU)', bold_b),
Paragraph(
'<b>A</b>cidosis: pH <7.1–7.2 refractory to treatment<br/>'
'<b>E</b>lectrolytes: hyperkalaemia >6.5 mmol/L or ECG changes despite medical Rx<br/>'
'<b>I</b>ngestion: dialysable toxin (lithium, methanol, ethylene glycol, salicylates, metformin)<br/>'
'<b>O</b>verload: fluid overload refractory to diuretics<br/>'
'<b>U</b>raemia: uraemic pericarditis/encephalopathy; BUN typically >100–150 mg/dL', small)],
[Paragraph('RRT Modalities', bold_b),
Paragraph(
'<b>IHD</b> (intermittent haemodialysis): efficient, 3–5 h sessions, for haemodynamically stable.<br/>'
'<b>CRRT</b> (continuous): CVVH, CVVHD, CVVHDF — preferred in haemodynamically unstable ICU patients. '
'Slower, better tolerated, gentler fluid removal.<br/>'
'<b>SLED</b> (sustained low-efficiency dialysis): hybrid — 8–12 h/day, intermediate choice.', small)],
[Paragraph('Hyperkalaemia\nManagement', bold_b),
Paragraph(
'1. <b>Calcium gluconate 10%</b> 10–20 mL IV over 10 min (membrane stabilisation; '
'acts in 1–3 min, lasts 30–60 min)<br/>'
'2. <b>Insulin 10 U + 50 mL 50% dextrose</b> IV (↓ K⁺ by 0.6–1 mmol/L in 30 min)<br/>'
'3. <b>Salbutamol</b> 10–20 mg nebulised (synergistic with insulin; ↓ K⁺ 0.5–1 mmol/L)<br/>'
'4. <b>Sodium bicarbonate</b> if severe metabolic acidosis<br/>'
'5. <b>Kayexalate / patiromer</b> (↑ elimination — slow onset)<br/>'
'6. <b>Dialysis</b> if refractory or RRT already indicated', small)],
]
story.append(module_table(m7_data, [2.8*cm, W-2.8*cm], NAVY))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 8 — NEUROLOGICAL EMERGENCIES
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 8 — NEUROLOGICAL EMERGENCIES IN ICU', RED))
story.append(Spacer(1, 0.2*cm))
m8_data = [
[Paragraph('<b>Condition</b>', label), Paragraph('<b>Key Management</b>', label)],
[Paragraph('Raised ICP &\nTBI', bold_b),
Paragraph(
'Target: ICP <20 mmHg, CPP (MAP–ICP) 60–70 mmHg, MAP ≥85 mmHg.<br/>'
'• HOB 30–45°, midline head position<br/>'
'• Osmotherapy: <b>Mannitol 20%</b> 0.25–1 g/kg IV q4–6 h (watch serum osm <320); '
'OR <b>Hypertonic saline 3%</b> 2 mL/kg (preferred if hyponatraemia or haemodynamic instability)<br/>'
'• Hyperventilate to PaCO2 30–35 mmHg (short-term bridge only — ↑ cerebral ischaemia risk)<br/>'
'• Avoid hyperthermia, hypoxia, hypotension, hyponatraemia<br/>'
'• Neurosurgery for haematoma evacuation, decompressive craniectomy', small)],
[Paragraph('Status\nEpilepticus', bold_b),
Paragraph(
'<b>0–5 min</b>: Lorazepam 0.1 mg/kg IV (max 4 mg) or diazepam 0.15 mg/kg IV. '
'Repeat once if no response.<br/>'
'<b>5–20 min (if continues)</b>: Load with <b>levetiracetam 60 mg/kg IV</b> over 10 min '
'(preferred) OR phenytoin/fosphenytoin 20 mg/kg OR valproate 40 mg/kg<br/>'
'<b>>20–40 min (refractory)</b>: Intubate + <b>propofol</b>, <b>midazolam</b>, or <b>phenobarbital</b> infusion. '
'Continuous EEG monitoring.<br/>'
'Check glucose, electrolytes, ABG, toxicology screen.', small)],
[Paragraph('Stroke in ICU\n(Ischaemic)', bold_b),
Paragraph(
'Alteplase 0.9 mg/kg IV (max 90 mg) within 3–4.5 h of onset (if no contraindications).<br/>'
'Mechanical thrombectomy for large vessel occlusion within 24 h.<br/>'
'BP target pre-thrombolysis: <185/110 mmHg. Post-thrombolysis: <180/105 mmHg × 24 h.<br/>'
'Aspirin 300 mg if not thrombolysed. Avoid hypotension; permissive hypertension to 220/120 if no lysis.', small)],
[Paragraph('Haemorrhagic\nStroke / SAH', bold_b),
Paragraph(
'<b>ICH</b>: Reverse anticoagulation urgently. BP target SBP <140 mmHg within 1 h (if 150–220). '
'Surgical haematoma evacuation if >30 mL cerebellar, brainstem compression, or hydrocephalus.<br/>'
'<b>SAH</b>: Nimodipine 60 mg q4h PO × 21 days (prevents vasospasm). '
'Target systolic <160 mmHg before aneurysm secured. '
'Coil embolisation or surgical clipping.', small)],
[Paragraph('Delirium in ICU\n(CAM-ICU)', bold_b),
Paragraph(
'ICU delirium occurs in 60–80% of mechanically ventilated patients — ↑ mortality, '
'longer ICU stay.<br/>'
'<b>Non-pharmacologic</b> (first-line): reorientation, sleep hygiene, early mobilisation, '
'family presence, minimize restraints.<br/>'
'<b>ABCDEF bundle</b>: Awakening, Breathing, Coordination, Delirium screening, '
'Early mobility, Family engagement.<br/>'
'<b>Pharmacologic</b>: haloperidol 0.5–2 mg IV q6–12h (limited evidence); '
'quetiapine if prolonged; <b>avoid benzodiazepines</b> — worsen delirium.', small)],
[Paragraph('Brain Death', bold_b),
Paragraph(
'Prerequisites: known cause, normothermia, no sedatives/metabolic confounders.<br/>'
'Clinical: coma, absent brainstem reflexes (pupillary, corneal, oculocephalic, gag, cough), '
'apnoea test +ve (PaCO2 ↑≥20 mmHg from baseline, no respiratory effort).<br/>'
'Confirmatory tests (if apnoea test inconclusive): EEG (isoelectric), CBF (no flow), SSEP.', small)],
]
story.append(module_table(m8_data, [2.8*cm, W-2.8*cm], RED))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 9 — METABOLIC & ENDOCRINE CRISES
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 9 — METABOLIC & ENDOCRINE CRISES', ORANGE))
story.append(Spacer(1, 0.2*cm))
m9_data = [
[Paragraph('<b>Condition</b>', label), Paragraph('<b>Diagnosis</b>', label),
Paragraph('<b>Management</b>', label)],
[Paragraph('DKA', bold_b),
Paragraph('BG >250 mg/dL, pH <7.3, bicarb <18, ketonuria/ketonaemia', small),
Paragraph(
'1. IV fluids: 1 L 0.9% NaCl over 1 h, then 250–500 mL/h<br/>'
'2. Insulin: 0.1 U/kg/h infusion (no bolus in most protocols; '
'start only when K⁺ ≥3.5)<br/>'
'3. Potassium: replace if K⁺ <5.5 (add 20–40 mEq/L to IV fluids)<br/>'
'4. Monitor: glucose q1h, electrolytes q2–4h, pH<br/>'
'5. Transition to SC insulin when pH >7.3, anion gap normal, able to eat', small)],
[Paragraph('HHS', bold_b),
Paragraph('BG typically >600 mg/dL, osmolality >320, minimal ketosis, pH >7.3', small),
Paragraph(
'More profound dehydration than DKA. Fluid deficit 8–12 L.<br/>'
'0.9% NaCl until haemodynamically stable, then 0.45% NaCl.<br/>'
'Insulin infusion at lower rates (0.05 U/kg/h). '
'Correct glucose slowly (≤50 mg/dL/h to avoid cerebral oedema).<br/>'
'Anticoagulation: high VTE risk.', small)],
[Paragraph('Adrenal Crisis', bold_b),
Paragraph('Shock, hyponatraemia, hyperkalaemia, hypoglycaemia in at-risk patients', small),
Paragraph(
'<b>Hydrocortisone 100 mg IV STAT</b>, then 50 mg q6h or 200 mg/24 h infusion.<br/>'
'IV fluids (0.9% NaCl), correct hypoglycaemia with dextrose.<br/>'
'Do not delay for cortisol result if clinically suspected.', small)],
[Paragraph('Thyroid Storm', bold_b),
Paragraph('Fever, tachycardia, AMS, AF — Burch-Wartofsky score ≥45', small),
Paragraph(
'1. PTU 500–1000 mg loading PO/NG, then 250 mg q4h (blocks T4→T3 conversion)<br/>'
'2. Iodine (1 h AFTER PTU): Lugol\'s iodine 5–10 drops TID<br/>'
'3. Propranolol 60–80 mg PO/NG q4–6h (↓ HR, blocks T4→T3 peripherally)<br/>'
'4. Hydrocortisone 100 mg IV q8h<br/>'
'5. Treat precipitant (infection, surgery)', small)],
[Paragraph('Hyponatraemia\n(ICU)', bold_b),
Paragraph('Na⁺ <130 meq/L with neuro symptoms (seizures, coma)', small),
Paragraph(
'Severe symptomatic: <b>3% NaCl 100–150 mL IV over 20 min</b> × 1–3 boluses. '
'Target Na⁺ ↑4–6 mEq/L in first few hours (stop when symptoms resolve).<br/>'
'Max correction: <b>8–10 mEq/L per 24 h</b> (10–12 if very severe). '
'Exceeding this risks osmotic demyelination syndrome (ODS).<br/>'
'Treat underlying cause (SIADH, hypovolaemia, etc.)', small)],
]
story.append(module_table(m9_data, [2.2*cm, 3.2*cm, W-5.4*cm], ORANGE))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# MODULE 10 — ICU PHARMACOLOGY & PROCEDURES
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('MODULE 10 — ICU PHARMACOLOGY, SEDATION & PROCEDURES', TEAL))
story.append(Spacer(1, 0.2*cm))
m10_data = [
[Paragraph('<b>Topic</b>', label), Paragraph('<b>Key Points</b>', label)],
[Paragraph('Sedation\n(ABCDEF Bundle)', bold_b),
Paragraph(
'<b>Target</b>: RASS –1 to –2 (light sedation preferred over deep).<br/>'
'<b>Propofol</b>: 5–50 mcg/kg/min. Rapid onset/offset. Risk: propofol infusion syndrome '
'(PRIS) at >4 mg/kg/h >48 h — monitor TG, lactic acidosis, ECG.<br/>'
'<b>Midazolam</b>: 0.02–0.1 mg/kg/h. Accumulates; prolonged sedation. '
'Avoid in elderly/renal failure (active metabolite).<br/>'
'<b>Dexmedetomidine</b>: alpha-2 agonist, 0.2–1.5 mcg/kg/h. Analgo-sedation, '
'patient cooperative, no respiratory depression — preferred in delirium-prone patients.<br/>'
'<b>Ketamine</b>: 0.1–0.5 mg/kg/h infusion for analgosedation. Maintains airway reflexes.', small)],
[Paragraph('Analgesia\n(Pain First)', bold_b),
Paragraph(
'Analgesia-first approach: treat pain before sedation.<br/>'
'<b>Fentanyl</b>: 25–100 mcg/h infusion. Short-acting, titrable. Preferred in renal failure.<br/>'
'<b>Morphine</b>: longer acting; active metabolites accumulate in renal failure.<br/>'
'<b>Acetaminophen</b> 1 g q6h IV — reduces opioid requirement.<br/>'
'<b>Ketamine</b> sub-dissociative 0.1–0.3 mg/kg/h — opioid-sparing.<br/>'
'Use CPOT (Critical-Care Pain Observation Tool) or NRS to assess pain.', small)],
[Paragraph('DVT\nProphylaxis', bold_b),
Paragraph(
'<b>Pharmacologic (preferred)</b>: Enoxaparin 40 mg SC daily '
'(30 mg SC BD if BMI >30 or high-risk). Unfrac heparin 5000 U SC q8–12h if renal failure.<br/>'
'<b>Mechanical</b>: graduated compression stockings (GCS) + intermittent pneumatic compression (IPC) '
'— use when anticoagulation contraindicated.<br/>'
'Contraindications to pharmacologic: active bleeding, platelets <50,000, recent neurosurgery.', small)],
[Paragraph('Stress Ulcer\nProphylaxis', bold_b),
Paragraph(
'Indicated in: mechanical ventilation >48 h, coagulopathy, shock, severe burns, TBI, '
'high-dose steroids.<br/>'
'<b>PPI</b>: pantoprazole 40 mg IV/PO daily (first-line).<br/>'
'<b>H2-blocker</b>: ranitidine 150 mg PO q12h or famotidine 20 mg IV q12h '
'(less expensive, use if PPI unavailable).<br/>'
'Discontinue when enteral feeds established and risk factors resolve.', small)],
[Paragraph('ICU Nutrition', bold_b),
Paragraph(
'<b>Start early enteral nutrition (EN) within 24–48 h</b> if haemodynamically stable.<br/>'
'Target: 25–30 kcal/kg/day; protein 1.2–2.0 g/kg/day.<br/>'
'Gastric residual volumes: check q4–6h; hold if >500 mL (ACC guidelines) or use post-pyloric tube.<br/>'
'<b>Parenteral nutrition (PN)</b>: use only if EN not tolerated for >7 days (or earlier if malnourished).<br/>'
'Avoid overfeeding — worsens hyperglycaemia, hypercapnia, immune dysfunction.', small)],
[Paragraph('Anticoagulation\nin ICU', bold_b),
Paragraph(
'<b>UFH (unfractionated heparin)</b>: IV infusion for VTE treatment, AF, PE, STEMI. '
'Monitored by aPTT (target 60–100 s).<br/>'
'<b>LMWH (enoxaparin)</b>: therapeutic 1 mg/kg SC q12h (1.5 mg/kg daily in VTE). '
'Monitor anti-Xa in renal failure.<br/>'
'<b>Reversal</b>: Protamine for heparin (1 mg per 100 U UFH); '
'andexanet alfa for anti-Xa agents; idarucizumab for dabigatran.', small)],
]
story.append(module_table(m10_data, [2.8*cm, W-2.8*cm], TEAL))
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# STUDY PLAN TABLE
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_bar('SUGGESTED STUDY PLAN — 10 WEEKS', NAVY))
story.append(Spacer(1, 0.2*cm))
plan_data = [
[Paragraph('<b>Week</b>', label), Paragraph('<b>Module</b>', label),
Paragraph('<b>Recommended Resources</b>', label),
Paragraph('<b>Clinical Skill to Practise</b>', label)],
['1–2', 'M1: ICU Fundamentals',
Paragraph('Washington Manual Ch. on ICU; Harrison\'s ICU chapter', small),
Paragraph('FAST HUGS daily checklist, GCS assessment, ABG interpretation', small)],
['2–3', 'M2: Airway & Ventilation',
Paragraph('Morgan & Mikhail\'s Anesthesiology (ventilation chapter); Miller\'s Anesthesia', small),
Paragraph('Vent mode selection, RSI drug doses by memory', small)],
['3–4', 'M3: Sepsis & Shock',
Paragraph('Surviving Sepsis Campaign guidelines; Goldman-Cecil; Tintinalli\'s EM', small),
Paragraph('Hour-1 bundle by memory, vasopressor dose titration', small)],
['4', 'M4: Shock States',
Paragraph('Tintinalli\'s EM (shock chapter); RUSH exam videos', small),
Paragraph('RUSH protocol on POCUS', small)],
['5', 'M5: ARDS',
Paragraph('ARDSNet protocol; Fishman\'s Pulmonary; Murray & Nadel', small),
Paragraph('Lung-protective ventilation settings, prone positioning protocol', small)],
['6', 'M6: Haemodynamic Monitoring',
Paragraph('Braunwald\'s Heart Disease; Goldman-Cecil (haemodynamics)', small),
Paragraph('PLR test, arterial line waveform interpretation', small)],
['7', 'M7: AKI & RRT',
Paragraph('Comprehensive Clinical Nephrology; KDIGO AKI guidelines 2012', small),
Paragraph('KDIGO staging, hyperkalaemia algorithm, CRRT prescription', small)],
['8', 'M8: Neuro Emergencies',
Paragraph('Harrison\'s 22E (neurology section); Washington Manual', small),
Paragraph('CAM-ICU scoring, status epilepticus protocol', small)],
['9', 'M9: Metabolic Crises',
Paragraph('Harrison\'s 22E (endocrine); Goldman-Cecil', small),
Paragraph('DKA insulin protocol, hyponatraemia correction calculation', small)],
['10', 'M10: Pharmacology & Procedures',
Paragraph('Washington Manual (pharmacology section); Roberts & Hedges (procedures)', small),
Paragraph('Sedation scoring (RASS), CVC insertion steps, nutrition prescription', small)],
]
plan_tbl = module_table(plan_data, [1.2*cm, 3.0*cm, 4.5*cm, W-8.7*cm], NAVY)
story.append(plan_tbl)
story.append(Spacer(1, 0.3*cm))
# ── KEY PEARLS ─────────────────────────────────────────────────────────────────
story.append(sec_bar('TOP 10 ICU CLINICAL PEARLS', TEAL))
story.append(Spacer(1, 0.2*cm))
pearls = [
('1.', 'Always treat pain first (analgesia-first approach) before reaching for sedatives.'),
('2.', 'SpO2 92–96% is acceptable — targeting 100% causes oxygen toxicity and ↑ mortality.'),
('3.', 'In septic shock, norepinephrine is first-line. Dopamine is no longer recommended.'),
('4.', 'Use 6 mL/kg IBW tidal volume in ALL intubated patients (not just ARDS) — reduces VAP and VILI.'),
('5.', 'Passive leg raise tests fluid responsiveness without giving a single drop — reversible and safe.'),
('6.', 'In hyperkalaemia: calcium first (membrane stabilisation), insulin + dextrose second.'),
('7.', 'Do not correct hyponatraemia faster than 8–10 mEq/L per 24 h — risk of osmotic demyelination.'),
('8.', 'Daily SAT + SBT shortens ventilator time and ICU length of stay (proven in multiple RCTs).'),
('9.', 'Prone positioning ≥16 h/day reduces mortality in moderate-severe ARDS (P/F <150).'),
('10.', 'Start enteral nutrition within 24–48 h of ICU admission whenever haemodynamically stable.'),
]
pearl_rows = [[Paragraph(f'<b>{n}</b>', ps('_pn', fontSize=9, fontName='Helvetica-Bold',
textColor=TEAL, alignment=TA_CENTER, leading=12)),
Paragraph(p, body)] for n, p in pearls]
pearl_tbl = Table(pearl_rows, colWidths=[0.8*cm, W-0.8*cm])
p_styles = []
for i in range(len(pearls)):
c = TEAL_BG if i % 2 == 0 else WHITE
p_styles.append(('BACKGROUND', (0,i), (-1,i), c))
pearl_tbl.setStyle(TableStyle([
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('LEFTPADDING',(0,0),(-1,-1),5),('RIGHTPADDING',(0,0),(-1,-1),5),
('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4),
('GRID',(0,0),(-1,-1),0.3,HexColor('#CCCCCC')),
] + p_styles))
story.append(pearl_tbl)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
'DISCLAIMER: This guide is compiled from authoritative medical textbooks '
'(Harrison\'s 22E, Tintinalli\'s EM, Goldman-Cecil, Washington Manual, Miller\'s Anesthesia, '
'Braunwald\'s Heart Disease, Fishman\'s Pulmonary) and is intended for educational use. '
'Always verify doses and protocols against current local guidelines and approved drug information. '
'Individualise management for each patient.',
fn))
# ── Build ──────────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=draw_page, onLaterPages=draw_page)
print("ICU Roadmap PDF built successfully.")
Where is pdf