This cookbook details how to deploy a localized, containerized interventional cardiology, cardiac catheterization suite, and percutaneous coronary intervention ($\text{PCI}$) decision-support engine for cath labs, structural heart teams, and coronary intensive care units to ingest quantitative coronary angiography ($\text{QCA}$) metrics, intravascular ultrasound ($\text{IVUS}$) cross-sections, and fractional flow reserve ($\text{FFR}$) telemetry, classify lesions under the Medina Binary Classification ($1,1,1 \text{ to } 0,0,1$), evaluate DEFINITION II Complex Bifurcation Criteria, gate Provisional 1-Stent Strategy (with Proximal Optimization Technique [$\text{POT}$]) vs Upfront 2-Stent Double-Kissing Crush ($\text{DK-Crush}$), validate the 8-Step DK-Crush Technical Protocol, and enforce Post-PCI IVUS Minimum Stent Area ($\text{MSA}$) optimization criteria according to European Bifurcation Club ($\text{EBC}$), ACC/AHA, and SCAI consensus guidelines without external cloud API reliance.
Coronary bifurcation lesions represent $15 - 20\%$ of all percutaneous coronary interventions and carry heightened risks of side-branch occlusion, stent thrombosis, and in-stent restenosis:
[Angiography Telemetry: LM vs Non-LM, Medina (P,D,S), SB Length/Stenosis, Angle, Calc]
│
▼
[Medina Binary Classifier: True (1,1,1 / 1,0,1 / 0,1,1) vs Non-True Bifurcation]
│
▼
[DEFINITION II Complexity Engine: Major & Minor Criteria Scoring]
│
▼
[Strategy Selection: Provisional 1-Stent + POT vs Upfront 2-Stent DK-Crush]
│
▼
[8-Step DK-Crush Checklist Gatekeeper & IVUS Minimum Stent Area (MSA) Audit]
Install required scientific Python and interventional cardiology modeling packages:
pip install numpy scipy pandas torch torchvision matplotlib
"""
Cookbook 320: Offline Interventional Cardiology Coronary Bifurcation & DK-Crush 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 BifurcationLesionTelemetry:
patient_id: str
age_years: float
is_left_main_bifurcation: bool = True # True = LM-LAD-LCx; False = LAD-Diag or LCx-OM
bifurcation_location_name: str = "Distal Left Main (LM/LAD/LCx)"
# Medina Binary Parameters (True if diameter stenosis >= 50%)
medina_proximal_main_vessel: int = 1 # 0 or 1
medina_distal_main_vessel: int = 1 # 0 or 1
medina_side_branch_ostium: int = 1 # 0 or 1
# Quantitative Coronary Angiography (QCA) Telemetry
side_branch_reference_diameter_mm: float = 3.0 # mm (Must be >= 2.5 mm for 2-stent)
side_branch_lesion_length_mm: float = 14.0 # mm (>= 10 mm = Major criterion)
side_branch_diameter_stenosis_percent: float = 85.0 # % (>= 70% = Major criterion)
main_vessel_reference_diameter_mm: float = 4.0 # mm
main_vessel_lesion_length_mm: float = 28.0 # mm (>= 25 mm = Minor criterion)
bifurcation_angle_degrees: float = 78.0 # degrees (< 45 or > 70 = Minor criterion)
moderate_or_severe_calcification: bool = True # Minor criterion
multiple_bifurcation_lesions_present: bool = False
intracoronary_thrombus_present: bool = False
# Intravascular Ultrasound (IVUS) Post-Stent Telemetry
ivus_main_vessel_polygon_msa_mm2: float = 8.4 # Target >= 7.0-8.0 mm2 for LM
ivus_lad_ostial_msa_mm2: float = 6.8 # Target >= 6.0 mm2
ivus_lcx_side_branch_ostial_msa_mm2: float = 4.6 # Target >= 4.0 mm2
@dataclass
class BifurcationEvaluationReport:
patient_id: str
medina_classification_string: str # e.g. "Medina (1,1,1) - True Bifurcation"
definition_ii_complexity_tier: str # "Complex Bifurcation (DEFINITION II Positive)", "Simple Bifurcation (DEFINITION II Negative)"
recommended_stenting_strategy: str # "Upfront 2-Stent DK-Crush Technique", "Provisional 1-Stent Strategy with POT"
procedural_execution_steps: List[str]
ivus_optimization_audit: List[str]
safety_sentinels: List[str]
clinical_ebc_scai_directive: str
class CoronaryBifurcationDecisionEngine:
"""
Offline clinical engine for Medina bifurcation lesion classification,
DEFINITION II complexity risk scoring, stenting technique selection,
and post-PCI IVUS optimization auditing.
"""
def classify_medina(self, p: int, d: int, s: int) -> Tuple[str, bool]:
medina_str = f"Medina ({p},{d},{s})"
# True bifurcation = (1,1,1), (1,0,1), (0,1,1)
is_true = (s == 1) and (p == 1 or d == 1)
label = f"{medina_str} - {'True Bifurcation' if is_true else 'Non-True / Simple Bifurcation'}"
return label, is_true
def evaluate_definition_ii_complexity(self, d: BifurcationLesionTelemetry) -> Tuple[str, List[str], List[str]]:
major_criteria = []
minor_criteria = []
# Major Criteria: SB lesion length >= 10 mm AND SB diameter stenosis >= 70%
if d.side_branch_diameter_stenosis_percent >= 70.0 and d.side_branch_lesion_length_mm >= 10.0:
major_criteria.append(f"Major Criterion Met: Side Branch Stenosis ({d.side_branch_diameter_stenosis_percent:.0f}%) >= 70% AND Lesion Length ({d.side_branch_lesion_length_mm} mm) >= 10 mm.")
# Minor Criteria
if d.moderate_or_severe_calcification:
minor_criteria.append("Minor Criterion: Moderate-to-severe vessel calcification.")
if d.multiple_bifurcation_lesions_present:
minor_criteria.append("Minor Criterion: Multiple bifurcation lesions.")
if d.bifurcation_angle_degrees < 45.0 or d.bifurcation_angle_degrees > 70.0:
minor_criteria.append(f"Minor Criterion: Unfavorable bifurcation angle ({d.bifurcation_angle_degrees:.0f} deg).")
if d.main_vessel_reference_diameter_mm < 2.5:
minor_criteria.append(f"Minor Criterion: Small main vessel RVD ({d.main_vessel_reference_diameter_mm} mm < 2.5 mm).")
if d.main_vessel_lesion_length_mm >= 25.0:
minor_criteria.append(f"Minor Criterion: Main vessel lesion length ({d.main_vessel_lesion_length_mm} mm >= 25 mm).")
if d.intracoronary_thrombus_present:
minor_criteria.append("Minor Criterion: Intracoronary thrombus.")
# DEFINITION II Positive: 1 Major OR (>= 2 Minor for borderline)
if len(major_criteria) >= 1 and (len(minor_criteria) >= 2 or d.is_left_main_bifurcation):
tier = "Complex Bifurcation (DEFINITION II Positive - Upfront 2-Stent Indicated)"
elif len(major_criteria) >= 1:
tier = "Moderate-to-High Complexity Bifurcation (DEFINITION II Major Met)"
else:
tier = "Simple Bifurcation (DEFINITION II Negative - Provisional Preferred)"
return tier, major_criteria, minor_criteria
def determine_stenting_strategy(self, tier: str, is_true: bool, d: BifurcationLesionTelemetry) -> Tuple[str, List[str]]:
steps = []
if "Complex" in tier or (is_true and d.side_branch_lesion_length_mm >= 10.0 and d.side_branch_reference_diameter_mm >= 2.5):
strategy = "Upfront 2-Stent Double-Kissing Crush (DK-Crush) Strategy"
steps.append("1. STEP 1 (PREPARATION): Wire both MV and SB; perform aggressive non-compliant pre-dilatation of both branches (Consider rotational/orbital atherectomy or intravascular lithotripsy if severe calcium).")
steps.append(f"2. STEP 2 (SB STENTING): Advance DES into SB ({d.side_branch_reference_diameter_mm} mm RVD) with 1-2 mm protrusion into MV. Park an uninflated balloon (1:1 sized) in MV.")
steps.append("3. STEP 3 (FIRST BALLOON CRUSH): Deploy SB DES at nominal pressure. Remove SB wire and stent balloon. Inflate MV balloon at 12-16 atm to crush the protruding SB stent struts flat against the MV wall.")
steps.append("4. STEP 4 (FIRST KISSING INFLATION - FKI): Re-wire SB through non-distal/middle strut. Inflate NC balloons simultaneously in MV and SB (First Kiss) to clear ostial struts.")
steps.append("5. STEP 5 (MV STENTING): Deploy MV DES across the crushed SB ostium at nominal pressure.")
steps.append("6. STEP 6 (PROXIMAL OPTIMIZATION TECHNIQUE - POT): Perform POT in proximal MV stent segment using short NC balloon sized 1:1 to proximal MV reference.")
steps.append("7. STEP 7 (SECOND KISSING INFLATION - SKI): Re-wire SB through middle/non-distal strut. Perform Second Kissing Balloon Inflation with NC balloons at high pressure.")
steps.append("8. STEP 8 (FINAL RE-POT): Perform Final re-POT in proximal MV to eliminate kissing balloon-induced elliptical stent distortion and guarantee circular apposition.")
else:
strategy = "Provisional 1-Stent Strategy with Mandatory POT"
steps.append("1. STEP 1 (PREPARATION & WIRING): Wire both MV and SB; pre-dilate main vessel (pre-dilate SB only if severe calcification or compromised TIMI flow).")
steps.append("2. STEP 2 (MV STENTING): Deploy DES in main vessel across side branch with jailed wire in SB.")
steps.append("3. STEP 3 (MANDATORY POT): Perform immediate Proximal Optimization Technique (POT) with short NC balloon sized 1:1 to proximal MV.")
steps.append("4. STEP 4 (SIDE BRANCH ASSESSMENT): Evaluate SB flow; if TIMI 3 flow, no severe ostial dissection, and FFR > 0.80, finish case without SB intervention.")
steps.append("5. STEP 5 (BAILOUT 2ND STENT IF NEEDED): If SB TIMI < 3, severe dissection, or persistent ischemia, re-wire SB and deploy second stent via T-and-Protrusion (TAP) or Culotte technique.")
return strategy, steps
def audit_ivus_expansion(self, d: BifurcationLesionTelemetry) -> List[str]:
audit = []
if d.is_left_main_bifurcation:
if d.ivus_main_vessel_polygon_msa_mm2 >= 8.0:
audit.append(f"✅ LM Polygonal Confluence MSA ({d.ivus_main_vessel_polygon_msa_mm2} mm2) meets target (>= 8.0 mm2).")
else:
audit.append(f"⚠️ UNDER-EXPANSION: LM Polygonal MSA ({d.ivus_main_vessel_polygon_msa_mm2} mm2) is below target (8.0 mm2) -> Perform high-pressure post-dilatation with larger NC balloon.")
if d.ivus_lad_ostial_msa_mm2 >= 6.0:
audit.append(f"✅ LAD Ostial MSA ({d.ivus_lad_ostial_msa_mm2} mm2) meets target (>= 6.0 mm2).")
else:
audit.append(f"⚠️ UNDER-EXPANSION: LAD Ostial MSA ({d.ivus_lad_ostial_msa_mm2} mm2) < 6.0 mm2.")
if d.ivus_lcx_side_branch_ostial_msa_mm2 >= 4.0:
audit.append(f"✅ LCx Ostial MSA ({d.ivus_lcx_side_branch_ostial_msa_mm2} mm2) meets target (>= 4.0 mm2).")
else:
audit.append(f"⚠️ UNDER-EXPANSION: LCx Ostial MSA ({d.ivus_lcx_side_branch_ostial_msa_mm2} mm2) < 4.0 mm2.")
else:
if d.ivus_lcx_side_branch_ostial_msa_mm2 >= 3.5:
audit.append(f"✅ Side Branch Ostial MSA ({d.ivus_lcx_side_branch_ostial_msa_mm2} mm2) meets target (>= 3.5 mm2).")
else:
audit.append(f"⚠️ UNDER-EXPANSION: Side Branch MSA ({d.ivus_lcx_side_branch_ostial_msa_mm2} mm2) < 3.5 mm2.")
return audit
def evaluate_case(self, data: BifurcationLesionTelemetry) -> BifurcationEvaluationReport:
medina_label, is_true = self.classify_medina(data.medina_proximal_main_vessel, data.medina_distal_main_vessel, data.medina_side_branch_ostium)
complexity_tier, major, minor = self.evaluate_definition_ii_complexity(data)
strategy, steps = self.determine_stenting_strategy(complexity_tier, is_true, data)
ivus_audit = self.audit_ivus_expansion(data)
sentinels = []
if data.is_left_main_bifurcation and "Complex" in complexity_tier:
sentinels.append("HIGH-RISK LEFT MAIN COMPLEX BIFURCATION: DKCRUSH-V trial demonstrates significant 3-year TLF reduction with DK-Crush over Provisional stenting (Risk difference 7.9% vs 14.8%). Upfront 2-stent strategy strongly recommended.")
if data.side_branch_reference_diameter_mm < 2.5:
sentinels.append(f"SMALL SIDE BRANCH WARNING (RVD {data.side_branch_reference_diameter_mm} mm < 2.5 mm): 2-stent techniques carry elevated in-stent restenosis risk in small vessels; consider Provisional stenting.")
directives = []
directives.append(f"CLASSIFICATION: {medina_label}.")
directives.append(f"COMPLEXITY: {complexity_tier}.")
directives.append(f"RECOMMENDED STRATEGY: {strategy}.")
directives.append("IMAGING GUIDANCE: Mandatory pre- and post-PCI IVUS optimization.")
return BifurcationEvaluationReport(
patient_id=data.patient_id,
medina_classification_string=medina_label,
definition_ii_complexity_tier=complexity_tier,
recommended_stenting_strategy=strategy,
procedural_execution_steps=steps,
ivus_optimization_audit=ivus_audit,
safety_sentinels=sentinels,
clinical_ebc_scai_directive=" ".join(directives)
)
# Example Execution & Verification
if __name__ == "__main__":
engine = CoronaryBifurcationDecisionEngine()
print("=" * 80)
print("OpenPHR Clinical Interventional Cardiology Bifurcation & DK-Crush Engine")
print("=" * 80)
# Test Case 1: 64-year-old male with Distal Left Main True Bifurcation (Medina 1,1,1)
# QCA: LM (4.0 mm RVD), LAD (3.5 mm RVD), LCx (3.0 mm RVD) with LCx lesion length = 14 mm (>= 10 mm) and stenosis = 85% (>= 70%)
# Minor criteria: Heavy calcification + Angle 78 deg -> DEFINITION II Positive Complex Bifurcation!
# Triage: Upfront 2-Stent DK-Crush (8-Step Protocol with FKI, POT, SKI, Final re-POT) + IVUS Optimization!
bif1 = BifurcationLesionTelemetry(
patient_id="CATH-BIF-9104",
age_years=64.0,
is_left_main_bifurcation=True,
bifurcation_location_name="Distal Left Main (LM/LAD/LCx)",
medina_proximal_main_vessel=1,
medina_distal_main_vessel=1,
medina_side_branch_ostium=1,
side_branch_reference_diameter_mm=3.0,
side_branch_lesion_length_mm=14.0,
side_branch_diameter_stenosis_percent=85.0,
main_vessel_reference_diameter_mm=4.0,
main_vessel_lesion_length_mm=28.0,
bifurcation_angle_degrees=78.0,
moderate_or_severe_calcification=True,
ivus_main_vessel_polygon_msa_mm2=8.4,
ivus_lad_ostial_msa_mm2=6.8,
ivus_lcx_side_branch_ostial_msa_mm2=4.6
)
rep1 = engine.evaluate_case(bif1)
print(f"\n[Patient {rep1.patient_id} - Cath Lab Assessment]")
print(f"Medina Classification: {rep1.medina_classification_string}")
print(f"Complexity Tier: {rep1.definition_ii_complexity_tier}")
print(f"Recommended Strategy: {rep1.recommended_stenting_strategy}")
print("\nProcedural Steps:")
for step in rep1.procedural_execution_steps:
print(f" {step}")
print("\nIVUS Expansion Audit:")
for ivus in rep1.ivus_optimization_audit:
print(f" {ivus}")
print("\nSafety Sentinels:")
for s in rep1.safety_sentinel_alerts if hasattr(rep1, 'safety_sentinel_alerts') else rep1.safety_sentinels:
print(f" • {s}")
print(f"\nEBC / SCAI Consensus Directive:\n{rep1.clinical_ebc_scai_directive}")
# Test Case 2: LAD / Diagonal Simple Bifurcation (Medina 1,1,0) -> Provisional 1-Stent Strategy!
bif2 = BifurcationLesionTelemetry(
patient_id="CATH-BIF-1042",
age_years=56.0,
is_left_main_bifurcation=False,
bifurcation_location_name="Mid-LAD / First Diagonal (D1)",
medina_proximal_main_vessel=1,
medina_distal_main_vessel=1,
medina_side_branch_ostium=0,
side_branch_reference_diameter_mm=2.5,
side_branch_lesion_length_mm=3.0,
side_branch_diameter_stenosis_percent=30.0,
main_vessel_reference_diameter_mm=3.25,
main_vessel_lesion_length_mm=18.0,
bifurcation_angle_degrees=55.0,
moderate_or_severe_calcification=False
)
rep2 = engine.evaluate_case(bif2)
print(f"\n[Patient {rep2.patient_id}] - Strategy: {rep2.recommended_stenting_strategy}")