{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "062a49fd91af4aa18eba6bc650855629",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(HBox(children=(VBox(children=(HBox(children=(Dropdown(description='Session 1:', options=('V1', …"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "ename": "AssertionError",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mAssertionError\u001b[39m                            Traceback (most recent call last)",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:773\u001b[39m, in \u001b[36mWidget._handle_msg\u001b[39m\u001b[34m(self, msg)\u001b[39m\n\u001b[32m    771\u001b[39m         \u001b[38;5;28;01mif\u001b[39;00m \u001b[33m'\u001b[39m\u001b[33mbuffer_paths\u001b[39m\u001b[33m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m data:\n\u001b[32m    772\u001b[39m             _put_buffers(state, data[\u001b[33m'\u001b[39m\u001b[33mbuffer_paths\u001b[39m\u001b[33m'\u001b[39m], msg[\u001b[33m'\u001b[39m\u001b[33mbuffers\u001b[39m\u001b[33m'\u001b[39m])\n\u001b[32m--> \u001b[39m\u001b[32m773\u001b[39m         \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mset_state\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    775\u001b[39m \u001b[38;5;66;03m# Handle a state request.\u001b[39;00m\n\u001b[32m    776\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m method == \u001b[33m'\u001b[39m\u001b[33mrequest_state\u001b[39m\u001b[33m'\u001b[39m:\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:650\u001b[39m, in \u001b[36mWidget.set_state\u001b[39m\u001b[34m(self, sync_data)\u001b[39m\n\u001b[32m    645\u001b[39m         \u001b[38;5;28mself\u001b[39m._send(msg, buffers=echo_buffers)\n\u001b[32m    647\u001b[39m \u001b[38;5;66;03m# The order of these context managers is important. Properties must\u001b[39;00m\n\u001b[32m    648\u001b[39m \u001b[38;5;66;03m# be locked when the hold_trait_notification context manager is\u001b[39;00m\n\u001b[32m    649\u001b[39m \u001b[38;5;66;03m# released and notifications are fired.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m650\u001b[39m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_lock_property\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43msync_data\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mhold_trait_notifications\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m    651\u001b[39m \u001b[43m    \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msync_data\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m    652\u001b[39m \u001b[43m        \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m:\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m/opt/miniconda3/lib/python3.12/contextlib.py:144\u001b[39m, in \u001b[36m_GeneratorContextManager.__exit__\u001b[39m\u001b[34m(self, typ, value, traceback)\u001b[39m\n\u001b[32m    142\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m typ \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m    143\u001b[39m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m144\u001b[39m         \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mgen\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    145\u001b[39m     \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m:\n\u001b[32m    146\u001b[39m         \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/traitlets/traitlets.py:1510\u001b[39m, in \u001b[36mHasTraits.hold_trait_notifications\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m   1508\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m changes \u001b[38;5;129;01min\u001b[39;00m cache.values():\n\u001b[32m   1509\u001b[39m     \u001b[38;5;28;01mfor\u001b[39;00m change \u001b[38;5;129;01min\u001b[39;00m changes:\n\u001b[32m-> \u001b[39m\u001b[32m1510\u001b[39m         \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:701\u001b[39m, in \u001b[36mWidget.notify_change\u001b[39m\u001b[34m(self, change)\u001b[39m\n\u001b[32m    698\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.keys \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._should_send_property(name, \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)):\n\u001b[32m    699\u001b[39m         \u001b[38;5;66;03m# Send new state to front-end\u001b[39;00m\n\u001b[32m    700\u001b[39m         \u001b[38;5;28mself\u001b[39m.send_state(key=name)\n\u001b[32m--> \u001b[39m\u001b[32m701\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mnotify_change\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/traitlets/traitlets.py:1525\u001b[39m, in \u001b[36mHasTraits.notify_change\u001b[39m\u001b[34m(self, change)\u001b[39m\n\u001b[32m   1523\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change: Bunch) -> \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m   1524\u001b[39m \u001b[38;5;250m    \u001b[39m\u001b[33;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1525\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_notify_observers\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchange\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/traitlets/traitlets.py:1568\u001b[39m, in \u001b[36mHasTraits._notify_observers\u001b[39m\u001b[34m(self, event)\u001b[39m\n\u001b[32m   1565\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c.name \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[32m   1566\u001b[39m     c = \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c.name)\n\u001b[32m-> \u001b[39m\u001b[32m1568\u001b[39m \u001b[43mc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/plotly/basewidget.py:458\u001b[39m, in \u001b[36mBaseFigureWidget._handler_js2py_traceDeltas\u001b[39m\u001b[34m(self, change)\u001b[39m\n\u001b[32m    451\u001b[39m delta_transform = BaseFigureWidget._transform_data(\n\u001b[32m    452\u001b[39m     uid_trace._prop_defaults, delta\n\u001b[32m    453\u001b[39m )\n\u001b[32m    455\u001b[39m \u001b[38;5;66;03m# #### Remove overlapping properties ####\u001b[39;00m\n\u001b[32m    456\u001b[39m \u001b[38;5;66;03m# If a property is present in both _props and _prop_defaults\u001b[39;00m\n\u001b[32m    457\u001b[39m \u001b[38;5;66;03m# then we remove the copy from _props\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m458\u001b[39m remove_props = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_remove_overlapping_props\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    459\u001b[39m \u001b[43m    \u001b[49m\u001b[43muid_trace\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_props\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muid_trace\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_prop_defaults\u001b[49m\n\u001b[32m    460\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    462\u001b[39m \u001b[38;5;66;03m# #### Notify frontend model of property removal ####\u001b[39;00m\n\u001b[32m    463\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m remove_props:\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/plotly/basewidget.py:842\u001b[39m, in \u001b[36mBaseFigureWidget._remove_overlapping_props\u001b[39m\u001b[34m(input_data, delta_data, prop_path)\u001b[39m\n\u001b[32m    840\u001b[39m input_val = input_data[p]\n\u001b[32m    841\u001b[39m recur_prop_path = prop_path + (p,)\n\u001b[32m--> \u001b[39m\u001b[32m842\u001b[39m recur_removed = \u001b[43mBaseFigureWidget\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_remove_overlapping_props\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    843\u001b[39m \u001b[43m    \u001b[49m\u001b[43minput_val\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdelta_val\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrecur_prop_path\u001b[49m\n\u001b[32m    844\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    845\u001b[39m removed.extend(recur_removed)\n\u001b[32m    847\u001b[39m \u001b[38;5;66;03m# Check whether the last property in input_val\u001b[39;00m\n\u001b[32m    848\u001b[39m \u001b[38;5;66;03m# has been removed. If so, remove it entirely\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Doctorat/Semaine_28_01_25/AVC/lib/python3.12/site-packages/plotly/basewidget.py:834\u001b[39m, in \u001b[36mBaseFigureWidget._remove_overlapping_props\u001b[39m\u001b[34m(input_data, delta_data, prop_path)\u001b[39m\n\u001b[32m    831\u001b[39m \u001b[38;5;66;03m# Handle dict\u001b[39;00m\n\u001b[32m    832\u001b[39m \u001b[38;5;66;03m# -----------\u001b[39;00m\n\u001b[32m    833\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(input_data, \u001b[38;5;28mdict\u001b[39m):\n\u001b[32m--> \u001b[39m\u001b[32m834\u001b[39m     \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(delta_data, \u001b[38;5;28mdict\u001b[39m)\n\u001b[32m    836\u001b[39m     \u001b[38;5;28;01mfor\u001b[39;00m p, delta_val \u001b[38;5;129;01min\u001b[39;00m delta_data.items():\n\u001b[32m    837\u001b[39m         \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(delta_val, \u001b[38;5;28mdict\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m BaseFigure._is_dict_list(delta_val):\n",
      "\u001b[31mAssertionError\u001b[39m: "
     ]
    }
   ],
   "source": [
    "#| label: fig5cell\n",
    "\n",
    "from Dash_client import DashNeuroTmapClient\n",
    "import plotly.io as pio\n",
    "pio.renderers.default = \"plotly_mimetype\"\n",
    "\n",
    "client = DashNeuroTmapClient(dash_url=\"https://stroke-dashboard.db.neurolibre.org/\")\n",
    "# The function now returns the widget container which will be saved as cell output\n",
    "client.create_interactive_correlation_interface_auto()\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "AVC",
   "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.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
