{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b943dc9e",
   "metadata": {},
   "source": [
    "# df106_HiggsToFourLeptons\n",
    "The Higgs to four lepton analysis from the ATLAS Open Data release of 2020, with RDataFrame.\n",
    "\n",
    "This tutorial is the Higgs to four lepton analysis from the ATLAS Open Data release in 2020\n",
    "(http://opendata.atlas.cern/release/2020/documentation/). The data was taken with the ATLAS detector\n",
    "during 2016 at a center-of-mass energy of 13 TeV. The decay of the Standard Model Higgs boson\n",
    "to two Z bosons and subsequently to four leptons is called the \"golden channel\". The selection leads\n",
    "to a narrow invariant mass peak on top a relatively smooth and small background, revealing\n",
    "the Higgs at 125 GeV.\n",
    "Systematic errors for the MC scale factors are computed and the Vary function of RDataFrame is used for plotting.\n",
    "The analysis is translated to an RDataFrame workflow processing about 300 MB of simulated events and data.\n",
    "\n",
    "See the [corresponding spec json file](https://github.com/root-project/root/blob/master/tutorials/analysis/dataframe/df106_HiggsToFourLeptons_spec.json).\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:**  Stefan Wunsch (KIT, CERN), Julia Mathe (CERN), Marta Czurylo (CERN)  \n",
    "<i><small>This notebook tutorial was automatically generated with <a href= \"https://github.com/root-project/root/blob/master/documentation/doxygen/converttonotebook.py\">ROOTBOOK-izer</a> from the macro found in the ROOT repository  on Tuesday, May 19, 2026 at 08:10 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1300a4b8",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:48.945275Z",
     "iopub.status.busy": "2026-05-19T20:10:48.945131Z",
     "iopub.status.idle": "2026-05-19T20:10:50.041698Z",
     "shell.execute_reply": "2026-05-19T20:10:50.041266Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c0c39602",
   "metadata": {},
   "source": [
    "Enable Multi-threaded mode"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "be87c2f8",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:50.059826Z",
     "iopub.status.busy": "2026-05-19T20:10:50.059591Z",
     "iopub.status.idle": "2026-05-19T20:10:50.192247Z",
     "shell.execute_reply": "2026-05-19T20:10:50.191864Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.EnableImplicitMT()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a73ac92",
   "metadata": {},
   "source": [
    "Create the RDataFrame from the spec json file. The df106_HiggsToFourLeptons_spec.json is provided in the same folder as this tutorial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "de0b4116",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:50.201167Z",
     "iopub.status.busy": "2026-05-19T20:10:50.201014Z",
     "iopub.status.idle": "2026-05-19T20:10:50.778173Z",
     "shell.execute_reply": "2026-05-19T20:10:50.777082Z"
    }
   },
   "outputs": [],
   "source": [
    "dataset_spec = os.path.join(ROOT.gROOT.GetTutorialsDir(), \"analysis\", \"dataframe\", \"df106_HiggsToFourLeptons_spec.json\")\n",
    "df = ROOT.RDF.Experimental.FromSpec(dataset_spec)  # Creates a single dataframe for all the samples"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc100f25",
   "metadata": {},
   "source": [
    "Add the ProgressBar feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e859cfa4",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:50.779518Z",
     "iopub.status.busy": "2026-05-19T20:10:50.779396Z",
     "iopub.status.idle": "2026-05-19T20:10:50.914029Z",
     "shell.execute_reply": "2026-05-19T20:10:50.903972Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.RDF.Experimental.AddProgressBar(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7c673d2",
   "metadata": {},
   "source": [
    "Access metadata information that is stored in the JSON config file of the RDataFrame.\n",
    "The metadata contained in the JSON file is accessible within a `DefinePerSample` call, through the `RSampleInfo` class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f0840b03",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:50.920379Z",
     "iopub.status.busy": "2026-05-19T20:10:50.920228Z",
     "iopub.status.idle": "2026-05-19T20:10:51.084301Z",
     "shell.execute_reply": "2026-05-19T20:10:51.083136Z"
    }
   },
   "outputs": [],
   "source": [
    "df = df.DefinePerSample(\"xsecs\", 'rdfsampleinfo_.GetD(\"xsecs\")')\n",
    "df = df.DefinePerSample(\"lumi\", 'rdfsampleinfo_.GetD(\"lumi\")')\n",
    "df = df.DefinePerSample(\"sumws\", 'rdfsampleinfo_.GetD(\"sumws\")')\n",
    "df = df.DefinePerSample(\"sample_category\", 'rdfsampleinfo_.GetS(\"sample_category\")')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5e7bedd3",
   "metadata": {},
   "source": [
    "We must further apply an MC correction for the ZZ decay due to missing gg->ZZ processes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b512783a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:51.085702Z",
     "iopub.status.busy": "2026-05-19T20:10:51.085554Z",
     "iopub.status.idle": "2026-05-19T20:10:51.196326Z",
     "shell.execute_reply": "2026-05-19T20:10:51.195701Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gInterpreter.Declare(\n",
    "    \"\"\"\n",
    "float scale(unsigned int slot, const ROOT::RDF::RSampleInfo &id){\n",
    "                return id.Contains(\"mc_363490.llll.4lep.root\") ? 1.3f : 1.0f;\n",
    "}\n",
    "\"\"\"\n",
    ")\n",
    "\n",
    "df = df.DefinePerSample(\"scale\", \"scale(rdfslot_, rdfsampleinfo_)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5730b85",
   "metadata": {},
   "source": [
    "Select events for the analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "aa11ddcc",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:51.198181Z",
     "iopub.status.busy": "2026-05-19T20:10:51.198055Z",
     "iopub.status.idle": "2026-05-19T20:10:51.320825Z",
     "shell.execute_reply": "2026-05-19T20:10:51.320093Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ROOT.gInterpreter.Declare(\n",
    "    \"\"\"\n",
    "using ROOT::RVecF;\n",
    "using ROOT::RVecI;\n",
    "bool GoodElectronsAndMuons(const RVecI &type, const RVecF &pt, const RVecF &eta, const RVecF &phi, const RVecF &e, const RVecF &trackd0pv, const RVecF &tracksigd0pv, const RVecF &z0)\n",
    "{\n",
    "    for (size_t i = 0; i < type.size(); i++) {\n",
    "        ROOT::Math::PtEtaPhiEVector p(0.001*pt[i], eta[i], phi[i], 0.001*e[i]);\n",
    "        if (type[i] == 11) {\n",
    "            if (pt[i] < 7000 || abs(eta[i]) > 2.47 || abs(trackd0pv[i] / tracksigd0pv[i]) > 5 || abs(z0[i] * sin(p.Theta())) > 0.5) return false;\n",
    "        } else {\n",
    "            if (abs(trackd0pv[i] / tracksigd0pv[i]) > 5 || abs(z0[i] * sin(p.Theta())) > 0.5) return false;\n",
    "        }\n",
    "    }\n",
    "    return true;\n",
    "}\n",
    "\"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e1ff036",
   "metadata": {},
   "source": [
    "Select electron or muon trigger"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "66142f29",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:51.322813Z",
     "iopub.status.busy": "2026-05-19T20:10:51.322671Z",
     "iopub.status.idle": "2026-05-19T20:10:51.490824Z",
     "shell.execute_reply": "2026-05-19T20:10:51.489352Z"
    }
   },
   "outputs": [],
   "source": [
    "df = df.Filter(\"trigE || trigM\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5586c3c",
   "metadata": {},
   "source": [
    "Select events with exactly four good leptons conserving charge and lepton numbers\n",
    "Note that all collections are RVecs and good_lep is the mask for the good leptons.\n",
    "The lepton types are PDG numbers and set to 11 or 13 for an electron or muon\n",
    "irrespective of the charge."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "19c8104d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:51.496789Z",
     "iopub.status.busy": "2026-05-19T20:10:51.496657Z",
     "iopub.status.idle": "2026-05-19T20:10:51.699923Z",
     "shell.execute_reply": "2026-05-19T20:10:51.699290Z"
    }
   },
   "outputs": [],
   "source": [
    "df = (\n",
    "    df.Define(\n",
    "        \"good_lep\",\n",
    "        \"abs(lep_eta) < 2.5 && lep_pt > 5000 && lep_ptcone30 / lep_pt < 0.3 && lep_etcone20 / lep_pt < 0.3\",\n",
    "    )\n",
    "    .Filter(\"Sum(good_lep) == 4\")\n",
    "    .Filter(\"Sum(lep_charge[good_lep]) == 0\")\n",
    "    .Define(\"goodlep_sumtypes\", \"Sum(lep_type[good_lep])\")\n",
    "    .Filter(\"goodlep_sumtypes == 44 || goodlep_sumtypes == 52 || goodlep_sumtypes == 48\")\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc2bff92",
   "metadata": {},
   "source": [
    "Apply additional cuts depending on lepton flavour"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "23ebf0f6",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:51.701619Z",
     "iopub.status.busy": "2026-05-19T20:10:51.701484Z",
     "iopub.status.idle": "2026-05-19T20:10:51.835526Z",
     "shell.execute_reply": "2026-05-19T20:10:51.834870Z"
    }
   },
   "outputs": [],
   "source": [
    "df = df.Filter(\n",
    "    \"GoodElectronsAndMuons(lep_type[good_lep], lep_pt[good_lep], lep_eta[good_lep], lep_phi[good_lep], lep_E[good_lep], lep_trackd0pvunbiased[good_lep], lep_tracksigd0pvunbiased[good_lep], lep_z0[good_lep])\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6305ea9",
   "metadata": {},
   "source": [
    "Create new columns with the kinematics of good leptons"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "810b9c4a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:51.850424Z",
     "iopub.status.busy": "2026-05-19T20:10:51.850264Z",
     "iopub.status.idle": "2026-05-19T20:10:51.981590Z",
     "shell.execute_reply": "2026-05-19T20:10:51.980947Z"
    }
   },
   "outputs": [],
   "source": [
    "df = (\n",
    "    df.Define(\"goodlep_pt\", \"lep_pt[good_lep]\")\n",
    "    .Define(\"goodlep_eta\", \"lep_eta[good_lep]\")\n",
    "    .Define(\"goodlep_phi\", \"lep_phi[good_lep]\")\n",
    "    .Define(\"goodlep_E\", \"lep_E[good_lep]\")\n",
    "    .Define(\"goodlep_type\", \"lep_type[good_lep]\")\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e45485bb",
   "metadata": {},
   "source": [
    "Select leptons with high transverse momentum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "66f9e42e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:51.984549Z",
     "iopub.status.busy": "2026-05-19T20:10:51.984407Z",
     "iopub.status.idle": "2026-05-19T20:10:52.151990Z",
     "shell.execute_reply": "2026-05-19T20:10:52.127289Z"
    }
   },
   "outputs": [],
   "source": [
    "df = df.Filter(\"goodlep_pt[0] > 25000 && goodlep_pt[1] > 15000 && goodlep_pt[2] > 10000\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a4f29d6",
   "metadata": {},
   "source": [
    "Reweighting of the samples is different for \"data\" and \"MC\". This is the function to add reweighting for MC samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "734fc3d0",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:52.184483Z",
     "iopub.status.busy": "2026-05-19T20:10:52.184313Z",
     "iopub.status.idle": "2026-05-19T20:10:52.318714Z",
     "shell.execute_reply": "2026-05-19T20:10:52.318050Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ROOT.gInterpreter.Declare(\n",
    "    \"\"\"\n",
    "double weights(float scaleFactor_1, float scaleFactor_2, float scaleFactor_3, float scaleFactor_4, float scale, float mcWeight, double xsecs, double sumws, double lumi)\n",
    "{\n",
    "    return scaleFactor_1 * scaleFactor_2 * scaleFactor_3 * scaleFactor_4 * scale * mcWeight * xsecs / sumws * lumi;\n",
    "}\n",
    "\"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4476596e",
   "metadata": {},
   "source": [
    "Use DefinePerSample to define which samples are MC and hence need reweighting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "490def53",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:52.332265Z",
     "iopub.status.busy": "2026-05-19T20:10:52.332101Z",
     "iopub.status.idle": "2026-05-19T20:10:52.466129Z",
     "shell.execute_reply": "2026-05-19T20:10:52.465458Z"
    }
   },
   "outputs": [],
   "source": [
    "df = df.DefinePerSample(\"isMC\", 'rdfsampleinfo_.Contains(\"mc\")')\n",
    "df = df.Define(\n",
    "    \"weight\",\n",
    "    \"double x; return isMC ? weights(scaleFactor_ELE, scaleFactor_MUON, scaleFactor_LepTRIGGER, scaleFactor_PILEUP, scale, mcWeight, xsecs, sumws, lumi) :  1.;\",\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5343a6ad",
   "metadata": {},
   "source": [
    "Compute invariant mass of the four lepton system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ed331c71",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:52.480363Z",
     "iopub.status.busy": "2026-05-19T20:10:52.480201Z",
     "iopub.status.idle": "2026-05-19T20:10:52.605669Z",
     "shell.execute_reply": "2026-05-19T20:10:52.605023Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gInterpreter.Declare(\n",
    "    \"\"\"\n",
    "float ComputeInvariantMass(RVecF pt, RVecF eta, RVecF phi, RVecF e)\n",
    "{\n",
    "    ROOT::Math::PtEtaPhiEVector p1{pt[0], eta[0], phi[0], e[0]};\n",
    "    ROOT::Math::PtEtaPhiEVector p2{pt[1], eta[1], phi[1], e[1]};\n",
    "    ROOT::Math::PtEtaPhiEVector p3{pt[2], eta[2], phi[2], e[2]};\n",
    "    ROOT::Math::PtEtaPhiEVector p4{pt[3], eta[3], phi[3], e[3]};\n",
    "    return 0.001 * (p1 + p2 + p3 + p4).M();\n",
    "}\n",
    "\"\"\"\n",
    ")\n",
    "\n",
    "df = df.Define(\"m4l\", \"ComputeInvariantMass(goodlep_pt, goodlep_eta, goodlep_phi, goodlep_E)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "48b997cf",
   "metadata": {},
   "source": [
    "Save data for statistical analysis tutorial (rf618_mixture_models.py) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b0b74532",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:52.607364Z",
     "iopub.status.busy": "2026-05-19T20:10:52.607220Z",
     "iopub.status.idle": "2026-05-19T20:10:58.950989Z",
     "shell.execute_reply": "2026-05-19T20:10:58.949635Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Total elapsed time: 0:08m  processed files: 9  processed events: 912535  1.14e+05 evt/s]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.ROOT.RDF.RResultPtr<ROOT::RDF::RInterface<ROOT::Detail::RDF::RLoopManager> > object at 0x55b1cf0f4dc0>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.Snapshot(\"tree\", ROOT.gROOT.GetTutorialDir().Data() + \"/analysis/dataframe/df106_HiggsToFourLeptons.root\", [\"m4l\", \"sample_category\", \"weight\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ecd9520",
   "metadata": {},
   "source": [
    "Book histograms for the four different samples: data, higgs, zz and other (this is specific to this particular analysis)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "230ba6fb",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:58.954563Z",
     "iopub.status.busy": "2026-05-19T20:10:58.954418Z",
     "iopub.status.idle": "2026-05-19T20:10:59.188843Z",
     "shell.execute_reply": "2026-05-19T20:10:59.188172Z"
    }
   },
   "outputs": [],
   "source": [
    "histos = []\n",
    "for sample_category in [\"data\", \"higgs\", \"zz\", \"other\"]:\n",
    "    histos.append(\n",
    "        df.Filter(f'sample_category == \"{sample_category}\"').Histo1D(\n",
    "            ROOT.RDF.TH1DModel(f\"{sample_category}\", \"m4l\", 24, 80, 170),\n",
    "            \"m4l\",\n",
    "            \"weight\",\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7ce54af",
   "metadata": {},
   "source": [
    "Evaluate the systematic uncertainty"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "685d71ca",
   "metadata": {},
   "source": [
    "The systematic uncertainty in this analysis is the MC scale factor uncertainty that depends on lepton\n",
    "kinematics such as pT or pseudorapidity.\n",
    "Muons uncertainties are negligible, as stated in https://atlas.web.cern.ch/Atlas/GROUPS/PHYSICS/PAPERS/MUON-2018-03/.\n",
    "Electrons uncertainties are evaluated based on the plots available in https://doi.org/10.48550/arXiv.1908.00005.\n",
    "The uncertainties are linearly interpolated, using the `TGraph::Eval()` method, to cover a range of pT values covered by the analysis."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1d30d8d",
   "metadata": {},
   "source": [
    "Create a VaryHelper to interpolate the available data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "c8c77bec",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:59.191629Z",
     "iopub.status.busy": "2026-05-19T20:10:59.191486Z",
     "iopub.status.idle": "2026-05-19T20:10:59.343110Z",
     "shell.execute_reply": "2026-05-19T20:10:59.342649Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ROOT.gInterpreter.Declare(\n",
    "    \"\"\"\n",
    "using namespace ROOT::VecOps;\n",
    "\n",
    "class VaryHelper\n",
    "{\n",
    "    const std::vector<double> x{5.50e3, 5.52e3, 12.54e3, 17.43e3, 22.40e3, 27.48e3, 30e3, 10000e3};\n",
    "    const std::vector<double> y{0.06628, 0.06395, 0.06396, 0.03372, 0.02441, 0.01403, 0, 0};\n",
    "    TGraph graph;\n",
    "\n",
    "public:\n",
    "    VaryHelper() : graph(x.size(), x.data(), y.data()) {}\n",
    "    RVec<double> operator()(const double &w, const RVecF &pt, const RVec<unsigned int> &type)\n",
    "    {\n",
    "        const auto v = Mean(Map(pt[type == 11], [this](auto p)\n",
    "        {return this->graph.Eval(p); })\n",
    "        );\n",
    "        return RVec<double>{(1 + v) * w, (1 - v) * w};\n",
    "    }\n",
    "};\n",
    "\n",
    "VaryHelper variationsFactory;\n",
    "\"\"\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b520e52d",
   "metadata": {},
   "source": [
    "Use the Vary method to add the systematic variations to the total MC scale factor (\"weight\") of the analysis."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "8aaddb0b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:59.363637Z",
     "iopub.status.busy": "2026-05-19T20:10:59.363472Z",
     "iopub.status.idle": "2026-05-19T20:11:01.307333Z",
     "shell.execute_reply": "2026-05-19T20:11:01.306661Z"
    }
   },
   "outputs": [],
   "source": [
    "df_variations_mc = (\n",
    "    df.Filter(\"isMC == true\")\n",
    "    .Vary(\"weight\", \"variationsFactory(weight, goodlep_pt, goodlep_type)\", [\"up\", \"down\"])\n",
    "    .Histo1D(ROOT.RDF.TH1DModel(\"Invariant Mass\", \"m4l\", 24, 80, 170), \"m4l\", \"weight\")\n",
    ")\n",
    "histos_mc = ROOT.RDF.Experimental.VariationsFor(df_variations_mc)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d311e3d4",
   "metadata": {},
   "source": [
    "We reached the end of the analysis part. We now evaluate the total MC uncertainty based on the variations.\n",
    "No computation graph was triggered yet, we trigger the computation graph for all histograms at once now,\n",
    "by calling 'histos_mc[\"nominal\"].GetXaxis()'.\n",
    "Note, in this case the uncertainties are symmetric."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c53fca16",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:01.312613Z",
     "iopub.status.busy": "2026-05-19T20:11:01.312459Z",
     "iopub.status.idle": "2026-05-19T20:11:06.109048Z",
     "shell.execute_reply": "2026-05-19T20:11:06.099471Z"
    }
   },
   "outputs": [],
   "source": [
    "for i in range(0, histos_mc[\"nominal\"].GetXaxis().GetNbins()):\n",
    "    (\n",
    "        histos_mc[\"nominal\"].SetBinError(\n",
    "            i, (histos_mc[\"weight:up\"].GetBinContent(i) - histos_mc[\"nominal\"].GetBinContent(i))\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "917df507",
   "metadata": {},
   "source": [
    "Make the plot of the data, individual MC contributions and the total MC scale factor systematic variations."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bce9cd5b",
   "metadata": {},
   "source": [
    "Set styles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "1e6dcb87",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:06.136565Z",
     "iopub.status.busy": "2026-05-19T20:11:06.136405Z",
     "iopub.status.idle": "2026-05-19T20:11:06.269042Z",
     "shell.execute_reply": "2026-05-19T20:11:06.253894Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gROOT.SetStyle(\"ATLAS\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ef49754",
   "metadata": {},
   "source": [
    "Create canvas with pad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "64b164c2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:06.306822Z",
     "iopub.status.busy": "2026-05-19T20:11:06.306643Z",
     "iopub.status.idle": "2026-05-19T20:11:06.562254Z",
     "shell.execute_reply": "2026-05-19T20:11:06.561685Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.TPad object at 0x7fe4c4819700>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c1 = ROOT.TCanvas(\"c\", \"\", 600, 600)\n",
    "pad = ROOT.TPad(\"upper_pad\", \"\", 0, 0, 1, 1)\n",
    "pad.SetTickx(False)\n",
    "pad.SetTicky(False)\n",
    "pad.Draw()\n",
    "pad.cd()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e359b79",
   "metadata": {},
   "source": [
    "Draw stack with MC contributions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "417f6f43",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:06.580449Z",
     "iopub.status.busy": "2026-05-19T20:11:06.580280Z",
     "iopub.status.idle": "2026-05-19T20:11:06.701512Z",
     "shell.execute_reply": "2026-05-19T20:11:06.701097Z"
    }
   },
   "outputs": [],
   "source": [
    "stack = ROOT.THStack()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98c14080",
   "metadata": {},
   "source": [
    "Retrieve values of the data and MC histograms in order to plot them.\n",
    "Draw cloned histograms to preserve graphics when original objects goes out of scope\n",
    "Note: GetValue() action operation is performed after all lazy actions of the RDF were defined first."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "b02c27e5",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:06.714493Z",
     "iopub.status.busy": "2026-05-19T20:11:06.714340Z",
     "iopub.status.idle": "2026-05-19T20:11:07.163138Z",
     "shell.execute_reply": "2026-05-19T20:11:07.162729Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221467668\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221467668() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(52669,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221467668', obj, '');\n",
       "});\n",
       "\n",
       "      }\n",
       "      const servers = ['/static/', 'https://root.cern/js/7.11.0/', 'https://jsroot.gsi.de/7.11.0/'],\n",
       "            path = 'build/jsroot';\n",
       "      if (typeof JSROOT !== 'undefined')\n",
       "         execCode(JSROOT);\n",
       "      else if (typeof requirejs !== 'undefined') {\n",
       "         servers.forEach((s,i) => { servers[i] = s + path; });\n",
       "         requirejs.config({ paths: { 'jsroot' : servers } })(['jsroot'],  execCode);\n",
       "      } else {\n",
       "         const config = document.getElementById('jupyter-config-data');\n",
       "         if (config)\n",
       "            servers[0] = (JSON.parse(config.innerHTML || '{}')?.baseUrl || '/') + 'static/';\n",
       "         else\n",
       "            servers.shift();\n",
       "         function loadJsroot() {\n",
       "            return !servers.length ? 0 : import(servers.shift() + path + '.js').catch(loadJsroot).then(() => execCode(JSROOT));\n",
       "         }\n",
       "         loadJsroot();\n",
       "      }\n",
       "   }\n",
       "   process_root_plot_1779221467668();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "h_data = histos[0].GetValue().Clone()\n",
    "h_higgs = histos[1].GetValue().Clone()\n",
    "h_zz = histos[2].GetValue().Clone()\n",
    "h_other = histos[3].GetValue().Clone()\n",
    "\n",
    "for h, color in zip([h_other, h_zz, h_higgs], [\"kViolet-9\", \"kAzure-9\", \"kRed+2\"]):\n",
    "    h.SetLineWidth(1)\n",
    "    h.SetLineColor(1)\n",
    "    h.SetFillColor(color)\n",
    "    stack.Add(h)\n",
    "\n",
    "stack.Draw(\"HIST\")\n",
    "stack.GetXaxis().SetLabelSize(0.04)\n",
    "stack.GetXaxis().SetTitleSize(0.045)\n",
    "stack.GetXaxis().SetTitleOffset(1.3)\n",
    "stack.GetXaxis().SetTitle(\"m_{4l}^{H#rightarrow ZZ} [GeV]\")\n",
    "stack.GetYaxis().SetLabelSize(0.04)\n",
    "stack.GetYaxis().SetTitleSize(0.045)\n",
    "stack.GetYaxis().SetTitle(\"Events\")\n",
    "stack.SetMaximum(35)\n",
    "stack.GetYaxis().ChangeLabel(1, -1, 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b29e1e79",
   "metadata": {},
   "source": [
    "Draw MC scale factor and variations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "c276cc05",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:07.198210Z",
     "iopub.status.busy": "2026-05-19T20:11:07.198059Z",
     "iopub.status.idle": "2026-05-19T20:11:07.329431Z",
     "shell.execute_reply": "2026-05-19T20:11:07.328937Z"
    }
   },
   "outputs": [],
   "source": [
    "histos_mc[\"nominal\"].SetFillColor(\"black\")\n",
    "histos_mc[\"nominal\"].SetFillStyle(3254)\n",
    "h_nominal = histos_mc[\"nominal\"].DrawClone(\"E2 same\")\n",
    "histos_mc[\"weight:up\"].SetLineColor(\"kGreen+2\")\n",
    "h_weight_up = histos_mc[\"weight:up\"].DrawClone(\"HIST SAME\")\n",
    "histos_mc[\"weight:down\"].SetLineColor(\"kBlue+2\")\n",
    "h_weight_down = histos_mc[\"weight:down\"].DrawClone(\"HIST SAME\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a645565",
   "metadata": {},
   "source": [
    "Draw data histogram"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "363e6d4f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:07.354397Z",
     "iopub.status.busy": "2026-05-19T20:11:07.354244Z",
     "iopub.status.idle": "2026-05-19T20:11:07.476715Z",
     "shell.execute_reply": "2026-05-19T20:11:07.476261Z"
    }
   },
   "outputs": [],
   "source": [
    "h_data.SetMarkerStyle(20)\n",
    "h_data.SetMarkerSize(1.2)\n",
    "h_data.SetLineWidth(2)\n",
    "h_data.SetLineColor(\"black\")\n",
    "h_data.Draw(\"E SAME\")  # Draw raw data with errorbars"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5553ac7f",
   "metadata": {},
   "source": [
    "Add legend"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "4e44e561",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:07.519781Z",
     "iopub.status.busy": "2026-05-19T20:11:07.519571Z",
     "iopub.status.idle": "2026-05-19T20:11:07.689968Z",
     "shell.execute_reply": "2026-05-19T20:11:07.687388Z"
    }
   },
   "outputs": [],
   "source": [
    "legend = ROOT.TLegend(0.57, 0.65, 0.94, 0.94)\n",
    "legend.SetTextFont(42)\n",
    "legend.SetFillStyle(0)\n",
    "legend.SetBorderSize(0)\n",
    "legend.SetTextSize(0.025)\n",
    "legend.SetTextAlign(32)\n",
    "legend.AddEntry(h_data, \"Data\", \"lep\")\n",
    "legend.AddEntry(h_higgs, \"Higgs MC\", \"f\")\n",
    "legend.AddEntry(h_zz, \"ZZ MC\", \"f\")\n",
    "legend.AddEntry(h_other, \"Other MC\", \"f\")\n",
    "legend.AddEntry(h_weight_down, \"Total MC Variations Down\", \"l\")\n",
    "legend.AddEntry(h_weight_up, \"Total MC Variations Up\", \"l\")\n",
    "legend.AddEntry(h_nominal, \"Total MC Uncertainty\", \"f\")\n",
    "legend.Draw()\n",
    "\n",
    "text = ROOT.TLatex()\n",
    "text.SetTextFont(72)\n",
    "text.SetTextSize(0.04)\n",
    "text.DrawLatexNDC(0.19, 0.85, \"ATLAS\")\n",
    "text.SetTextFont(42)\n",
    "text.DrawLatexNDC(0.19 + 0.15, 0.85, \"Open Data\")\n",
    "text.SetTextSize(0.035)\n",
    "text.DrawLatexNDC(0.21, 0.80, \"#sqrt{s} = 13 TeV, 10 fb^{-1}\")\n",
    "\n",
    "c1.Update()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e4b29b7",
   "metadata": {},
   "source": [
    "Save the plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "e9760ad1",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:07.707491Z",
     "iopub.status.busy": "2026-05-19T20:11:07.707347Z",
     "iopub.status.idle": "2026-05-19T20:11:07.885894Z",
     "shell.execute_reply": "2026-05-19T20:11:07.885206Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file df106_HiggsToFourLeptons_python.png has been created\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved figure to df106_HiggsToFourLeptons_python.png\n"
     ]
    }
   ],
   "source": [
    "c1.SaveAs(\"df106_HiggsToFourLeptons_python.png\")\n",
    "print(\"Saved figure to df106_HiggsToFourLeptons_python.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c82119a8",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "bb4193bd",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:07.924671Z",
     "iopub.status.busy": "2026-05-19T20:11:07.924491Z",
     "iopub.status.idle": "2026-05-19T20:11:08.055897Z",
     "shell.execute_reply": "2026-05-19T20:11:08.045577Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221468035\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221468035() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(52669,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221468035', obj, '');\n",
       "});\n",
       "\n",
       "      }\n",
       "      const servers = ['/static/', 'https://root.cern/js/7.11.0/', 'https://jsroot.gsi.de/7.11.0/'],\n",
       "            path = 'build/jsroot';\n",
       "      if (typeof JSROOT !== 'undefined')\n",
       "         execCode(JSROOT);\n",
       "      else if (typeof requirejs !== 'undefined') {\n",
       "         servers.forEach((s,i) => { servers[i] = s + path; });\n",
       "         requirejs.config({ paths: { 'jsroot' : servers } })(['jsroot'],  execCode);\n",
       "      } else {\n",
       "         const config = document.getElementById('jupyter-config-data');\n",
       "         if (config)\n",
       "            servers[0] = (JSON.parse(config.innerHTML || '{}')?.baseUrl || '/') + 'static/';\n",
       "         else\n",
       "            servers.shift();\n",
       "         function loadJsroot() {\n",
       "            return !servers.length ? 0 : import(servers.shift() + path + '.js').catch(loadJsroot).then(() => execCode(JSROOT));\n",
       "         }\n",
       "         loadJsroot();\n",
       "      }\n",
       "   }\n",
       "   process_root_plot_1779221468035();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ROOT import gROOT \n",
    "gROOT.GetListOfCanvases().Draw()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
