{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "4c817fdf",
   "metadata": {},
   "source": [
    "# rf701_efficiencyfit\n",
    "Special pdf's: unbinned maximum likelihood fit of an efficiency eff(x) function to a\n",
    "dataset D(x,cut), cut is a category encoding a selection, which the efficiency as function\n",
    "of x should be described by eff(x)\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:34 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a66ed769",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:18.766883Z",
     "iopub.status.busy": "2026-05-19T20:34:18.766766Z",
     "iopub.status.idle": "2026-05-19T20:34:19.722716Z",
     "shell.execute_reply": "2026-05-19T20:34:19.722024Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4637e75",
   "metadata": {},
   "source": [
    "Construct efficiency function e(x)\n",
    "-------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9141e16a",
   "metadata": {},
   "source": [
    "Declare variables x,mean, with associated name, title, value and allowed\n",
    "range"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "80cf79df",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:19.724504Z",
     "iopub.status.busy": "2026-05-19T20:34:19.724372Z",
     "iopub.status.idle": "2026-05-19T20:34:19.881786Z",
     "shell.execute_reply": "2026-05-19T20:34:19.881165Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", -10, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80202ad3",
   "metadata": {},
   "source": [
    "Efficiency function eff(x;a,b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "14c19a3f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:19.883926Z",
     "iopub.status.busy": "2026-05-19T20:34:19.883798Z",
     "iopub.status.idle": "2026-05-19T20:34:20.075567Z",
     "shell.execute_reply": "2026-05-19T20:34:20.074873Z"
    }
   },
   "outputs": [],
   "source": [
    "a = ROOT.RooRealVar(\"a\", \"a\", 0.4, 0, 1)\n",
    "b = ROOT.RooRealVar(\"b\", \"b\", 5)\n",
    "c = ROOT.RooRealVar(\"c\", \"c\", -1, -10, 10)\n",
    "effFunc = ROOT.RooFormulaVar(\"effFunc\", \"(1-a)+a*cos((x-c)/b)\", [a, b, c, x])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "48f078b6",
   "metadata": {},
   "source": [
    "Construct conditional efficiency pdf E(cut|x)\n",
    "------------------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6b29817",
   "metadata": {},
   "source": [
    "Acceptance state cut (1 or 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b8646199",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:20.077633Z",
     "iopub.status.busy": "2026-05-19T20:34:20.077490Z",
     "iopub.status.idle": "2026-05-19T20:34:20.194164Z",
     "shell.execute_reply": "2026-05-19T20:34:20.193421Z"
    }
   },
   "outputs": [],
   "source": [
    "cut = ROOT.RooCategory(\"cut\", \"cutr\", {\"accept\": 1, \"reject\": 0})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5db29665",
   "metadata": {},
   "source": [
    "Construct efficiency pdf eff(cut|x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e55a247b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:20.196025Z",
     "iopub.status.busy": "2026-05-19T20:34:20.195894Z",
     "iopub.status.idle": "2026-05-19T20:34:20.312690Z",
     "shell.execute_reply": "2026-05-19T20:34:20.311992Z"
    }
   },
   "outputs": [],
   "source": [
    "effPdf = ROOT.RooEfficiency(\"effPdf\", \"effPdf\", effFunc, cut, \"accept\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f93049cd",
   "metadata": {},
   "source": [
    "Generate data (x, cut) from a toy model\n",
    "-----------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19e55efd",
   "metadata": {},
   "source": [
    "Construct global shape pdf shape(x) and product model(x,cut) = eff(cut|x)*shape(x)\n",
    "(These are _only_ needed to generate some toy MC here to be used later)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "823c7a39",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:20.314733Z",
     "iopub.status.busy": "2026-05-19T20:34:20.314586Z",
     "iopub.status.idle": "2026-05-19T20:34:20.490693Z",
     "shell.execute_reply": "2026-05-19T20:34:20.489991Z"
    }
   },
   "outputs": [],
   "source": [
    "shapePdf = ROOT.RooPolynomial(\"shapePdf\", \"shapePdf\", x, [-0.095])\n",
    "model = ROOT.RooProdPdf(\"model\", \"model\", {shapePdf}, Conditional=({effPdf}, {cut}))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65461872",
   "metadata": {},
   "source": [
    "Generate some toy data from model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "75a4a776",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:20.492719Z",
     "iopub.status.busy": "2026-05-19T20:34:20.492567Z",
     "iopub.status.idle": "2026-05-19T20:34:20.643853Z",
     "shell.execute_reply": "2026-05-19T20:34:20.643151Z"
    }
   },
   "outputs": [],
   "source": [
    "data = model.generate({x, cut}, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f293a9cc",
   "metadata": {},
   "source": [
    "Fit conditional efficiency pdf to data\n",
    "--------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2aa70c12",
   "metadata": {},
   "source": [
    "Fit conditional efficiency pdf to data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "bff70d28",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:20.645861Z",
     "iopub.status.busy": "2026-05-19T20:34:20.645731Z",
     "iopub.status.idle": "2026-05-19T20:34:20.860783Z",
     "shell.execute_reply": "2026-05-19T20:34:20.860076Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(effPdf_over_effPdf_Int[cut]) 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 767.433 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_effPdf_over_effPdf_Int[cut]_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": [
    "effPdf.fitTo(data, ConditionalObservables={x}, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fae0c592",
   "metadata": {},
   "source": [
    "Plot fitted, data efficiency\n",
    "--------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e6f755e",
   "metadata": {},
   "source": [
    "Plot distribution of all events and accepted fraction of events on frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "fcf103e4",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:20.862428Z",
     "iopub.status.busy": "2026-05-19T20:34:20.862294Z",
     "iopub.status.idle": "2026-05-19T20:34:21.032028Z",
     "shell.execute_reply": "2026-05-19T20:34:21.031584Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooTreeData::plotOn: plotting 8176 events out of 10000 total events\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x564be72292d0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame1 = x.frame(Bins=20, Title=\"Data (all, accepted)\")\n",
    "data.plotOn(frame1)\n",
    "data.plotOn(frame1, Cut=\"cut==cut::accept\", MarkerColor=\"r\", LineColor=\"r\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33235acf",
   "metadata": {},
   "source": [
    "Plot accept/reject efficiency on data overlay fitted efficiency curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "5c33b2db",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:21.043558Z",
     "iopub.status.busy": "2026-05-19T20:34:21.043425Z",
     "iopub.status.idle": "2026-05-19T20:34:21.195521Z",
     "shell.execute_reply": "2026-05-19T20:34:21.194843Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x564be727e320>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame2 = x.frame(Bins=20, Title=\"Fitted efficiency\")\n",
    "data.plotOn(frame2, Efficiency=cut)  # needs ROOT version >= 5.21\n",
    "effFunc.plotOn(frame2, LineColor=\"r\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f696ac9a",
   "metadata": {},
   "source": [
    "Draw all frames on a canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5573ba0a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:21.197623Z",
     "iopub.status.busy": "2026-05-19T20:34:21.197476Z",
     "iopub.status.idle": "2026-05-19T20:34:21.411526Z",
     "shell.execute_reply": "2026-05-19T20:34:21.410798Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf701_efficiencyfit.png has been created\n"
     ]
    }
   ],
   "source": [
    "ca = ROOT.TCanvas(\"rf701_efficiency\", \"rf701_efficiency\", 800, 400)\n",
    "ca.Divide(2)\n",
    "ca.cd(1)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame1.GetYaxis().SetTitleOffset(1.6)\n",
    "frame1.Draw()\n",
    "ca.cd(2)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame2.GetYaxis().SetTitleOffset(1.4)\n",
    "frame2.Draw()\n",
    "\n",
    "ca.SaveAs(\"rf701_efficiencyfit.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1dffc68",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "735de297",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:34:21.413227Z",
     "iopub.status.busy": "2026-05-19T20:34:21.413100Z",
     "iopub.status.idle": "2026-05-19T20:34:21.596244Z",
     "shell.execute_reply": "2026-05-19T20:34:21.595531Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222861586\" style=\"width: 800px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222861586() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(35312,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222861586', 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_1779222861586();\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
}
