{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "83ce9d60",
   "metadata": {},
   "source": [
    "# rf316_llratioplot\n",
    "Multidimensional models: using the likelihood ratio technique to construct a signal\n",
    "enhanced one-dimensional projection of a multi-dimensional pdf\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:31 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5ffd06aa",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:24.730953Z",
     "iopub.status.busy": "2026-05-19T20:31:24.730836Z",
     "iopub.status.idle": "2026-05-19T20:31:25.711900Z",
     "shell.execute_reply": "2026-05-19T20:31:25.706346Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de68d24c",
   "metadata": {},
   "source": [
    "Create 3D pdf and data\n",
    "-------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26733d08",
   "metadata": {},
   "source": [
    "Create observables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e56f30eb",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:25.714282Z",
     "iopub.status.busy": "2026-05-19T20:31:25.714157Z",
     "iopub.status.idle": "2026-05-19T20:31:25.871264Z",
     "shell.execute_reply": "2026-05-19T20:31:25.870611Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", -5, 5)\n",
    "y = ROOT.RooRealVar(\"y\", \"y\", -5, 5)\n",
    "z = ROOT.RooRealVar(\"z\", \"z\", -5, 5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b22e7457",
   "metadata": {},
   "source": [
    "Create signal pdf gauss(x)*gauss(y)*gauss(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9293a988",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:25.873341Z",
     "iopub.status.busy": "2026-05-19T20:31:25.873213Z",
     "iopub.status.idle": "2026-05-19T20:31:26.071756Z",
     "shell.execute_reply": "2026-05-19T20:31:26.071083Z"
    }
   },
   "outputs": [],
   "source": [
    "gx = ROOT.RooGaussian(\"gx\", \"gx\", x, 0.0, 1.0)\n",
    "gy = ROOT.RooGaussian(\"gy\", \"gy\", y, 0.0, 1.0)\n",
    "gz = ROOT.RooGaussian(\"gz\", \"gz\", z, 0.0, 1.0)\n",
    "sig = ROOT.RooProdPdf(\"sig\", \"sig\", [gx, gy, gz])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b93fadbe",
   "metadata": {},
   "source": [
    "Create background pdf poly(x)*poly(y)*poly(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ceb82169",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:26.073698Z",
     "iopub.status.busy": "2026-05-19T20:31:26.073557Z",
     "iopub.status.idle": "2026-05-19T20:31:26.203479Z",
     "shell.execute_reply": "2026-05-19T20:31:26.203124Z"
    }
   },
   "outputs": [],
   "source": [
    "px = ROOT.RooPolynomial(\"px\", \"px\", x, [-0.1, 0.004])\n",
    "py = ROOT.RooPolynomial(\"py\", \"py\", y, [0.1, -0.004])\n",
    "pz = ROOT.RooPolynomial(\"pz\", \"pz\", z)\n",
    "bkg = ROOT.RooProdPdf(\"bkg\", \"bkg\", [px, py, pz])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f375d00f",
   "metadata": {},
   "source": [
    "Create composite pdf sig+bkg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "55deca80",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:26.205810Z",
     "iopub.status.busy": "2026-05-19T20:31:26.205687Z",
     "iopub.status.idle": "2026-05-19T20:31:26.383462Z",
     "shell.execute_reply": "2026-05-19T20:31:26.382799Z"
    }
   },
   "outputs": [],
   "source": [
    "fsig = ROOT.RooRealVar(\"fsig\", \"signal fraction\", 0.1, 0.0, 1.0)\n",
    "model = ROOT.RooAddPdf(\"model\", \"model\", [sig, bkg], [fsig])\n",
    "\n",
    "data = model.generate({x, y, z}, 20000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "405a8384",
   "metadata": {},
   "source": [
    "Project pdf and data on x\n",
    "-------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9de2a1c",
   "metadata": {},
   "source": [
    "Make plain projection of data and pdf on x observable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a13f5092",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:26.385713Z",
     "iopub.status.busy": "2026-05-19T20:31:26.385572Z",
     "iopub.status.idle": "2026-05-19T20:31:26.570996Z",
     "shell.execute_reply": "2026-05-19T20:31:26.570640Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsReal::plotOn(model) plot on x integrates over variables (z,y)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x56183c33cc40>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame = x.frame(Title=\"Projection of 3D data and pdf on X\", Bins=40)\n",
    "data.plotOn(frame)\n",
    "model.plotOn(frame)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba4b017c",
   "metadata": {},
   "source": [
    "Define projected signal likelihood ratio\n",
    "----------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e04eda56",
   "metadata": {},
   "source": [
    "Calculate projection of signal and total likelihood on (y,z) observables\n",
    "i.e. integrate signal and composite model over x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "bd3f89d2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:26.572906Z",
     "iopub.status.busy": "2026-05-19T20:31:26.572788Z",
     "iopub.status.idle": "2026-05-19T20:31:26.686137Z",
     "shell.execute_reply": "2026-05-19T20:31:26.685707Z"
    }
   },
   "outputs": [],
   "source": [
    "sigyz = sig.createProjection({x})\n",
    "totyz = model.createProjection({x})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3a89e80",
   "metadata": {},
   "source": [
    "Construct the log of the signal / signal+background probability"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7667f56d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:26.687734Z",
     "iopub.status.busy": "2026-05-19T20:31:26.687599Z",
     "iopub.status.idle": "2026-05-19T20:31:26.805777Z",
     "shell.execute_reply": "2026-05-19T20:31:26.805324Z"
    }
   },
   "outputs": [],
   "source": [
    "llratio_func = ROOT.RooFormulaVar(\"llratio\", \"log10(@0)-log10(@1)\", [sigyz, totyz])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7c9a966",
   "metadata": {},
   "source": [
    "Plot data with a LL ratio cut\n",
    "-------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d6be6725",
   "metadata": {},
   "source": [
    "Calculate the llratio value for each event in the dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "22b6c0ee",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:26.807395Z",
     "iopub.status.busy": "2026-05-19T20:31:26.807282Z",
     "iopub.status.idle": "2026-05-19T20:31:26.927222Z",
     "shell.execute_reply": "2026-05-19T20:31:26.926792Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooRealVar object at 0x56183c3d67b0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.addColumn(llratio_func)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8fab71a",
   "metadata": {},
   "source": [
    "Extract the subset of data with large signal likelihood"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3e57ddab",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:26.928894Z",
     "iopub.status.busy": "2026-05-19T20:31:26.928779Z",
     "iopub.status.idle": "2026-05-19T20:31:27.059958Z",
     "shell.execute_reply": "2026-05-19T20:31:27.059514Z"
    }
   },
   "outputs": [],
   "source": [
    "dataSel = data.reduce(Cut=\"llratio>0.7\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f3027f98",
   "metadata": {},
   "source": [
    "Make plot frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "aad6e91b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:27.061661Z",
     "iopub.status.busy": "2026-05-19T20:31:27.061521Z",
     "iopub.status.idle": "2026-05-19T20:31:27.164740Z",
     "shell.execute_reply": "2026-05-19T20:31:27.164285Z"
    }
   },
   "outputs": [],
   "source": [
    "frame2 = x.frame(Title=\"Same projection on X with LLratio(y,z)>0.7\", Bins=40)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ebecb1b",
   "metadata": {},
   "source": [
    "Plot select data on frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "24da25a5",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:27.166383Z",
     "iopub.status.busy": "2026-05-19T20:31:27.166269Z",
     "iopub.status.idle": "2026-05-19T20:31:27.270300Z",
     "shell.execute_reply": "2026-05-19T20:31:27.269862Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x56183c45c960>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataSel.plotOn(frame2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c35e273",
   "metadata": {},
   "source": [
    "Make MC projection of pdf with same LL ratio cut\n",
    "---------------------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e9212e19",
   "metadata": {},
   "source": [
    "Generate large number of events for MC integration of pdf projection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a55ed2d7",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:27.271989Z",
     "iopub.status.busy": "2026-05-19T20:31:27.271876Z",
     "iopub.status.idle": "2026-05-19T20:31:27.389389Z",
     "shell.execute_reply": "2026-05-19T20:31:27.388936Z"
    }
   },
   "outputs": [],
   "source": [
    "mcprojData = model.generate({x, y, z}, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "428711a7",
   "metadata": {},
   "source": [
    "Calculate LL ratio for each generated event and select MC events with\n",
    "llratio)0.7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "f81b206a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:27.391068Z",
     "iopub.status.busy": "2026-05-19T20:31:27.390956Z",
     "iopub.status.idle": "2026-05-19T20:31:27.500843Z",
     "shell.execute_reply": "2026-05-19T20:31:27.500379Z"
    }
   },
   "outputs": [],
   "source": [
    "mcprojData.addColumn(llratio_func)\n",
    "mcprojDataSel = mcprojData.reduce(Cut=\"llratio>0.7\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3282e6b5",
   "metadata": {},
   "source": [
    "Project model on x, projected observables (y,z) with Monte Carlo technique\n",
    "on set of events with the same llratio cut as was applied to data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c376929b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:27.502633Z",
     "iopub.status.busy": "2026-05-19T20:31:27.502499Z",
     "iopub.status.idle": "2026-05-19T20:31:27.744369Z",
     "shell.execute_reply": "2026-05-19T20:31:27.743792Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsReal::plotOn(model) plot on x averages using data variables (z,y)\n",
      "[#1] INFO:Plotting -- RooAbsReal::plotOn(model) only the following components of the projection data will be used: (z,y)\n",
      "[#1] INFO:Fitting -- using generic CPU library compiled with no vectorizations\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf316_llratioplot.png has been created\n"
     ]
    }
   ],
   "source": [
    "model.plotOn(frame2, ProjWData=mcprojDataSel)\n",
    "\n",
    "c = ROOT.TCanvas(\"rf316_llratioplot\", \"rf316_llratioplot\", 800, 400)\n",
    "c.Divide(2)\n",
    "c.cd(1)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame.GetYaxis().SetTitleOffset(1.4)\n",
    "frame.Draw()\n",
    "c.cd(2)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame2.GetYaxis().SetTitleOffset(1.4)\n",
    "frame2.Draw()\n",
    "c.SaveAs(\"rf316_llratioplot.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c67a683b",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "c7b45123",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:27.747156Z",
     "iopub.status.busy": "2026-05-19T20:31:27.747033Z",
     "iopub.status.idle": "2026-05-19T20:31:27.928898Z",
     "shell.execute_reply": "2026-05-19T20:31:27.928336Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222687919\" style=\"width: 800px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222687919() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(37653,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222687919', 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_1779222687919();\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
}
