{ "cells": [ { "cell_type": "markdown", "id": "459912ac", "metadata": {}, "source": [ "## Higgs_idx Debug Notebook" ] }, { "cell_type": "markdown", "id": "8a66423b", "metadata": {}, "source": [ "### auxiliary" ] }, { "cell_type": "code", "execution_count": 1, "id": "483bfebc", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:31.468791Z", "start_time": "2023-06-01T23:11:30.675825Z" } }, "outputs": [], "source": [ "import logging\n", "from pathlib import Path\n", "\n", "import awkward as ak\n", "import click\n", "import h5py\n", "import numpy as np\n", "import uproot\n", "import vector\n", "\n", "from src.data.delphes.matching import (\n", " match_fjet_to_jet,\n", " match_higgs_to_fjet,\n", " match_higgs_to_jet,\n", ")" ] }, { "cell_type": "code", "execution_count": 2, "id": "909fcd5f", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:31.477165Z", "start_time": "2023-06-01T23:11:31.471980Z" } }, "outputs": [], "source": [ "vector.register_awkward()\n", "vector.register_numba()\n", "ak.numba.register()\n", "\n", "logging.basicConfig(level=logging.INFO)\n", "\n", "N_JETS = 10\n", "N_FJETS = 3\n", "MIN_JET_PT = 20\n", "MIN_FJET_PT = 200\n", "MIN_JETS = 6\n", "PROJECT_DIR = Path.cwd().resolve().parents[3]" ] }, { "cell_type": "code", "execution_count": 3, "id": "78b6e83c", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:31.482688Z", "start_time": "2023-06-01T23:11:31.479178Z" } }, "outputs": [], "source": [ "def to_np_array(ak_array, max_n=10, pad=0):\n", " return ak.fill_none(ak.pad_none(ak_array, max_n, clip=True, axis=-1), pad).to_numpy()" ] }, { "cell_type": "markdown", "id": "4c16f147", "metadata": {}, "source": [ "#### Mimicing main() in this notebook" ] }, { "cell_type": "code", "execution_count": 4, "id": "607eaef0", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:31.489384Z", "start_time": "2023-06-01T23:11:31.485576Z" } }, "outputs": [], "source": [ "in_files = Path(\"/hhh-vol/data/delphes/v2/GF_HHH_SM_c3_0_d4_0_14TeV/\").glob(\"sample_*.root\")\n", "in_files = [str(p) for p in in_files]\n", "out_file = \"/hhh-vol/data/delphes/v2/hhh_testing.h5\"\n", "train_frac = 0.95" ] }, { "cell_type": "code", "execution_count": 5, "id": "f0ae3490", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:40.089539Z", "start_time": "2023-06-01T23:11:31.491309Z" } }, "outputs": [], "source": [ "file_name = in_files[0]\n", "in_file = uproot.open(file_name)\n", "events = in_file[\"Delphes\"]\n", "num_entries = events.num_entries\n", "if \"training\" in out_file:\n", " entry_start = None\n", " entry_stop = int(train_frac * num_entries)\n", "else:\n", " entry_start = int(train_frac * num_entries)\n", " entry_stop = None\n", "\n", "keys = (\n", " [key for key in events.keys() if \"Particle/Particle.\" in key and \"fBits\" not in key]\n", " + [key for key in events.keys() if \"Jet/Jet.\" in key]\n", " + [key for key in events.keys() if \"FatJet/FatJet.\" in key and \"fBits\" not in key]\n", ")\n", "arrays = events.arrays(keys, entry_start=entry_start, entry_stop=entry_stop)\n", " \n", " " ] }, { "cell_type": "code", "execution_count": 26, "id": "bcd1ac7c", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:16:01.012246Z", "start_time": "2023-06-01T23:16:00.659119Z" } }, "outputs": [], "source": [ "part_pid = arrays[\"Particle/Particle.PID\"] # PDG ID\n", "part_m1 = arrays[\"Particle/Particle.M1\"]\n", "# note: see some +/-15 PDG ID particles (taus) so h->tautau is turned on\n", "# explicitly mask these events out, just keeping hhh6b events\n", "condition_hhh6b = np.logical_and(np.abs(part_pid) == 5, part_pid[part_m1] == 25)\n", "mask_hhh6b = ak.count(part_pid[condition_hhh6b], axis=-1) == 6\n", "part_pid = part_pid[mask_hhh6b]\n", "part_pt = arrays[\"Particle/Particle.PT\"][mask_hhh6b]\n", "part_eta = arrays[\"Particle/Particle.Eta\"][mask_hhh6b]\n", "part_phi = arrays[\"Particle/Particle.Phi\"][mask_hhh6b]\n", "part_mass = arrays[\"Particle/Particle.Mass\"][mask_hhh6b]\n", "part_m1 = arrays[\"Particle/Particle.M1\"][mask_hhh6b]\n", "part_d1 = arrays[\"Particle/Particle.D1\"][mask_hhh6b]\n", "\n", "# small-radius jet info\n", "pt = arrays[\"Jet/Jet.PT\"][mask_hhh6b]\n", "eta = arrays[\"Jet/Jet.Eta\"][mask_hhh6b]\n", "phi = arrays[\"Jet/Jet.Phi\"][mask_hhh6b]\n", "mass = arrays[\"Jet/Jet.Mass\"][mask_hhh6b]\n", "btag = arrays[\"Jet/Jet.BTag\"][mask_hhh6b]\n", "flavor = arrays[\"Jet/Jet.Flavor\"][mask_hhh6b]\n", "\n", "# large-radius jet info\n", "fj_pt = arrays[\"FatJet/FatJet.PT\"][mask_hhh6b]\n", "fj_eta = arrays[\"FatJet/FatJet.Eta\"][mask_hhh6b]\n", "fj_phi = arrays[\"FatJet/FatJet.Phi\"][mask_hhh6b]\n", "fj_mass = arrays[\"FatJet/FatJet.Mass\"][mask_hhh6b]\n", "fj_sdp4 = arrays[\"FatJet/FatJet.SoftDroppedP4[5]\"][mask_hhh6b]\n", "# first entry (i = 0) is the total SoftDropped Jet 4-momenta\n", "# from i = 1 to 4 are the pruned subjets 4-momenta\n", "fj_sdmass = np.sqrt(\n", " fj_sdp4.fE[..., 0] ** 2 - fj_sdp4.fP.fX[..., 0] ** 2 - fj_sdp4.fP.fY[..., 0] ** 2 - fj_sdp4.fP.fZ[..., 0] ** 2\n", ")\n", "fj_nsub = arrays[\"FatJet/FatJet.NSubJetsSoftDropped\"][mask_hhh6b]\n", "fj_taus = arrays[\"FatJet/FatJet.Tau[5]\"][mask_hhh6b]\n", "# just saving just tau21 and tau32, can save others if useful\n", "fj_tau21 = fj_taus[..., 1] / fj_taus[..., 0]\n", "fj_tau32 = fj_taus[..., 2] / fj_taus[..., 1]\n", "fj_areap4 = arrays[\"FatJet/FatJet.Area\"][mask_hhh6b]\n", "fj_area = np.hypot(fj_areap4.fP.fX, fj_areap4.fP.fY)\n", "fj_charge = arrays[\"FatJet/FatJet.Charge\"][mask_hhh6b]\n", "fj_ptd = arrays[\"FatJet/FatJet.PTD\"][mask_hhh6b]\n", "fj_ehadovereem = arrays[\"FatJet/FatJet.EhadOverEem\"][mask_hhh6b]\n", "fj_neutralenergyfrac = arrays[\"FatJet/FatJet.NeutralEnergyFraction\"][mask_hhh6b]\n", "fj_chargedenergyfrac = arrays[\"FatJet/FatJet.ChargedEnergyFraction\"][mask_hhh6b]\n", "fj_nneutral = arrays[\"FatJet/FatJet.NNeutrals\"][mask_hhh6b]\n", "fj_ncharged = arrays[\"FatJet/FatJet.NCharged\"][mask_hhh6b]\n", "\n", "particles = ak.zip(\n", " {\n", " \"pt\": part_pt,\n", " \"eta\": part_eta,\n", " \"phi\": part_phi,\n", " \"mass\": part_mass,\n", " \"pid\": part_pid,\n", " \"m1\": part_m1,\n", " \"d1\": part_d1,\n", " \"idx\": ak.local_index(part_pid),\n", " },\n", " with_name=\"Momentum4D\",\n", ")\n", "\n", "higgs_condition = np.logical_and(particles.pid == 25, np.abs(particles.pid[particles.d1]) == 5)\n", "higgses = ak.to_regular(particles[higgs_condition], axis=1)\n", "bquark_condition = np.logical_and(np.abs(particles.pid) == 5, particles.pid[particles.m1] == 25)\n", "bquarks = ak.to_regular(particles[bquark_condition], axis=1)\n", "\n", "jets = ak.zip(\n", " {\n", " \"pt\": pt,\n", " \"eta\": eta,\n", " \"phi\": phi,\n", " \"mass\": mass,\n", " \"flavor\": flavor,\n", " \"idx\": ak.local_index(pt),\n", " },\n", " with_name=\"Momentum4D\",\n", ")\n", "\n", "fjets = ak.zip(\n", " {\n", " \"pt\": fj_pt,\n", " \"eta\": fj_eta,\n", " \"phi\": fj_phi,\n", " \"mass\": fj_mass,\n", " \"idx\": ak.local_index(fj_pt),\n", " },\n", " with_name=\"Momentum4D\",\n", ")\n", "\n", "higgs_idx = match_higgs_to_jet(higgses, bquarks, jets, ak.ArrayBuilder()).snapshot()\n", "matched_fj_idx = match_fjet_to_jet(fjets, jets, ak.ArrayBuilder()).snapshot()\n", "fj_higgs_idx = match_higgs_to_fjet(higgses, bquarks, fjets, ak.ArrayBuilder()).snapshot()\n" ] }, { "cell_type": "code", "execution_count": 28, "id": "55faa9f8", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:16:59.085236Z", "start_time": "2023-06-01T23:16:59.005060Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "8\n", "0\n", "8\n", "0\n", "0\n", "8\n", "4\n", "4\n", "4\n", "8\n", "0\n", "4\n", "12\n", "0\n", "0\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "8\n", "8\n", "4\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "0\n", "0\n", "0\n", "8\n", "0\n", "4\n", "0\n", "16\n", "8\n", "0\n", "0\n", "0\n", "4\n", "0\n", "4\n", "0\n", "4\n", "4\n", "0\n", "4\n", "0\n", "0\n", "8\n", "12\n", "0\n", "8\n", "4\n", "0\n", "4\n", "0\n", "0\n", "4\n", "8\n", "0\n", "16\n", "0\n", "8\n", "0\n", "4\n", "0\n", "0\n", "4\n", "4\n", "4\n", "8\n", "8\n", "4\n", "8\n", "0\n", "0\n", "4\n", "8\n", "8\n", "4\n", "8\n", "0\n", "8\n", "0\n", "0\n", "4\n", "0\n", "0\n", "4\n", "4\n", "4\n", "4\n", "8\n", "0\n", "0\n", "8\n", "8\n", "4\n", "0\n", "8\n", "0\n", "0\n", "0\n", "12\n", "0\n", "0\n", "0\n", "8\n", "0\n", "8\n", "8\n", "8\n", "4\n", "4\n", "4\n", "0\n", "8\n", "0\n", "4\n", "0\n", "4\n", "0\n", "4\n", "4\n", "8\n", "0\n", "0\n", "0\n", "8\n", "0\n", "0\n", "4\n", "0\n", "0\n", "0\n", "0\n", "4\n", "4\n", "8\n", "0\n", "8\n", "0\n", "8\n", "8\n", "0\n", "8\n", "4\n", "0\n", "8\n", "0\n", "0\n", "8\n", "0\n", "0\n", "12\n", "0\n", "8\n", "0\n", "12\n", "0\n", "0\n", "0\n", "0\n", "4\n", "16\n", "12\n", "0\n", "0\n", "0\n", "4\n", "0\n", "4\n", "0\n", "0\n", "0\n", "4\n", "0\n", "4\n", "0\n", "0\n", "8\n", "0\n", "0\n", "12\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "8\n", "4\n", "8\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "8\n", "4\n", "0\n", "12\n", "8\n", "0\n", "8\n", "4\n", "0\n", "0\n", "0\n", "0\n", "0\n", "8\n", "0\n", "0\n", "12\n", "0\n", "0\n", "4\n", "0\n", "16\n", "4\n", "0\n", "8\n", "0\n", "0\n", "0\n", "4\n", "0\n", "0\n", "0\n", "12\n", "0\n", "0\n", "4\n", "8\n", "0\n", "0\n", "8\n", "8\n", "4\n", "8\n", "4\n", "4\n", "4\n", "0\n", "4\n", "8\n", "0\n", "8\n", "0\n", "4\n", "0\n", "0\n", "0\n", "4\n", "0\n", "0\n", "0\n", "0\n", "12\n", "4\n", "8\n", "0\n", "0\n", "4\n", "8\n", "0\n", "8\n", "0\n", "8\n", "12\n", "4\n", "8\n", "8\n", "4\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "0\n", "0\n", "0\n", "12\n", "0\n", "8\n", "8\n", "0\n", "4\n", "0\n", "12\n", "0\n", "8\n", "0\n", "12\n", "0\n", "0\n", "0\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "12\n", "8\n", "8\n", "0\n", "8\n", "8\n", "0\n", "8\n", "8\n", "4\n", "12\n", "0\n", "12\n", "4\n", "0\n", "0\n", "0\n", "0\n", "12\n", "0\n", "0\n", "4\n", "0\n", "8\n", "0\n", "0\n", "0\n", "4\n", "12\n", "0\n", "4\n", "0\n", "0\n", "0\n", "8\n", "4\n", "0\n", "0\n", "4\n", "0\n", "8\n", "4\n", "0\n", "4\n", "8\n", "4\n", "8\n", "0\n", "4\n", "0\n", "8\n", "8\n", "4\n", "8\n", "0\n", "8\n", "4\n", "12\n", "0\n", "4\n", "0\n", "0\n", "0\n", "0\n", "8\n", "8\n", "0\n", "0\n", "0\n", "0\n", "4\n", "4\n", "0\n", "4\n", "0\n", "4\n", "4\n", "8\n", "12\n", "0\n", "8\n", "8\n", "0\n", "4\n", "4\n", "0\n", "8\n", "4\n", "4\n", "8\n", "0\n", "0\n", "4\n", "0\n", "4\n", "4\n", "0\n", "4\n", "0\n", "0\n", "4\n", "4\n", "0\n", "0\n", "0\n", "0\n", "0\n", "12\n", "4\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "8\n", "4\n", "8\n", "0\n", "8\n", "8\n", "0\n", "0\n", "4\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "8\n", "0\n", "4\n", "0\n", "0\n", "12\n", "0\n", "4\n", "0\n", "0\n", "0\n", "0\n", "0\n", "16\n", "8\n", "0\n", "4\n", "0\n", "0\n", "0\n", "8\n", "4\n", "12\n", "4\n", "12\n", "4\n", "0\n", "0\n", "0\n", "4\n", "4\n", "0\n", "0\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "8\n", "4\n", "0\n", "8\n", "0\n", "0\n", "4\n", "0\n", "8\n", "0\n", "0\n", "0\n", "0\n", "12\n", "0\n", "0\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "8\n", "0\n", "8\n", "4\n", "0\n", "0\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "0\n", "0\n", "4\n", "0\n", "0\n", "4\n", "4\n", "0\n", "0\n", "4\n", "4\n", "8\n", "12\n", "4\n", "0\n", "8\n", "12\n", "0\n", "0\n", "0\n", "4\n", "0\n", "8\n", "0\n", "0\n", "4\n", "8\n", "4\n", "0\n", "8\n", "4\n", "0\n", "0\n", "0\n", "12\n", "12\n", "0\n", "12\n", "4\n", "4\n", "0\n", "8\n", "0\n", "4\n", "0\n", "0\n", "12\n", "0\n", "0\n", "0\n", "8\n", "0\n", "0\n", "0\n", "4\n", "0\n", "8\n", "8\n", "0\n", "0\n", "0\n", "8\n", "8\n", "8\n", "0\n", "12\n", "8\n", "8\n", "0\n", "0\n", "4\n", "0\n", "4\n", "4\n", "0\n", "0\n", "8\n", "4\n", "8\n", "8\n", "0\n", "8\n", "0\n", "0\n", "0\n", "12\n", "0\n", "0\n", "8\n", "0\n", "0\n", "8\n", "12\n", "0\n", "4\n", "0\n", "0\n", "0\n", "8\n", "4\n", "12\n", "0\n", "4\n", "4\n", "4\n", "0\n", "8\n", "8\n", "0\n", "0\n", "8\n", "0\n", "12\n", "0\n", "0\n", "0\n", "12\n", "0\n", "0\n", "4\n", "8\n", "0\n", "4\n", "8\n", "4\n", "4\n", "0\n", "8\n", "4\n", "4\n", "0\n", "8\n", "4\n", "8\n", "0\n", "0\n", "8\n", "4\n", "8\n", "0\n", "0\n", "0\n", "8\n", "4\n", "0\n", "0\n", "0\n", "12\n", "4\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "4\n", "0\n", "8\n", "0\n", "8\n", "12\n", "4\n", "12\n", "4\n", "0\n", "8\n", "0\n", "0\n", "0\n", "8\n", "4\n", "0\n", "4\n", "4\n", "0\n", "0\n", "0\n", "4\n", "4\n", "8\n", "4\n", "8\n", "0\n", "0\n", "8\n", "12\n", "0\n", "0\n", "0\n", "4\n", "4\n", "12\n", "8\n", "8\n", "4\n", "8\n", "0\n", "0\n", "8\n", "8\n", "12\n", "0\n", "8\n", "0\n", "4\n", "0\n", "0\n", "0\n", "0\n", "4\n", "8\n", "0\n", "0\n", "8\n", "4\n", "8\n", "4\n", "0\n", "0\n", "0\n", "8\n", "8\n", "0\n", "0\n", "8\n", "4\n", "0\n", "4\n", "12\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "4\n", "0\n", "0\n", "4\n", "8\n", "4\n", "4\n", "0\n", "0\n", "8\n", "0\n", "0\n", "8\n", "0\n", "0\n", "8\n", "0\n", "8\n", "0\n", "0\n", "4\n", "4\n", "0\n", "8\n", "0\n", "8\n", "0\n", "8\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "4\n", "4\n", "8\n", "0\n", "8\n", "0\n", "0\n", "8\n", "0\n", "8\n", "0\n", "12\n", "4\n", "0\n", "8\n", "0\n", "0\n", "8\n", "0\n", "0\n", "12\n", "4\n", "8\n", "0\n", "0\n", "0\n", "8\n", "4\n", "0\n", "8\n", "8\n", "0\n", "0\n", "0\n", "0\n", "4\n", "0\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "12\n", "0\n", "0\n", "0\n", "0\n", "0\n", "4\n", "4\n", "8\n", "4\n", "4\n", "4\n", "4\n", "4\n", "4\n", "0\n", "8\n", "0\n", "0\n", "0\n", "8\n", "0\n", "0\n", "4\n", "8\n", "0\n", "8\n", "12\n", "0\n", "4\n", "0\n", "0\n", "12\n", "4\n", "0\n", "8\n", "0\n", "4\n", "4\n", "0\n", "0\n", "8\n", "0\n", "0\n", "4\n", "4\n", "12\n", "8\n", "4\n", "4\n", "0\n", "4\n", "8\n", "4\n", "0\n", "0\n", "0\n", "0\n", "4\n", "4\n", "4\n", "0\n", "8\n", "8\n", "0\n", "0\n", "0\n", "0\n", "4\n", "8\n", "0\n", "0\n", "8\n", "8\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "0\n", "8\n", "0\n", "8\n", "0\n", "0\n", "8\n", "8\n", "4\n", "8\n", "0\n", "4\n", "4\n", "0\n", "8\n", "0\n", "0\n", "4\n", "8\n", "0\n", "0\n", "4\n", "8\n", "12\n", "8\n", "0\n", "4\n", "0\n", "4\n", "0\n", "8\n", "4\n", "4\n", "12\n", "0\n", "4\n", "8\n", "4\n", "4\n", "4\n", "0\n", "0\n", "0\n", "4\n", "0\n", "0\n", "8\n", "0\n", "0\n", "0\n", "12\n", "0\n", "0\n", "4\n", "0\n", "0\n", "8\n", "12\n", "8\n", "4\n" ] } ], "source": [ "for i in range(0,1000):\n", " print(len(fj_higgs_idx[i]))\n", " " ] }, { "cell_type": "code", "execution_count": 24, "id": "2551fa58", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:15:55.836335Z", "start_time": "2023-06-01T23:15:55.831684Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "print(matched)" ] }, { "cell_type": "code", "execution_count": 8, "id": "cd081bff", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:42.708430Z", "start_time": "2023-06-01T23:11:42.705644Z" } }, "outputs": [], "source": [ "higgs_all = ak.flatten(fj_higgs_idx)" ] }, { "cell_type": "code", "execution_count": 9, "id": "84abc9cf", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:42.961452Z", "start_time": "2023-06-01T23:11:42.710568Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 10, "id": "1a83c343", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:42.969357Z", "start_time": "2023-06-01T23:11:42.965303Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[3.81, 3.7, 2.56], [3.4, 2.9, 3.41], ... 2.22, 3.22], [2.61, 2.89, 1.76], [-1]]\n" ] } ], "source": [ "print(higgs_all)" ] }, { "cell_type": "code", "execution_count": 11, "id": "88c86ab5", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:42.975241Z", "start_time": "2023-06-01T23:11:42.971336Z" } }, "outputs": [], "source": [ "def get_n_features_v2(arrays, n):\n", " result = []\n", " for array in arrays:\n", " if ak.num(array, axis=0) > n:\n", " result.append(array[0:n])\n", " else:\n", " result.append(array)\n", " return ak.Array(result)" ] }, { "cell_type": "code", "execution_count": 12, "id": "96764b54", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:43.787906Z", "start_time": "2023-06-01T23:11:42.977406Z" } }, "outputs": [], "source": [ "# keep events with >= MIN_JETS small-radius jets\n", "mask_minjets = ak.num(pt[pt > MIN_JET_PT]) >= MIN_JETS\n", "# sort by btag first, then pt\n", "sorted_by_pt = ak.argsort(pt, ascending=False, axis=-1)\n", "sorted = ak.concatenate([sorted_by_pt[btag == 1], sorted_by_pt[btag == 0]], axis=-1)\n", "btag = btag[sorted][mask_minjets]\n", "pt = pt[sorted][mask_minjets]\n", "eta = eta[sorted][mask_minjets]\n", "phi = phi[sorted][mask_minjets]\n", "higgs_idx = higgs_idx[sorted][mask_minjets]\n", "matched_fj_idx = matched_fj_idx[sorted][mask_minjets]\n", "\n", "btag = get_n_features_v2(btag, N_JETS)\n", "pt = get_n_features_v2(pt, N_JETS)\n", "eta = get_n_features_v2(eta, N_JETS)\n", "phi = get_n_features_v2(phi, N_JETS)\n", "higgs_idx = get_n_features_v2(higgs_idx, N_JETS)\n", "matched_fj_idx = get_n_features_v2(matched_fj_idx, N_JETS)\n", "\n", "# sort by btag first, then pt\n", "sorted_by_fj_pt = ak.argsort(fj_pt, ascending=False, axis=-1)\n", "fj_pt = fj_pt[sorted_by_fj_pt][mask_minjets]\n", "fj_eta = fj_eta[sorted_by_fj_pt][mask_minjets]\n", "fj_phi = fj_phi[sorted_by_fj_pt][mask_minjets]\n", "fj_mass = fj_mass[sorted_by_fj_pt][mask_minjets]\n", "fj_sdmass = fj_sdmass[sorted_by_fj_pt][mask_minjets]\n", "fj_nsub = fj_nsub[sorted_by_fj_pt][mask_minjets]\n", "fj_tau21 = fj_tau21[sorted_by_fj_pt][mask_minjets]\n", "fj_tau32 = fj_tau32[sorted_by_fj_pt][mask_minjets]\n", "fj_area = fj_area[sorted_by_fj_pt][mask_minjets]\n", "fj_charge = fj_charge[sorted_by_fj_pt][mask_minjets]\n", "fj_ptd = fj_ptd[sorted_by_fj_pt][mask_minjets]\n", "fj_ehadovereem = fj_ehadovereem[sorted_by_fj_pt][mask_minjets]\n", "fj_neutralenergyfrac = fj_neutralenergyfrac[sorted_by_fj_pt][mask_minjets]\n", "fj_chargedenergyfrac = fj_chargedenergyfrac[sorted_by_fj_pt][mask_minjets]\n", "fj_nneutral = fj_nneutral[sorted_by_fj_pt][mask_minjets]\n", "fj_ncharged = fj_ncharged[sorted_by_fj_pt][mask_minjets]\n", "fj_higgs_idx = fj_higgs_idx[sorted_by_fj_pt][mask_minjets]\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "d786b3c8", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:43.806904Z", "start_time": "2023-06-01T23:11:43.789735Z" } }, "outputs": [], "source": [ "# mask to define zero-padded small-radius jets\n", "mask = pt > MIN_JET_PT\n", "\n", "# mask to define zero-padded large-radius jets\n", "fj_mask = fj_pt > MIN_FJET_PT\n", "\n", "# index of small-radius jet if Higgs is reconstructed\n", "h1_bs = ak.local_index(higgs_idx)[higgs_idx == 1]\n", "h2_bs = ak.local_index(higgs_idx)[higgs_idx == 2]\n", "h3_bs = ak.local_index(higgs_idx)[higgs_idx == 3]\n", "\n", "# index of large-radius jet if Higgs is reconstructed\n", "h1_bb = ak.local_index(fj_higgs_idx)[fj_higgs_idx == 1]\n", "h2_bb = ak.local_index(fj_higgs_idx)[fj_higgs_idx == 2]\n", "h3_bb = ak.local_index(fj_higgs_idx)[fj_higgs_idx == 3]\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "1c4c5d23", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:44.714513Z", "start_time": "2023-06-01T23:11:43.808546Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:some Higgs bosons match to 3 small-radius jets! Check truth\n" ] }, { "ename": "ValueError", "evalue": "in ListOffsetArray64, cannot convert to RegularArray because subarray lengths are not regular\n\n(https://github.com/scikit-hep/awkward-1.0/blob/1.10.3/src/cpu-kernels/awkward_ListOffsetArray_toRegularArray.cpp#L22)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[14], line 12\u001b[0m\n\u001b[1;32m 8\u001b[0m logging\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msome Higgs bosons match to 3 small-radius jets! Check truth\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# check/fix large-radius jet truth (ensure max 1 large-radius jet per higgs)\u001b[39;00m\n\u001b[1;32m 11\u001b[0m fj_check \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m---> 12\u001b[0m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munique\u001b[49m\u001b[43m(\u001b[49m\u001b[43mak\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcount\u001b[49m\u001b[43m(\u001b[49m\u001b[43mh1_bb\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;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[38;5;241m.\u001b[39mto_list()\n\u001b[1;32m 13\u001b[0m \u001b[38;5;241m+\u001b[39m np\u001b[38;5;241m.\u001b[39munique(ak\u001b[38;5;241m.\u001b[39mcount(h2_bb, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m))\u001b[38;5;241m.\u001b[39mto_list()\n\u001b[1;32m 14\u001b[0m \u001b[38;5;241m+\u001b[39m np\u001b[38;5;241m.\u001b[39munique(ak\u001b[38;5;241m.\u001b[39mcount(h3_bb, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m))\u001b[38;5;241m.\u001b[39mto_list()\n\u001b[1;32m 15\u001b[0m )\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;241m2\u001b[39m \u001b[38;5;129;01min\u001b[39;00m fj_check:\n\u001b[1;32m 17\u001b[0m logging\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msome Higgs bosons match to 2 large-radius jets! Check truth\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "File \u001b[0;32m<__array_function__ internals>:180\u001b[0m, in \u001b[0;36munique\u001b[0;34m(*args, **kwargs)\u001b[0m\n", "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/awkward/highlevel.py:1434\u001b[0m, in \u001b[0;36mArray.__array_function__\u001b[0;34m(self, func, types, args, kwargs)\u001b[0m\n\u001b[1;32m 1417\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__array_function__\u001b[39m(\u001b[38;5;28mself\u001b[39m, func, types, args, kwargs):\n\u001b[1;32m 1418\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 1419\u001b[0m \u001b[38;5;124;03m Intercepts attempts to pass this Array to those NumPy functions other\u001b[39;00m\n\u001b[1;32m 1420\u001b[0m \u001b[38;5;124;03m than universal functions that have an Awkward equivalent.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1432\u001b[0m \u001b[38;5;124;03m See also #__array_ufunc__.\u001b[39;00m\n\u001b[1;32m 1433\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 1434\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mak\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_connect\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_numpy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtypes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/awkward/_connect/_numpy.py:34\u001b[0m, in \u001b[0;36marray_function\u001b[0;34m(func, types, args, kwargs)\u001b[0m\n\u001b[1;32m 32\u001b[0m function \u001b[38;5;241m=\u001b[39m implemented\u001b[38;5;241m.\u001b[39mget(func)\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m function \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m---> 34\u001b[0m args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m_to_rectilinear\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 35\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m {k: _to_rectilinear(v) \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m kwargs\u001b[38;5;241m.\u001b[39mitems()}\n\u001b[1;32m 36\u001b[0m out \u001b[38;5;241m=\u001b[39m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/awkward/_connect/_numpy.py:34\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 32\u001b[0m function \u001b[38;5;241m=\u001b[39m implemented\u001b[38;5;241m.\u001b[39mget(func)\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m function \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m---> 34\u001b[0m args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(\u001b[43m_to_rectilinear\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m args)\n\u001b[1;32m 35\u001b[0m kwargs \u001b[38;5;241m=\u001b[39m {k: _to_rectilinear(v) \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m kwargs\u001b[38;5;241m.\u001b[39mitems()}\n\u001b[1;32m 36\u001b[0m out \u001b[38;5;241m=\u001b[39m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/awkward/_connect/_numpy.py:26\u001b[0m, in \u001b[0;36m_to_rectilinear\u001b[0;34m(arg)\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(arg, Iterable):\n\u001b[1;32m 25\u001b[0m nplike \u001b[38;5;241m=\u001b[39m ak\u001b[38;5;241m.\u001b[39mnplike\u001b[38;5;241m.\u001b[39mof(arg)\n\u001b[0;32m---> 26\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mnplike\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_rectilinear\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mallow_missing\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 28\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m arg\n", "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/awkward/nplike.py:480\u001b[0m, in \u001b[0;36mNumpy.to_rectilinear\u001b[0;34m(self, array, *args, **kwargs)\u001b[0m\n\u001b[1;32m 465\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m array\n\u001b[1;32m 467\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\n\u001b[1;32m 468\u001b[0m array,\n\u001b[1;32m 469\u001b[0m (\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 478\u001b[0m ),\n\u001b[1;32m 479\u001b[0m ):\n\u001b[0;32m--> 480\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mak\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moperations\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconvert\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_numpy\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 482\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(array, Iterable):\n\u001b[1;32m 483\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mto_rectilinear(x, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m array]\n", "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/awkward/operations/convert.py:196\u001b[0m, in \u001b[0;36mto_numpy\u001b[0;34m(array, allow_missing)\u001b[0m\n\u001b[1;32m 193\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m array\n\u001b[1;32m 195\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(array, ak\u001b[38;5;241m.\u001b[39mhighlevel\u001b[38;5;241m.\u001b[39mArray):\n\u001b[0;32m--> 196\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mto_numpy\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlayout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mallow_missing\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mallow_missing\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 198\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(array, ak\u001b[38;5;241m.\u001b[39mhighlevel\u001b[38;5;241m.\u001b[39mRecord):\n\u001b[1;32m 199\u001b[0m out \u001b[38;5;241m=\u001b[39m array\u001b[38;5;241m.\u001b[39mlayout\n", "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/awkward/operations/convert.py:324\u001b[0m, in \u001b[0;36mto_numpy\u001b[0;34m(array, allow_missing)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m out[: shape[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m*\u001b[39m array\u001b[38;5;241m.\u001b[39msize]\u001b[38;5;241m.\u001b[39mreshape(shape)\n\u001b[1;32m 323\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(array, ak\u001b[38;5;241m.\u001b[39m_util\u001b[38;5;241m.\u001b[39mlisttypes):\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m to_numpy(\u001b[43marray\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtoRegularArray\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m, allow_missing\u001b[38;5;241m=\u001b[39mallow_missing)\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(array, ak\u001b[38;5;241m.\u001b[39m_util\u001b[38;5;241m.\u001b[39mrecordtypes):\n\u001b[1;32m 327\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m array\u001b[38;5;241m.\u001b[39mnumfields \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n", "\u001b[0;31mValueError\u001b[0m: in ListOffsetArray64, cannot convert to RegularArray because subarray lengths are not regular\n\n(https://github.com/scikit-hep/awkward-1.0/blob/1.10.3/src/cpu-kernels/awkward_ListOffsetArray_toRegularArray.cpp#L22)" ] } ], "source": [ "# check/fix small-radius jet truth (ensure max 2 small-radius jets per higgs)\n", "check = (\n", " np.unique(ak.count(h1_bs, axis=-1)).to_list()\n", " + np.unique(ak.count(h2_bs, axis=-1)).to_list()\n", " + np.unique(ak.count(h3_bs, axis=-1)).to_list()\n", ")\n", "if 3 in check:\n", " logging.warning(\"some Higgs bosons match to 3 small-radius jets! Check truth\")\n", "\n", "# check/fix large-radius jet truth (ensure max 1 large-radius jet per higgs)\n", "fj_check = (\n", " np.unique(ak.count(h1_bb, axis=-1)).to_list()\n", " + np.unique(ak.count(h2_bb, axis=-1)).to_list()\n", " + np.unique(ak.count(h3_bb, axis=-1)).to_list()\n", ")\n", "if 2 in fj_check:\n", " logging.warning(\"some Higgs bosons match to 2 large-radius jets! Check truth\")\n", "\n", "h1_bs = ak.fill_none(ak.pad_none(h1_bs, 2, clip=True), -1)\n", "h2_bs = ak.fill_none(ak.pad_none(h2_bs, 2, clip=True), -1)\n", "h3_bs = ak.fill_none(ak.pad_none(h3_bs, 2, clip=True), -1)\n", "\n", "h1_bb = ak.fill_none(ak.pad_none(h1_bb, 1, clip=True), -1)\n", "h2_bb = ak.fill_none(ak.pad_none(h2_bb, 1, clip=True), -1)\n", "h3_bb = ak.fill_none(ak.pad_none(h3_bb, 1, clip=True), -1)\n", "\n", "h1_b1, h1_b2 = h1_bs[:, 0], h1_bs[:, 1]\n", "h2_b1, h2_b2 = h2_bs[:, 0], h2_bs[:, 1]\n", "h3_b1, h3_b2 = h3_bs[:, 0], h3_bs[:, 1]\n", "\n", "# mask whether Higgs can be reconstructed as 2 small-radius jet\n", "h1_mask = ak.all(h1_bs != -1, axis=-1)\n", "h2_mask = ak.all(h2_bs != -1, axis=-1)\n", "h3_mask = ak.all(h3_bs != -1, axis=-1)\n", "\n", "# mask whether Higgs can be reconstructed as 1 large-radius jet\n", "h1_fj_mask = ak.all(h1_bb != -1, axis=-1)\n", "h2_fj_mask = ak.all(h2_bb != -1, axis=-1)\n", "h3_fj_mask = ak.all(h3_bb != -1, axis=-1)" ] }, { "cell_type": "code", "execution_count": null, "id": "8c17760f", "metadata": { "ExecuteTime": { "end_time": "2023-06-01T23:11:44.716248Z", "start_time": "2023-06-01T23:11:44.716239Z" } }, "outputs": [], "source": [ "plt.hist(h1_b1)" ] }, { "cell_type": "code", "execution_count": null, "id": "b8f31c9b", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.10" } }, "nbformat": 4, "nbformat_minor": 5 }