This cookbook details how to deploy a localized, containerized medical toxicology, emergency medicine, and critical care decision-support engine for resuscitation bays, poison control centers, and intensive care units ($\text{ICUs}$) to ingest serum salicylate levels, serial blood gas ($\text{ABG/VBG}$) parameters, anion gap profiles, urine $\text{pH}$ telemetry, and neuro-pulmonary status, classify toxicity according to the Done Nomogram & Clinical Severity Matrix (Mild, Moderate, Severe, Life-Threatening), dissect the hallmark Mixed Respiratory Alkalosis & High Anion Gap Metabolic Acidosis ($\text{HAGMA}$), automate Sodium Bicarbonate Urinary Ion-Trapping Protocols (Target Urine $\text{pH } 7.5 - 8.0$), enforce Mandatory Potassium Repletion to Prevent Paradoxical Aciduria, gate Emergency Hemodialysis via $\text{EXTRIP}$ Workgroup Criteria, and manage the Lethal Post-Intubation Acidemia CNS Herniation Sentinel according to American College of Medical Toxicology ($\text{ACMT}$) and $\text{EXTRIP}$ consensus guidelines without external cloud API reliance.
Salicylates (aspirin / acetylsalicylic acid, oil of wintergreen / methyl salicylate, bismuth subsalicylate) are among the most common and complex overdoses encountered in critical care:
[Toxicology Telemetry: Salicylate mg/dL, Ingestion Time, ABG pH, pCO2, HCO3, K+, CNS Status]
│
▼
[Done Nomogram & Clinical Severity Matrix: Mild vs Moderate vs Severe vs Lethal]
│
▼
[Mixed Acid-Base Dissector: Respiratory Alkalosis + High Anion Gap Metabolic Acidosis]
│
▼
[Urinary Alkalinization Titrator: NaHCO3 D5W + KCl (Target Urine pH 7.5-8.0)]
│
▼
[Paradoxical Aciduria Sentinel: Mandatory K+ >= 4.0-4.5 mEq/L Co-Infusion]
│
▼
[EXTRIP Emergency Hemodialysis Gating: Acute >100mg/dL, Chronic >60mg/dL, CNS/ARDS]
│
▼
[Intubation Acidemia CNS Cross-over Hazard: Mechanical Ventilation Gating]
Install required scientific Python and medical toxicology modeling packages:
pip install numpy scipy pandas torch torchvision matplotlib
"""
Cookbook 357: Offline Clinical Toxicology Acute Salicylate Poisoning & Hemodialysis Engine
OpenPHR Clinical AI Working Group (https://openphr.org)
"""
import math
import numpy as np
import pandas as pd
from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass
@dataclass
class SalicylateTelemetry:
patient_id: str
age_years: float = 34.0
patient_weight_kg: float = 75.0
toxicity_type: str = "Acute" # "Acute", "Chronic"
hours_since_ingestion: float = 6.0 # For Done Nomogram (valid >= 6h)
serum_salicylate_mg_dl: float = 88.0 # > 30 = Toxic, > 60 = Mod, > 80 = Severe, > 100 = Dialysis
# Arterial Blood Gas (ABG) Telemetry
blood_gas_ph: float = 7.32 # Mixed acid-base
blood_gas_pco2_mmhg: float = 22.0 # Respiratory alkalosis / hyperventilation
serum_bicarbonate_meq_l: float = 11.0 # Severe metabolic acidosis
# Serum Electrolytes & Renal Function
serum_sodium_meq_l: float = 140.0
serum_potassium_meq_l: float = 3.6 # Hypokalemia -> Paradoxical aciduria risk!
serum_chloride_meq_l: float = 104.0
serum_creatinine_mg_dl: float = 1.4
urine_ph: float = 6.2 # Target is 7.5 - 8.0!
# Clinical Status
neurological_status: str = "Agitated, confused with severe bilateral tinnitus" # "Alert/tinnitus", "Agitated/confused", "Lethargic/delirious", "Coma/seizures"
has_noncardiogenic_pulmonary_edema: bool = False
is_mechanically_ventilated: bool = False
@dataclass
class SalicylateEvaluationReport:
patient_id: str
done_nomogram_severity: str # "SEVERE ACUTE SALICYLATE POISONING"
acid_base_dissection: str
anion_gap_value: float
urinary_alkalinization_orders: List[str]
extrip_hemodialysis_recommendation: str
safety_sentinels: List[str]
clinical_acmt_extrip_directive: str
class SalicylateToxicologyDecisionEngine:
"""
Offline clinical engine for Done nomogram staging, mixed acid-base dissection,
urinary ion trapping titration, and EXTRIP emergency hemodialysis gating.
"""
def stage_done_nomogram(self, d: SalicylateTelemetry) -> Tuple[str, str]:
lvl = d.serum_salicylate_mg_dl
hrs = max(6.0, d.hours_since_ingestion)
# Done Nomogram theoretical extrapolation: C_0 = C_t / (10^(-0.015 * t))
extrapolated_c0 = lvl / (10 ** (-0.015 * hrs))
if d.toxicity_type == "Chronic":
if lvl >= 60.0 or "confused" in d.neurological_status or "Lethargic" in d.neurological_status:
return "SEVERE / CRITICAL CHRONIC SALICYLISM", "High mortality risk in chronic toxicity due to widespread tissue saturation; lower threshold for hemodialysis."
elif lvl >= 30.0:
return "MODERATE CHRONIC SALICYLISM", "Moderate tissue accumulation requiring urinary alkalinization."
else:
return "MILD CHRONIC EXPOSURE", "Mild toxicity; discontinue salicylate."
else:
if lvl >= 120.0 or extrapolated_c0 >= 160.0:
return "LETHAL / CRITICAL ACUTE SALICYLATE POISONING", "Catastrophic intoxication; imminent cardiovascular collapse and cerebral edema."
elif lvl >= 90.0 or extrapolated_c0 >= 110.0:
return "SEVERE ACUTE SALICYLATE POISONING", "Severe metabolic disruption with neurotoxicity; emergent hemodialysis indicated."
elif lvl >= 60.0 or extrapolated_c0 >= 75.0:
return "MODERATE ACUTE SALICYLATE POISONING", "Moderate intoxication; requires aggressive urinary alkalinization and serial levels."
elif lvl >= 30.0:
return "MILD ACUTE SALICYLATE POISONING", "Mild intoxication with tinnitus and hyperpnea; initiate alkalinization."
else:
return "NON-TOXIC LEVEL (< 30 mg/dL)", "Below standard toxic threshold; monitor serial levels if early ingestion."
def dissect_acid_base(self, d: SalicylateTelemetry) -> Tuple[str, float]:
# Anion Gap = Na - (Cl + HCO3)
ag = d.serum_sodium_meq_l - (d.serum_chloride_meq_l + d.serum_bicarbonate_meq_l)
# Expected pCO2 in pure metabolic acidosis via Winter's formula: 1.5 * HCO3 + 8 +/- 2
winters_expected_pco2 = (1.5 * d.serum_bicarbonate_meq_l) + 8.0
if d.blood_gas_pco2_mmhg < (winters_expected_pco2 - 2.0):
acid_base = f"HALLMARK MIXED DISORDER: Primary Respiratory Alkalosis (Central Medullary Drive pCO2 {d.blood_gas_pco2_mmhg:.1f} < Winter's {winters_expected_pco2:.1f}) CONCURRENT WITH Primary High Anion Gap Metabolic Acidosis (AG {ag:.1f} mEq/L, Mitochondrial Uncoupling)."
else:
acid_base = f"Severe High Anion Gap Metabolic Acidosis (AG {ag:.1f} mEq/L) with relative respiratory fatigue/failure."
return acid_base, ag
def generate_urinary_alkalinization_plan(self, d: SalicylateTelemetry) -> Tuple[List[str], List[str]]:
orders = []
sentinels = []
orders.append("1. SODIUM BICARBONATE URINARY ION-TRAPPING PROTOCOL:")
orders.append(f" • Initial IV Bolus: Sodium Bicarbonate 1-2 mEq/kg IV ({d.patient_weight_kg * 1.5:.0f} mEq / 1-2 ampules) over 5-10 minutes.")
orders.append(" • Maintenance Infusion: 150 mEq NaHCO3 (3 amps) in 1,000 mL D5W + 40 mEq KCl at 150-200 mL/hr.")
orders.append(" • Target Goals: Maintain URINE pH between 7.5 and 8.0, and SERUM pH between 7.45 and 7.55.")
orders.append(" • Hold/Wean Infusion if Serum pH >= 7.55 to prevent severe systemic alkalemia.")
# Mandatory Potassium Co-Administration Sentinel
if d.serum_potassium_meq_l < 4.0:
sentinels.append(f"🚨 PARADOXICAL ACIDURIA HAZARD (Serum K+ {d.serum_potassium_meq_l:.1f} mEq/L < 4.0): In the presence of hypokalemia, renal distal tubule H+/K+ ATPases secrete H+ into the tubular lumen to salvage potassium, producing ACIDIC URINE (pH {d.urine_ph:.1f}) despite systemic alkalinization. AGGRESSIVELY REPLETE POTASSIUM (Target K+ 4.0 - 4.5 mEq/L) or urinary alkalinization will 100% FAIL!")
orders.append(" • ⚠️ STAT POTASSIUM CORRECTION: Add 20-40 mEq KCl per liter of IV fluid; check K+ q2h.")
return orders, sentinels
def evaluate_extrip_hemodialysis(self, d: SalicylateTelemetry, ag: float) -> Tuple[str, List[str]]:
sentinels = []
criteria_met = []
lvl = d.serum_salicylate_mg_dl
is_acute = d.toxicity_type == "Acute"
if is_acute and lvl >= 100.0:
criteria_met.append(f"Acute Salicylate Level >= 100 mg/dL ({lvl:.1f} mg/dL)")
elif not is_acute and lvl >= 60.0:
criteria_met.append(f"Chronic Salicylate Level >= 60 mg/dL ({lvl:.1f} mg/dL)")
if "confused" in d.neurological_status or "Lethargic" in d.neurological_status or "Coma" in d.neurological_status:
criteria_met.append(f"Severe Neurotoxicity / Cerebral Edema Risk ({d.neurological_status})")
if d.has_noncardiogenic_pulmonary_edema:
criteria_met.append("Non-Cardiogenic Pulmonary Edema / ARDS (Volume overload hazard with bicarb)")
if d.blood_gas_ph < 7.20:
criteria_met.append(f"Refractory Acidemia (Blood pH {d.blood_gas_ph:.2f} < 7.20)")
if d.serum_creatinine_mg_dl >= 2.0:
criteria_met.append(f"Acute Kidney Injury (Creatinine {d.serum_creatinine_mg_dl:.1f} mg/dL)")
if criteria_met:
status = f"🚨 EMERGENCY INTERMITTENT HEMODIALYSIS MANDATED (EXTRIP Criteria Met: {'; '.join(criteria_met)})."
sentinels.append("🚨 STAT NEPHROLOGY CONSULT: Immediate hemodialysis catheter placement and intermittent hemodialysis initiation. Hemodialysis rapidly clears salicylate, corrects refractory acid-base disturbances, and removes fluid in ARDS.")
else:
status = "Hemodialysis Not Immediately Mandated (Continue aggressive urinary alkalinization & serial salicylate levels q2h)."
# Intubation Hazard Sentinel
sentinels.append("🚨 LETHAL INTUBATION & MECHANICAL VENTILATION HAZARD: Endotracheal intubation and hypoventilation/apnea causes acute pCO2 elevation and profound acidemia, forcing non-ionized salicylic acid across the blood-brain barrier into brain tissue with rapid fatal cerebral herniation. AVOID INTUBATION IF POSSIBLE. If unavoidable, pre-medicate with 2-3 amps NaHCO3, match high spontaneous minute ventilation, and initiate STAT hemodialysis!")
return status, sentinels
def evaluate_case(self, data: SalicylateTelemetry) -> SalicylateEvaluationReport:
stage, stage_desc = self.stage_done_nomogram(data)
acid_base, ag = self.dissect_acid_base(data)
bicarb_plan, sentinels_bicarb = self.generate_urinary_alkalinization_plan(data)
extrip_plan, sentinels_extrip = self.evaluate_extrip_hemodialysis(data, ag)
all_sentinels = sentinels_bicarb + sentinels_extrip
directives = []
directives.append(f"STAGE: {stage}.")
directives.append(f"ACID-BASE: {acid_base}.")
directives.append(f"URINE ALKALINIZATION: Target urine pH 7.5-8.0.")
directives.append(f"EXTRIP: {extrip_plan}.")
return SalicylateEvaluationReport(
patient_id=data.patient_id,
done_nomogram_severity=stage,
acid_base_dissection=acid_base,
anion_gap_value=ag,
urinary_alkalinization_orders=bicarb_plan,
extrip_hemodialysis_recommendation=extrip_plan,
safety_sentinels=all_sentinels,
clinical_acmt_extrip_directive=" ".join(directives)
)
# Example Execution & Verification
if __name__ == "__main__":
engine = SalicylateToxicologyDecisionEngine()
print("=" * 80)
print("OpenPHR Clinical Medical Toxicology Salicylate & Hemodialysis Engine")
print("=" * 80)
# Test Case 1: 34-year-old male with Acute Aspirin Ingestion (88 mg/dL at 6 hours).
# Labs: ABG pH 7.32, pCO2 22 mmHg, HCO3 11 mEq/L (Mixed Resp Alkalosis + High AG 25 mEq/L Metabolic Acidosis).
# K+: 3.6 mEq/L (Hypokalemia -> Paradoxical Aciduria Risk! Urine pH 6.2).
# Exam: Agitated, confused with severe tinnitus (Neurotoxicity).
# Triage: IV NaHCO3 D5W + KCl (Target Urine pH 7.5-8.0) + EXTRIP Hemodialysis Evaluation!
# Sentinel: Intubation Hazard + Paradoxical Aciduria!
sal1 = SalicylateTelemetry(
patient_id="TOX-ASA-4401",
age_years=34.0,
patient_weight_kg=75.0,
toxicity_type="Acute",
hours_since_ingestion=6.0,
serum_salicylate_mg_dl=88.0,
blood_gas_ph=7.32,
blood_gas_pco2_mmhg=22.0,
serum_bicarbonate_meq_l=11.0,
serum_sodium_meq_l=140.0,
serum_potassium_meq_l=3.6,
serum_chloride_meq_l=104.0,
serum_creatinine_mg_dl=1.4,
urine_ph=6.2,
neurological_status="Agitated, confused with severe bilateral tinnitus",
has_noncardiogenic_pulmonary_edema=False,
is_mechanically_ventilated=False
)
rep1 = engine.evaluate_case(sal1)
print(f"\n[Patient {rep1.patient_id} - Toxicology Assessment]")
print(f"Severity Classification: {rep1.done_nomogram_severity}")
print(f"Acid-Base Dissection: {rep1.acid_base_dissection}")
print(f"Anion Gap: {rep1.anion_gap_value:.1f} mEq/L")
print("\nUrinary Ion-Trapping Alkalinization Orders:")
for o in rep1.urinary_alkalinization_orders:
print(f" {o}")
print(f"\nEXTRIP Hemodialysis Gating:\n {rep1.extrip_hemodialysis_recommendation}")
if rep1.safety_sentinels:
print("\nSafety Sentinels:")
for s in rep1.safety_sentinels:
print(f" 🚨 {s}")
print(f"\nACMT / EXTRIP Consensus Directive:\n{rep1.clinical_acmt_extrip_directive}")