{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[32m\u001b[1m      Status\u001b[22m\u001b[39m `/home/jiling/UnROOT_RDataFrame_MiniBenchmark/Project.toml`\n",
      " \u001b[90m [68837c9b] \u001b[39mFHist v0.6.1\n",
      " \u001b[90m [7073ff75] \u001b[39mIJulia v1.23.2\n",
      " \u001b[90m [3a55db76] \u001b[39mLVCyl v0.1.0 `https://github.com/JuliaHEP/LVCyl.jl#master`\n",
      " \u001b[90m [f517fe37] \u001b[39mPolyester v0.4.2\n",
      " \u001b[90m [3cd96dde] \u001b[39mUnROOT v0.5.1\n"
     ]
    }
   ],
   "source": [
    "using Pkg\n",
    "Pkg.status()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "┌ Info: Precompiling UnROOT [3cd96dde-e98d-4713-81e9-a4a1b0235ce9]\n",
      "└ @ Base loading.jl:1423\n",
      "┌ Info: Precompiling FHist [68837c9b-b678-4cd5-9925-8a54edc8f695]\n",
      "└ @ Base loading.jl:1423\n",
      "┌ Info: Precompiling Polyester [f517fe37-dbe3-4b94-8317-1923a5111588]\n",
      "└ @ Base loading.jl:1423\n",
      "┌ Info: Precompiling LVCyl [3a55db76-103f-4f27-8e51-63f2a02e4e27]\n",
      "└ @ Base loading.jl:1423\n"
     ]
    }
   ],
   "source": [
    "using UnROOT, FHist, Polyester, LVCyl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"./Run2012BC_DoubleMuParked_Muons.root\""
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# http://opendata.web.cern.ch/record/12341\n",
    "rootfname = \"./Run2012BC_DoubleMuParked_Muons.root\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.0903061451390386"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "filesize(rootfname) / 1024^3 # in GB"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "const r = ROOTFile(rootfname);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "const mytree = LazyTree(r, \"Events\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"data-frame\"><p>3 rows × 6 columns (omitted printing of 1 columns)</p><table class=\"data-frame\"><thead><tr><th></th><th>nMuon</th><th>Muon_pt</th><th>Muon_eta</th><th>Muon_phi</th><th>Muon_mass</th></tr><tr><th></th><th title=\"UInt32\">UInt32</th><th title=\"SubArray{Float32, 1, Vector{Float32}, Tuple{UnitRange{Int64}}, true}\">SubArra…</th><th title=\"SubArray{Float32, 1, Vector{Float32}, Tuple{UnitRange{Int64}}, true}\">SubArra…</th><th title=\"SubArray{Float32, 1, Vector{Float32}, Tuple{UnitRange{Int64}}, true}\">SubArra…</th><th title=\"SubArray{Float32, 1, Vector{Float32}, Tuple{UnitRange{Int64}}, true}\">SubArra…</th></tr></thead><tbody><tr><th>1</th><td>2</td><td>[10.7637, 15.7365]</td><td>[1.06683, -0.563787]</td><td>[-0.0342727, 2.54262]</td><td>[0.105658, 0.105658]</td></tr><tr><th>2</th><td>2</td><td>[10.5385, 16.3271]</td><td>[-0.42778, 0.349225]</td><td>[-0.274792, 2.53978]</td><td>[0.105658, 0.105658]</td></tr><tr><th>3</th><td>1</td><td>[3.27533]</td><td>[2.21086]</td><td>[-1.22341]</td><td>[0.105658]</td></tr></tbody></table></div>"
      ],
      "text/latex": [
       "\\begin{tabular}{r|cccccc}\n",
       "\t& nMuon & Muon\\_pt & Muon\\_eta & Muon\\_phi & Muon\\_mass & \\\\\n",
       "\t\\hline\n",
       "\t& UInt32 & SubArra… & SubArra… & SubArra… & SubArra… & \\\\\n",
       "\t\\hline\n",
       "\t1 & 2 & [10.7637, 15.7365] & [1.06683, -0.563787] & [-0.0342727, 2.54262] & [0.105658, 0.105658] & $\\dots$ \\\\\n",
       "\t2 & 2 & [10.5385, 16.3271] & [-0.42778, 0.349225] & [-0.274792, 2.53978] & [0.105658, 0.105658] & $\\dots$ \\\\\n",
       "\t3 & 1 & [3.27533] & [2.21086] & [-1.22341] & [0.105658] & $\\dots$ \\\\\n",
       "\\end{tabular}\n"
      ],
      "text/plain": [
       "\u001b[1m Row \u001b[0m│\u001b[1m nMuon  \u001b[0m\u001b[1m Muon_pt          \u001b[0m\u001b[1m Muon_eta         \u001b[0m\u001b[1m Muon_phi         \u001b[0m\u001b[1m Muon_mass\u001b[0m ⋯\n",
       "\u001b[1m     \u001b[0m│\u001b[90m UInt32 \u001b[0m\u001b[90m SubArray{Float3  \u001b[0m\u001b[90m SubArray{Float3  \u001b[0m\u001b[90m SubArray{Float3  \u001b[0m\u001b[90m SubArray{\u001b[0m ⋯\n",
       "─────┼──────────────────────────────────────────────────────────────────────────\n",
       " 1   │ 2       Float32[10.76369  Float32[1.066827  Float32[-0.03427  Float32[0 ⋯\n",
       " 2   │ 2       Float32[10.53849  Float32[-0.42778  Float32[-0.27479  Float32[0 ⋯\n",
       " 3   │ 1       Float32[3.275326  Float32[2.210855  Float32[-1.22341  Float32[0 ⋯\n",
       "\u001b[36m                                                               2 columns omitted\u001b[0m\n"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mytree[begin:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "reco_zz_to_4l (generic function with 1 method)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "const z_mass = 91.2\n",
    "const LV32 = LorentzVectorCyl{Float32}\n",
    "function reco_zz_to_4l(pts, etas, phis, masses, charges)\n",
    "    idx = [Int[], Int[]]\n",
    "\n",
    "    # Find first lepton pair with invariant mass closest to Z mass\n",
    "    best_mass = -Inf\n",
    "    best_i1 = best_i2 = 1\n",
    "    for i1 in eachindex(pts), i2 in (i1 + 1):lastindex(pts)\n",
    "        charges[i1] == charges[i2] && continue\n",
    "        p1 = LV32(pts[i1], etas[i1], phis[i1], masses[i1])\n",
    "        p2 = LV32(pts[i2], etas[i2], phis[i2], masses[i2])\n",
    "        this_mass = (p1+p2).mass\n",
    "        if (abs(z_mass - this_mass) < abs(z_mass - best_mass))\n",
    "            best_mass = this_mass\n",
    "            best_i1 = i1\n",
    "            best_i2 = i2\n",
    "        end\n",
    "    end\n",
    "    push!(idx[1], best_i1)\n",
    "    push!(idx[1], best_i2)\n",
    "\n",
    "    #Reconstruct second Z from remaining lepton pair\n",
    "    for i in 1:4\n",
    "        if (i != best_i1 && i != best_i2)\n",
    "            push!(idx[2], i)\n",
    "        end\n",
    "    end\n",
    "\n",
    "    # Return indices of the pairs building two Z bosons\n",
    "    return idx\n",
    "end\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "filter_z_dr (generic function with 1 method)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function filter_z_dr(idx, etas, phis)\n",
    "    for pair in idx\n",
    "        i1, i2 = pair\n",
    "        dr = sqrt((etas[i1]-etas[i2])^2 + (phis[i1]-phis[i2])^2)\n",
    "        dr < 0.02 && return false;\n",
    "    end\n",
    "    return true\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "filter_z_candidates (generic function with 1 method)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function filter_z_candidates(Z_mass)\n",
    "    40 < Z_mass[1] < 120 || return false\n",
    "    12 < Z_mass[2] < 120 || return false\n",
    "    return true\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "compute_z_masses_4l (generic function with 1 method)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function compute_z_masses_4l(idx, pts, etas, phis, masses)\n",
    "    z_masses = zeros(2)\n",
    "    for (i, pair) in enumerate(idx)\n",
    "        i1, i2 = pair\n",
    "        p1 = LV32(pts[i1], etas[i1], phis[i1], masses[i1])\n",
    "        p2 = LV32(pts[i2], etas[i2], phis[i2], masses[i2])\n",
    "        z_masses[i] = (p1+p2).mass\n",
    "    end\n",
    "   return abs(z_masses[1] - z_mass) < abs(z_masses[2] - z_mass) ?\n",
    "      z_masses : reverse!(z_masses);\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "compute_higgs_mass_4l (generic function with 1 method)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "function compute_higgs_mass_4l(idx, pts, etas, phis, masses)\n",
    "    ((i1, i2), (i3, i4)) = idx\n",
    "    p1 = LV32(pts[i1], etas[i1], phis[i1], masses[i1]);\n",
    "    p2 = LV32(pts[i2], etas[i2], phis[i2], masses[i2]);\n",
    "    p3 = LV32(pts[i3], etas[i3], phis[i3], masses[i3]);\n",
    "    p4 = LV32(pts[i4], etas[i4], phis[i4], masses[i4]);\n",
    "    return (p1 + p2 + p3 + p4).mass\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 23.127858 seconds (18.04 M allocations: 24.054 GiB, 19.15% gc time)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div style=\"display: flex;\">\n",
       "    <div style=\"float:left; margin:5px\"><svg width=\"250\" height=\"200\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n",
       "    <polyline points=\"12.5,180.0,12.5,19.999999999999996,18.92857142857143,19.999999999999996,18.92857142857143,130.56237879767292,25.357142857142858,130.56237879767292,25.357142857142858,130.58536235006824,31.78571428571429,130.58536235006824,31.78571428571429,131.13696760755585,38.214285714285715,131.13696760755585,38.214285714285715,134.6189757954464,44.642857142857146,134.6189757954464,44.642857142857146,139.20419449831215,51.07142857142858,139.20419449831215,51.07142857142858,141.36464842347195,57.50000000000001,141.36464842347195,57.50000000000001,144.08819938231701,63.92857142857143,144.08819938231701,63.92857142857143,148.58148387560152,70.35714285714286,148.58148387560152,70.35714285714286,149.46635064282123,76.78571428571429,149.46635064282123,76.78571428571429,152.71852330675858,83.21428571428572,152.71852330675858,83.21428571428572,153.86770092652446,89.64285714285715,153.86770092652446,89.64285714285715,155.69489334195217,96.07142857142858,155.69489334195217,96.07142857142858,158.02772391007684,102.50000000000001,158.02772391007684,102.50000000000001,159.4641959347842,108.92857142857143,159.4641959347842,108.92857142857143,160.211161387632,115.35714285714286,160.211161387632,115.35714285714286,162.00387847446672,121.78571428571429,162.00387847446672,121.78571428571429,163.15305609423257,128.21428571428572,163.15305609423257,128.21428571428572,164.40565969977735,134.64285714285717,164.40565969977735,134.64285714285717,164.12985707103354,141.07142857142858,164.12985707103354,141.07142857142858,165.65826330532215,147.5,165.65826330532215,147.5,166.79594914889034,153.92857142857144,166.79594914889034,153.92857142857144,167.50843927314517,160.35714285714286,167.50843927314517,160.35714285714286,168.89894419306185,166.7857142857143,168.89894419306185,166.7857142857143,169.3011563599799,173.21428571428572,169.3011563599799,173.21428571428572,170.20900667959492,179.64285714285717,170.20900667959492,179.64285714285717,170.64569417510594,186.07142857142858,170.64569417510594,186.07142857142858,171.43862673274438,192.50000000000003,171.43862673274438,192.50000000000003,172.51885369532428,198.92857142857144,172.51885369532428,198.92857142857144,173.19686849098613,205.35714285714286,173.19686849098613,205.35714285714286,173.82891618185735,211.7857142857143,173.82891618185735,211.7857142857143,173.77145730086906,218.21428571428572,173.77145730086906,218.21428571428572,174.24262012497306,224.64285714285717,174.24262012497306,224.64285714285717,174.88615959204193,231.07142857142858,174.88615959204193,231.07142857142858,118.87524240465417,237.50000000000003,118.87524240465417,237.5,180.0,12.5,180.0\" stroke=\"black\" fill=\"#ffffff00\" stroke-width=\"1\"/>\n",
       "    <polyline points=\"12.5,180.0,237.5,180.0\" stroke=\"black\" stroke-width=\"1\"/>\n",
       "    <text x=\"12.5\" y=\"190.0\" dominant-baseline=\"middle\" text-anchor=\"start\" fill=\"black\">70.0</text>\n",
       "    <text x=\"237.5\" y=\"190.0\" dominant-baseline=\"middle\" text-anchor=\"end\" fill=\"black\">180.0</text>\n",
       "</svg>\n",
       "</div>\n",
       "    <div style=\"float:left; margin:5px; max-width: 50%; display:flex; justify-content:center; align-items:center;\">\n",
       "        <ul>\n",
       "            <li>edges: 70.0:3.142857142857143:180.0</li>\n",
       "            <li>bin counts: [13923.0, 4302.0, 4300.0, 4252.0, 3949.0, 3550.0, 3362.0, 3125.0, 2734.0, 2657.0  …  852.0, 814.0, 745.0, 651.0, 592.0, 537.0, 542.0, 501.0, 445.0, 5319.0]</li>\n",
       "            <li>maximum count: 13923.0</li>\n",
       "            <li>total count: 80487.0</li>\n",
       "        </ul>\n",
       "    </div>\n",
       "</div>\n",
       "\n"
      ],
      "text/plain": [
       "                  \u001b[90m┌                              ┐\u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 70.0\u001b[90m, \u001b[0m 73.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█████████████████████\u001b[39m\u001b[38;5;2m \u001b[39m\u001b[0m 13923.0\u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 73.0\u001b[90m, \u001b[0m 76.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██████\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 4302.0                \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 76.0\u001b[90m, \u001b[0m 79.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██████\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 4300.0                \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 79.0\u001b[90m, \u001b[0m 82.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██████\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 4252.0                \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 83.0\u001b[90m, \u001b[0m 86.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█████\u001b[39m\u001b[38;5;2m▉\u001b[39m\u001b[0m 3949.0                 \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 86.0\u001b[90m, \u001b[0m 89.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█████\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 3550.0                 \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 89.0\u001b[90m, \u001b[0m 92.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█████\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 3362.0                 \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 92.0\u001b[90m, \u001b[0m 95.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m████\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 3125.0                  \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 95.0\u001b[90m, \u001b[0m 98.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m████\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 2734.0                  \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 98.0\u001b[90m, \u001b[0m101.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m████\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 2657.0                  \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m101.0\u001b[90m, \u001b[0m104.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m███\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 2374.0                   \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m105.0\u001b[90m, \u001b[0m108.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m███\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 2274.0                   \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m108.0\u001b[90m, \u001b[0m111.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m███\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 2115.0                   \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m111.0\u001b[90m, \u001b[0m114.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 1912.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m114.0\u001b[90m, \u001b[0m117.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 1787.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m117.0\u001b[90m, \u001b[0m120.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 1722.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m120.0\u001b[90m, \u001b[0m123.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 1566.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m123.0\u001b[90m, \u001b[0m126.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 1466.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m127.0\u001b[90m, \u001b[0m130.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 1357.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m130.0\u001b[90m, \u001b[0m133.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 1381.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m133.0\u001b[90m, \u001b[0m136.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 1248.0                     \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m136.0\u001b[90m, \u001b[0m139.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 1149.0                     \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m139.0\u001b[90m, \u001b[0m142.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 1087.0                     \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m142.0\u001b[90m, \u001b[0m145.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 966.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m145.0\u001b[90m, \u001b[0m148.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 931.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m149.0\u001b[90m, \u001b[0m152.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 852.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m152.0\u001b[90m, \u001b[0m155.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 814.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m155.0\u001b[90m, \u001b[0m158.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 745.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m158.0\u001b[90m, \u001b[0m161.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▉\u001b[39m\u001b[0m 651.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m161.0\u001b[90m, \u001b[0m164.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 592.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m164.0\u001b[90m, \u001b[0m167.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 537.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m167.0\u001b[90m, \u001b[0m170.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 542.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m171.0\u001b[90m, \u001b[0m174.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 501.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m174.0\u001b[90m, \u001b[0m177.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 445.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m177.0\u001b[90m, \u001b[0m180.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m████████\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 5319.0              \u001b[90m \u001b[39m \n",
       "                  \u001b[90m└                              ┘\u001b[39m \n",
       "edges: 70.0:3.142857142857143:180.0\n",
       "bin counts: [13923.0, 4302.0, 4300.0, 4252.0, 3949.0, 3550.0, 3362.0, 3125.0, 2734.0, 2657.0  …  852.0, 814.0, 745.0, 651.0, 592.0, 537.0, 542.0, 501.0, 445.0, 5319.0]\n",
       "total count: 80487.0"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "let H = Hist1D(Float64; bins = range(70, 180; length=36), overflow=true)\n",
    "    #@time @batch for evt in mytree\n",
    "    @time for evt in mytree\n",
    "        evt.nMuon != 4 && continue\n",
    "        \n",
    "        pts, etas  = evt.Muon_pt, evt.Muon_eta\n",
    "        \n",
    "        (all(pts .> 5) && all(abs.(etas) .< 2.4)) || continue\n",
    "        \n",
    "        phis, masses, charges = evt.Muon_phi, evt.Muon_mass, evt.Muon_charge\n",
    "        \n",
    "        sum(charges) != 0 && continue\n",
    "        \n",
    "        Z_idx = reco_zz_to_4l(pts, etas, phis, masses, charges)\n",
    "        \n",
    "        filter_z_dr(Z_idx, etas, phis) || continue\n",
    "\n",
    "        Z_mass = compute_z_masses_4l(Z_idx, pts, etas, phis, masses)\n",
    "\n",
    "        filter_z_candidates(Z_mass) || continue\n",
    "        h_mass = compute_higgs_mass_4l(Z_idx, pts, etas, phis, masses)\n",
    "        push!(H, h_mass)\n",
    "    end\n",
    "    H\n",
    "end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Threads.nthreads()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  6.702241 seconds (21.68 M allocations: 25.134 GiB, 5.03% gc time, 0.35% compilation time)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div style=\"display: flex;\">\n",
       "    <div style=\"float:left; margin:5px\"><svg width=\"250\" height=\"200\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n",
       "    <polyline points=\"12.5,180.0,12.5,19.999999999999996,18.92857142857143,19.999999999999996,18.92857142857143,130.56237879767292,25.357142857142858,130.56237879767292,25.357142857142858,130.58536235006824,31.78571428571429,130.58536235006824,31.78571428571429,131.13696760755585,38.214285714285715,131.13696760755585,38.214285714285715,134.6189757954464,44.642857142857146,134.6189757954464,44.642857142857146,139.20419449831215,51.07142857142858,139.20419449831215,51.07142857142858,141.36464842347195,57.50000000000001,141.36464842347195,57.50000000000001,144.08819938231701,63.92857142857143,144.08819938231701,63.92857142857143,148.58148387560152,70.35714285714286,148.58148387560152,70.35714285714286,149.46635064282123,76.78571428571429,149.46635064282123,76.78571428571429,152.71852330675858,83.21428571428572,152.71852330675858,83.21428571428572,153.86770092652446,89.64285714285715,153.86770092652446,89.64285714285715,155.69489334195217,96.07142857142858,155.69489334195217,96.07142857142858,158.02772391007684,102.50000000000001,158.02772391007684,102.50000000000001,159.4641959347842,108.92857142857143,159.4641959347842,108.92857142857143,160.211161387632,115.35714285714286,160.211161387632,115.35714285714286,162.00387847446672,121.78571428571429,162.00387847446672,121.78571428571429,163.15305609423257,128.21428571428572,163.15305609423257,128.21428571428572,164.40565969977735,134.64285714285717,164.40565969977735,134.64285714285717,164.12985707103354,141.07142857142858,164.12985707103354,141.07142857142858,165.65826330532215,147.5,165.65826330532215,147.5,166.79594914889034,153.92857142857144,166.79594914889034,153.92857142857144,167.50843927314517,160.35714285714286,167.50843927314517,160.35714285714286,168.89894419306185,166.7857142857143,168.89894419306185,166.7857142857143,169.3011563599799,173.21428571428572,169.3011563599799,173.21428571428572,170.20900667959492,179.64285714285717,170.20900667959492,179.64285714285717,170.64569417510594,186.07142857142858,170.64569417510594,186.07142857142858,171.43862673274438,192.50000000000003,171.43862673274438,192.50000000000003,172.51885369532428,198.92857142857144,172.51885369532428,198.92857142857144,173.19686849098613,205.35714285714286,173.19686849098613,205.35714285714286,173.82891618185735,211.7857142857143,173.82891618185735,211.7857142857143,173.77145730086906,218.21428571428572,173.77145730086906,218.21428571428572,174.24262012497306,224.64285714285717,174.24262012497306,224.64285714285717,174.88615959204193,231.07142857142858,174.88615959204193,231.07142857142858,118.87524240465417,237.50000000000003,118.87524240465417,237.5,180.0,12.5,180.0\" stroke=\"black\" fill=\"#ffffff00\" stroke-width=\"1\"/>\n",
       "    <polyline points=\"12.5,180.0,237.5,180.0\" stroke=\"black\" stroke-width=\"1\"/>\n",
       "    <text x=\"12.5\" y=\"190.0\" dominant-baseline=\"middle\" text-anchor=\"start\" fill=\"black\">70.0</text>\n",
       "    <text x=\"237.5\" y=\"190.0\" dominant-baseline=\"middle\" text-anchor=\"end\" fill=\"black\">180.0</text>\n",
       "</svg>\n",
       "</div>\n",
       "    <div style=\"float:left; margin:5px; max-width: 50%; display:flex; justify-content:center; align-items:center;\">\n",
       "        <ul>\n",
       "            <li>edges: 70.0:3.142857142857143:180.0</li>\n",
       "            <li>bin counts: [13923.0, 4302.0, 4300.0, 4252.0, 3949.0, 3550.0, 3362.0, 3125.0, 2734.0, 2657.0  …  852.0, 814.0, 745.0, 651.0, 592.0, 537.0, 542.0, 501.0, 445.0, 5319.0]</li>\n",
       "            <li>maximum count: 13923.0</li>\n",
       "            <li>total count: 80487.0</li>\n",
       "        </ul>\n",
       "    </div>\n",
       "</div>\n",
       "\n"
      ],
      "text/plain": [
       "                  \u001b[90m┌                              ┐\u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 70.0\u001b[90m, \u001b[0m 73.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█████████████████████\u001b[39m\u001b[38;5;2m \u001b[39m\u001b[0m 13923.0\u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 73.0\u001b[90m, \u001b[0m 76.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██████\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 4302.0                \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 76.0\u001b[90m, \u001b[0m 79.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██████\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 4300.0                \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 79.0\u001b[90m, \u001b[0m 82.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██████\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 4252.0                \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 83.0\u001b[90m, \u001b[0m 86.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█████\u001b[39m\u001b[38;5;2m▉\u001b[39m\u001b[0m 3949.0                 \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 86.0\u001b[90m, \u001b[0m 89.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█████\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 3550.0                 \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 89.0\u001b[90m, \u001b[0m 92.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█████\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 3362.0                 \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 92.0\u001b[90m, \u001b[0m 95.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m████\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 3125.0                  \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 95.0\u001b[90m, \u001b[0m 98.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m████\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 2734.0                  \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m 98.0\u001b[90m, \u001b[0m101.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m████\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 2657.0                  \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m101.0\u001b[90m, \u001b[0m104.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m███\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 2374.0                   \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m105.0\u001b[90m, \u001b[0m108.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m███\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 2274.0                   \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m108.0\u001b[90m, \u001b[0m111.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m███\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 2115.0                   \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m111.0\u001b[90m, \u001b[0m114.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 1912.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m114.0\u001b[90m, \u001b[0m117.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 1787.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m117.0\u001b[90m, \u001b[0m120.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 1722.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m120.0\u001b[90m, \u001b[0m123.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 1566.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m123.0\u001b[90m, \u001b[0m126.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 1466.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m127.0\u001b[90m, \u001b[0m130.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 1357.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m130.0\u001b[90m, \u001b[0m133.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m██\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 1381.0                    \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m133.0\u001b[90m, \u001b[0m136.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 1248.0                     \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m136.0\u001b[90m, \u001b[0m139.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 1149.0                     \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m139.0\u001b[90m, \u001b[0m142.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 1087.0                     \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m142.0\u001b[90m, \u001b[0m145.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▌\u001b[39m\u001b[0m 966.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m145.0\u001b[90m, \u001b[0m148.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 931.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m149.0\u001b[90m, \u001b[0m152.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▍\u001b[39m\u001b[0m 852.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m152.0\u001b[90m, \u001b[0m155.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 814.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m155.0\u001b[90m, \u001b[0m158.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m█\u001b[39m\u001b[38;5;2m▎\u001b[39m\u001b[0m 745.0                      \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m158.0\u001b[90m, \u001b[0m161.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▉\u001b[39m\u001b[0m 651.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m161.0\u001b[90m, \u001b[0m164.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 592.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m164.0\u001b[90m, \u001b[0m167.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 537.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m167.0\u001b[90m, \u001b[0m170.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 542.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m171.0\u001b[90m, \u001b[0m174.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▊\u001b[39m\u001b[0m 501.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m174.0\u001b[90m, \u001b[0m177.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m▋\u001b[39m\u001b[0m 445.0                       \u001b[90m \u001b[39m \n",
       "   \u001b[0m\u001b[90m[\u001b[0m177.0\u001b[90m, \u001b[0m180.0\u001b[90m)\u001b[0m \u001b[90m┤\u001b[39m\u001b[38;5;2m████████\u001b[39m\u001b[38;5;2m▏\u001b[39m\u001b[0m 5319.0              \u001b[90m \u001b[39m \n",
       "                  \u001b[90m└                              ┘\u001b[39m \n",
       "edges: 70.0:3.142857142857143:180.0\n",
       "bin counts: [13923.0, 4302.0, 4300.0, 4252.0, 3949.0, 3550.0, 3362.0, 3125.0, 2734.0, 2657.0  …  852.0, 814.0, 745.0, 651.0, 592.0, 537.0, 542.0, 501.0, 445.0, 5319.0]\n",
       "total count: 80487.0"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "let H = Hist1D(Float64; bins = range(70, 180; length=36), overflow=true)\n",
    "    @time @batch for evt in mytree\n",
    "        evt.nMuon != 4 && continue\n",
    "        \n",
    "        pts, etas  = evt.Muon_pt, evt.Muon_eta\n",
    "        \n",
    "        (all(pts .> 5) && all(abs.(etas) .< 2.4)) || continue\n",
    "        \n",
    "        phis, masses, charges = evt.Muon_phi, evt.Muon_mass, evt.Muon_charge\n",
    "        \n",
    "        sum(charges) != 0 && continue\n",
    "        \n",
    "        Z_idx = reco_zz_to_4l(pts, etas, phis, masses, charges)\n",
    "        \n",
    "        filter_z_dr(Z_idx, etas, phis) || continue\n",
    "\n",
    "        Z_mass = compute_z_masses_4l(Z_idx, pts, etas, phis, masses)\n",
    "\n",
    "        filter_z_candidates(Z_mass) || continue\n",
    "\n",
    "        h_mass = compute_higgs_mass_4l(Z_idx, pts, etas, phis, masses)\n",
    "        push!(H, h_mass)\n",
    "    end\n",
    "    H\n",
    "end"
   ]
  }
 ],
 "metadata": {
  "@webio": {
   "lastCommId": null,
   "lastKernelId": null
  },
  "kernelspec": {
   "display_name": "Julia 1.7.0-beta4",
   "language": "julia",
   "name": "julia-1.7"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}