{ "cells": [ { "metadata": { "ExecuteTime": { "end_time": "2025-02-12T14:32:10.766770Z", "start_time": "2025-02-12T14:32:07.793979Z" } }, "cell_type": "code", "source": [ "from src.dataset.dataset import EventDataset\n", "from src.utils.paths import get_path" ], "id": "7b407a8095806d09", "outputs": [], "execution_count": 1 }, { "metadata": { "ExecuteTime": { "end_time": "2025-02-12T14:32:12.034102Z", "start_time": "2025-02-12T14:32:10.864499Z" } }, "cell_type": "code", "source": [ "model_output_file = \"/work/gkrzmanc/jetclustering/results/train/Eval_objectness_score_2025_02_12_11_50_03/eval_9.pkl\"\n", "\n", "model_clusters_file = None\n", "\n", "path = get_path(\"/pnfs/psi.ch/cms/trivcat/store/user/gkrzmanc/jetclustering/preprocessed_data/scouting_PFNano_signals2/SVJ_hadronic_std/s-channel_mMed-900_mDark-20_rinv-0.3\", \"preprocessed_data\")\n", "dataset = EventDataset.from_directory(path, model_clusters_file=model_clusters_file,\n", " model_output_file=model_output_file,\n", " include_model_jets_unfiltered=True)" ], "id": "8d275fbf162ad4fc", "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/work/gkrzmanc/jetclustering/code/src/utils/utils.py:91: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n", " return lambda b: torch.load(io.BytesIO(b), map_location='cpu')\n" ] } ], "execution_count": 2 }, { "metadata": { "ExecuteTime": { "end_time": "2025-02-12T14:32:12.482044Z", "start_time": "2025-02-12T14:32:12.246175Z" } }, "cell_type": "code", "source": [ "max_events = 1000\n", "import torch\n", "all_obj_scores = []\n", "target_obj_scores = []\n", "for i in range(len(dataset)):\n", " if i > max_events:\n", " break\n", " event = dataset[i]\n", " all_obj_scores += torch.sigmoid(event.model_jets.obj_score).tolist()\n", " assert len(event.model_jets) == len(event.model_jets.obj_score), f\"{len(event.model_jets)} {len(event.model_jets.obj_score)}\"\n", " target_obj_scores += event.model_jets.target_obj_score.tolist()\n" ], "id": "b4822c0dc7f98f51", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([ 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2,\n", " 2, 0, 0, 2, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, -1, 0, 0, 2,\n", " 0, 0, 2, 0, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2, 0, 2, 2, 2,\n", " 0, 2, 2, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 1, 0, 0, 1, 0,\n", " 2, 2, 0, 2, 1, 0, 0, 1, -1, 2, 2, 0, 2, 0, 1, 0, -1, 2,\n", " 2, 0, 2, 0, 2, 2, 1, 2, 0, 0, 2, 1, 2, 2, 2, 2, 0, 2,\n", " 2, 2, 2, 2, -1, 0, 2, 2, 0, 2, 2, 2, -1, 1, 0, 2, -1, 2,\n", " 2, -1, 2, -1, 0, 2, 0, 1, -1, 2, 0, 2, -1, 1, 2, 0, 2, -1,\n", " 2, -1, 1, 0, 0, 0, 2, 0, 1, 0, -1, 1, 0, 2, 2, 2, 2, 2,\n", " 2, 2, -1, 2, 1, 0, 0, 1, 1, 2, 0, 2, 2, 0, 2, 0, 0, 1,\n", " 2, 2, 0, 2, 1, -1, -1, 2, -1, -1, -1, 0, 0, 2, 1, 1, 2, 2,\n", " -1, 1, 0, 2, 2, -1, 0, -1, 0, 0, 2, 2, 2, 2, 0, 1, 0, 2,\n", " -1, 2, 2, -1, 2, 2, 2, -1, 1, 0, 0])\n", "Jets pt tensor([315.0177, 24.9858, 306.9994]) obj score tensor([ 2.4366, -4.1073, -1.8993])\n", "tensor([ 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2,\n", " 2, 0, 0, 2, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, -1, 0, 0, 2,\n", " 0, 0, 2, 0, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2, 0, 2, 2, 2,\n", " 0, 2, 2, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 1, 0, 0, 1, 0,\n", " 2, 2, 0, 2, 1, 0, 0, 1, -1, 2, 2, 0, 2, 0, 1, 0, -1, 2,\n", " 2, 0, 2, 0, 2, 2, 1, 2, 0, 0, 2, 1, 2, 2, 2, 2, 0, 2,\n", " 2, 2, 2, 2, -1, 0, 2, 2, 0, 2, 2, 2, -1, 1, 0, 2, -1, 2,\n", " 2, -1, 2, -1, 0, 2, 0, 1, -1, 2, 0, 2, -1, 1, 2, 0, 2, -1,\n", " 2, -1, 1, 0, 0, 0, 2, 0, 1, 0, -1, 1, 0, 2, 2, 2, 2, 2,\n", " 2, 2, -1, 2, 1, 0, 0, 1, 1, 2, 0, 2, 2, 0, 2, 0, 0, 1,\n", " 2, 2, 0, 2, 1, -1, -1, 2, -1, -1, -1, 0, 0, 2, 1, 1, 2, 2,\n", " -1, 1, 0, 2, 2, -1, 0, -1, 0, 0, 2, 2, 2, 2, 0, 1, 0, 2,\n", " -1, 2, 2, -1, 2, 2, 2, -1, 1, 0, 0])\n", "tensor([4, 4, 4, 4, 4, 5, 5, 3, 5, 5, 5, 4, 5, 5, 3, 5, 5, 5, 3, 5, 4, 5, 4, 5,\n", " 5, 3, 5, 4, 5, 5, 5, 3, 3, 5, 5, 5, 3, 3, 5, 5, 3, 5, 5, 2, 5, 5, 5, 5,\n", " 4, 3, 3, 3, 2, 5, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 3, 3, 5, 4, 5, 4, 5, 3,\n", " 4, 5, 5, 3, 5, 5, 5, 4, 5, 2, 5, 5, 3, 5, 5, 4, 3, 4, 5, 2, 2, 5, 5, 3,\n", " 5, 2, 2, 4, 5, 5, 2, 5, 3, 5, 4, 2, 5, 5, 2, 4, 5, 3, 3, 5, 5, 5, 2, 3,\n", " 4, 3, 5, 5, 5, 3, 5, 5, 5, 4, 4, 5, 5, 5, 4, 5, 3, 4, 4, 4, 5, 5, 4, 5,\n", " 5, 3, 4, 3, 5, 3, 3, 3, 2, 3, 4, 4, 2, 5, 5, 3, 4, 3, 5, 2, 3, 3, 4, 4,\n", " 3, 4, 4, 4, 5, 2, 3, 3, 2, 3, 2, 5, 3, 3, 4, 5, 5, 3, 2, 3, 3, 4, 5, 5,\n", " 3, 3, 5, 5, 2, 4, 4, 5, 3, 5, 3, 3, 5, 3, 5, 2, 5, 4, 5, 3, 4, 4, 5, 4,\n", " 3, 3, 2, 5, 5, 4, 4, 5, 5, 3, 3, 5, 5, 5, 4, 3, 4, 5, 3, 2, 3, 5, 3, 4,\n", " 3, 5, 5, 5, 3, 2, 5, 3, 3, 3, 4, 5, 5, 5, 3, 5, 5, 2, 5, 4, 4, 5, 5, 5,\n", " 4, 3, 5, 3, 5, 5, 4, 3, 5, 4, 3, 5, 4, 4, 3, 5, 3, 5, 3, 2, 5, 5, 4, 5,\n", " 5, 5, 5, 5, 5, 3, 5, 3, 2, 4, 3, 4, 5, 3, 4, 4, 5, 3, 4, 4, 5, 5, 4, 5,\n", " 5, 4, 4, 3, 5, 3, 2, 3, 3, 5, 3, 4, 3, 4, 5, 4, 3, 4, 3, 3, 3, 5, 5])\n", "Jets pt tensor([ 0.0000, 0.0000, 12.2053, 60.9335, 447.7638, 361.8791]) obj score tensor([-4.4648, -1.0421, 0.6614])\n" ] }, { "ename": "AssertionError", "evalue": "Error! len(obj_score)=3, len(jets_pt)=6", "output_type": "error", "traceback": [ "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", "\u001B[0;31mAssertionError\u001B[0m Traceback (most recent call last)", "Cell \u001B[0;32mIn[3], line 8\u001B[0m\n\u001B[1;32m 6\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m i \u001B[38;5;241m>\u001B[39m max_events:\n\u001B[1;32m 7\u001B[0m \u001B[38;5;28;01mbreak\u001B[39;00m\n\u001B[0;32m----> 8\u001B[0m event \u001B[38;5;241m=\u001B[39m \u001B[43mdataset\u001B[49m\u001B[43m[\u001B[49m\u001B[43mi\u001B[49m\u001B[43m]\u001B[49m\n\u001B[1;32m 9\u001B[0m all_obj_scores \u001B[38;5;241m+\u001B[39m\u001B[38;5;241m=\u001B[39m torch\u001B[38;5;241m.\u001B[39msigmoid(event\u001B[38;5;241m.\u001B[39mmodel_jets\u001B[38;5;241m.\u001B[39mobj_score)\u001B[38;5;241m.\u001B[39mtolist()\n\u001B[1;32m 10\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(event\u001B[38;5;241m.\u001B[39mmodel_jets) \u001B[38;5;241m==\u001B[39m \u001B[38;5;28mlen\u001B[39m(event\u001B[38;5;241m.\u001B[39mmodel_jets\u001B[38;5;241m.\u001B[39mobj_score), \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mlen\u001B[39m(event\u001B[38;5;241m.\u001B[39mmodel_jets)\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m \u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mlen\u001B[39m(event\u001B[38;5;241m.\u001B[39mmodel_jets\u001B[38;5;241m.\u001B[39mobj_score)\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\n", "File \u001B[0;32m/work/gkrzmanc/jetclustering/code/src/dataset/dataset.py:558\u001B[0m, in \u001B[0;36mEventDataset.__getitem__\u001B[0;34m(self, i)\u001B[0m\n\u001B[1;32m 556\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21m__getitem__\u001B[39m(\u001B[38;5;28mself\u001B[39m, i):\n\u001B[1;32m 557\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m i \u001B[38;5;241m<\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mn_events, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mIndex out of bounds: \u001B[39m\u001B[38;5;132;01m%d\u001B[39;00m\u001B[38;5;124m >= \u001B[39m\u001B[38;5;132;01m%d\u001B[39;00m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;241m%\u001B[39m (i, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mn_events)\n\u001B[0;32m--> 558\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_idx\u001B[49m\u001B[43m(\u001B[49m\u001B[43mi\u001B[49m\u001B[43m)\u001B[49m\n", "File \u001B[0;32m/work/gkrzmanc/jetclustering/code/src/dataset/dataset.py:419\u001B[0m, in \u001B[0;36mEventDataset.get_idx\u001B[0;34m(self, i)\u001B[0m\n\u001B[1;32m 416\u001B[0m result \u001B[38;5;241m=\u001B[39m {key: EventCollection\u001B[38;5;241m.\u001B[39mdeserialize(result[key], batch_number\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m, \u001B[38;5;28mcls\u001B[39m\u001B[38;5;241m=\u001B[39mEvent\u001B[38;5;241m.\u001B[39mevt_collections[key]) \u001B[38;5;28;01mfor\u001B[39;00m\n\u001B[1;32m 417\u001B[0m key \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mattrs}\n\u001B[1;32m 418\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mmodel_output \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[0;32m--> 419\u001B[0m result[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmodel_jets\u001B[39m\u001B[38;5;124m\"\u001B[39m], bc_scores_pfcands, bc_labels_pfcands \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_model_jets\u001B[49m\u001B[43m(\u001B[49m\u001B[43mi\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mpfcands\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mresult\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mpfcands\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43minclude_target\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;241;43m1\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mdq\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mresult\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmatrix_element_gen_particles\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 420\u001B[0m result[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpfcands\u001B[39m\u001B[38;5;124m\"\u001B[39m]\u001B[38;5;241m.\u001B[39mbc_scores_pfcands \u001B[38;5;241m=\u001B[39m bc_scores_pfcands\n\u001B[1;32m 421\u001B[0m result[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpfcands\u001B[39m\u001B[38;5;124m\"\u001B[39m]\u001B[38;5;241m.\u001B[39mbc_labels_pfcands \u001B[38;5;241m=\u001B[39m bc_labels_pfcands\n", "File \u001B[0;32m/work/gkrzmanc/jetclustering/code/src/dataset/dataset.py:536\u001B[0m, in \u001B[0;36mEventDataset.get_model_jets\u001B[0;34m(self, i, pfcands, filter, dq, include_target)\u001B[0m\n\u001B[1;32m 534\u001B[0m obj_score \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mmodel_output[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mobj_score_pred\u001B[39m\u001B[38;5;124m\"\u001B[39m][(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mmodel_output[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mevent_clusters_idx\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m==\u001B[39m i)]\n\u001B[1;32m 535\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mJets pt\u001B[39m\u001B[38;5;124m\"\u001B[39m, jets_pt, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mobj score\u001B[39m\u001B[38;5;124m\"\u001B[39m, obj_score)\n\u001B[0;32m--> 536\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(obj_score) \u001B[38;5;241m==\u001B[39m \u001B[38;5;28mlen\u001B[39m(jets_pt), \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mError! len(obj_score)=\u001B[39m\u001B[38;5;132;01m%d\u001B[39;00m\u001B[38;5;124m, len(jets_pt)=\u001B[39m\u001B[38;5;132;01m%d\u001B[39;00m\u001B[38;5;124m\"\u001B[39m \u001B[38;5;241m%\u001B[39m (\n\u001B[1;32m 537\u001B[0m \u001B[38;5;28mlen\u001B[39m(obj_score), \u001B[38;5;28mlen\u001B[39m(jets_pt))\n\u001B[1;32m 538\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m include_target:\n\u001B[1;32m 539\u001B[0m target_obj_score \u001B[38;5;241m=\u001B[39m EventDataset\u001B[38;5;241m.\u001B[39mget_target_obj_score(jets_eta, jets_phi, jets_pt, torch\u001B[38;5;241m.\u001B[39mzeros(jets_pt\u001B[38;5;241m.\u001B[39msize(\u001B[38;5;241m0\u001B[39m)), dq\u001B[38;5;241m.\u001B[39meta, dq\u001B[38;5;241m.\u001B[39mphi, torch\u001B[38;5;241m.\u001B[39mzeros(dq\u001B[38;5;241m.\u001B[39meta\u001B[38;5;241m.\u001B[39msize(\u001B[38;5;241m0\u001B[39m)))\n", "\u001B[0;31mAssertionError\u001B[0m: Error! len(obj_score)=3, len(jets_pt)=6" ] } ], "execution_count": 3 }, { "metadata": { "ExecuteTime": { "end_time": "2025-02-12T14:30:56.370301947Z", "start_time": "2025-02-11T12:51:26.851410Z" } }, "cell_type": "code", "source": "dir(event.model_jets)", "id": "6512f5fdd101ad0a", "outputs": [ { "data": { "text/plain": [ "['E',\n", " '__class__',\n", " '__delattr__',\n", " '__dict__',\n", " '__dir__',\n", " '__doc__',\n", " '__eq__',\n", " '__format__',\n", " '__ge__',\n", " '__getattribute__',\n", " '__getitem__',\n", " '__gt__',\n", " '__hash__',\n", " '__init__',\n", " '__init_subclass__',\n", " '__le__',\n", " '__len__',\n", " '__lt__',\n", " '__module__',\n", " '__ne__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__',\n", " '__weakref__',\n", " 'area',\n", " 'copy',\n", " 'deserialize',\n", " 'eta',\n", " 'init_attrs',\n", " 'mask',\n", " 'mass',\n", " 'obj_score',\n", " 'p',\n", " 'phi',\n", " 'pt',\n", " 'pxyz',\n", " 'serialize',\n", " 'target_obj_score',\n", " 'theta']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 4 }, { "metadata": { "ExecuteTime": { "end_time": "2025-02-12T14:30:56.389354987Z", "start_time": "2025-02-11T12:51:26.920277Z" } }, "cell_type": "code", "source": [ "len(all_obj_scores)\n", "target_obj_scores = torch.tensor(target_obj_scores).int()\n", "print(len(target_obj_scores))\n", "print(len(all_obj_scores))\n", "all_obj_scores = torch.tensor(all_obj_scores)" ], "id": "75269b8834cec48e", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1679\n", "1679\n" ] } ], "execution_count": 5 }, { "metadata": { "ExecuteTime": { "end_time": "2025-02-12T14:30:56.390925882Z", "start_time": "2025-02-11T12:51:26.979844Z" } }, "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots()\n", "ax.hist(all_obj_scores, histtype=\"step\", bins=100, label=\"all\")\n", "ax.hist(all_obj_scores[target_obj_scores==1], histtype=\"step\", bins=100, color=\"green\", label=\"\")\n", "ax.hist(all_obj_scores[target_obj_scores==0], histtype=\"step\", bins=100, color=\"gray\")\n", "ax.set_yscale(\"log\")\n", "fig.show()" ], "id": "5ca859cb55f86fe7", "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "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v/qV/umf/kmtra1FiHB6yaW/3377bf3iF7/Qn/3Zn+npp59We3u7Pve5zykSiejuu+8uRthlKZe+/uQnP6lgMKiPfvSjMk1Tw8PD+qu/+iv97d/+bTFCnlHS/X7s7e3VwMCAamtrC9LutHtygvLxjW98Q48++qhaWlrkcDhKHc600tfXp23btul73/ue3G53qcOZEUZHR9XU1KSHHnpIK1as0JYtW/TlL39ZDz74YKlDm3YOHTqkr3/96/rud7+r1157TU8++aSeeuop3XPPPaUODXky7Z6cuN1uVVZW6syZMwnbz5w5o/PPPz/lMeeff35W+2NMLn0d9a1vfUvf+MY39Nxzz+mKK64oZJjTQrZ9/dZbb+n3v/+9rr/++ti20dFRSVJVVZXeeOMNXXzxxYUNuozl8t72eDyy2+2qrKyMbWtubtbp06c1NDSk6urqgsZcrnLp67vuukvbtm3TX/7lX0qSLr/8cvX39+u2227Tl7/8ZVVU8Hd3vqT7/Th79uyCPTWRpuGTk+rqaq1YsUIHDhyIbRsdHdWBAwe0Zs2alMesWbMmYX9J+vd///e0+2NMLn0tSd/85jd1zz336JlnntHVV19djFDLXrZ9/aEPfUi//e1v1draGvv/G264QevWrVNra6sWLlxYzPDLTi7v7Y985CNqb2+PJYGS9Oabb8rj8ZCYTCCXvjYMY1wCEk0KTZaLy6uS/X4s6HDbEnn00UfNmpoa85FHHjGPHj1q3nbbbWZDQ4N5+vRp0zRNc9u2beadd94Z2//FF180q6qqzG9961tmW1ubeffddzOVOEPZ9vU3vvENs7q62nziiSfMQCAQ+/++vr5SXULZyLavkzFbJzvZ9ndHR4dZX19v7ty503zjjTfMn/3sZ2ZTU5P5D//wD6W6hLKRbV/ffffdZn19vfnjH//YfPvtt81nn33WvPjii83NmzeX6hLKRl9fn3nkyBHzyJEjpiTzvvvuM48cOWK+8847pmma5p133mlu27Yttn90KvFf//Vfm21tbabf72cq8VR8+9vfNr1er1ldXW2uWrXK/PWvfx372bXXXmtu3749Yf/HH3/cXLJkiVldXW1eeuml5lNPPVXkiMtXNn39gQ98wJQ07v/vvvvu4gdehrJ9X8cjOcletv39H//xH+bq1avNmpoac9GiReY//uM/msPDw0WOujxl09eRSMT8+7//e/Piiy82HQ6HuXDhQvNzn/uc2d3dXfzAy8zBgwdT/hsc7d/t27eb11577bhjli1bZlZXV5uLFi0y//mf/7ngcdpMk2dgAADAOqbdmBMAAFDeSE4AAIClkJwAAABLITkBAACWQnICAAAsheQEAABYCskJAACwFJITAABgKSQnAADAUkhOAACApZCcAAAASyE5AQAAlvL/A7+/DImP9q7CAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" } ], "execution_count": 6 }, { "metadata": { "ExecuteTime": { "end_time": "2025-02-12T14:30:56.404842685Z", "start_time": "2025-02-11T12:51:28.121209Z" } }, "cell_type": "code", "source": "", "id": "b1d52ebccd4befee", "outputs": [], "execution_count": null }, { "metadata": { "ExecuteTime": { "end_time": "2025-02-12T14:30:56.415139614Z", "start_time": "2025-02-11T12:51:28.174332Z" } }, "cell_type": "code", "source": "", "id": "5052a19722e9e60b", "outputs": [], "execution_count": null } ], "metadata": { "kernelspec": { "name": "python3", "language": "python", "display_name": "Python 3 (ipykernel)" } }, "nbformat": 5, "nbformat_minor": 9 }