{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "22c5adf7-a880-4885-afb0-cbb8aa48a62e",
   "metadata": {},
   "source": [
    "# Automatic CT segmentation using Nvidia Vista-3D and vessels geometry analysis and visualization with Streamlit on PCAI\n",
    "\n",
    "\n",
    "## 🧩 Problem statement\n",
    " \n",
    " Obtain **geometrical biomarkers** (e.g. cross-sectional diameters and tortuosity index) from CT exams available in Dicom format.\n",
    "\n",
    "---\n",
    "\n",
    "## 🎯 Target outcome\n",
    "\n",
    "- **Automatically segment** aorta, right and left common iliac arteries available in Dicom format\n",
    "- Availability of a **custom Jupyter Notebook (PC-AI compatible)** preloaded with Nvidia Vista 3D model and essential tools for postprocessing\n",
    "- Postprocessing of the segmentation output, preparing it for **geometrical analysis and 3D visualization**\n",
    "- Availability of a PC-AI compatible app with **Streamlite**. Within the app, it must be possible to execute geometrical analysis, visualize segmentation output and 3D renderings \n",
    "\n",
    "---\n",
    "\n",
    "##  📊 High-Level Demo Flow\n",
    "\n",
    "![workflow](../docs/images/conceptual_workflow_white.png)\n",
    "\n",
    "    1. Load Dicom files and convert to Nifti format for semantic segmentation\n",
    "    2. Segment data using Vista-3D model\n",
    "    3. Postprocess the output to extract classes of interest (aorta, common iliac arteries)\n",
    "    4. Postprocess the segmentation output, preparing it for analysis with the created Streamlit app\n",
    "    5. Identify vessels' centerline\n",
    "    6. Measure vessels' diameter along the centerline, identifying cross-sections planes\n",
    "    7. Measure vessels' tortousity index\n",
    "    8. Prepare 3D renderings of the vessels and visualize them\n",
    "\n",
    "\n",
    "**Note:** this notebook walks you through the steps 1-4. \n",
    "\n",
    "Steps 5-8 can be conducted directly using the `vessels geometry analysis and reconstruction app`, for which, instructions are provided at the bottom of this notebook."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbc738bf-cf40-4329-96f4-d9e10e196cde",
   "metadata": {},
   "source": [
    "## 🛠️ Step-by-Step Instructions\n",
    "\n",
    "\n",
    "###  🔧 Environment Preparation\n",
    "\n",
    "Install Python dependecies\n",
    "\n",
    "### IMPORTANT: ALLOCATE A COUPLE GB OF RAM TO THIS NOTEBOOK OTHERWISE IT WILL OOM AND GET KILLED"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3e16976e-8c54-49a7-bb53-84fb7d68bdd5",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting pydicom\n",
      "  Using cached pydicom-3.0.1-py3-none-any.whl.metadata (9.4 kB)\n",
      "Collecting dicom2nifti\n",
      "  Using cached dicom2nifti-2.6.2-py3-none-any.whl.metadata (1.5 kB)\n",
      "Collecting nibabel\n",
      "  Using cached nibabel-5.3.3-py3-none-any.whl.metadata (9.1 kB)\n",
      "Collecting plotly\n",
      "  Using cached plotly-6.5.2-py3-none-any.whl.metadata (8.5 kB)\n",
      "Collecting open3d\n",
      "  Using cached open3d-0.19.0-cp311-cp311-manylinux_2_31_x86_64.whl.metadata (4.3 kB)\n",
      "Requirement already satisfied: python-dotenv in /opt/conda/lib/python3.11/site-packages (1.1.0)\n",
      "Collecting python-dotenv\n",
      "  Using cached python_dotenv-1.2.1-py3-none-any.whl.metadata (25 kB)\n",
      "Requirement already satisfied: numpy in /opt/conda/lib/python3.11/site-packages (from dicom2nifti) (1.24.4)\n",
      "Requirement already satisfied: scipy in /opt/conda/lib/python3.11/site-packages (from dicom2nifti) (1.11.3)\n",
      "Collecting python-gdcm (from dicom2nifti)\n",
      "  Using cached python_gdcm-3.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (3.8 kB)\n",
      "Requirement already satisfied: importlib-resources>=5.12 in /opt/conda/lib/python3.11/site-packages (from nibabel) (6.5.2)\n",
      "Requirement already satisfied: packaging>=20 in /opt/conda/lib/python3.11/site-packages (from nibabel) (24.2)\n",
      "Requirement already satisfied: typing-extensions>=4.6 in /opt/conda/lib/python3.11/site-packages (from nibabel) (4.13.1)\n",
      "Collecting narwhals>=1.15.1 (from plotly)\n",
      "  Using cached narwhals-2.15.0-py3-none-any.whl.metadata (13 kB)\n",
      "Collecting dash>=2.6.0 (from open3d)\n",
      "  Using cached dash-3.4.0-py3-none-any.whl.metadata (11 kB)\n",
      "Requirement already satisfied: werkzeug>=3.0.0 in /opt/conda/lib/python3.11/site-packages (from open3d) (3.1.3)\n",
      "Requirement already satisfied: flask>=3.0.0 in /opt/conda/lib/python3.11/site-packages (from open3d) (3.1.0)\n",
      "Requirement already satisfied: nbformat>=5.7.0 in /opt/conda/lib/python3.11/site-packages (from open3d) (5.10.4)\n",
      "Collecting configargparse (from open3d)\n",
      "  Using cached configargparse-1.7.1-py3-none-any.whl.metadata (24 kB)\n",
      "Requirement already satisfied: ipywidgets>=8.0.4 in /opt/conda/lib/python3.11/site-packages (from open3d) (8.1.6)\n",
      "Collecting addict (from open3d)\n",
      "  Using cached addict-2.4.0-py3-none-any.whl.metadata (1.0 kB)\n",
      "Requirement already satisfied: pillow>=9.3.0 in /opt/conda/lib/python3.11/site-packages (from open3d) (11.1.0)\n",
      "Requirement already satisfied: matplotlib>=3 in /opt/conda/lib/python3.11/site-packages (from open3d) (3.8.4)\n",
      "Requirement already satisfied: pandas>=1.0 in /opt/conda/lib/python3.11/site-packages (from open3d) (2.1.4)\n",
      "Requirement already satisfied: pyyaml>=5.4.1 in /opt/conda/lib/python3.11/site-packages (from open3d) (6.0.2)\n",
      "Requirement already satisfied: scikit-learn>=0.21 in /opt/conda/lib/python3.11/site-packages (from open3d) (1.3.2)\n",
      "Requirement already satisfied: tqdm in /opt/conda/lib/python3.11/site-packages (from open3d) (4.67.1)\n",
      "Collecting pyquaternion (from open3d)\n",
      "  Using cached pyquaternion-0.9.9-py3-none-any.whl.metadata (1.4 kB)\n",
      "Requirement already satisfied: importlib-metadata in /opt/conda/lib/python3.11/site-packages (from dash>=2.6.0->open3d) (8.6.1)\n",
      "Requirement already satisfied: requests in /opt/conda/lib/python3.11/site-packages (from dash>=2.6.0->open3d) (2.32.3)\n",
      "Collecting retrying (from dash>=2.6.0->open3d)\n",
      "  Using cached retrying-1.4.2-py3-none-any.whl.metadata (5.5 kB)\n",
      "Requirement already satisfied: nest-asyncio in /opt/conda/lib/python3.11/site-packages (from dash>=2.6.0->open3d) (1.6.0)\n",
      "Requirement already satisfied: setuptools in /opt/conda/lib/python3.11/site-packages (from dash>=2.6.0->open3d) (78.1.0)\n",
      "Requirement already satisfied: Jinja2>=3.1.2 in /opt/conda/lib/python3.11/site-packages (from flask>=3.0.0->open3d) (3.1.6)\n",
      "Requirement already satisfied: itsdangerous>=2.2 in /opt/conda/lib/python3.11/site-packages (from flask>=3.0.0->open3d) (2.2.0)\n",
      "Requirement already satisfied: click>=8.1.3 in /opt/conda/lib/python3.11/site-packages (from flask>=3.0.0->open3d) (8.1.8)\n",
      "Requirement already satisfied: blinker>=1.9 in /opt/conda/lib/python3.11/site-packages (from flask>=3.0.0->open3d) (1.9.0)\n",
      "Requirement already satisfied: comm>=0.1.3 in /opt/conda/lib/python3.11/site-packages (from ipywidgets>=8.0.4->open3d) (0.2.2)\n",
      "Requirement already satisfied: ipython>=6.1.0 in /opt/conda/lib/python3.11/site-packages (from ipywidgets>=8.0.4->open3d) (8.35.0)\n",
      "Requirement already satisfied: traitlets>=4.3.1 in /opt/conda/lib/python3.11/site-packages (from ipywidgets>=8.0.4->open3d) (5.14.3)\n",
      "Requirement already satisfied: widgetsnbextension~=4.0.14 in /opt/conda/lib/python3.11/site-packages (from ipywidgets>=8.0.4->open3d) (4.0.14)\n",
      "Requirement already satisfied: jupyterlab_widgets~=3.0.14 in /opt/conda/lib/python3.11/site-packages (from ipywidgets>=8.0.4->open3d) (3.0.14)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib>=3->open3d) (1.3.1)\n",
      "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.11/site-packages (from matplotlib>=3->open3d) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.11/site-packages (from matplotlib>=3->open3d) (4.57.0)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib>=3->open3d) (1.4.7)\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib>=3->open3d) (3.2.3)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.11/site-packages (from matplotlib>=3->open3d) (2.9.0.post0)\n",
      "Requirement already satisfied: fastjsonschema>=2.15 in /opt/conda/lib/python3.11/site-packages (from nbformat>=5.7.0->open3d) (2.21.1)\n",
      "Requirement already satisfied: jsonschema>=2.6 in /opt/conda/lib/python3.11/site-packages (from nbformat>=5.7.0->open3d) (4.23.0)\n",
      "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in /opt/conda/lib/python3.11/site-packages (from nbformat>=5.7.0->open3d) (5.7.2)\n",
      "Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.11/site-packages (from pandas>=1.0->open3d) (2025.2)\n",
      "Requirement already satisfied: tzdata>=2022.1 in /opt/conda/lib/python3.11/site-packages (from pandas>=1.0->open3d) (2025.2)\n",
      "Requirement already satisfied: joblib>=1.1.1 in /opt/conda/lib/python3.11/site-packages (from scikit-learn>=0.21->open3d) (1.4.2)\n",
      "Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.11/site-packages (from scikit-learn>=0.21->open3d) (3.6.0)\n",
      "Requirement already satisfied: MarkupSafe>=2.1.1 in /opt/conda/lib/python3.11/site-packages (from werkzeug>=3.0.0->open3d) (3.0.2)\n",
      "Requirement already satisfied: decorator in /opt/conda/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (5.2.1)\n",
      "Requirement already satisfied: jedi>=0.16 in /opt/conda/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (0.19.2)\n",
      "Requirement already satisfied: matplotlib-inline in /opt/conda/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (0.1.7)\n",
      "Requirement already satisfied: pexpect>4.3 in /opt/conda/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (4.9.0)\n",
      "Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in /opt/conda/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (3.0.50)\n",
      "Requirement already satisfied: pygments>=2.4.0 in /opt/conda/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (2.19.1)\n",
      "Requirement already satisfied: stack_data in /opt/conda/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (0.6.3)\n",
      "Requirement already satisfied: attrs>=22.2.0 in /opt/conda/lib/python3.11/site-packages (from jsonschema>=2.6->nbformat>=5.7.0->open3d) (25.3.0)\n",
      "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/conda/lib/python3.11/site-packages (from jsonschema>=2.6->nbformat>=5.7.0->open3d) (2024.10.1)\n",
      "Requirement already satisfied: referencing>=0.28.4 in /opt/conda/lib/python3.11/site-packages (from jsonschema>=2.6->nbformat>=5.7.0->open3d) (0.36.2)\n",
      "Requirement already satisfied: rpds-py>=0.7.1 in /opt/conda/lib/python3.11/site-packages (from jsonschema>=2.6->nbformat>=5.7.0->open3d) (0.24.0)\n",
      "Requirement already satisfied: platformdirs>=2.5 in /opt/conda/lib/python3.11/site-packages (from jupyter-core!=5.0.*,>=4.12->nbformat>=5.7.0->open3d) (4.3.7)\n",
      "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib>=3->open3d) (1.17.0)\n",
      "Requirement already satisfied: zipp>=3.20 in /opt/conda/lib/python3.11/site-packages (from importlib-metadata->dash>=2.6.0->open3d) (3.21.0)\n",
      "Requirement already satisfied: charset_normalizer<4,>=2 in /opt/conda/lib/python3.11/site-packages (from requests->dash>=2.6.0->open3d) (3.4.1)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.11/site-packages (from requests->dash>=2.6.0->open3d) (3.10)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.11/site-packages (from requests->dash>=2.6.0->open3d) (1.26.20)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.11/site-packages (from requests->dash>=2.6.0->open3d) (2025.1.31)\n",
      "Requirement already satisfied: parso<0.9.0,>=0.8.4 in /opt/conda/lib/python3.11/site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (0.8.4)\n",
      "Requirement already satisfied: ptyprocess>=0.5 in /opt/conda/lib/python3.11/site-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (0.7.0)\n",
      "Requirement already satisfied: wcwidth in /opt/conda/lib/python3.11/site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (0.2.13)\n",
      "Requirement already satisfied: executing>=1.2.0 in /opt/conda/lib/python3.11/site-packages (from stack_data->ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (2.1.0)\n",
      "Requirement already satisfied: asttokens>=2.1.0 in /opt/conda/lib/python3.11/site-packages (from stack_data->ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (3.0.0)\n",
      "Requirement already satisfied: pure_eval in /opt/conda/lib/python3.11/site-packages (from stack_data->ipython>=6.1.0->ipywidgets>=8.0.4->open3d) (0.2.3)\n",
      "Using cached pydicom-3.0.1-py3-none-any.whl (2.4 MB)\n",
      "Using cached dicom2nifti-2.6.2-py3-none-any.whl (43 kB)\n",
      "Using cached nibabel-5.3.3-py3-none-any.whl (3.3 MB)\n",
      "Using cached plotly-6.5.2-py3-none-any.whl (9.9 MB)\n",
      "Using cached open3d-0.19.0-cp311-cp311-manylinux_2_31_x86_64.whl (447.7 MB)\n",
      "Using cached python_dotenv-1.2.1-py3-none-any.whl (21 kB)\n",
      "Using cached dash-3.4.0-py3-none-any.whl (7.9 MB)\n",
      "Using cached narwhals-2.15.0-py3-none-any.whl (432 kB)\n",
      "Using cached addict-2.4.0-py3-none-any.whl (3.8 kB)\n",
      "Using cached configargparse-1.7.1-py3-none-any.whl (25 kB)\n",
      "Using cached pyquaternion-0.9.9-py3-none-any.whl (14 kB)\n",
      "Using cached python_gdcm-3.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (13.3 MB)\n",
      "Using cached retrying-1.4.2-py3-none-any.whl (10 kB)\n",
      "Installing collected packages: addict, retrying, python-gdcm, python-dotenv, pyquaternion, pydicom, nibabel, narwhals, configargparse, plotly, dicom2nifti, dash, open3d\n",
      "  Attempting uninstall: python-dotenv\n",
      "    Found existing installation: python-dotenv 1.1.0\n",
      "    Uninstalling python-dotenv-1.1.0:\n",
      "      Successfully uninstalled python-dotenv-1.1.0\n",
      "Successfully installed addict-2.4.0 configargparse-1.7.1 dash-3.4.0 dicom2nifti-2.6.2 narwhals-2.15.0 nibabel-5.3.3 open3d-0.19.0 plotly-6.5.2 pydicom-3.0.1 pyquaternion-0.9.9 python-dotenv-1.2.1 python-gdcm-3.2.2 retrying-1.4.2\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install --upgrade pydicom dicom2nifti nibabel plotly open3d python-dotenv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "45a99e24",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load all the libraries\n",
    "from pathlib import Path\n",
    "import os\n",
    "import dicom2nifti\n",
    "import warnings\n",
    "import requests\n",
    "import zipfile\n",
    "from dotenv import load_dotenv\n",
    "import nibabel as nib\n",
    "import numpy as np\n",
    "import json "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7043b22d",
   "metadata": {},
   "source": [
    "## Set-up API key and specify the URL of Vista-3D model, to be used for segmentation.\n",
    "\n",
    "### - Deploy Vista-3D model to MLIS. \n",
    " \n",
    " Here is a  [how to deploy NIM to MLIS](./docs/deploy-NIM-to-MLIS.pdf) guide.\n",
    "\n",
    "\n",
    "### ⚠️ Model requirements:\n",
    "\n",
    "The model requires a path to the MLIS' endpoint and a USER TOKEN KEY, which need to be stored in a .env file locate in the same folder where this notebook resides:\n",
    "\n",
    "E.g. of the content in the .env file\n",
    "\n",
    "---\n",
    "\n",
    "```.env\n",
    "MLIS_TOKEN=\"$YOUR_MLIS_TOKEN$\"\n",
    "BASE_URL=\"$YOUR_PCAI_MODEL_BASE_URL$\"\n",
    "``` \n",
    "\n",
    "----\n",
    "\n",
    "Where:\n",
    "\n",
    "- MLIS_TOKEN is the authentication token \n",
    "- BASE_URL is the path to the model endpoint in MLIS.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a7d93673",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using model at: https://do-not-delete--vista-3d-predictor-hugo-hpe-com-7f9ace25.ai-application.hou-pcai.hpecic.net\n",
      "MLIS token loaded successfully!\n"
     ]
    }
   ],
   "source": [
    "# Load secret keys from .env file\n",
    "load_dotenv()\n",
    "# Specify the model endopoint within MLIs\n",
    "base_url = os.getenv('BASE_URL')\n",
    "if base_url is not None:\n",
    "    print(f\"Using model at: {base_url}\")\n",
    "else:\n",
    "    raise ValueError(\"BASE_URL was not specified, check your .env file\")\n",
    "\n",
    "# Specity the MLIs authorization token\n",
    "mlis_token = os.getenv('MLIS_TOKEN')\n",
    "if mlis_token is not None:\n",
    "    print(f\"MLIS token loaded successfully!\")\n",
    "else:\n",
    "    raise ValueError(\"MLIS_TOKEN was not specified, check your .env file\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eed55098",
   "metadata": {},
   "source": [
    "### Prepare your data\n",
    "**In this example - Dicom data are organized as follows:**\n",
    " \n",
    "> dicom_data/\n",
    ">>       PATIENT01/\n",
    ">>>           dicom_file_CT......1\n",
    ">>>           dicom_file_CT......2\n",
    ">>>           dicom_file_CT......3\n",
    ">>>           ...\n",
    ">>       PATIENT02/\n",
    ">>>           dicom_file_CT......1\n",
    ">>>           dicom_file_CT......2\n",
    ">>>           dicom_file_CT......3\n",
    ">>>           ....\n",
    " \n",
    "Ensure to specify the parent folder i.e. `dicom_data`,  when you specify the location of the data in `DICOM_DATA_PATH` below."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a24b37b",
   "metadata": {},
   "source": [
    "⚠️ **NOTE:** If the dataset is available in **Nifti** format instead of **Dicom**, you won't need to create the Nifti files which are required by the Nvidia Vista-3D segmentation model.\n",
    "\n",
    "In that case you can prepare the dataset as in the following example, in which we will use the `Fast and Low-resource semisupervised Abdominal oRgan  sEgmentation (FLARE) Challenge` dataset.\n",
    "\n",
    "FLARE is a dataset for abdomen organ segmentation and it has many important clinical applications, such as organ quantification, surgical planning, and disease diagnosis. Although it is not designed for vessels segmentation, it contains in some scans Aorta, Right and Left Iliac Arteries, so we can use it to demo our app.\n",
    "\n",
    "- Challenge link: [FLARE22](https://flare22.grand-challenge.org)\n",
    "\n",
    "- Dataset repository: [FLARE22 dataset](https://storage.googleapis.com/ai-solution-engineering-datasets/demo-test-seg.zip)\n",
    "\n",
    "\n",
    "**Download** the dataset and save it so that it is organized as follows:\n",
    "\n",
    "> outputs\n",
    ">> nifti_data\n",
    ">>> training\n",
    ">>>> FLARETs_0001_0000.nii.gz\n",
    "\n",
    ">>> tuning\n",
    ">>>> FLARETs_0002_0000.nii.gz\n",
    "\n",
    ">>> testing\n",
    ">>>> FLARETs_0050_0000.nii.gz"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83630283",
   "metadata": {},
   "source": [
    "### Specify important paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "fc410e86-69cf-4037-94ef-aa05dd8cbbca",
   "metadata": {},
   "outputs": [],
   "source": [
    "## These are the only paths that need to be modified!\n",
    "\n",
    "# If dataset is in Dicom format - Specify the folder where Dicom data reside:\n",
    "DICOM_DATA_PATH = Path('dicom_data') \n",
    "\n",
    "# Specify the folder where all the outputs will be saved\n",
    "ALL_OUTPUTS_PATH = Path('outputs_flare')\n",
    "\n",
    "# Specify the URL where data reside so that Vista3D model can fetch it:\n",
    "# Please refer to https://docs.nvidia.com/nim/medical/vista3d/latest/advanced-usage.html#environment-variables for additional details.\n",
    "# Hint: if data are in 'https://fs2.ingress.pcai0109.dc15.hpecolo.net/califra/dicom_data'\n",
    "# data_path_root must be 'https://fs2.ingress.pcai0109.dc15.hpecolo.net/califra/'\n",
    "data_path_root = 'https://vessels-app.ai-application.hou-pcai.hpecic.net/vista-3d/'\n",
    "\n",
    "# Set the following to True if you want to convert the data Dicom to Nifti\n",
    "CONVERT_DICOM_TO_NIFTI = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "444ea703-3d45-4e82-adba-ab03bc6bfd38",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Assess whether the FLARE dataset has been organized correctly\n",
    "if not CONVERT_DICOM_TO_NIFTI:\n",
    "    ## Check data were correctly organized\n",
    "    assert (\n",
    "        ALL_OUTPUTS_PATH / \"nifti_data\" / \"testing\" / \"FLARETs_0050.nii.gz\"\n",
    "        ).is_file(), (\n",
    "            \"Ensure the FLARE dataset is organized as expected. Look instructions above - Ignore this message otherwise\"\n",
    "            )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8a31ad9-74a8-40f2-8fcd-9d13136a164d",
   "metadata": {},
   "source": [
    "# Assess whether the FLARE dataset has been organized correctly\n",
    "if not CONVERT_DICOM_TO_NIFTI:\n",
    "    ## Check data were correctly organized\n",
    "    assert (\n",
    "        ALL_OUTPUTS_PATH / \"nifti_data\" / \"testing\" / \"FLARETs_0050_0000.nii.gz\"\n",
    "        ).is_file(), (\n",
    "            \"Ensure the FLARE dataset is organized as expected. Look instructions above - Ignore this message otherwise\"\n",
    "            )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8647553-1c63-46ac-b9ad-31228fc0c16c",
   "metadata": {},
   "source": [
    "## 🔧 1) Load Dicom files and convert to Nifti format for semantic segmentation\n",
    "\n",
    "**⚠️ NOTE:** you can skip this step if the data is already available in Nifti format.\n",
    "\n",
    "In this section, we show how to convert Dicom file to Nifti (Neuroimaging Informatics Technology Initiative) format which is the format expected by the Vista-3D Nvidia NIM model (more details about the model are provided below).\n",
    "\n",
    "\n",
    "Upon completion data will be organized in the specified folder with a structure similar to what we saw for dicom_data. \n",
    "\n",
    "Eg:\n",
    "> dicom_data\n",
    ">>   PATIENT01\n",
    ">>>        dicom_file_CT......1\n",
    ">>>        dicom_file_CT......2\n",
    "\n",
    "> nifti_data\n",
    ">>   PATIENT01\n",
    ">>>        3_25mm_arterial.nii.gz\n",
    ">>>        601_coronal_abdomen.nii.gz\n",
    ">>>        602_sagittal_abdomen.nii\n",
    "\n",
    "Note that the name is self-inferred using the Dicom metadata tag.\n",
    "\n",
    "In this example:\n",
    ">    (0008,103E) Series Description  LO: '2.5MM ARTERIAL'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "af5e0728-987c-43eb-a3e9-e35a7a542e9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# If you converted your data from Dicom to Nifti using the code above, then your Nifti data will be in nifti_data folder. \n",
    "nifti_destination_path = Path(ALL_OUTPUTS_PATH) / \"nifti_data\"\n",
    "\n",
    "if CONVERT_DICOM_TO_NIFTI:\n",
    "    # Convert Dicom to Nifti for compatibility with the Vista-3D Nvidia NIM model\n",
    "    for dicom_directory in os.listdir(DICOM_DATA_PATH):\n",
    "        input_directory = Path(DICOM_DATA_PATH) / f\"{dicom_directory}\" \n",
    "        output_directory = Path(nifti_destination_path) / dicom_directory\n",
    "    \n",
    "        # If the patient's exam has already been processed, skip it.\n",
    "        if output_directory.exists():\n",
    "            warnings.warn(f\"{output_directory} already exists, skipping...\")\n",
    "            continue\n",
    "        else:\n",
    "            os.makedirs(output_directory, exist_ok=False)\n",
    "            print(\"-\"*10)\n",
    "            print(f\"Saving Nifti files into directory {output_directory}\")\n",
    "            dicom2nifti.convert_directory(input_directory, output_directory, compression=True, reorient=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0137eea-6000-4677-9235-d7832a167cac",
   "metadata": {},
   "source": [
    "## 🧠 2) Segment data using Vista-3D model (133 classes)\n",
    "\n",
    "In this project we chose the **Vista-3D Nvidia NIM** model for segmenting the tissues of interest. \n",
    "\n",
    "##### 📦 Vista-3D Foundation Model\n",
    "Vista-3D Nvidia model is state of the art in zero-shot segmentation of CT scans, and **HPE Private-Cloud AI** comes with Nvidia licenses, making it a great option.\n",
    "\n",
    "[Vista-3D is a specialized interactive foundation model for 3D medical imaging.](https://build.nvidia.com/nvidia/vista-3d/modelcard) It excels in providing accurate and adaptable segmentation analysis across 133 anatomies and modalities. Utilizing a multi-head architecture, Vista-3D adapts to varying conditions and anatomical areas, helping guide users' annotation workflow. This model is for research purposes and not for clinical usage.\n",
    "\n",
    "##### 📁 Training Data Details\n",
    "The Vista3D model was trained by Nvidia on a large and diverse dataset of 11454 3D CT volumes. This dataset was curated from Nvidia in-house and publicly available sources. The training data encompassed a wide range of acquisition protocols.\n",
    "\n",
    "##### 📄 Reference \n",
    "- [Vista3D: A Unified Segmentation Foundation Model For 3D Medical Imaging\n",
    "](https://arxiv.org/pdf/2406.05285)\n",
    "- [Segment Anything](https://arxiv.org/abs/2304.02643)\n",
    "\n",
    "#### ⚡ HPE Machine Learning Inference Software\n",
    "In this notebook, the Vista-3D model has been deployed using **[HPE's Machine Learning Inference Software (MLIS)](https://docs.ai-solutions.ext.hpe.com/products/mlis/)**, which simplifies and controls the deployment, management, and monitoring of machine learning models at scale. Here is a [HOW-TO](./docs/deploy-NIM-to-MLIS.pdf) guide on deploying models to MLIs. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "68a2a77c-df94-477b-a2fa-74b7e6ecca4c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Token successfully refreshed.\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0050.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0133.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0134.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0135.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0136.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0137.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0138.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0139.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0140.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0141.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0142.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0143.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0144.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0145.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0146.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0147.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0148.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0149.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0150.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0151.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0152.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0153.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0154.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0155.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0156.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0157.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0158.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0159.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0160.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0161.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0162.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0163.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0164.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0165.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0166.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0167.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0168.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0169.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0170.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0171.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0172.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0173.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0174.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0175.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0176.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0177.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0178.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0179.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0180.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0181.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0182.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0183.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0184.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0185.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0186.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0187.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0188.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0189.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0190.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0191.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0192.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0193.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0194.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0195.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0196.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0197.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0198.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/testing/FLARETs_0199.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0001.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0003.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0004.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0005.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0006.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0007.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0008.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0009.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0010.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0011.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0012.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0013.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0014.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0015.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0016.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0017.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0018.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0019.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0020.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0021.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0022.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0023.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0024.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0025.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0026.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0027.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0028.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0029.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0030.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0031.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0032.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0033.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0034.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0035.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0036.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0037.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0038.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0039.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0040.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0041.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0042.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0043.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0044.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0045.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0046.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0047.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0048.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0049.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0050.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0051.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0052.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0053.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0054.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0055.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0056.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0057.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0058.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0059.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0060.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0061.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0062.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0063.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0064.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0065.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/training/FLARETs_0066.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0002.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0067.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0068.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0069.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0070.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0071.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0072.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0073.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0074.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0075.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0076.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0077.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0078.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0079.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0080.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0081.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0082.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0083.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0084.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0085.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0086.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0087.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0088.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0089.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0090.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0091.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0092.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0093.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0094.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0095.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0096.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0097.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0098.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0099.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0100.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0101.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0102.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0103.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0104.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0105.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0106.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0107.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0108.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0109.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0110.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0111.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0112.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0113.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0114.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0115.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0116.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0117.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0118.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0119.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0120.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0121.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0122.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0123.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0124.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0125.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0126.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0127.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0128.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0129.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0130.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0131.nii.gz <Response [200]>\n",
      "----------\n",
      "outputs_flare/nifti_data/tuning/FLARETs_0132.nii.gz <Response [200]>\n"
     ]
    }
   ],
   "source": [
    "# To perform segmentation using Vista 3D model, we need to send a post request to the MLIs endpoint. \n",
    "# As part of the request we need to specify the path to the Nifti file to be segmented out.\n",
    "\n",
    "# Update the nvidia token\n",
    "%update_token\n",
    "\n",
    "def unzip_file(zip_filepath, output_dir, output_filename=None):\n",
    "    \"\"\"Unzip the first file in a zip archive to a target folder, optionally renaming it.\"\"\"\n",
    "    with zipfile.ZipFile(zip_filepath, 'r') as zip_ref:\n",
    "        info_list = zip_ref.infolist()\n",
    "        if not info_list:\n",
    "            raise ValueError(\"Zip file is empty\")\n",
    "\n",
    "        first_entry = info_list[0]\n",
    "        original_name = first_entry.filename\n",
    "\n",
    "        # Ensure output directory exists\n",
    "        os.makedirs(output_dir, exist_ok=True)\n",
    "\n",
    "        # Extract the file to the output directory\n",
    "        extracted_path = zip_ref.extract(original_name, path=output_dir)\n",
    "\n",
    "        # Optionally rename the extracted file\n",
    "        if output_filename:\n",
    "            new_path = os.path.join(output_dir, output_filename)\n",
    "            os.rename(extracted_path, new_path)\n",
    "            return new_path\n",
    "        return extracted_path\n",
    "\n",
    "# Location where the model responses and segmentation outputs will land\n",
    "response_dir = Path(ALL_OUTPUTS_PATH) / \"responses\"\n",
    "os.makedirs(response_dir, exist_ok=True)\n",
    "\n",
    "segmentation_dir = Path(ALL_OUTPUTS_PATH) / \"segmentations\"\n",
    "os.makedirs(segmentation_dir, exist_ok=True)\n",
    "\n",
    "# Specify the location of the data, they need to be available and accessible online for the model to be able to process them.\n",
    "# Here we use the location within the hosted-trial environment\n",
    "\n",
    "headers = {'Authorization': f'Bearer {mlis_token}'}\n",
    "\n",
    "# Vista-3D model requires passing the data in a dictionary, which has a key `image` that points to a URL to the Nifti file. \n",
    "# e.g. data['image'] = \"https://fs2.ingress.pcai0109.dc15.hpecolo.net/califra/outputs/nifti_data/testing/FLARETs_0050_0000.nii.gz\"\n",
    "# Please refer to https://docs.nvidia.com/nim/medical/vista3d/latest/advanced-usage.html#environment-variables for additional details.\n",
    "# Note that Vista-3D model will attempt segmenting every Nifti file irrespective of the acquisition orientation (axial, coronal, sagittal).\n",
    "# Zero-shot segmentation quality should be state of the art on all the planes.\n",
    "\n",
    "for path in Path(nifti_destination_path).rglob('*nii.gz'):\n",
    "    data = {}\n",
    "    # User TODO: \n",
    "    # Ensure 'path' does not require custom logic. \n",
    "    # This is may be needed if ALL_OUTPUTS_PATH is not a relative path.\n",
    "    \n",
    "    p = data_path_root +  str(path) \n",
    "    data['image'] = str(p)\n",
    "    print(\"-\" * 10)\n",
    "\n",
    "    # Submit a post request to segment the ct scan.\n",
    "    response = requests.post(f'{base_url}/v1/vista3d/inference', json=data, headers=headers)\n",
    "    \n",
    "    if response.status_code == 200: # Success!!\n",
    "\n",
    "        file_name = path.name\n",
    "        \n",
    "        # Create the folders required to have a clean output\n",
    "        os.makedirs(Path(response_dir) / path.parent.name, exist_ok=True)\n",
    "        os.makedirs(Path(segmentation_dir) / path.parent.name, exist_ok=True)\n",
    "        output_segmentation_name = Path(segmentation_dir) / path.parent.name / file_name\n",
    "\n",
    "        # Zip the model response, unzip it and rename the files accordingly\n",
    "        output_zip_name = Path(response_dir) / path.parent.name / file_name.replace('.nii.gz', '.zip') \n",
    "        \n",
    "        with open(output_zip_name, 'wb') as f:\n",
    "            f.write(response.content)\n",
    "        \n",
    "        _ = unzip_file(\n",
    "            zip_filepath=str(output_zip_name),\n",
    "            output_dir = \"/\".join(str(output_segmentation_name).split(\"/\")[:-1]),\n",
    "            output_filename=str(output_segmentation_name).split(\"/\")[-1],\n",
    "        )\n",
    "\n",
    "        print(f'{str(path)} {response}')\n",
    "\n",
    "    else:\n",
    "        print(\"skipping: \", data['image'], '\\n', response.status_code)\n",
    "        print(f\"Reason: {response.reason}\")\n",
    "        print(f\"Body: {response.text}\")\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b48431f-00dd-4181-b703-880ae95680e7",
   "metadata": {},
   "source": [
    "## 🖼️ Segmentation output\n",
    "\n",
    "Upon segmentation, the results will be available in folder `outputs/segmentations` with exactly the same structure as saw for the Nifti data.\n",
    "\n",
    "E.g.:\n",
    "\n",
    "> outputs\n",
    ">>nifti_data\n",
    ">>>   testing\n",
    ">>>>        FLARETs_0050_0000.nii.gz\n",
    "\n",
    ">> segmentations\n",
    ">>>   testing\n",
    ">>>>        FLARETs_0050_0000.nii.gz"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4643ed31-9b58-4087-9a6d-ab9bf4a0dc4a",
   "metadata": {},
   "source": [
    "## 🧪 3) Postprocess the output to extract classes of interest (aorta, common iliac arteries)\n",
    "\n",
    "- a) Load the segmentation label mapping for each anatomical structure. Remember that Vista 3D model can segment up 133 (including background) tissues.\n",
    "- b) Post-process the segmentation output to extract only the 3 tissues we are interested on (aorta, left iliac artery, right iliac artery)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5657b515-4044-44ab-8ee7-8c8bd8c5c8b3",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mapping tissue to label:\n",
      "background: 0\n",
      "liver: 1\n",
      "kidney: 2\n",
      "spleen: 3\n",
      "pancreas: 4\n",
      "right kidney: 5\n",
      "aorta: 6\n",
      "inferior vena cava: 7\n",
      "right adrenal gland: 8\n",
      "left adrenal gland: 9\n",
      "gallbladder: 10\n",
      "esophagus: 11\n",
      "stomach: 12\n",
      "duodenum: 13\n",
      "left kidney: 14\n",
      "bladder: 15\n",
      "prostate or uterus: 16\n",
      "portal vein and splenic vein: 17\n",
      "rectum: 18\n",
      "small bowel: 19\n",
      "lung: 20\n",
      "bone: 21\n",
      "brain: 22\n",
      "lung tumor: 23\n",
      "pancreatic tumor: 24\n",
      "hepatic vessel: 25\n",
      "hepatic tumor: 26\n",
      "colon cancer primaries: 27\n",
      "left lung upper lobe: 28\n",
      "left lung lower lobe: 29\n",
      "right lung upper lobe: 30\n",
      "right lung middle lobe: 31\n",
      "right lung lower lobe: 32\n",
      "vertebrae L5: 33\n",
      "vertebrae L4: 34\n",
      "vertebrae L3: 35\n",
      "vertebrae L2: 36\n",
      "vertebrae L1: 37\n",
      "vertebrae T12: 38\n",
      "vertebrae T11: 39\n",
      "vertebrae T10: 40\n",
      "vertebrae T9: 41\n",
      "vertebrae T8: 42\n",
      "vertebrae T7: 43\n",
      "vertebrae T6: 44\n",
      "vertebrae T5: 45\n",
      "vertebrae T4: 46\n",
      "vertebrae T3: 47\n",
      "vertebrae T2: 48\n",
      "vertebrae T1: 49\n",
      "vertebrae C7: 50\n",
      "vertebrae C6: 51\n",
      "vertebrae C5: 52\n",
      "vertebrae C4: 53\n",
      "vertebrae C3: 54\n",
      "vertebrae C2: 55\n",
      "vertebrae C1: 56\n",
      "trachea: 57\n",
      "left iliac artery: 58\n",
      "right iliac artery: 59\n",
      "left iliac vena: 60\n",
      "right iliac vena: 61\n",
      "colon: 62\n",
      "left rib 1: 63\n",
      "left rib 2: 64\n",
      "left rib 3: 65\n",
      "left rib 4: 66\n",
      "left rib 5: 67\n",
      "left rib 6: 68\n",
      "left rib 7: 69\n",
      "left rib 8: 70\n",
      "left rib 9: 71\n",
      "left rib 10: 72\n",
      "left rib 11: 73\n",
      "left rib 12: 74\n",
      "right rib 1: 75\n",
      "right rib 2: 76\n",
      "right rib 3: 77\n",
      "right rib 4: 78\n",
      "right rib 5: 79\n",
      "right rib 6: 80\n",
      "right rib 7: 81\n",
      "right rib 8: 82\n",
      "right rib 9: 83\n",
      "right rib 10: 84\n",
      "right rib 11: 85\n",
      "right rib 12: 86\n",
      "left humerus: 87\n",
      "right humerus: 88\n",
      "left scapula: 89\n",
      "right scapula: 90\n",
      "left clavicula: 91\n",
      "right clavicula: 92\n",
      "left femur: 93\n",
      "right femur: 94\n",
      "left hip: 95\n",
      "right hip: 96\n",
      "sacrum: 97\n",
      "left gluteus maximus: 98\n",
      "right gluteus maximus: 99\n",
      "left gluteus medius: 100\n",
      "right gluteus medius: 101\n",
      "left gluteus minimus: 102\n",
      "right gluteus minimus: 103\n",
      "left autochthon: 104\n",
      "right autochthon: 105\n",
      "left iliopsoas: 106\n",
      "right iliopsoas: 107\n",
      "left atrial appendage: 108\n",
      "brachiocephalic trunk: 109\n",
      "left brachiocephalic vein: 110\n",
      "right brachiocephalic vein: 111\n",
      "left common carotid artery: 112\n",
      "right common carotid artery: 113\n",
      "costal cartilages: 114\n",
      "heart: 115\n",
      "left kidney cyst: 116\n",
      "right kidney cyst: 117\n",
      "prostate: 118\n",
      "pulmonary vein: 119\n",
      "skull: 120\n",
      "spinal cord: 121\n",
      "sternum: 122\n",
      "left subclavian artery: 123\n",
      "right subclavian artery: 124\n",
      "superior vena cava: 125\n",
      "thyroid gland: 126\n",
      "vertebrae S1: 127\n",
      "bone lesion: 128\n",
      "kidney mass: 129\n",
      "liver tumor: 130\n",
      "vertebrae L6: 131\n",
      "airway: 132\n"
     ]
    }
   ],
   "source": [
    "# Download from /v1/vista3d/info\n",
    "with open('vista3dmodelinfo.json', 'rb') as f:\n",
    "    segmentation_dict  = json.load(f)['labels']\n",
    "\n",
    "segmentation_dict = {v: k for k, v in segmentation_dict.items()}\n",
    "\n",
    "print(\"Mapping tissue to label:\")\n",
    "for tissue, label in segmentation_dict.items():\n",
    "    print(f\"{tissue}: {label}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "775d7be2-002f-4f66-bd8e-0dd813ecc771",
   "metadata": {},
   "source": [
    "📏 Measure diameters of vessels.\n",
    "\n",
    "We take the measurements in the axial plane scans - to do se, we identify the cross-section planes of the vessels. This is done within the `vessel geometry analysis and reconstruction` app, which we introduce below.\n",
    "\n",
    "For this reason, we create a dictionary that for each patient contains only the paths to the Nifti files that contain axial planes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fb4fe305-f18c-48f2-9604-2373a8241253",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'testing': ['/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0050.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0133.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0134.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0135.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0136.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0137.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0138.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0139.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0140.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0141.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0142.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0143.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0144.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0145.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0146.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0147.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0148.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0149.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0150.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0151.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0152.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0153.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0154.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0155.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0156.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0157.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0158.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0159.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0160.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0161.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0162.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0163.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0164.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0165.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0166.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0167.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0168.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0169.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0170.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0171.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0172.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0173.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0174.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0175.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0176.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0177.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0178.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0179.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0180.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0181.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0182.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0183.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0184.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0185.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0186.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0187.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0188.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0189.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0190.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0191.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0192.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0193.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0194.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0195.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0196.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0197.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0198.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0199.nii.gz'],\n",
       " 'training': ['/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0001.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0003.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0004.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0005.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0006.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0007.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0008.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0009.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0010.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0011.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0012.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0013.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0014.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0015.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0016.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0017.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0018.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0019.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0020.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0021.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0022.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0023.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0024.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0025.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0026.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0027.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0028.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0029.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0030.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0031.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0032.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0033.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0034.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0035.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0036.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0037.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0038.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0039.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0040.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0041.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0042.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0043.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0044.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0045.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0046.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0047.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0048.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0049.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0050.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0051.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0052.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0053.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0054.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0055.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0056.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0057.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0058.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0059.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0060.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0061.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0062.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0063.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0064.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0065.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/training/FLARETs_0066.nii.gz'],\n",
       " 'tuning': ['/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0002.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0067.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0068.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0069.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0070.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0071.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0072.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0073.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0074.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0075.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0076.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0077.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0078.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0079.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0080.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0081.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0082.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0083.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0084.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0085.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0086.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0087.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0088.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0089.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0090.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0091.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0092.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0093.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0094.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0095.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0096.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0097.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0098.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0099.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0100.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0101.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0102.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0103.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0104.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0105.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0106.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0107.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0108.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0109.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0110.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0111.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0112.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0113.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0114.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0115.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0116.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0117.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0118.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0119.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0120.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0121.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0122.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0123.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0124.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0125.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0126.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0127.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0128.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0129.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0130.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0131.nii.gz',\n",
       "  '/mnt/shared/vista-3d/outputs_flare/nifti_data/tuning/FLARETs_0132.nii.gz']}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "patient_dict = {}\n",
    "for patient_paths in (Path(ALL_OUTPUTS_PATH) / 'nifti_data').rglob('*nii.gz'):\n",
    "    patient = patient_paths.parent.name\n",
    "    if patient not in patient_dict:\n",
    "        patient_dict[patient] = []\n",
    "\n",
    "    \n",
    "    if \"sa\" not in str(patient_paths.resolve()) and \"co\" not in str(patient_paths.resolve()):\n",
    "        patient_dict[patient].append(str(patient_paths.resolve()))\n",
    "\n",
    "patient_dict"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9639afc",
   "metadata": {},
   "source": [
    "## 🛠️ 4) Prepare data for further analysis\n",
    "\n",
    "Here we process the segmentation output and prepare it for processing using the `vessels geometry analysis and reconstruction app`.\n",
    "\n",
    "The steps below include:\n",
    "\n",
    "- limiting the segmentation outputs to include only the vessels of interest (aorta, right and left common iliac arteries)\n",
    "- projecting the segmented voxels from voxel to the real world space, identifying (x, y, z) coordinates of each voxel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2b9cb297-3c74-4942-96f2-bd1a59058679",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------\n",
      ">> processing patient:  testing\n",
      "processing FLARETs_0050 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0050.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0050.npz\n",
      "processing FLARETs_0133 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0133.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0133.npz\n",
      "processing FLARETs_0134 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0134.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0134.npz\n",
      "processing FLARETs_0135 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0135.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0135.npz\n",
      "processing FLARETs_0136 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0136.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0136.npz\n",
      "processing FLARETs_0137 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 15 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0137.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0137.npz\n",
      "processing FLARETs_0138 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0138.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0138.npz\n",
      "processing FLARETs_0139 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0139.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0139.npz\n",
      "processing FLARETs_0140 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0140.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0140.npz\n",
      "processing FLARETs_0141 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0141.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0141.npz\n",
      "processing FLARETs_0142 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0142.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0142.npz\n",
      "processing FLARETs_0143 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0143.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0143.npz\n",
      "processing FLARETs_0144 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0144.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0144.npz\n",
      "processing FLARETs_0145 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 202 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0145.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0145.npz\n",
      "processing FLARETs_0146 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0146.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0146.npz\n",
      "processing FLARETs_0147 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0147.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0147.npz\n",
      "processing FLARETs_0148 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0148.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0148.npz\n",
      "processing FLARETs_0149 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0149.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0149.npz\n",
      "processing FLARETs_0150 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0150.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0150.npz\n",
      "processing FLARETs_0151 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 110 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0151.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0151.npz\n",
      "processing FLARETs_0152 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0152.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0152.npz\n",
      "processing FLARETs_0153 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0153.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0153.npz\n",
      "processing FLARETs_0154 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0154.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0154.npz\n",
      "processing FLARETs_0155 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 988 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0155.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0155.npz\n",
      "processing FLARETs_0156 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0156.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0156.npz\n",
      "processing FLARETs_0157 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0157.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0157.npz\n",
      "processing FLARETs_0158 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0158.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0158.npz\n",
      "processing FLARETs_0159 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0159.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0159.npz\n",
      "processing FLARETs_0160 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 28 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0160.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0160.npz\n",
      "processing FLARETs_0161 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0161.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0161.npz\n",
      "processing FLARETs_0162 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0162.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0162.npz\n",
      "processing FLARETs_0163 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 113 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0163.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0163.npz\n",
      "processing FLARETs_0164 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0164.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0164.npz\n",
      "processing FLARETs_0165 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0165.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0165.npz\n",
      "processing FLARETs_0166 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0166.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0166.npz\n",
      "processing FLARETs_0167 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0167.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0167.npz\n",
      "processing FLARETs_0168 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 68 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0168.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0168.npz\n",
      "processing FLARETs_0169 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0169.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0169.npz\n",
      "processing FLARETs_0170 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0170.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0170.npz\n",
      "processing FLARETs_0171 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0171.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0171.npz\n",
      "processing FLARETs_0172 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 2 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0172.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0172.npz\n",
      "processing FLARETs_0173 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0173.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0173.npz\n",
      "processing FLARETs_0174 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0174.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0174.npz\n",
      "processing FLARETs_0175 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0175.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0175.npz\n",
      "processing FLARETs_0176 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0176.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0176.npz\n",
      "processing FLARETs_0177 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 19 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0177.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0177.npz\n",
      "processing FLARETs_0178 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0178.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0178.npz\n",
      "processing FLARETs_0179 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0179.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0179.npz\n",
      "processing FLARETs_0180 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0180.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0180.npz\n",
      "processing FLARETs_0181 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0181.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0181.npz\n",
      "processing FLARETs_0182 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0182.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0182.npz\n",
      "processing FLARETs_0183 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 34 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0183.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0183.npz\n",
      "processing FLARETs_0184 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0184.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0184.npz\n",
      "processing FLARETs_0185 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0185.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0185.npz\n",
      "processing FLARETs_0186 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0186.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0186.npz\n",
      "processing FLARETs_0187 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0187.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0187.npz\n",
      "processing FLARETs_0188 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0188.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0188.npz\n",
      "processing FLARETs_0189 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0189.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0189.npz\n",
      "processing FLARETs_0190 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 4 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0190.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0190.npz\n",
      "processing FLARETs_0191 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0191.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0191.npz\n",
      "processing FLARETs_0192 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0192.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0192.npz\n",
      "processing FLARETs_0193 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 24 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0193.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0193.npz\n",
      "processing FLARETs_0194 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0194.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0194.npz\n",
      "processing FLARETs_0195 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 214 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0195.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0195.npz\n",
      "processing FLARETs_0196 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0196.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0196.npz\n",
      "processing FLARETs_0197 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0197.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0197.npz\n",
      "processing FLARETs_0198 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 12 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0198.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0198.npz\n",
      "processing FLARETs_0199 for patient testing\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 1058 points in \n",
      "outputs_flare/pointclouds/testing/FLARETs_0199.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/testing/FLARETs_0199.npz\n",
      "----------\n",
      ">> processing patient:  training\n",
      "processing FLARETs_0001 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0001.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0001.npz\n",
      "processing FLARETs_0003 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0003.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0003.npz\n",
      "processing FLARETs_0004 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 103 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0004.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0004.npz\n",
      "processing FLARETs_0005 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0005.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0005.npz\n",
      "processing FLARETs_0006 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 12 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0006.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0006.npz\n",
      "processing FLARETs_0007 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0007.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0007.npz\n",
      "processing FLARETs_0008 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0008.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0008.npz\n",
      "processing FLARETs_0009 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0009.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0009.npz\n",
      "processing FLARETs_0010 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0010.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0010.npz\n",
      "processing FLARETs_0011 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 4 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0011.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0011.npz\n",
      "processing FLARETs_0012 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0012.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0012.npz\n",
      "processing FLARETs_0013 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0013.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0013.npz\n",
      "processing FLARETs_0014 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0014.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0014.npz\n",
      "processing FLARETs_0015 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0015.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0015.npz\n",
      "processing FLARETs_0016 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0016.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0016.npz\n",
      "processing FLARETs_0017 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0017.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0017.npz\n",
      "processing FLARETs_0018 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0018.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0018.npz\n",
      "processing FLARETs_0019 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0019.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0019.npz\n",
      "processing FLARETs_0020 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0020.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0020.npz\n",
      "processing FLARETs_0021 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0021.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0021.npz\n",
      "processing FLARETs_0022 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0022.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0022.npz\n",
      "processing FLARETs_0023 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0023.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0023.npz\n",
      "processing FLARETs_0024 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0024.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0024.npz\n",
      "processing FLARETs_0025 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0025.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0025.npz\n",
      "processing FLARETs_0026 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 316 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0026.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0026.npz\n",
      "processing FLARETs_0027 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0027.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0027.npz\n",
      "processing FLARETs_0028 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0028.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0028.npz\n",
      "processing FLARETs_0029 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0029.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0029.npz\n",
      "processing FLARETs_0030 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 30 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0030.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0030.npz\n",
      "processing FLARETs_0031 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0031.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0031.npz\n",
      "processing FLARETs_0032 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0032.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0032.npz\n",
      "processing FLARETs_0033 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0033.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0033.npz\n",
      "processing FLARETs_0034 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0034.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0034.npz\n",
      "processing FLARETs_0035 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0035.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0035.npz\n",
      "processing FLARETs_0036 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0036.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0036.npz\n",
      "processing FLARETs_0037 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0037.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0037.npz\n",
      "processing FLARETs_0038 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0038.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0038.npz\n",
      "processing FLARETs_0039 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0039.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0039.npz\n",
      "processing FLARETs_0040 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0040.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0040.npz\n",
      "processing FLARETs_0041 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0041.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0041.npz\n",
      "processing FLARETs_0042 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0042.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0042.npz\n",
      "processing FLARETs_0043 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0043.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0043.npz\n",
      "processing FLARETs_0044 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0044.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0044.npz\n",
      "processing FLARETs_0045 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0045.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0045.npz\n",
      "processing FLARETs_0046 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0046.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0046.npz\n",
      "processing FLARETs_0047 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0047.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0047.npz\n",
      "processing FLARETs_0048 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0048.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0048.npz\n",
      "processing FLARETs_0049 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 2 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0049.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0049.npz\n",
      "processing FLARETs_0050 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0050.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0050.npz\n",
      "processing FLARETs_0051 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0051.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0051.npz\n",
      "processing FLARETs_0052 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0052.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0052.npz\n",
      "processing FLARETs_0053 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0053.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0053.npz\n",
      "processing FLARETs_0054 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0054.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0054.npz\n",
      "processing FLARETs_0055 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 4 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0055.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0055.npz\n",
      "processing FLARETs_0056 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0056.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0056.npz\n",
      "processing FLARETs_0057 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0057.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0057.npz\n",
      "processing FLARETs_0058 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0058.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0058.npz\n",
      "processing FLARETs_0059 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0059.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0059.npz\n",
      "processing FLARETs_0060 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0060.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0060.npz\n",
      "processing FLARETs_0061 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0061.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0061.npz\n",
      "processing FLARETs_0062 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 4 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0062.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0062.npz\n",
      "processing FLARETs_0063 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 10 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0063.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0063.npz\n",
      "processing FLARETs_0064 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0064.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0064.npz\n",
      "processing FLARETs_0065 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0065.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0065.npz\n",
      "processing FLARETs_0066 for patient training\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 2 points in \n",
      "outputs_flare/pointclouds/training/FLARETs_0066.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/training/FLARETs_0066.npz\n",
      "----------\n",
      ">> processing patient:  tuning\n",
      "processing FLARETs_0002 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0002.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0002.npz\n",
      "processing FLARETs_0067 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0067.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0067.npz\n",
      "processing FLARETs_0068 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 9 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0068.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0068.npz\n",
      "processing FLARETs_0069 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0069.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0069.npz\n",
      "processing FLARETs_0070 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0070.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0070.npz\n",
      "processing FLARETs_0071 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0071.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0071.npz\n",
      "processing FLARETs_0072 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0072.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0072.npz\n",
      "processing FLARETs_0073 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0073.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0073.npz\n",
      "processing FLARETs_0074 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0074.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0074.npz\n",
      "processing FLARETs_0075 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0075.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0075.npz\n",
      "processing FLARETs_0076 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0076.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0076.npz\n",
      "processing FLARETs_0077 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0077.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0077.npz\n",
      "processing FLARETs_0078 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0078.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0078.npz\n",
      "processing FLARETs_0079 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0079.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0079.npz\n",
      "processing FLARETs_0080 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 388 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0080.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0080.npz\n",
      "processing FLARETs_0081 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 140 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0081.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0081.npz\n",
      "processing FLARETs_0082 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0082.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0082.npz\n",
      "processing FLARETs_0083 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0083.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0083.npz\n",
      "processing FLARETs_0084 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0084.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0084.npz\n",
      "processing FLARETs_0085 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 38 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0085.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0085.npz\n",
      "processing FLARETs_0086 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0086.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0086.npz\n",
      "processing FLARETs_0087 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0087.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0087.npz\n",
      "processing FLARETs_0088 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0088.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0088.npz\n",
      "processing FLARETs_0089 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0089.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0089.npz\n",
      "processing FLARETs_0090 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 68 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0090.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0090.npz\n",
      "processing FLARETs_0091 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0091.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0091.npz\n",
      "processing FLARETs_0092 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0092.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0092.npz\n",
      "processing FLARETs_0093 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0093.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0093.npz\n",
      "processing FLARETs_0094 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 2 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0094.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0094.npz\n",
      "processing FLARETs_0095 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0095.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0095.npz\n",
      "processing FLARETs_0096 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 4 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0096.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0096.npz\n",
      "processing FLARETs_0097 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0097.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0097.npz\n",
      "processing FLARETs_0098 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 464 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0098.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0098.npz\n",
      "processing FLARETs_0099 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 15 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0099.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0099.npz\n",
      "processing FLARETs_0100 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0100.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0100.npz\n",
      "processing FLARETs_0101 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0101.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0101.npz\n",
      "processing FLARETs_0102 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 11 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0102.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0102.npz\n",
      "processing FLARETs_0103 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0103.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0103.npz\n",
      "processing FLARETs_0104 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0104.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0104.npz\n",
      "processing FLARETs_0105 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 12 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0105.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0105.npz\n",
      "processing FLARETs_0106 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 10 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0106.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0106.npz\n",
      "processing FLARETs_0107 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0107.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0107.npz\n",
      "processing FLARETs_0108 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0108.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0108.npz\n",
      "processing FLARETs_0109 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0109.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0109.npz\n",
      "processing FLARETs_0110 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0110.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0110.npz\n",
      "processing FLARETs_0111 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0111.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0111.npz\n",
      "processing FLARETs_0112 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0112.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0112.npz\n",
      "processing FLARETs_0113 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0113.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0113.npz\n",
      "processing FLARETs_0114 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0114.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0114.npz\n",
      "processing FLARETs_0115 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0115.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0115.npz\n",
      "processing FLARETs_0116 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 34 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0116.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0116.npz\n",
      "processing FLARETs_0117 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0117.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0117.npz\n",
      "processing FLARETs_0118 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0118.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0118.npz\n",
      "processing FLARETs_0119 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 241 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0119.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0119.npz\n",
      "processing FLARETs_0120 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 76 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0120.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0120.npz\n",
      "processing FLARETs_0121 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0121.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0121.npz\n",
      "processing FLARETs_0122 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0122.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0122.npz\n",
      "processing FLARETs_0123 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0123.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0123.npz\n",
      "processing FLARETs_0124 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0124.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0124.npz\n",
      "processing FLARETs_0125 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0125.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0125.npz\n",
      "processing FLARETs_0126 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 8 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0126.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0126.npz\n",
      "processing FLARETs_0127 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0127.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0127.npz\n",
      "processing FLARETs_0128 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0128.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0128.npz\n",
      "processing FLARETs_0129 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0129.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0129.npz\n",
      "processing FLARETs_0130 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 1843 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0130.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0130.npz\n",
      "processing FLARETs_0131 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0131.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0131.npz\n",
      "processing FLARETs_0132 for patient tuning\n",
      "After processing segmentation, the new labels mapping is:\n",
      "\n",
      "aorta: 1\n",
      "left iliac artery: 2\n",
      "right iliac artery: 3\n",
      "Saved pointcloud with 0 points in \n",
      "outputs_flare/pointclouds/tuning/FLARETs_0132.npz\n",
      "----------\n",
      "Processed segmentation mask saved in \n",
      "outputs_flare/processed_segmentations/tuning/FLARETs_0132.npz\n"
     ]
    }
   ],
   "source": [
    "# Extract the mapping between segmentation label and segmentation numerical value, using the segmentation dict provided by the Vista-3D model which we previously loaded in memory (i.e. 'vista3dmodelinfo.json')\n",
    "\n",
    "# In this study we are interested on 3 vessels, but could be expanded to any additional vessel/ tissue, provided the segmentation is available. Please refer to the 'vista3dmodelinfo.json' file, or the official Vista-3D model documentation.\n",
    "label_rois = ['aorta', 'left iliac artery', 'right iliac artery']\n",
    "vessel_labels = {k: int(segmentation_dict[k]) for k in label_rois}\n",
    "\n",
    "for idx, patient_id in enumerate(patient_dict.keys()):\n",
    "\n",
    "    patient = patient_id\n",
    "\n",
    "    print(\"-\" * 10)\n",
    "    print(\">> processing patient: \", patient)\n",
    "\n",
    "    for series, scan_path in enumerate(patient_dict[patient]):\n",
    "        try:\n",
    "            scan_path_lower = scan_path.lower()\n",
    "            volume_name = Path(patient_dict[patient][series]).name.replace(\".nii.gz\", \"\")\n",
    "            print(f\"processing {volume_name} for patient {patient}\")\n",
    "            \n",
    "            # Load the CT to memory\n",
    "            ct_data = nib.load(scan_path)\n",
    "            ct_scan = ct_data.get_fdata()\n",
    "            affine = ct_data.affine\n",
    "          \n",
    "            # Load the segmentation to memory\n",
    "            segmentation_path = patient_dict[patient][series].replace('nifti_data', 'segmentations')\n",
    "            segmentation_data = nib.load(segmentation_path)\n",
    "            segmentation_scan = segmentation_data.get_fdata()\n",
    "            \n",
    "            # Create a new segmentation map with only the vessels of interest in it.\n",
    "            new_segmentation_scan = np.zeros_like(segmentation_scan)\n",
    "            for n,label in enumerate(vessel_labels.values(), start=1):\n",
    "                new_segmentation_scan += (segmentation_scan == label)*n\n",
    "            \n",
    "            # Create a new dict with the vessel labels\n",
    "            new_vessel_labels = {\n",
    "                k_key: id_k for id_k, (k_key, k_value) in enumerate(vessel_labels.items(), start=1)\n",
    "            }\n",
    "    \n",
    "            print(\"After processing segmentation, the new labels mapping is:\\n\")\n",
    "            for tissue, label in new_vessel_labels.items():\n",
    "                print(f\"{tissue}: {label}\")\n",
    "       \n",
    "            # ----------------------------------------------------------------------------\n",
    "            # Build the 3D coordinate grid (patient coordinates in mm)\n",
    "            \n",
    "            # Build coordinate grid\n",
    "            scan_size = ct_scan.shape #(4,4)\n",
    "        \n",
    "            # Meshgrid 3 integer volumes holding voxel indices (i,j,k)\t(512, 512, 146) each\n",
    "            grid_i, grid_j, grid_k = np.meshgrid(\n",
    "                np.arange(scan_size[0]), np.arange(scan_size[1]), np.arange(scan_size[2]), indexing='ij'\n",
    "            )\n",
    "    \n",
    "            # Since affine has shape 4x4, we need to stack a new column of 1s to make it the grid homogenous\n",
    "            indices = np.stack([grid_i, grid_j, grid_k, np.ones_like(grid_i)], axis=-1)\n",
    "        \n",
    "            # Create a tensor, where each voxel's value is the coordinate of that voxel in the x, y, z coordinate space    \n",
    "            # This uses the affine matrix provided by the Nifti files.\n",
    "            coords = indices @ affine.T\n",
    "    \n",
    "            # Undo the homogenous shape by slicing away the row that we had for math convenience\n",
    "            coords_xyz = coords[...,:3]\n",
    "        \n",
    "            \n",
    "            # ----------------------------------------------------------------------------\n",
    "            # Now that the coordinates are available in the x, y, z coordinate we can further process the results by\n",
    "            # extracting only the points that belong to vessels' region of interest.\n",
    "            \n",
    "            mask = new_segmentation_scan > 0 # convert to binary\n",
    "            points = coords_xyz[mask]   # shape (N,3)\n",
    "            \n",
    "            # Build colors based on segmentation label\n",
    "            colors = np.zeros((points.shape[0], 3))\n",
    "            \n",
    "            flat_labels = new_segmentation_scan[mask]\n",
    "            colors[flat_labels == 1] = [1, 0, 0]  # red for aorta\n",
    "            colors[flat_labels == 2] = [0, 1, 0]  # green for left iliac\n",
    "            colors[flat_labels == 3] = [0, 0, 1]  # blue for right iliac\n",
    "            \n",
    "            # Save pointclouds:\n",
    "    \n",
    "            pointcloud_dir = Path(ALL_OUTPUTS_PATH) / \"pointclouds\"\n",
    "            os.makedirs(pointcloud_dir, exist_ok=True)\n",
    "    \n",
    "            patient_pointcloud_npz = Path(pointcloud_dir) / f\"{patient_id}\" / f\"{volume_name}.npz\"\n",
    "    \n",
    "            os.makedirs(patient_pointcloud_npz.parent, exist_ok=True)\n",
    "            np.savez_compressed(patient_pointcloud_npz, points=points, colors=colors)\n",
    "            print(f\"Saved pointcloud with {points.shape[0]} points in \\n{patient_pointcloud_npz}\")\n",
    "    \n",
    "            # Save post processed segmentation:\n",
    "            processed_segmentation_dir = Path(ALL_OUTPUTS_PATH) / \"processed_segmentations\" / patient_id\n",
    "            vessel_segmentation_npz = Path(processed_segmentation_dir) / f\"{volume_name}.npz\"\n",
    "    \n",
    "            os.makedirs(processed_segmentation_dir, exist_ok=True)\n",
    "            np.savez_compressed(vessel_segmentation_npz, new_seg_scan=new_segmentation_scan)\n",
    "            print(f\"{'-'*10}\\nProcessed segmentation mask saved in \\n{vessel_segmentation_npz}\")\n",
    "        except Exception as e:\n",
    "            print(e)\n",
    "            continue"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "03db213c-0fb0-4a6c-9caa-b40ad9e479e7",
   "metadata": {},
   "source": [
    "## 🔍 Visual inspection of the data \n",
    "\n",
    "Here we provide code snippets which are examplary of how to visualize the Nifti inputs and segmentation outputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6d96a987",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython import display\n",
    "import time\n",
    "\n",
    "\n",
    "# --- Utility functions to visualize the segmentation overlayed to the acquisition scan ---\n",
    "def visualize_slice(image, mask=None):\n",
    "    \"\"\"\n",
    "    Visualize slice.\n",
    "\n",
    "    Args:\n",
    "        image: 2D np.array to visualize\n",
    "        mask: Optional 2D np.array to overlay\n",
    "    \"\"\"\n",
    "    plt.imshow(image, cmap=plt.cm.gray)\n",
    "    if mask is not None:\n",
    "        plt.imshow(np.ma.masked_where(mask==0, mask), cmap=\"jet\", alpha=0.5, interpolation=\"none\")\n",
    "\n",
    "\n",
    "def visualize_scan(image, mask=None, interval=5, pause_time=0.1, show_slices=None, slice_dim=\"first\"):\n",
    "    \"\"\"\n",
    "    Visualize volume.\n",
    "\n",
    "    Args:\n",
    "        image: 3D np.array to visualize\n",
    "        mask: Optional 3D np.array to overlay\n",
    "        interval: int, interval between slices to be visualized \n",
    "        pause_time=0.1: float, pause between slice visualization\n",
    "        show_slices=None: Optional[List[int]]. If None, shows all slices at the interval rate, else shows the specified slices\n",
    "        slice_dim=\"first\", whether slices are in the 'first' or 'last' dimension of the volume.\n",
    "\n",
    "    \"\"\"\n",
    "    if slice_dim == \"first\":\n",
    "        show_slices = show_slices or range(0, image.shape[0], interval)\n",
    "    elif slice_dim == \"last\":\n",
    "        show_slices = show_slices or range(0, image.shape[-1], interval)\n",
    "    else:\n",
    "        raise ValueError(\"slice axis must be first or last. Used \", slice_dim)\n",
    "\n",
    "    for n in show_slices:\n",
    "        if slice_dim == \"first\":\n",
    "            visualize_slice(image[n]*1000, mask[n] if mask is not None else None )\n",
    "        elif slice_dim == \"last\":\n",
    "            visualize_slice(image[...,n]*1000, mask[...,n] if mask is not None else None)\n",
    "\n",
    "        plt.title(f\"Slice {n}\")\n",
    "        display.display(plt.gcf())\n",
    "        display.clear_output(wait=True)\n",
    "        time.sleep(pause_time)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d556ecc4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "List of patients:\n",
      "0 - testing\n",
      "1 - training\n",
      "2 - tuning\n"
     ]
    }
   ],
   "source": [
    "# Print the name of patients available in the dataset\n",
    "patients_ids = list(patient_dict.keys())\n",
    "print(f\"List of patients:\")\n",
    "for p_idx, p in enumerate(patients_ids):\n",
    "    print(f\"{p_idx} - {p}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "2518258c-f969-4ac7-97a5-41cf3dd4f298",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "patient 0 (i.e. testing) has the following axial series available\n",
      "series_idx=0 - scan = FLARETs_0050.nii.gz\n",
      "series_idx=1 - scan = FLARETs_0133.nii.gz\n",
      "series_idx=2 - scan = FLARETs_0134.nii.gz\n",
      "series_idx=3 - scan = FLARETs_0135.nii.gz\n",
      "series_idx=4 - scan = FLARETs_0136.nii.gz\n",
      "series_idx=5 - scan = FLARETs_0137.nii.gz\n",
      "series_idx=6 - scan = FLARETs_0138.nii.gz\n",
      "series_idx=7 - scan = FLARETs_0139.nii.gz\n",
      "series_idx=8 - scan = FLARETs_0140.nii.gz\n",
      "series_idx=9 - scan = FLARETs_0141.nii.gz\n",
      "series_idx=10 - scan = FLARETs_0142.nii.gz\n",
      "series_idx=11 - scan = FLARETs_0143.nii.gz\n",
      "series_idx=12 - scan = FLARETs_0144.nii.gz\n",
      "series_idx=13 - scan = FLARETs_0145.nii.gz\n",
      "series_idx=14 - scan = FLARETs_0146.nii.gz\n",
      "series_idx=15 - scan = FLARETs_0147.nii.gz\n",
      "series_idx=16 - scan = FLARETs_0148.nii.gz\n",
      "series_idx=17 - scan = FLARETs_0149.nii.gz\n",
      "series_idx=18 - scan = FLARETs_0150.nii.gz\n",
      "series_idx=19 - scan = FLARETs_0151.nii.gz\n",
      "series_idx=20 - scan = FLARETs_0152.nii.gz\n",
      "series_idx=21 - scan = FLARETs_0153.nii.gz\n",
      "series_idx=22 - scan = FLARETs_0154.nii.gz\n",
      "series_idx=23 - scan = FLARETs_0155.nii.gz\n",
      "series_idx=24 - scan = FLARETs_0156.nii.gz\n",
      "series_idx=25 - scan = FLARETs_0157.nii.gz\n",
      "series_idx=26 - scan = FLARETs_0158.nii.gz\n",
      "series_idx=27 - scan = FLARETs_0159.nii.gz\n",
      "series_idx=28 - scan = FLARETs_0160.nii.gz\n",
      "series_idx=29 - scan = FLARETs_0161.nii.gz\n",
      "series_idx=30 - scan = FLARETs_0162.nii.gz\n",
      "series_idx=31 - scan = FLARETs_0163.nii.gz\n",
      "series_idx=32 - scan = FLARETs_0164.nii.gz\n",
      "series_idx=33 - scan = FLARETs_0165.nii.gz\n",
      "series_idx=34 - scan = FLARETs_0166.nii.gz\n",
      "series_idx=35 - scan = FLARETs_0167.nii.gz\n",
      "series_idx=36 - scan = FLARETs_0168.nii.gz\n",
      "series_idx=37 - scan = FLARETs_0169.nii.gz\n",
      "series_idx=38 - scan = FLARETs_0170.nii.gz\n",
      "series_idx=39 - scan = FLARETs_0171.nii.gz\n",
      "series_idx=40 - scan = FLARETs_0172.nii.gz\n",
      "series_idx=41 - scan = FLARETs_0173.nii.gz\n",
      "series_idx=42 - scan = FLARETs_0174.nii.gz\n",
      "series_idx=43 - scan = FLARETs_0175.nii.gz\n",
      "series_idx=44 - scan = FLARETs_0176.nii.gz\n",
      "series_idx=45 - scan = FLARETs_0177.nii.gz\n",
      "series_idx=46 - scan = FLARETs_0178.nii.gz\n",
      "series_idx=47 - scan = FLARETs_0179.nii.gz\n",
      "series_idx=48 - scan = FLARETs_0180.nii.gz\n",
      "series_idx=49 - scan = FLARETs_0181.nii.gz\n",
      "series_idx=50 - scan = FLARETs_0182.nii.gz\n",
      "series_idx=51 - scan = FLARETs_0183.nii.gz\n",
      "series_idx=52 - scan = FLARETs_0184.nii.gz\n",
      "series_idx=53 - scan = FLARETs_0185.nii.gz\n",
      "series_idx=54 - scan = FLARETs_0186.nii.gz\n",
      "series_idx=55 - scan = FLARETs_0187.nii.gz\n",
      "series_idx=56 - scan = FLARETs_0188.nii.gz\n",
      "series_idx=57 - scan = FLARETs_0189.nii.gz\n",
      "series_idx=58 - scan = FLARETs_0190.nii.gz\n",
      "series_idx=59 - scan = FLARETs_0191.nii.gz\n",
      "series_idx=60 - scan = FLARETs_0192.nii.gz\n",
      "series_idx=61 - scan = FLARETs_0193.nii.gz\n",
      "series_idx=62 - scan = FLARETs_0194.nii.gz\n",
      "series_idx=63 - scan = FLARETs_0195.nii.gz\n",
      "series_idx=64 - scan = FLARETs_0196.nii.gz\n",
      "series_idx=65 - scan = FLARETs_0197.nii.gz\n",
      "series_idx=66 - scan = FLARETs_0198.nii.gz\n",
      "series_idx=67 - scan = FLARETs_0199.nii.gz\n"
     ]
    }
   ],
   "source": [
    "# Select a patient among those printed above by specifying `idx` below, \n",
    "# and the code will print the name scan series available for inspection\n",
    "\n",
    "# select one of the patients\n",
    "idx = 0 \n",
    "\n",
    "scans_paths = patient_dict[patients_ids[idx]]\n",
    "print(f\"patient {idx} (i.e. {patients_ids[idx]}) has the following axial series available\")\n",
    "for j, sp in enumerate(scans_paths):\n",
    "    print(f\"series_idx={j} - scan = {Path(sp).name}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c07b932b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading FLARETs_0133.nii.gz\n",
      "----------\n",
      "CT_SCAN: /mnt/shared/vista-3d/outputs_flare/nifti_data/testing/FLARETs_0133.nii.gz loaded successfully\n",
      "ALL CLASSES SEGMENTAION: /mnt/shared/vista-3d/outputs_flare/segmentations/testing/FLARETs_0133.nii.gz loaded successfully\n",
      "PROCESSED SEGMENTATION: /mnt/shared/vista-3d/outputs_flare/processed_segmentations/testing/FLARETs_0133.npz loaded successfully\n"
     ]
    }
   ],
   "source": [
    "# Select a scan series among those printed above by specifying `series_idx` below, \n",
    "# and the code will load the related files into memory\n",
    "series_idx = 1\n",
    "\n",
    "print(f\"Loading {Path(scans_paths[series_idx]).name}\")\n",
    "print('-'*10)\n",
    "# Load the CT to memory\n",
    "ct_visual = nib.load(scans_paths[series_idx]).get_fdata()\n",
    "print(f\"CT_SCAN: {scans_paths[series_idx]} loaded successfully\")\n",
    "seg_all_visual = nib.load(scans_paths[series_idx].replace('nifti_data', 'segmentations')).get_fdata()\n",
    "print(f\"ALL CLASSES SEGMENTAION: {scans_paths[series_idx].replace('nifti_data', 'segmentations')} loaded successfully\")\n",
    "seg_proc_visual = np.load(scans_paths[series_idx].replace('nifti_data', 'processed_segmentations').replace(\".nii.gz\", \".npz\"))['new_seg_scan']\n",
    "print(f\"PROCESSED SEGMENTATION: {scans_paths[series_idx].replace('nifti_data', 'processed_segmentations').replace('.nii.gz', '.npz')} loaded successfully\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a6bfadf-b35d-48dc-824c-34d42dfb8065",
   "metadata": {},
   "source": [
    "#### Example of CT scan (axial plane)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4180012a-0175-4529-b7be-30bbd25574e9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,\n",
       "       13., 14.])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unique(ct_visual)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "aac2f6be-deb9-4de2-8de9-d1487dd1a3c2",
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[13], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mvisualize_scan\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m      2\u001b[0m \u001b[43m    \u001b[49m\u001b[43mimage\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mflipud\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtranspose\u001b[49m\u001b[43m(\u001b[49m\u001b[43mct_visual\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m      3\u001b[0m \u001b[43m    \u001b[49m\u001b[43minterval\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m      4\u001b[0m \u001b[43m    \u001b[49m\u001b[43mpause_time\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0.1\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m      5\u001b[0m \u001b[43m    \u001b[49m\u001b[43mshow_slices\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m      6\u001b[0m \u001b[43m    \u001b[49m\u001b[43mslice_dim\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mlast\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m      7\u001b[0m \u001b[43m)\u001b[49m\n",
      "Cell \u001b[0;32mIn[9], line 48\u001b[0m, in \u001b[0;36mvisualize_scan\u001b[0;34m(image, mask, interval, pause_time, show_slices, slice_dim)\u001b[0m\n\u001b[1;32m     45\u001b[0m     visualize_slice(image[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m,n]\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m1000\u001b[39m, mask[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m,n] \u001b[38;5;28;01mif\u001b[39;00m mask \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m     47\u001b[0m plt\u001b[38;5;241m.\u001b[39mtitle(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSlice \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mn\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 48\u001b[0m \u001b[43mdisplay\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdisplay\u001b[49m\u001b[43m(\u001b[49m\u001b[43mplt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgcf\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     49\u001b[0m display\u001b[38;5;241m.\u001b[39mclear_output(wait\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m     50\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(pause_time)\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/IPython/core/display_functions.py:298\u001b[0m, in \u001b[0;36mdisplay\u001b[0;34m(include, exclude, metadata, transient, display_id, raw, clear, *objs, **kwargs)\u001b[0m\n\u001b[1;32m    296\u001b[0m     publish_display_data(data\u001b[38;5;241m=\u001b[39mobj, metadata\u001b[38;5;241m=\u001b[39mmetadata, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m    297\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 298\u001b[0m     format_dict, md_dict \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minclude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexclude\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexclude\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    299\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m format_dict:\n\u001b[1;32m    300\u001b[0m         \u001b[38;5;66;03m# nothing to display (e.g. _ipython_display_ took over)\u001b[39;00m\n\u001b[1;32m    301\u001b[0m         \u001b[38;5;28;01mcontinue\u001b[39;00m\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/IPython/core/formatters.py:238\u001b[0m, in \u001b[0;36mDisplayFormatter.format\u001b[0;34m(self, obj, include, exclude)\u001b[0m\n\u001b[1;32m    236\u001b[0m md \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m    237\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 238\u001b[0m     data \u001b[38;5;241m=\u001b[39m \u001b[43mformatter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    239\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[1;32m    240\u001b[0m     \u001b[38;5;66;03m# FIXME: log the exception\u001b[39;00m\n\u001b[1;32m    241\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/decorator.py:235\u001b[0m, in \u001b[0;36mdecorate.<locals>.fun\u001b[0;34m(*args, **kw)\u001b[0m\n\u001b[1;32m    233\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m kwsyntax:\n\u001b[1;32m    234\u001b[0m     args, kw \u001b[38;5;241m=\u001b[39m fix(args, kw, sig)\n\u001b[0;32m--> 235\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcaller\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mextras\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkw\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/IPython/core/formatters.py:282\u001b[0m, in \u001b[0;36mcatch_format_error\u001b[0;34m(method, self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    280\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"show traceback on failed format call\"\"\"\u001b[39;00m\n\u001b[1;32m    281\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 282\u001b[0m     r \u001b[38;5;241m=\u001b[39m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    283\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m:\n\u001b[1;32m    284\u001b[0m     \u001b[38;5;66;03m# don't warn on NotImplementedErrors\u001b[39;00m\n\u001b[1;32m    285\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_return(\u001b[38;5;28;01mNone\u001b[39;00m, args[\u001b[38;5;241m0\u001b[39m])\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/IPython/core/formatters.py:402\u001b[0m, in \u001b[0;36mBaseFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m    400\u001b[0m     \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m    401\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 402\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mprinter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    403\u001b[0m \u001b[38;5;66;03m# Finally look for special method names\u001b[39;00m\n\u001b[1;32m    404\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/IPython/core/pylabtools.py:170\u001b[0m, in \u001b[0;36mprint_figure\u001b[0;34m(fig, fmt, bbox_inches, base64, **kwargs)\u001b[0m\n\u001b[1;32m    167\u001b[0m     \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbackend_bases\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m FigureCanvasBase\n\u001b[1;32m    168\u001b[0m     FigureCanvasBase(fig)\n\u001b[0;32m--> 170\u001b[0m \u001b[43mfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcanvas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprint_figure\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbytes_io\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    171\u001b[0m data \u001b[38;5;241m=\u001b[39m bytes_io\u001b[38;5;241m.\u001b[39mgetvalue()\n\u001b[1;32m    172\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m fmt \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msvg\u001b[39m\u001b[38;5;124m'\u001b[39m:\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/backend_bases.py:2164\u001b[0m, in \u001b[0;36mFigureCanvasBase.print_figure\u001b[0;34m(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)\u001b[0m\n\u001b[1;32m   2161\u001b[0m     \u001b[38;5;66;03m# we do this instead of `self.figure.draw_without_rendering`\u001b[39;00m\n\u001b[1;32m   2162\u001b[0m     \u001b[38;5;66;03m# so that we can inject the orientation\u001b[39;00m\n\u001b[1;32m   2163\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(renderer, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_draw_disabled\u001b[39m\u001b[38;5;124m\"\u001b[39m, nullcontext)():\n\u001b[0;32m-> 2164\u001b[0m         \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   2165\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bbox_inches:\n\u001b[1;32m   2166\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m bbox_inches \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtight\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/artist.py:95\u001b[0m, in \u001b[0;36m_finalize_rasterization.<locals>.draw_wrapper\u001b[0;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m     93\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(draw)\n\u001b[1;32m     94\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mdraw_wrapper\u001b[39m(artist, renderer, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m---> 95\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     96\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39m_rasterizing:\n\u001b[1;32m     97\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization.<locals>.draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m     69\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m     70\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m     74\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/figure.py:3154\u001b[0m, in \u001b[0;36mFigure.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m   3151\u001b[0m         \u001b[38;5;66;03m# ValueError can occur when resizing a window.\u001b[39;00m\n\u001b[1;32m   3153\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch\u001b[38;5;241m.\u001b[39mdraw(renderer)\n\u001b[0;32m-> 3154\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   3155\u001b[0m \u001b[43m    \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   3157\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m sfig \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msubfigs:\n\u001b[1;32m   3158\u001b[0m     sfig\u001b[38;5;241m.\u001b[39mdraw(renderer)\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[0;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[1;32m    130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[1;32m    131\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[0;32m--> 132\u001b[0m         \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    134\u001b[0m     \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[1;32m    135\u001b[0m     image_group \u001b[38;5;241m=\u001b[39m []\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization.<locals>.draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m     69\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m     70\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m     74\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/axes/_base.py:3070\u001b[0m, in \u001b[0;36m_AxesBase.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m   3067\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artists_rasterized:\n\u001b[1;32m   3068\u001b[0m     _draw_rasterized(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfigure, artists_rasterized, renderer)\n\u001b[0;32m-> 3070\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   3071\u001b[0m \u001b[43m    \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   3073\u001b[0m renderer\u001b[38;5;241m.\u001b[39mclose_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124maxes\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m   3074\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[0;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[1;32m    130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[1;32m    131\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[0;32m--> 132\u001b[0m         \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    134\u001b[0m     \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[1;32m    135\u001b[0m     image_group \u001b[38;5;241m=\u001b[39m []\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization.<locals>.draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m     69\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m     70\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m     74\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/image.py:649\u001b[0m, in \u001b[0;36m_ImageBase.draw\u001b[0;34m(self, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m    647\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mdraw_image(gc, l, b, im, trans)\n\u001b[1;32m    648\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 649\u001b[0m     im, l, b, trans \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmake_image\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    650\u001b[0m \u001b[43m        \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_image_magnification\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    651\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m im \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    652\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mdraw_image(gc, l, b, im)\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/image.py:939\u001b[0m, in \u001b[0;36mAxesImage.make_image\u001b[0;34m(self, renderer, magnification, unsampled)\u001b[0m\n\u001b[1;32m    936\u001b[0m transformed_bbox \u001b[38;5;241m=\u001b[39m TransformedBbox(bbox, trans)\n\u001b[1;32m    937\u001b[0m clip \u001b[38;5;241m=\u001b[39m ((\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_clip_box() \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxes\u001b[38;5;241m.\u001b[39mbbox) \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_clip_on()\n\u001b[1;32m    938\u001b[0m         \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfigure\u001b[38;5;241m.\u001b[39mbbox)\n\u001b[0;32m--> 939\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_image\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_A\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbbox\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtransformed_bbox\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclip\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    940\u001b[0m \u001b[43m                        \u001b[49m\u001b[43mmagnification\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munsampled\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43munsampled\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/image.py:504\u001b[0m, in \u001b[0;36m_ImageBase._make_image\u001b[0;34m(self, A, in_bbox, out_bbox, clip_bbox, magnification, unsampled, round_to_pixel_border)\u001b[0m\n\u001b[1;32m    502\u001b[0m vrange \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m offset\n\u001b[1;32m    503\u001b[0m \u001b[38;5;66;03m# resample the input data to the correct resolution and shape\u001b[39;00m\n\u001b[0;32m--> 504\u001b[0m A_resampled \u001b[38;5;241m=\u001b[39m \u001b[43m_resample\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mA_scaled\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout_shape\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mt\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    505\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m A_scaled  \u001b[38;5;66;03m# Make sure we don't use A_scaled anymore!\u001b[39;00m\n\u001b[1;32m    506\u001b[0m \u001b[38;5;66;03m# Un-scale the resampled data to approximately the original\u001b[39;00m\n\u001b[1;32m    507\u001b[0m \u001b[38;5;66;03m# range. Things that interpolated to outside the original range\u001b[39;00m\n\u001b[1;32m    508\u001b[0m \u001b[38;5;66;03m# will still be outside, but possibly clipped in the case of\u001b[39;00m\n\u001b[1;32m    509\u001b[0m \u001b[38;5;66;03m# higher order interpolation + drastically changing data.\u001b[39;00m\n",
      "File \u001b[0;32m/opt/conda/lib/python3.11/site-packages/matplotlib/image.py:208\u001b[0m, in \u001b[0;36m_resample\u001b[0;34m(image_obj, data, out_shape, transform, resample, alpha)\u001b[0m\n\u001b[1;32m    206\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m resample \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    207\u001b[0m     resample \u001b[38;5;241m=\u001b[39m image_obj\u001b[38;5;241m.\u001b[39mget_resample()\n\u001b[0;32m--> 208\u001b[0m \u001b[43m_image\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresample\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtransform\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    209\u001b[0m \u001b[43m                \u001b[49m\u001b[43m_interpd_\u001b[49m\u001b[43m[\u001b[49m\u001b[43minterpolation\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    210\u001b[0m \u001b[43m                \u001b[49m\u001b[43mresample\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    211\u001b[0m \u001b[43m                \u001b[49m\u001b[43malpha\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    212\u001b[0m \u001b[43m                \u001b[49m\u001b[43mimage_obj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_filternorm\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    213\u001b[0m \u001b[43m                \u001b[49m\u001b[43mimage_obj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_filterrad\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    214\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m out\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAGxCAYAAAA6dVLUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAnOElEQVR4nO3de3TU9Z3/8deETIZwG7mZYbimgtcEegwuJcclyCUcaqRqvWG3h11td6GCpOCpBXuW1O4hWXYL2x68HKVFu67G00KUirCEFaMcRFMgSwKWYkEJmBBBmCQCk5C89w9/fn8O4TYhED7k+TjnfU7z+b7nO5/5HPXV78xnvuMzMxMAAI5IaO8JAAAQD4ILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCC/h/3n//fd11110aNGiQAoGAUlJSNHr0aM2dOzemb+zYsRo7dmzMmM/nU15e3qWbrKRly5bpzjvv1JAhQ5ScnKyhQ4dqxowZqqqqatFbW1urJ554Qtdee626dOmi/v37695779WOHTta9NbX1ys3N1fhcFidO3fWN7/5TRUWFl6KlwScFx+3fAKk1atXa8qUKRo7dqx++MMfql+/fqqqqtKf/vQnFRYWav/+/V7vV6H19ttve2ObN2/WgAEDNGDAgEs25/79++u2227Tt7/9bfXv31+7du3SL37xCzU1NWnbtm1KSUnxerOysvSnP/1JeXl5GjlypPbv368nn3xSBw8eVHl5uQYPHuz1Zmdnq7S0VAUFBbr22mv18ssva9myZfqv//ovPfjgg5fs9QFnZABszJgxds0111hjY2OLY01NTTF/Z2VlWVZW1iWa2ZkdPHiwxVhpaalJsl/84hfe2O7du02S/exnP4vp3bRpk0myxYsXe2OrV682Sfbyyy/H9E6cONHC4bCdPHmyjV8FED/eKgQkHT58WH369FFiYmKLYwkJ5/7X5HRvFR44cED/+I//qIEDByopKUnhcFj33HOPDh486PXU1tbqscceU2pqqpKSktS/f3/l5ubqiy++OOdzXn311S3GMjIy1KlTJ1VWVnpjfr9fkhQMBmN6r7rqKklS586dvbGioiJ169ZN9957b0zvP/zDP+jTTz/V+++/f855ARcbwQVIGj16tN5//309+uijev/999XY2HhB5ztw4IBuueUWFRUVac6cOVqzZo3+4z/+Q8FgUEeOHJEkHTt2TFlZWXrxxRf16KOPas2aNXr88cf1wgsvaMqUKbJWvItfUlKipqYm3XTTTd7Y4MGD9Z3vfEdLlizRhg0bVF9frz//+c969NFHNWjQID3wwANeb0VFhW644YYWAT58+HDvONDu2vuSD7gcHDp0yG699VaTZJLM7/dbZmam5efnW11dXUzv6d4qlGQLFizw/n7ooYfM7/fbzp07z/ic+fn5lpCQYKWlpTHjf/jDH0ySvfnmm3G9htraWrvhhhts4MCBLebc0NBgP/zhD73XJ8mGDx9ue/fujekbNmyYTZo0qcW5P/30U5NkCxcujGtOwMXAFRcgqXfv3nr33Xe9TQnf+c539Je//EXz5s1Tenq6Dh06FNf51qxZo9tuu0033HDDGXveeOMNpaWl6Zvf/KZOnjzp1aRJk+Tz+WI2f5zLiRMndPfdd+uTTz7R73//e3Xr1i3m+IwZM7RixQotWbJEJSUlevXVV5WUlKRx48bpk08+ien1+XxnfJ6zHQMulZZv6AMd2MiRIzVy5EhJUmNjox5//HEtWbJEixYt0qJFi877PJ999tk5dxgePHhQH330kfcZ1KnONyyj0ajuuusubdy4UW+88YZGjRoVc3zt2rX6zW9+o9///ve65557vPHs7GwNGTJEeXl5Wr58uaQvA/zw4cMtnuPzzz+XJPXq1eu85gRcTAQXcAZ+v18LFizQkiVL4v5sp2/fvjFb6E+nT58+Sk5O1m9/+9szHj+XaDSqO++8Uxs2bNDrr7+u8ePHt+gpKyuTJN1yyy0x41dddZWGDh0a89rS09P1yiuv6OTJkzGfc5WXl0uS0tLSzjkn4GLjrUJAOu2XdiXpww8/lCSFw+G4zjd58mRt2LBBu3btOmNPTk6O/vrXv6p3797eld7Xa8iQIWd9jq+utN566y2tWLFCkyZNOm3fV3PfvHlzzPjhw4f1l7/8JebK8K677lJ9fb1WrFgR0/viiy8qHA63uJoD2gNXXICkSZMmacCAAbrjjjt0/fXXq7m5WWVlZfrlL3+pbt26afbs2XGd78knn9SaNWs0ZswYzZ8/X+np6Tp69KjWrl2rOXPm6Prrr1dubq5WrFihMWPG6Mc//rGGDx+u5uZm7du3T+vWrdPcuXPPGhT33HOP1qxZoyeeeEK9e/eOCaYePXroxhtvlCTdfffd+ud//mfNmDFD+/fv180336yqqir927/9m44dOxbz2iZPnqyJEydqxowZqq2t1dChQ/XKK69o7dq1eumll9SpU6c4Vxa4CNp7dwhwOXj11VftwQcftGHDhlm3bt3M7/fboEGD7Pvf/36LnYHns6vQzKyystIeeughC4VC5vf7LRwO23333RfzxeH6+nr72c9+Ztddd50lJSVZMBi09PR0+/GPf2zV1dVnnbO+tkPw1Dp1flVVVTZz5kwbOnSode7c2cLhsN1+++323nvvtThvXV2dPfrooxYKhSwpKcmGDx9ur7zyyrkXEbhEuOUTAMApfMYFAHAKwQUAcArBBQBwSrsG19NPP63U1FR17txZGRkZevfdd9tzOgAAB7RbcL366qvKzc3VE088oW3btulv//ZvNXnyZO3bt6+9pgQAcEC77SocNWqUbr75Zj3zzDPe2A033KA777xT+fn57TElAIAD2uULyA0NDdqyZYt++tOfxoxnZ2dr06ZNLfqj0aii0aj3d3Nzsz7//HP17t2bm34CgIPMTHV1dQqHw+f1m3df1y7BdejQITU1NcX8tLgkpaSkqLq6ukV/fn6+fv7zn1+q6QEALpHKyspz3pD6VO26OePUqyUzO+0V1Lx58xSJRLziczAAuDJ079497se0yxVXnz591KlTpxZXVzU1NS2uwiQpEAgoEAhcqukBAC6R1nzc0y5XXElJScrIyFBxcXHMeHFxsTIzM9tjSgAAR7Tb3eHnzJmj73//+xo5cqRGjx6t5557Tvv27dP06dPba0oAAAe0W3Ddf//9Onz4sJ588klVVVUpLS1Nb775pgYPHtxeUwIAOMDJu8PX1tYqGAy29zQAABcoEomoR48ecT2GexUCAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJxCcAEAnEJwAQCcQnABAJwSd3C98847uuOOOxQOh+Xz+fTaa6/FHDcz5eXlKRwOKzk5WWPHjtWOHTtieqLRqGbNmqU+ffqoa9eumjJlivbv339BLwQA0DHEHVxffPGFRowYoaVLl572+KJFi7R48WItXbpUpaWlCoVCmjhxourq6rye3NxcFRUVqbCwUBs3blR9fb1ycnLU1NTU+lcCAOgY7AJIsqKiIu/v5uZmC4VCVlBQ4I2dOHHCgsGgPfvss2ZmdvToUfP7/VZYWOj1HDhwwBISEmzt2rXn9byRSMQkURRFUY5XJBKJO3va9DOuvXv3qrq6WtnZ2d5YIBBQVlaWNm3aJEnasmWLGhsbY3rC4bDS0tK8nlNFo1HV1tbGFACgY2rT4KqurpYkpaSkxIynpKR4x6qrq5WUlKSePXuesedU+fn5CgaDXg0cOLAtpw0AcMhF2VXo8/li/jazFmOnOlvPvHnzFIlEvKqsrGyzuQIA3NKmwRUKhSSpxZVTTU2NdxUWCoXU0NCgI0eOnLHnVIFAQD169IgpAEDH1KbBlZqaqlAopOLiYm+soaFBJSUlyszMlCRlZGTI7/fH9FRVVamiosLrAQDgTBLjfUB9fb0++ugj7++9e/eqrKxMvXr10qBBg5Sbm6uFCxdq2LBhGjZsmBYuXKguXbrowQcflCQFg0E9/PDDmjt3rnr37q1evXrpscceU3p6uiZMmNB2rwwAcGWKdxvihg0bTrulcdq0aWb25Zb4BQsWWCgUskAgYGPGjLHy8vKYcxw/ftxmzpxpvXr1suTkZMvJybF9+/ad9xzYDk9RFHVlVGu2w/vMzOSY2tpaBYPB9p4GAOACRSKRuPctcK9CAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILgCAUwguAIBTCC4AgFMILuAKd91117X3FIA2ldjeEwDQtjp16qTJkyere/fukqQBAwZo//793vEtW7boo48+UnNzc3tNEbggPjOz9p5EvGpraxUMBtt7GsBlJSUlRUOGDNG4ceOUlJQkn8932r6TJ08qEolo1apVOnjwoE6cOHGJZwr8f5FIRD169IjrMQQX4LguXbooMzNTN910k3r27BnXY//3f/9Xr7/+OldfaDetCS7eKgQcFggEdP/992vw4MGtevzw4cMlSW+88YYaGxvbcmrARcPmDMBRwWBQU6dO1aBBg1p9Dp/Pp+HDh+uWW25pw5kBF1dcwZWfn69bbrlF3bt319VXX60777xTu3btiukxM+Xl5SkcDis5OVljx47Vjh07Ynqi0ahmzZqlPn36qGvXrpoyZUrMh8cAzs7v9+uuu+7SkCFDzvhZ1vny+XxKT0/3NnMAl7u4gqukpESPPPKINm/erOLiYp08eVLZ2dn64osvvJ5FixZp8eLFWrp0qUpLSxUKhTRx4kTV1dV5Pbm5uSoqKlJhYaE2btyo+vp65eTkqKmpqe1eGXAFu5C3B0+nX79+6tevX5udD7iYLmhzxmeffaarr75aJSUlGjNmjMxM4XBYubm5evzxxyV9eXWVkpKif/3Xf9U//dM/KRKJqG/fvvrP//xP3X///ZKkTz/9VAMHDtSbb76pSZMmtXieaDSqaDTq/V1bW6uBAwe2dtqA0wYNGqTvfve7bb5Bqa6uTr/85S/b9JzAubRmc8YFfcYViUQkSb169ZIk7d27V9XV1crOzvZ6AoGAsrKytGnTJklffoeksbExpiccDistLc3rOVV+fr6CwaBXhBY6stTU1Iuyq9bn8ykxkf1auPy1OrjMTHPmzNGtt96qtLQ0SVJ1dbWkL79P8nUpKSneserqaiUlJbXYtvv1nlPNmzdPkUjEq8rKytZOG8AZBAIB3Xzzze09DeCcWv1/r2bOnKnt27dr48aNLY6d+mGxmZ3zA+Sz9QQCAQUCgdZOFcB5OHHihD744IP2ngZwTq264po1a5ZWrVqlDRs2aMCAAd54KBSSpBZXTjU1Nd5VWCgUUkNDg44cOXLGHgAAziSu4DIzzZw5UytXrtRbb72l1NTUmOOpqakKhUIqLi72xhoaGlRSUqLMzExJUkZGhvx+f0xPVVWVKioqvB4AAM4krrcKH3nkEb388st6/fXX1b17d+/KKhgMKjk5WT6fT7m5uVq4cKGGDRumYcOGaeHCherSpYsefPBBr/fhhx/W3Llz1bt3b/Xq1UuPPfaY0tPTNWHChLZ/hQDOC7d9giviCq5nnnlGkjR27NiY8eXLl+vv//7vJUk/+clPdPz4cf3oRz/SkSNHNGrUKK1bty7my41LlixRYmKi7rvvPh0/flzjx4/XCy+8oE6dOl3YqwE6gEgkomg02uaf+7766qttej7gYuEmu4CDfvCDH8R8vtwWnnrqKX322Wdtek7gXLjJLuC4Tp06ed+LPJ1Dhw7JzPTGG29o2rRpSk5ObpPnfe+99/T555+3ybmAi42b7AKXiW9961uaM2eODh48eNqqqqrSD37wA6Wlpam6ulp//OMf2+R56+vr9de//pVbrsEZXHEBl4FRo0bppZde0jXXXHPGnk6dOum5557T9u3b9d5772n+/Pn6+OOPNXjw4FbfaLepqUmrVq3SRx991NqpA5ccn3EB7eyqq67Snj174voRSDPTihUrNGvWLE2ePLlVN9w9duyYVq5cSWihXV3yexUCuHAPPPCArrrqqrge4/P5dM899+j222/Xq6++qj179sT1+OPHj+u1114jtOAk3ioE2tnDDz98Qb+pdezYMRUVFalv37669957lZCQoKSkpJhzNjU16eTJk5KkDz74QH/+85914MCBC5470B4ILuAKUFdXp7q6Ov37v/+7JGny5Mkx353cuXOnKioqJH35RWMHPyEAPAQX0M6eeuop/fa3v437qqusrEzvvfdezNhXOwPfeOONNpsfcLkhuIB29vrrr5/XLyh85auf9vn2t7+tqqqqizw74PLD5gygnUWjUa1fv/6cfWam5cuX6+/+7u+Unp5OaKHD4ooLaGfHjh3TsmXLNG7cuBa/QNzc3Kzm5mb9z//8j55++mmtWbNGjY2N7TRT4PLA97iAy0BiYqK6dOmil156Keb7XM8//7yKiorU2NioEydOtOMMgYujNd/jIrgAAO2GLyADAK54BBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKQQXAMApBBcAwCkEFwDAKXEF1zPPPKPhw4erR48e6tGjh0aPHq01a9Z4x81MeXl5CofDSk5O1tixY7Vjx46Yc0SjUc2aNUt9+vRR165dNWXKFO3fv79tXg0A4MpncVi1apWtXr3adu3aZbt27bL58+eb3++3iooKMzMrKCiw7t2724oVK6y8vNzuv/9+69evn9XW1nrnmD59uvXv39+Ki4tt69atdtttt9mIESPs5MmT5z2PSCRikiiKoijHKxKJxBNDZmYWV3CdTs+ePW3ZsmXW3NxsoVDICgoKvGMnTpywYDBozz77rJmZHT161Px+vxUWFno9Bw4csISEBFu7du15PyfBRVEUdWVUa4Kr1Z9xNTU1qbCwUF988YVGjx6tvXv3qrq6WtnZ2V5PIBBQVlaWNm3aJEnasmWLGhsbY3rC4bDS0tK8ntOJRqOqra2NKQBAxxR3cJWXl6tbt24KBAKaPn26ioqKdOONN6q6ulqSlJKSEtOfkpLiHauurlZSUpJ69ux5xp7Tyc/PVzAY9GrgwIHxThsAcIWIO7iuu+46lZWVafPmzZoxY4amTZumnTt3esd9Pl9Mv5m1GDvVuXrmzZunSCTiVWVlZbzTBgBcIeIOrqSkJA0dOlQjR45Ufn6+RowYoV/96lcKhUKS1OLKqaamxrsKC4VCamho0JEjR87YczqBQMDbyfhVAQA6pgv+HpeZKRqNKjU1VaFQSMXFxd6xhoYGlZSUKDMzU5KUkZEhv98f01NVVaWKigqvBwCAs4pnJ8e8efPsnXfesb1799r27dtt/vz5lpCQYOvWrTOzL7fDB4NBW7lypZWXl9vUqVNPux1+wIABtn79etu6dauNGzeO7fAURVEdtC76dviHHnrIBg8ebElJSda3b18bP368F1pmZs3NzbZgwQILhUIWCARszJgxVl5eHnOO48eP28yZM61Xr16WnJxsOTk5tm/fvrgmTXBRFEVdGdWa4PKZmckxtbW1CgaD7T0NAMAFikQice9b4F6FAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnEFwAAKcQXAAApxBcAACnXFBw5efny+fzKTc31xszM+Xl5SkcDis5OVljx47Vjh07Yh4XjUY1a9Ys9enTR127dtWUKVO0f//+C5kKAKCDaHVwlZaW6rnnntPw4cNjxhctWqTFixdr6dKlKi0tVSgU0sSJE1VXV+f15ObmqqioSIWFhdq4caPq6+uVk5Ojpqam1r8SAEDHYK1QV1dnw4YNs+LiYsvKyrLZs2ebmVlzc7OFQiErKCjwek+cOGHBYNCeffZZMzM7evSo+f1+Kyws9HoOHDhgCQkJtnbt2vN6/kgkYpIoiqIoxysSicSdQa264nrkkUd0++23a8KECTHje/fuVXV1tbKzs72xQCCgrKwsbdq0SZK0ZcsWNTY2xvSEw2GlpaV5PaeKRqOqra2NKQBAx5QY7wMKCwu1detWlZaWtjhWXV0tSUpJSYkZT0lJ0SeffOL1JCUlqWfPni16vnr8qfLz8/Xzn/883qkCAK5AcV1xVVZWavbs2XrppZfUuXPnM/b5fL6Yv82sxdipztYzb948RSIRryorK+OZNgDgChJXcG3ZskU1NTXKyMhQYmKiEhMTVVJSol//+tdKTEz0rrROvXKqqanxjoVCITU0NOjIkSNn7DlVIBBQjx49YgoA0DHFFVzjx49XeXm5ysrKvBo5cqS+973vqaysTN/4xjcUCoVUXFzsPaahoUElJSXKzMyUJGVkZMjv98f0VFVVqaKiwusBAOCM4t7OcYqv7yo0MysoKLBgMGgrV6608vJymzp1qvXr189qa2u9nunTp9uAAQNs/fr1tnXrVhs3bpyNGDHCTp48eV7Pya5CiqKoK6Nas6sw7s0Z5/KTn/xEx48f149+9CMdOXJEo0aN0rp169S9e3evZ8mSJUpMTNR9992n48ePa/z48XrhhRfUqVOntp4OAOAK4zMza+9JxKu2tlbBYLC9pwEAuECRSCTufQvcqxAA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4BSCCwDgFIILAOAUggsA4JS4gisvL08+ny+mQqGQd9zMlJeXp3A4rOTkZI0dO1Y7duyIOUc0GtWsWbPUp08fde3aVVOmTNH+/fvb5tUAAK54cV9x3XTTTaqqqvKqvLzcO7Zo0SItXrxYS5cuVWlpqUKhkCZOnKi6ujqvJzc3V0VFRSosLNTGjRtVX1+vnJwcNTU1tc0rAgBc2SwOCxYssBEjRpz2WHNzs4VCISsoKPDGTpw4YcFg0J599lkzMzt69Kj5/X4rLCz0eg4cOGAJCQm2du3a855HJBIxSRRFUZTjFYlE4okhMzOL+4pr9+7dCofDSk1N1QMPPKA9e/ZIkvbu3avq6mplZ2d7vYFAQFlZWdq0aZMkacuWLWpsbIzpCYfDSktL83pOJxqNqra2NqYAAB1TXME1atQo/e53v9N///d/6/nnn1d1dbUyMzN1+PBhVVdXS5JSUlJiHpOSkuIdq66uVlJSknr27HnGntPJz89XMBj0auDAgfFMGwBwBYkruCZPnqzvfve7Sk9P14QJE7R69WpJ0osvvuj1+Hy+mMeYWYuxU52rZ968eYpEIl5VVlbGM20AwBXkgrbDd+3aVenp6dq9e7e3u/DUK6eamhrvKiwUCqmhoUFHjhw5Y8/pBAIB9ejRI6YAAB3TBQVXNBrVhx9+qH79+ik1NVWhUEjFxcXe8YaGBpWUlCgzM1OSlJGRIb/fH9NTVVWliooKrwcAgLOKZyfH3Llz7e2337Y9e/bY5s2bLScnx7p3724ff/yxmZkVFBRYMBi0lStXWnl5uU2dOtX69etntbW13jmmT59uAwYMsPXr19vWrVtt3LhxNmLECDt58uR5z4NdhRRFUVdGtWZXYVzBdf/991u/fv3M7/dbOBy2u+++23bs2OEdb25utgULFlgoFLJAIGBjxoyx8vLymHMcP37cZs6cab169bLk5GTLycmxffv2xTVpgouiKOrKqNYEl8/MTI6pra1VMBhs72kAAC5QJBKJe9+Ck/cqdDBrAQCn0Zr/njsZXF+/hRQAwF2t+e+5k28VNjc3a9euXbrxxhtVWVnJ9vjTqK2t1cCBA1mfM2B9zo71OTvW59zOtUZmprq6OoXDYSUkxHcNldhWk7yUEhIS1L9/f0nie13nwPqcHetzdqzP2bE+53a2NWrtXgUn3yoEAHRcBBcAwCnOBlcgENCCBQsUCATaeyqXJdbn7Fifs2N9zo71ObeLuUZObs4AAHRczl5xAQA6JoILAOAUggsA4BSCCwDgFIILAOAUJ4Pr6aefVmpqqjp37qyMjAy9++677T2lS+Kdd97RHXfcoXA4LJ/Pp9deey3muJkpLy9P4XBYycnJGjt2rHbs2BHTE41GNWvWLPXp00ddu3bVlClTtH///kv4Ki6e/Px83XLLLerevbuuvvpq3Xnnndq1a1dMT0deo2eeeUbDhw/37mQwevRorVmzxjvekdfmdPLz8+Xz+ZSbm+uNdeQ1ysvLk8/ni6lQKOQdv6RrE/cPobSzwsJC8/v99vzzz9vOnTtt9uzZ1rVrV/vkk0/ae2oX3ZtvvmlPPPGErVixwiRZUVFRzPGCggLr3r27rVixwsrLy73fTzv1hzz79+9vxcXFtnXrVrvtttvi/iHPy9WkSZNs+fLlVlFRYWVlZXb77bfboEGDrL6+3uvpyGu0atUqW716te3atct27dpl8+fPN7/fbxUVFWbWsdfmVB988IENGTLEhg8fbrNnz/bGO/IaLViwwG666Sarqqryqqamxjt+KdfGueD6m7/5G5s+fXrM2PXXX28//elP22lG7ePU4GpubrZQKGQFBQXe2IkTJywYDNqzzz5rZmZHjx41v99vhYWFXs+BAwcsISHB1q5de8nmfqnU1NSYJCspKTEz1uh0evbsacuWLWNtvqaurs6GDRtmxcXFlpWV5QVXR1+jBQsW2IgRI0577FKvjVNvFTY0NGjLli3Kzs6OGc/OztamTZvaaVaXh71796q6ujpmbQKBgLKysry12bJlixobG2N6wuGw0tLSrsj1i0QikqRevXpJYo2+rqmpSYWFhfriiy80evRo1uZrHnnkEd1+++2aMGFCzDhrJO3evVvhcFipqal64IEHtGfPHkmXfm2cujv8oUOH1NTUpJSUlJjxlJQUVVdXt9OsLg9fvf7Trc0nn3zi9SQlJalnz54teq609TMzzZkzR7feeqvS0tIksUaSVF5ertGjR+vEiRPq1q2bioqKdOONN3r/4ejIayNJhYWF2rp1q0pLS1sc6+j//IwaNUq/+93vdO211+rgwYP6l3/5F2VmZmrHjh2XfG2cCq6v+Hy+mL/NrMVYR9WatbkS12/mzJnavn27Nm7c2OJYR16j6667TmVlZTp69KhWrFihadOmqaSkxDvekdemsrJSs2fP1rp169S5c+cz9nXUNZo8ebL3v9PT0zV69Ghdc801evHFF/Wtb31L0qVbG6feKuzTp486derUIp1rampaJH1H89XunrOtTSgUUkNDg44cOXLGnivBrFmztGrVKm3YsEEDBgzwxlkjKSkpSUOHDtXIkSOVn5+vESNG6Fe/+hVroy/fyqqpqVFGRoYSExOVmJiokpIS/frXv1ZiYqL3GjvyGn1d165dlZ6ert27d1/yf36cCq6kpCRlZGSouLg4Zry4uFiZmZntNKvLQ2pqqkKhUMzaNDQ0qKSkxFubjIwM+f3+mJ6qqipVVFRcEetnZpo5c6ZWrlypt956S6mpqTHHWaOWzEzRaJS1kTR+/HiVl5errKzMq5EjR+p73/ueysrK9I1vfKPDr9HXRaNRffjhh+rXr9+l/+cnrq0cl4GvtsP/5je/sZ07d1pubq517drVPv744/ae2kVXV1dn27Zts23btpkkW7x4sW3bts37KkBBQYEFg0FbuXKllZeX29SpU0+7HXXAgAG2fv1627p1q40bN+6K2KprZjZjxgwLBoP29ttvx2zZPXbsmNfTkddo3rx59s4779jevXtt+/btNn/+fEtISLB169aZWcdemzP5+q5Cs469RnPnzrW3337b9uzZY5s3b7acnBzr3r2799/eS7k2zgWXmdlTTz1lgwcPtqSkJLv55pu97c5Xug0bNpikFjVt2jQz+3JL6oIFCywUClkgELAxY8ZYeXl5zDmOHz9uM2fOtF69ellycrLl5OTYvn372uHVtL3TrY0kW758udfTkdfooYce8v696du3r40fP94LLbOOvTZncmpwdeQ1+up7WX6/38LhsN199922Y8cO7/ilXBt+jwsA4BSnPuMCAIDgAgA4heACADiF4AIAOIXgAgA4heACADiF4AIAOIXgAgA4heACADiF4AIAOIXgAgA45f8AurwZSXqU1EgAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualize_scan(\n",
    "    image=np.flipud(np.transpose(ct_visual, (1, 0, 2))),\n",
    "    interval=5, \n",
    "    pause_time=0.1,\n",
    "    show_slices=None, \n",
    "    slice_dim=\"last\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1c9888c-17dc-40ec-b0ad-f4457f50d1a9",
   "metadata": {},
   "source": [
    "#### Example of all the segmented classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "96df2d11-8469-49e6-8836-5f5c7b68ee37",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAGxCAYAAAA6dVLUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAnCklEQVR4nO3df3BV9Z3/8dcNubnEEK4Jwdxcg5DWqGgCXYPSRCUoEIcxori7ijpdd3WniwVKFKdbaHfBzpZkmCluO7Sw1l2r42i6XYjrLD8krBpkWSwNZE2iZWkFgZgQxXATFJKQvPcPv56vl4QfF0LCJ3k+Zj4z5pzPvfnczyBPTnJy4zMzEwAAjogb6AUAABALwgUAcArhAgA4hXABAJxCuAAATiFcAACnEC4AgFMIFwDAKYQLAOAUwgX8P++8845mz56tq666SoFAQOnp6crPz9eiRYui5k2dOlVTp06NOubz+bRs2bL+W6ykV155RVOmTFF6eroCgYDC4bDuvvtubd++PWpeY2OjfvjDHyo/P19paWkaOXKk8vLy9Oyzz6qrq6vH8x47dkwlJSUKh8MaPny4vvGNb6i8vLy/XhZwVvEDvQDgUrB+/XrNmjVLU6dO1YoVK5SRkaHGxkb97ne/U3l5uX7yk5+c8fH//d//rczMzH5a7ReOHDmiW265RQsXLlRaWpoaGxu1cuVKTZkyRf/5n/+pwsJCSVJ1dbVefPFF/cVf/IX+7u/+Tn6/Xxs3btTjjz+uHTt26F/+5V+inve+++7Tzp07VVZWpmuuuUYvv/yyHnzwQXV3d+uhhx7q19cI9MbHexUCUmFhoRoaGvT73/9e8fHR/57r7u5WXNz//+LEl1dbb731Vj+u8NxEIhGNHj1ac+bM0YsvvihJamlp0YgRI+T3+6Pmzp8/Xz//+c914MABjRkzRpK0YcMG3XXXXV6svlRUVKT6+nodOHBAw4YN678XBPSCLxUC+uLqJS0trUe0JEVF63R6+1JhQ0ODvv3tb2vMmDFKSEhQOBzWn/3Zn+nw4cPenNbWVj311FPKyspSQkKCrrzySpWUlOizzz47r9eRnJys4cOHR72OlJSUHtGSpJtvvlmSdOjQIe9YRUWFRowYoT//8z+PmvtXf/VX+uijj/TOO++c17qAvsSXCgFJ+fn5eu655/Td735XDz/8sG688cZe/7I/Vw0NDbrpppvU2dmpJUuWaMKECTpy5Ihef/11tbS0KD09XZ9//rkKCwt16NAhb059fb3+/u//XrW1tdqyZYt8Pt9ZP1dXV5e6u7vV0NCg0tJSmZnmzZt31se98cYbio+P1zXXXOMdq6ur0/jx43sEfMKECd75goKCGHcD6GMGwD755BO79dZbTZJJMr/fbwUFBVZaWmptbW1RcwsLC62wsDDqmCRbunSp9/Gjjz5qfr/f3nvvvdN+ztLSUouLi7OdO3dGHf+3f/s3k2QbNmw4p7Vfe+213rozMjJs27ZtZ33M66+/bnFxcfbEE09EHc/OzrY777yzx/yPPvrIJNny5cvPaU3AxcSXCgFJo0aN0ttvv+3dlHDPPffof//3f7V48WLl5ubqk08+ien5Nm7cqNtvv13jx48/7Zz/+I//UE5Ojr7xjW/o5MmT3rjzzjvl8/nO+Xtoa9eu1TvvvKPf/OY3uv766zVz5swzPnbXrl26//779c1vflOlpaU9zp/pKu9crgCBi40vFQJfMWnSJE2aNEmS1NnZqb/927/VM888oxUrVmjFihXn/Dwff/zxWe8yPHz4sP7whz+c9kuS5xrLG264QdIX37O699579Sd/8idauHCh/ud//qfH3N27d2vGjBnKzs7Whg0bFAgEos6PGjVKR44c6fG4Tz/9VJKUmpp6TmsCLibCBZyG3+/X0qVL9cwzz6iuri6mx44ePTrqpofepKWlKTExscft6F89H6v4+HjdeOON+td//dce53bv3q3p06dr7Nix2rx5s4LBYI85ubm5euWVV3Ty5Mmo73PV1tZKknJycmJeE9DX+FIhoC9+SLc377//viQpHA7H9HwzZ87Um2++qT179px2TnFxsf74xz9q1KhR3pXeV8e4ceNi+pySdOLECe3YsUNXX3111PGamhpNnz5dmZmZqqysVEpKSq+Pnz17to4dO6a1a9dGHX/hhRcUDoc1efLkmNcE9DWuuABJd955pzIzM3X33XfruuuuU3d3t2pqavSTn/xEI0aM0MKFC2N6vh/96EfauHGjpkyZoiVLlig3N1dHjx7Vpk2b9OSTT+q6665TSUmJ1q5dqylTpuiJJ57QhAkT1N3drQMHDmjz5s1atGjRGUNRUFCgWbNmafz48QoGg9q/f79Wr16tP/7xj6qoqPDm7dmzR9OnT5ck/fjHP9bevXu1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nG3atKnf1t5fmpubTZJVVVWZGXvUm5SUFHvuuefYm69oa2uz7Oxsq6ystMLCQi9cQ32Pli5dahMnTuz1XH/vjVNfKuzo6FB1dbWKioqijhcVFWn79u0DtKpLw759+9TU1BS1N4FAQIWFhd7eVFdXq7OzM2pOOBxWTk7OoNy/SCQiSUpNTZXEHn1VV1eXysvL9dlnnyk/P5+9+Yp58+bprrvu0vTp06OOs0fS3r17FQ6HlZWVpTlz5uiDDz6Q1P9749S7w3/yySfq6upSenp61PH09HQ1NTUN0KouDV++/t725sMPP/TmJCQkKCUlpcecwbZ/ZqYnn3xSt956q3JyciSxR5JUW1ur/Px8nThxQiNGjFBFRYWuv/567y+Oobw3klReXq5du3Zp586dPc4N9T8/kydP1osvvqhrrrlGhw8f1j/8wz+ooKBA9fX1/b43ToXrSz6fL+pjM+txbKg6n70ZjPs3f/58vfvuu9q2bVuPc0N5j6699lrV1NTo6NGjWrt2rR555BFVVVV554fy3hw8eFALFy7U5s2bNXz48NPOG6p7NHPmTO+/c3NzlZ+fr69//et64YUX9M1vflNS/+2NU18qTEtL07Bhw3rUubm5uUfph5ov7+45096EQiF1dHSopaXltHMGgwULFui1117Tm2++qczMTO84eyQlJCTo6quv1qRJk1RaWqqJEyfqpz/9KXujL76U1dzcrLy8PMXHxys+Pl5VVVX62c9+pvj4eO81DuU9+qqkpCTl5uZq7969/f7nx6lwJSQkKC8vT5WVlVHHKysrVVBQMECrujRkZWUpFApF7U1HR4eqqqq8vcnLy5Pf74+a09jYqLq6ukGxf2am+fPna926dXrjjTeUlZUVdZ496snM1N7ezt5ImjZtmmpra1VTU+ONSZMm6eGHH1ZNTY2+9rWvDfk9+qr29na9//77ysjI6P8/PzHdynEJ+PJ2+H/+53+29957z0pKSiwpKcn2798/0Eu76Nra2mz37t22e/duk2QrV6603bt3ez8KUFZWZsFg0NatW2e1tbX24IMP9no7amZmpm3ZssV27dpld9xxx6C4VdfM7PHHH7dgMGhvvfVW1C27n3/+uTdnKO/R4sWLbevWrbZv3z579913bcmSJRYXF2ebN282s6G9N6fz1bsKzYb2Hi1atMjeeust++CDD2zHjh1WXFxsycnJ3t+9/bk3zoXLzOznP/+5jR071hISEuzGG2/0bnce7N58802T1GM88sgjZvbFLalLly61UChkgUDApkyZYrW1tVHPcfz4cZs/f76lpqZaYmKiFRcX24EDBwbg1fS93vZGkj3//PPenKG8R48++qj3/83o0aNt2rRpXrTMhvbenM6p4RrKe/Tlz2X5/X4Lh8N23333WX19vXe+P/eG38cFAHCKU9/jAgCAcAEAnEK4AABOIVwAAKcQLgCAUwgXAMAphAsA4BTCBQBwCuECADiFcAEAnEK4AABO+T/baXkmZ4IoJAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from utils.plot_utils import visualize_scan\n",
    "\n",
    "visualize_scan(\n",
    "    image=np.flipud(np.transpose(ct_visual, (1, 0, 2))),\n",
    "    mask=np.flipud(np.transpose(seg_all_visual, (1, 0, 2))), \n",
    "    interval=5, \n",
    "    pause_time=0.1,\n",
    "    show_slices=None, \n",
    "    slice_dim=\"last\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6be39849-06fa-46c5-a150-3e0849013a1f",
   "metadata": {},
   "source": [
    "#### Segmentation example of only the classes which we are interested on (\"aorta\" \"right iliac artery\" \"left iliac artery\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "5bfec775-df83-4029-acdd-e525dcb776c8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAGxCAYAAAA6dVLUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAnCklEQVR4nO3df3BV9Z3/8dcNubnEEK4Jwdxcg5DWqGgCXYPSRCUoEIcxori7ijpdd3WniwVKFKdbaHfBzpZkmCluO7Sw1l2r42i6XYjrLD8krBpkWSwNZE2iZWkFgZgQxXATFJKQvPcPv56vl4QfF0LCJ3k+Zj4z5pzPvfnczyBPTnJy4zMzEwAAjogb6AUAABALwgUAcArhAgA4hXABAJxCuAAATiFcAACnEC4AgFMIFwDAKYQLAOAUwgX8P++8845mz56tq666SoFAQOnp6crPz9eiRYui5k2dOlVTp06NOubz+bRs2bL+W6ykV155RVOmTFF6eroCgYDC4bDuvvtubd++PWpeY2OjfvjDHyo/P19paWkaOXKk8vLy9Oyzz6qrq6vH8x47dkwlJSUKh8MaPny4vvGNb6i8vLy/XhZwVvEDvQDgUrB+/XrNmjVLU6dO1YoVK5SRkaHGxkb97ne/U3l5uX7yk5+c8fH//d//rczMzH5a7ReOHDmiW265RQsXLlRaWpoaGxu1cuVKTZkyRf/5n/+pwsJCSVJ1dbVefPFF/cVf/IX+7u/+Tn6/Xxs3btTjjz+uHTt26F/+5V+inve+++7Tzp07VVZWpmuuuUYvv/yyHnzwQXV3d+uhhx7q19cI9MbHexUCUmFhoRoaGvT73/9e8fHR/57r7u5WXNz//+LEl1dbb731Vj+u8NxEIhGNHj1ac+bM0YsvvihJamlp0YgRI+T3+6Pmzp8/Xz//+c914MABjRkzRpK0YcMG3XXXXV6svlRUVKT6+nodOHBAw4YN678XBPSCLxUC+uLqJS0trUe0JEVF63R6+1JhQ0ODvv3tb2vMmDFKSEhQOBzWn/3Zn+nw4cPenNbWVj311FPKyspSQkKCrrzySpWUlOizzz47r9eRnJys4cOHR72OlJSUHtGSpJtvvlmSdOjQIe9YRUWFRowYoT//8z+PmvtXf/VX+uijj/TOO++c17qAvsSXCgFJ+fn5eu655/Td735XDz/8sG688cZe/7I/Vw0NDbrpppvU2dmpJUuWaMKECTpy5Ihef/11tbS0KD09XZ9//rkKCwt16NAhb059fb3+/u//XrW1tdqyZYt8Pt9ZP1dXV5e6u7vV0NCg0tJSmZnmzZt31se98cYbio+P1zXXXOMdq6ur0/jx43sEfMKECd75goKCGHcD6GMGwD755BO79dZbTZJJMr/fbwUFBVZaWmptbW1RcwsLC62wsDDqmCRbunSp9/Gjjz5qfr/f3nvvvdN+ztLSUouLi7OdO3dGHf+3f/s3k2QbNmw4p7Vfe+213rozMjJs27ZtZ33M66+/bnFxcfbEE09EHc/OzrY777yzx/yPPvrIJNny5cvPaU3AxcSXCgFJo0aN0ttvv+3dlHDPPffof//3f7V48WLl5ubqk08+ien5Nm7cqNtvv13jx48/7Zz/+I//UE5Ojr7xjW/o5MmT3rjzzjvl8/nO+Xtoa9eu1TvvvKPf/OY3uv766zVz5swzPnbXrl26//779c1vflOlpaU9zp/pKu9crgCBi40vFQJfMWnSJE2aNEmS1NnZqb/927/VM888oxUrVmjFihXn/Dwff/zxWe8yPHz4sP7whz+c9kuS5xrLG264QdIX37O699579Sd/8idauHCh/ud//qfH3N27d2vGjBnKzs7Whg0bFAgEos6PGjVKR44c6fG4Tz/9VJKUmpp6TmsCLibCBZyG3+/X0qVL9cwzz6iuri6mx44ePTrqpofepKWlKTExscft6F89H6v4+HjdeOON+td//dce53bv3q3p06dr7Nix2rx5s4LBYI85ubm5euWVV3Ty5Mmo73PV1tZKknJycmJeE9DX+FIhoC9+SLc377//viQpHA7H9HwzZ87Um2++qT179px2TnFxsf74xz9q1KhR3pXeV8e4ceNi+pySdOLECe3YsUNXX3111PGamhpNnz5dmZmZqqysVEpKSq+Pnz17to4dO6a1a9dGHX/hhRcUDoc1efLkmNcE9DWuuABJd955pzIzM3X33XfruuuuU3d3t2pqavSTn/xEI0aM0MKFC2N6vh/96EfauHGjpkyZoiVLlig3N1dHjx7Vpk2b9OSTT+q6665TSUmJ1q5dqylTpuiJJ57QhAkT1N3drQMHDmjz5s1atGjRGUNRUFCgWbNmafz48QoGg9q/f79Wr16tP/7xj6qoqPDm7dmzR9OnT5ck/fjHP9bevXu1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nG3atKnf1t5fmpubTZJVVVWZGXvUm5SUFHvuuefYm69oa2uz7Oxsq6ystMLCQi9cQ32Pli5dahMnTuz1XH/vjVNfKuzo6FB1dbWKioqijhcVFWn79u0DtKpLw759+9TU1BS1N4FAQIWFhd7eVFdXq7OzM2pOOBxWTk7OoNy/SCQiSUpNTZXEHn1VV1eXysvL9dlnnyk/P5+9+Yp58+bprrvu0vTp06OOs0fS3r17FQ6HlZWVpTlz5uiDDz6Q1P9749S7w3/yySfq6upSenp61PH09HQ1NTUN0KouDV++/t725sMPP/TmJCQkKCUlpcecwbZ/ZqYnn3xSt956q3JyciSxR5JUW1ur/Px8nThxQiNGjFBFRYWuv/567y+Oobw3klReXq5du3Zp586dPc4N9T8/kydP1osvvqhrrrlGhw8f1j/8wz+ooKBA9fX1/b43ToXrSz6fL+pjM+txbKg6n70ZjPs3f/58vfvuu9q2bVuPc0N5j6699lrV1NTo6NGjWrt2rR555BFVVVV554fy3hw8eFALFy7U5s2bNXz48NPOG6p7NHPmTO+/c3NzlZ+fr69//et64YUX9M1vflNS/+2NU18qTEtL07Bhw3rUubm5uUfph5ov7+45096EQiF1dHSopaXltHMGgwULFui1117Tm2++qczMTO84eyQlJCTo6quv1qRJk1RaWqqJEyfqpz/9KXujL76U1dzcrLy8PMXHxys+Pl5VVVX62c9+pvj4eO81DuU9+qqkpCTl5uZq7969/f7nx6lwJSQkKC8vT5WVlVHHKysrVVBQMECrujRkZWUpFApF7U1HR4eqqqq8vcnLy5Pf74+a09jYqLq6ukGxf2am+fPna926dXrjjTeUlZUVdZ496snM1N7ezt5ImjZtmmpra1VTU+ONSZMm6eGHH1ZNTY2+9rWvDfk9+qr29na9//77ysjI6P8/PzHdynEJ+PJ2+H/+53+29957z0pKSiwpKcn2798/0Eu76Nra2mz37t22e/duk2QrV6603bt3ez8KUFZWZsFg0NatW2e1tbX24IMP9no7amZmpm3ZssV27dpld9xxx6C4VdfM7PHHH7dgMGhvvfVW1C27n3/+uTdnKO/R4sWLbevWrbZv3z579913bcmSJRYXF2ebN282s6G9N6fz1bsKzYb2Hi1atMjeeust++CDD2zHjh1WXFxsycnJ3t+9/bk3zoXLzOznP/+5jR071hISEuzGG2/0bnce7N58802T1GM88sgjZvbFLalLly61UChkgUDApkyZYrW1tVHPcfz4cZs/f76lpqZaYmKiFRcX24EDBwbg1fS93vZGkj3//PPenKG8R48++qj3/83o0aNt2rRpXrTMhvbenM6p4RrKe/Tlz2X5/X4Lh8N23333WX19vXe+P/eG38cFAHCKU9/jAgCAcAEAnEK4AABOIVwAAKcQLgCAUwgXAMAphAsA4BTCBQBwCuECADiFcAEAnEK4AABO+T/baXkmZ4IoJAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from utils.plot_utils import visualize_scan\n",
    "\n",
    "visualize_scan(\n",
    "    image=np.flipud(np.transpose(ct_visual,(1,0,2))), \n",
    "    mask=np.flipud(np.transpose(seg_proc_visual,(1,0,2))), \n",
    "    interval=5, \n",
    "    pause_time=0.1, \n",
    "    show_slices=None, \n",
    "    slice_dim=\"last\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05fd55a9-23ac-4a36-8133-ac11b61dbd7a",
   "metadata": {},
   "source": [
    "## 🚀 Next: Steps 5-8: Vessel analysis and reconstruction app.\n",
    "\n",
    "In this notebook we prepared the data, and made it ready for ingestion within the `vessel geometry analysis and reconstruction` app.\n",
    "\n",
    "**Please refer to the [README.md](README.md) for more details.**\n",
    "\n",
    "\n",
    "### Step-by-Step Instructions\n",
    "\n",
    "At this point all necessary data is available in `outputs` folder\n",
    "\n",
    "#### 1. Required Files\n",
    "\n",
    "Clone the app from the github repository [Vessel geometry analysis and 3D reconstruction repository](https://github.com/ai-solution-eng/hosted-trials/tree/kaiser/kaiser)\n",
    "\n",
    "The app expects files to be organized as follows\n",
    "\n",
    "> requirements.py\n",
    "> app.py\n",
    "\n",
    "> analysis_pipeline.py\n",
    "\n",
    "> outputs\n",
    ">> nifti_data \n",
    ">>> testing\n",
    ">>>> FLARETs_0050_0000.nii.gz (The Nifti file with the scan, used to extract acquisition paramenters.)\n",
    "\n",
    ">> pointclouds\n",
    ">>> testing\n",
    ">>>> FLARETs_0050_0000.npz (The npz file with 3D point cloud with real-world coordinates and colors.)\n",
    "\n",
    ">> processed_segmentations\n",
    ">>> testing\n",
    ">>>> FLARETs_0050_0000.npz  (The npz file with 3D NumPy array of the final vessel segmentation.)\n",
    "\n",
    "> .... etc..\n",
    "\n",
    "and so forth for every patients in the dataset.\n",
    "\n",
    "\n",
    "**Action:**\n",
    "- Ensure the folder is structured as expected.\n",
    "\n",
    "#### 2. Set Up a Python Virtual Environment\n",
    "\n",
    "Using a virtual environment is crucial to avoid conflicts with other projects. We recommend using Python 3.12.\n",
    "\n",
    "**Action:**\n",
    "Open your terminal (Command Prompt or PowerShell on Windows, Terminal on macOS/Linux), navigate to your new folder, and run the following commands:\n",
    "\n",
    "```bash\n",
    "# Navigate to your project folder\n",
    "cd path/to/your/Vessel_Analysis\n",
    "\n",
    "# Create a virtual environment named 'env'\n",
    "# On Windows:\n",
    "python -m venv env\n",
    "\n",
    "# On macOS / Linux:\n",
    "python3.12 -m venv env\n",
    "\n",
    "# Activate the virtual environment\n",
    "# On Windows:\n",
    ".\\env\\Scripts\\activate\n",
    "\n",
    "# On macOS / Linux:\n",
    "source env/bin/activate\n",
    "```\n",
    "Your terminal prompt should now be prefixed with `(env)`, indicating the environment is active.\n",
    "\n",
    "#### 3. Install Dependencies\n",
    "\n",
    "Install the required Python libraries using the `requirements.txt` file.\n",
    "\n",
    "**Action:**\n",
    "With your virtual environment active, run the following command:\n",
    "```bash\n",
    "pip install -r requirements.txt\n",
    "```\n",
    "\n",
    "#### 3-b On windows \n",
    "\n",
    "May be necessary to install [Microsoft Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170)\n",
    "\n",
    "#### 4. Run the Analysis Script\n",
    "\n",
    "**Action:**\n",
    "\n",
    "```bash\n",
    "streamlite run app.py\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
