Cardiac Tamponade is a hyper-acute, life-threatening hemodynamic emergency resulting from pericardial fluid accumulation under elevated intrapericardial pressure. Because the normal fibrous parietal pericardium is non-compliant, acute effusion volumes as small as $150 - 250\text{ mL}$ (e.g., following aortic dissection, post-PCI ventricular perforation, blunt thoracic trauma, or post-cardiac surgery) can rapidly exceed the pericardial stretch reserve, dramatically elevating intrapericardial pressure to equalize with intracardiac end-diastolic pressures. In chronic conditions (malignancy, uremia, tuberculosis), the pericardium stretches gradually to accommodate up to $1500 - 2000\text{ mL}$ before decompensating.
Equalization of chamber pressures causes severe impairment of diastolic ventricular filling, leading to acute reductions in stroke volume, profound drops in cardiac output, compensatory adrenergic tachycardia and vasoconstriction, and catastrophic shock.
Despite established consensus guidance from the European Society of Cardiology (ESC), the American College of Cardiology (ACC), and the American Society of Echocardiography (ASE), cardiac tamponade remains an under-recognized killer in acute settings due to three deceptive clinical pitfalls:
+---------------------------------------------------------------------------------------------------------+
| ACUTE CARDIAC TAMPONADE DIAGNOSTIC & RESUSCITATION CASCADE |
+---------------------------------------------------------------------------------------------------------+
| 1. BEDSIDE HEMODYNAMIC & PHYSICAL TRIAGE |
| - Pulsus Paradoxus (SBP drop on inspiration > 10 - 12 mmHg). |
| - Tachycardia (HR > 100 bpm) + Narrow Pulse Pressure + Elevated JVP. |
| - EKG: Low QRS voltage (< 0.5 mV in limb leads) & Electrical Alternans (pathognomonic swinging heart)|
+---------------------------------------------------------------------------------------------------------+
|
v
+---------------------------------------------------------------------------------------------------------+
| 2. POINT-OF-CARE ECHOCARDIOGRAPHIC (POCUS) TAMPONADE PHENOTYPE |
| - Right Atrial (RA) Late Diastolic / Systolic Inversion: Duration > 1/3 of cardiac cycle (Sens 100%)|
| - Right Ventricular (RV) Early Diastolic Collapse: Persistent free wall indentation (Spec 90%) |
| - Dilated, Plethoric IVC: Diameter > 2.1 cm with < 50% inspiratory collapse (collapsibility index <0.5)|
| - Transvalvular Respiratory Inflow Variations (Pulsed-Wave Doppler): |
| * Mitral Inflow E-velocity drops > 25 - 30% during inspiration |
| * Tricuspid Inflow E-velocity increases > 40 - 50% during inspiration |
+---------------------------------------------------------------------------------------------------------+
|
v
+---------------------------------------------------------------------------------------------------------+
| 3. ESC STEP-WISE TRIAGE SCORE GATING (>= 6 POINTS = EMERGENT DRAINAGE) |
| - Etiology Scoring (Malignancy, TB, Trauma, Dissection, Uremia) |
| - Clinical Hemodynamic Score (Shock, SBP < 90, Pulsus > 10, Rapid onset) |
| - Imaging Score (Circumferential effusion > 20 mm, RV collapse, RA collapse, Plethoric IVC) |
| - SCORE >= 6: Emergent Pericardiocentesis / Surgical Window (< 12-24 hours or immediate) |
+---------------------------------------------------------------------------------------------------------+
|
v
+---------------------------------------------------------------------------------------------------------+
| 4. RESUSCITATION & PROCEDURAL SENTINELS |
| - Intravascular Volume Expansion: 500 - 1000 mL Isotonic Crystalloid bolus to augment RV preload. |
| - POSITIVE PRESSURE VENTILATION CONTRAINDICATION: Avoid RSI/intubation prior to needle decompression.|
| - Inotropes: Norepinephrine / Dobutamine temporizing infusion if MAP < 65 mmHg. |
| - Procedure: Ultrasound-guided subxiphoid or apical pericardiocentesis with catheter drain placement.|
+---------------------------------------------------------------------------------------------------------+
The European Society of Cardiology (ESC) established a validated point scoring system to categorize the urgency of pericardiocentesis. A cumulative score of $\ge 6\text{ points}$ mandates urgent or emergent pericardial drainage without delay:
| Component | Clinical / Imaging Feature | Points |
|---|---|---|
| Etiology | Malignant disease known or strongly suspected | $+2$ |
| Tuberculosis or purulent/bacterial pericarditis suspected | $+2$ | |
| Recent thoracic trauma, percutaneous cardiac intervention (PCI), or surgery | $+3$ | |
| Known chronic renal failure / severe uremia | $+1$ | |
| Clinical Signs | Tachycardia ($ ext{HR} > 100\text{ bpm}$) | $+1$ |
| Hypotension ($ ext{SBP} < 90\text{ mmHg}$ or $ ext{MAP} < 65\text{ mmHg}$) | $+2$ | |
| Pulsus Paradoxus $> 10\text{ mmHg}$ | $+2$ | |
| Orthopnea or severe tachypnea ($ ext{RR} > 24\text{ breaths/min}$) | $+1$ | |
| Rapid acute symptom onset ($< 24 - 48\text{ hours}$) | $+1$ | |
| Echocardiography | Circumferential / Large effusion (diastolic echo-free space $> 20\text{ mm}$) | $+3$ |
| Moderate effusion ($10 - 20\text{ mm}$) | $+2$ | |
| Right Ventricular (RV) early diastolic free wall collapse | $+3$ | |
| Right Atrial (RA) systolic inversion / collapse | $+2$ | |
| Plethoric Inferior Vena Cava (IVC $> 2.1\text{ cm}$, $< 50\%$ inspiratory collapse) | $+2$ | |
| Mitral inflow respiratory variation $> 25\%$ or Tricuspid $> 40\%$ | $+1$ |
Normal physiology exhibits an inspiratory drop in systolic blood pressure of $< 10\text{ mmHg}$. During cardiac tamponade, ventricular interdependence is dramatically exaggerated because the total intrapericardial volume is fixed. Increased venous return to the right heart during inspiration pushes the interventricular septum leftward, severely restricting left ventricular end-diastolic volume and stroke volume:
\[\Delta\text{SBP}_{\text{respiratory}} = \text{SBP}_{\text{expiration}} - \text{SBP}_{\text{inspiration}}\]The following complete, zero-dependency Python engine evaluates the ESC Triage Score, Pulsus Paradoxus, POCUS signs, Doppler variations, and provides procedural pericardiocentesis guidance with mechanical ventilation guardrails.
#!/usr/bin/env python3
"""
OpenPHR Cookbook 379: Offline Clinical Emergency Cardiology & Critical Care Engine
Acute Cardiac Tamponade ESC 2015/2024 Triage Scoring, Bedside Echocardiographic
Hemodynamic Index, Pulsus Paradoxus Quantifier & Emergent Pericardiocentesis Protocol.
Dependencies: Python 3.8+ (Standard Library Only).
"""
from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List, Optional, Tuple, Union
class TamponadeUrgencyTier(Enum):
EMERGENT_DRAINAGE = "EMERGENT: Immediate / < 12-24h Pericardiocentesis (Score >= 6)"
URGENT_EVALUATION = "URGENT: Step-Down / Inpatient Monitoring with Diagnostic Tap (Score 4-5)"
CONSERVATIVE_MONITORING = "CONSERVATIVE: Medical Therapy & Serial Bedside Echocardiograms (Score < 4)"
class EffusionSizeCategory(Enum):
LARGE = "Large / Circumferential (> 20 mm echo-free space in diastole)"
MODERATE = "Moderate (10 - 20 mm echo-free space)"
SMALL = "Small (< 10 mm echo-free space)"
@dataclass
class TamponadeClinicalPresentation:
# Vital signs
heart_rate_bpm: int
systolic_bp_expiratory: int
systolic_bp_inspiratory: int
diastolic_bp_mmhg: int
respiratory_rate_bpm: int
spo2_percent: float
# Physical exam findings
jugular_venous_distension_jvd: bool
muffled_heart_sounds: bool
orthopnea_or_severe_dyspnea: bool
rapid_onset_hours: float # Hours since symptoms began
# Etiology and risk factors
known_or_suspected_malignancy: bool = False
suspected_tuberculosis_or_purulent: bool = False
recent_trauma_pci_or_cardiac_surgery: bool = False
chronic_kidney_disease_uremia: bool = False
aortic_dissection_suspected: bool = False
# POCUS / Echocardiographic findings
effusion_size_mm: float = 0.0
right_ventricle_early_diastolic_collapse: bool = False
right_atrium_late_diastolic_inversion: bool = False
ivc_diameter_cm: float = 1.5
ivc_inspiratory_collapse_percent: float = 60.0
mitral_e_velocity_expiration_cm_s: Optional[float] = None
mitral_e_velocity_inspiration_cm_s: Optional[float] = None
tricuspid_e_velocity_inspiration_cm_s: Optional[float] = None
tricuspid_e_velocity_expiration_cm_s: Optional[float] = None
# EKG findings
low_qrs_voltage: bool = False
electrical_alternans: bool = False
# Current airway / ventilator status
on_positive_pressure_ventilation: bool = False
peep_level_cmh2o: float = 0.0
@dataclass
class PulsusParadoxusAnalysis:
pulsus_paradoxus_mmhg: int
is_pathologic: bool
is_borderline: bool
clinical_interpretation: str
@dataclass
class DopplerVariationAnalysis:
mitral_respiratory_variation_percent: Optional[float]
tricuspid_respiratory_variation_percent: Optional[float]
mitral_tamponade_sign_positive: bool
tricuspid_tamponade_sign_positive: bool
clinical_summary: str
@dataclass
class TamponadeClinicalDecisionReport:
esc_triage_score: int
score_breakdown: Dict[str, int]
urgency_tier: TamponadeUrgencyTier
pulsus_paradoxus: PulsusParadoxusAnalysis
effusion_classification: EffusionSizeCategory
doppler_hemodynamics: DopplerVariationAnalysis
beck_triad_status: Dict[str, Union[bool, str]]
ventilation_safety_sentinel: Dict[str, str]
volume_resuscitation_guidance: Dict[str, str]
pericardiocentesis_guidance: Dict[str, Union[str, List[str]]]
aortic_dissection_contraindication: bool
class AcuteCardiacTamponadeEngine:
"""
Clinical Decision Support Engine for Acute Cardiac Tamponade Triage,
ESC Scoring, Echocardiographic Evaluation, and Procedural Guidance.
"""
@staticmethod
def calculate_pulsus_paradoxus(sbp_exp: int, sbp_insp: int) -> PulsusParadoxusAnalysis:
"""
Calculates Pulsus Paradoxus = SBP (expiration) - SBP (inspiration).
Normal: <= 10 mmHg
Borderline: 11 - 12 mmHg
Pathologic: > 12 mmHg (Strong clinical indicator of tamponade hemodynamics)
"""
delta_sbp = max(0, sbp_exp - sbp_insp)
is_pathologic = delta_sbp > 12
is_borderline = 10 < delta_sbp <= 12
if is_pathologic:
interp = (
f"Pathologic Pulsus Paradoxus ({delta_sbp} mmHg > 12 mmHg). Indicates profound "
"ventricular interdependence and elevated intrapericardial pressure equalizing with intracardiac pressures."
)
elif is_borderline:
interp = (
f"Borderline Pulsus Paradoxus ({delta_sbp} mmHg). Suggests early or compensated "
"tamponade; close continuous arterial line or manual sphygmomanometer monitoring indicated."
)
else:
interp = f"Normal respiratory systolic blood pressure variation ({delta_sbp} mmHg <= 10 mmHg)."
return PulsusParadoxusAnalysis(
pulsus_paradoxus_mmhg=delta_sbp,
is_pathologic=is_pathologic,
is_borderline=is_borderline,
clinical_interpretation=interp,
)
@staticmethod
def calculate_doppler_variations(
mitral_exp: Optional[float],
mitral_insp: Optional[float],
tricuspid_insp: Optional[float],
tricuspid_exp: Optional[float],
) -> DopplerVariationAnalysis:
"""
Calculates respiratory variations across mitral and tricuspid valve inflows.
- Mitral variation >= 25% is a major tamponade sign.
- Tricuspid variation >= 40% is a major tamponade sign.
"""
mitral_var = None
mitral_pos = False
if mitral_exp is not None and mitral_insp is not None and mitral_exp > 0:
mitral_var = round(((mitral_exp - mitral_insp) / mitral_exp) * 100.0, 1)
mitral_pos = mitral_var >= 25.0
tricuspid_var = None
tricuspid_pos = False
if tricuspid_insp is not None and tricuspid_exp is not None and tricuspid_exp > 0:
tricuspid_var = round(((tricuspid_insp - tricuspid_exp) / tricuspid_exp) * 100.0, 1)
tricuspid_pos = tricuspid_var >= 40.0
findings = []
if mitral_pos:
findings.append(f"Mitral inflow inspiratory drop of {mitral_var}% (threshold >= 25%)")
if tricuspid_pos:
findings.append(f"Tricuspid inflow inspiratory rise of {tricuspid_var}% (threshold >= 40%)")
summary = (
"Positive echocardiographic Doppler tamponade physiology: " + "; ".join(findings)
if findings
else "Doppler inflow variations do not meet significant tamponade thresholds."
)
return DopplerVariationAnalysis(
mitral_respiratory_variation_percent=mitral_var,
tricuspid_respiratory_variation_percent=tricuspid_var,
mitral_tamponade_sign_positive=mitral_pos,
tricuspid_tamponade_sign_positive=tricuspid_pos,
clinical_summary=summary,
)
@classmethod
def calculate_esc_score(
cls, p: TamponadeClinicalPresentation, pulsus: PulsusParadoxusAnalysis
) -> Tuple[int, Dict[str, int], TamponadeUrgencyTier]:
"""
Calculates cumulative ESC 2015/2024 Cardiac Tamponade Triage Score.
Score >= 6: Emergent Pericardiocentesis (< 12-24h or immediate)
Score 4-5: Urgent Step-Down Evaluation / Diagnostic Tap
Score < 4: Conservative Inpatient Surveillance
"""
score_breakdown = {}
total_score = 0
# --- Etiology scoring ---
if p.recent_trauma_pci_or_cardiac_surgery:
score_breakdown["Recent Trauma, PCI, or Cardiac Surgery"] = 3
total_score += 3
elif p.known_or_suspected_malignancy:
score_breakdown["Malignant Disease Etiology"] = 2
total_score += 2
elif p.suspected_tuberculosis_or_purulent:
score_breakdown["Tuberculosis or Purulent Infection"] = 2
total_score += 2
elif p.chronic_kidney_disease_uremia:
score_breakdown["Chronic Uremia / Renal Failure"] = 1
total_score += 1
# --- Clinical hemodynamic scoring ---
if p.heart_rate_bpm > 100:
score_breakdown["Tachycardia (HR > 100 bpm)"] = 1
total_score += 1
map_val = (p.systolic_bp_expiratory + (2 * p.diastolic_bp_mmhg)) / 3.0
if p.systolic_bp_expiratory < 90 or map_val < 65:
score_breakdown["Hypotension (SBP < 90 or MAP < 65 mmHg)"] = 2
total_score += 2
if pulsus.is_pathologic or pulsus.pulsus_paradoxus_mmhg > 10:
score_breakdown["Pulsus Paradoxus > 10 mmHg"] = 2
total_score += 2
if p.orthopnea_or_severe_dyspnea or p.respiratory_rate_bpm > 24:
score_breakdown["Orthopnea / Tachypnea (RR > 24)"] = 1
total_score += 1
if p.rapid_onset_hours <= 48.0:
score_breakdown["Rapid Clinical Onset (<= 48 hours)"] = 1
total_score += 1
# --- Echocardiographic scoring ---
if p.effusion_size_mm >= 20.0:
score_breakdown["Large Effusion (>= 20 mm diastolic space)"] = 3
total_score += 3
elif p.effusion_size_mm >= 10.0:
score_breakdown["Moderate Effusion (10-19 mm diastolic space)"] = 2
total_score += 2
if p.right_ventricle_early_diastolic_collapse:
score_breakdown["Right Ventricular Diastolic Collapse"] = 3
total_score += 3
if p.right_atrium_late_diastolic_inversion:
score_breakdown["Right Atrial Inversion / Collapse"] = 2
total_score += 2
# Plethoric IVC: diameter > 2.1 cm with < 50% collapse
if p.ivc_diameter_cm >= 2.1 and p.ivc_inspiratory_collapse_percent < 50.0:
score_breakdown["Plethoric IVC (> 2.1 cm with < 50% collapse)"] = 2
total_score += 2
# Determination of urgency tier
if total_score >= 6:
tier = TamponadeUrgencyTier.EMERGENT_DRAINAGE
elif total_score >= 4:
tier = TamponadeUrgencyTier.URGENT_EVALUATION
else:
tier = TamponadeUrgencyTier.CONSERVATIVE_MONITORING
return total_score, score_breakdown, tier
@classmethod
def evaluate_presentation(
cls, p: TamponadeClinicalPresentation
) -> TamponadeClinicalDecisionReport:
"""
Runs the complete end-to-end clinical cardiac tamponade evaluation.
"""
pulsus = cls.calculate_pulsus_paradoxus(
p.systolic_bp_expiratory, p.systolic_bp_inspiratory
)
doppler = cls.calculate_doppler_variations(
p.mitral_e_velocity_expiration_cm_s,
p.mitral_e_velocity_inspiration_cm_s,
p.tricuspid_e_velocity_inspiration_cm_s,
p.tricuspid_e_velocity_expiration_cm_s,
)
esc_score, breakdown, urgency = cls.calculate_esc_score(p, pulsus)
# Effusion categorization
if p.effusion_size_mm >= 20.0:
eff_class = EffusionSizeCategory.LARGE
elif p.effusion_size_mm >= 10.0:
eff_class = EffusionSizeCategory.MODERATE
else:
eff_class = EffusionSizeCategory.SMALL
# Beck's Triad Evaluation
is_hypotensive = p.systolic_bp_expiratory < 90
has_jvd = p.jugular_venous_distension_jvd
has_muffled = p.muffled_heart_sounds
triad_complete = is_hypotensive and has_jvd and has_muffled
triad_count = sum([is_hypotensive, has_jvd, has_muffled])
beck_report = {
"triad_complete": triad_complete,
"components_present": f"{triad_count} of 3 (Hypotension: {is_hypotensive}, JVD: {has_jvd}, Muffled Sounds: {has_muffled})",
"clinical_warning": (
"Complete Beck's triad is present in < 30% of cardiac tamponade cases. "
"Absence of the full triad MUST NEVER delay echocardiography or drainage."
),
}
# Mechanical Ventilation Contraindication Sentinel
vent_sentinel = {
"contraindication_level": "ABSOLUTE EMERGENCY GUARDRAIL",
"rule": (
"AVOID POSITIVE PRESSURE MECHANICAL VENTILATION & INTUBATION PRIOR TO PERICARDIAL DRAINAGE. "
"Positive intrathoracic pressure and PEEP abolish venous return to a compressed right ventricle, "
"triggering instantaneous pulseless electrical activity (PEA) arrest."
),
"airway_strategy": (
"If intubation is mandatory for severe hypoxemia or airway protection, perform needle decompression "
"simultaneously or immediately before rapid sequence induction, and maintain spontaneous breathing if possible."
),
"current_status": (
f"WARNING: Patient is currently on positive pressure ventilation (PEEP {p.peep_level_cmh2o} cmH2O). "
"Reduce PEEP immediately to minimum tolerable level and expedite urgent pericardiocentesis!"
if p.on_positive_pressure_ventilation
else "Patient is spontaneously breathing. Preserve spontaneous respiration throughout preparation."
),
}
# Volume Resuscitation Guidance
vol_guidance = {
"strategy": "Volume Expansion Bridge to Procedural Decompression",
"fluid_type": "Isotonic Crystalloid (Plasmalyte or 0.9% Normal Saline)",
"volume_bolus": "500 to 1000 mL IV rapid bolus",
"mechanism": "Temporarily increases right atrial and right ventricular end-diastolic filling pressure to exceed intrapericardial pressure.",
"limitations": "Temporizing maneuver only (buys 15-45 minutes). Does NOT cure tamponade; can worsen pulmonary congestion if over-infused.",
"inotropic_support": "Norepinephrine infusion (titrated to MAP >= 65 mmHg) preferred over pure inodilators (avoid milrinone).",
}
# Pericardiocentesis Guidance
proc_guidance = {
"primary_approach": "Bedside Ultrasound-Guided Subxiphoid or Left Parasternal / Apical Pericardiocentesis",
"trajectory_subxiphoid": "Insert 18G spinal needle between xiphoid process and left costal margin at 30-45 degree angle aimed towards left shoulder under continuous ultrasound guidance.",
"trajectory_apical": "Left 5th intercostal space just lateral to cardiac apex aimed towards right shoulder (shortest distance to fluid pocket under direct visualization).",
"saline_agitation_test": "Inject 3-5 mL agitated saline microbubbles under POCUS view to confirm needle tip location inside the pericardial space and exclude inadvertent ventricular puncture.",
"procedural_steps": [
"1. Connect 18G needle to syringe with 5 mL saline under continuous echocardiographic visualization.",
"2. Advance slowly with negative syringe pressure until free-flowing pericardial fluid is aspirated.",
"3. Perform agitated microbubble contrast injection under subcostal 4-chamber view to confirm intrapericardial tip position.",
"4. Advance guidewire through needle via Seldinger technique; verify wire looping in pericardial space.",
"5. Dilate tract and insert 6-8 Fr pigtail drainage catheter; aspirate initial 50-100 mL to immediately restore hemodynamics.",
"6. Secure catheter to closed gravity drainage system; leave in place until 24-hour drainage is < 25-30 mL.",
],
}
# Aortic Dissection Absolute Contraindication
dissection_risk = p.aortic_dissection_suspected
if dissection_risk:
proc_guidance["CRITICAL_DISSECTION_CONTRAINDICATION"] = (
"STOP: TYPE A AORTIC DISSECTION WITH HEMOPERICARDIUM SUSPECTED. "
"Closed needle pericardiocentesis is CONTRAINDICATED because abrupt decompression of the "
"pericardium removes the tamponade counter-pressure on the aortic tear, inducing fatal free rupture. "
"Immediate emergent transfer to the operating room for open sternotomy and aortic repair is required. "
"Aspirate only minimal fluid (10-20 mL) if in active cardiac arrest."
)
return TamponadeClinicalDecisionReport(
esc_triage_score=esc_score,
score_breakdown=breakdown,
urgency_tier=urgency,
pulsus_paradoxus=pulsus,
effusion_classification=eff_class,
doppler_hemodynamics=doppler,
beck_triad_status=beck_report,
ventilation_safety_sentinel=vent_sentinel,
volume_resuscitation_guidance=vol_guidance,
pericardiocentesis_guidance=proc_guidance,
aortic_dissection_contraindication=dissection_risk,
)
# =====================================================================
# SELF-CONTAINED CLINICAL VERIFICATION SUITE
# =====================================================================
def verify_clinical_scenarios():
print("=" * 80)
print("OpenPHR Cookbook 379: Cardiac Tamponade ESC Triage & Pericardiocentesis Suite")
print("=" * 80)
# Test Case 1: Severe Malignant Tamponade with Hemodynamic Collapse (Score >= 6)
pt_malignant = TamponadeClinicalPresentation(
heart_rate_bpm=128,
systolic_bp_expiratory=86,
systolic_bp_inspiratory=68, # Pulsus = 18 mmHg
diastolic_bp_mmhg=58,
respiratory_rate_bpm=28,
spo2_percent=92.0,
jugular_venous_distension_jvd=True,
muffled_heart_sounds=True,
orthopnea_or_severe_dyspnea=True,
rapid_onset_hours=24.0,
known_or_suspected_malignancy=True,
effusion_size_mm=26.0, # Large effusion
right_ventricle_early_diastolic_collapse=True,
right_atrium_late_diastolic_inversion=True,
ivc_diameter_cm=2.5,
ivc_inspiratory_collapse_percent=15.0, # Plethoric IVC
mitral_e_velocity_expiration_cm_s=80.0,
mitral_e_velocity_inspiration_cm_s=52.0, # 35% drop
tricuspid_e_velocity_inspiration_cm_s=90.0,
tricuspid_e_velocity_expiration_cm_s=55.0, # 63% rise
low_qrs_voltage=True,
electrical_alternans=True,
)
report1 = AcuteCardiacTamponadeEngine.evaluate_presentation(pt_malignant)
assert report1.esc_triage_score >= 6, f"Malignant tamponade must have score >= 6 (got {report1.esc_triage_score})"
assert report1.urgency_tier == TamponadeUrgencyTier.EMERGENT_DRAINAGE
assert report1.pulsus_paradoxus.is_pathologic is True, "Pulsus 18 mmHg must be pathologic"
assert report1.effusion_classification == EffusionSizeCategory.LARGE
assert report1.doppler_hemodynamics.mitral_tamponade_sign_positive is True
assert report1.doppler_hemodynamics.tricuspid_tamponade_sign_positive is True
assert report1.beck_triad_status["triad_complete"] is True
print("[*] Test Case 1 (Severe Malignant Tamponade - Large Effusion) PASSED")
print(f" - ESC Triage Score: {report1.esc_triage_score} points -> {report1.urgency_tier.value}")
print(f" - Pulsus Paradoxus: {report1.pulsus_paradoxus.pulsus_paradoxus_mmhg} mmHg (Pathologic: {report1.pulsus_paradoxus.is_pathologic})")
print(f" - Doppler Variations: Mitral drop {report1.doppler_hemodynamics.mitral_respiratory_variation_percent}%, Tricuspid rise {report1.doppler_hemodynamics.tricuspid_respiratory_variation_percent}%")
print(f" - Ventilation Sentinel: {report1.ventilation_safety_sentinel['rule'][:60]}...")
# Test Case 2: Post-PCI Pericardial Perforation / Type A Aortic Dissection Sentinel
pt_dissection = TamponadeClinicalPresentation(
heart_rate_bpm=115,
systolic_bp_expiratory=82,
systolic_bp_inspiratory=70,
diastolic_bp_mmhg=50,
respiratory_rate_bpm=24,
spo2_percent=94.0,
jugular_venous_distension_jvd=True,
muffled_heart_sounds=False,
orthopnea_or_severe_dyspnea=True,
rapid_onset_hours=2.0,
recent_trauma_pci_or_cardiac_surgery=True,
aortic_dissection_suspected=True,
effusion_size_mm=16.0,
right_ventricle_early_diastolic_collapse=True,
right_atrium_late_diastolic_inversion=True,
ivc_diameter_cm=2.3,
ivc_inspiratory_collapse_percent=20.0,
)
report2 = AcuteCardiacTamponadeEngine.evaluate_presentation(pt_dissection)
assert report2.aortic_dissection_contraindication is True, "Must identify dissection contraindication"
assert "CRITICAL_DISSECTION_CONTRAINDICATION" in report2.pericardiocentesis_guidance
assert report2.urgency_tier == TamponadeUrgencyTier.EMERGENT_DRAINAGE
print("\n[*] Test Case 2 (Acute Hemopericardium & Type A Dissection Sentinel) PASSED")
print(f" - ESC Triage Score: {report2.esc_triage_score} points")
print(f" - Dissection Guardrail: {report2.pericardiocentesis_guidance['CRITICAL_DISSECTION_CONTRAINDICATION'][:70]}...")
print("\n>>> ALL CLINICAL VERIFICATION TESTS PASSED (100% CONCORDANCE) <<<")
if __name__ == "__main__":
verify_clinical_scenarios()