{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ee8c2044",
   "metadata": {},
   "source": [
    "# rf405_realtocatfuncs\n",
    "Data and categories: demonstration of real-discrete mapping functions\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": "f04f3bd1",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:48.387269Z",
     "iopub.status.busy": "2026-05-19T20:31:48.387149Z",
     "iopub.status.idle": "2026-05-19T20:31:49.349991Z",
     "shell.execute_reply": "2026-05-19T20:31:49.349126Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e01149a",
   "metadata": {},
   "source": [
    "Define pdf in x, sample dataset in x\n",
    "------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68a4dd23",
   "metadata": {},
   "source": [
    "Define a dummy PDF in x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "149d1a5e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:49.352302Z",
     "iopub.status.busy": "2026-05-19T20:31:49.352161Z",
     "iopub.status.idle": "2026-05-19T20:31:49.567366Z",
     "shell.execute_reply": "2026-05-19T20:31:49.551376Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", 0, 10)\n",
    "a = ROOT.RooArgusBG(\"a\", \"argus(x)\", x, 10.0, -1.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e5b0d26",
   "metadata": {},
   "source": [
    "Generate a dummy dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6feef94c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:49.569169Z",
     "iopub.status.busy": "2026-05-19T20:31:49.569033Z",
     "iopub.status.idle": "2026-05-19T20:31:49.725950Z",
     "shell.execute_reply": "2026-05-19T20:31:49.725258Z"
    }
   },
   "outputs": [],
   "source": [
    "data = a.generate({x}, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c424e21",
   "metadata": {},
   "source": [
    "Create a threshold real -> cat function\n",
    "--------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6a0cddb",
   "metadata": {},
   "source": [
    "A RooThresholdCategory is a category function that maps regions in a real-valued\n",
    "input observable observables to state names. At construction time a 'default'\n",
    "state name must be specified to which all values of x are mapped that are not\n",
    "otherwise assigned"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f7c51b56",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:49.728046Z",
     "iopub.status.busy": "2026-05-19T20:31:49.727914Z",
     "iopub.status.idle": "2026-05-19T20:31:49.842886Z",
     "shell.execute_reply": "2026-05-19T20:31:49.842274Z"
    }
   },
   "outputs": [],
   "source": [
    "xRegion = ROOT.RooThresholdCategory(\"xRegion\", \"region of x\", x, \"Background\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39e75906",
   "metadata": {},
   "source": [
    "Specify thresholds and state assignments one-by-one.\n",
    "Each statement specifies that all values _below_ the given value\n",
    "(and above any lower specified threshold) are mapped to the\n",
    "category state with the given name\n",
    "\n",
    "Background | SideBand | Signal | SideBand | Background\n",
    "          4.23       5.23     8.23       9.23"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a2767d90",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:49.844747Z",
     "iopub.status.busy": "2026-05-19T20:31:49.844485Z",
     "iopub.status.idle": "2026-05-19T20:31:49.955833Z",
     "shell.execute_reply": "2026-05-19T20:31:49.955228Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xRegion.addThreshold(4.23, \"Background\")\n",
    "xRegion.addThreshold(5.23, \"SideBand\")\n",
    "xRegion.addThreshold(8.23, \"Signal\")\n",
    "xRegion.addThreshold(9.23, \"SideBand\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b161be8d",
   "metadata": {},
   "source": [
    "Use threshold function to plot data regions\n",
    "----------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ddac1d1b",
   "metadata": {},
   "source": [
    "Add values of threshold function to dataset so that it can be used as\n",
    "observable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "df60686f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:49.957961Z",
     "iopub.status.busy": "2026-05-19T20:31:49.957829Z",
     "iopub.status.idle": "2026-05-19T20:31:50.072368Z",
     "shell.execute_reply": "2026-05-19T20:31:50.071310Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooCategory object at 0x5598ec5f9c00>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.addColumn(xRegion)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b57fb29",
   "metadata": {},
   "source": [
    "Make plot of data in x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a8b6b292",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:50.073995Z",
     "iopub.status.busy": "2026-05-19T20:31:50.073839Z",
     "iopub.status.idle": "2026-05-19T20:31:50.237074Z",
     "shell.execute_reply": "2026-05-19T20:31:50.236648Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5598ec7a7790>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xframe = x.frame(Title=\"Demo of threshold and binning mapping functions\")\n",
    "data.plotOn(xframe)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f5fe4ec4",
   "metadata": {},
   "source": [
    "Use calculated category to select sideband data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f406b6ea",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:50.239624Z",
     "iopub.status.busy": "2026-05-19T20:31:50.239453Z",
     "iopub.status.idle": "2026-05-19T20:31:50.367339Z",
     "shell.execute_reply": "2026-05-19T20:31:50.366649Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooTreeData::plotOn: plotting 2748 events out of 10000 total events\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5598ec7a7790>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.plotOn(xframe, Cut=\"xRegion==xRegion::SideBand\", MarkerColor=\"r\", LineColor=\"r\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2fe6d7a4",
   "metadata": {},
   "source": [
    "Create a binning real -> cat function\n",
    "----------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b889d50",
   "metadata": {},
   "source": [
    "A RooBinningCategory is a category function that maps bins of a (named) binning definition\n",
    "in a real-valued input observable observables to state names. The state names are automatically\n",
    "constructed from the variable name, binning name and the bin number. If no binning name\n",
    "is specified the default binning is mapped"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5500e224",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:50.369438Z",
     "iopub.status.busy": "2026-05-19T20:31:50.369302Z",
     "iopub.status.idle": "2026-05-19T20:31:50.484893Z",
     "shell.execute_reply": "2026-05-19T20:31:50.484203Z"
    }
   },
   "outputs": [],
   "source": [
    "x.setBins(10, \"coarse\")\n",
    "xBins = ROOT.RooBinningCategory(\"xBins\", \"coarse bins in x\", x, \"coarse\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "86e5d911",
   "metadata": {},
   "source": [
    "Use binning function for tabulation and plotting\n",
    "-----------------------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3aea793b",
   "metadata": {},
   "source": [
    "Print table of xBins state multiplicity. Note that xBins does not need to be an observable in data\n",
    "it can be a function of observables in data as well"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "bacdd479",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:50.487169Z",
     "iopub.status.busy": "2026-05-19T20:31:50.487002Z",
     "iopub.status.idle": "2026-05-19T20:31:50.605867Z",
     "shell.execute_reply": "2026-05-19T20:31:50.605084Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "  Table xBins : aData\n",
      "  +---------------+------+\n",
      "  | x_coarse_bin0 |  105 |\n",
      "  | x_coarse_bin1 |  329 |\n",
      "  | x_coarse_bin2 |  499 |\n",
      "  | x_coarse_bin3 |  739 |\n",
      "  | x_coarse_bin4 |  934 |\n",
      "  | x_coarse_bin5 | 1218 |\n",
      "  | x_coarse_bin6 | 1450 |\n",
      "  | x_coarse_bin7 | 1675 |\n",
      "  | x_coarse_bin8 | 1767 |\n",
      "  | x_coarse_bin9 | 1284 |\n",
      "  +---------------+------+\n",
      "\n"
     ]
    }
   ],
   "source": [
    "xbtable = data.table(xBins)\n",
    "xbtable.Print(\"v\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d92c7c5",
   "metadata": {},
   "source": [
    "Add values of xBins function to dataset so that it can be used as\n",
    "observable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3506d584",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:50.607382Z",
     "iopub.status.busy": "2026-05-19T20:31:50.607254Z",
     "iopub.status.idle": "2026-05-19T20:31:50.712196Z",
     "shell.execute_reply": "2026-05-19T20:31:50.711390Z"
    }
   },
   "outputs": [],
   "source": [
    "xb = data.addColumn(xBins)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b73aaff",
   "metadata": {},
   "source": [
    "Define range \"alt\" as including bins 1,3,5,7,9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b1cbdbb0",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:50.713758Z",
     "iopub.status.busy": "2026-05-19T20:31:50.713590Z",
     "iopub.status.idle": "2026-05-19T20:31:50.821582Z",
     "shell.execute_reply": "2026-05-19T20:31:50.820879Z"
    }
   },
   "outputs": [],
   "source": [
    "xb.setRange(\"alt\", \"x_coarse_bin1,x_coarse_bin3,x_coarse_bin5,x_coarse_bin7,x_coarse_bin9\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87cd4b2f",
   "metadata": {},
   "source": [
    "Construct subset of data matching range \"alt\" but only for the first\n",
    "5000 events and plot it on the frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "936aeba2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:50.823808Z",
     "iopub.status.busy": "2026-05-19T20:31:50.823675Z",
     "iopub.status.idle": "2026-05-19T20:31:51.072505Z",
     "shell.execute_reply": "2026-05-19T20:31:51.071676Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Plotting -- RooPlot::updateFitRangeNorm: New event count of 2627 will supersede previous event count of 10000 for normalization of PDF projections\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf405_realtocatfuncs.png has been created\n"
     ]
    }
   ],
   "source": [
    "dataSel = data.reduce(CutRange=\"alt\", EventRange=(0, 5000))\n",
    "dataSel.plotOn(xframe, MarkerColor=\"g\", LineColor=\"g\")\n",
    "\n",
    "c = ROOT.TCanvas(\"rf405_realtocatfuncs\", \"rf405_realtocatfuncs\", 600, 600)\n",
    "xframe.SetMinimum(0.01)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "xframe.GetYaxis().SetTitleOffset(1.4)\n",
    "xframe.Draw()\n",
    "\n",
    "c.SaveAs(\"rf405_realtocatfuncs.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed18e7ec",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "311f707e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:31:51.074000Z",
     "iopub.status.busy": "2026-05-19T20:31:51.073868Z",
     "iopub.status.idle": "2026-05-19T20:31:51.254254Z",
     "shell.execute_reply": "2026-05-19T20:31:51.253383Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222711244\" style=\"width: 600px; height: 600px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222711244() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(32059,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222711244', 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_1779222711244();\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
}
