Spaces:
Sleeping
Sleeping
| # COOK Zenith Alpha Thoracic Grafts | |
| proximal_designs = [ | |
| {"graft_diameter": 18, "vessel_diameter_range": (15, 16), "graft_lengths": [105], "gap": 7}, | |
| {"graft_diameter": 20, "vessel_diameter_range": (17, 17), "graft_lengths": [105], "gap": 7}, | |
| {"graft_diameter": 22, "vessel_diameter_range": (18, 19), "graft_lengths": [105], "gap": 7}, | |
| {"graft_diameter": 24, "vessel_diameter_range": (20, 21), "graft_lengths": [105], "gap": 7}, | |
| {"graft_diameter": 26, "vessel_diameter_range": (22, 23), "graft_lengths": [105], "gap": 7}, | |
| {"graft_diameter": 28, "vessel_diameter_range": (24, 25), "graft_lengths": [109, 155, 201], "gap": 8}, | |
| {"graft_diameter": 30, "vessel_diameter_range": (26, 27), "graft_lengths": [109, 155, 201], "gap": 8}, | |
| {"graft_diameter": 32, "vessel_diameter_range": (28, 29), "graft_lengths": [109, 155, 201], "gap": 8}, | |
| {"graft_diameter": 34, "vessel_diameter_range": (30, 30), "graft_lengths": [113, 161, 209], "gap": 9}, | |
| {"graft_diameter": 36, "vessel_diameter_range": (31, 32), "graft_lengths": [113, 161, 209], "gap": 9}, | |
| {"graft_diameter": 38, "vessel_diameter_range": (33, 34), "graft_lengths": [117, 167, 217], "gap": 10}, | |
| {"graft_diameter": 40, "vessel_diameter_range": (35, 36), "graft_lengths": [117, 167, 217], "gap": 10}, | |
| {"graft_diameter": 42, "vessel_diameter_range": (37, 38), "graft_lengths": [121, 173, 225], "gap": 11}, | |
| {"graft_diameter": 44, "vessel_diameter_range": (39, 39), "graft_lengths": [125, 179, 233], "gap": 12}, | |
| {"graft_diameter": 46, "vessel_diameter_range": (40, 42), "graft_lengths": [125, 179, 233], "gap": 12}, | |
| ] | |
| proximal_tapered_designs = [ | |
| {"proximal_diameter": 32, "distal_diameter": 28, "vessel_range": (28, 29), "graft_lengths": [178, 201], "gap": 8}, | |
| {"proximal_diameter": 34, "distal_diameter": 30, "vessel_range": (30, 30), "graft_lengths": [161, 209], "gap": 9}, | |
| {"proximal_diameter": 36, "distal_diameter": 32, "vessel_range": (31, 32), "graft_lengths": [161, 209], "gap": 9}, | |
| {"proximal_diameter": 38, "distal_diameter": 34, "vessel_range": (33, 34), "graft_lengths": [167, 217], "gap": 10}, | |
| {"proximal_diameter": 40, "distal_diameter": 36, "vessel_range": (35, 36), "graft_lengths": [167, 217], "gap": 10}, | |
| {"proximal_diameter": 42, "distal_diameter": 38, "vessel_range": (37, 38), "graft_lengths": [173, 225], "gap": 11}, | |
| {"proximal_diameter": 44, "distal_diameter": 40, "vessel_range": (39, 39), "graft_lengths": [179, 233], "gap": 12}, | |
| {"proximal_diameter": 46, "distal_diameter": 42, "vessel_range": (40, 42), "graft_lengths": [179, 233], "gap": 12}, | |
| ] | |
| distal_designs = [ | |
| {"graft_diameter": 28, "vessel_diameter_range": (24, 25), "graft_lengths": [160], "gap": 8}, | |
| {"graft_diameter": 30, "vessel_diameter_range": (26, 27), "graft_lengths": [160], "gap": 8}, | |
| {"graft_diameter": 32, "vessel_diameter_range": (28, 29), "graft_lengths": [160], "gap": 8}, | |
| {"graft_diameter": 34, "vessel_diameter_range": (30, 30), "graft_lengths": [190], "gap": 8}, | |
| {"graft_diameter": 36, "vessel_diameter_range": (31, 32), "graft_lengths": [190], "gap": 9}, | |
| {"graft_diameter": 38, "vessel_diameter_range": (33, 34), "graft_lengths": [197], "gap": 10}, | |
| {"graft_diameter": 40, "vessel_diameter_range": (35, 36), "graft_lengths": [197], "gap": 10}, | |
| {"graft_diameter": 42, "vessel_diameter_range": (37, 38), "graft_lengths": [204], "gap": 11}, | |
| {"graft_diameter": 44, "vessel_diameter_range": (39, 39), "graft_lengths": [211], "gap": 12}, | |
| {"graft_diameter": 46, "vessel_diameter_range": (40, 41), "graft_lengths": [211], "gap": 12}, | |
| ] | |
| distal_extension_designs = [ | |
| {"graft_diameter": 22, "vessel_diameter_range": (18, 19), "graft_lengths": [104], "gap": 7}, | |
| {"graft_diameter": 26, "vessel_diameter_range": (22, 23), "graft_lengths": [104], "gap": 7}, | |
| {"graft_diameter": 30, "vessel_diameter_range": (26, 27), "graft_lengths": [108], "gap": 8}, | |
| {"graft_diameter": 34, "vessel_diameter_range": (30, 30), "graft_lengths": [112], "gap": 9}, | |
| {"graft_diameter": 38, "vessel_diameter_range": (33, 34), "graft_lengths": [91], "gap": 10}, | |
| {"graft_diameter": 42, "vessel_diameter_range": (37, 38), "graft_lengths": [94], "gap": 11}, | |
| {"graft_diameter": 46, "vessel_diameter_range": (40, 42), "graft_lengths": [97], "gap": 12}, | |
| ] | |
| def assign_selected_graft_parameters(proximal_code, distal_code, extension_code, proximal_generation_diameter, | |
| distal_graft_diameter, proximal_length, extension_length, distal_length, proximal_gap, | |
| extension_gap, distal_gap, distal_extension_overlap, proximal_distal_overlap): | |
| return { | |
| "is_custom": False, | |
| "proximal": proximal_code, | |
| "distal": distal_code, | |
| "extension": extension_code, | |
| "proximal_diameter": proximal_generation_diameter, | |
| "distal_diameter": float(distal_graft_diameter), | |
| "prox_length": float(proximal_length), | |
| "extension_length": float(extension_length), | |
| "distal_length": float(distal_length), | |
| "prox_gap": float(proximal_gap), | |
| "extension_gap": float(extension_gap), | |
| "distal_gap": float(distal_gap), | |
| "distal_extension_overlap": float(distal_extension_overlap), | |
| "proximal_distal_overlap": float(proximal_distal_overlap), | |
| } | |
| def generate_custom_endograft(proximal_diameter, distal_diameter, length): | |
| strut_amplitude = 15 | |
| gap = 10 | |
| proximal_distal_overlap = (3 * strut_amplitude) + (2 * gap) | |
| total_graft_length = length - proximal_distal_overlap | |
| proximal_length = total_graft_length // 2 | |
| distal_length = total_graft_length - proximal_length | |
| custom_proximal_code = f"ZTA_P_{proximal_diameter}_{proximal_length}_{gap}" | |
| custom_distal_code = f"ZTA_D_{distal_diameter}_{distal_length}_{gap}" | |
| custom_graft = assign_selected_graft_parameters( | |
| proximal_code=custom_proximal_code, | |
| distal_code=custom_distal_code, | |
| extension_code="ZTA_E_0_0_0", | |
| proximal_generation_diameter=float(proximal_diameter), | |
| distal_graft_diameter=float(distal_diameter), | |
| proximal_length=float(proximal_length), | |
| extension_length=0.0, | |
| distal_length=float(distal_length), | |
| proximal_gap=float(gap), | |
| extension_gap=0.0, | |
| distal_gap=float(gap), | |
| distal_extension_overlap=0.0, | |
| proximal_distal_overlap=float(proximal_distal_overlap) | |
| ) | |
| custom_graft["is_custom"] = True | |
| return custom_graft | |
| def get_endograft_parameters(vessel_diameter, component_type): | |
| lengths = None | |
| diameter = None | |
| gap = None | |
| if component_type == "proximal": | |
| designs = proximal_designs | |
| elif component_type == "proximal_tapered": | |
| designs = proximal_tapered_designs | |
| elif component_type == "distal": | |
| designs = distal_designs | |
| else: | |
| designs = distal_extension_designs | |
| for item in designs: | |
| if component_type == "proximal_tapered": | |
| vessel_range = item.get("vessel_range") or item.get("vessel_diameter_range") | |
| if vessel_range is None: | |
| continue | |
| min_vessel_diameter, max_vessel_diameter = vessel_range | |
| if min_vessel_diameter <= vessel_diameter <= max_vessel_diameter: | |
| lengths = item["graft_lengths"] | |
| diameter = { | |
| "proximal": item["proximal_diameter"], # We can return the proximal only | |
| "distal": item["distal_diameter"], | |
| } | |
| gap = item["gap"] | |
| break | |
| continue | |
| min_vessel_diameter, max_vessel_diameter = item["vessel_diameter_range"] | |
| if (min_vessel_diameter <= vessel_diameter <= max_vessel_diameter): | |
| lengths, diameter, gap = item["graft_lengths"], item["graft_diameter"], item["gap"] | |
| break | |
| return lengths, diameter, gap | |
| def choose_endograft(proximal_diameter, distal_diameter, length, fenestrations_exist, distance_to_last_fenestration): | |
| strut_amplitude = 15 | |
| is_tapered = (proximal_diameter - distal_diameter) == 4 | |
| if is_tapered: | |
| proximal_lengths, proximal_graft_diameter, proximal_gap = get_endograft_parameters(proximal_diameter, "proximal_tapered") # notice here the proximal graft diameter is a dictionary with proximal and distal diameters | |
| proximal_prefix = "ZTA_PT" | |
| else: | |
| proximal_lengths, proximal_graft_diameter, proximal_gap = get_endograft_parameters(proximal_diameter, "proximal") | |
| proximal_prefix = "ZTA_P" | |
| distal_lengths, distal_graft_diameter, distal_gap = get_endograft_parameters(distal_diameter, "distal") | |
| distal_prefix = "ZTA_D" | |
| # If no proximal component is found at all, we cannot use a standard Zenith Cook proximal component | |
| if proximal_lengths is None: | |
| return None | |
| if is_tapered and isinstance(proximal_graft_diameter, dict): | |
| proximal_code_diameter = f"{int(proximal_graft_diameter['proximal'])}_{int(proximal_graft_diameter['distal'])}" | |
| proximal_generation_diameter = float(proximal_graft_diameter["proximal"]) | |
| else: | |
| proximal_code_diameter = str(proximal_graft_diameter) | |
| proximal_generation_diameter = float(proximal_graft_diameter) | |
| # Only triggers if proximal is found, but NO distal components match | |
| if distal_lengths is None: | |
| # Exact match length using only Proximal | |
| for prox_len in proximal_lengths: | |
| if prox_len == length: | |
| proximal_code = f"{proximal_prefix}_{proximal_code_diameter}_{prox_len}_{proximal_gap}" | |
| graft = assign_selected_graft_parameters( | |
| proximal_code=proximal_code, distal_code="None", extension_code="None", | |
| proximal_generation_diameter=proximal_generation_diameter, distal_graft_diameter=float(distal_diameter), | |
| proximal_length=float(prox_len), extension_length=0.0, distal_length=0.0, | |
| proximal_gap=float(proximal_gap), extension_gap=0.0, distal_gap=0.0, | |
| distal_extension_overlap=0.0, proximal_distal_overlap=0.0 | |
| ) | |
| graft["is_custom"] = False | |
| return graft | |
| # Biggest length smaller than total + Custom Distal | |
| smaller_lengths = [p for p in proximal_lengths if p < length] | |
| if smaller_lengths: | |
| best_prox_len = max(smaller_lengths) | |
| custom_distal_gap = 10 | |
| proximal_distal_overlap = (3 * strut_amplitude) + (2 * custom_distal_gap) | |
| distal_length_needed = length - best_prox_len + proximal_distal_overlap | |
| custom_distal_diameter = round(distal_diameter * 1.15) | |
| proximal_code = f"{proximal_prefix}_{proximal_code_diameter}_{best_prox_len}_{proximal_gap}" | |
| custom_distal_code = f"ZTA_D_CUSTOM_{custom_distal_diameter}_{int(distal_length_needed)}_{custom_distal_gap}" | |
| custom_graft = assign_selected_graft_parameters( | |
| proximal_code=proximal_code, distal_code=custom_distal_code, extension_code="None", | |
| proximal_generation_diameter=proximal_generation_diameter, distal_graft_diameter=float(custom_distal_diameter), | |
| proximal_length=float(best_prox_len), extension_length=0.0, distal_length=float(distal_length_needed), | |
| proximal_gap=float(proximal_gap), extension_gap=0.0, distal_gap=float(custom_distal_gap), | |
| distal_extension_overlap=0.0, proximal_distal_overlap=float(proximal_distal_overlap) | |
| ) | |
| custom_graft["is_custom"] = False | |
| return custom_graft | |
| # If all standard proximals are longer than the total needed length, use the smallest one alone | |
| best_prox_len = min(proximal_lengths) | |
| proximal_code = f"{proximal_prefix}_{proximal_code_diameter}_{best_prox_len}_{proximal_gap}" | |
| graft = assign_selected_graft_parameters( | |
| proximal_code=proximal_code, distal_code="None", extension_code="None", | |
| proximal_generation_diameter=proximal_generation_diameter, distal_graft_diameter=float(distal_diameter), | |
| proximal_length=float(best_prox_len), extension_length=0.0, distal_length=0.0, | |
| proximal_gap=float(proximal_gap), extension_gap=0.0, distal_gap=0.0, | |
| distal_extension_overlap=0.0, proximal_distal_overlap=0.0 | |
| ) | |
| graft["is_custom"] = False | |
| return graft | |
| # Triggers when both Proximal and Distal components are found | |
| base_overlap = (3 * strut_amplitude) + (2 * distal_gap) | |
| selected_graft = None | |
| fallback_graft = None | |
| for proximal_length in proximal_lengths: | |
| for distal_length in distal_lengths: | |
| proximal_distal_overlap = base_overlap | |
| # Check whether the last fenestration falls inside the overlap region. | |
| fenestration_overlap = False | |
| if fenestrations_exist: | |
| overlap_start = proximal_length - proximal_distal_overlap | |
| if overlap_start < distance_to_last_fenestration < proximal_length: | |
| fenestration_overlap = True | |
| total_graft_length = (proximal_length + distal_length - proximal_distal_overlap ) | |
| proximal_code = ( | |
| f"{proximal_prefix}_{proximal_code_diameter}_" | |
| f"{proximal_length}_{proximal_gap}" | |
| ) | |
| distal_code = ( | |
| f"{distal_prefix}_{distal_graft_diameter}_" | |
| f"{distal_length}_{distal_gap}" | |
| ) | |
| extension_code = "ZTA_E_0_0_0" | |
| if abs(total_graft_length - length) < 1e-6: | |
| selected_graft = assign_selected_graft_parameters( | |
| proximal_code=proximal_code, | |
| distal_code=distal_code, | |
| extension_code=extension_code, | |
| proximal_generation_diameter=proximal_generation_diameter, | |
| distal_graft_diameter=distal_graft_diameter, | |
| proximal_length=proximal_length, | |
| extension_length=0.0, | |
| distal_length=distal_length, | |
| proximal_gap=proximal_gap, | |
| extension_gap=0.0, | |
| distal_gap=distal_gap, | |
| distal_extension_overlap=0.0, | |
| proximal_distal_overlap=proximal_distal_overlap) | |
| if not fenestration_overlap: | |
| return selected_graft | |
| if fallback_graft is None: | |
| fallback_graft = selected_graft | |
| elif total_graft_length > length: | |
| adjusted_overlap = (proximal_distal_overlap + (total_graft_length - length)) | |
| selected_graft = assign_selected_graft_parameters( | |
| proximal_code=proximal_code, | |
| distal_code=distal_code, | |
| extension_code=extension_code, | |
| proximal_generation_diameter=proximal_generation_diameter, | |
| distal_graft_diameter=distal_graft_diameter, | |
| proximal_length=proximal_length, | |
| extension_length=0.0, | |
| distal_length=distal_length, | |
| proximal_gap=proximal_gap, | |
| extension_gap=0.0, | |
| distal_gap=distal_gap, | |
| distal_extension_overlap=0.0, | |
| proximal_distal_overlap=adjusted_overlap) | |
| if not fenestration_overlap: | |
| return selected_graft | |
| if fallback_graft is None: | |
| fallback_graft = selected_graft | |
| # we didn't find a graft that avoids fenestration overlap, so return the option with fenestration overlap. | |
| if fallback_graft is not None: | |
| return fallback_graft | |
| # This search is for an additional extension component if the all graft designs are too short. | |
| extension_lengths, extension_graft_diameter, extension_gap = get_endograft_parameters(distal_diameter, "distal_extension") | |
| extension_prefix = "ZTA_E" | |
| if extension_lengths is None: | |
| return None | |
| for proximal_length in proximal_lengths: | |
| for extension_length in extension_lengths: | |
| for distal_length in distal_lengths: | |
| proximal_distal_overlap = base_overlap | |
| if extension_length > 97: | |
| distal_extension_overlap = (3 * strut_amplitude) + (2 * extension_gap) | |
| else: | |
| distal_extension_overlap = (2 * strut_amplitude) + extension_gap | |
| # Check whether the last fenestration falls inside the overlap region. | |
| fenestration_overlap = False | |
| if fenestrations_exist: | |
| overlap_start = proximal_length - proximal_distal_overlap | |
| if overlap_start < distance_to_last_fenestration < proximal_length: | |
| fenestration_overlap = True | |
| total_graft_length = (proximal_length + extension_length + distal_length - proximal_distal_overlap - distal_extension_overlap) | |
| proximal_code = ( | |
| f"{proximal_prefix}_{proximal_code_diameter}_" | |
| f"{proximal_length}_{proximal_gap}" | |
| ) | |
| extension_code = ( | |
| f"{extension_prefix}_{extension_graft_diameter}_" | |
| f"{extension_length}_{extension_gap}" | |
| ) | |
| distal_code = ( | |
| f"{distal_prefix}_{distal_graft_diameter}_" | |
| f"{distal_length}_{distal_gap}" | |
| ) | |
| if abs(total_graft_length - length) < 1e-6: | |
| selected_graft = assign_selected_graft_parameters( | |
| proximal_code=proximal_code, | |
| distal_code=distal_code, | |
| extension_code=extension_code, | |
| proximal_generation_diameter=proximal_generation_diameter, | |
| distal_graft_diameter=distal_graft_diameter, | |
| proximal_length=proximal_length, | |
| extension_length=extension_length, | |
| distal_length=distal_length, | |
| proximal_gap=proximal_gap, | |
| extension_gap=extension_gap, | |
| distal_gap=distal_gap, | |
| distal_extension_overlap=distal_extension_overlap, | |
| proximal_distal_overlap=proximal_distal_overlap) | |
| if not fenestration_overlap: | |
| return selected_graft | |
| if fallback_graft is None: | |
| fallback_graft = selected_graft | |
| elif total_graft_length > length: | |
| adjusted_distal_extension_overlap = (distal_extension_overlap + (total_graft_length - length)) | |
| selected_graft = assign_selected_graft_parameters( | |
| proximal_code=proximal_code, | |
| distal_code=distal_code, | |
| extension_code=extension_code, | |
| proximal_generation_diameter=proximal_generation_diameter, | |
| distal_graft_diameter=distal_graft_diameter, | |
| proximal_length=proximal_length, | |
| extension_length=extension_length, | |
| distal_length=distal_length, | |
| proximal_gap=proximal_gap, | |
| extension_gap=extension_gap, | |
| distal_gap=distal_gap, | |
| distal_extension_overlap=adjusted_distal_extension_overlap, | |
| proximal_distal_overlap=proximal_distal_overlap) | |
| if not fenestration_overlap: | |
| return selected_graft | |
| if fallback_graft is None: | |
| fallback_graft = selected_graft | |
| if fallback_graft is not None: | |
| return fallback_graft | |
| custom_graft = generate_custom_endograft(proximal_diameter, distal_diameter, length) | |
| return custom_graft | |
| def start_endograft_pipeline(proximal_diameter, distal_diameter, proximal_start_point, distal_end_point, length, fenestrations_exist, distance_to_last_fenestration): | |
| selected_graft = choose_endograft(round(proximal_diameter), round(distal_diameter), round(length), fenestrations_exist, round(distance_to_last_fenestration)) | |
| if selected_graft is None: | |
| print("No supported graft; try another manufacturer") | |
| else: | |
| selected_graft["proximal_start_point"] = proximal_start_point | |
| selected_graft["distal_end_point"] = distal_end_point | |
| return selected_graft |