{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d09c917d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import Math, display\n",
    "import numpy as np\n",
    "import sympy as sp\n",
    "from scipy import constants as const\n",
    "from tqdm import tqdm\n",
    "\n",
    "#add relative path to backend\n",
    "import sys\n",
    "sys.path.append('../../clean_diag/backend')\n",
    "\n",
    "import trap_units as si\n",
    "from twod_trap import PancakeTrap\n",
    "\n",
    "from spilling_helpers import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5b021bc7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "333.017 Hz\n",
      "2.01106353355856 uK\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\frac{\\omega_{t r}}{\\omega_{t ax}} \\approx 9.02$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "initial_power = 91 * si.uW \n",
    "initial_grad = 0 * si.G/si.cm\n",
    "\n",
    "trap: PancakeTrap = PancakeTrap(\n",
    "    power=0,  # Set pancake laser power to 0, no 2D trap\n",
    "    grad_z= initial_grad,\n",
    "    grad_r=0,\n",
    "    power_tweezer= initial_power,\n",
    "    waist_tweezer= 2.16/2 * si.um,\n",
    "\n",
    "    m= 161 * const.value(\"atomic mass constant\"),\n",
    "    mu_b= 9.93 * const.value(\"Bohr magneton\" ),\n",
    "    a=180*(4 * np.pi * const.epsilon_0 * const.value(\"Bohr radius\")**3)/(2 * const.epsilon_0 * const.c),\n",
    "\n",
    "    wvl = 532 * si.nm,\n",
    ")\n",
    "axial_width = trap.get_tweezer_rayleigh()\n",
    "zr = float(trap.subs(trap.get_tweezer_rayleigh()))\n",
    "\n",
    "x, y, z = trap.x, trap.y, trap.z\n",
    "\n",
    "print(f\"{float(trap.subs(trap.get_omega_ax_tweezer()))/2/np.pi:.3f} Hz\")\n",
    "print(f\"{trap.subs(trap.a *2*trap.power_tweezer/(np.pi*trap.waist_tweezer**2)/ const.k) /si.uK} uK\")\n",
    "\n",
    "aspect_ratio = trap.get_omega_r_tweezer() / trap.get_omega_ax_tweezer()\n",
    "_aspect_ratio_latex = sp.latex(trap.omega_r_tweezer / trap.omega_ax_tweezer)\n",
    "display(Math(f\"{_aspect_ratio_latex} \\\\approx {trap.subs(aspect_ratio).evalf():.2f}\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b3485046",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6.887882840502134"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "zr/si.um"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "5ebf9e01",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.91666666666669"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "[encoded data, 22120 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "powers, atom_number = sweep_power_old(trap, 0*si.G/si.cm, 0.15*si.uW, 100, -0.*zr, 1.1*zr,max_spill_steps=250, max_atoms=10)\n",
    "calculate_stepsize(powers,atom_number,plot=True)/si.uW"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "293d79ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "91.12170219141973"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "float(powers[0])/si.uW"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "275775bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "111.37170219141973"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "float(powers[-1])/si.uW"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "165109df",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 34324 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(powers/powers[0], atom_number, linewidth=2, color=\"tab:orange\")\n",
    "plt.axhline(0, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(1, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(2, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(3, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(4, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(5, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(6, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(7, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(8, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(9, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(10, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "\n",
    "#plt.xlim(1,1.23)\n",
    "#plt.ylim(0,10.5)\n",
    "\n",
    "plt.xlabel(r\"tweezer power in units of $P_0(B'=0) = 91 \\text{µW}$\")\n",
    "plt.ylabel(\"mean atom number\")\n",
    "#plt.title(\"Controll over particle number with Dysprosium\")\n",
    "\n",
    "plt.savefig(\"stepplot_0G.png\", dpi = 300)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "fa99a1c3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.025777777777777785"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "[encoded data, 20516 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "gradients, atom_number = sweep_gradient_old(trap, 91*si.uW, 0.004*si.G/si.cm, 50, -0.0*zr, 1.1*zr,max_spill_steps=200)\n",
    "calculate_stepsize(gradients,atom_number,plot=True)/si.G*si.cm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "bcbea262",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 36516 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(gradients/si.G*si.cm, atom_number, linewidth=2)\n",
    "plt.axhline(0, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(1, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(2, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(3, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(4, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(5, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(6, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(7, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(8, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(9, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "plt.axhline(10, color=\"grey\", linestyle=\"dashed\",alpha=0.5)\n",
    "\n",
    "#plt.xlim(1,1.23)\n",
    "#plt.ylim(0,10.5)\n",
    "\n",
    "plt.xlabel(r\"magnetic gradient [G/cm]\")\n",
    "plt.ylabel(\"mean atom number\")\n",
    "#plt.title(\"Controll over particle number with Dysprosium\")\n",
    "\n",
    "plt.savefig(\"stepplot_grad.png\", dpi = 300)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6cd9e561",
   "metadata": {},
   "source": [
    "# Sensibilities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "6c6c27c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "data_1064 = np.load(\"data/sweeps_1064.npz\")\n",
    "data_532 = np.load(\"data/sweeps_532.npz\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "15b94596",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 56148 characters]",
      "text/plain": [
       "<Figure size 1200x500 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(12, 5), sharey=True)\n",
    "\n",
    "# Left plot\n",
    "ax2 = ax1.twiny()\n",
    "\n",
    "ax1.set_yscale(\"log\")\n",
    "ax1.plot(data_1064[\"gradient\"]/si.G*si.cm, data_1064[\"gradient_rel\"], \"o\", label=\"1064nm: gradient\")\n",
    "ax1.plot(data_1064[\"gradient\"]/si.G*si.cm, data_1064[\"power_rel\"], \"o\", label=\"1064nm: power\")\n",
    "\n",
    "#ax1.set_title(r\"relative precision (1064nm, a=184, $\\eta$=9)\")\n",
    "ax1.set_xlabel(r\"gradient $B'$ [G/cm]\")\n",
    "ax1.set_ylabel(r\"$\\delta B'_{10\\%}/B'$ [G/cm]\")\n",
    "\n",
    "new_tick_locations = data_1064[\"power\"][::3]/si.uW\n",
    "ax2.set_xlim(ax1.get_xlim())\n",
    "ax2.set_xticks(new_tick_locations)\n",
    "ax2.set_xlabel(r\"$P_0(B')$ [uW]\")\n",
    "\n",
    "ax1.legend()\n",
    "ax1.grid()\n",
    "\n",
    "# Right plot (duplicate or variant)\n",
    "ax4 = ax3.twiny()\n",
    "\n",
    "ax3.set_yscale(\"log\")\n",
    "ax3.plot(data_532[\"gradient\"]/si.G*si.cm, data_532[\"gradient_rel\"], \"o\", label=\"532nm: gradient\")\n",
    "ax3.plot(data_532[\"gradient\"]/si.G*si.cm, data_532[\"power_rel\"], \"o\", label=\"532nm: power\")\n",
    "\n",
    "#ax3.set_title(r\"relative precision (second condition)\")\n",
    "ax3.set_xlabel(r\"gradient $B'$ [G/cm]\")\n",
    "\n",
    "new_tick_locations = data_532[\"power\"][::3]/si.uW\n",
    "ax4.set_xlim(ax3.get_xlim())\n",
    "ax4.set_xticks(new_tick_locations)\n",
    "ax4.set_xlabel(r\"$P_0(B')$ [uW]\")\n",
    "\n",
    "ax3.legend()\n",
    "ax3.grid()\n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.savefig(\"rel_err.png\", dpi=300)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "424ae8c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 53360 characters]",
      "text/plain": [
       "<Figure size 1500x500 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(15, 5), sharey=True)\n",
    "\n",
    "# Left plot\n",
    "ax2 = ax1.twiny()\n",
    "\n",
    "ax1.set_yscale(\"linear\")\n",
    "ax1.plot(data_1064[\"gradient\"]/si.G*si.cm, data_1064[\"gradient_step\"]/si.G*si.cm,\"o\", label=\"1064nm: gradient\")\n",
    "# ax1.plot(data[\"gradient\"]/si.G*si.cm, data[\"power_step\"]/si.uW, \"o\", label=\"power\")\n",
    "\n",
    "#ax1.set_title(\"absolute precision (1064nm, a=184, η=9)\")\n",
    "ax1.set_xlabel(r\"gradient $B'$ [G/cm]\")\n",
    "ax1.set_ylabel(r\"$\\delta B'_{10\\%}$ [G/cm]\")\n",
    "\n",
    "new_tick_locations = data_1064[\"power\"][::3]/si.uW\n",
    "ax2.set_xlim(ax1.get_xlim())\n",
    "ax2.set_xticks(new_tick_locations)\n",
    "ax2.set_xlabel(r\"$P_0(B')$ [uW]\")\n",
    "\n",
    "ax1.legend()\n",
    "ax1.grid()\n",
    "\n",
    "# Right plot (could use different or same data)\n",
    "ax4 = ax3.twiny()\n",
    "\n",
    "ax3.set_yscale(\"linear\")\n",
    "ax3.plot(data_532[\"gradient\"]/si.G*si.cm, data_532[\"gradient_step\"]/si.G*si.cm,\"o\", label=\"532nm: gradient\")\n",
    "# ax3.plot(data[\"gradient\"]/si.G*si.cm, data[\"power_step\"]/si.uW, \"o\", label=\"power\")\n",
    "\n",
    "#ax3.set_title(\"absolute precision (532nm, a=180, η=9)\")\n",
    "ax3.set_xlabel(r\"gradient $B'$ [G/cm]\")\n",
    "\n",
    "new_tick_locations = data_532[\"power\"][::3]/si.uW\n",
    "ax4.set_xlim(ax3.get_xlim())\n",
    "ax4.set_xticks(new_tick_locations)\n",
    "ax4.set_xlabel(r\"$P_0(B')$ [uW]\")\n",
    "\n",
    "ax3.legend()\n",
    "ax3.grid()\n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.savefig(\"abs_gradient.png\", dpi=300)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "ef01140f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 46148 characters]",
      "text/plain": [
       "<Figure size 1500x500 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(15, 5), sharey=True)\n",
    "\n",
    "# Left plot\n",
    "ax2 = ax1.twiny()\n",
    "\n",
    "ax1.set_yscale(\"linear\")\n",
    "ax1.plot(data_1064[\"gradient\"]/si.G*si.cm, data_1064[\"power_step\"]/si.uW,\"o\", color=\"tab:orange\", label=\"1064nm: power\")\n",
    "# ax1.plot(data[\"gradient\"]/si.G*si.cm, data[\"power_step\"]/si.uW, \"o\", label=\"power\")\n",
    "\n",
    "#ax1.set_title(\"absolute precision (1064nm, a=184, η=9)\")\n",
    "ax1.set_xlabel(r\"gradient $B'$ [G/cm]\")\n",
    "ax1.set_ylabel(r\"$\\delta P_{10\\%}$ [µW]\")\n",
    "\n",
    "new_tick_locations = data_1064[\"power\"][::3]/si.uW\n",
    "ax2.set_xlim(ax1.get_xlim())\n",
    "ax2.set_xticks(new_tick_locations)\n",
    "ax2.set_xlabel(r\"$P_0(B')$ [µW]\")\n",
    "\n",
    "ax1.legend()\n",
    "ax1.grid()\n",
    "\n",
    "# Right plot (could use different or same data)\n",
    "ax4 = ax3.twiny()\n",
    "\n",
    "ax3.set_yscale(\"linear\")\n",
    "ax3.plot(data_532[\"gradient\"]/si.G*si.cm, data_532[\"power_step\"]/si.uW,\"o\", color=\"tab:orange\", label=\"532nm: power\")\n",
    "# ax3.plot(data[\"gradient\"]/si.G*si.cm, data[\"power_step\"]/si.uW, \"o\", label=\"power\")\n",
    "\n",
    "#ax3.set_title(\"absolute precision (532nm, a=180, η=9)\")\n",
    "ax3.set_xlabel(r\"gradient $B'$ [G/cm]\")\n",
    "\n",
    "new_tick_locations = data_532[\"power\"][::3]/si.uW\n",
    "ax4.set_xlim(ax3.get_xlim())\n",
    "ax4.set_xticks(new_tick_locations)\n",
    "ax4.set_xlabel(r\"$P_0(B')$ [µW]\")\n",
    "\n",
    "ax3.legend()\n",
    "ax3.grid()\n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.savefig(\"abs_power.png\", dpi=300)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "b4f014b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 94092 characters]",
      "text/plain": [
       "<Figure size 1500x1000 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig, axs = plt.subplots(2, 2, figsize=(15, 10), sharex=True, sharey='row')\n",
    "\n",
    "# -------------------------------\n",
    "# Top-left (1064 nm: δB' precision)\n",
    "ax1     = axs[0, 0]\n",
    "ax1_top = ax1.twiny()\n",
    "\n",
    "ax1.set_yscale(\"linear\")\n",
    "ax1.plot(data_1064[\"gradient\"]/si.G*si.cm,\n",
    "         data_1064[\"gradient_step\"]/si.G*si.cm,\n",
    "         \"o\", label=\"1064 nm: gradient\")\n",
    "\n",
    "ax1.set_ylabel(r\"$\\delta B'_{10\\%}$ [G/cm]\")\n",
    "#ax1.set_title(\"Absolute δB' precision (1064 nm)\")\n",
    "ax1.grid()\n",
    "ax1.legend(loc=\"best\")\n",
    "\n",
    "ticks_1064 = data_1064[\"power\"][::3]/si.uW\n",
    "ax1_top.set_xlim(ax1.get_xlim())\n",
    "ax1_top.set_xticks(ticks_1064)\n",
    "ax1_top.set_xlabel(r\"$P_0(B')$ [µW]\")\n",
    "\n",
    "\n",
    "# -------------------------------\n",
    "# Top-right (532 nm: δB' precision)\n",
    "ax2     = axs[0, 1]\n",
    "ax2_top = ax2.twiny()\n",
    "\n",
    "ax2.set_yscale(\"linear\")\n",
    "ax2.plot(data_532[\"gradient\"]/si.G*si.cm,\n",
    "         data_532[\"gradient_step\"]/si.G*si.cm,\n",
    "         \"o\", label=\"532 nm: gradient\")\n",
    "\n",
    "#ax2.set_title(\"Absolute δB' precision (532 nm)\")\n",
    "ax2.grid()\n",
    "ax2.legend(loc=\"best\")\n",
    "\n",
    "ticks_532 = data_532[\"power\"][::3]/si.uW\n",
    "ax2_top.set_xlim(ax2.get_xlim())\n",
    "ax2_top.set_xticks(ticks_532)\n",
    "ax2_top.set_xlabel(r\"$P_0(B')$ [µW]\")\n",
    "\n",
    "\n",
    "# -------------------------------\n",
    "# Bottom-left (1064 nm: δP precision)\n",
    "ax3     = axs[1, 0]\n",
    "ax3_top = ax3.twiny()\n",
    "\n",
    "ax3.set_yscale(\"linear\")\n",
    "ax3.plot(data_1064[\"gradient\"]/si.G*si.cm,\n",
    "         data_1064[\"power_step\"]/si.uW,\n",
    "         \"o\", color=\"tab:orange\", label=\"1064 nm: power\")\n",
    "\n",
    "ax3.set_ylabel(r\"$\\delta P_{10\\%}$ [µW]\")\n",
    "ax3.set_xlabel(r\"gradient $B'$ [G/cm]\")\n",
    "#ax3.set_title(\"Absolute δP precision (1064 nm)\")\n",
    "ax3.grid()\n",
    "ax3.legend(loc=\"best\")\n",
    "\n",
    "ax3_top.set_xlim(ax3.get_xlim())\n",
    "ax3_top.set_xticks(ticks_1064)\n",
    "ax3_top.set_xlabel(r\"$P_0(B')$ [µW]\")\n",
    "\n",
    "\n",
    "# -------------------------------\n",
    "# Bottom-right (532 nm: δP precision)\n",
    "ax4     = axs[1, 1]\n",
    "ax4_top = ax4.twiny()\n",
    "\n",
    "ax4.set_yscale(\"linear\")\n",
    "ax4.plot(data_532[\"gradient\"]/si.G*si.cm,\n",
    "         data_532[\"power_step\"]/si.uW,\n",
    "         \"o\", color=\"tab:orange\", label=\"532 nm: power\")\n",
    "\n",
    "ax4.set_xlabel(r\"gradient $B'$ [G/cm]\")\n",
    "#ax4.set_title(\"Absolute δP precision (532 nm)\")\n",
    "ax4.grid()\n",
    "ax4.legend(loc=\"best\")\n",
    "\n",
    "ax4_top.set_xlim(ax4.get_xlim())\n",
    "ax4_top.set_xticks(ticks_532)\n",
    "ax4_top.set_xlabel(r\"$P_0(B')$ [µW]\")\n",
    "\n",
    "\n",
    "# -------------------------------\n",
    "plt.tight_layout()\n",
    "plt.savefig(\"abs_precision_2x2_shared.png\", dpi=300)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cb31e0af",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "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.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
