{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "069b7706",
   "metadata": {},
   "source": [
    "# df105_WBosonAnalysis\n",
    "The W boson mass analysis from the ATLAS Open Data release of 2020, with RDataFrame.\n",
    "\n",
    "This tutorial is the analysis of the W boson mass taken 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. W bosons are produced frequently at the LHC and\n",
    "are an important background to studies of Standard Model processes, for example the Higgs boson analyses.\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/df105_WBosonAnalysis.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": "6cae8064",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:33.391495Z",
     "iopub.status.busy": "2026-05-19T20:10:33.391354Z",
     "iopub.status.idle": "2026-05-19T20:10:34.409819Z",
     "shell.execute_reply": "2026-05-19T20:10:34.388422Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT\n",
    "import sys\n",
    "import json\n",
    "import argparse\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4614e7b2",
   "metadata": {},
   "source": [
    "Argument parsing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "dceb767b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:34.437083Z",
     "iopub.status.busy": "2026-05-19T20:10:34.436907Z",
     "iopub.status.idle": "2026-05-19T20:10:34.579115Z",
     "shell.execute_reply": "2026-05-19T20:10:34.570366Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Run on data corresponding to 0.01 fb^-1 ...\n"
     ]
    }
   ],
   "source": [
    "parser = argparse.ArgumentParser()\n",
    "parser.add_argument(\"--lumi-scale\", type=float, default=0.001,\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 'df105_WBosonAnalysis.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.001 # The preskimmed dataset contains only 0.01 fb^-1\n",
    "else: lumi_scale = args.lumi_scale\n",
    "lumi = 10064.0\n",
    "print('Run on data corresponding to {:.2f} 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/w\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e7d3ad3",
   "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": "75d89d35",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:34.580936Z",
     "iopub.status.busy": "2026-05-19T20:10:34.580799Z",
     "iopub.status.idle": "2026-05-19T20:10:48.052326Z",
     "shell.execute_reply": "2026-05-19T20:10:48.041538Z"
    }
   },
   "outputs": [],
   "source": [
    "files = json.load(open(os.path.join(ROOT.gROOT.GetTutorialsDir(), \"analysis/dataframe/df105_WBosonAnalysis.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": "9111f925",
   "metadata": {},
   "source": [
    "Select events for the analysis"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a43f56e7",
   "metadata": {},
   "source": [
    "Just-in-time compile custom helper function performing complex computations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b9509643",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:48.070557Z",
     "iopub.status.busy": "2026-05-19T20:10:48.070395Z",
     "iopub.status.idle": "2026-05-19T20:10:48.585245Z",
     "shell.execute_reply": "2026-05-19T20:10:48.584483Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gInterpreter.Declare(\"\"\"\n",
    "bool GoodElectronOrMuon(int type, float pt, float eta, float phi, float e, float trackd0pv, float tracksigd0pv, float z0)\n",
    "{\n",
    "    ROOT::Math::PtEtaPhiEVector p(pt / 1000.0, eta, phi, e / 1000.0);\n",
    "    if (abs(z0 * sin(p.theta())) > 0.5) return false;\n",
    "    if (type == 11 && abs(eta) < 2.46 && (abs(eta) < 1.37 || abs(eta) > 1.52)) {\n",
    "        if (abs(trackd0pv / tracksigd0pv) > 5) return false;\n",
    "        return true;\n",
    "    }\n",
    "    if (type == 13 && abs(eta) < 2.5) {\n",
    "        if (abs(trackd0pv / tracksigd0pv) > 3) return false;\n",
    "        return true;\n",
    "    }\n",
    "    return false;\n",
    "}\n",
    "\"\"\")\n",
    "\n",
    "for s in samples:\n",
    "    # Select events with a muon or electron trigger and with a missing transverse energy larger than 30 GeV\n",
    "    df[s] = df[s].Filter(\"trigE || trigM\")\\\n",
    "                 .Filter(\"met_et > 30000\")\n",
    "\n",
    "    # Find events with exactly one good lepton\n",
    "    df[s] = df[s].Define(\"good_lep\", \"lep_isTightID && lep_pt > 35000 && lep_ptcone30 / lep_pt < 0.1 && lep_etcone20 / lep_pt < 0.1\")\\\n",
    "                 .Filter(\"ROOT::VecOps::Sum(good_lep) == 1\")\n",
    "\n",
    "    # Apply additional cuts in case the lepton is an electron or muon\n",
    "    df[s] = df[s].Define(\"idx\", \"ROOT::VecOps::ArgMax(good_lep)\")\\\n",
    "                 .Filter(\"GoodElectronOrMuon(lep_type[idx], lep_pt[idx], lep_eta[idx], lep_phi[idx], lep_E[idx], lep_trackd0pvunbiased[idx], lep_tracksigd0pvunbiased[idx], lep_z0[idx])\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b826e0c1",
   "metadata": {},
   "source": [
    "Apply luminosity, scale factors and MC weights for simulated events"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "7e95628f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:48.587275Z",
     "iopub.status.busy": "2026-05-19T20:10:48.587137Z",
     "iopub.status.idle": "2026-05-19T20:10:48.737572Z",
     "shell.execute_reply": "2026-05-19T20:10:48.737035Z"
    }
   },
   "outputs": [],
   "source": [
    "for s in samples:\n",
    "    if \"data\" in s:\n",
    "        df[s] = df[s].Define(\"weight\", \"1.0\")\n",
    "    else:\n",
    "        df[s] = df[s].Define(\"weight\", \"scaleFactor_ELE * scaleFactor_MUON * scaleFactor_LepTRIGGER * scaleFactor_PILEUP * mcWeight * {} / {} * {}\".format(xsecs[s], sumws[s], lumi))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "974dc134",
   "metadata": {},
   "source": [
    "Compute transverse mass of the W boson using the lepton and the missing transverse energy and make a histogram"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "d34f36f7",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:48.752459Z",
     "iopub.status.busy": "2026-05-19T20:10:48.752308Z",
     "iopub.status.idle": "2026-05-19T20:10:49.130994Z",
     "shell.execute_reply": "2026-05-19T20:10:49.121363Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gInterpreter.Declare(\"\"\"\n",
    "float ComputeTransverseMass(float met_et, float met_phi, float lep_pt, float lep_eta, float lep_phi, float lep_e)\n",
    "{\n",
    "    ROOT::Math::PtEtaPhiEVector met(met_et, 0, met_phi, met_et);\n",
    "    ROOT::Math::PtEtaPhiEVector lep(lep_pt, lep_eta, lep_phi, lep_e);\n",
    "    return (met + lep).Mt() / 1000.0;\n",
    "}\n",
    "\"\"\")\n",
    "\n",
    "histos = {}\n",
    "for s in samples:\n",
    "    df[s] = df[s].Define(\"mt_w\", \"ComputeTransverseMass(met_et, met_phi, lep_pt[idx], lep_eta[idx], lep_phi[idx], lep_E[idx])\")\n",
    "    histos[s] = df[s].Histo1D(ROOT.RDF.TH1DModel(s, \"mt_w\", 24, 60, 180), \"mt_w\", \"weight\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "96c5f325",
   "metadata": {},
   "source": [
    "Run the event loop and merge histograms of the respective processes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c30b2995",
   "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": "e4d56155",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:49.153621Z",
     "iopub.status.busy": "2026-05-19T20:10:49.153454Z",
     "iopub.status.idle": "2026-05-19T20:10:53.162367Z",
     "shell.execute_reply": "2026-05-19T20:10:53.161764Z"
    }
   },
   "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",
    "wjets = merge_histos(\"wjets\")\n",
    "zjets = merge_histos(\"zjets\")\n",
    "ttbar = merge_histos(\"ttbar\")\n",
    "diboson = merge_histos(\"diboson\")\n",
    "singletop = merge_histos(\"singletop\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33667c9b",
   "metadata": {},
   "source": [
    "Create the plot"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08fbca6c",
   "metadata": {},
   "source": [
    "Set styles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d3600a07",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.165424Z",
     "iopub.status.busy": "2026-05-19T20:10:53.165278Z",
     "iopub.status.idle": "2026-05-19T20:10:53.273306Z",
     "shell.execute_reply": "2026-05-19T20:10:53.272636Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gROOT.SetStyle(\"ATLAS\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ac53257",
   "metadata": {},
   "source": [
    "Create canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "53bf14cc",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.275042Z",
     "iopub.status.busy": "2026-05-19T20:10:53.274914Z",
     "iopub.status.idle": "2026-05-19T20:10:53.417460Z",
     "shell.execute_reply": "2026-05-19T20:10:53.416849Z"
    }
   },
   "outputs": [],
   "source": [
    "c = ROOT.TCanvas(\"c\", \"\", 600, 600)\n",
    "c.SetTickx(0)\n",
    "c.SetTicky(0)\n",
    "c.SetLogy()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8532cb8",
   "metadata": {},
   "source": [
    "Draw stack with MC contributions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "51ac18e1",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.421213Z",
     "iopub.status.busy": "2026-05-19T20:10:53.421068Z",
     "iopub.status.idle": "2026-05-19T20:10:53.644851Z",
     "shell.execute_reply": "2026-05-19T20:10:53.643279Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221453630\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221453630() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(47085,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221453630', 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_1779221453630();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "stack = ROOT.THStack()\n",
    "for h, color in zip(\n",
    "        [singletop, diboson, ttbar, zjets, wjets],\n",
    "        [(0.82, 0.94, 0.76), (0.76, 0.54, 0.57), (0.61, 0.6, 0.8), (0.97, 0.81, 0.41), (0.87, 0.35, 0.42)]):\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().SetLabelSize(0.04)\n",
    "stack.GetXaxis().SetTitleSize(0.045)\n",
    "stack.GetXaxis().SetTitleOffset(1.3)\n",
    "stack.GetXaxis().SetTitle(\"m_{T}^{W#rightarrow l#nu} [GeV]\")\n",
    "stack.GetYaxis().SetTitle(\"Events\")\n",
    "stack.GetYaxis().SetLabelSize(0.04)\n",
    "stack.GetYaxis().SetTitleSize(0.045)\n",
    "stack.SetMaximum(1e10 * args.lumi_scale)\n",
    "stack.SetMinimum(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1e55050",
   "metadata": {},
   "source": [
    "Draw data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "85ac5103",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.657264Z",
     "iopub.status.busy": "2026-05-19T20:10:53.657127Z",
     "iopub.status.idle": "2026-05-19T20:10:53.771981Z",
     "shell.execute_reply": "2026-05-19T20:10:53.771472Z"
    }
   },
   "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": "20e5db40",
   "metadata": {},
   "source": [
    "Add legend"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b80dfb47",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.775149Z",
     "iopub.status.busy": "2026-05-19T20:10:53.775017Z",
     "iopub.status.idle": "2026-05-19T20:10:53.910416Z",
     "shell.execute_reply": "2026-05-19T20:10:53.909889Z"
    }
   },
   "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.04)\n",
    "legend.SetTextAlign(32)\n",
    "legend.AddEntry(data, \"Data\" ,\"lep\")\n",
    "legend.AddEntry(wjets, \"W+jets\", \"f\")\n",
    "legend.AddEntry(zjets, \"Z+jets\", \"f\")\n",
    "legend.AddEntry(ttbar, \"t#bar{t}\", \"f\")\n",
    "legend.AddEntry(diboson, \"Diboson\", \"f\")\n",
    "legend.AddEntry(singletop, \"Single top\", \"f\")\n",
    "legend.Draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff64d777",
   "metadata": {},
   "source": [
    "Add ATLAS label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9512b121",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.911807Z",
     "iopub.status.busy": "2026-05-19T20:10:53.911682Z",
     "iopub.status.idle": "2026-05-19T20:10:54.040177Z",
     "shell.execute_reply": "2026-05-19T20:10:54.039447Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.TLatex object at 0x557dcd601860>"
      ]
     },
     "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, {:.2f} fb^{{-1}}\".format(lumi * args.lumi_scale / 1000.0))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac2abf2e",
   "metadata": {},
   "source": [
    "Save the plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7e2221d2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:54.045210Z",
     "iopub.status.busy": "2026-05-19T20:10:54.045076Z",
     "iopub.status.idle": "2026-05-19T20:10:54.226355Z",
     "shell.execute_reply": "2026-05-19T20:10:54.225692Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file df105_WBosonAnalysis.png has been created\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved figure to df105_WBosonAnalysis.png\n"
     ]
    }
   ],
   "source": [
    "c.SaveAs(\"df105_WBosonAnalysis.png\")\n",
    "print(\"Saved figure to df105_WBosonAnalysis.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d405eea",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "da72ac97",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:54.233084Z",
     "iopub.status.busy": "2026-05-19T20:10:54.232948Z",
     "iopub.status.idle": "2026-05-19T20:10:54.356891Z",
     "shell.execute_reply": "2026-05-19T20:10:54.349332Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221454346\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221454346() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(52964,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221454346', 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_1779221454346();\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
}
