Streptokinase 150000

Reading File
Finding Sources
Searching PubMed

streptokinase thrombolysis dosing

Reading File
Reading File
Reading File
Finding Sources
Loading Image
Finding Sources
I now have comprehensive information from Harrison's, Braunwald's, and Tintinalli's to provide a thorough answer. Here is the full clinical summary on Streptokinase 150,000 IU:

Streptokinase - Full Clinical Profile

What It Is

Streptokinase is a first-generation fibrinolytic (thrombolytic) agent derived from beta-hemolytic streptococci. It is not an enzyme itself - it works indirectly by forming a 1:1 stoichiometric complex with plasminogen, inducing a conformational change that exposes plasminogen's active site. The streptokinase-plasminogen complex then activates additional plasminogen molecules into plasmin, which degrades fibrin clots.
Mechanism of action of streptokinase - binds plasminogen and induces conformational change exposing the active site

Key Pharmacological Feature: Non-Fibrin-Selective

Streptokinase has no affinity for fibrin. Its complex activates both:
  • Free (circulating) plasminogen
  • Fibrin-bound plasminogen
This leads to a systemic fibrinolytic state - plasmin overwhelms alpha-2 antiplasmin, degrading not just the target thrombus but also circulating fibrinogen. This is why it carries a significant bleeding risk.

Dosing Regimens

IndicationDose
Acute MI (STEMI)1.5 million units IV over 30-60 min
DVT / Pulmonary Embolism150,000 IU/hour IV infusion for 12-72 hours (loading dose approach)
Arterial occlusionVariable, catheter-directed
The 150,000 IU/hour regimen is the standard continuous infusion dose used for DVT and pulmonary embolism. In some protocols a 250,000 IU loading dose is given over 30 minutes first to neutralize circulating streptokinase antibodies, then 100,000-150,000 IU/hour is maintained.

Pharmacokinetics

  • Half-life: ~23 minutes (plasma)
  • Duration of fibrinolytic effect: Up to 24 hours after infusion (systemic lytic state persists)
  • Heparin timing: Usually delayed after streptokinase (unlike alteplase, which allows early heparin) due to the prolonged systemic fibrinolysis

Adverse Effects

EffectDetails
BleedingMost serious risk; systemic lytic state increases hemorrhagic risk
HypotensionCommon; 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 formationDevelops ~5 days post-treatment, persists 6 months. Reduces efficacy on re-exposure

Contraindications to Re-use

  • Do NOT re-administer streptokinase within 6 months of prior treatment (antibodies neutralize the drug and may cause hypersensitivity)
  • Do NOT use within 12 months of streptococcal infection (pre-existing antibodies)

Comparison to Other Fibrinolytics

FeatureStreptokinaseAlteplase (tPA)
Generation1st2nd
Fibrin selectivityNo (non-specific)Yes (fibrin-specific)
AntigenicityYesNo
Systemic lytic stateProlongedShorter
AdministrationInfusionInfusion (weight-based)
Heparin timingDelayedEarly
Allergic reactions~5-6%<2%

Clinical Note

In the U.S., streptokinase and urokinase are largely no longer available, having been replaced by alteplase and its derivatives. However, streptokinase remains widely used in many countries due to its lower cost and proven efficacy in acute MI and PE.
  • Harrison's Principles of Internal Medicine 22E, p. 998
  • Braunwald's Heart Disease, p. 1135
  • Tintinalli's Emergency Medicine, p. 1552

Create a quick reference dosing guide for fibrinolytic agents

Asking for Preferences
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Finding Sources
Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/fibrinolytic-guide && ls /tmp/workspace/

Writing File

~/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.")
Running Command

cd /tmp/workspace/fibrinolytic-guide && python build_pdf.py 2>&1

Running Command

ls -lh /tmp/workspace/fibrinolytic-guide/Fibrinolytic_Dosing_Guide.pdf

Your quick reference PDF is ready:

Fibrinolytic Dosing Guide

PDF Document · PDF


Here is what the guide covers across 6 sections:
Section 1 - Fibrinolytic Agents Overview & STEMI Dosing A comparison table of all 4 agents (Streptokinase, Alteplase, Reteplase, Tenecteplase) covering generation, fibrin selectivity, systemic fibrinogen depletion, half-life, antigenicity, ICH rates, TIMI patency rates, and STEMI doses.
Section 2 - Dosing by Indication A structured table covering all 5 indications:
  • STEMI (all agents)
  • Acute ischaemic stroke (alteplase 0.9 mg/kg; tenecteplase 0.25 mg/kg)
  • Pulmonary embolism (alteplase 100 mg over 2 h; streptokinase loading + infusion)
  • DVT (streptokinase 250,000 IU load then 150,000 IU/h)
  • Peripheral arterial occlusion
Section 3 - Contraindications Side-by-side absolute and relative contraindications (from Tintinalli's and Harrison's).
Section 4 - Bleeding Management Stepwise management from minor ooze to haemodynamic compromise, including fibrinogen concentrate, FFP, and antifibrinolytic dosing.
Section 5 - Key Clinical Reminders 7 high-yield pearls including the "no abbreviations" rule, streptokinase antibody window, heparin timing, and ICH risk differences.
Section 6 - Pharmacokinetics Summary Half-life, lytic effect duration, administration method, and fibrin selectivity for each agent.
Sources: Harrison's 22E, Braunwald's Heart Disease, Tintinalli's EM, Goldman-Cecil Medicine, Goodman & Gilman's.

I want to learn all icu management

Asking for Preferences
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Writing File

~/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.")
Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

Where is pdf

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.
This is a shared conversation. Sign in to Orris to start your own chat.