{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a02ba370",
   "metadata": {},
   "source": [
    "# rf110_normintegration\n",
    "Basic functionality: examples on normalization and integration of pdfs, construction\n",
    "of cumulative distribution functions from monodimensional pdfs\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": "6c5a2efb",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:22.616673Z",
     "iopub.status.busy": "2026-05-19T20:29:22.616523Z",
     "iopub.status.idle": "2026-05-19T20:29:23.612500Z",
     "shell.execute_reply": "2026-05-19T20:29:23.611415Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0d395f6",
   "metadata": {},
   "source": [
    "Set up model\n",
    "---------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54330e7d",
   "metadata": {},
   "source": [
    "Create observables x,y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "eb41b459",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:23.614273Z",
     "iopub.status.busy": "2026-05-19T20:29:23.614132Z",
     "iopub.status.idle": "2026-05-19T20:29:23.776163Z",
     "shell.execute_reply": "2026-05-19T20:29:23.775105Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", -10, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c079da2e",
   "metadata": {},
   "source": [
    "Create pdf gaussx(x,-2,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e7440627",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:23.777900Z",
     "iopub.status.busy": "2026-05-19T20:29:23.777766Z",
     "iopub.status.idle": "2026-05-19T20:29:23.906055Z",
     "shell.execute_reply": "2026-05-19T20:29:23.904993Z"
    }
   },
   "outputs": [],
   "source": [
    "gx = ROOT.RooGaussian(\"gx\", \"gx\", x, -2, 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "493f373b",
   "metadata": {},
   "source": [
    "Retrieve raw & normalized values of RooFit pdfs\n",
    "--------------------------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7fa4788e",
   "metadata": {},
   "source": [
    "Return 'raw' unnormalized value of gx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "aa505811",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:23.907746Z",
     "iopub.status.busy": "2026-05-19T20:29:23.907577Z",
     "iopub.status.idle": "2026-05-19T20:29:24.022744Z",
     "shell.execute_reply": "2026-05-19T20:29:24.022178Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gx =  0.8007374029168081\n"
     ]
    }
   ],
   "source": [
    "print(\"gx = \", gx.getVal())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b0a2154b",
   "metadata": {},
   "source": [
    "Return value of gx normalized over x in range [-10,10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aa76d754",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:24.024617Z",
     "iopub.status.busy": "2026-05-19T20:29:24.024476Z",
     "iopub.status.idle": "2026-05-19T20:29:24.189670Z",
     "shell.execute_reply": "2026-05-19T20:29:24.188596Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gx_Norm[x] =  0.1068955044839622\n"
     ]
    }
   ],
   "source": [
    "nset = ROOT.RooArgSet(x)\n",
    "print(\"gx_Norm[x] = \", gx.getVal(nset))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60bb89ba",
   "metadata": {},
   "source": [
    "Create object representing integral over gx\n",
    "which is used to calculate  gx_Norm[x] == gx / gx_Int[x]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "00bcc4a1",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:24.191352Z",
     "iopub.status.busy": "2026-05-19T20:29:24.191221Z",
     "iopub.status.idle": "2026-05-19T20:29:24.307874Z",
     "shell.execute_reply": "2026-05-19T20:29:24.306965Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gx_Int[x] =  7.490842639102233\n"
     ]
    }
   ],
   "source": [
    "igx = gx.createIntegral({x})\n",
    "print(\"gx_Int[x] = \", igx.getVal())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3b151c9",
   "metadata": {},
   "source": [
    "Integrate normalized pdf over subrange\n",
    "----------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a586079d",
   "metadata": {},
   "source": [
    "Define a range named \"signal\" in x from -5,5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a4e6dd60",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:24.309436Z",
     "iopub.status.busy": "2026-05-19T20:29:24.309308Z",
     "iopub.status.idle": "2026-05-19T20:29:24.419038Z",
     "shell.execute_reply": "2026-05-19T20:29:24.418395Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Eval -- RooRealVar::setRange(x) new range named 'signal' created with bounds [-5,5]\n"
     ]
    }
   ],
   "source": [
    "x.setRange(\"signal\", -5, 5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b981d027",
   "metadata": {},
   "source": [
    "Create an integral of gx_Norm[x] over x in range \"signal\"\n",
    "ROOT.This is the fraction of of pdf gx_Norm[x] which is in the\n",
    "range named \"signal\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e26b017d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:24.420722Z",
     "iopub.status.busy": "2026-05-19T20:29:24.420561Z",
     "iopub.status.idle": "2026-05-19T20:29:24.562242Z",
     "shell.execute_reply": "2026-05-19T20:29:24.561594Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gx_Int[x|signal]_Norm[x] =  0.8347532778470285\n"
     ]
    }
   ],
   "source": [
    "xset = {x}\n",
    "igx_sig = gx.createIntegral(xset, NormSet=xset, Range=\"signal\")\n",
    "print(\"gx_Int[x|signal]_Norm[x] = \", igx_sig.getVal())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dfe5ea5c",
   "metadata": {},
   "source": [
    "Construct cumulative distribution function from pdf\n",
    "-----------------------------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c974f4d6",
   "metadata": {},
   "source": [
    "Create the cumulative distribution function of gx\n",
    "i.e. calculate Int[-10,x] gx(x') dx'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4d510b99",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:24.563917Z",
     "iopub.status.busy": "2026-05-19T20:29:24.563782Z",
     "iopub.status.idle": "2026-05-19T20:29:24.674409Z",
     "shell.execute_reply": "2026-05-19T20:29:24.673342Z"
    }
   },
   "outputs": [],
   "source": [
    "gx_cdf = gx.createCdf({x})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "96114503",
   "metadata": {},
   "source": [
    "Plot cdf of gx versus x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "45c9cca3",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:24.676091Z",
     "iopub.status.busy": "2026-05-19T20:29:24.675964Z",
     "iopub.status.idle": "2026-05-19T20:29:24.835563Z",
     "shell.execute_reply": "2026-05-19T20:29:24.834461Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5629019cd260>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame = x.frame(Title=\"cdf of Gaussian pdf\")\n",
    "gx_cdf.plotOn(frame)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1fc6be1",
   "metadata": {},
   "source": [
    "Draw plot on canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "4b1e0d56",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:24.837255Z",
     "iopub.status.busy": "2026-05-19T20:29:24.837125Z",
     "iopub.status.idle": "2026-05-19T20:29:25.040748Z",
     "shell.execute_reply": "2026-05-19T20:29:25.040120Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf110_normintegration.png has been created\n"
     ]
    }
   ],
   "source": [
    "c = ROOT.TCanvas(\"rf110_normintegration\", \"rf110_normintegration\", 600, 600)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame.GetYaxis().SetTitleOffset(1.6)\n",
    "frame.Draw()\n",
    "\n",
    "c.SaveAs(\"rf110_normintegration.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1a3c2f6",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "68cb6610",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:29:25.042674Z",
     "iopub.status.busy": "2026-05-19T20:29:25.042510Z",
     "iopub.status.idle": "2026-05-19T20:29:25.226013Z",
     "shell.execute_reply": "2026-05-19T20:29:25.225131Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222565216\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222565216() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(23195,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222565216', 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_1779222565216();\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
}
