{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0bc6bfe2",
   "metadata": {},
   "source": [
    "# rf303_conditional\n",
    "'MULTIDIMENSIONAL MODELS' RooFit tutorial macro #303\n",
    "Use of tailored p.d.f as conditional p.d.fs.s\n",
    "\n",
    "pdf = gauss(x,f(y),sx | y ) with f(y) = a0 + a1*y\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:30 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d446b629",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:38.191623Z",
     "iopub.status.busy": "2026-05-19T20:30:38.191471Z",
     "iopub.status.idle": "2026-05-19T20:30:39.141819Z",
     "shell.execute_reply": "2026-05-19T20:30:39.141121Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT\n",
    "\n",
    "\n",
    "def makeFakeDataXY():\n",
    "\n",
    "    trnd = ROOT.TRandom3()\n",
    "\n",
    "    x = ROOT.RooRealVar(\"x\", \"x\", -10, 10)\n",
    "    y = ROOT.RooRealVar(\"y\", \"y\", -10, 10)\n",
    "    coord = {x, y}\n",
    "\n",
    "    d = ROOT.RooDataSet(\"d\", \"d\", coord)\n",
    "\n",
    "    for i in range(10000):\n",
    "        tmpy = trnd.Gaus(0, 10)\n",
    "        tmpx = trnd.Gaus(0.5 * tmpy, 1)\n",
    "        if (abs(tmpy) < 10) and (abs(tmpx) < 10):\n",
    "            x.setVal(tmpx)\n",
    "            y.setVal(tmpy)\n",
    "            d.add(coord)\n",
    "\n",
    "    return d"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c62adc5",
   "metadata": {},
   "source": [
    "Set up composed model gauss(x, m(y), s)\n",
    "-----------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "603a31fb",
   "metadata": {},
   "source": [
    "Create observables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "bf227697",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:39.143560Z",
     "iopub.status.busy": "2026-05-19T20:30:39.143428Z",
     "iopub.status.idle": "2026-05-19T20:30:39.302908Z",
     "shell.execute_reply": "2026-05-19T20:30:39.302221Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", -10, 10)\n",
    "y = ROOT.RooRealVar(\"y\", \"y\", -10, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61c89dcf",
   "metadata": {},
   "source": [
    "Create function f(y) = a0 + a1*y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "51f8b1ae",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:39.304576Z",
     "iopub.status.busy": "2026-05-19T20:30:39.304451Z",
     "iopub.status.idle": "2026-05-19T20:30:39.484052Z",
     "shell.execute_reply": "2026-05-19T20:30:39.483337Z"
    }
   },
   "outputs": [],
   "source": [
    "a0 = ROOT.RooRealVar(\"a0\", \"a0\", -0.5, -5, 5)\n",
    "a1 = ROOT.RooRealVar(\"a1\", \"a1\", -0.5, -1, 1)\n",
    "fy = ROOT.RooPolyVar(\"fy\", \"fy\", y, [a0, a1])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a9e0990",
   "metadata": {},
   "source": [
    "Creat gauss(x,f(y),s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c1b993e6",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:39.485714Z",
     "iopub.status.busy": "2026-05-19T20:30:39.485573Z",
     "iopub.status.idle": "2026-05-19T20:30:39.607180Z",
     "shell.execute_reply": "2026-05-19T20:30:39.606645Z"
    }
   },
   "outputs": [],
   "source": [
    "sigma = ROOT.RooRealVar(\"sigma\", \"width of gaussian\", 0.5, 0.1, 2.0)\n",
    "model = ROOT.RooGaussian(\"model\", \"Gaussian with shifting mean\", x, fy, sigma)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c433271",
   "metadata": {},
   "source": [
    "Obtain fake external experimental dataset with values for x and y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "563cb604",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:39.609088Z",
     "iopub.status.busy": "2026-05-19T20:30:39.608962Z",
     "iopub.status.idle": "2026-05-19T20:30:39.823509Z",
     "shell.execute_reply": "2026-05-19T20:30:39.822991Z"
    }
   },
   "outputs": [],
   "source": [
    "expDataXY = makeFakeDataXY()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "777340a1",
   "metadata": {},
   "source": [
    "Generate data from conditional p.d.f. model(x|y)\n",
    "---------------------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8faa342",
   "metadata": {},
   "source": [
    "Make subset of experimental data with only y values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c0e86737",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:39.825633Z",
     "iopub.status.busy": "2026-05-19T20:30:39.825398Z",
     "iopub.status.idle": "2026-05-19T20:30:39.941047Z",
     "shell.execute_reply": "2026-05-19T20:30:39.940478Z"
    }
   },
   "outputs": [],
   "source": [
    "expDataY = expDataXY.reduce({y})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ada53239",
   "metadata": {},
   "source": [
    "Generate 10000 events in x obtained from _conditional_ model(x|y) with y\n",
    "values taken from experimental data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "da5f463f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:39.942978Z",
     "iopub.status.busy": "2026-05-19T20:30:39.942852Z",
     "iopub.status.idle": "2026-05-19T20:30:40.085680Z",
     "shell.execute_reply": "2026-05-19T20:30:40.085125Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RooDataSet::modelData[x,y] = 6850 entries\n"
     ]
    }
   ],
   "source": [
    "data = model.generate({x}, ProtoData=expDataY)\n",
    "data.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "485c6635",
   "metadata": {},
   "source": [
    "Fit conditional p.d.f model(x|y) to data\n",
    "---------------------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "76222c6c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:40.087166Z",
     "iopub.status.busy": "2026-05-19T20:30:40.087040Z",
     "iopub.status.idle": "2026-05-19T20:30:40.324993Z",
     "shell.execute_reply": "2026-05-19T20:30:40.324415Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(model_over_model_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 683.464 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_over_model_Int[x]_d) 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(expDataXY, ConditionalObservables={y}, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9438ee2f",
   "metadata": {},
   "source": [
    "Project conditional p.d.f on x and y dimensions\n",
    "---------------------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed0a1119",
   "metadata": {},
   "source": [
    "Plot x distribution of data and projection of model x = 1/Ndata\n",
    "sum(data(y_i)) model(x;y_i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ad503248",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:40.326709Z",
     "iopub.status.busy": "2026-05-19T20:30:40.326563Z",
     "iopub.status.idle": "2026-05-19T20:30:40.509257Z",
     "shell.execute_reply": "2026-05-19T20:30:40.508785Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsReal::plotOn(model) plot on x averages using data variables (y)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5574995925e0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xframe = x.frame()\n",
    "expDataXY.plotOn(xframe)\n",
    "model.plotOn(xframe, ProjWData=expDataY)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e838a452",
   "metadata": {},
   "source": [
    "Speed up (and approximate) projection by using binned clone of data for\n",
    "projection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "82ecc252",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:40.511232Z",
     "iopub.status.busy": "2026-05-19T20:30:40.511106Z",
     "iopub.status.idle": "2026-05-19T20:30:40.635010Z",
     "shell.execute_reply": "2026-05-19T20:30:40.634459Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5574995925e0>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsReal::plotOn(model) plot on x averages using data variables (y)\n"
     ]
    }
   ],
   "source": [
    "binnedDataY = expDataY.binnedClone()\n",
    "model.plotOn(xframe, ProjWData=binnedDataY, LineColor=\"c\", LineStyle=\":\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75e3d258",
   "metadata": {},
   "source": [
    "Show effect of projection with too coarse binning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "ab0b98fd",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:40.636479Z",
     "iopub.status.busy": "2026-05-19T20:30:40.636353Z",
     "iopub.status.idle": "2026-05-19T20:30:40.750796Z",
     "shell.execute_reply": "2026-05-19T20:30:40.750268Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5574995925e0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsReal::plotOn(model) plot on x averages using data variables (y)\n"
     ]
    }
   ],
   "source": [
    "(expDataY.get().find(\"y\")).setBins(5)\n",
    "binnedDataY2 = expDataY.binnedClone()\n",
    "model.plotOn(xframe, ProjWData=binnedDataY2, LineColor=\"r\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33408958",
   "metadata": {},
   "source": [
    "Make canvas and draw ROOT.RooPlots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f008efc2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:40.752333Z",
     "iopub.status.busy": "2026-05-19T20:30:40.752204Z",
     "iopub.status.idle": "2026-05-19T20:30:40.961432Z",
     "shell.execute_reply": "2026-05-19T20:30:40.960912Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf303_conditional.png has been created\n"
     ]
    }
   ],
   "source": [
    "c = ROOT.TCanvas(\"rf303_conditional\", \"rf303_conditional\", 600, 460)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "xframe.GetYaxis().SetTitleOffset(1.2)\n",
    "xframe.Draw()\n",
    "\n",
    "c.SaveAs(\"rf303_conditional.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0e3cc6a",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c4478908",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:30:40.963200Z",
     "iopub.status.busy": "2026-05-19T20:30:40.963075Z",
     "iopub.status.idle": "2026-05-19T20:30:41.145014Z",
     "shell.execute_reply": "2026-05-19T20:30:41.144521Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222641135\" style=\"width: 600px; height: 460px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222641135() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(34541,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222641135', 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_1779222641135();\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
}
