{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ecae496b",
   "metadata": {},
   "source": [
    "# FourBinInstructional\n",
    "This example is a generalization of the on/off problem.\n",
    "\n",
    " This example is a generalization of the on/off problem.\n",
    "It's a common setup for SUSY searches.  Imagine that one has two\n",
    "variables \"x\" and \"y\" (eg. missing ET and SumET), see figure.\n",
    "The signal region has high values of both of these variables (top right).\n",
    "One can see low values of \"x\" or \"y\" acting as side-bands.  If we\n",
    "just used \"y\" as a sideband, we would have the on/off problem.\n",
    " - In the signal region we observe non events and expect s+b events.\n",
    " - In the region with low values of \"y\" (bottom right)\n",
    "   we observe noff events and expect tau*b events.\n",
    "Note the significance of tau.  In the background only case:\n",
    "\n",
    "```cpp\n",
    "   tau ~ <expectation off> / <expectation on>\n",
    "```\n",
    "\n",
    "If tau is known, this model is sufficient, but often tau is not known exactly.\n",
    "So one can use low values of \"x\" as an additional constraint for tau.\n",
    "Note that this technique critically depends on the notion that the\n",
    "joint distribution for \"x\" and \"y\" can be factorized.\n",
    "Generally, these regions have many events, so it the ratio can be\n",
    "measured very precisely there.  So we extend the model to describe the\n",
    "left two boxes... denoted with \"bar\".\n",
    "  - In the upper left we observe nonbar events and expect bbar events\n",
    "  - In the bottom left we observe noffbar events and expect tau bbar events\n",
    "Note again we have:\n",
    "\n",
    "```cpp\n",
    "   tau ~ <expectation off bar> / <expectation on bar>\n",
    "```\n",
    "\n",
    "One can further expand the model to account for the systematic associated\n",
    "to assuming the distribution of \"x\" and \"y\" factorizes (eg. that\n",
    "tau is the same for off/on and offbar/onbar). This can be done in several\n",
    "ways, but here we introduce an additional parameter rho, which so that\n",
    "one set of models will use tau and the other tau*rho. The choice is arbitrary,\n",
    "but it has consequences on the numerical stability of the algorithms.\n",
    "The \"bar\" measurements typically have more events (& smaller relative errors).\n",
    "If we choose\n",
    "\n",
    "```cpp\n",
    "<expectation noffbar> = tau * rho * <expectation noonbar>\n",
    "```\n",
    "\n",
    "the product tau*rho will be known very precisely (~1/sqrt(bbar)) and the contour\n",
    "in those parameters will be narrow and have a non-trivial tau~1/rho shape.\n",
    "However, if we choose to put rho on the non/noff measurements (where the\n",
    "product will have an error `~1/sqrt(b))`, the contours will be more amenable\n",
    "to numerical techniques.  Thus, here we choose to define:\n",
    "\n",
    "```cpp\n",
    "   tau := <expectation off bar> / (<expectation on bar>)\n",
    "   rho := <expectation off> / (<expectation on> * tau)\n",
    "\n",
    "^ y\n",
    "|\n",
    "|---------------------------+\n",
    "|               |           |\n",
    "|     nonbar    |    non    |\n",
    "|      bbar     |    s+b    |\n",
    "|               |           |\n",
    "|---------------+-----------|\n",
    "|               |           |\n",
    "|    noffbar    |    noff   |\n",
    "|    tau bbar   | tau b rho |\n",
    "|               |           |\n",
    "+-----------------------------> x\n",
    "```\n",
    "\n",
    "Left in this way, the problem is under-constrained.  However, one may\n",
    "have some auxiliary measurement (usually based on Monte Carlo) to\n",
    "constrain rho.  Let us call this auxiliary measurement that gives\n",
    "the nominal value of rho \"rhonom\".  Thus, there is a 'constraint' term in\n",
    "the full model: P(rhonom | rho).  In this case, we consider a Gaussian\n",
    "constraint with standard deviation sigma.\n",
    "\n",
    "In the example, the initial values of the parameters are:\n",
    "\n",
    "```cpp\n",
    "  - s    = 40\n",
    "  - b    = 100\n",
    "  - tau  = 5\n",
    "  - bbar = 1000\n",
    "  - rho  = 1\n",
    "  (sigma for rho = 20%)\n",
    "```\n",
    "\n",
    "and in the toy dataset:\n",
    "\n",
    "```cpp\n",
    "   - non = 139\n",
    "   - noff = 528\n",
    "   - nonbar = 993\n",
    "   - noffbar = 4906\n",
    "   - rhonom = 1.27824\n",
    "```\n",
    "\n",
    "Note, the covariance matrix of the parameters has large off-diagonal terms.\n",
    "Clearly s,b are anti-correlated.  Similarly, since noffbar >> nonbar, one would\n",
    "expect bbar,tau to be anti-correlated.\n",
    "\n",
    "This can be seen below.\n",
    "\n",
    "```cpp\n",
    "            GLOBAL      b    bbar   rho      s     tau\n",
    "        b  0.96820   1.000  0.191 -0.942 -0.762 -0.209\n",
    "     bbar  0.91191   0.191  1.000  0.000 -0.146 -0.912\n",
    "      rho  0.96348  -0.942  0.000  1.000  0.718 -0.000\n",
    "        s  0.76250  -0.762 -0.146  0.718  1.000  0.160\n",
    "      tau  0.92084  -0.209 -0.912 -0.000  0.160  1.000\n",
    "```\n",
    "\n",
    "Similarly, since tau*rho appears as a product, we expect rho,tau\n",
    "to be anti-correlated. When the error on rho is significantly\n",
    "larger than 1/sqrt(bbar), tau is essentially known and the\n",
    "correlation is minimal (tau mainly cares about bbar, and rho about b,s).\n",
    "In the alternate parametrization (bbar* tau * rho) the correlation coefficient\n",
    "for rho,tau is large (and negative).\n",
    "\n",
    "The code below uses best-practices for RooFit & RooStats as of June 2010.\n",
    "\n",
    "It proceeds as follows:\n",
    " - create a workspace to hold the model\n",
    " - use workspace factory to quickly create the terms of the model\n",
    " - use workspace factory to define total model (a prod pdf)\n",
    " - create a RooStats ModelConfig to specify observables, parameters of interest\n",
    " - add to the ModelConfig a prior on the parameters for Bayesian techniques\n",
    "   note, the pdf it is factorized for parameters of interest & nuisance params\n",
    " - visualize the model\n",
    " - write the workspace to a file\n",
    " - use several of RooStats IntervalCalculators & compare results\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:**  Artem Busorgin, Kyle Cranmer and Tanja Rommerskirchen (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:35 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0437df6a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:36.520375Z",
     "iopub.status.busy": "2026-05-19T20:35:36.520258Z",
     "iopub.status.idle": "2026-05-19T20:35:37.497965Z",
     "shell.execute_reply": "2026-05-19T20:35:37.497506Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT\n",
    "\n",
    "doBayesian = False\n",
    "doFeldmanCousins = False\n",
    "doMCMC = False"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d30ff368",
   "metadata": {},
   "source": [
    "let's time this challenging example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "55ac698a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:37.499991Z",
     "iopub.status.busy": "2026-05-19T20:35:37.499858Z",
     "iopub.status.idle": "2026-05-19T20:35:37.621675Z",
     "shell.execute_reply": "2026-05-19T20:35:37.621136Z"
    }
   },
   "outputs": [],
   "source": [
    "t = ROOT.TStopwatch()\n",
    "t.Start()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b8b54d0",
   "metadata": {},
   "source": [
    "set RooFit random seed for reproducible results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2a25f729",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:37.623466Z",
     "iopub.status.busy": "2026-05-19T20:35:37.623332Z",
     "iopub.status.idle": "2026-05-19T20:35:37.745870Z",
     "shell.execute_reply": "2026-05-19T20:35:37.745342Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.RooRandom.randomGenerator().SetSeed(4357)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57e11126",
   "metadata": {},
   "source": [
    "make model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f1a9c9f6",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:37.747824Z",
     "iopub.status.busy": "2026-05-19T20:35:37.747687Z",
     "iopub.status.idle": "2026-05-19T20:35:37.982101Z",
     "shell.execute_reply": "2026-05-19T20:35:37.981600Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#0] WARNING:InputArguments -- The parameter 'sigma' with range [-inf, inf] of the RooGaussian 'mcCons' exceeds the safe range of (0, inf). Advise to limit its range.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooProdPdf object at 0x55f475a551e0>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wspace = ROOT.RooWorkspace(\"wspace\")\n",
    "wspace.factory(\"Poisson::on(non[0,1000], sum::splusb(s[40,0,100],b[100,0,300]))\")\n",
    "wspace.factory(\"Poisson::off(noff[0,5000], prod::taub(b,tau[5,3,7],rho[1,0,2]))\")\n",
    "wspace.factory(\"Poisson::onbar(nonbar[0,10000], bbar[1000,500,2000])\")\n",
    "wspace.factory(\"Poisson::offbar(noffbar[0,1000000], prod::lambdaoffbar(bbar, tau))\")\n",
    "wspace.factory(\"Gaussian::mcCons(rhonom[1.,0,2], rho, sigma[.2])\")\n",
    "wspace.factory(\"PROD::model(on,off,onbar,offbar,mcCons)\")\n",
    "wspace.defineSet(\"obs\", \"non,noff,nonbar,noffbar,rhonom\")\n",
    "\n",
    "wspace.factory(\"Uniform::prior_poi({s})\")\n",
    "wspace.factory(\"Uniform::prior_nuis({b,bbar,tau, rho})\")\n",
    "wspace.factory(\"PROD::prior(prior_poi,prior_nuis)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1a1d98a",
   "metadata": {},
   "source": [
    "----------------------------------\n",
    "Control some interesting variations\n",
    "define parameers of interest\n",
    "for 1-d plots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3564cf27",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:37.983716Z",
     "iopub.status.busy": "2026-05-19T20:35:37.983554Z",
     "iopub.status.idle": "2026-05-19T20:35:38.103937Z",
     "shell.execute_reply": "2026-05-19T20:35:38.103476Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wspace.defineSet(\"poi\", \"s\")\n",
    "wspace.defineSet(\"nuis\", \"b,tau,rho,bbar\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b577045",
   "metadata": {},
   "source": [
    "for 2-d plots to inspect correlations:\n",
    "wspace.defineSet(\"poi\",\"s,rho\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e69e47d",
   "metadata": {},
   "source": [
    "test simpler cases where parameters are known.\n",
    "wspace[\"tau\"].setConstant()\n",
    "wspace[\"rho\"].setConstant()\n",
    "wspace[\"b\"].setConstant()\n",
    "wspace[\"bbar\"].setConstant()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "52e02526",
   "metadata": {},
   "source": [
    "inspect workspace\n",
    "wspace.Print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2888ba85",
   "metadata": {},
   "source": [
    "----------------------------------------------------------\n",
    "Generate toy data\n",
    "generate toy data assuming current value of the parameters\n",
    "import into workspace.\n",
    "add Verbose() to see how it's being generated"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a447753f",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:38.121349Z",
     "iopub.status.busy": "2026-05-19T20:35:38.121184Z",
     "iopub.status.idle": "2026-05-19T20:35:38.262469Z",
     "shell.execute_reply": "2026-05-19T20:35:38.262029Z"
    }
   },
   "outputs": [],
   "source": [
    "data = wspace[\"model\"].generate(wspace.set(\"obs\"), 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ac84604",
   "metadata": {},
   "source": [
    "data.Print(\"v\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ec107e7b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:38.270843Z",
     "iopub.status.busy": "2026-05-19T20:35:38.270665Z",
     "iopub.status.idle": "2026-05-19T20:35:38.404182Z",
     "shell.execute_reply": "2026-05-19T20:35:38.403448Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:ObjectHandling -- RooWorkspace::import(wspace) importing dataset modelData\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wspace.Import(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecf2868e",
   "metadata": {},
   "source": [
    "----------------------------------\n",
    "Now the statistical tests\n",
    "model config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "192c21c3",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:38.406343Z",
     "iopub.status.busy": "2026-05-19T20:35:38.406200Z",
     "iopub.status.idle": "2026-05-19T20:35:38.581594Z",
     "shell.execute_reply": "2026-05-19T20:35:38.580914Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "modelConfig = ROOT.RooStats.ModelConfig(\"FourBins\")\n",
    "modelConfig.SetWorkspace(wspace)\n",
    "modelConfig.SetPdf(wspace[\"model\"])\n",
    "modelConfig.SetPriorPdf(wspace[\"prior\"])\n",
    "modelConfig.SetParametersOfInterest(wspace.set(\"poi\"))\n",
    "modelConfig.SetNuisanceParameters(wspace.set(\"nuis\"))\n",
    "wspace.Import(modelConfig)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ea8bb8b",
   "metadata": {},
   "source": [
    "wspace.writeToFile(\"FourBin.root\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85d28438",
   "metadata": {},
   "source": [
    "-------------------------------------------------\n",
    "If you want to see the covariance matrix uncomment\n",
    "wspace[\"model\"].fitTo(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e8ae470a",
   "metadata": {},
   "source": [
    "use ProfileLikelihood"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ac384044",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:38.583856Z",
     "iopub.status.busy": "2026-05-19T20:35:38.583729Z",
     "iopub.status.idle": "2026-05-19T20:35:38.775220Z",
     "shell.execute_reply": "2026-05-19T20:35:38.774516Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:InputArguments -- The deprecated RooFit::CloneData(1) option passed to createNLL() is ignored.\n",
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(model) 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 6.87939 ms\n",
      "[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoGLobalFit - find MLE \n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level\n",
      "[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoMinimizeNLL - using Minuit2 /  with strategy 1\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#1] INFO:Minimization -- \n",
      "  RooFitResult: minimized FCN value: 16.2872, estimated distance to minimum: 6.06259e-08\n",
      "                covariance matrix quality: Full, accurate covariance matrix\n",
      "                Status : MINIMIZE=0 \n",
      "\n",
      "    Floating Parameter    FinalValue +/-  Error   \n",
      "  --------------------  --------------------------\n",
      "                     b    8.3602e+01 +/-  1.39e+01\n",
      "                  bbar    9.9301e+02 +/-  3.15e+01\n",
      "                   rho    1.2783e+00 +/-  1.99e-01\n",
      "                     s    5.5397e+01 +/-  1.78e+01\n",
      "                   tau    4.9405e+00 +/-  1.72e-01\n",
      "\n"
     ]
    }
   ],
   "source": [
    "plc = ROOT.RooStats.ProfileLikelihoodCalculator(data, modelConfig)\n",
    "plc.SetConfidenceLevel(0.95)\n",
    "plInt = plc.GetInterval()\n",
    "msglevel = ROOT.RooMsgService.instance().globalKillBelow()\n",
    "ROOT.RooMsgService.instance().setGlobalKillBelow(ROOT.RooFit.FATAL)\n",
    "plInt.LowerLimit(wspace[\"s\"])  # get ugly print out of the way. Fix.\n",
    "ROOT.RooMsgService.instance().setGlobalKillBelow(msglevel)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "252f239a",
   "metadata": {},
   "source": [
    "use FeldmaCousins (takes ~20 min)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d9bca76d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:38.777090Z",
     "iopub.status.busy": "2026-05-19T20:35:38.776965Z",
     "iopub.status.idle": "2026-05-19T20:35:38.894532Z",
     "shell.execute_reply": "2026-05-19T20:35:38.887058Z"
    }
   },
   "outputs": [],
   "source": [
    "fc = ROOT.RooStats.FeldmanCousins(data, modelConfig)\n",
    "fc.SetConfidenceLevel(0.95)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1fc31445",
   "metadata": {},
   "source": [
    "number counting: dataset always has 1 entry with N events observed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f041223d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:38.896297Z",
     "iopub.status.busy": "2026-05-19T20:35:38.896167Z",
     "iopub.status.idle": "2026-05-19T20:35:39.012411Z",
     "shell.execute_reply": "2026-05-19T20:35:39.011697Z"
    }
   },
   "outputs": [],
   "source": [
    "fc.FluctuateNumDataEntries(False)\n",
    "fc.UseAdaptiveSampling(True)\n",
    "fc.SetNBins(40)\n",
    "fcInt = ROOT.RooStats.PointSetInterval()\n",
    "if doFeldmanCousins:  # takes 7 minutes\n",
    "    fcInt = fc.GetInterval()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ea933b6",
   "metadata": {},
   "source": [
    "use BayesianCalculator (only 1-d parameter of interest, slow for this problem)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "3bb40691",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:39.014539Z",
     "iopub.status.busy": "2026-05-19T20:35:39.014416Z",
     "iopub.status.idle": "2026-05-19T20:35:39.140809Z",
     "shell.execute_reply": "2026-05-19T20:35:39.131019Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Bayesian Calc. only supports on parameter of interest\n"
     ]
    }
   ],
   "source": [
    "bc = ROOT.RooStats.BayesianCalculator(data, modelConfig)\n",
    "bc.SetConfidenceLevel(0.95)\n",
    "bInt = ROOT.RooStats.SimpleInterval()\n",
    "if doBayesian and len(wspace.set(\"poi\")) == 1:\n",
    "    bInt = bc.GetInterval()\n",
    "else:\n",
    "    print(\"Bayesian Calc. only supports on parameter of interest\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5d17b2a8",
   "metadata": {},
   "source": [
    "use MCMCCalculator  (takes about 1 min)\n",
    "Want an efficient proposal function, so derive it from covariance\n",
    "matrix of fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9d2f7d78",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:39.151330Z",
     "iopub.status.busy": "2026-05-19T20:35:39.151191Z",
     "iopub.status.idle": "2026-05-19T20:35:39.381544Z",
     "shell.execute_reply": "2026-05-19T20:35:39.380453Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(model) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 424.561 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "Minuit2Minimizer: Minimize with max-calls 2500 convergence for edm < 1 strategy 1\n",
      "Minuit2Minimizer : Valid minimum - status = 0\n",
      "FVAL  = 16.2878250499511452\n",
      "Edm   = 0.000609009465347959693\n",
      "Nfcn  = 160\n",
      "b\t  = 83.5734\t +/-  13.8917\t(limited)\n",
      "bbar\t  = 991.977\t +/-  31.4945\t(limited)\n",
      "rho\t  = 1.27736\t +/-  0.198947\t(limited)\n",
      "s\t  = 55.3338\t +/-  17.8276\t(limited)\n",
      "tau\t  = 4.94628\t +/-  0.172044\t(limited)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <Minuit2>: MnSeedGenerator Computing seed using NumericalGradient calculator\n",
      "Info in <Minuit2>: MnSeedGenerator Evaluated function and gradient in 71.36 μs\n",
      "Info in <Minuit2>: MnSeedGenerator Initial state: FCN =       18.21077446 Edm =       7.782877729 NCalls =     21\n",
      "Info in <Minuit2>: MnSeedGenerator Initial state  \n",
      "  Minimum value : 18.21077446\n",
      "  Edm           : 7.782877729\n",
      "  Internal parameters:\t[     -0.568344509    -0.3615923842     0.5274212424     0.8854765138  -0.004726067475]\t\n",
      "  Internal gradient  :\t[   -0.06676350504     -0.175030536    -0.0205887813      3.801122668    -0.1117650578]\t\n",
      "  Internal covariance matrix:\n",
      "[[   0.0010823318              0              0              0              0]\n",
      " [              0   0.0006680239              0              0              0]\n",
      " [              0              0    0.010401936              0              0]\n",
      " [              0              0              0      2.1546444              0]\n",
      " [              0              0              0              0   0.0022916947]]]\n",
      "Info in <Minuit2>: VariableMetricBuilder Start iterating until Edm is < 0.001 with call limit = 2500\n",
      "Info in <Minuit2>: VariableMetricBuilder    0 - FCN =       18.21077446 Edm =       7.782877729 NCalls =     21\n",
      "Info in <Minuit2>: VariableMetricBuilder    1 - FCN =       18.02391001 Edm =       7.466777826 NCalls =     40\n",
      "Info in <Minuit2>: VariableMetricBuilder    2 - FCN =       17.12593257 Edm =      0.8884113931 NCalls =     54\n",
      "Info in <Minuit2>: VariableMetricBuilder    3 - FCN =       16.96949769 Edm =     0.03327317003 NCalls =     66\n",
      "Info in <Minuit2>: VariableMetricBuilder    4 - FCN =       16.72496068 Edm =      0.2925422299 NCalls =     80\n",
      "Info in <Minuit2>: VariableMetricBuilder    5 - FCN =       16.30789348 Edm =     0.01862233661 NCalls =     94\n",
      "Info in <Minuit2>: VariableMetricBuilder    6 - FCN =       16.29275839 Edm =    0.005649103004 NCalls =    106\n",
      "Info in <Minuit2>: VariableMetricBuilder    7 - FCN =       16.28842308 Edm =   0.0006642987641 NCalls =    117\n",
      "Info in <Minuit2>: VariableMetricBuilder    8 - FCN =       16.28782505 Edm =   9.373510332e-05 NCalls =    129\n",
      "Info in <Minuit2>: MnHesse Done after 47.59 μs\n",
      "Info in <Minuit2>: VariableMetricBuilder After Hessian\n",
      "Info in <Minuit2>: VariableMetricBuilder    9 - FCN =       16.28782505 Edm =   0.0006090094653 NCalls =    160\n",
      "Info in <Minuit2>: VariableMetricBuilder Stop iterating after 304.862 μs\n",
      "Info in <Minuit2>: Minuit2Minimizer::Hesse Using max-calls 2500\n",
      "Info in <Minuit2>: MnHesse Done after 43.84 μs\n",
      "Info in <Minuit2>: Minuit2Minimizer::Hesse Hesse is valid - matrix is accurate\n"
     ]
    }
   ],
   "source": [
    "fit = wspace[\"model\"].fitTo(data, Save=True)\n",
    "ph = ROOT.RooStats.ProposalHelper()\n",
    "ph.SetVariables(fit.floatParsFinal())\n",
    "ph.SetCovMatrix(fit.covarianceMatrix())\n",
    "ph.SetUpdateProposalParameters(True)  # auto-create mean vars and add mappings\n",
    "ph.SetCacheSize(100)\n",
    "pf = ph.GetProposalFunction()\n",
    "\n",
    "mc = ROOT.RooStats.MCMCCalculator(data, modelConfig)\n",
    "mc.SetConfidenceLevel(0.95)\n",
    "mc.SetProposalFunction(pf)\n",
    "mc.SetNumBurnInSteps(500)  # first N steps to be ignored as burn-in\n",
    "mc.SetNumIters(50000)\n",
    "mc.SetLeftSideTailFraction(0.5)  # make a central interval\n",
    "mcInt = ROOT.RooStats.MCMCInterval()\n",
    "if doMCMC:\n",
    "    mcInt = mc.GetInterval()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a3cb70a",
   "metadata": {},
   "source": [
    "----------------------------------\n",
    "Make some plots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "5ff1cc00",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:39.383185Z",
     "iopub.status.busy": "2026-05-19T20:35:39.383061Z",
     "iopub.status.idle": "2026-05-19T20:35:39.577489Z",
     "shell.execute_reply": "2026-05-19T20:35:39.576385Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[s]) Creating instance of MINUIT\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[s]) determining minimum likelihood for current configurations w.r.t all observable\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[s]) minimum found at (s=55.505)\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "\n",
      "[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[s]) Creating instance of MINUIT\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_model_modelData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[s]) determining minimum likelihood for current configurations w.r.t all observable\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#0] ERROR:InputArguments -- RooArgSet::checkForDup: ERROR argument with name s is already in this set\n",
      "[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[s]) minimum found at (s=55.4098)\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      ".[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n"
     ]
    }
   ],
   "source": [
    "c1 = ROOT.gROOT.Get(\"c1\")\n",
    "if not c1:\n",
    "    c1 = ROOT.TCanvas(\"c1\")\n",
    "\n",
    "if doBayesian and doMCMC:\n",
    "    c1.Divide(3)\n",
    "    c1.cd(1)\n",
    "elif doBayesian or doMCMC:\n",
    "    c1.Divide(2)\n",
    "    c1.cd(1)\n",
    "\n",
    "lrplot = ROOT.RooStats.LikelihoodIntervalPlot(plInt)\n",
    "lrplot.Draw()\n",
    "\n",
    "if doBayesian and len(wspace.set(\"poi\")) == 1:\n",
    "    c1.cd(2)\n",
    "    # the plot takes a long time and print lots of error\n",
    "    # using a scan it is better\n",
    "    bc.SetScanOfPosterior(20)\n",
    "    bplot = bc.GetPosteriorPlot()\n",
    "    bplot.Draw()\n",
    "\n",
    "if doMCMC:\n",
    "    if doBayesian and len(wspace.set(\"poi\")) == 1:\n",
    "        c1.cd(3)\n",
    "    else:\n",
    "        c1.cd(2)\n",
    "    mcPlot = ROOT.RooStats.MCMCIntervalPlot(mcInt)\n",
    "    mcPlot.Draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce406f0d",
   "metadata": {},
   "source": [
    "----------------------------------\n",
    "query intervals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "1eacbf3d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:39.579144Z",
     "iopub.status.busy": "2026-05-19T20:35:39.579019Z",
     "iopub.status.idle": "2026-05-19T20:35:39.697040Z",
     "shell.execute_reply": "2026-05-19T20:35:39.687913Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Profile Likelihood interval on s = [12.190172579554961, 88.68711584305349]\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    \"Profile Likelihood interval on s = [{}, {}]\".format(plInt.LowerLimit(wspace[\"s\"]), plInt.UpperLimit(wspace[\"s\"]))\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "89bd6bcc",
   "metadata": {},
   "source": [
    "Profile Likelihood interval on s = [12.1902, 88.6871]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "dd2bbfb5",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:39.709323Z",
     "iopub.status.busy": "2026-05-19T20:35:39.709184Z",
     "iopub.status.idle": "2026-05-19T20:35:39.869029Z",
     "shell.execute_reply": "2026-05-19T20:35:39.868491Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Real time 0:00:02, CP time 0.680\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file FourBinInstructional.png has been created\n"
     ]
    }
   ],
   "source": [
    "if doBayesian and len(wspace.set(\"poi\")) == 1:\n",
    "    print(\"Bayesian interval on s = [{}, {}]\".format(bInt.LowerLimit(), bInt.UpperLimit()))\n",
    "\n",
    "if doFeldmanCousins:\n",
    "    print(\n",
    "        \"Feldman Cousins interval on s = [{}, {}]\".format(fcInt.LowerLimit(wspace[\"s\"]), fcInt.UpperLimit(wspace[\"s\"]))\n",
    "    )\n",
    "    # Feldman Cousins interval on s = [18.75 +/- 2.45, 83.75 +/- 2.45]\n",
    "\n",
    "if doMCMC:\n",
    "    print(\"MCMC interval on s = [{}, {}]\".format(mcInt.LowerLimit(wspace[\"s\"]), mcInt.UpperLimit(wspace[\"s\"])))\n",
    "    # MCMC interval on s = [15.7628, 84.7266]\n",
    "\n",
    "t.Stop()\n",
    "t.Print()\n",
    "\n",
    "c1.SaveAs(\"FourBinInstructional.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3f96eec2",
   "metadata": {},
   "source": [
    "TODO: The calculators have to be destructed first. Otherwise, we can get\n",
    "segmentation faults depending on the destruction order, which is random in\n",
    "Python. Probably the issue is that some object has a non-owning pointer to\n",
    "another object, which it uses in its destructor. This should be fixed either\n",
    "in the design of RooStats in C++, or with phythonizations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "62d4699a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:39.871206Z",
     "iopub.status.busy": "2026-05-19T20:35:39.871078Z",
     "iopub.status.idle": "2026-05-19T20:35:39.974851Z",
     "shell.execute_reply": "2026-05-19T20:35:39.973791Z"
    }
   },
   "outputs": [],
   "source": [
    "del plc\n",
    "del bc\n",
    "del mc"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bed4c52a",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "9ad76ae0",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:39.976503Z",
     "iopub.status.busy": "2026-05-19T20:35:39.976352Z",
     "iopub.status.idle": "2026-05-19T20:35:40.169111Z",
     "shell.execute_reply": "2026-05-19T20:35:40.168237Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222940158\" style=\"width: 700px; height: 500px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222940158() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(22648,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222940158', 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_1779222940158();\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
}
