{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e6cf992b",
   "metadata": {},
   "source": [
    "# rf201_composite\n",
    "Addition and convolution: composite pdf with signal and background component\n",
    "\n",
    "```\n",
    "pdf = f_bkg * bkg(x,a0,a1) + (1-fbkg) * (f_sig1 * sig1(x,m,s1 + (1-f_sig1) * sig2(x,m,s2)))\n",
    "```\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:**  Clemens Lange, Wouter Verkerke (C++ version)  \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:29 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ecc55586",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:35.755709Z",
     "iopub.status.busy": "2026-05-19T20:29:35.755547Z",
     "iopub.status.idle": "2026-05-19T20:29:36.697884Z",
     "shell.execute_reply": "2026-05-19T20:29:36.697479Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "150bd8b8",
   "metadata": {},
   "source": [
    "Setup component pdfs\n",
    "---------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "07c3f370",
   "metadata": {},
   "source": [
    "Declare observable x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b52a6a9d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:36.700198Z",
     "iopub.status.busy": "2026-05-19T20:29:36.700066Z",
     "iopub.status.idle": "2026-05-19T20:29:36.860490Z",
     "shell.execute_reply": "2026-05-19T20:29:36.859711Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", 0, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72440edb",
   "metadata": {},
   "source": [
    "Create two Gaussian PDFs g1(x,mean1,sigma) anf g2(x,mean2,sigma) and\n",
    "their parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "35aa2ba9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:36.862447Z",
     "iopub.status.busy": "2026-05-19T20:29:36.862317Z",
     "iopub.status.idle": "2026-05-19T20:29:36.990106Z",
     "shell.execute_reply": "2026-05-19T20:29:36.989411Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#0] WARNING:InputArguments -- The parameter 'sigma1' with range [-inf, inf] of the RooGaussian 'sig1' exceeds the safe range of (0, inf). Advise to limit its range.\n",
      "[#0] WARNING:InputArguments -- The parameter 'sigma2' with range [-inf, inf] of the RooGaussian 'sig2' exceeds the safe range of (0, inf). Advise to limit its range.\n"
     ]
    }
   ],
   "source": [
    "mean = ROOT.RooRealVar(\"mean\", \"mean of gaussians\", 5)\n",
    "sigma1 = ROOT.RooRealVar(\"sigma1\", \"width of gaussians\", 0.5)\n",
    "sigma2 = ROOT.RooRealVar(\"sigma2\", \"width of gaussians\", 1)\n",
    "\n",
    "sig1 = ROOT.RooGaussian(\"sig1\", \"Signal component 1\", x, mean, sigma1)\n",
    "sig2 = ROOT.RooGaussian(\"sig2\", \"Signal component 2\", x, mean, sigma2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "924e19b4",
   "metadata": {},
   "source": [
    "Build Chebychev polynomial pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "0427c922",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:36.991637Z",
     "iopub.status.busy": "2026-05-19T20:29:36.991488Z",
     "iopub.status.idle": "2026-05-19T20:29:37.173992Z",
     "shell.execute_reply": "2026-05-19T20:29:37.173321Z"
    }
   },
   "outputs": [],
   "source": [
    "a0 = ROOT.RooRealVar(\"a0\", \"a0\", 0.5, 0.0, 1.0)\n",
    "a1 = ROOT.RooRealVar(\"a1\", \"a1\", -0.2, 0.0, 1.0)\n",
    "bkg = ROOT.RooChebychev(\"bkg\", \"Background\", x, [a0, a1])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "387e201a",
   "metadata": {},
   "source": [
    "Method 1 - Two RooAddPdfs\n",
    "------------------------------------------\n",
    "Add signal components"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0040907c",
   "metadata": {},
   "source": [
    "Sum the signal components into a composite signal pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "86f67f23",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:37.176218Z",
     "iopub.status.busy": "2026-05-19T20:29:37.176091Z",
     "iopub.status.idle": "2026-05-19T20:29:37.288674Z",
     "shell.execute_reply": "2026-05-19T20:29:37.288019Z"
    }
   },
   "outputs": [],
   "source": [
    "sig1frac = ROOT.RooRealVar(\"sig1frac\", \"fraction of component 1 in signal\", 0.8, 0.0, 1.0)\n",
    "sig = ROOT.RooAddPdf(\"sig\", \"Signal\", [sig1, sig2], [sig1frac])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "49921a36",
   "metadata": {},
   "source": [
    "Add signal and background\n",
    "------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "477cc4cf",
   "metadata": {},
   "source": [
    "Sum the composite signal and background"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "73d97a97",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:37.290741Z",
     "iopub.status.busy": "2026-05-19T20:29:37.290591Z",
     "iopub.status.idle": "2026-05-19T20:29:37.394293Z",
     "shell.execute_reply": "2026-05-19T20:29:37.393641Z"
    }
   },
   "outputs": [],
   "source": [
    "bkgfrac = ROOT.RooRealVar(\"bkgfrac\", \"fraction of background\", 0.5, 0.0, 1.0)\n",
    "model = ROOT.RooAddPdf(\"model\", \"g1+g2+a\", [bkg, sig], [bkgfrac])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "530dfcfe",
   "metadata": {},
   "source": [
    "Sample, fit and plot model\n",
    "---------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78b389b1",
   "metadata": {},
   "source": [
    "Generate a data sample of 1000 events in x from model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9a184ee3",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:37.396294Z",
     "iopub.status.busy": "2026-05-19T20:29:37.396165Z",
     "iopub.status.idle": "2026-05-19T20:29:37.541956Z",
     "shell.execute_reply": "2026-05-19T20:29:37.541297Z"
    }
   },
   "outputs": [],
   "source": [
    "data = model.generate({x}, 1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c76a5a1a",
   "metadata": {},
   "source": [
    "Fit model to data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b69288b1",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:37.544099Z",
     "iopub.status.busy": "2026-05-19T20:29:37.543976Z",
     "iopub.status.idle": "2026-05-19T20:29:37.734083Z",
     "shell.execute_reply": "2026-05-19T20:29:37.733446Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(model) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- using generic CPU library compiled with no vectorizations\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 828.944 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooFitResult object at 0x(nil)>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.fitTo(data, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb815db5",
   "metadata": {},
   "source": [
    "Plot data and PDF overlaid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "041f6c6f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:37.736271Z",
     "iopub.status.busy": "2026-05-19T20:29:37.736144Z",
     "iopub.status.idle": "2026-05-19T20:29:37.912410Z",
     "shell.execute_reply": "2026-05-19T20:29:37.911776Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5639e7f95760>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xframe = x.frame(Title=\"Example of composite pdf=(sig1+sig2)+bkg\")\n",
    "data.plotOn(xframe)\n",
    "model.plotOn(xframe)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6c033d9",
   "metadata": {},
   "source": [
    "Overlay the background component of model with a dashed line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "63cfd450",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:37.914586Z",
     "iopub.status.busy": "2026-05-19T20:29:37.914463Z",
     "iopub.status.idle": "2026-05-19T20:29:38.032751Z",
     "shell.execute_reply": "2026-05-19T20:29:38.032101Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsPdf::plotOn(model) directly selected PDF components: (bkg)\n",
      "[#1] INFO:Plotting -- RooAbsPdf::plotOn(model) indirectly selected PDF components: ()\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5639e7f95760>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.plotOn(xframe, Components={bkg}, LineStyle=\"--\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a5786ae",
   "metadata": {},
   "source": [
    "Overlay the background+sig2 components of model with a dotted line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6330f3f9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:38.034971Z",
     "iopub.status.busy": "2026-05-19T20:29:38.034811Z",
     "iopub.status.idle": "2026-05-19T20:29:38.157195Z",
     "shell.execute_reply": "2026-05-19T20:29:38.156433Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsPdf::plotOn(model) directly selected PDF components: (bkg,sig2)\n",
      "[#1] INFO:Plotting -- RooAbsPdf::plotOn(model) indirectly selected PDF components: (sig)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5639e7f95760>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.plotOn(xframe, Components={bkg, sig2}, LineStyle=\":\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a0b25cc",
   "metadata": {},
   "source": [
    "Print structure of composite pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "20c323d7",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:38.158888Z",
     "iopub.status.busy": "2026-05-19T20:29:38.158762Z",
     "iopub.status.idle": "2026-05-19T20:29:38.267932Z",
     "shell.execute_reply": "2026-05-19T20:29:38.267316Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0x5639e795a9a0 RooAddPdf::model = 0.886326/1 [Auto,Clean] \n",
      "  0x5639e780f3f0/V- RooChebychev::bkg = 0.734412 [Auto,Dirty] \n",
      "    0x5639e1cba8f0/V- RooRealVar::x = 5\n",
      "    0x5639e735c370/V- RooRealVar::a0 = 0.506755 +/- 0.0795919\n",
      "    0x5639e709eba0/V- RooRealVar::a1 = 0.265588 +/- 0.133931\n",
      "  0x5639e76ecab0/V- RooRealVar::bkgfrac = 0.428008 +/- 0.0356013\n",
      "  0x5639e7954100/V- RooAddPdf::sig = 1/1 [Auto,Clean] \n",
      "    0x5639e73f4bc0/V- RooGaussian::sig1 = 1 [Auto,Dirty] \n",
      "      0x5639e1cba8f0/V- RooRealVar::x = 5\n",
      "      0x5639e7310280/V- RooRealVar::mean = 5\n",
      "      0x5639e736a9c0/V- RooRealVar::sigma1 = 0.5\n",
      "    0x5639e74331d0/V- RooRealVar::sig1frac = 0.641992 +/- 0.0969095\n",
      "    0x5639e744c7e0/V- RooGaussian::sig2 = 1 [Auto,Dirty] \n",
      "      0x5639e1cba8f0/V- RooRealVar::x = 5\n",
      "      0x5639e7310280/V- RooRealVar::mean = 5\n",
      "      0x5639e730caf0/V- RooRealVar::sigma2 = 1\n"
     ]
    }
   ],
   "source": [
    "model.Print(\"t\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "90efa4e8",
   "metadata": {},
   "source": [
    "Method 2 - One RooAddPdf with recursive fractions\n",
    "---------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7e06666",
   "metadata": {},
   "source": [
    "Construct sum of models on one go using recursive fraction interpretations\n",
    "\n",
    "  model2 = bkg + (sig1 + sig2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "8289a5f9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:38.269535Z",
     "iopub.status.busy": "2026-05-19T20:29:38.269336Z",
     "iopub.status.idle": "2026-05-19T20:29:38.373025Z",
     "shell.execute_reply": "2026-05-19T20:29:38.372416Z"
    }
   },
   "outputs": [],
   "source": [
    "model2 = ROOT.RooAddPdf(\"model\", \"g1+g2+a\", [bkg, sig1, sig2], [bkgfrac, sig1frac], True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3783727d",
   "metadata": {},
   "source": [
    "NB: Each coefficient is interpreted as the fraction of the\n",
    "left-hand component of the i-th recursive sum, i.e.\n",
    "\n",
    "  sum4 = A + ( B + ( C + D)  with fraction fA, and fC expands to\n",
    "\n",
    "  sum4 = fA*A + (1-fA)*(fB*B + (1-fB)*(fC*C + (1-fC)*D))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f385d63",
   "metadata": {},
   "source": [
    "Plot recursive addition model\n",
    "---------------------------------------------------------"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "d1ee2766",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:38.375145Z",
     "iopub.status.busy": "2026-05-19T20:29:38.375022Z",
     "iopub.status.idle": "2026-05-19T20:29:38.492075Z",
     "shell.execute_reply": "2026-05-19T20:29:38.491463Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsPdf::plotOn(model) directly selected PDF components: (bkg,sig2)\n",
      "[#1] INFO:Plotting -- RooAbsPdf::plotOn(model) indirectly selected PDF components: ()\n",
      "0x5639e8033be0 RooAddPdf::model = 0.886326/1 [Auto,Clean] \n",
      "  0x5639e780f3f0/V- RooChebychev::bkg = 0.734412 [Auto,Dirty] \n",
      "    0x5639e1cba8f0/V- RooRealVar::x = 5\n",
      "    0x5639e735c370/V- RooRealVar::a0 = 0.506755 +/- 0.0795919\n",
      "    0x5639e709eba0/V- RooRealVar::a1 = 0.265588 +/- 0.133931\n",
      "  0x5639e76ecab0/V- RooRealVar::bkgfrac = 0.428008 +/- 0.0356013\n",
      "  0x5639e73f4bc0/V- RooGaussian::sig1 = 1 [Auto,Dirty] \n",
      "    0x5639e1cba8f0/V- RooRealVar::x = 5\n",
      "    0x5639e7310280/V- RooRealVar::mean = 5\n",
      "    0x5639e736a9c0/V- RooRealVar::sigma1 = 0.5\n",
      "  0x5639e8208ac0/V- RooRecursiveFraction::model_recursive_fraction_sig1_2 = 0.367214 [Auto,Clean] \n",
      "    0x5639e74331d0/V- RooRealVar::sig1frac = 0.641992 +/- 0.0969095\n",
      "    0x5639e76ecab0/V- RooRealVar::bkgfrac = 0.428008 +/- 0.0356013\n",
      "  0x5639e744c7e0/V- RooGaussian::sig2 = 1 [Auto,Dirty] \n",
      "    0x5639e1cba8f0/V- RooRealVar::x = 5\n",
      "    0x5639e7310280/V- RooRealVar::mean = 5\n",
      "    0x5639e730caf0/V- RooRealVar::sigma2 = 1\n",
      "  0x5639e7faca90/V- RooRecursiveFraction::model_recursive_fraction_sig2_3 = 0.204778 [Auto,Clean] \n",
      "    0x5639e8197a60/V- RooConstVar::1 = 1\n",
      "    0x5639e74331d0/V- RooRealVar::sig1frac = 0.641992 +/- 0.0969095\n",
      "    0x5639e76ecab0/V- RooRealVar::bkgfrac = 0.428008 +/- 0.0356013\n"
     ]
    }
   ],
   "source": [
    "model2.plotOn(xframe, LineColor=\"r\", LineStyle=\"--\")\n",
    "model2.plotOn(xframe, Components={bkg, sig2}, LineColor=\"r\", LineStyle=\"--\")\n",
    "model2.Print(\"t\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3c9f573",
   "metadata": {},
   "source": [
    "Draw the frame on the canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c65d6435",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:38.493749Z",
     "iopub.status.busy": "2026-05-19T20:29:38.493623Z",
     "iopub.status.idle": "2026-05-19T20:29:38.705387Z",
     "shell.execute_reply": "2026-05-19T20:29:38.704662Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf201_composite.png has been created\n"
     ]
    }
   ],
   "source": [
    "c = ROOT.TCanvas(\"rf201_composite\", \"rf201_composite\", 600, 600)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "xframe.GetYaxis().SetTitleOffset(1.4)\n",
    "xframe.Draw()\n",
    "\n",
    "c.SaveAs(\"rf201_composite.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b76335af",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "7c952af4",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:38.707164Z",
     "iopub.status.busy": "2026-05-19T20:29:38.707042Z",
     "iopub.status.idle": "2026-05-19T20:29:38.888018Z",
     "shell.execute_reply": "2026-05-19T20:29:38.887408Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222578878\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222578878() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(40815,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222578878', 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_1779222578878();\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
}
