{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "799c83ca",
   "metadata": {},
   "source": [
    "# rf612_recoverFromInvalidParameters\n",
    "Likelihood and minimization: Recover from regions where the function is not defined.\n",
    "\n",
    "We demonstrate improved recovery from disallowed parameters. For this, we use a polynomial PDF of the form\n",
    "  \\mathrm{Pol2} = \\mathcal{N} \\left( c + a_1 \\cdot x + a_2 \\cdot x^2 + 0.01 \\cdot x^3 \\right),\n",
    "where \\f$ \\mathcal{N} \\f$ is a normalisation factor. Unless the parameters are chosen carefully,\n",
    "this function can be negative, and hence, it cannot be used as a PDF. In this case, RooFit passes\n",
    "an error to the minimiser, which might try to recover.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:** Harshal Shende, Stephan Hageboeck (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:33 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9b5d90e1",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:40.599075Z",
     "iopub.status.busy": "2026-05-19T20:33:40.598961Z",
     "iopub.status.idle": "2026-05-19T20:33:41.540273Z",
     "shell.execute_reply": "2026-05-19T20:33:41.539466Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "958b3d7e",
   "metadata": {},
   "source": [
    "Create a fit model:\n",
    "The polynomial is notoriously unstable, because it can quickly go negative.\n",
    "Since PDFs need to be positive, one often ends up with an unstable fit model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9e9b85bb",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:41.542423Z",
     "iopub.status.busy": "2026-05-19T20:33:41.542292Z",
     "iopub.status.idle": "2026-05-19T20:33:41.797201Z",
     "shell.execute_reply": "2026-05-19T20:33:41.796465Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", -15, 15)\n",
    "a1 = ROOT.RooRealVar(\"a1\", \"a1\", -0.5, -10.0, 20.0)\n",
    "a2 = ROOT.RooRealVar(\"a2\", \"a2\", 0.2, -10.0, 20.0)\n",
    "a3 = ROOT.RooRealVar(\"a3\", \"a3\", 0.01)\n",
    "pdf = ROOT.RooPolynomial(\"pol3\", \"c + a1 * x + a2 * x*x + 0.01 * x*x*x\", x, [a1, a2, a3])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0a443a8",
   "metadata": {},
   "source": [
    "Create toy data with all-positive coefficients:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "be8e738f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:41.799319Z",
     "iopub.status.busy": "2026-05-19T20:33:41.799194Z",
     "iopub.status.idle": "2026-05-19T20:33:41.945381Z",
     "shell.execute_reply": "2026-05-19T20:33:41.944652Z"
    }
   },
   "outputs": [],
   "source": [
    "data = pdf.generate(x, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34757ae0",
   "metadata": {},
   "source": [
    "For plotting.\n",
    "We create pointers to the plotted objects. We want these objects to leak out of the function,\n",
    "so we can still see them after it returns."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2fed161b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:41.947395Z",
     "iopub.status.busy": "2026-05-19T20:33:41.947267Z",
     "iopub.status.idle": "2026-05-19T20:33:42.119199Z",
     "shell.execute_reply": "2026-05-19T20:33:42.118392Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x559ed39d6840>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = ROOT.TCanvas()\n",
    "frame = x.frame()\n",
    "data.plotOn(frame, Name=\"data\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a6a330ac",
   "metadata": {},
   "source": [
    "Plotting a PDF with disallowed parameters doesn't work. We would get a lot of error messages.\n",
    "Therefore, we disable plotting messages in RooFit's message streams:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b4efaaa5",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:42.121002Z",
     "iopub.status.busy": "2026-05-19T20:33:42.120873Z",
     "iopub.status.idle": "2026-05-19T20:33:42.247732Z",
     "shell.execute_reply": "2026-05-19T20:33:42.246924Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.RooMsgService.instance().getStream(0).removeTopic(ROOT.RooFit.Plotting)\n",
    "ROOT.RooMsgService.instance().getStream(1).removeTopic(ROOT.RooFit.Plotting)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a9362b2d",
   "metadata": {},
   "source": [
    "RooFit before ROOT 6.24\n",
    "--------------------------------\n",
    "Before 6.24, RooFit wasn't able to recover from invalid parameters. The minimiser just errs around\n",
    "the starting values of the parameters without finding any improvement."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15bb9184",
   "metadata": {},
   "source": [
    "Set up the parameters such that the PDF would come out negative. The PDF is now undefined."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2e2aea80",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:42.249570Z",
     "iopub.status.busy": "2026-05-19T20:33:42.249449Z",
     "iopub.status.idle": "2026-05-19T20:33:42.357378Z",
     "shell.execute_reply": "2026-05-19T20:33:42.356698Z"
    }
   },
   "outputs": [],
   "source": [
    "a1.setVal(10.0)\n",
    "a2.setVal(-1.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6c9e71d",
   "metadata": {},
   "source": [
    "Perform a fit:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6c4a1531",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:42.359537Z",
     "iopub.status.busy": "2026-05-19T20:33:42.359407Z",
     "iopub.status.idle": "2026-05-19T20:33:42.589557Z",
     "shell.execute_reply": "2026-05-19T20:33:42.588900Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(pol3_over_pol3_Int[x]) 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 738.062 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_pol3_over_pol3_Int[x]_pol3Data) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#0] ERROR:Minimization -- RooMinimizer: all function calls during minimization gave invalid NLL values!\n",
      "[#0] ERROR:Minimization -- RooMinimizer::calculateHessErrors() Error when calculating Hessian\n",
      "[#0] ERROR:Minimization -- RooMinimizer: all function calls during minimization gave invalid NLL values!\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#0] ERROR:Eval -- RooAbsReal::logEvalError(pol3) evaluation error, \n",
      " origin       : RooPolynomial::pol3[ x=x coefList=(a1,a2,a3) ]\n",
      " message      : p.d.f normalization integral is zero or negative: -2220.000000\n",
      " server values: x=x=0, coefList=(a1 = 10 +/- 0,a2 = -1 +/- 0,a3 = 0.01)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x559ed39d6840>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fitWithoutRecovery = pdf.fitTo(\n",
    "    data,\n",
    "    Save=True,\n",
    "    RecoverFromUndefinedRegions=0.0,  # This is how RooFit behaved prior to ROOT 6.24\n",
    "    PrintEvalErrors=-1,  # We are expecting a lot of evaluation errors. -1 switches off printing.\n",
    "    PrintLevel=-1,\n",
    ")\n",
    "\n",
    "pdf.plotOn(frame, LineColor=\"r\", Name=\"noRecovery\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5eab3368",
   "metadata": {},
   "source": [
    "RooFit since ROOT 6.24\n",
    "--------------------------------\n",
    "The minimiser gets information about the \"badness\" of the violation of the function definition. It uses this\n",
    "to find its way out of the disallowed parameter regions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5bdc7d36",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:42.591731Z",
     "iopub.status.busy": "2026-05-19T20:33:42.591585Z",
     "iopub.status.idle": "2026-05-19T20:33:42.694971Z",
     "shell.execute_reply": "2026-05-19T20:33:42.694339Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\n",
      "-------------- Starting second fit ---------------\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"\\n\\n\\n-------------- Starting second fit ---------------\\n\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6c623a8",
   "metadata": {},
   "source": [
    "Reset the parameters such that the PDF is again undefined."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "f7aab350",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:42.696762Z",
     "iopub.status.busy": "2026-05-19T20:33:42.696637Z",
     "iopub.status.idle": "2026-05-19T20:33:42.799922Z",
     "shell.execute_reply": "2026-05-19T20:33:42.799381Z"
    }
   },
   "outputs": [],
   "source": [
    "a1.setVal(10.0)\n",
    "a2.setVal(-1.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c90052eb",
   "metadata": {},
   "source": [
    "Fit again, but pass recovery information to the minimiser:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "7fce52a9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:42.802028Z",
     "iopub.status.busy": "2026-05-19T20:33:42.801907Z",
     "iopub.status.idle": "2026-05-19T20:33:42.937963Z",
     "shell.execute_reply": "2026-05-19T20:33:42.937370Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(pol3_over_pol3_Int[x]) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 190.681 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_pol3_over_pol3_Int[x]_pol3Data) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "Minuit2Minimizer: Minimize with max-calls 1000 convergence for edm < 1 strategy 1\n",
      "Minuit2Minimizer : Valid minimum - status = 0\n",
      "FVAL  = -1002.22625947982669\n",
      "Edm   = 8.90543439440185486e-08\n",
      "Nfcn  = 245\n",
      "a1\t  = -0.498159\t +/-  0.0227243\t(limited)\n",
      "a2\t  = 0.198318\t +/-  0.00564924\t(limited)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Warning in <Minuit2>: MnPosDef non-positive diagonal element in covariance matrix[ 0 ] = -13.133\n",
      "Warning in <Minuit2>: MnPosDef Added to diagonal of Error matrix a value 13.633\n",
      "Warning in <Minuit2>: DavidonErrorUpdator delgam < 0 : first derivatives increasing along search line (details in info log)\n",
      "Warning in <Minuit2>: VariableMetricBuilder Matrix not pos.def, gdel = 67.8685 > 0\n",
      "Warning in <Minuit2>: MnPosDef non-positive diagonal element in covariance matrix[ 0 ] = -0.000525791\n",
      "Warning in <Minuit2>: MnPosDef non-positive diagonal element in covariance matrix[ 1 ] = -0.00482974\n",
      "Warning in <Minuit2>: MnPosDef Added to diagonal of Error matrix a value 0.50483\n",
      "Warning in <Minuit2>: VariableMetricBuilder gdel = -51905.4\n",
      "Warning in <Minuit2>: DavidonErrorUpdator delgam < 0 : first derivatives increasing along search line (details in info log)\n",
      "Warning in <Minuit2>: VariableMetricBuilder Matrix not pos.def, gdel = 56.5625 > 0\n",
      "Warning in <Minuit2>: MnPosDef non-positive diagonal element in covariance matrix[ 1 ] = -0.00239309\n",
      "Warning in <Minuit2>: MnPosDef Added to diagonal of Error matrix a value 0.502393\n",
      "Warning in <Minuit2>: VariableMetricBuilder gdel = -15405\n",
      "Warning in <Minuit2>: DavidonErrorUpdator delgam < 0 : first derivatives increasing along search line (details in info log)\n",
      "Warning in <Minuit2>: VariableMetricBuilder Matrix not pos.def, gdel = 3573.83 > 0\n",
      "Warning in <Minuit2>: MnPosDef non-positive diagonal element in covariance matrix[ 0 ] = -1.28848e-05\n",
      "Warning in <Minuit2>: MnPosDef non-positive diagonal element in covariance matrix[ 1 ] = -2.85489e-05\n",
      "Warning in <Minuit2>: MnPosDef Added to diagonal of Error matrix a value 0.500029\n",
      "Warning in <Minuit2>: VariableMetricBuilder gdel = -5.37564e+07\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x559ed39d6840>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fitWithRecovery = pdf.fitTo(\n",
    "    data,\n",
    "    Save=True,\n",
    "    RecoverFromUndefinedRegions=1.0,  # The magnitude of the recovery information can be chosen here.\n",
    "    # Higher values mean more aggressive recovery.\n",
    "    PrintEvalErrors=-1,  # We are still expecting a few evaluation errors.\n",
    "    PrintLevel=0,\n",
    ")\n",
    "\n",
    "pdf.plotOn(frame, LineColor=\"b\", Name=\"recovery\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "299bcd40",
   "metadata": {},
   "source": [
    "Collect results and plot.\n",
    "--------------------------------\n",
    "We print the two fit results, and plot the fitted curves.\n",
    "The curve of the fit without recovery cannot be plotted, because the PDF is undefined if a2 < 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "7f41c53f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:42.939783Z",
     "iopub.status.busy": "2026-05-19T20:33:42.939655Z",
     "iopub.status.idle": "2026-05-19T20:33:43.205935Z",
     "shell.execute_reply": "2026-05-19T20:33:43.205475Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Without recovery, the fitter encountered 23 invalid function values. The parameters are unchanged.\n",
      "\n",
      "With recovery, the fitter encountered 23 invalid function values, but the parameters are fitted.\n",
      "\n",
      "\n",
      "  RooFitResult: minimized FCN value: 0, estimated distance to minimum: 0\n",
      "                covariance matrix quality: Not calculated at all\n",
      "                Status : MINIMIZE=-1 HESSE=302 \n",
      "\n",
      "    Floating Parameter    FinalValue +/-  Error   \n",
      "  --------------------  --------------------------\n",
      "                    a1    1.0000e+01 +/-  0.00e+00\n",
      "                    a2   -1.0000e+00 +/-  0.00e+00\n",
      "\n",
      "\n",
      "  RooFitResult: minimized FCN value: 29650.9, estimated distance to minimum: 8.92102e-08\n",
      "                covariance matrix quality: Full, accurate covariance matrix\n",
      "                Status : MINIMIZE=0 HESSE=0 \n",
      "\n",
      "    Floating Parameter    FinalValue +/-  Error   \n",
      "  --------------------  --------------------------\n",
      "                    a1   -4.9816e-01 +/-  2.27e-02\n",
      "                    a2    1.9832e-01 +/-  5.65e-03\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf612_recoverFromInvalidParameters.png has been created\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222823197\" style=\"width: 700px; height: 500px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222823197() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(32168,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222823197', 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_1779222823197();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fitWithoutRecovery.Print()\n",
    "print(\n",
    "    \"Without recovery, the fitter encountered {}\".format(fitWithoutRecovery.numInvalidNLL())\n",
    "    + \" invalid function values. The parameters are unchanged.\\n\"\n",
    ")\n",
    "\n",
    "fitWithRecovery.Print()\n",
    "print(\n",
    "    \"With recovery, the fitter encountered {}\".format(fitWithoutRecovery.numInvalidNLL())\n",
    "    + \" invalid function values, but the parameters are fitted.\\n\"\n",
    ")\n",
    "\n",
    "legend = ROOT.TLegend(0.5, 0.7, 0.9, 0.9)\n",
    "legend.SetBorderSize(0)\n",
    "legend.SetFillStyle(0)\n",
    "legend.AddEntry(\"data\", \"Data\", \"P\")\n",
    "legend.AddEntry(\"noRecovery\", \"Without recovery (cannot be plotted)\", \"L\")\n",
    "legend.AddEntry(\"recovery\", \"With recovery\", \"L\")\n",
    "frame.Draw()\n",
    "legend.Draw()\n",
    "c.Draw()\n",
    "\n",
    "c.SaveAs(\"rf612_recoverFromInvalidParameters.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "593914a0",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "1cb9d312",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:33:43.207459Z",
     "iopub.status.busy": "2026-05-19T20:33:43.207344Z",
     "iopub.status.idle": "2026-05-19T20:33:43.322185Z",
     "shell.execute_reply": "2026-05-19T20:33:43.321784Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222823320\" style=\"width: 700px; height: 500px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222823320() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(32168,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222823320', 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_1779222823320();\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
}
