{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "aac19a2e",
   "metadata": {},
   "source": [
    "# **Spin** calculation\n",
    "\n",
    "IDEA:\n",
    "- take in consideration only the ball for each frame\n",
    "- draw a lot of points on the ball\n",
    "- take the motion of these points between consecutive frames (optical flow)\n",
    "- from this motion we extract the direction of the rotation and so the axis of rotation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "id": "b21740cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import numpy as np\n",
    "import cv2\n",
    "import pandas as pd\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "id": "747961da",
   "metadata": {},
   "outputs": [],
   "source": [
    "VIDEO_NUMBER = \"3\"\n",
    "PROJECT_ROOT = Path().resolve().parent.parent\n",
    "INPUT_VIDEO_PATH = str(\n",
    "    PROJECT_ROOT\n",
    "    / \"data\"\n",
    "    / f\"recording_{VIDEO_NUMBER}\"\n",
    "    / f\"Recording_{VIDEO_NUMBER}.mp4\"\n",
    ")\n",
    "INPUT_CSV_PATH = str(\n",
    "    PROJECT_ROOT\n",
    "    / \"notebook\"\n",
    "    / \"ball_detection\"\n",
    "    / \"intermediate_data\"\n",
    "    / f\"Circle_positions_cleaned_{VIDEO_NUMBER}.csv\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "id": "5bab471c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Video opened: True, FPS: 59.94005994005994, Total Frames: 227.0\n"
     ]
    }
   ],
   "source": [
    "# Load video\n",
    "cap = cv2.VideoCapture(INPUT_VIDEO_PATH)\n",
    "if not cap.isOpened():\n",
    "    print(\"Error: Could not open video.\")\n",
    "    exit\n",
    "\n",
    "# Check video properties\n",
    "print(\n",
    "    f\"Video opened: {cap.isOpened()}, FPS: {cap.get(cv2.CAP_PROP_FPS)}, Total Frames: {cap.get(cv2.CAP_PROP_FRAME_COUNT)}\"\n",
    ")\n",
    "\n",
    "# Load CSV\n",
    "df = pd.read_csv(INPUT_CSV_PATH)\n",
    "\n",
    "# Check if the CSV file is empty\n",
    "if df.empty:\n",
    "    print(\"Error: The CSV file is empty.\")\n",
    "    exit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0be26a6",
   "metadata": {},
   "source": [
    "Selecting a frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "id": "cd59c302",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Frame 100 successfully read.\n"
     ]
    }
   ],
   "source": [
    "# Set the video to the desired frame\n",
    "frame_number = 100\n",
    "cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)\n",
    "\n",
    "# Read the frame\n",
    "ret, frame1 = cap.read()\n",
    "\n",
    "# Check if the frame was successfully read\n",
    "if ret:\n",
    "    print(f\"Frame {frame_number} successfully read.\")\n",
    "else:\n",
    "    print(f\"Failed to read frame {frame_number}.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "id": "4de0d158",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Extract ball center and radius from ball_df\n",
    "ball_center = (int(df.iloc[frame_number][\"x\"]), int(df.iloc[frame_number][\"y\"]))\n",
    "ball_radius = int(df.iloc[frame_number][\"radius\"])\n",
    "\n",
    "# Define the region of interest (ROI) around the ball\n",
    "offset = 2\n",
    "x_min = max(ball_center[0] - ball_radius, 0) - offset\n",
    "x_max = min(ball_center[0] + ball_radius, frame1.shape[1]) + offset\n",
    "y_min = max(ball_center[1] - ball_radius, 0) - offset\n",
    "y_max = min(ball_center[1] + ball_radius, frame1.shape[0]) + offset\n",
    "\n",
    "# Crop ROI and convert to grayscale\n",
    "roi1 = frame1[y_min:y_max, x_min:x_max]\n",
    "gray1 = cv2.cvtColor(roi1, cv2.COLOR_BGR2GRAY)\n",
    "\n",
    "# Compute center of ball in ROI coords\n",
    "center_roi = (ball_center[0] - x_min, ball_center[1] - y_min)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "id": "eff9eb92",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generate 100 random points inside the circular ROI\n",
    "h, w = gray1.shape\n",
    "points = []\n",
    "while len(points) < 100:\n",
    "    x = np.random.randint(0, w)\n",
    "    y = np.random.randint(0, h)\n",
    "    # distance to center of ROI\n",
    "    if (x - center_roi[0]) ** 2 + (y - center_roi[1]) ** 2 <= ball_radius**2:\n",
    "        points.append([x, y])\n",
    "p0 = np.array(points, dtype=np.float32).reshape(-1, 1, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "id": "82f29cb5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Read next frame and prepare\n",
    "ret, frame2 = cap.read()\n",
    "if not ret:\n",
    "    raise IOError(f\"Failed to read frame {frame_number + 1}.\")\n",
    "roi2 = frame2[y_min:y_max, x_min:x_max]\n",
    "gray2 = cv2.cvtColor(roi2, cv2.COLOR_BGR2GRAY)\n",
    "\n",
    "# Calculate optical flow using Lucas-Kanade\n",
    "p1, status, err = cv2.calcOpticalFlowPyrLK(\n",
    "    gray1,\n",
    "    gray2,\n",
    "    p0,\n",
    "    None,\n",
    "    winSize=(15, 15),\n",
    "    maxLevel=2,\n",
    "    criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03),\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "id": "ec2c6c71",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAGrCAYAAADn6WHYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb5dJREFUeJztvXm4V2W5/3+v9Zn2vJllFgREBJEUQUDUjrOZQ6mpWaJWmKXlN8dzOg5ZktlwzHIqwzk7DkfNEtOOJSpWToDiBIIMKqAMmz19hrWe3x/+2HkPsJ79cSGec96v6/K6fBb3WutZ47M/z3u97ztwzjkCAAAAPiLh9u4AAACA/x1gQAEAAJAKGFAAAACkAgYUAAAAqYABBQAAQCpgQAEAAJAKGFAAAACkAgYUAAAAqYABBQAAQCr8nxlQbr75ZgqCgJYtW7ZNtn/ppZdSEASpbGvZsmUUBAHdfPPNqWzv/yLWOUzzGn2ctLa2Ur9+/eiOO+7Y3l0Bn3DmzJlDDQ0NtHbt2u2y/+02oLz88st08skn06BBg6hQKNDAgQPpi1/8Ir388ssfabtXXHEF3X///el0chswY8YMCoLA/G/OnDnbu3vbBXlOstksDRkyhE444QRatGjRdu9PoVCgnXfemS6++GLq7Ow012lra6PLL7+cxo8fT3V1ddTc3EzTp0+nW2+9lazsRkEQ0De/+U2v/lx99dXU2NhIJ5xwQteyzYOj9d/1119f3YF/wnjnnXfowgsvpE9/+tPU2NhIQRDQX/7yly3GP/3007TPPvtQXV0d9e/fn84++2xqbW1VccVikS644AIaOHAg1dbW0uTJk+nRRx9Nrd+/+93v6OSTT6ZRo0ZREAS0//77bzHWty9/+tOf6PTTT6dx48ZRJpOhYcOGmds79NBDaeTIkTRr1qyUjqZ7ZLfHTu+77z468cQTqVevXnT66afT8OHDadmyZXTTTTfRPffcQ3fddRcdc8wxVW37iiuuoGOPPZaOPvpotvxLX/oSnXDCCVQoFFI4go9GoVCgX//612r57rvvvh1688ngw+ekUqnQkiVL6Prrr6c5c+bQokWLaODAgdutPxs3bqQHHniALr/8clqyZIn6pbB69Wo64IAD6JVXXqETTjiBvvnNb1JnZyfde++9dMopp9Af//hHuuOOOyiTyXS7H+Vyma6++mo655xzzPWvu+46amhoYMsmT57c7f18EnnttdfoyiuvpFGjRtFuu+1G8+bN22Lsiy++SAcccACNGTOGfvrTn9LKlSvpxz/+Mb3xxhv08MMPs9gZM2bQPffcQ9/+9rdp1KhRdPPNN9Phhx9Ojz/+OO2zzz4fud/XXXcdPffcc7TXXnvR+++/v9VY377ceeed9Lvf/Y722GOPxGdh5syZdO6559Jll11GjY2NH/l4uoX7mFm8eLGrq6tzu+yyi1uzZg37t7Vr17pddtnF1dfXuyVLllS1/fr6enfKKaek0NPucckllzif03nKKae4+vr6rcYsXbrUEZGbPXt2Sr37ZLOlc/LQQw85InI33nhjt7dpncOPco3iOHZ77723C4LAvfvuu+zfDjnkEBeGoXvggQfUts4991xHRO6HP/whW05E7hvf+EZiX+677z5HRG7x4sVs+eZjWbt2beI2NtPa2uod+0mgpaXFvf/++8455+6++25HRO7xxx83Yw877DA3YMAAt3Hjxq5lv/rVrxwRuUceeaRr2d/+9jdHRO6qq67qWtbR0eFGjBjhpkyZkkq/ly9f7qIocs45N3bsWLfffvuZcd3py6pVq1ypVHLOOfeZz3zG7bjjjlvc/+rVq10mk3E33XTTRzuQKvjYp7yuuuoqam9vpxtvvJH69u3L/q1Pnz50ww03UFtbG/3oRz/qWr755/2rr75Kxx9/PDU1NVHv3r3pW9/6FpuCCIKA2tra6JZbbun6+T9jxgwi2rKG8vDDD9N+++1HjY2N1NTURHvttRfdeeedXf8+d+5cOu6442jo0KFUKBRoyJAhdM4551BHR0f6JyeB//7v/6bp06dTfX099ejRg4466ih65ZVXuv59wYIFFAQBPfjgg13LnnvuOQqCgPbYYw+2rcMOO8zrL9mkfRL98/osXryYZsyYQT169KDm5mY69dRTqb29verj7d+/PxERZbP//CG9bt06Ovfcc2m33XajhoYGampqosMOO4zmz59f9X58CIKA9tlnH3LO0Ztvvtm1/JlnnqFHHnmEZsyYQUceeaRab9asWTRq1Ci68sorq7pn7r//fho2bBiNGDGiW+ttvt//+te/0plnnkn9+vWjwYMHExHRW2+9RWeeeSaNHj2aamtrqXfv3nTcccepZ2PzNp588kk6++yzqW/fvtSjRw+aOXMmlUol2rBhA335y1+mnj17Us+ePen8889X03txHNN//Md/0NixY6mmpoZ22GEHmjlzJq1fvz7xGBobG6lXr16JcS0tLfToo4/SySefTE1NTV3Lv/zlL1NDQwP953/+Z9eye+65hzKZDH3ta1/rWlZTU0Onn346zZs3j1asWJG4vySGDBlCYZj8au1OXwYOHEi5XM5r//369aPx48fTAw880P3Of0Q+9imv3//+9zRs2DCaPn26+e/77rsvDRs2jP7whz+ofzv++ONp2LBhNGvWLHrmmWfo5z//Oa1fv55uvfVWIiK67bbb6Ctf+QpNmjSp6yJt7UG8+eab6bTTTqOxY8fSRRddRD169KAXXniB5syZQyeddBIREd19993U3t5OX//616l3797097//na655hpauXIl3X333VWfh/fee4+1c7kcNTc3bzH+scceo8MOO4x22mknuvTSS6mjo4OuueYamjZtGj3//PM0bNgwGjduHPXo0YOeeOKJrpfb3LlzKQxDmj9/PrW0tFBTUxPFcUxPP/00u5Gr3eeHOf7442n48OE0a9Ysev755+nXv/419evXj6688spunZMoiujNN9+kCy64gHr37k1HHHFEV8ybb75J999/Px133HE0fPhwWr16Nd1www203377bfOpsc0v3J49e3Yt+/3vf09EH7y8LLLZLJ100kl02WWX0VNPPUUHHnhgt/b59NNPqz8GPsy6detYO5PJsP6deeaZ1LdvX7r44oupra2NiIj+8Y9/0NNPP00nnHACDR48mJYtW0bXXXcd7b///rRo0SKqq6tj2zzrrLOof//+dNlll9EzzzxDN954I/Xo0YOefvppGjp0KF1xxRX0xz/+ka666ioaN24cOxczZ86km2++mU499VQ6++yzaenSpfSLX/yCXnjhBXrqqae8X5JbY+HChVSpVGjixIlseT6fpwkTJtALL7zQteyFF16gnXfemQ08RESTJk0iog+mzoYMGZK4z6VLl9I3v/lNuvXWW6l3795V9Tutvljsueee20dL/jh/Dm3YsMERkTvqqKO2GnfkkUc6InItLS3OuX/+vD/yyCNZ3JlnnumIyM2fP79r2ZamvGbPnu2IyC1durSrL42NjW7y5Mmuo6ODxcZx3PX/7e3taluzZs1yQRC4t956q2tZd6ZTiEj99+GfxdZ0zYQJE1y/fv26pgCcc27+/PkuDEP35S9/uWvZZz7zGTdp0qSu9uc+9zn3uc99zmUyGffwww8755x7/vnnHRGZUzQfxnefm4/9tNNOY+sfc8wxrnfv3lWfk0GDBrnnnnuOxXZ2dnZNJ2xm6dKlrlAouO9973tsmTyH3Z3yWrt2rVu7dq1bvHix+/GPf+yCIHDjxo1j98fRRx/tiMitX79+i9vbPG3185//vGsZeUx5lctlFwSB+853vqP+bfOxyP82T4Vsvt/32WcfV6lU2LrWPT1v3jxHRO7WW2/tWrZ5G4cccgg75ilTprggCNwZZ5zRtaxSqbjBgwez+3ju3LmOiNwdd9zB9jVnzhxz+dbY2pTX5n974okn1L8dd9xxrn///l3tsWPHun/5l39RcS+//LIjInf99dd79WfRokWuX79+bo899tjqtd/alFe1fUma8nLOuSuuuMIRkVu9evVW49LmY53y2rRpExFRolC0+d9bWlrY8m984xusfdZZZxER0R//+Mdu9+XRRx+lTZs20YUXXkg1NTXs3z78aWltbW3X/7e1tdF7771HU6dOJecc+8unO9TU1NCjjz7K/vvJT36yxfh33nmHXnzxRZoxYwabAhg/fjwddNBB7PinT59Ozz//fNdfo08++SQdfvjhNGHCBJo7dy4RffCrZfMUThr73MwZZ5zB2tOnT6f3339fXUeLD5+TRx55hG644QZqaGigww8/nF5//fWuuEKh0DWdEEURvf/++9TQ0ECjR4+m559/PnE/vrS1tVHfvn2pb9++NHLkSDr33HNp2rRp9MADD7D7w+ee3tL9nMS6devIOcd+cUjuvfdedh/JDwa++tWvKjH/w/d0uVym999/n0aOHEk9evQwz+Hpp5/Ojnny5MnknKPTTz+9a1kmk6GJEyey6cC7776bmpub6aCDDqL33nuv678999yTGhoa6PHHH/c/GVth81Si9cFNTU0Nm2rs6OjYYtyHt1WpVKizs3OL/w0fPpweeughevPNN+mQQw7p9rXtTl+qYfM9I2dCtjUf65TX5gdr80O4Jbb0kI4aNYq1R4wYQWEYVuUtWbJkCRERjRs3bqtxy5cvp4svvpgefPBBNe+7cePGbu+X6IOHrztTH2+99RYREY0ePVr925gxY+iRRx6htrY2qq+vp+nTp1OlUqF58+bRkCFDaM2aNTR9+nR6+eWX2YCy6667bnV+ujv73MzQoUNZ3Oabev369epnvcQ6J4cffjiNGjWKLrroIrr33nuJ6IM5+auvvpquvfZaWrp0KUVR1BVf7dSDRU1NTdd01sqVK+lHP/oRrVmzhr2Mifg93aNHD3Nbvn9IbQm3laKq++67L/Xp02eL/z58+HC1rKOjg2bNmkWzZ8+mVatWse1b97S8rpunZuV0THNzM3tG3njjDdq4cSP169fP7NuaNWu22O/usPmaFItF9W+dnZ3smtXW1m4x7sPbuvDCC7f6R96H+fvf/07/+q//Sr/4xS+63W+fvlTD5mv6cfuuPtYBpbm5mQYMGEALFizYatyCBQto0KBBiS+hbX2yoiiigw46iNatW0cXXHAB7bLLLlRfX0+rVq2iGTNmUBzH23T/1TBx4kSqqamhJ554goYOHUr9+vWjnXfemaZPn07XXnstFYtFmjt3btWfZW+NLX0Wu7UX4tYYPHgwjR49mp544omuZVdccQX9+7//O5122ml0+eWXU69evSgMQ/r2t7+d6vWQA9whhxxCu+yyC82cOZN99DBmzBi6//77acGCBbTvvvua29p8v++6667d6kOvXr0oCAIvAXtLWC+ls846i2bPnk3f/va3acqUKdTc3ExBENAJJ5xgnsMtXVdr+YevdRzHWzVkyo9yqmXAgAFE9MGvask777zDdLUBAwbQqlWrzDgi6oo94YQTEv/Y7OzspIsuuogqlUqX5trdfvv0pRo23zNb+2NjW/Cxi/JHHHEE/epXv6Inn3zSnHKZO3cuLVu2jGbOnKn+7Y033mB/cS1evJjiOGbisO8gs1msf+mll2jkyJFmzMKFC+n111+nW265hQmNaZqgfNhxxx2J6IPv8iWvvvoq9enTp+uXQj6fp0mTJtHcuXNp6NChXR8/TJ8+nYrFIt1xxx20evXqLb78qtnntqRSqTBz2j333EOf/vSn6aabbmJxGzZs2KYPz4ABA+icc87pEqb33ntvIvrgfp41axbdeuut5jmNoojuvPNO6tmzJ02bNq1b+8xmszRixAhaunRpKsewmXvuuYdOOeUU9hd4Z2cnbdiwIdX9jBgxgh577DGaNm3aR/prO4lx48ZRNpulZ599lo4//viu5aVSiV588UW2bMKECfT44493faCymb/97W9d/070wR9mUuT/MKVSiY4++mgqlUr08MMP09SpU7vdb9++VMPSpUupT58+qQ3avnzsnw2fd955VFtbSzNnzlSmn3Xr1tEZZ5xBdXV1dN5556l1f/nLX7L2NddcQ0QffAK7mfr6eq8H4+CDD6bGxkaaNWuWcj9v/itr819gH/6ryzlHV199deL202TAgAE0YcIEuuWWW9ixvfTSS/SnP/2JDj/8cBY/ffp0+tvf/kaPP/5414DSp08fGjNmTNcXV1v6yq7afW4LXn/9dXrttdeY4TOTyahfPHfffbf5l17anHXWWVRXV0c//OEPu5ZNnTqVDjzwQJo9ezY99NBDap1/+7d/o9dff53OP//8ql6qU6ZMoWefffYj9VtincNrrrmGTR+mwfHHH09RFNHll1+u/q1SqaQ2gDU3N9OBBx5It99+O5tOv+2226i1tZWOO+64rmXHHnssRVFEN954Y9eyYrFIs2fPpsmTJ3t/VTV37lz661//Sg8++GDiH2dbIq2+WDz33HM0ZcqUqtevlo/9F8qoUaPolltuoS9+8Yu02267Kaf8e++9R7/97W/Nz32XLl1KRx55JB166KE0b948uv322+mkk05iL5w999yTHnvsMfrpT39KAwcOpOHDh5t+i6amJvrZz35GX/nKV2ivvfaik046iXr27Enz58+n9vZ2uuWWW2iXXXahESNG0LnnnkurVq2ipqYmuvfeez/SFES1XHXVVXTYYYfRlClT6PTTT+/6hLe5uZkuvfRSFjt9+nT6wQ9+QCtWrGADx7777ks33HADDRs2rMuTkNY+PyqVSoVuv/12IvpgqmTZsmV0/fXXUxzHdMkll3TFHXHEEfS9732PTj31VJo6dSotXLiQ7rjjDtppp51S7Y9F79696dRTT6Vrr72WXnnlFRozZgwREd166610wAEH0FFHHUUnnXRS16/B++67j/7yl7/QF77wBfMPJB+OOuoouu222+j111+nnXfeOZXjOOKII+i2226j5uZm2nXXXWnevHn02GOPpapBERHtt99+NHPmTJo1axa9+OKLdPDBB1Mul6M33niD7r77brr66qvp2GOP3eo2vv/97xMRdaVkuu222+jJJ58kIqLvfve7XXE/+MEPaOrUqbTffvvR1772NVq5ciX95Cc/oYMPPpgOPfTQrrjJkyfTcccdRxdddBGtWbOGRo4cSbfcckvX+8eXAw44gJYsWdLllfowTzzxRNc07dq1a6mtra3rOPbd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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create mask for drawing\n",
    "mask = np.zeros_like(roi2)\n",
    "\n",
    "# Draw start/end points and arrows for tracked points\n",
    "for i, (new_pt, old_pt) in enumerate(zip(p1, p0)):\n",
    "    if status[i][0] == 1:\n",
    "        a, b = new_pt.ravel()\n",
    "        c, d = old_pt.ravel()\n",
    "        # starting point in red\n",
    "        cv2.circle(mask, (int(c), int(d)), 1, (0, 0, 255), -1)\n",
    "        # ending point in blue\n",
    "        cv2.circle(mask, (int(a), int(b)), 1, (255, 0, 0), -1)\n",
    "        # line for movement in blue\n",
    "        cv2.line(mask, (int(c), int(d)), (int(a), int(b)), (255, 255, 0), 1)\n",
    "\n",
    "# Overlay mask on ROI\n",
    "output_roi = cv2.addWeighted(roi2, 1, mask, 1, 0)\n",
    "\n",
    "# Convert BGR to RGB for matplotlib\n",
    "output_rgb = cv2.cvtColor(output_roi, cv2.COLOR_BGR2RGB)\n",
    "\n",
    "# Display only the ROI with flow using matplotlib\n",
    "plt.figure(figsize=(5, 5))\n",
    "plt.imshow(output_rgb)\n",
    "plt.axis(\"off\")\n",
    "plt.title(f\"Optical Flow on Ball ROI (Frame {frame_number}→{frame_number + 1})\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "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
}
