SIADH
SIADH hyponatremia management
| Category | Examples | Frequency |
|---|---|---|
| Cancer | Small cell carcinoma of lung (most common), other malignancies producing ectopic ADH | 18-25% |
| Neurologic disease | Subarachnoid hemorrhage, stroke, meningitis, brain tumors, trauma | 9-26% |
| Intrathoracic disease | Pneumonia, tuberculosis, acute respiratory failure | 11-19% |
| Postoperative | Various surgical settings | 7-11% |
| Drugs | Carbamazepine (20-30% of patients), oxcarbazepine, SSRIs, TCAs, antipsychotics, NSAIDs, cyclophosphamide, vincristine, opioids, chlorpropamide, DDAVP/vasopressin, Ecstasy, nicotine, clofibrate | 8-18% |
| AIDS | Pneumocystis pneumonia, CNS infections, HIV-related adrenal insufficiency | Variable |
| Temporal arteritis | - | Rare |
| Idiopathic | - | Variable |
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.
| Subtype | Mechanism |
|---|---|
| Type A | Erratic, unpredictable AVP secretion - most common, associated with malignancy |
| Type B | Reset 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 C | Continuous "leak" of AVP from posterior pituitary regardless of osmolality |
| Type D | Normal AVP response - suggests another (non-AVP) antidiuretic substance |
| NSIAD | Nephrogenic Syndrome of Inappropriate Antidiuresis - constitutively activating V2R gene variant; clinically identical to SIADH but plasma AVP is suppressed |
| Option | Notes |
|---|---|
| Fluid restriction (<800 mL/day) | First-line for most. Unlikely to work if urine Osm >500 mOsm/L. Avoid in subarachnoid hemorrhage. |
| Oral salt tablets | Increases urine solute load, facilitates water excretion |
| Furosemide + salt tablets | Furosemide 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).
| Feature | SIADH |
|---|---|
| Volume status | Euvolemic |
| Plasma osmolality | Low (<275 mOsm/kg) |
| Urine osmolality | High (>100, usually >300 mOsm/kg) |
| Urine Na | Usually high (>20-30 mEq/L) |
| Serum uric acid | Low (<4 mg/dL) |
| Plasma ADH | Elevated (but may be "normal" absolute value - any measurable ADH is abnormal when plasma is hypo-osmolar) |
| BUN/Creatinine | Normal to low |
| Thyroid/adrenal | Normal (exclusion criteria) |
| First-line Rx | Fluid restriction + treat cause |
Create a clinical decision flowchart for hyponatremia management and treatment
mkdir -p /tmp/workspace/hyponatremia-flowchart && ls /tmp/workspace/
~/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}")
cd /tmp/workspace/hyponatremia-flowchart && python build_flowchart.py 2>&1
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}') "
Hyponatremia Management Flowchart
Presentation · PPTX
| Column | Content |
|---|---|
| Col 1 - Emergency Entry | Detects 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 Workup | 3-step diagnostic algorithm: Plasma Osm → Urine Osm → Volume Status; branches to all three volume states |
| Col 3 - Hypovolemic | Urine 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 / SIADH | Full Bartter-Schwartz diagnostic criteria, aetiology frequencies, severity-tiered treatment (mild/moderate/severe), normal saline warning box |
| Col 5 - Hypervolemic | HF, cirrhosis, renal failure causes and treatments; vaptan comparison (tolvaptan vs conivaptan) with contraindications |