{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ebf28ac8",
   "metadata": {},
   "source": [
    "# df107_SingleTopAnalysis\n",
    "A single top analysis using the ATLAS Open Data release of 2020, with RDataFrame.\n",
    "\n",
    "This tutorial is the analysis of single top production adapted from the ATLAS Open Data release in 2020\n",
    "(http://opendata.atlas.cern/release/2020/documentation/). The data was recorded with the ATLAS detector\n",
    "during 2016 at a center-of-mass energy of 13 TeV. Top quarks with a mass of about 172 GeV are mostly\n",
    "produced in pairs but also appear alone, dominantly from the decays of a W boson in association with a light jet.\n",
    "\n",
    "The analysis is translated to a RDataFrame workflow processing up to 60 GB of simulated events and data.\n",
    "By default the analysis runs on a preskimmed dataset to reduce the runtime. The full dataset can be used with\n",
    "the --full-dataset argument and you can also run only on a fraction of the original dataset using the argument --lumi-scale.\n",
    "\n",
    "See the [corresponding spec json file](https://github.com/root-project/root/blob/master/tutorials/analysis/dataframe/df107_SingleTopAnalysis.json).\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:** Stefan Wunsch (KIT, 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": "4f7bf302",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:49.535104Z",
     "iopub.status.busy": "2026-05-19T20:10:49.534936Z",
     "iopub.status.idle": "2026-05-19T20:10:50.509469Z",
     "shell.execute_reply": "2026-05-19T20:10:50.508814Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT\n",
    "import sys\n",
    "import json\n",
    "import argparse\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "49816b97",
   "metadata": {},
   "source": [
    "Argument parsing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c49b2cf6",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:50.519347Z",
     "iopub.status.busy": "2026-05-19T20:10:50.519193Z",
     "iopub.status.idle": "2026-05-19T20:10:50.632764Z",
     "shell.execute_reply": "2026-05-19T20:10:50.631745Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Run on data corresponding to 0.5 fb^-1 ...\n"
     ]
    }
   ],
   "source": [
    "parser = argparse.ArgumentParser()\n",
    "parser.add_argument(\"--lumi-scale\", type=float, default=0.05,\n",
    "                    help=\"Run only on a fraction of the total available 10 fb^-1 (only usable together with --full-dataset)\")\n",
    "parser.add_argument(\"--full-dataset\", action=\"store_true\", default=False,\n",
    "                    help=\"Use the full dataset (use --lumi-scale to run only on a fraction of it)\")\n",
    "parser.add_argument(\"-b\", action=\"store_true\", default=False, help=\"Use ROOT batch mode\")\n",
    "parser.add_argument(\"-t\", action=\"store_true\", default=False, help=\"Use implicit multi threading (for the full dataset only possible with --lumi-scale 1.0)\")\n",
    "if 'df107_SingleTopAnalysis.py' in sys.argv[0]:\n",
    "    # Script\n",
    "    args = parser.parse_args()\n",
    "else:\n",
    "    # Notebook\n",
    "    args = parser.parse_args(args=[])\n",
    "\n",
    "if args.b: ROOT.gROOT.SetBatch(True)\n",
    "if args.t: ROOT.EnableImplicitMT()\n",
    "\n",
    "if not args.full_dataset: lumi_scale = 0.05 # The preskimmed dataset contains only 0.5 fb^-1\n",
    "else: lumi_scale = args.lumi_scale\n",
    "lumi = 10064.0\n",
    "print('Run on data corresponding to {:.1f} fb^-1 ...'.format(lumi * lumi_scale / 1000.0))\n",
    "\n",
    "if args.full_dataset: dataset_path = \"root://eospublic.cern.ch//eos/opendata/atlas/OutreachDatasets/2020-01-22\"\n",
    "else: dataset_path = \"root://eospublic.cern.ch//eos/root-eos/reduced_atlas_opendata/singletop\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3354670a",
   "metadata": {},
   "source": [
    "Create a ROOT dataframe for each dataset\n",
    "Note that we load the filenames from the external json file placed in the same folder than this script."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "65f0119c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:50.654406Z",
     "iopub.status.busy": "2026-05-19T20:10:50.654247Z",
     "iopub.status.idle": "2026-05-19T20:10:54.236451Z",
     "shell.execute_reply": "2026-05-19T20:10:54.236079Z"
    }
   },
   "outputs": [],
   "source": [
    "files = json.load(open(os.path.join(ROOT.gROOT.GetTutorialsDir(), \"analysis/dataframe/df107_SingleTopAnalysis.json\")))\n",
    "processes = files.keys()\n",
    "df = {}\n",
    "xsecs = {}\n",
    "sumws = {}\n",
    "samples = []\n",
    "for p in processes:\n",
    "    for d in files[p]:\n",
    "        # Construct the dataframes\n",
    "        folder = d[0] # Folder name\n",
    "        sample = d[1] # Sample name\n",
    "        xsecs[sample] = d[2] # Cross-section\n",
    "        sumws[sample] = d[3] # Sum of weights\n",
    "        num_events = d[4] # Number of events\n",
    "        samples.append(sample)\n",
    "        df[sample] = ROOT.RDataFrame(\"mini\", \"{}/1lep/{}/{}.1lep.root\".format(dataset_path, folder, sample))\n",
    "\n",
    "        # Scale down the datasets if requested\n",
    "        if args.full_dataset and lumi_scale < 1.0:\n",
    "            df[sample] = df[sample].Range(int(num_events * lumi_scale))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d951c154",
   "metadata": {},
   "source": [
    "Select events for the analysis and make histograms of the top mass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dce251f2",
   "metadata": {},
   "source": [
    "Just-in-time compile custom helper function performing complex computations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9d6da17c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:54.241897Z",
     "iopub.status.busy": "2026-05-19T20:10:54.241763Z",
     "iopub.status.idle": "2026-05-19T20:10:54.621250Z",
     "shell.execute_reply": "2026-05-19T20:10:54.615818Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gInterpreter.Declare(\"\"\"\n",
    "using cRVecF = const ROOT::RVecF &;\n",
    "using cRVecI = const ROOT::RVecI &;\n",
    "int FindGoodLepton(cRVecI goodlep, cRVecI type, cRVecF lep_pt, cRVecF lep_eta, cRVecF lep_phi, cRVecF lep_e, cRVecF trackd0pv, cRVecF tracksigd0pv, cRVecF z0)\n",
    "{\n",
    "    int idx = -1; // Return -1 if no good lepton is found.\n",
    "    for(auto i = 0; i < type.size(); i++) {\n",
    "        if(!goodlep[i]) continue;\n",
    "        if (type[i] == 11 && abs(lep_eta[i]) < 2.47 && (abs(lep_eta[i]) < 1.37 || abs(lep_eta[i]) > 1.52) && abs(trackd0pv[i] / tracksigd0pv[i]) < 5) {\n",
    "            const ROOT::Math::PtEtaPhiEVector p(lep_pt[i], lep_eta[i], lep_phi[i], lep_e[i]);\n",
    "            if (abs(z0[i] * sin(p.Theta())) < 0.5) {\n",
    "                if (idx == -1) idx = i;\n",
    "                else return -1; // Accept only events with exactly one good lepton\n",
    "            }\n",
    "        }\n",
    "        if (type[i] == 13 && abs(lep_eta[i]) < 2.5 && abs(trackd0pv[i] / tracksigd0pv[i]) < 3) {\n",
    "            const ROOT::Math::PtEtaPhiEVector p(lep_pt[i], lep_eta[i], lep_phi[i], lep_e[i]);\n",
    "            if (abs(z0[i] * sin(p.Theta())) < 0.5) {\n",
    "                if (idx == -1) idx = i;\n",
    "                else return -1; // Accept only events with exactly one good lepton\n",
    "            }\n",
    "        }\n",
    "    }\n",
    "    return idx;\n",
    "}\n",
    "\"\"\")\n",
    "\n",
    "for s in samples:\n",
    "    # Select events with electron or muon trigger and with a missing transverse energy above 30 GeV\n",
    "    df[s] = df[s].Filter(\"trigE || trigM\")\\\n",
    "                 .Filter(\"met_et > 30000\")\n",
    "\n",
    "    # Perform preselection of highly isolated leptons\n",
    "    df[s] = df[s].Define(\"goodlep\", \"lep_isTightID && lep_pt > 35000 && lep_ptcone30 / lep_pt < 0.1 && lep_etcone20 / lep_pt < 0.1\")\\\n",
    "                 .Filter(\"ROOT::VecOps::Sum(goodlep) > 0\")\n",
    "\n",
    "    # Find a single good lepton, otherwise return -1 as index\n",
    "    df[s] = df[s].Define(\"idx_lep\", \"FindGoodLepton(goodlep, lep_type, lep_pt, lep_eta, lep_phi, lep_E, lep_trackd0pvunbiased, lep_tracksigd0pvunbiased, lep_z0)\")\\\n",
    "                 .Filter(\"idx_lep != -1\")\n",
    "\n",
    "    # Compute transverse mass of the W boson using the missing transverse energy and the good lepton\n",
    "    # Use only events with a transverse mass of the reconstructed W boson larger than 60 GeV\n",
    "    df[s] = df[s].Define(\"mtw\", \"sqrt(2 * lep_pt[idx_lep] * met_et * (1 - cos(lep_phi[idx_lep] - met_phi)))\")\\\n",
    "                 .Filter(\"mtw > 60000\")\n",
    "\n",
    "    # Perform preselection of jets\n",
    "    df[s] = df[s].Filter(\"ROOT::VecOps::Sum(jet_pt > 30000 && abs(jet_eta) < 2.5) > 0\")\n",
    "\n",
    "    # Select events with two good jets and one b-jet and find the indices in the collections\n",
    "    df[s] = df[s].Define(\"goodjet\", \"jet_pt > 60000 || abs(jet_eta) > 2.4 || jet_jvt > 0.59\")\\\n",
    "                 .Filter(\"ROOT::VecOps::Sum(goodjet) == 2\")\\\n",
    "                 .Define(\"goodbjet\", \"goodjet && jet_MV2c10 > 0.8244273\")\\\n",
    "                 .Filter(\"ROOT::VecOps::Sum(goodbjet) == 1\")\\\n",
    "                 .Define(\"idx_tagged\", \"ROOT::VecOps::ArgMax(goodjet && goodbjet)\")\\\n",
    "                 .Define(\"idx_untagged\", \"ROOT::VecOps::ArgMax(goodjet && !goodbjet)\")\n",
    "\n",
    "    # Select events based on the jet kinematics and the scalar sum of the transverse momentum\n",
    "    # from the lepton, jets and met above 195 GeV\n",
    "    df[s] = df[s].Filter(\"abs(jet_eta[idx_untagged]) > 1.5 && abs(jet_eta[idx_tagged] - jet_eta[idx_untagged]) > 1.5\")\\\n",
    "                 .Filter(\"lep_pt[idx_lep] + jet_pt[idx_tagged] + jet_pt[idx_untagged] + met_et > 195000\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98e01926",
   "metadata": {},
   "source": [
    "Compute luminosity, scale factors and MC weights for simulated events"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "8cee0859",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:54.624028Z",
     "iopub.status.busy": "2026-05-19T20:10:54.623878Z",
     "iopub.status.idle": "2026-05-19T20:10:54.765472Z",
     "shell.execute_reply": "2026-05-19T20:10:54.764966Z"
    }
   },
   "outputs": [],
   "source": [
    "for s in samples:\n",
    "    if \"data\" in s:\n",
    "        df[s] = df[s].Define(\"weight\", \"1.0\")\n",
    "    else:\n",
    "        # The single top MC weights are either 1 or -1\n",
    "        if \"single\" in s: stop_norm = \"mcWeight / abs(mcWeight)\"\n",
    "        else: stop_norm = \"mcWeight\"\n",
    "        df[s] = df[s].Define(\"weight\", \"scaleFactor_ELE * scaleFactor_MUON * scaleFactor_LepTRIGGER * scaleFactor_PILEUP * scaleFactor_BTAG * {} * {} / {} * {}\".format(stop_norm, xsecs[s], sumws[s], lumi))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ccceb51c",
   "metadata": {},
   "source": [
    "Reconstruct the top mass from the lepton, the missing transverse energy and the b-jet"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c921d009",
   "metadata": {},
   "source": [
    "Just-in-time compile the function to compute the top mass from the constituents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "56259245",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:54.767067Z",
     "iopub.status.busy": "2026-05-19T20:10:54.766943Z",
     "iopub.status.idle": "2026-05-19T20:10:55.018957Z",
     "shell.execute_reply": "2026-05-19T20:10:55.017772Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gInterpreter.Declare(\"\"\"\n",
    "float ComputeTopMass(float lep_pt, float lep_eta, float lep_phi, float lep_e, float jet_pt, float jet_eta, float jet_phi, float jet_e, float met_et, float met_phi)\n",
    "{\n",
    "    const ROOT::Math::PtEtaPhiEVector lep(lep_pt / 1000.0, lep_eta, lep_phi, lep_e / 1000.0);\n",
    "    const ROOT::Math::PtEtaPhiEVector met(met_et / 1000.0, 0, met_phi, met_et / 1000.0);\n",
    "    const ROOT::Math::PtEtaPhiEVector bjet(jet_pt / 1000.0, jet_eta, jet_phi, jet_e / 1000.0);\n",
    "    // Please note that we treat here the missing transverse energy as the neutrino, even though the z component is missing!\n",
    "    return (lep + met + bjet).M();\n",
    "}\n",
    "\"\"\")\n",
    "\n",
    "histos = {}\n",
    "for s in samples:\n",
    "    df[s] = df[s].Define(\"top_mass\", \"ComputeTopMass(lep_pt[idx_lep], lep_eta[idx_lep], lep_phi[idx_lep], lep_E[idx_lep], jet_pt[idx_tagged], jet_eta[idx_tagged], jet_phi[idx_tagged], jet_E[idx_tagged], met_et, met_phi)\")\n",
    "    histos[s] = df[s].Histo1D(ROOT.RDF.TH1DModel(\"top_mass\", \"\", 10, 100, 400), \"top_mass\", \"weight\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ccec0e85",
   "metadata": {},
   "source": [
    "Run the event loop and merge histograms of the respective processes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e613ffe7",
   "metadata": {},
   "source": [
    "RunGraphs allows to run the event loops of the separate RDataFrame graphs\n",
    "concurrently. This results in an improved usage of the available resources\n",
    "if each separate RDataFrame can not utilize all available resources, e.g.,\n",
    "because not enough data is available."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d89eabae",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:55.020462Z",
     "iopub.status.busy": "2026-05-19T20:10:55.020339Z",
     "iopub.status.idle": "2026-05-19T20:11:10.247842Z",
     "shell.execute_reply": "2026-05-19T20:11:10.247426Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.RDF.RunGraphs([histos[s] for s in samples])\n",
    "\n",
    "def merge_histos(label):\n",
    "    h = None\n",
    "    for i, d in enumerate(files[label]):\n",
    "        t = histos[d[1]].GetValue()\n",
    "        if i == 0: h = t.Clone()\n",
    "        else: h.Add(t)\n",
    "    h.SetNameTitle(label, label)\n",
    "    return h\n",
    "\n",
    "data = merge_histos(\"data\")\n",
    "twtb = merge_histos(\"twtb\")\n",
    "singletop = merge_histos(\"singletop\")\n",
    "wjets = merge_histos(\"wjets\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "88766ae9",
   "metadata": {},
   "source": [
    "Create the plot"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "072e6a2b",
   "metadata": {},
   "source": [
    "Set styles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3f36f178",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:10.272870Z",
     "iopub.status.busy": "2026-05-19T20:11:10.272700Z",
     "iopub.status.idle": "2026-05-19T20:11:10.380706Z",
     "shell.execute_reply": "2026-05-19T20:11:10.380302Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gROOT.SetStyle(\"ATLAS\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2530dab",
   "metadata": {},
   "source": [
    "Create canvas with pad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a45f8dc7",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:10.391432Z",
     "iopub.status.busy": "2026-05-19T20:11:10.391282Z",
     "iopub.status.idle": "2026-05-19T20:11:10.578419Z",
     "shell.execute_reply": "2026-05-19T20:11:10.559868Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.TPad object at 0x55992c829be0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = 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": "90f07e7d",
   "metadata": {},
   "source": [
    "Draw stack with MC contributions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "432b05a2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:10.596036Z",
     "iopub.status.busy": "2026-05-19T20:11:10.595856Z",
     "iopub.status.idle": "2026-05-19T20:11:10.990703Z",
     "shell.execute_reply": "2026-05-19T20:11:10.965654Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221470909\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221470909() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(35160,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221470909', 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_1779221470909();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "stack = ROOT.THStack()\n",
    "wjets.Scale(1.1) # Corrected normalization derived from a validation region\n",
    "for h, color in zip(\n",
    "        [wjets, twtb, singletop],\n",
    "        [(0.87, 0.35, 0.42), (0.61, 0.6, 0.8), (0.82, 0.94, 0.76)]):\n",
    "    h.SetLineWidth(1)\n",
    "    h.SetLineColor(\"black\")\n",
    "    h.SetFillColor(ROOT.TColor.GetColor(*color))\n",
    "    # From Python 3.11 onward, implicit conversion of the tuple works too:\n",
    "    # h.SetFillColor(color)\n",
    "    stack.Add(h)\n",
    "stack.Draw(\"HIST\")\n",
    "stack.GetXaxis().SetTitle(\"m_{W(l#nu)+b} [GeV]\")\n",
    "stack.GetYaxis().SetTitle(\"Events\")\n",
    "stack.GetYaxis().SetLabelSize(0.04)\n",
    "stack.GetYaxis().SetTitleSize(0.045)\n",
    "stack.GetXaxis().SetLabelSize(0.04)\n",
    "stack.GetXaxis().SetTitleSize(0.045)\n",
    "stack.SetMinimum(0)\n",
    "stack.SetMaximum(5000 * lumi_scale)\n",
    "stack.GetYaxis().ChangeLabel(1, -1, 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "492fbfd5",
   "metadata": {},
   "source": [
    "Draw data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "68b8e75c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:11.018380Z",
     "iopub.status.busy": "2026-05-19T20:11:11.018176Z",
     "iopub.status.idle": "2026-05-19T20:11:11.174828Z",
     "shell.execute_reply": "2026-05-19T20:11:11.153375Z"
    }
   },
   "outputs": [],
   "source": [
    "data.SetMarkerStyle(20)\n",
    "data.SetMarkerSize(1.2)\n",
    "data.SetLineWidth(2)\n",
    "data.SetLineColor(\"black\")\n",
    "data.Draw(\"E SAME\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ab3d79b",
   "metadata": {},
   "source": [
    "Add legend"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8db8f447",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:11.204521Z",
     "iopub.status.busy": "2026-05-19T20:11:11.204356Z",
     "iopub.status.idle": "2026-05-19T20:11:11.376053Z",
     "shell.execute_reply": "2026-05-19T20:11:11.354376Z"
    }
   },
   "outputs": [],
   "source": [
    "legend = ROOT.TLegend(0.60, 0.65, 0.92, 0.92)\n",
    "legend.SetTextFont(42)\n",
    "legend.SetFillStyle(0)\n",
    "legend.SetBorderSize(0)\n",
    "legend.SetTextSize(0.035)\n",
    "legend.SetTextAlign(32)\n",
    "legend.AddEntry(data, \"Data\" ,\"lep\")\n",
    "legend.AddEntry(singletop, \"Single top + jet\", \"f\")\n",
    "legend.AddEntry(twtb, \"t#bar{t},Wt,t#bar{b}\", \"f\")\n",
    "legend.AddEntry(wjets, \"W+jets\", \"f\")\n",
    "legend.Draw(\"SAME\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57803375",
   "metadata": {},
   "source": [
    "Add ATLAS label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "3d5bad68",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:11.406231Z",
     "iopub.status.busy": "2026-05-19T20:11:11.406040Z",
     "iopub.status.idle": "2026-05-19T20:11:11.552899Z",
     "shell.execute_reply": "2026-05-19T20:11:11.551364Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.TLatex object at 0x559934c02030>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text = ROOT.TLatex()\n",
    "text.SetNDC()\n",
    "text.SetTextFont(72)\n",
    "text.SetTextSize(0.045)\n",
    "text.DrawLatex(0.21, 0.86, \"ATLAS\")\n",
    "text.SetTextFont(42)\n",
    "text.DrawLatex(0.21 + 0.16, 0.86, \"Open Data\")\n",
    "text.SetTextSize(0.04)\n",
    "text.DrawLatex(0.21, 0.80, \"#sqrt{{s}} = 13 TeV, {:.1f} fb^{{-1}}\".format(lumi * lumi_scale / 1000.0))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3c8a69d",
   "metadata": {},
   "source": [
    "Save the plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "58395dee",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:11.570388Z",
     "iopub.status.busy": "2026-05-19T20:11:11.570234Z",
     "iopub.status.idle": "2026-05-19T20:11:11.722829Z",
     "shell.execute_reply": "2026-05-19T20:11:11.722504Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file df107_SingleTopAnalysis.png has been created\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved figure to df107_SingleTopAnalysis.png\n"
     ]
    }
   ],
   "source": [
    "c.SaveAs(\"df107_SingleTopAnalysis.png\")\n",
    "print(\"Saved figure to df107_SingleTopAnalysis.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d502a02",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f3d39653",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:11.732807Z",
     "iopub.status.busy": "2026-05-19T20:11:11.732661Z",
     "iopub.status.idle": "2026-05-19T20:11:11.849388Z",
     "shell.execute_reply": "2026-05-19T20:11:11.846798Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221471844\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221471844() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(40335,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221471844', 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_1779221471844();\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
}
