Browse Source

finding shared tracks

master
cetin 1 year ago
parent
commit
244a624af7
  1. 184
      D_tasks.ipynb

184
D_tasks.ipynb

@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 73,
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
@ -21,7 +21,7 @@
},
{
"cell_type": "code",
"execution_count": 74,
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
@ -38,7 +38,7 @@
},
{
"cell_type": "code",
"execution_count": 75,
"execution_count": 30,
"metadata": {},
"outputs": [
{
@ -47,7 +47,7 @@
"0.5759057568348522"
]
},
"execution_count": 75,
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
@ -63,7 +63,7 @@
},
{
"cell_type": "code",
"execution_count": 76,
"execution_count": 31,
"metadata": {},
"outputs": [
{
@ -72,7 +72,7 @@
"0.7960893854748603"
]
},
"execution_count": 76,
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
@ -94,7 +94,7 @@
},
{
"cell_type": "code",
"execution_count": 77,
"execution_count": 32,
"metadata": {},
"outputs": [
{
@ -103,7 +103,7 @@
"0.5568703211784594"
]
},
"execution_count": 77,
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
@ -126,7 +126,7 @@
},
{
"cell_type": "code",
"execution_count": 78,
"execution_count": 33,
"metadata": {},
"outputs": [
{
@ -147,7 +147,7 @@
},
{
"cell_type": "code",
"execution_count": 79,
"execution_count": 34,
"metadata": {},
"outputs": [
{
@ -184,7 +184,7 @@
},
{
"cell_type": "code",
"execution_count": 80,
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
@ -213,7 +213,7 @@
},
{
"cell_type": "code",
"execution_count": 81,
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
@ -244,7 +244,7 @@
},
{
"cell_type": "code",
"execution_count": 82,
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
@ -282,7 +282,7 @@
},
{
"cell_type": "code",
"execution_count": 83,
"execution_count": 38,
"metadata": {},
"outputs": [
{
@ -340,7 +340,7 @@
},
{
"cell_type": "code",
"execution_count": 84,
"execution_count": 39,
"metadata": {},
"outputs": [
{
@ -376,7 +376,7 @@
},
{
"cell_type": "code",
"execution_count": 85,
"execution_count": 40,
"metadata": {},
"outputs": [
{
@ -385,7 +385,7 @@
"-1.5438992626615335e-08"
]
},
"execution_count": 85,
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
@ -396,7 +396,7 @@
},
{
"cell_type": "code",
"execution_count": 86,
"execution_count": 41,
"metadata": {},
"outputs": [
{
@ -444,7 +444,7 @@
},
{
"cell_type": "code",
"execution_count": 87,
"execution_count": 42,
"metadata": {},
"outputs": [
{
@ -471,7 +471,7 @@
},
{
"cell_type": "code",
"execution_count": 88,
"execution_count": 43,
"metadata": {},
"outputs": [
{
@ -505,49 +505,43 @@
},
{
"cell_type": "code",
"execution_count": 102,
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"6"
]
},
"execution_count": 102,
"metadata": {},
"output_type": "execute_result"
"name": "stdout",
"output_type": "stream",
"text": [
"2591\n",
"1908\n",
"4499\n"
]
}
],
"source": [
"shared = np.array([0,1,0,1,1,2])\n",
"len(shared)"
"len(shared)\n",
"\n",
"both = ak.concatenate([found,lost])\n",
"print(ak.num(found,axis=0))\n",
"print(ak.num(lost,axis=0))\n",
"print(ak.num(both,axis=0))"
]
},
{
"cell_type": "code",
"execution_count": 104,
"execution_count": 48,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "cannot broadcast records in equal",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m/work/cetin/Projektpraktikum/D_tasks.ipynb Cell 18\u001b[0m line \u001b[0;36m2\n\u001b[1;32m <a href='vscode-notebook-cell://ssh-remote%2Blhcba1.physi.uni-heidelberg.de/work/cetin/Projektpraktikum/D_tasks.ipynb#X32sdnNjb2RlLXJlbW90ZQ%3D%3D?line=19'>20</a>\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mlen\u001b[39m(temp)\u001b[39m<\u001b[39m\u001b[39m2\u001b[39m:\n\u001b[1;32m <a href='vscode-notebook-cell://ssh-remote%2Blhcba1.physi.uni-heidelberg.de/work/cetin/Projektpraktikum/D_tasks.ipynb#X32sdnNjb2RlLXJlbW90ZQ%3D%3D?line=20'>21</a>\u001b[0m \u001b[39mcontinue\u001b[39;00m\n\u001b[0;32m---> <a href='vscode-notebook-cell://ssh-remote%2Blhcba1.physi.uni-heidelberg.de/work/cetin/Projektpraktikum/D_tasks.ipynb#X32sdnNjb2RlLXJlbW90ZQ%3D%3D?line=21'>22</a>\u001b[0m \u001b[39melif\u001b[39;00m \u001b[39mlen\u001b[39m(temp\u001b[39m==\u001b[39;49m\u001b[39m2\u001b[39;49m):\n\u001b[1;32m <a href='vscode-notebook-cell://ssh-remote%2Blhcba1.physi.uni-heidelberg.de/work/cetin/Projektpraktikum/D_tasks.ipynb#X32sdnNjb2RlLXJlbW90ZQ%3D%3D?line=22'>23</a>\u001b[0m possibles\u001b[39m.\u001b[39mappend(temp[\u001b[39m0\u001b[39m])\n\u001b[1;32m <a href='vscode-notebook-cell://ssh-remote%2Blhcba1.physi.uni-heidelberg.de/work/cetin/Projektpraktikum/D_tasks.ipynb#X32sdnNjb2RlLXJlbW90ZQ%3D%3D?line=23'>24</a>\u001b[0m possibles\u001b[39m.\u001b[39mappend(temp[\u001b[39m1\u001b[39m])\n",
"File \u001b[0;32m/work/cetin/software/miniconda3/envs/env1/lib/python3.11/site-packages/awkward/_operators.py:50\u001b[0m, in \u001b[0;36m_binary_method.<locals>.func\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[39mif\u001b[39;00m _disables_array_ufunc(other):\n\u001b[1;32m 49\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mNotImplemented\u001b[39m\n\u001b[0;32m---> 50\u001b[0m \u001b[39mreturn\u001b[39;00m ufunc(\u001b[39mself\u001b[39;49m, other)\n",
"File \u001b[0;32m/work/cetin/software/miniconda3/envs/env1/lib/python3.11/site-packages/awkward/highlevel.py:1402\u001b[0m, in \u001b[0;36mArray.__array_ufunc__\u001b[0;34m(self, ufunc, method, *inputs, **kwargs)\u001b[0m\n\u001b[1;32m 1400\u001b[0m name \u001b[39m=\u001b[39m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mtype\u001b[39m(ufunc)\u001b[39m.\u001b[39m\u001b[39m__module__\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m.\u001b[39m\u001b[39m{\u001b[39;00mufunc\u001b[39m.\u001b[39m\u001b[39m__name__\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m.\u001b[39m\u001b[39m{\u001b[39;00mmethod\u001b[39m!s}\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1401\u001b[0m \u001b[39mwith\u001b[39;00m ak\u001b[39m.\u001b[39m_errors\u001b[39m.\u001b[39mOperationErrorContext(name, inputs, kwargs):\n\u001b[0;32m-> 1402\u001b[0m \u001b[39mreturn\u001b[39;00m ak\u001b[39m.\u001b[39;49m_connect\u001b[39m.\u001b[39;49mnumpy\u001b[39m.\u001b[39;49marray_ufunc(ufunc, method, inputs, kwargs)\n",
"File \u001b[0;32m/work/cetin/software/miniconda3/envs/env1/lib/python3.11/site-packages/awkward/_connect/numpy.py:442\u001b[0m, in \u001b[0;36marray_ufunc\u001b[0;34m(ufunc, method, inputs, kwargs)\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[39massert\u001b[39;00m \u001b[39misinstance\u001b[39m(result, \u001b[39mtuple\u001b[39m) \u001b[39mand\u001b[39;00m \u001b[39mlen\u001b[39m(result) \u001b[39m==\u001b[39m \u001b[39m1\u001b[39m\n\u001b[1;32m 440\u001b[0m \u001b[39mreturn\u001b[39;00m result[\u001b[39m0\u001b[39m]\n\u001b[0;32m--> 442\u001b[0m out \u001b[39m=\u001b[39m ak\u001b[39m.\u001b[39;49m_do\u001b[39m.\u001b[39;49mrecursively_apply(\n\u001b[1;32m 443\u001b[0m inputs[where],\n\u001b[1;32m 444\u001b[0m unary_action,\n\u001b[1;32m 445\u001b[0m behavior,\n\u001b[1;32m 446\u001b[0m function_name\u001b[39m=\u001b[39;49mufunc\u001b[39m.\u001b[39;49m\u001b[39m__name__\u001b[39;49m,\n\u001b[1;32m 447\u001b[0m allow_records\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m,\n\u001b[1;32m 448\u001b[0m )\n\u001b[1;32m 450\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 451\u001b[0m out \u001b[39m=\u001b[39m ak\u001b[39m.\u001b[39m_broadcasting\u001b[39m.\u001b[39mbroadcast_and_apply(\n\u001b[1;32m 452\u001b[0m inputs, action, behavior, allow_records\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m, function_name\u001b[39m=\u001b[39mufunc\u001b[39m.\u001b[39m\u001b[39m__name__\u001b[39m\n\u001b[1;32m 453\u001b[0m )\n",
"File \u001b[0;32m/work/cetin/software/miniconda3/envs/env1/lib/python3.11/site-packages/awkward/_do.py:35\u001b[0m, in \u001b[0;36mrecursively_apply\u001b[0;34m(layout, action, behavior, depth_context, lateral_context, allow_records, keep_parameters, numpy_to_regular, return_simplified, return_array, function_name, regular_to_jagged)\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mrecursively_apply\u001b[39m(\n\u001b[1;32m 21\u001b[0m layout: Content \u001b[39m|\u001b[39m Record,\n\u001b[1;32m 22\u001b[0m action: ActionType,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 32\u001b[0m regular_to_jagged\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m,\n\u001b[1;32m 33\u001b[0m ) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Content \u001b[39m|\u001b[39m Record \u001b[39m|\u001b[39m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 34\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(layout, Content):\n\u001b[0;32m---> 35\u001b[0m \u001b[39mreturn\u001b[39;00m layout\u001b[39m.\u001b[39;49m_recursively_apply(\n\u001b[1;32m 36\u001b[0m action,\n\u001b[1;32m 37\u001b[0m behavior,\n\u001b[1;32m 38\u001b[0m \u001b[39m1\u001b[39;49m,\n\u001b[1;32m 39\u001b[0m copy\u001b[39m.\u001b[39;49mcopy(depth_context),\n\u001b[1;32m 40\u001b[0m lateral_context,\n\u001b[1;32m 41\u001b[0m {\n\u001b[1;32m 42\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39mallow_records\u001b[39;49m\u001b[39m\"\u001b[39;49m: allow_records,\n\u001b[1;32m 43\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39mkeep_parameters\u001b[39;49m\u001b[39m\"\u001b[39;49m: keep_parameters,\n\u001b[1;32m 44\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39mnumpy_to_regular\u001b[39;49m\u001b[39m\"\u001b[39;49m: numpy_to_regular,\n\u001b[1;32m 45\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39mregular_to_jagged\u001b[39;49m\u001b[39m\"\u001b[39;49m: regular_to_jagged,\n\u001b[1;32m 46\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39mreturn_simplified\u001b[39;49m\u001b[39m\"\u001b[39;49m: return_simplified,\n\u001b[1;32m 47\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39mreturn_array\u001b[39;49m\u001b[39m\"\u001b[39;49m: return_array,\n\u001b[1;32m 48\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39mfunction_name\u001b[39;49m\u001b[39m\"\u001b[39;49m: function_name,\n\u001b[1;32m 49\u001b[0m },\n\u001b[1;32m 50\u001b[0m )\n\u001b[1;32m 52\u001b[0m \u001b[39melif\u001b[39;00m \u001b[39misinstance\u001b[39m(layout, Record):\n\u001b[1;32m 53\u001b[0m out \u001b[39m=\u001b[39m recursively_apply(\n\u001b[1;32m 54\u001b[0m layout\u001b[39m.\u001b[39m_array,\n\u001b[1;32m 55\u001b[0m action,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 64\u001b[0m function_name,\n\u001b[1;32m 65\u001b[0m )\n",
"File \u001b[0;32m/work/cetin/software/miniconda3/envs/env1/lib/python3.11/site-packages/awkward/contents/indexedarray.py:1109\u001b[0m, in \u001b[0;36mIndexedArray._recursively_apply\u001b[0;34m(self, action, behavior, depth, depth_context, lateral_context, options)\u001b[0m\n\u001b[1;32m 1107\u001b[0m \u001b[39mreturn\u001b[39;00m result\n\u001b[1;32m 1108\u001b[0m \u001b[39melif\u001b[39;00m result \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m-> 1109\u001b[0m \u001b[39mreturn\u001b[39;00m continuation()\n\u001b[1;32m 1110\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 1111\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mAssertionError\u001b[39;00m(result)\n",
"File \u001b[0;32m/work/cetin/software/miniconda3/envs/env1/lib/python3.11/site-packages/awkward/contents/indexedarray.py:1072\u001b[0m, in \u001b[0;36mIndexedArray._recursively_apply.<locals>.continuation\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1069\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mcontinuation\u001b[39m():\n\u001b[1;32m 1070\u001b[0m \u001b[39mreturn\u001b[39;00m make(\n\u001b[1;32m 1071\u001b[0m index,\n\u001b[0;32m-> 1072\u001b[0m content\u001b[39m.\u001b[39;49m_recursively_apply(\n\u001b[1;32m 1073\u001b[0m action,\n\u001b[1;32m 1074\u001b[0m behavior,\n\u001b[1;32m 1075\u001b[0m depth,\n\u001b[1;32m 1076\u001b[0m copy\u001b[39m.\u001b[39;49mcopy(depth_context),\n\u001b[1;32m 1077\u001b[0m lateral_context,\n\u001b[1;32m 1078\u001b[0m options,\n\u001b[1;32m 1079\u001b[0m ),\n\u001b[1;32m 1080\u001b[0m parameters\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_parameters \u001b[39mif\u001b[39;00m options[\u001b[39m\"\u001b[39m\u001b[39mkeep_parameters\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39melse\u001b[39;00m \u001b[39mNone\u001b[39;00m,\n\u001b[1;32m 1081\u001b[0m )\n",
"File \u001b[0;32m/work/cetin/software/miniconda3/envs/env1/lib/python3.11/site-packages/awkward/contents/recordarray.py:1226\u001b[0m, in \u001b[0;36mRecordArray._recursively_apply\u001b[0;34m(self, action, behavior, depth, depth_context, lateral_context, options)\u001b[0m\n\u001b[1;32m 1224\u001b[0m \u001b[39mreturn\u001b[39;00m result\n\u001b[1;32m 1225\u001b[0m \u001b[39melif\u001b[39;00m result \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m-> 1226\u001b[0m \u001b[39mreturn\u001b[39;00m continuation()\n\u001b[1;32m 1227\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 1228\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mAssertionError\u001b[39;00m(result)\n",
"File \u001b[0;32m/work/cetin/software/miniconda3/envs/env1/lib/python3.11/site-packages/awkward/contents/recordarray.py:1178\u001b[0m, in \u001b[0;36mRecordArray._recursively_apply.<locals>.continuation\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mcontinuation\u001b[39m():\n\u001b[1;32m 1177\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m options[\u001b[39m\"\u001b[39m\u001b[39mallow_records\u001b[39m\u001b[39m\"\u001b[39m]:\n\u001b[0;32m-> 1178\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[1;32m 1179\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mcannot broadcast records in \u001b[39m\u001b[39m{\u001b[39;00moptions[\u001b[39m'\u001b[39m\u001b[39mfunction_name\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1180\u001b[0m )\n\u001b[1;32m 1181\u001b[0m \u001b[39mreturn\u001b[39;00m RecordArray(\n\u001b[1;32m 1182\u001b[0m [\n\u001b[1;32m 1183\u001b[0m content\u001b[39m.\u001b[39m_recursively_apply(\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1196\u001b[0m backend\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backend,\n\u001b[1;32m 1197\u001b[0m )\n",
"\u001b[0;31mValueError\u001b[0m: cannot broadcast records in equal",
"\u001b[0m\nThis error occurred while calling\n\n numpy.equal.__call__(\n <Array [{...}, {...}] type='2 * {all_endvtx_types_length: int32, al...'>\n 2\n )"
]
"data": {
"text/plain": [
"'\\ndef shared_track(mc_arr, mc_itr):\\n for itr in mc_itr: #iterate over events\\n potential = mc_arr[mc_arr[\"event_count\"]==itr] #holds all pt of a single event\\n velo_idx = potential[\"velo_track_idx\"].to_numpy()\\n velo_idx_unis, mults = np.unique(velo_idx, return_counts=True)\\n print(velo_idx_unis, mults)\\n if any(x>1 for x in mults):\\n'"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
@ -564,38 +558,89 @@
" velo_idx_unis, mults = np.unique(velo_idx, return_counts=True)\n",
" print(velo_idx_unis, mults)\n",
" if any(x>1 for x in mults):\n",
"\"\"\" \n",
"\n",
"possibles = np.array([])\n",
"\n",
"for itr in f_itr:\n",
" temp = found[found[\"event_count\"]==itr]\n",
" if len(temp)<2:\n",
" continue\n",
" else:\n",
" #iterate over cols in temp and append all with duplicate velo_track_idx, such that possibles is array with possible shared tracks particles\n",
" \n",
" \n"
"\"\"\" "
]
},
{
"cell_type": "code",
"execution_count": 42,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2591"
"2"
]
},
"execution_count": 42,
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ak.num(found[\"event_count\"], axis=0)"
"#psb = ak.Array([])\n",
"global psb\n",
"count = 0\n",
"\n",
"for itr in f_itr:\n",
" temp = both[both[\"event_count\"]==itr]\n",
" if ak.num(temp,axis=0)>1:\n",
" #iterate over cols in temp and append all with duplicate velo_track_idx, such that possibles is array with possible shared tracks particles\n",
" #print(temp.tolist())\n",
" _jitr = temp[\"velo_track_idx\"].to_numpy()\n",
" jitr = np.unique(_jitr)\n",
" for jentry in jitr:\n",
" jtem = temp[temp[\"velo_track_idx\"]==jentry]\n",
" if ak.num(jtem,axis=0)>1:\n",
" if count==0:\n",
" psb = jtem\n",
" count=1\n",
" else:\n",
" psb = ak.concatenate([psb,jtem],axis=1)\n",
" else:\n",
" continue\n",
" else:\n",
" continue\n",
" \n",
"ak.num(psb, axis=0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"_jitr = temp[\"velo_track_idx\"].to_numpy()\n",
" jitr = np.unique(_jitr)\n",
" for jentry in jitr:\n",
" jtem = temp[temp[\"velo_track_idx\"]==jentry]\n",
" if ak.num(jtem,axis=0)>1:\n",
" if count==0:\n",
" psb = jtem\n",
" count=1\n",
" else:\n",
" psb = ak.concatenate([psb,jtem],axis=1)\n",
" else:\n",
" continue"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"for epair in range(10):\n",
" print(\"possibles[\", str(epair), \"]= \", psb[epair].tolist())"
]
},
{
@ -607,7 +652,14 @@
},
{
"cell_type": "code",
"execution_count": 28,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{

Loading…
Cancel
Save