SIADH

Reading File
Finding Sources
Finding Sources
Searching PubMed

SIADH hyponatremia management

Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Finding Sources
Reading File
Reading File
I now have comprehensive content from multiple authoritative textbooks. Let me compile the full answer.

SIADH - Syndrome of Inappropriate Antidiuretic Hormone Secretion

Definition and Overview

SIADH is the most common cause of hyponatremia in hospitalized patients. First described by Schwartz et al. in two patients with bronchogenic carcinoma, it is characterized by inappropriately elevated ADH (arginine vasopressin, AVP) activity despite plasma hypo-osmolality and clinical euvolemia. The result is water retention, dilutional hyponatremia, and natriuresis.
  • Brenner & Rector's The Kidney

Pathophysiology

ADH acts on V2 receptors in the collecting duct, upregulating aquaporin-2 (AQP2) water channels, which causes avid water reabsorption. When ADH is chronically elevated:
  1. Water retention occurs and distributes across total body water - if 3 L extra is retained, 1 L goes to ECF and 2 L to ICF (in proportion to compartment sizes).
  2. Extracellular volume expansion - subtle and subclinical - triggers natriuresis (via atrial natriuretic peptide and suppressed aldosterone), explaining the elevated urine sodium.
  3. Serum osmolality falls, plasma Na falls.
  4. Plasma proteins are diluted (decreased concentration) but hematocrit remains near-normal because red cell dilution is offset by swelling from osmotic water shift.
  5. Vasopressin escape - with prolonged water retention, AQP2 expression downregulates and V2 responsiveness decreases, partially limiting the syndrome.
  6. Hypouricemia is a characteristic finding due to increased urate clearance - 16/17 SIADH patients had uric acid <4 mg/dL in one study, vs. >5 mg/dL in hyponatremia from other causes.
  • Costanzo Physiology 7th Edition; Brenner & Rector's The Kidney

Causes / Etiologies

CategoryExamplesFrequency
CancerSmall cell carcinoma of lung (most common), other malignancies producing ectopic ADH18-25%
Neurologic diseaseSubarachnoid hemorrhage, stroke, meningitis, brain tumors, trauma9-26%
Intrathoracic diseasePneumonia, tuberculosis, acute respiratory failure11-19%
PostoperativeVarious surgical settings7-11%
DrugsCarbamazepine (20-30% of patients), oxcarbazepine, SSRIs, TCAs, antipsychotics, NSAIDs, cyclophosphamide, vincristine, opioids, chlorpropamide, DDAVP/vasopressin, Ecstasy, nicotine, clofibrate8-18%
AIDSPneumocystis pneumonia, CNS infections, HIV-related adrenal insufficiencyVariable
Temporal arteritis-Rare
Idiopathic-Variable
  • Symptom to Diagnosis: An Evidence-Based Guide, 4th Edition

Diagnostic Criteria

The standard (Bartter-Schwartz) criteria for SIADH diagnosis:
  1. Decreased effective plasma osmolality - serum osmolality <275 mOsm/kg H₂O (Effective Osm = 2 × Na⁺ + Glucose/18)
  2. Inappropriately concentrated urine - urine osmolality >100 mOsm/kg H₂O (usually >300 mOsm/kg), indicating ADH is still active despite low plasma osmolality
  3. Clinical euvolemia - no signs of hypovolemia (orthostasis, tachycardia, dry mucous membranes) or hypervolemia (edema, ascites)
  4. Elevated urine sodium - UNa >20-30 mmol/L on normal sodium intake (though may be lower if on a low-sodium diet)
  5. Normal renal, thyroid, and adrenal function - other causes of euvolemic hyponatremia excluded (hypothyroidism, secondary adrenal/glucocorticoid insufficiency)
  6. No diuretic use, particularly no thiazide diuretics
Key caveat: Secondary adrenal insufficiency (from pituitary/ACTH deficiency causing cortisol deficiency, which fails to suppress AVP) mimics SIADH. It is found in 3-4% of patients initially suspected to have SIADH. Only 33-41% of patients are appropriately screened for this - always check cortisol/ACTH stimulation.
  • Goldman-Cecil Medicine; Symptom to Diagnosis, 4th Ed.

Variants / Subtypes

SubtypeMechanism
Type AErratic, unpredictable AVP secretion - most common, associated with malignancy
Type BReset osmostat - AVP control maintained but set-point shifted lower (Na 125-135 mEq/L); hyponatremia is non-progressive; patients can still dilute urine after a water load
Type CContinuous "leak" of AVP from posterior pituitary regardless of osmolality
Type DNormal AVP response - suggests another (non-AVP) antidiuretic substance
NSIADNephrogenic Syndrome of Inappropriate Antidiuresis - constitutively activating V2R gene variant; clinically identical to SIADH but plasma AVP is suppressed
  • Goldman-Cecil Medicine

Clinical Features

  • Often elderly patients presenting with falls, weakness, or confusion
  • Mild hyponatremia may be asymptomatic and found incidentally
  • Symptoms correlate with severity and rate of onset:
    • Na 125-135: fatigue, nausea, malaise
    • Na 115-125: headache, lethargy, confusion
    • Na <115 or rapid drop: seizures, coma, respiratory arrest
  • Euvolemic appearance on exam (key distinguishing feature from hypovolemic hyponatremia)
  • Hypouricemia (serum uric acid <4 mg/dL)

Important Diagnostic Pitfall: Normal Saline in SIADH

Normal (isotonic) saline can worsen hyponatremia in SIADH. Because ADH promotes water retention at the collecting duct, the kidneys excrete the sodium from the saline while retaining the water - net effect is worsening dilutional hyponatremia. This is a critical clinical point.
  • Symptom to Diagnosis, 4th Edition

Treatment

Step 1: Treat the Underlying Cause

  • Review and discontinue offending medications
  • Treat underlying pneumonia, malignancy, CNS disease
  • SIADH typically resolves when the cause is treated; recurrent SIADH in cancer suggests disease recurrence

Step 2: Chronic/Mild-Moderate Hyponatremia

OptionNotes
Fluid restriction (<800 mL/day)First-line for most. Unlikely to work if urine Osm >500 mOsm/L. Avoid in subarachnoid hemorrhage.
Oral salt tabletsIncreases urine solute load, facilitates water excretion
Furosemide + salt tabletsFurosemide washes out medullary concentration gradient, reducing the osmotic driving force for water reabsorption
Urea (oral)Effective for chronic SIADH; shown effective in systematic review/meta-analysis (PMID 39362395, 2025)
Vasopressin receptor antagonists (vaptans)Tolvaptan (oral V2 antagonist), conivaptan (IV, V1a/V2 antagonist) - cause aquaresis (free water excretion) without natriuresis
Vaptans caution: Caused rapid and dangerous overcorrection in 27% of patients with baseline Na <120 mEq/L. Must be initiated in a monitored setting and avoided in severe hyponatremia or liver disease (tolvaptan is contraindicated in hepatic impairment).

Step 3: Severe/Symptomatic Hyponatremia (seizures, coma)

  • Hypertonic 3% saline - augments water elimination; used for severe neurologic symptoms
  • Can be combined with furosemide
  • Frequent sodium checks are mandatory - formulas for predicted response are unreliable

Correction Rate (Critical)

  • Acute symptomatic hyponatremia (<48 hrs onset): Can correct up to 1-2 mEq/L/hr initially
  • Chronic hyponatremia: Correct no faster than 8-10 mEq/L per 24 hours (some guidelines say <12 mEq/L/24h)
  • Osmotic Demyelination Syndrome (ODS) - the feared complication of overcorrection, especially in patients who are malnourished, alcoholic, or have severe baseline hyponatremia
  • Symptom to Diagnosis, 4th Ed.; Bradley & Daroff's Neurology; Brenner & Rector's The Kidney

Summary Table

FeatureSIADH
Volume statusEuvolemic
Plasma osmolalityLow (<275 mOsm/kg)
Urine osmolalityHigh (>100, usually >300 mOsm/kg)
Urine NaUsually high (>20-30 mEq/L)
Serum uric acidLow (<4 mg/dL)
Plasma ADHElevated (but may be "normal" absolute value - any measurable ADH is abnormal when plasma is hypo-osmolar)
BUN/CreatinineNormal to low
Thyroid/adrenalNormal (exclusion criteria)
First-line RxFluid restriction + treat cause

Recent evidence: A 2025 systematic review and meta-analysis (PMID 39362395) confirmed oral urea as an effective treatment for SIADH-related hyponatremia, supporting its use as an alternative to vaptans in chronic cases.

Create a clinical decision flowchart for hyponatremia management and treatment

Reading File
Finding Sources
Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/hyponatremia-flowchart && ls /tmp/workspace/

Writing File

~/hyponatremia-flowchart/build_flowchart.py

"""
Clinical Decision Flowchart: Hyponatremia Management & Treatment
Built with python-pptx — fully drawn shapes, no images required
"""

from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.oxml.ns import qn
from lxml import etree

# ── Colour palette ────────────────────────────────────────────────────────────
C_NAVY      = RGBColor(0x0D, 0x2B, 0x55)   # slide background / title bar
C_BLUE      = RGBColor(0x1A, 0x6E, 0xB5)   # primary decision diamonds
C_TEAL      = RGBColor(0x11, 0x7A, 0x8B)   # section headers
C_GREEN     = RGBColor(0x1A, 0x7F, 0x4B)   # treatment / action boxes
C_ORANGE    = RGBColor(0xE8, 0x6A, 0x1A)   # warning / critical
C_PURPLE    = RGBColor(0x5B, 0x35, 0x9E)   # SIADH specific
C_GOLD      = RGBColor(0xF5, 0xA6, 0x23)   # ODS caution
C_LIGHT_BG  = RGBColor(0xF0, 0xF5, 0xFB)   # light fill for boxes
C_LIGHT_GRN = RGBColor(0xE6, 0xF5, 0xED)
C_LIGHT_ORG = RGBColor(0xFD, 0xF0, 0xE6)
C_LIGHT_PUR = RGBColor(0xEE, 0xE8, 0xF8)
C_WHITE     = RGBColor(0xFF, 0xFF, 0xFF)
C_DARK_TXT  = RGBColor(0x1C, 0x1C, 0x2E)
C_GRAY      = RGBColor(0x60, 0x60, 0x70)
C_LINE      = RGBColor(0x99, 0xB2, 0xCC)

# ── Slide dimensions (A3 landscape-style wide) ────────────────────────────────
W = Inches(20)
H = Inches(13)


def new_prs():
    prs = Presentation()
    prs.slide_width  = W
    prs.slide_height = H
    return prs


def blank_slide(prs):
    return prs.slides.add_slide(prs.slide_layouts[6])


# ── Drawing primitives ────────────────────────────────────────────────────────

def rect(slide, x, y, w, h, fill, line_color=None, line_width=Pt(1.2), radius=None):
    """Add a rectangle (optionally rounded)."""
    shape = slide.shapes.add_shape(
        1,  # MSO_SHAPE_TYPE.RECTANGLE = 1 but we use the int directly
        Inches(x), Inches(y), Inches(w), Inches(h)
    )
    # fill
    shape.fill.solid()
    shape.fill.fore_color.rgb = fill
    # line
    if line_color:
        shape.line.color.rgb = line_color
        shape.line.width = line_width
    else:
        shape.line.fill.background()
    # rounded corners via XML
    if radius:
        sp = shape._element
        spPr = sp.find(qn('p:spPr'))
        prstGeom = spPr.find(qn('a:prstGeom'))
        if prstGeom is not None:
            spPr.remove(prstGeom)
        custGeom_xml = f'''<a:prstGeom xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" prst="roundRect">
            <a:avLst><a:gd name="adj" fmla="val {radius}"/></a:avLst></a:prstGeom>'''
        spPr.insert(0, etree.fromstring(custGeom_xml))
    return shape


def diamond(slide, x, y, w, h, fill, line_color=None):
    """Add a diamond shape."""
    shape = slide.shapes.add_shape(
        4,  # diamond
        Inches(x), Inches(y), Inches(w), Inches(h)
    )
    shape.fill.solid()
    shape.fill.fore_color.rgb = fill
    if line_color:
        shape.line.color.rgb = line_color
        shape.line.width = Pt(1.5)
    else:
        shape.line.fill.background()
    return shape


def add_text(slide, text, x, y, w, h,
             font_size=9, bold=False, color=C_DARK_TXT,
             align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE,
             wrap=True, italic=False):
    tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
    tf = tb.text_frame
    tf.word_wrap = wrap
    tf.vertical_anchor = valign
    tf.margin_left  = Emu(45720)   # ~0.05"
    tf.margin_right = Emu(45720)
    tf.margin_top   = Emu(22860)
    tf.margin_bottom= Emu(22860)

    # Support multi-line with \n
    lines = text.split('\n')
    for i, line in enumerate(lines):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.alignment = align
        run = p.add_run()
        run.text = line
        run.font.size  = Pt(font_size)
        run.font.bold  = bold
        run.font.italic = italic
        run.font.color.rgb = color
        run.font.name  = 'Calibri'
    return tb


def line_connector(slide, x1, y1, x2, y2, color=C_LINE, width=Pt(1.5)):
    """Draw a straight connector line."""
    from pptx.util import Inches as I
    connector = slide.shapes.add_connector(
        1,  # straight connector
        I(x1), I(y1), I(x2), I(y2)
    )
    connector.line.color.rgb = color
    connector.line.width = width
    return connector


def arrow_down(slide, x, y, length, color=C_LINE):
    """Vertical arrow pointing down."""
    line_connector(slide, x, y, x, y + length, color)


def arrow_right(slide, x, y, length, color=C_LINE):
    """Horizontal arrow pointing right."""
    line_connector(slide, x, y, x + length, y, color)


# ── Build the presentation ────────────────────────────────────────────────────

prs = new_prs()
slide = blank_slide(prs)

# ══ BACKGROUND ═══════════════════════════════════════════════════════════════
bg = rect(slide, 0, 0, 20, 13, RGBColor(0xF7, 0xF9, 0xFC))

# ══ TITLE BAR ════════════════════════════════════════════════════════════════
rect(slide, 0, 0, 20, 1.05, C_NAVY)
add_text(slide, "CLINICAL DECISION FLOWCHART: HYPONATREMIA MANAGEMENT & TREATMENT",
         0.2, 0.1, 15, 0.85, font_size=22, bold=True, color=C_WHITE)
add_text(slide, "Based on: Washington Manual, Goldman-Cecil Medicine, Brenner & Rector",
         15.2, 0.1, 4.6, 0.85, font_size=8, bold=False, color=RGBColor(0xAA, 0xC4, 0xE0), italic=True)

# Colour legend strip
rect(slide, 0, 1.05, 20, 0.32, RGBColor(0xE8, 0xEE, 0xF6))
add_text(slide, "LEGEND:", 0.15, 1.08, 0.7, 0.25, font_size=7.5, bold=True, color=C_NAVY)

legend_items = [
    (C_BLUE,   C_WHITE,  "Step / Decision"),
    (C_GREEN,  C_WHITE,  "Treatment Action"),
    (C_ORANGE, C_WHITE,  "Urgent / Severe"),
    (C_PURPLE, C_WHITE,  "SIADH Pathway"),
    (C_GOLD,   C_DARK_TXT, "Caution / Warning"),
    (C_TEAL,   C_WHITE,  "Category Header"),
]
lx = 1.0
for (bg_c, txt_c, label) in legend_items:
    rect(slide, lx, 1.1, 1.5, 0.22, bg_c, radius=10000)
    add_text(slide, label, lx, 1.1, 1.5, 0.22, font_size=7, bold=True, color=txt_c)
    lx += 1.7


# ════════════════════════════════════════════════════════════════════════════
# COLUMN LAYOUT — 5 columns of roughly equal width across the slide
# Col centres (x_centre): 1.1, 5.0, 9.0, 13.5, 17.8
# ════════════════════════════════════════════════════════════════════════════

TOP_Y = 1.55   # start of flowchart content

# ══════════════════════════════════════════════════════════════════════════════
# COLUMN 1 — Serum [Na+] Entry
# ══════════════════════════════════════════════════════════════════════════════
COL1_X = 0.18

# START box
rect(slide, COL1_X, TOP_Y, 2.2, 0.48, C_NAVY, radius=20000)
add_text(slide, "SERUM [Na+] < 135 mEq/L\n(HYPONATREMIA DETECTED)", COL1_X, TOP_Y, 2.2, 0.48,
         font_size=8.5, bold=True, color=C_WHITE)

arrow_down(slide, COL1_X + 1.1, TOP_Y + 0.48, 0.3, C_NAVY)

# Step 1: Symptoms?
rect(slide, COL1_X, TOP_Y + 0.78, 2.2, 0.42, C_ORANGE, radius=10000)
add_text(slide, "⚠  SEVERE SYMPTOMS?\nSeizures, Coma, Resp. Failure", COL1_X, TOP_Y + 0.78, 2.2, 0.42,
         font_size=8, bold=True, color=C_WHITE)

arrow_down(slide, COL1_X + 1.1, TOP_Y + 1.20, 0.25, C_ORANGE)

# YES → urgent
rect(slide, COL1_X, TOP_Y + 1.45, 2.2, 0.7, RGBColor(0xFF, 0xEB, 0xE5), C_ORANGE, line_width=Pt(1.5), radius=8000)
add_text(slide, "YES → URGENT\n3% Hypertonic NaCl\nBolus 100 mL IV × 3\nTarget: +5 mEq/L\nin 1st hour", COL1_X, TOP_Y + 1.45, 2.2, 0.7,
         font_size=7.5, bold=False, color=RGBColor(0x7A, 0x20, 0x00))

arrow_down(slide, COL1_X + 1.1, TOP_Y + 2.15, 0.25, C_ORANGE)

# ODS warning
rect(slide, COL1_X, TOP_Y + 2.4, 2.2, 0.55, C_GOLD, radius=8000)
add_text(slide, "⚠  ODS PREVENTION\nMax correction:\n≤ 10 mEq/L / 24h\n(≤ 8 if high-risk*)", COL1_X, TOP_Y + 2.4, 2.2, 0.55,
         font_size=7.5, bold=False, color=C_DARK_TXT)

arrow_down(slide, COL1_X + 1.1, TOP_Y + 2.95, 0.25)

# NO → proceed to workup
rect(slide, COL1_X, TOP_Y + 3.2, 2.2, 0.38, C_TEAL, radius=8000)
add_text(slide, "NO SEVERE SX → WORKUP\n(See Step 1 →)", COL1_X, TOP_Y + 3.2, 2.2, 0.38,
         font_size=8, bold=True, color=C_WHITE)

# Footnote ODS risk
rect(slide, COL1_X, TOP_Y + 3.7, 2.2, 0.65, RGBColor(0xFF, 0xF8, 0xE6), C_GOLD, line_width=Pt(0.8), radius=6000)
add_text(slide, "*High-risk ODS:\nMalnourishment\nAlcohol use disorder\nLiver disease\nK+ depletion\nNa+ < 105 mEq/L",
         COL1_X, TOP_Y + 3.7, 2.2, 0.65, font_size=6.8, color=RGBColor(0x5A, 0x40, 0x00))

# Monitoring reminder
rect(slide, COL1_X, TOP_Y + 4.5, 2.2, 0.5, RGBColor(0xE8, 0xF2, 0xFF), C_BLUE, line_width=Pt(0.8), radius=6000)
add_text(slide, "MONITORING\nSerum Na q2-4h\nUrine Osm / Na daily\nNeuro checks", COL1_X, TOP_Y + 4.5, 2.2, 0.5,
         font_size=7, color=C_NAVY)

# Correction rate table
rect(slide, COL1_X, TOP_Y + 5.15, 2.2, 0.9, RGBColor(0xE8, 0xEE, 0xF6), C_NAVY, line_width=Pt(0.8), radius=6000)
add_text(slide, "CORRECTION RATE LIMITS\n──────────────────\nAcute (<48h): 1–2 mEq/L/h\nChronic (>48h): ≤10 mEq/L/24h\nDo NOT exceed 18 mEq/L/24h\nin any patient", COL1_X, TOP_Y + 5.15, 2.2, 0.9,
         font_size=7, color=C_NAVY)


# ══════════════════════════════════════════════════════════════════════════════
# COLUMN 2 — Plasma Osmolality Branch
# ══════════════════════════════════════════════════════════════════════════════
COL2_X = 2.7

# Header
rect(slide, COL2_X, TOP_Y, 3.5, 0.38, C_TEAL, radius=8000)
add_text(slide, "STEP 1 — PLASMA OSMOLALITY", COL2_X, TOP_Y, 3.5, 0.38, font_size=9, bold=True, color=C_WHITE)

arrow_down(slide, COL2_X + 1.75, TOP_Y + 0.38, 0.22)

# Diamond decision
diamond(slide, COL2_X + 0.35, TOP_Y + 0.60, 2.8, 0.65, C_BLUE, C_NAVY)
add_text(slide, "Plasma Osm?", COL2_X + 0.35, TOP_Y + 0.60, 2.8, 0.65, font_size=9.5, bold=True, color=C_WHITE)

# Three branches from diamond
# LEFT: Normal/High
rect(slide, COL2_X - 0.1, TOP_Y + 1.45, 1.6, 0.9, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=8000)
add_text(slide, "NORMAL\n(275–295)\nor HIGH\n(> 295)",
         COL2_X - 0.1, TOP_Y + 1.45, 1.6, 0.9, font_size=7.5, color=C_DARK_TXT)

rect(slide, COL2_X - 0.1, TOP_Y + 2.45, 1.6, 0.75, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=8000)
add_text(slide, "→ Pseudohypo-\nnatremia or\nHyperosmolar\n(Hyperglycemia)",
         COL2_X - 0.1, TOP_Y + 2.45, 1.6, 0.75, font_size=7, color=RGBColor(0x40, 0x40, 0x40))

# Pseudohyponatremia note
rect(slide, COL2_X - 0.1, TOP_Y + 3.3, 1.6, 0.65, RGBColor(0xF5, 0xF5, 0xF5), C_GRAY, line_width=Pt(0.8), radius=6000)
add_text(slide, "Correct Na for\nglucose:\n+1.6 mEq/L per\n100 mg/dL\nglucose ↑",
         COL2_X - 0.1, TOP_Y + 3.3, 1.6, 0.65, font_size=6.8, color=C_GRAY)

# CENTER: Low — proceed
rect(slide, COL2_X + 0.95, TOP_Y + 1.45, 1.65, 0.55, C_LIGHT_BG, C_BLUE, line_width=Pt(1), radius=8000)
add_text(slide, "LOW (< 275)\nTrue Hyponatremia\n→ Proceed", COL2_X + 0.95, TOP_Y + 1.45, 1.65, 0.55,
         font_size=7.5, bold=True, color=C_BLUE)

arrow_down(slide, COL2_X + 1.75, TOP_Y + 2.0, 0.32)

# Step 2 header
rect(slide, COL2_X, TOP_Y + 2.32, 3.5, 0.35, C_TEAL, radius=8000)
add_text(slide, "STEP 2 — URINE OSMOLALITY", COL2_X, TOP_Y + 2.32, 3.5, 0.35, font_size=9, bold=True, color=C_WHITE)

arrow_down(slide, COL2_X + 1.75, TOP_Y + 2.67, 0.22)

diamond(slide, COL2_X + 0.35, TOP_Y + 2.89, 2.8, 0.65, C_BLUE, C_NAVY)
add_text(slide, "Urine Osm?", COL2_X + 0.35, TOP_Y + 2.89, 2.8, 0.65, font_size=9.5, bold=True, color=C_WHITE)

# Low urine Osm
rect(slide, COL2_X - 0.0, TOP_Y + 3.7, 1.5, 0.75, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=8000)
add_text(slide, "< 100 mOsm/kg\nAppropriately\nDilute Urine", COL2_X - 0.0, TOP_Y + 3.7, 1.5, 0.75,
         font_size=7.5, color=C_DARK_TXT)
rect(slide, COL2_X - 0.0, TOP_Y + 4.5, 1.5, 0.55, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=6000)
add_text(slide, "→ Primary\nPolydipsia\n(psychogenic)", COL2_X - 0.0, TOP_Y + 4.5, 1.5, 0.55,
         font_size=7, color=C_GRAY)

# High urine Osm
rect(slide, COL2_X + 1.95, TOP_Y + 3.7, 1.55, 0.75, C_LIGHT_BG, C_BLUE, line_width=Pt(1), radius=8000)
add_text(slide, "> 100 mOsm/kg\nADH Active\n→ Proceed", COL2_X + 1.95, TOP_Y + 3.7, 1.55, 0.75,
         font_size=7.5, bold=True, color=C_BLUE)

arrow_down(slide, COL2_X + 1.75, TOP_Y + 4.5, 0.3)

# Step 3 header
rect(slide, COL2_X, TOP_Y + 4.8, 3.5, 0.35, C_TEAL, radius=8000)
add_text(slide, "STEP 3 — VOLUME STATUS", COL2_X, TOP_Y + 4.8, 3.5, 0.35, font_size=9, bold=True, color=C_WHITE)

arrow_down(slide, COL2_X + 1.75, TOP_Y + 5.15, 0.22)

diamond(slide, COL2_X + 0.35, TOP_Y + 5.37, 2.8, 0.7, C_BLUE, C_NAVY)
add_text(slide, "Clinical Volume\nStatus?", COL2_X + 0.35, TOP_Y + 5.37, 2.8, 0.7, font_size=9.5, bold=True, color=C_WHITE)

# Three branches
add_text(slide, "HYPO-\nVOLEMIC", COL2_X + 0.0, TOP_Y + 6.2, 0.9, 0.35, font_size=7.5, bold=True, color=C_DARK_TXT)
add_text(slide, "EU-\nVOLEMIC", COL2_X + 1.3, TOP_Y + 6.2, 0.9, 0.35, font_size=7.5, bold=True, color=C_DARK_TXT)
add_text(slide, "HYPER-\nVOLEMIC", COL2_X + 2.6, TOP_Y + 6.2, 0.9, 0.35, font_size=7.5, bold=True, color=C_DARK_TXT)

# Lines to col 3/4/5 headers — visual arrows
arrow_down(slide, COL2_X + 0.5, TOP_Y + 6.58, 0.25)
arrow_down(slide, COL2_X + 1.75, TOP_Y + 6.58, 0.25)
arrow_down(slide, COL2_X + 3.0, TOP_Y + 6.58, 0.25)

add_text(slide, "▼ Col 3", COL2_X + 0.1, TOP_Y + 6.83, 0.8, 0.2, font_size=6.5, italic=True, color=C_GRAY)
add_text(slide, "▼ Col 4 (SIADH)", COL2_X + 1.25, TOP_Y + 6.83, 1.1, 0.2, font_size=6.5, italic=True, color=C_PURPLE)
add_text(slide, "▼ Col 5", COL2_X + 2.65, TOP_Y + 6.83, 0.8, 0.2, font_size=6.5, italic=True, color=C_GRAY)


# ══════════════════════════════════════════════════════════════════════════════
# COLUMN 3 — Hypovolemic Hyponatremia
# ══════════════════════════════════════════════════════════════════════════════
COL3_X = 6.55

rect(slide, COL3_X, TOP_Y, 3.1, 0.38, C_TEAL, radius=8000)
add_text(slide, "HYPOVOLEMIC HYPONATREMIA", COL3_X, TOP_Y, 3.1, 0.38, font_size=9, bold=True, color=C_WHITE)

arrow_down(slide, COL3_X + 1.55, TOP_Y + 0.38, 0.22)

# Urine Na split
diamond(slide, COL3_X + 0.25, TOP_Y + 0.60, 2.6, 0.6, RGBColor(0x2B, 0x8C, 0xC4), C_NAVY)
add_text(slide, "Urine Na+?", COL3_X + 0.25, TOP_Y + 0.60, 2.6, 0.6, font_size=9, bold=True, color=C_WHITE)

# < 20 branch
rect(slide, COL3_X, TOP_Y + 1.35, 1.35, 0.75, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=8000)
add_text(slide, "< 20 mEq/L\nEXTRARENAL\nNa LOSS", COL3_X, TOP_Y + 1.35, 1.35, 0.75, font_size=7.5, color=C_DARK_TXT)

rect(slide, COL3_X, TOP_Y + 2.2, 1.35, 0.8, RGBColor(0xEA, 0xF5, 0xEA), C_GREEN, line_width=Pt(0.8), radius=6000)
add_text(slide, "Causes:\n• Vomiting/diarrhea\n• Burns\n• Third-spacing\n• Insensible loss",
         COL3_X, TOP_Y + 2.2, 1.35, 0.8, font_size=6.8, color=C_DARK_TXT)

# > 20 branch
rect(slide, COL3_X + 1.7, TOP_Y + 1.35, 1.4, 0.75, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=8000)
add_text(slide, "> 20 mEq/L\nRENAL\nNa LOSS", COL3_X + 1.7, TOP_Y + 1.35, 1.4, 0.75, font_size=7.5, color=C_DARK_TXT)

rect(slide, COL3_X + 1.7, TOP_Y + 2.2, 1.4, 0.8, RGBColor(0xEA, 0xF5, 0xEA), C_GREEN, line_width=Pt(0.8), radius=6000)
add_text(slide, "Causes:\n• Diuretics\n• Addison's dis.\n• Salt-wasting\n  nephropathy\n• Cerebral SVT",
         COL3_X + 1.7, TOP_Y + 2.2, 1.4, 0.8, font_size=6.8, color=C_DARK_TXT)

# Cerebral Salt Wasting note
rect(slide, COL3_X, TOP_Y + 3.1, 3.1, 0.6, RGBColor(0xFF, 0xF3, 0xE0), C_GOLD, line_width=Pt(0.8), radius=6000)
add_text(slide, "⚠  CSW vs SIADH\nCerebral salt wasting (neurosurg/SAH) mimics SIADH\nbut is HYPOVOLEMIC — treat differently!", COL3_X, TOP_Y + 3.1, 3.1, 0.6,
         font_size=7, color=RGBColor(0x5A, 0x35, 0x00))

# Treatment
rect(slide, COL3_X, TOP_Y + 3.8, 3.1, 0.35, C_GREEN, radius=8000)
add_text(slide, "TREATMENT — HYPOVOLEMIC", COL3_X, TOP_Y + 3.8, 3.1, 0.35, font_size=8.5, bold=True, color=C_WHITE)

arrow_down(slide, COL3_X + 1.55, TOP_Y + 4.15, 0.2)

rect(slide, COL3_X, TOP_Y + 4.35, 3.1, 2.1, C_LIGHT_GRN, C_GREEN, line_width=Pt(1), radius=8000)
add_text(slide,
         "1.  IV 0.9% Normal Saline (NS)\n     – Volume repletion\n     – ADH will suppress as volume restores\n\n"
         "2.  If diuretic-induced:\n     – Stop offending diuretic\n     – Monitor K+ (often depleted)\n\n"
         "3.  Adrenal insufficiency (Addison's):\n     – Hydrocortisone IV + fludrocortisone\n     – Will NOT respond to NS alone\n\n"
         "4.  Cerebral Salt Wasting:\n     – IV NS or hypertonic saline\n     – Fludrocortisone PO\n     – Do NOT fluid-restrict!",
         COL3_X, TOP_Y + 4.35, 3.1, 2.1, font_size=7, color=C_DARK_TXT, align=PP_ALIGN.LEFT, valign=MSO_ANCHOR.TOP)


# ══════════════════════════════════════════════════════════════════════════════
# COLUMN 4 — Euvolemic / SIADH
# ══════════════════════════════════════════════════════════════════════════════
COL4_X = 10.0

rect(slide, COL4_X, TOP_Y, 3.5, 0.38, C_PURPLE, radius=8000)
add_text(slide, "EUVOLEMIC HYPONATREMIA (SIADH)", COL4_X, TOP_Y, 3.5, 0.38, font_size=9, bold=True, color=C_WHITE)

arrow_down(slide, COL4_X + 1.75, TOP_Y + 0.38, 0.22)

# Differential in euvolemic
rect(slide, COL4_X, TOP_Y + 0.60, 3.5, 0.45, C_LIGHT_PUR, C_PURPLE, line_width=Pt(0.8), radius=6000)
add_text(slide, "Exclude: Hypothyroidism • Glucocorticoid deficiency\n(secondary adrenal insuff.) • Psychogenic polydipsia",
         COL4_X, TOP_Y + 0.60, 3.5, 0.45, font_size=7.5, color=C_PURPLE)

arrow_down(slide, COL4_X + 1.75, TOP_Y + 1.05, 0.22)

# SIADH dx criteria
rect(slide, COL4_X, TOP_Y + 1.27, 3.5, 0.35, C_PURPLE, radius=8000)
add_text(slide, "SIADH DIAGNOSTIC CRITERIA (Bartter-Schwartz)", COL4_X, TOP_Y + 1.27, 3.5, 0.35,
         font_size=8, bold=True, color=C_WHITE)

rect(slide, COL4_X, TOP_Y + 1.62, 3.5, 1.05, C_LIGHT_PUR, C_PURPLE, line_width=Pt(0.8), radius=6000)
add_text(slide,
         "✓  Plasma Osm < 275 mOsm/kg\n"
         "✓  Urine Osm > 100 mOsm/kg (usually > 300)\n"
         "✓  Urine Na+ > 20–30 mEq/L\n"
         "✓  Clinical euvolemia (no edema, no orthostasis)\n"
         "✓  Normal renal, thyroid, adrenal function\n"
         "✓  No diuretic use\n"
         "✓  Hypouricemia (UA < 4 mg/dL) — supportive",
         COL4_X, TOP_Y + 1.62, 3.5, 1.05, font_size=7.5, color=C_DARK_TXT, align=PP_ALIGN.LEFT, valign=MSO_ANCHOR.TOP)

arrow_down(slide, COL4_X + 1.75, TOP_Y + 2.67, 0.2)

# Aetiology
rect(slide, COL4_X, TOP_Y + 2.87, 3.5, 0.32, C_PURPLE, radius=8000)
add_text(slide, "FIND & TREAT UNDERLYING CAUSE", COL4_X, TOP_Y + 2.87, 3.5, 0.32, font_size=8, bold=True, color=C_WHITE)

rect(slide, COL4_X, TOP_Y + 3.19, 3.5, 0.95, C_LIGHT_PUR, C_PURPLE, line_width=Pt(0.8), radius=6000)
add_text(slide,
         "Cancer (18–25%): Small cell lung ca — CT Chest/Head\n"
         "CNS (9–26%): SAH, stroke, meningitis, TBI\n"
         "Pulmonary (11–19%): PNA, TB, resp. failure\n"
         "Drugs (8–18%): Carbamazepine, SSRIs, NSAIDs,\n"
         "   cyclophosphamide, opioids, oxcarbazepine\n"
         "Post-op (7–11%) • AIDS • Idiopathic",
         COL4_X, TOP_Y + 3.19, 3.5, 0.95, font_size=7, color=C_DARK_TXT, align=PP_ALIGN.LEFT, valign=MSO_ANCHOR.TOP)

arrow_down(slide, COL4_X + 1.75, TOP_Y + 4.14, 0.22)

# Treatment header
rect(slide, COL4_X, TOP_Y + 4.36, 3.5, 0.32, C_GREEN, radius=8000)
add_text(slide, "SIADH TREATMENT (by severity)", COL4_X, TOP_Y + 4.36, 3.5, 0.32, font_size=8.5, bold=True, color=C_WHITE)

arrow_down(slide, COL4_X + 1.75, TOP_Y + 4.68, 0.2)

# Severity diamond
diamond(slide, COL4_X + 0.5, TOP_Y + 4.88, 2.5, 0.6, C_PURPLE, C_NAVY)
add_text(slide, "Na+ Level?", COL4_X + 0.5, TOP_Y + 4.88, 2.5, 0.6, font_size=9, bold=True, color=C_WHITE)

# Mild
rect(slide, COL4_X, TOP_Y + 5.65, 1.1, 0.35, C_LIGHT_PUR, C_PURPLE, line_width=Pt(0.8), radius=6000)
add_text(slide, "130–134\nMILD", COL4_X, TOP_Y + 5.65, 1.1, 0.35, font_size=7.5, bold=True, color=C_PURPLE)

# Moderate
rect(slide, COL4_X + 1.2, TOP_Y + 5.65, 1.1, 0.35, C_LIGHT_PUR, C_PURPLE, line_width=Pt(0.8), radius=6000)
add_text(slide, "125–129\nMOD", COL4_X + 1.2, TOP_Y + 5.65, 1.1, 0.35, font_size=7.5, bold=True, color=C_PURPLE)

# Severe
rect(slide, COL4_X + 2.4, TOP_Y + 5.65, 1.1, 0.35, C_ORANGE, radius=6000)
add_text(slide, "< 125\nSEVERE", COL4_X + 2.4, TOP_Y + 5.65, 1.1, 0.35, font_size=7.5, bold=True, color=C_WHITE)

# Mild tx
arrow_down(slide, COL4_X + 0.55, TOP_Y + 6.0, 0.22)
rect(slide, COL4_X, TOP_Y + 6.22, 1.1, 0.9, C_LIGHT_GRN, C_GREEN, line_width=Pt(0.8), radius=6000)
add_text(slide, "• Treat cause\n• Fluid restrict\n  < 1.5 L/day\n• Salt tablets\n• Oral urea", COL4_X, TOP_Y + 6.22, 1.1, 0.9, font_size=6.8, color=C_DARK_TXT, align=PP_ALIGN.LEFT)

# Mod tx
arrow_down(slide, COL4_X + 1.75, TOP_Y + 6.0, 0.22)
rect(slide, COL4_X + 1.2, TOP_Y + 6.22, 1.1, 0.9, C_LIGHT_GRN, C_GREEN, line_width=Pt(0.8), radius=6000)
add_text(slide, "• Fluid restrict\n  < 800 mL/day\n• NaCl tabs\n• Furosemide\n• +/- Tolvaptan", COL4_X + 1.2, TOP_Y + 6.22, 1.1, 0.9, font_size=6.8, color=C_DARK_TXT, align=PP_ALIGN.LEFT)

# Severe tx
arrow_down(slide, COL4_X + 2.95, TOP_Y + 6.0, 0.22)
rect(slide, COL4_X + 2.4, TOP_Y + 6.22, 1.1, 0.9, RGBColor(0xFF, 0xEB, 0xE5), C_ORANGE, line_width=Pt(1), radius=6000)
add_text(slide, "• 3% NaCl IV\n• ICU/HDU\n• q2h Na check\n• Tolvaptan\n  AVOID if\n  Na<120", COL4_X + 2.4, TOP_Y + 6.22, 1.1, 0.9, font_size=6.5, color=RGBColor(0x7A, 0x20, 0x00), align=PP_ALIGN.LEFT)

# Normal saline warning
rect(slide, COL4_X, TOP_Y + 7.22, 3.5, 0.45, C_GOLD, radius=6000)
add_text(slide, "⚠  NORMAL SALINE (0.9%) CAN WORSEN SIADH!\nADH retains the water while Na is excreted → further ↓ Na+",
         COL4_X, TOP_Y + 7.22, 3.5, 0.45, font_size=7.5, bold=False, color=C_DARK_TXT)


# ══════════════════════════════════════════════════════════════════════════════
# COLUMN 5 — Hypervolemic Hyponatremia
# ══════════════════════════════════════════════════════════════════════════════
COL5_X = 13.85

rect(slide, COL5_X, TOP_Y, 3.0, 0.38, C_TEAL, radius=8000)
add_text(slide, "HYPERVOLEMIC HYPONATREMIA", COL5_X, TOP_Y, 3.0, 0.38, font_size=9, bold=True, color=C_WHITE)

arrow_down(slide, COL5_X + 1.5, TOP_Y + 0.38, 0.22)

# Urine Na split
diamond(slide, COL5_X + 0.2, TOP_Y + 0.60, 2.6, 0.6, RGBColor(0x2B, 0x8C, 0xC4), C_NAVY)
add_text(slide, "Urine Na+?", COL5_X + 0.2, TOP_Y + 0.60, 2.6, 0.6, font_size=9, bold=True, color=C_WHITE)

# < 20
rect(slide, COL5_X, TOP_Y + 1.35, 1.35, 0.65, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=8000)
add_text(slide, "< 20 mEq/L\nReduced ECV", COL5_X, TOP_Y + 1.35, 1.35, 0.65, font_size=7.5, color=C_DARK_TXT)

rect(slide, COL5_X, TOP_Y + 2.1, 1.35, 0.6, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=6000)
add_text(slide, "• Heart failure\n• Cirrhosis\n• Nephrotic\n  syndrome", COL5_X, TOP_Y + 2.1, 1.35, 0.6, font_size=6.8, color=C_DARK_TXT)

# > 20
rect(slide, COL5_X + 1.65, TOP_Y + 1.35, 1.35, 0.65, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=8000)
add_text(slide, "> 20 mEq/L\nRenal Na loss", COL5_X + 1.65, TOP_Y + 1.35, 1.35, 0.65, font_size=7.5, color=C_DARK_TXT)

rect(slide, COL5_X + 1.65, TOP_Y + 2.1, 1.35, 0.6, C_LIGHT_BG, C_GRAY, line_width=Pt(0.8), radius=6000)
add_text(slide, "• Acute/chronic\n  kidney disease\n• Diuretic use", COL5_X + 1.65, TOP_Y + 2.1, 1.35, 0.6, font_size=6.8, color=C_DARK_TXT)

arrow_down(slide, COL5_X + 1.5, TOP_Y + 2.7, 0.22)

# Treatment
rect(slide, COL5_X, TOP_Y + 2.92, 3.0, 0.32, C_GREEN, radius=8000)
add_text(slide, "TREATMENT — HYPERVOLEMIC", COL5_X, TOP_Y + 2.92, 3.0, 0.32, font_size=8.5, bold=True, color=C_WHITE)

rect(slide, COL5_X, TOP_Y + 3.24, 3.0, 1.5, C_LIGHT_GRN, C_GREEN, line_width=Pt(1), radius=8000)
add_text(slide,
         "Heart Failure:\n"
         "• Fluid restriction (<1–1.5 L/day)\n"
         "• Loop diuretics (furosemide)\n"
         "• Treat underlying HF (ACEi/ARB, BB)\n"
         "• Vaptan (tolvaptan) if refractory\n\n"
         "Cirrhosis:\n"
         "• Salt restriction, fluid restrict\n"
         "• Diuretics (spironolactone ± furo)\n"
         "• Avoid NSAIDs / nephrotoxins\n\n"
         "Renal Failure:\n"
         "• Restrict fluid + Na+ intake\n"
         "• Dialysis if severe/anuric",
         COL5_X, TOP_Y + 3.24, 3.0, 1.5, font_size=7, color=C_DARK_TXT, align=PP_ALIGN.LEFT, valign=MSO_ANCHOR.TOP)

# ── Vaptan comparison box ───────────────────────────────────────────────────
rect(slide, COL5_X, TOP_Y + 4.9, 3.0, 0.32, C_TEAL, radius=8000)
add_text(slide, "VASOPRESSIN RECEPTOR ANTAGONISTS (Vaptans)", COL5_X, TOP_Y + 4.9, 3.0, 0.32, font_size=8, bold=True, color=C_WHITE)

rect(slide, COL5_X, TOP_Y + 5.22, 3.0, 1.2, C_LIGHT_BG, C_TEAL, line_width=Pt(0.8), radius=6000)
add_text(slide,
         "Tolvaptan (PO): V2 antagonist\n"
         "• Use: SIADH, HF, cirrhosis\n"
         "• Caution: do NOT use if Na < 120 mEq/L\n"
         "• CI: liver disease, hypovolemia\n"
         "• Risk: rapid Na rise in 27% if Na<120\n\n"
         "Conivaptan (IV): V1a+V2 antagonist\n"
         "• Inpatient use only (short-term)\n"
         "• Effective for hospital hyponatremia",
         COL5_X, TOP_Y + 5.22, 3.0, 1.2, font_size=7, color=C_DARK_TXT, align=PP_ALIGN.LEFT, valign=MSO_ANCHOR.TOP)


# ══════════════════════════════════════════════════════════════════════════════
# BOTTOM FOOTER: ODS / Summary
# ══════════════════════════════════════════════════════════════════════════════
FOOTER_Y = 11.55
rect(slide, 0.15, FOOTER_Y, 19.7, 0.35, C_NAVY, radius=8000)
add_text(slide,
         "ODS RISK FACTORS: Na < 105 mEq/L  |  Chronic hyponatremia (>48h)  |  Malnourishment / Alcoholism  |  Liver disease  |  Hypokalaemia  ──  If ODS risk: limit correction to ≤ 8 mEq/L/24h",
         0.15, FOOTER_Y, 19.7, 0.35, font_size=7.5, bold=False, color=C_WHITE)

# Source
rect(slide, 0.15, FOOTER_Y + 0.4, 19.7, 0.25, RGBColor(0xE8, 0xEE, 0xF6))
add_text(slide,
         "Sources: Goldman-Cecil Medicine 2025 • Washington Manual of Medical Therapeutics • Brenner & Rector's The Kidney • Symptom to Diagnosis: An Evidence-Based Guide, 4e • Costanzo Physiology 7e",
         0.15, FOOTER_Y + 0.4, 19.7, 0.25, font_size=6.5, italic=True, color=C_GRAY)


# ══════════════════════════════════════════════════════════════════════════════
# SAVE
# ══════════════════════════════════════════════════════════════════════════════
out_path = "/tmp/workspace/hyponatremia-flowchart/Hyponatremia_Management_Flowchart.pptx"
prs.save(out_path)
print(f"Saved: {out_path}")
Running Command

cd /tmp/workspace/hyponatremia-flowchart && python build_flowchart.py 2>&1

Running Command

ls -lh /tmp/workspace/hyponatremia-flowchart/ && python -c " from pptx import Presentation prs = Presentation('/tmp/workspace/hyponatremia-flowchart/Hyponatremia_Management_Flowchart.pptx') print(f'Slides: {len(prs.slides)}') print(f'Width: {prs.slide_width.inches:.1f}\" x Height: {prs.slide_height.inches:.1f}\"') count = sum(1 for sl in prs.slides for sh in sl.shapes) print(f'Total shapes: {count}') "

Your clinical decision flowchart is ready:

Hyponatremia Management Flowchart

Presentation · PPTX


What's in the flowchart

The slide is a single wide-format page (20" × 13") with 5 columns and 162 shapes, color-coded by clinical category:
ColumnContent
Col 1 - Emergency EntryDetects Na <135, flags severe symptoms, urgent 3% hypertonic NaCl protocol, ODS prevention box with correction rate limits (≤10 mEq/L/24h), high-risk ODS patient list, monitoring checklist
Col 2 - Stepwise Workup3-step diagnostic algorithm: Plasma Osm → Urine Osm → Volume Status; branches to all three volume states
Col 3 - HypovolemicUrine Na split (extrarenal vs renal Na loss), CSW vs SIADH warning, full treatment with NS, diuretic management, Addison's, and cerebral salt wasting
Col 4 - Euvolemic / SIADHFull Bartter-Schwartz diagnostic criteria, aetiology frequencies, severity-tiered treatment (mild/moderate/severe), normal saline warning box
Col 5 - HypervolemicHF, cirrhosis, renal failure causes and treatments; vaptan comparison (tolvaptan vs conivaptan) with contraindications
Color legend is printed on the slide: blue = decisions, green = treatment, orange = urgent/severe, purple = SIADH pathway, gold = cautions/warnings.
Sources: Goldman-Cecil Medicine 2025, Washington Manual, Brenner & Rector's The Kidney, Symptom to Diagnosis 4e, Costanzo Physiology 7e.
This is a shared conversation. Sign in to Orris to start your own chat.