{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "19ca7bb8",
   "metadata": {},
   "source": [
    "# rf311_rangeplot\n",
    "Multidimensional models: projecting pdf and data ranges in continuous observables\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": "670f13ac",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:08.215687Z",
     "iopub.status.busy": "2026-05-19T20:31:08.215552Z",
     "iopub.status.idle": "2026-05-19T20:31:09.176132Z",
     "shell.execute_reply": "2026-05-19T20:31:09.175395Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ae7e2d0",
   "metadata": {},
   "source": [
    "Create 3D pdf and data\n",
    "-------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d53c333",
   "metadata": {},
   "source": [
    "Create observables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "cd6a8128",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:09.185476Z",
     "iopub.status.busy": "2026-05-19T20:31:09.185316Z",
     "iopub.status.idle": "2026-05-19T20:31:09.348505Z",
     "shell.execute_reply": "2026-05-19T20:31:09.347831Z"
    }
   },
   "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": "7351eab9",
   "metadata": {},
   "source": [
    "Create signal pdf gauss(x)*gauss(y)*gauss(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d838dabd",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:09.352424Z",
     "iopub.status.busy": "2026-05-19T20:31:09.352296Z",
     "iopub.status.idle": "2026-05-19T20:31:09.553069Z",
     "shell.execute_reply": "2026-05-19T20:31:09.552392Z"
    }
   },
   "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": "d890d7d1",
   "metadata": {},
   "source": [
    "Create background pdf poly(x)*poly(y)*poly(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2428e3d7",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:09.555381Z",
     "iopub.status.busy": "2026-05-19T20:31:09.555246Z",
     "iopub.status.idle": "2026-05-19T20:31:09.686364Z",
     "shell.execute_reply": "2026-05-19T20:31:09.685642Z"
    }
   },
   "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": "9609b531",
   "metadata": {},
   "source": [
    "Create composite pdf sig+bkg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5488aff8",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:09.688508Z",
     "iopub.status.busy": "2026-05-19T20:31:09.688380Z",
     "iopub.status.idle": "2026-05-19T20:31:09.871446Z",
     "shell.execute_reply": "2026-05-19T20:31:09.870654Z"
    }
   },
   "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": "b995ef7e",
   "metadata": {},
   "source": [
    "Project pdf and data on x\n",
    "-------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8bebefaa",
   "metadata": {},
   "source": [
    "Make plain projection of data and pdf on x observable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5fd1a45b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:09.873256Z",
     "iopub.status.busy": "2026-05-19T20:31:09.873116Z",
     "iopub.status.idle": "2026-05-19T20:31:10.068815Z",
     "shell.execute_reply": "2026-05-19T20:31:10.068097Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsReal::plotOn(model) plot on x integrates over variables (y,z)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x55a1d20b78d0>"
      ]
     },
     "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": "697d1950",
   "metadata": {},
   "source": [
    "Project pdf and data on x in signal range\n",
    "----------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b343988b",
   "metadata": {},
   "source": [
    "Define signal region in y and z observables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e8b515da",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:10.070912Z",
     "iopub.status.busy": "2026-05-19T20:31:10.070785Z",
     "iopub.status.idle": "2026-05-19T20:31:10.180304Z",
     "shell.execute_reply": "2026-05-19T20:31:10.179644Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Eval -- RooRealVar::setRange(y) new range named 'sigRegion' created with bounds [-1,1]\n",
      "[#1] INFO:Eval -- RooRealVar::setRange(z) new range named 'sigRegion' created with bounds [-1,1]\n"
     ]
    }
   ],
   "source": [
    "y.setRange(\"sigRegion\", -1, 1)\n",
    "z.setRange(\"sigRegion\", -1, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "739c21ad",
   "metadata": {},
   "source": [
    "Make plot frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "175f0c63",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:10.181868Z",
     "iopub.status.busy": "2026-05-19T20:31:10.181746Z",
     "iopub.status.idle": "2026-05-19T20:31:10.285229Z",
     "shell.execute_reply": "2026-05-19T20:31:10.284532Z"
    }
   },
   "outputs": [],
   "source": [
    "frame2 = x.frame(Title=\"Same projection on X in signal range of (Y,Z)\", Bins=40)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57ecb034",
   "metadata": {},
   "source": [
    "Plot subset of data in which all observables are inside \"sigRegion\"\n",
    "For observables that do not have an explicit \"sigRegion\" range defined (e.g. observable)\n",
    "an implicit definition is used that is identical to the full range (i.e.\n",
    "[-5,5] for x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6b16ae10",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:10.287051Z",
     "iopub.status.busy": "2026-05-19T20:31:10.286931Z",
     "iopub.status.idle": "2026-05-19T20:31:10.400510Z",
     "shell.execute_reply": "2026-05-19T20:31:10.399888Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooTreeData::plotOn: plotting 1692 events out of 20000 total events\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x55a1d21908c0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.plotOn(frame2, CutRange=\"sigRegion\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e33a4c7",
   "metadata": {},
   "source": [
    "Project model on x, projected observables (y,z) only in \"sigRegion\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3139d567",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:10.402367Z",
     "iopub.status.busy": "2026-05-19T20:31:10.402245Z",
     "iopub.status.idle": "2026-05-19T20:31:10.633913Z",
     "shell.execute_reply": "2026-05-19T20:31:10.633407Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooAbsReal::plotOn(model) plot on x integrates over variables (y,z) in range sigRegion\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf311_rangeplot.png has been created\n"
     ]
    }
   ],
   "source": [
    "model.plotOn(frame2, ProjectionRange=\"sigRegion\")\n",
    "\n",
    "c = ROOT.TCanvas(\"rf311_rangeplot\", \"rf310_rangeplot\", 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",
    "\n",
    "c.SaveAs(\"rf311_rangeplot.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "479d00e9",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "c4756552",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:10.635426Z",
     "iopub.status.busy": "2026-05-19T20:31:10.635296Z",
     "iopub.status.idle": "2026-05-19T20:31:10.820696Z",
     "shell.execute_reply": "2026-05-19T20:31:10.820236Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222670811\" style=\"width: 800px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222670811() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(37711,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222670811', 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_1779222670811();\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
}
