{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3c0e5171",
   "metadata": {},
   "source": [
    "# rf202_extendedmlfit\n",
    "Addition and convolution: setting up an extended maximum likelihood fit\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": "a9bf7d26",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:37.974579Z",
     "iopub.status.busy": "2026-05-19T20:29:37.974464Z",
     "iopub.status.idle": "2026-05-19T20:29:38.945448Z",
     "shell.execute_reply": "2026-05-19T20:29:38.944775Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "868a2529",
   "metadata": {},
   "source": [
    "Set up component pdfs\n",
    "---------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f64266c",
   "metadata": {},
   "source": [
    "Declare observable x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1c484c63",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:38.947237Z",
     "iopub.status.busy": "2026-05-19T20:29:38.947110Z",
     "iopub.status.idle": "2026-05-19T20:29:39.134710Z",
     "shell.execute_reply": "2026-05-19T20:29:39.134023Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", 0, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "22931bf3",
   "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": "5ce780c4",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:39.144300Z",
     "iopub.status.busy": "2026-05-19T20:29:39.144173Z",
     "iopub.status.idle": "2026-05-19T20:29:39.272203Z",
     "shell.execute_reply": "2026-05-19T20:29:39.271608Z"
    }
   },
   "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": "d109487b",
   "metadata": {},
   "source": [
    "Build Chebychev polynomial pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3ecd5f53",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:39.274023Z",
     "iopub.status.busy": "2026-05-19T20:29:39.273902Z",
     "iopub.status.idle": "2026-05-19T20:29:39.453322Z",
     "shell.execute_reply": "2026-05-19T20:29:39.452647Z"
    }
   },
   "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": "d7834f43",
   "metadata": {},
   "source": [
    "Sum the signal components into a composite signal pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c3c151ab",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:39.454997Z",
     "iopub.status.busy": "2026-05-19T20:29:39.454793Z",
     "iopub.status.idle": "2026-05-19T20:29:39.567724Z",
     "shell.execute_reply": "2026-05-19T20:29:39.567107Z"
    }
   },
   "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": "d0b203f0",
   "metadata": {},
   "source": [
    "Method 1 - Construct extended composite model\n",
    "-------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02223e8f",
   "metadata": {},
   "source": [
    "Sum the composite signal and background into an extended pdf\n",
    "nsig*sig+nbkg*bkg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7c8079b1",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:39.569764Z",
     "iopub.status.busy": "2026-05-19T20:29:39.569619Z",
     "iopub.status.idle": "2026-05-19T20:29:39.673561Z",
     "shell.execute_reply": "2026-05-19T20:29:39.673004Z"
    }
   },
   "outputs": [],
   "source": [
    "nsig = ROOT.RooRealVar(\"nsig\", \"number of signal events\", 500, 0.0, 10000)\n",
    "nbkg = ROOT.RooRealVar(\"nbkg\", \"number of background events\", 500, 0, 10000)\n",
    "model = ROOT.RooAddPdf(\"model\", \"(g1+g2)+a\", [bkg, sig], [nbkg, nsig])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be58d700",
   "metadata": {},
   "source": [
    "Sample, fit and plot extended model\n",
    "---------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9c70b36",
   "metadata": {},
   "source": [
    "Generate a data sample of expected number events in x from model\n",
    "= model.expectedEvents() = nsig+nbkg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "176de070",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:39.675669Z",
     "iopub.status.busy": "2026-05-19T20:29:39.675437Z",
     "iopub.status.idle": "2026-05-19T20:29:39.835652Z",
     "shell.execute_reply": "2026-05-19T20:29:39.835000Z"
    }
   },
   "outputs": [],
   "source": [
    "data = model.generate({x})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4344e5b3",
   "metadata": {},
   "source": [
    "Fit model to data, ML term automatically included"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d639c6e3",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:39.837618Z",
     "iopub.status.busy": "2026-05-19T20:29:39.837467Z",
     "iopub.status.idle": "2026-05-19T20:29:40.028036Z",
     "shell.execute_reply": "2026-05-19T20:29:40.027391Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Minimization -- p.d.f. provides expected number of events, including extended term in likelihood.\n",
      "[#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 853.884 μ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": "deecf65d",
   "metadata": {},
   "source": [
    "Plot data and PDF overlaid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b31410a0",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:40.029832Z",
     "iopub.status.busy": "2026-05-19T20:29:40.029699Z",
     "iopub.status.idle": "2026-05-19T20:29:40.207928Z",
     "shell.execute_reply": "2026-05-19T20:29:40.207249Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5591c86a9240>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xframe = x.frame(Title=\"extended ML fit example\")\n",
    "data.plotOn(xframe)\n",
    "model.plotOn(xframe)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bdd8fdd1",
   "metadata": {},
   "source": [
    "Overlay the background component of model with a dashed line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "2f737de4",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:40.210238Z",
     "iopub.status.busy": "2026-05-19T20:29:40.210115Z",
     "iopub.status.idle": "2026-05-19T20:29:40.328686Z",
     "shell.execute_reply": "2026-05-19T20:29:40.328053Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5591c86a9240>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "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"
     ]
    }
   ],
   "source": [
    "model.plotOn(xframe, Components={bkg}, LineStyle=\":\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ccfe4ae1",
   "metadata": {},
   "source": [
    "Overlay the background+sig2 components of model with a dotted line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e1aeee07",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:40.329988Z",
     "iopub.status.busy": "2026-05-19T20:29:40.329867Z",
     "iopub.status.idle": "2026-05-19T20:29:40.445796Z",
     "shell.execute_reply": "2026-05-19T20:29:40.445375Z"
    }
   },
   "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 0x5591c86a9240>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ras_bkg_sig2 = {bkg, sig2}\n",
    "model.plotOn(xframe, Components=ras_bkg_sig2, LineStyle=\":\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecb29a88",
   "metadata": {},
   "source": [
    "Print structure of composite pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "44eb5be9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:40.453780Z",
     "iopub.status.busy": "2026-05-19T20:29:40.453642Z",
     "iopub.status.idle": "2026-05-19T20:29:40.562957Z",
     "shell.execute_reply": "2026-05-19T20:29:40.562290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0x5591c804da50 RooAddPdf::model = 0.885989/1 [Auto,Clean] \n",
      "  0x5591c7eb47e0/V- RooChebychev::bkg = 0.733482 [Auto,Dirty] \n",
      "    0x5591c784d220/V- RooRealVar::x = 5\n",
      "    0x5591c7a567f0/V- RooRealVar::a0 = 0.507382 +/- 0.0795949\n",
      "    0x5591c7b48330/V- RooRealVar::a1 = 0.266518 +/- 0.133887\n",
      "  0x5591c7efed10/V- RooRealVar::nbkg = 427.704 +/- 38.0644\n",
      "  0x5591c7ee7090/V- RooAddPdf::sig = 1/1 [Auto,Clean] \n",
      "    0x5591c7b34c90/V- RooGaussian::sig1 = 1 [Auto,Dirty] \n",
      "      0x5591c784d220/V- RooRealVar::x = 5\n",
      "      0x5591c7a05cb0/V- RooRealVar::mean = 5\n",
      "      0x5591c7a16c80/V- RooRealVar::sigma1 = 0.5\n",
      "    0x5591c7b60fb0/V- RooRealVar::sig1frac = 0.640056 +/- 0.0966619\n",
      "    0x5591c7b19c30/V- RooGaussian::sig2 = 1 [Auto,Dirty] \n",
      "      0x5591c784d220/V- RooRealVar::x = 5\n",
      "      0x5591c7a05cb0/V- RooRealVar::mean = 5\n",
      "      0x5591c7999830/V- RooRealVar::sigma2 = 1\n",
      "  0x5591c7f09f70/V- RooRealVar::nsig = 572.124 +/- 39.9094\n"
     ]
    }
   ],
   "source": [
    "model.Print(\"t\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2714a1d8",
   "metadata": {},
   "source": [
    "Method 2 - Construct extended components first\n",
    "---------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c6032707",
   "metadata": {},
   "source": [
    "Associated nsig/nbkg as expected number of events with sig/bkg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "09406f29",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:40.564767Z",
     "iopub.status.busy": "2026-05-19T20:29:40.564639Z",
     "iopub.status.idle": "2026-05-19T20:29:40.677822Z",
     "shell.execute_reply": "2026-05-19T20:29:40.677148Z"
    }
   },
   "outputs": [],
   "source": [
    "esig = ROOT.RooExtendPdf(\"esig\", \"extended signal pdf\", sig, nsig)\n",
    "ebkg = ROOT.RooExtendPdf(\"ebkg\", \"extended background pdf\", bkg, nbkg)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26b3b417",
   "metadata": {},
   "source": [
    "Sum extended components without coefs\n",
    "-------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf884780",
   "metadata": {},
   "source": [
    "Construct sum of two extended pdf (no coefficients required)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a486c335",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:40.679998Z",
     "iopub.status.busy": "2026-05-19T20:29:40.679872Z",
     "iopub.status.idle": "2026-05-19T20:29:40.789397Z",
     "shell.execute_reply": "2026-05-19T20:29:40.788436Z"
    }
   },
   "outputs": [],
   "source": [
    "model2 = ROOT.RooAddPdf(\"model2\", \"(g1+g2)+a\", [ebkg, esig])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c417fb04",
   "metadata": {},
   "source": [
    "Draw the frame on the canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "de898fa2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:40.791038Z",
     "iopub.status.busy": "2026-05-19T20:29:40.790908Z",
     "iopub.status.idle": "2026-05-19T20:29:41.008997Z",
     "shell.execute_reply": "2026-05-19T20:29:41.008191Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf202_extendedmlfit.png has been created\n"
     ]
    }
   ],
   "source": [
    "c = ROOT.TCanvas(\"rf202_extendedmlfit\", \"rf202_extendedmlfit\", 600, 600)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "xframe.GetYaxis().SetTitleOffset(1.4)\n",
    "xframe.Draw()\n",
    "\n",
    "c.SaveAs(\"rf202_extendedmlfit.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37e0478a",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "4b32692f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:41.010747Z",
     "iopub.status.busy": "2026-05-19T20:29:41.010614Z",
     "iopub.status.idle": "2026-05-19T20:29:41.193382Z",
     "shell.execute_reply": "2026-05-19T20:29:41.192814Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222581184\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222581184() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(34531,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222581184', 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_1779222581184();\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
}
