Cookbook 357: Offline Clinical Toxicology Acute Salicylate Poisoning & Hemodialysis Engine

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.


1. Clinical Background & Medical Toxicology Architecture

Salicylates (aspirin / acetylsalicylic acid, oil of wintergreen / methyl salicylate, bismuth subsalicylate) are among the most common and complex overdoses encountered in critical care:


2. Pipeline & Workflow Architecture

[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]

3. Environment & Prerequisites

Install required scientific Python and medical toxicology modeling packages:

pip install numpy scipy pandas torch torchvision matplotlib

4. Complete Offline Python / PyTorch Implementation

"""
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}")

5. Clinical Verification & Guideline Conformance


6. References