Skip to content

Commit

Permalink
Clarified input data structure
Browse files Browse the repository at this point in the history
  • Loading branch information
jcohenadad committed Dec 21, 2023
1 parent caf4a30 commit 18063ff
Showing 1 changed file with 47 additions and 122 deletions.
169 changes: 47 additions & 122 deletions Analysis.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,30 @@
"source": [
"# Analysis code for the paper \"B1+ shimming in the cervical spinal cord at 7T\"\n",
"\n",
"## Assumed input data:\n",
"This code is written with the assumption that, for every subject, the data is organized as:\n",
"_Subject_\n",
"__RF shim directory (Seven directories per subject)\n",
" GRE scan\n",
" TFL_B1map scan\n",
"__MPRAGE directory\n",
"\n",
"## Analysis procedure:\n",
"## Data\n",
"\n",
"The data can be download at: XXX (TODO: upload on openneuro)\n",
"\n",
"The structure of the input dataset is as follows:\n",
"~~~\n",
"├── SubA\n",
"│   ├── GRE_B1\n",
"│   │   ├── CVred\n",
"│   │   ├── Noshim\n",
"│   │   ├── PatSpec\n",
"│   │   ├── PhaseOnly\n",
"│   │   ├── SAReff\n",
"│   │   ├── Target\n",
"│   │   └── VolSpec\n",
"│   └── MPRAGE\n",
"├── SubB\n",
"├── SubC\n",
"├── SubD\n",
"└── SubE\n",
"~~~\n",
"\n",
"\n",
"## Analysis\n",
"\n",
"For each subject:\n",
"-->For each RF shim directory\n",
Expand All @@ -34,7 +49,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": null,
"id": "4f78c5ea",
"metadata": {},
"outputs": [],
Expand All @@ -57,7 +72,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": null,
"id": "6f4227bf",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -209,34 +224,10 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": null,
"id": "d7e57cb5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Looking in indexes: https://pypi.org/simple, https://download.pytorch.org/whl/cpu\n",
"Requirement already satisfied: dynamic_network_architectures==0.2 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from -r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 1)) (0.2)\n",
"Requirement already satisfied: joblib==1.3.0 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from -r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 2)) (1.3.0)\n",
"Requirement already satisfied: loguru==0.7.0 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from -r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 3)) (0.7.0)\n",
"Requirement already satisfied: monai[nibabel]==1.3.0 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from -r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 4)) (1.3.0)\n",
"Requirement already satisfied: scipy==1.11.2 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from -r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 5)) (1.11.2)\n",
"Requirement already satisfied: numpy==1.24.4 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from -r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 6)) (1.24.4)\n",
"Requirement already satisfied: torch==2.0.0 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from -r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 7)) (2.0.0)\n",
"Requirement already satisfied: nibabel in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from monai[nibabel]==1.3.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 4)) (5.1.0)\n",
"Requirement already satisfied: jinja2 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from torch==2.0.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 7)) (3.1.2)\n",
"Requirement already satisfied: networkx in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from torch==2.0.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 7)) (3.2.1)\n",
"Requirement already satisfied: sympy in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from torch==2.0.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 7)) (1.12)\n",
"Requirement already satisfied: filelock in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from torch==2.0.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 7)) (3.13.1)\n",
"Requirement already satisfied: typing-extensions in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from torch==2.0.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 7)) (4.9.0)\n",
"Requirement already satisfied: MarkupSafe>=2.0 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from jinja2->torch==2.0.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 7)) (2.1.2)\n",
"Requirement already satisfied: packaging>=17 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from nibabel->monai[nibabel]==1.3.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 4)) (23.0)\n",
"Requirement already satisfied: mpmath>=0.19 in /Users/danielpapp/miniconda3/lib/python3.10/site-packages (from sympy->torch==2.0.0->-r /Users/danielpapp/contrast-agnostic-softseg-spinalcord-2.0/monai/requirements_inference_cpu.txt (line 7)) (1.3.0)\n"
]
}
],
"outputs": [],
"source": [
"## Setup for contrast agnostic soft segmentation\n",
"## REQUIRES THE USE OF THE VENV_MONAI SET UP BELOW\n",
Expand All @@ -257,7 +248,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": null,
"id": "1b58dace",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -298,7 +289,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": null,
"id": "a5313e75",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -336,7 +327,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": null,
"id": "de904d9f",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -397,7 +388,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": null,
"id": "11ba2142",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -445,7 +436,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": null,
"id": "96576aaf",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -487,24 +478,10 @@
},
{
"cell_type": "code",
"execution_count": 37,
"execution_count": null,
"id": "834d1a6d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n"
]
}
],
"outputs": [],
"source": [
"# Running MONAI GRE segmentation subject by subject to allow for manual correction\n",
"subjectpath='/Users/danielpapp/DATA/RF_shimming_project_monai/SubE'\n",
Expand Down Expand Up @@ -544,38 +521,10 @@
},
{
"cell_type": "code",
"execution_count": 60,
"execution_count": null,
"id": "848240f1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The QA directory already exists! Are you rerunnig the script?\n",
"The Processing directory already exists! Are you rerunnig the script?\n",
"0\n",
"The QA directory already exists! Are you rerunnig the script?\n",
"The Processing directory already exists! Are you rerunnig the script?\n",
"1\n",
"The QA directory already exists! Are you rerunnig the script?\n",
"The Processing directory already exists! Are you rerunnig the script?\n",
"2\n",
"The QA directory already exists! Are you rerunnig the script?\n",
"The Processing directory already exists! Are you rerunnig the script?\n",
"3\n",
"The QA directory already exists! Are you rerunnig the script?\n",
"The Processing directory already exists! Are you rerunnig the script?\n",
"4\n",
"The QA directory already exists! Are you rerunnig the script?\n",
"The Processing directory already exists! Are you rerunnig the script?\n",
"5\n",
"The QA directory already exists! Are you rerunnig the script?\n",
"The Processing directory already exists! Are you rerunnig the script?\n",
"6\n"
]
}
],
"outputs": [],
"source": [
"# Running MONAI GRE signal extraction subject by subject \n",
"subjectpath='/Users/danielpapp/DATA/RF_shimming_project_monai/SubC'\n",
Expand All @@ -588,7 +537,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": null,
"id": "126dc23a",
"metadata": {},
"outputs": [],
Expand All @@ -600,34 +549,10 @@
},
{
"cell_type": "code",
"execution_count": 77,
"execution_count": null,
"id": "3d2fad64",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The QA directory already exists! Are you rerunnig the script?\n",
"The Processing directory already exists! Are you rerunnig the script?\n"
]
},
{
"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[77], line 8\u001b[0m\n\u001b[1;32m 6\u001b[0m shimcasenames\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnoshim\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpatspec\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mvolspec\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mphaseonly\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcvred\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtarget\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msareff\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m shimcase \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mlen\u001b[39m(shimcasenames)):\n\u001b[0;32m----> 8\u001b[0m \u001b[43mB1_map_process_monai\u001b[49m\u001b[43m(\u001b[49m\u001b[43msubjectpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43mshimcasenames\u001b[49m\u001b[43m[\u001b[49m\u001b[43mshimcase\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(shimcase)\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m#B1_map_process(subjectpath,shimcasenames[shimcase])\u001b[39;00m\n",
"Cell \u001b[0;32mIn[61], line 38\u001b[0m, in \u001b[0;36mB1_map_process_monai\u001b[0;34m(subjectpath, indirname)\u001b[0m\n\u001b[1;32m 36\u001b[0m VoltageAtSocket\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39maround(VoltageAtSocket, decimals\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 37\u001b[0m run_subprocess(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msct_maths -i \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mTFL_FAfile\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m -div 10 -o \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mTFL_FAfile_nTpV\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 38\u001b[0m \u001b[43mrun_subprocess\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43msct_maths -i \u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mTFL_FAfile_nTpV\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m -div \u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mVoltageAtSocket\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m -o \u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mTFL_FAfile_nTpV\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 39\u001b[0m run_subprocess(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msct_maths -i \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mTFL_FAfile_nTpV\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m -mul 130.492 -o \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mTFL_FAfile_nTpV\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 41\u001b[0m \u001b[38;5;66;03m#Then we coreigster the B1map anatomical to the undistcorrected GRE\u001b[39;00m\n",
"Cell \u001b[0;32mIn[65], line 50\u001b[0m, in \u001b[0;36mrun_subprocess\u001b[0;34m(cmd)\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Wrapper for ``subprocess.run()`` that enables to input ``cmd`` as a full string (easier for debugging).\u001b[39;00m\n\u001b[1;32m 46\u001b[0m \u001b[38;5;124;03mArgs:\u001b[39;00m\n\u001b[1;32m 47\u001b[0m \u001b[38;5;124;03m cmd (string): full command to be run on the command line\u001b[39;00m\n\u001b[1;32m 48\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 50\u001b[0m \u001b[43msubprocess\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 51\u001b[0m \u001b[43m \u001b[49m\u001b[43mcmd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplit\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m \u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 52\u001b[0m \u001b[43m \u001b[49m\u001b[43mtext\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 53\u001b[0m \u001b[43m \u001b[49m\u001b[43mcheck\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 54\u001b[0m \u001b[43m \u001b[49m\u001b[43mstdout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msubprocess\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mPIPE\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 55\u001b[0m \u001b[43m \u001b[49m\u001b[43mstderr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msubprocess\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mSTDOUT\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 56\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mCalledProcessError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 58\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mReturn code: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00merr\u001b[38;5;241m.\u001b[39mreturncode\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n",
"File \u001b[0;32m~/miniconda3/lib/python3.10/subprocess.py:505\u001b[0m, in \u001b[0;36mrun\u001b[0;34m(input, capture_output, timeout, check, *popenargs, **kwargs)\u001b[0m\n\u001b[1;32m 503\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m Popen(\u001b[38;5;241m*\u001b[39mpopenargs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;28;01mas\u001b[39;00m process:\n\u001b[1;32m 504\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 505\u001b[0m stdout, stderr \u001b[38;5;241m=\u001b[39m \u001b[43mprocess\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcommunicate\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 506\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m TimeoutExpired \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 507\u001b[0m process\u001b[38;5;241m.\u001b[39mkill()\n",
"File \u001b[0;32m~/miniconda3/lib/python3.10/subprocess.py:1141\u001b[0m, in \u001b[0;36mPopen.communicate\u001b[0;34m(self, input, timeout)\u001b[0m\n\u001b[1;32m 1139\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_stdin_write(\u001b[38;5;28minput\u001b[39m)\n\u001b[1;32m 1140\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstdout:\n\u001b[0;32m-> 1141\u001b[0m stdout \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstdout\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1142\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstdout\u001b[38;5;241m.\u001b[39mclose()\n\u001b[1;32m 1143\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr:\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"outputs": [],
"source": [
"# THIS TOTALLY FAILED ON SUB A NOSHIM\n",
"# TODO CHECK WHAT THE HELL IS GOING ON And processd\n",
Expand All @@ -653,7 +578,7 @@
},
{
"cell_type": "code",
"execution_count": 25,
"execution_count": null,
"id": "075f6698",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -686,7 +611,7 @@
},
{
"cell_type": "code",
"execution_count": 24,
"execution_count": null,
"id": "2b29b8ad",
"metadata": {},
"outputs": [],
Expand Down Expand Up @@ -748,7 +673,7 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": null,
"id": "46ec1218",
"metadata": {},
"outputs": [],
Expand All @@ -762,7 +687,7 @@
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": null,
"id": "9514153f",
"metadata": {},
"outputs": [],
Expand All @@ -777,9 +702,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "venv_monai",
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "venv_monai"
"name": "python3"
},
"language_info": {
"codemirror_mode": {
Expand All @@ -791,7 +716,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.9"
"version": "3.10.8"
}
},
"nbformat": 4,
Expand Down

0 comments on commit 18063ff

Please sign in to comment.