{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "def58f45",
   "metadata": {},
   "source": [
    "# rf105_funcbinding\n",
    "'BASIC FUNCTIONALITY' RooFit tutorial macro #105\n",
    "Demonstration of binding ROOT Math functions as RooFit functions\n",
    "and 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:28 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9d677215",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:52.350160Z",
     "iopub.status.busy": "2026-05-19T20:28:52.350032Z",
     "iopub.status.idle": "2026-05-19T20:28:53.311295Z",
     "shell.execute_reply": "2026-05-19T20:28:53.310672Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af7d801b",
   "metadata": {},
   "source": [
    "Bind ROOT TMath::Erf C function\n",
    "---------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0725fd7d",
   "metadata": {},
   "source": [
    "Bind one-dimensional ROOT.TMath.Erf function as ROOT.RooAbsReal function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8f6889ea",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:53.313327Z",
     "iopub.status.busy": "2026-05-19T20:28:53.313187Z",
     "iopub.status.idle": "2026-05-19T20:28:53.754455Z",
     "shell.execute_reply": "2026-05-19T20:28:53.753739Z"
    }
   },
   "outputs": [],
   "source": [
    "x = ROOT.RooRealVar(\"x\", \"x\", -3, 3)\n",
    "erf = ROOT.RooFit.bindFunction(\"erf\", ROOT.TMath.Erf, x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc43136a",
   "metadata": {},
   "source": [
    "Print erf definition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c3b07a4b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:53.756209Z",
     "iopub.status.busy": "2026-05-19T20:28:53.756080Z",
     "iopub.status.idle": "2026-05-19T20:28:53.866379Z",
     "shell.execute_reply": "2026-05-19T20:28:53.865786Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RooCFunction1Binding<double,double>::erf[ function=(0x7ff7b2451000) x=x ] = 0\n"
     ]
    }
   ],
   "source": [
    "erf.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7afb780",
   "metadata": {},
   "source": [
    "Plot erf on frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a06155ce",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:53.868310Z",
     "iopub.status.busy": "2026-05-19T20:28:53.868180Z",
     "iopub.status.idle": "2026-05-19T20:28:54.038126Z",
     "shell.execute_reply": "2026-05-19T20:28:54.037471Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5639fd15d1f0>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame1 = x.frame(Title=\"TMath.Erf bound as ROOT.RooFit function\")\n",
    "erf.plotOn(frame1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b95d273d",
   "metadata": {},
   "source": [
    "Bind ROOT::Math::beta_pdf C function\n",
    "-----------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e0c58dc",
   "metadata": {},
   "source": [
    "Bind pdf ROOT.Math.Beta with three variables as ROOT.RooAbsPdf function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "db32801a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:54.040069Z",
     "iopub.status.busy": "2026-05-19T20:28:54.039940Z",
     "iopub.status.idle": "2026-05-19T20:28:54.175845Z",
     "shell.execute_reply": "2026-05-19T20:28:54.175099Z"
    }
   },
   "outputs": [],
   "source": [
    "x2 = ROOT.RooRealVar(\"x2\", \"x2\", 0, 0.999)\n",
    "a = ROOT.RooRealVar(\"a\", \"a\", 5, 0, 10)\n",
    "b = ROOT.RooRealVar(\"b\", \"b\", 2, 0, 10)\n",
    "beta = ROOT.RooFit.bindPdf(\"beta\", ROOT.Math.beta_pdf, x2, a, b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "675675b3",
   "metadata": {},
   "source": [
    "Perf beta definition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5d7055e9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:54.177823Z",
     "iopub.status.busy": "2026-05-19T20:28:54.177692Z",
     "iopub.status.idle": "2026-05-19T20:28:54.282226Z",
     "shell.execute_reply": "2026-05-19T20:28:54.281611Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RooCFunction3PdfBinding<double,double,double,double>::beta[ function=ROOT::Math::beta_pdf x=x2 a=a b=b ] = 0.934689\n"
     ]
    }
   ],
   "source": [
    "beta.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0aaba49e",
   "metadata": {},
   "source": [
    "Generate some events and fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f08c4dcb",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:54.283876Z",
     "iopub.status.busy": "2026-05-19T20:28:54.283744Z",
     "iopub.status.idle": "2026-05-19T20:28:54.538913Z",
     "shell.execute_reply": "2026-05-19T20:28:54.538240Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(beta_Int[x2]) using numeric integrator RooIntegrator1D to calculate Int(x2)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(beta_Int[x2]) using numeric integrator RooIntegrator1D to calculate Int(x2)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooFitResult object at 0x(nil)>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(beta_over_beta_Int[x2]) 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 786.462 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_beta_over_beta_Int[x2]_betaData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(beta_Int[x2]) using numeric integrator RooIntegrator1D to calculate Int(x2)\n"
     ]
    }
   ],
   "source": [
    "data = beta.generate({x2}, 10000)\n",
    "beta.fitTo(data, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7dca6f80",
   "metadata": {},
   "source": [
    "Plot data and pdf on frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "44729441",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:54.540803Z",
     "iopub.status.busy": "2026-05-19T20:28:54.540654Z",
     "iopub.status.idle": "2026-05-19T20:28:54.699001Z",
     "shell.execute_reply": "2026-05-19T20:28:54.698295Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(beta_Int[x2]) using numeric integrator RooIntegrator1D to calculate Int(x2)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooPlot object at 0x5639fd924590>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "frame2 = x2.frame(Title=\"ROOT.Math.Beta bound as ROOT.RooFit pdf\")\n",
    "data.plotOn(frame2)\n",
    "beta.plotOn(frame2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9695a6a",
   "metadata": {},
   "source": [
    "Bind ROOT TF1 as RooFit function\n",
    "---------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "693a5d55",
   "metadata": {},
   "source": [
    "Create a ROOT TF1 function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "cf9da470",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:54.700970Z",
     "iopub.status.busy": "2026-05-19T20:28:54.700842Z",
     "iopub.status.idle": "2026-05-19T20:28:54.822408Z",
     "shell.execute_reply": "2026-05-19T20:28:54.821711Z"
    }
   },
   "outputs": [],
   "source": [
    "fa1 = ROOT.TF1(\"fa1\", \"sin(x)/x\", 0, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1bed7c1",
   "metadata": {},
   "source": [
    "Create an observable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "06f7f098",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:54.824254Z",
     "iopub.status.busy": "2026-05-19T20:28:54.824128Z",
     "iopub.status.idle": "2026-05-19T20:28:54.927515Z",
     "shell.execute_reply": "2026-05-19T20:28:54.926867Z"
    }
   },
   "outputs": [],
   "source": [
    "x3 = ROOT.RooRealVar(\"x3\", \"x3\", 0.01, 20)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "419e1fdd",
   "metadata": {},
   "source": [
    "Create binding of TF1 object to above observable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d18e4780",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:54.929518Z",
     "iopub.status.busy": "2026-05-19T20:28:54.929388Z",
     "iopub.status.idle": "2026-05-19T20:28:55.038737Z",
     "shell.execute_reply": "2026-05-19T20:28:55.037982Z"
    }
   },
   "outputs": [],
   "source": [
    "rfa1 = ROOT.RooFit.bindFunction(fa1, x3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bea47f16",
   "metadata": {},
   "source": [
    "Print rfa1 definition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "6280f76e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:55.040909Z",
     "iopub.status.busy": "2026-05-19T20:28:55.040786Z",
     "iopub.status.idle": "2026-05-19T20:28:55.144707Z",
     "shell.execute_reply": "2026-05-19T20:28:55.143931Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RooTFnBinding::fa1[ TFn={fa1=sin(x)/x} obs=(x3) params=() ] = -0.0547936\n"
     ]
    }
   ],
   "source": [
    "rfa1.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e2b6d3e",
   "metadata": {},
   "source": [
    "Make plot frame in observable, TF1 binding function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "cb130323",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:55.146305Z",
     "iopub.status.busy": "2026-05-19T20:28:55.146182Z",
     "iopub.status.idle": "2026-05-19T20:28:55.373547Z",
     "shell.execute_reply": "2026-05-19T20:28:55.372945Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rf105_funcbinding.png has been created\n"
     ]
    }
   ],
   "source": [
    "frame3 = x3.frame(Title=\"TF1 bound as ROOT.RooFit function\")\n",
    "rfa1.plotOn(frame3)\n",
    "\n",
    "c = ROOT.TCanvas(\"rf105_funcbinding\", \"rf105_funcbinding\", 1200, 400)\n",
    "c.Divide(3)\n",
    "c.cd(1)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame1.GetYaxis().SetTitleOffset(1.6)\n",
    "frame1.Draw()\n",
    "c.cd(2)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame2.GetYaxis().SetTitleOffset(1.6)\n",
    "frame2.Draw()\n",
    "c.cd(3)\n",
    "ROOT.gPad.SetLeftMargin(0.15)\n",
    "frame3.GetYaxis().SetTitleOffset(1.6)\n",
    "frame3.Draw()\n",
    "\n",
    "c.SaveAs(\"rf105_funcbinding.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4833846a",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "dff2250e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:28:55.375620Z",
     "iopub.status.busy": "2026-05-19T20:28:55.375478Z",
     "iopub.status.idle": "2026-05-19T20:28:55.561305Z",
     "shell.execute_reply": "2026-05-19T20:28:55.560575Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222535552\" style=\"width: 1200px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222535552() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(48934,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222535552', 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_1779222535552();\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
}
