{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "31773c23",
   "metadata": {},
   "source": [
    "# Zbi_Zgamma\n",
    "Demonstrate Z_Bi = Z_Gamma\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:**  Artem Busorgin, Kyle Cranmer and 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:36 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0af4915d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:36:41.856399Z",
     "iopub.status.busy": "2026-05-19T20:36:41.856258Z",
     "iopub.status.idle": "2026-05-19T20:36:42.823157Z",
     "shell.execute_reply": "2026-05-19T20:36:42.822721Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ad83207",
   "metadata": {},
   "source": [
    "Make model for prototype on/off problem\n",
    "Pois(x | s+b) * Pois(y | tau b )\n",
    "for Z_Gamma, use uniform prior on b."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b1522d21",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:36:42.837413Z",
     "iopub.status.busy": "2026-05-19T20:36:42.837258Z",
     "iopub.status.idle": "2026-05-19T20:36:43.069070Z",
     "shell.execute_reply": "2026-05-19T20:36:43.068692Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooUniform object at 0x561a7f315110>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w1 = ROOT.RooWorkspace(\"w\")\n",
    "w1.factory(\"Poisson::px(x[150,0,500],sum::splusb(s[0,0,100],b[100,0,300]))\")\n",
    "w1.factory(\"Poisson::py(y[100,0,500],prod::taub(tau[1.],b))\")\n",
    "w1.factory(\"Uniform::prior_b(b)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7993944b",
   "metadata": {},
   "source": [
    "construct the Bayesian-averaged model (eg. a projection pdf)\n",
    "p'(x|s) = \\int db p(x|s+b) * [ p(y|b) * prior(b) ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7f7aca15",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:36:43.092470Z",
     "iopub.status.busy": "2026-05-19T20:36:43.092318Z",
     "iopub.status.idle": "2026-05-19T20:36:43.242539Z",
     "shell.execute_reply": "2026-05-19T20:36:43.241909Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GENPROJ_[py_X_prior_b_X_px]_Norm[b]_denominator_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n"
     ]
    }
   ],
   "source": [
    "w1.factory(\"PROJ::averagedModel(PROD::foo(px|b,py,prior_b),b)\")\n",
    "\n",
    "c = ROOT.TCanvas()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a01bcfa",
   "metadata": {},
   "source": [
    "plot it, blue is averaged model, red is b known exactly"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "514c4683",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:36:43.244520Z",
     "iopub.status.busy": "2026-05-19T20:36:43.244397Z",
     "iopub.status.idle": "2026-05-19T20:36:43.437543Z",
     "shell.execute_reply": "2026-05-19T20:36:43.437054Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GENPROJ_[py_X_prior_b]_Norm[b]_denominator_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(SPECINT[GENPROJ_[py_X_prior_b]_Norm[b]_X_px_NORM[x]]_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GENPROJ_[py_X_prior_b]_Norm[b]_denominator_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n"
     ]
    }
   ],
   "source": [
    "frame = w1[\"x\"].frame()\n",
    "w1[\"averagedModel\"].plotOn(frame)\n",
    "w1[\"px\"].plotOn(frame, LineColor=\"kRed\")\n",
    "frame.Draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af68e954",
   "metadata": {},
   "source": [
    "compare analytic calculation of Z_Bi\n",
    "with the numerical RooFit implementation of Z_Gamma\n",
    "for an example with x = 150, y = 100"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30fe4a70",
   "metadata": {},
   "source": [
    "numeric RooFit Z_Gamma"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "201bca57",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:36:43.439393Z",
     "iopub.status.busy": "2026-05-19T20:36:43.439275Z",
     "iopub.status.idle": "2026-05-19T20:36:43.580240Z",
     "shell.execute_reply": "2026-05-19T20:36:43.579778Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hybrid p-value = [#1] INFO:NumericIntegration -- RooRealIntegral::init(GENPROJ_[py_X_prior_b]_Norm[b]_denominator_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GENPROJ_[py_X_prior_b]_Norm[b]_denominator_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(SPECINT[GENPROJ_[py_X_prior_b]_Norm[b]_X_px_cdf_NORM[x_prime]]_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GENPROJ_[py_X_prior_b]_Norm[b]_denominator_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(SPECINT[GENPROJ_[py_X_prior_b]_Norm[b]_X_px_cdf_Int[x_prime|CDF]_Norm[x_prime]]_Int[b|CDF]) using numeric integrator RooIntegrator1D to calculate Int(b)\n",
      "[#1] INFO:NumericIntegration -- RooRealIntegral::init(GENPROJ_[py_X_prior_b]_Norm[b]_denominator_Int[b]) using numeric integrator RooIntegrator1D to calculate Int(b)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 0.9992259057034769\n",
      "Z_Gamma Significance  =  3.165495870670026\n"
     ]
    }
   ],
   "source": [
    "w1[\"y\"].setVal(100)\n",
    "w1[\"x\"].setVal(150)\n",
    "cdf = w1[\"averagedModel\"].createCdf(w1[\"x\"])\n",
    "cdf.getVal()  # get ugly print messages out of the way\n",
    "\n",
    "print(\"Hybrid p-value = \", cdf.getVal())\n",
    "print(\"Z_Gamma Significance  = \", ROOT.RooStats.PValueToSignificance(1 - cdf.getVal()))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "104f2cd9",
   "metadata": {},
   "source": [
    "analytic Z_Bi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8d231c97",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:36:43.582096Z",
     "iopub.status.busy": "2026-05-19T20:36:43.581980Z",
     "iopub.status.idle": "2026-05-19T20:36:43.741365Z",
     "shell.execute_reply": "2026-05-19T20:36:43.741055Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Z_Bi significance estimation:  3.108043895747114\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file Zbi_Zgamma.png has been created\n"
     ]
    }
   ],
   "source": [
    "Z_Bi = ROOT.RooStats.NumberCountingUtils.BinomialWithTauObsZ(150, 100, 1)\n",
    "print(\"Z_Bi significance estimation: \", Z_Bi)\n",
    "\n",
    "c.SaveAs(\"Zbi_Zgamma.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c3090f2",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9ddd228b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:36:43.761035Z",
     "iopub.status.busy": "2026-05-19T20:36:43.760897Z",
     "iopub.status.idle": "2026-05-19T20:36:43.958123Z",
     "shell.execute_reply": "2026-05-19T20:36:43.957667Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779223003936\" style=\"width: 700px; height: 500px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779223003936() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(29900,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779223003936', 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_1779223003936();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%jsroot on\n",
    "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
}
