Thiamine dose in wernicke encephalopathy
thiamine dose Wernicke encephalopathy
thiamine Wernicke encephalopathy treatment
PMID: 38306946
| Phase | Dose | Route | Duration |
|---|---|---|---|
| Acute/emergency | 500 mg TID | IV (preferred) | 2-3 days |
| Step-down | 250 mg once daily | IV or IM | 3-5 more days |
| Maintenance | 100 mg/day | Oral | Until diet normalizes |
| Feature | Response to thiamine |
|---|---|
| Ophthalmoplegia | Improves within 24 hours |
| Ataxia | Gradual improvement over days-weeks |
| Confusion | Variable - may resolve or persist |
| Korsakoff amnestic syndrome | Often permanent (only ~20% recover fully) |
Rate and concentration of KCL correction for central and peripheral lines
KCl IV potassium correction rate concentration peripheral central line guidelines
| Parameter | Peripheral Line | Central Line |
|---|---|---|
| Max concentration | 40 mEq/L | 150-200 mEq/L (up to 400 mEq/L with caution) |
| Standard rate | ≤10 mEq/hr | 10-20 mEq/hr |
| Max rate (severe, K <2.5) | Not recommended | Up to 40 mEq/hr with continuous ECG monitoring |
| Max daily dose (K ≥2.5) | 200 mEq/24 hr | 200 mEq/24 hr |
| Max daily dose (K <2.5) | - | Up to 400 mEq/24 hr |
| ECG monitoring | Recommended if symptomatic | Mandatory if >20 mEq/hr |
| Serum K+ | IV Rate | Notes |
|---|---|---|
| 3.0-3.5 mEq/L (mild) | 10 mEq/hr peripheral | Oral preferred if tolerated |
| 2.5-3.0 mEq/L (moderate) | 10 mEq/hr peripheral or 20 mEq/hr central | ECG monitoring |
| <2.5 mEq/L (severe) | 20-40 mEq/hr via central only | Continuous ECG monitoring mandatory; hold insulin in DKA until K ≥3.5 |
Create a quick-reference pocket card for IV potassium protocols
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/iv-kcl-card && python3 -c "import PIL; print('PIL ok')" && python3 -c "import reportlab; print('reportlab ok')"
~/iv-kcl-card/generate_card.py
from PIL import Image, ImageDraw, ImageFont
import os
# Card dimensions: standard pocket card 3.5" x 6" at 150 DPI = 525 x 900px
# Use 2x for retina: 1050 x 1800
W, H = 1050, 1900
# Color palette
BG = "#0D1B2A" # dark navy background
CARD_BG = "#112233" # slightly lighter panels
HDR_BLUE = "#1565C0" # section header blue
HDR_TEAL = "#00695C" # alternate section header teal
HDR_RED = "#B71C1C" # danger/warning red
HDR_AMBER = "#E65100" # amber for caution
GOLD = "#FFD54F" # accent gold
WHITE = "#FFFFFF"
LIGHT_GRAY= "#B0BEC5"
BORDER = "#37474F"
# Row alternating colours
ROW_A = "#152535"
ROW_B = "#0F1E2E"
img = Image.new("RGB", (W, H), BG)
draw = ImageDraw.Draw(img)
# ── Font loader ───────────────────────────────────────────────────────────────
def font(size, bold=False):
paths_bold = [
"/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
"/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf",
"/usr/share/fonts/truetype/freefont/FreeSansBold.ttf",
]
paths_reg = [
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
"/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf",
"/usr/share/fonts/truetype/freefont/FreeSans.ttf",
]
paths = paths_bold if bold else paths_reg
for p in paths:
if os.path.exists(p):
try:
return ImageFont.truetype(p, size)
except Exception:
continue
return ImageFont.load_default()
# ── Drawing helpers ───────────────────────────────────────────────────────────
def rrect(x, y, w, h, r=12, fill=CARD_BG, outline=None, ow=2):
draw.rounded_rectangle([x, y, x+w, y+h], radius=r, fill=fill,
outline=outline, width=ow)
def section_header(x, y, w, h, text, bg=HDR_BLUE, r=8):
draw.rounded_rectangle([x, y, x+w, y+h], radius=r, fill=bg)
f = font(26, bold=True)
bbox = draw.textbbox((0,0), text, font=f)
tw = bbox[2]-bbox[0]; th = bbox[3]-bbox[1]
draw.text((x + (w-tw)//2, y + (h-th)//2 - 1), text, font=f, fill=WHITE)
def label(x, y, text, size=22, color=WHITE, bold=False, anchor="la"):
draw.text((x, y), text, font=font(size, bold=bold), fill=color, anchor=anchor)
def table_row(x, y, w, h, cols, vals, bg=ROW_A, col_color=LIGHT_GRAY, val_color=WHITE):
draw.rectangle([x, y, x+w, y+h], fill=bg)
# dividing line
draw.line([(x, y+h-1), (x+w, y+h-1)], fill=BORDER, width=1)
total = sum(c[1] for c in cols)
cx = x + 8
for i, (_, cw) in enumerate(cols):
txt = vals[i]
bold_flag = (i == 0)
clr = val_color if i > 0 else col_color
draw.text((cx+2, y + (h-22)//2), txt, font=font(20, bold=bold_flag), fill=clr)
cx += cw
def divider(y, color=BORDER):
draw.line([(30, y), (W-30, y)], fill=color, width=1)
# ═══════════════════════════════════════════════════════════════════════════════
# HEADER BANNER
# ═══════════════════════════════════════════════════════════════════════════════
draw.rounded_rectangle([0, 0, W, 90], radius=0, fill=HDR_BLUE)
label(W//2, 18, "IV POTASSIUM (KCl) QUICK REFERENCE", size=32, bold=True, color=WHITE, anchor="ma")
label(W//2, 58, "Rate · Concentration · Monitoring", size=22, color=GOLD, anchor="ma")
y = 100
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 1 – ROUTE LIMITS
# ═══════════════════════════════════════════════════════════════════════════════
rrect(20, y, W-40, 290, r=10, fill=CARD_BG, outline=HDR_BLUE, ow=2)
section_header(20, y, W-40, 36, "ROUTE LIMITS AT A GLANCE", bg=HDR_BLUE)
y += 42
# Column headers
col_defs = [("Parameter", 290), ("Peripheral Line", 340), ("Central Line", 360)]
draw.rectangle([20, y, W-20, y+32], fill="#1A3A5C")
cx = 28
for name, cw in col_defs:
draw.text((cx+2, y+6), name, font=font(20, bold=True), fill=GOLD)
cx += cw
y += 32
rows = [
("Max Concentration", "40 mEq/L", "150–200 mEq/L"),
("Standard Rate", "≤ 10 mEq/hr", "10–20 mEq/hr"),
("Max Rate (K<2.5)", "⚠ Avoid", "Up to 40 mEq/hr"),
("Max Dose/24 hr", "200 mEq", "200–400 mEq"),
("ECG Monitoring", "If symptomatic", "Mandatory >20 mEq/hr"),
]
for i, (p, peri, cent) in enumerate(rows):
bg = ROW_A if i % 2 == 0 else ROW_B
draw.rectangle([20, y, W-20, y+34], fill=bg)
draw.line([(20, y+33), (W-20, y+33)], fill=BORDER, width=1)
cx = 28
draw.text((cx+2, y+7), p, font=font(20, bold=True), fill=LIGHT_GRAY)
cx += 290
draw.text((cx+2, y+7), peri, font=font(21, bold=False), fill=WHITE)
cx += 340
draw.text((cx+2, y+7), cent, font=font(21, bold=False), fill=GOLD)
y += 34
y += 10
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 2 – RATE BY SEVERITY
# ═══════════════════════════════════════════════════════════════════════════════
rrect(20, y, W-40, 250, r=10, fill=CARD_BG, outline=HDR_TEAL, ow=2)
section_header(20, y, W-40, 36, "RATE BY SERUM K⁺ LEVEL", bg=HDR_TEAL)
y += 42
col2 = [("Serum K⁺", 200), ("Severity", 160), ("Rate", 200), ("Route", 440)]
draw.rectangle([20, y, W-20, y+30], fill="#1A3D38")
cx = 28
for name, cw in col2:
draw.text((cx+2, y+5), name, font=font(20, bold=True), fill=GOLD)
cx += cw
y += 30
sev_rows = [
("3.0–3.5", "Mild", "10 mEq/hr", "Peripheral or PO"),
("2.5–3.0", "Moderate", "10–20 mEq/hr", "Peripheral / Central"),
("<2.5", "SEVERE", "20–40 mEq/hr", "Central ONLY + ECG"),
]
sev_colors = [WHITE, "#FFE082", "#FF7043"]
for i, (k, sev, rate, route) in enumerate(sev_rows):
bg = ROW_A if i % 2 == 0 else ROW_B
draw.rectangle([20, y, W-20, y+40], fill=bg)
draw.line([(20, y+39), (W-20, y+39)], fill=BORDER, width=1)
cx = 28
vals = [k, sev, rate, route]
widths = [200, 160, 200, 440]
for j, (v, cw) in enumerate(zip(vals, widths)):
c = sev_colors[i] if j in (0,1,2) else LIGHT_GRAY
bold_flag = (j <= 2)
draw.text((cx+2, y+10), v, font=font(21, bold=bold_flag), fill=c)
cx += cw
y += 40
y += 10
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 3 – CONCENTRATION GUIDE (two-column cards)
# ═══════════════════════════════════════════════════════════════════════════════
card_h = 175
# Peripheral card
rrect(20, y, 490, card_h, r=10, fill="#0A2540", outline="#1976D2", ow=2)
section_header(20, y, 490, 34, "PERIPHERAL LINE", bg="#1565C0")
lines_p = [
("Max concentration:", "40 mEq/L"),
("Standard infusion:", "20–40 mEq in 1 L NS"),
("Max rate:", "10 mEq/hr (8 mEq/hr surgical)"),
("Caution >30 mEq/L:", "Pain · Phlebitis · Burns"),
]
ly = y + 40
for lbl, val in lines_p:
draw.text((30, ly), lbl, font=font(19, bold=True), fill=LIGHT_GRAY)
draw.text((30, ly+21), val, font=font(20, bold=False), fill=WHITE)
ly += 44
# Central card
rrect(530, y, 490, card_h, r=10, fill="#0A2520", outline="#00897B", ow=2)
section_header(530, y, 490, 34, "CENTRAL LINE", bg="#00695C")
lines_c = [
("Max concentration:", "150–200 mEq/L"),
("High-conc available:", "Up to 400 mEq/L (pharmacy)"),
("Max rate:", "20 mEq/hr (40 mEq/hr severe)"),
("Mandatory:", "ECG monitoring if >20 mEq/hr"),
]
ly = y + 40
for lbl, val in lines_c:
draw.text((540, ly), lbl, font=font(19, bold=True), fill=LIGHT_GRAY)
draw.text((540, ly+21), val, font=font(20, bold=False), fill=WHITE)
ly += 44
y += card_h + 14
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 4 – CRITICAL RULES / WARNINGS
# ═══════════════════════════════════════════════════════════════════════════════
rrect(20, y, W-40, 270, r=10, fill="#1C0A0A", outline=HDR_RED, ow=2)
section_header(20, y, W-40, 36, "⚠ CRITICAL SAFETY RULES", bg=HDR_RED)
y += 44
warnings = [
("🚫", "NEVER give KCl undiluted IV → fatal cardiac arrest"),
("🍬", "AVOID dextrose solutions → insulin release worsens hypokalemia"),
("💊", "Give THIAMINE before glucose in malnourished patients"),
("🧲", "CHECK Mg²⁺ first → hypomagnesemia causes refractory hypokalemia"),
("💊", "CORRECT Mg before or alongside K⁺ replacement"),
("📈", "Each 20 mEq IV KCl raises serum K⁺ by ~0.25 mEq/L"),
]
for icon, txt in warnings:
draw.text((32, y), icon, font=font(20), fill=WHITE)
draw.text((60, y), txt, font=font(20, bold=False), fill=WHITE)
y += 36
y += 6
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 5 – ECG CHANGES
# ═══════════════════════════════════════════════════════════════════════════════
rrect(20, y, W-40, 160, r=10, fill="#1A1500", outline=HDR_AMBER, ow=2)
section_header(20, y, W-40, 34, "ECG CHANGES DURING INFUSION — STOP IF SEEN", bg=HDR_AMBER)
y += 40
ecg_items = [
"Peaked T waves",
"QRS widening >25% baseline",
"ST-segment depression",
"Loss / flattening of P waves",
"Prolonged QT interval",
"Ventricular arrhythmias",
]
col_w = (W-60)//3
for i, item in enumerate(ecg_items):
col = i % 3
row = i // 3
x_pos = 28 + col * col_w
y_pos = y + row * 38
draw.text((x_pos, y_pos), f"• {item}", font=font(20), fill="#FFE082")
y += 95
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 6 – SALT SELECTION
# ═══════════════════════════════════════════════════════════════════════════════
rrect(20, y, W-40, 130, r=10, fill=CARD_BG, outline="#7B1FA2", ow=2)
section_header(20, y, W-40, 34, "SALT SELECTION", bg="#6A1B9A")
y += 40
salt_rows = [
("KCl (chloride)", "First choice · corrects concurrent hypochloremic alkalosis"),
("K-Bicarbonate/Acetate","Metabolic acidosis"),
("K-Phosphate", "DKA · concurrent hypophosphatemia"),
]
for lbl, desc in salt_rows:
draw.text((30, y), f"▸ {lbl}:", font=font(19, bold=True), fill="#CE93D8")
draw.text((30+310, y), desc, font=font(19), fill=WHITE)
y += 30
y += 10
# ═══════════════════════════════════════════════════════════════════════════════
# FOOTER
# ═══════════════════════════════════════════════════════════════════════════════
draw.rectangle([0, H-42, W, H], fill="#0A0F18")
label(W//2, H-30, "Sources: Harriet Lane · Tintinalli · Morgan & Mikhail · Mulholland · FDA KCl label | For clinical guidance only",
size=16, color="#546E7A", anchor="ms")
# ── Save ──────────────────────────────────────────────────────────────────────
out = "/home/daytona/workspace/iv-kcl-card/IV_KCl_Pocket_Card.png"
img.save(out, format="PNG", dpi=(300, 300))
print(f"Saved: {out}")
print(f"Size: {img.size}")
python3 /home/daytona/workspace/iv-kcl-card/generate_card.py
Hypocalcemia secondary to panic attack, management