{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "97b111b3",
   "metadata": {},
   "source": [
    "# rs101_limitexample\n",
    "Limits: number counting experiment with uncertainty on both the background rate and signal efficiency.\n",
    "\n",
    "The usage of a Confidence Interval Calculator to set a limit on the signal is illustrated\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:**  Artem Busorgin, Kyle Cranmer (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": "513b24cc",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:50.282293Z",
     "iopub.status.busy": "2026-05-19T20:35:50.282158Z",
     "iopub.status.idle": "2026-05-19T20:35:51.285038Z",
     "shell.execute_reply": "2026-05-19T20:35:51.279395Z"
    }
   },
   "outputs": [],
   "source": [
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f03b875",
   "metadata": {},
   "source": [
    "--------------------------------------\n",
    "An example of setting a limit in a number counting experiment with uncertainty on background and signal"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54a596a8",
   "metadata": {},
   "source": [
    "to time the macro"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "113ded5c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:51.286899Z",
     "iopub.status.busy": "2026-05-19T20:35:51.286757Z",
     "iopub.status.idle": "2026-05-19T20:35:51.405288Z",
     "shell.execute_reply": "2026-05-19T20:35:51.404638Z"
    }
   },
   "outputs": [],
   "source": [
    "t = ROOT.TStopwatch()\n",
    "t.Start()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1580451a",
   "metadata": {},
   "source": [
    "--------------------------------------\n",
    "The Model building stage\n",
    "--------------------------------------"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8ae3975d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:51.407598Z",
     "iopub.status.busy": "2026-05-19T20:35:51.407469Z",
     "iopub.status.idle": "2026-05-19T20:35:51.653894Z",
     "shell.execute_reply": "2026-05-19T20:35:51.653186Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "RooWorkspace()  contents\n",
      "\n",
      "variables\n",
      "---------\n",
      "(b,gSigBkg,gSigEff,obs,ratioBkgEff,ratioSigEff,s)\n",
      "\n",
      "p.d.f.s\n",
      "-------\n",
      "RooGaussian::bkgConstraint[ x=gSigBkg mean=ratioBkgEff sigma=0.2 ] = 1\n",
      "RooPoisson::countingModel[ x=obs mean=countingModel_2 ] = 0.0325554\n",
      "RooProdPdf::modelWithConstraints[ countingModel * sigConstraint * bkgConstraint ] = 0.0325554\n",
      "RooGaussian::sigConstraint[ x=gSigEff mean=ratioSigEff sigma=0.05 ] = 1\n",
      "\n",
      "functions\n",
      "--------\n",
      "RooAddition::countingModel_2[ countingModel_2_[s_x_ratioSigEff] + countingModel_2_[b_x_ratioBkgEff] ] = 150\n",
      "RooProduct::countingModel_2_[b_x_ratioBkgEff][ b * ratioBkgEff ] = 100\n",
      "RooProduct::countingModel_2_[s_x_ratioSigEff][ s * ratioSigEff ] = 50\n",
      "\n"
     ]
    }
   ],
   "source": [
    "wspace = ROOT.RooWorkspace()\n",
    "wspace.factory(\n",
    "    \"Poisson::countingModel(obs[150,0,300], \" \"sum(s[50,0,120]*ratioSigEff[1.,0,3.],b[100]*ratioBkgEff[1.,0.,3.]))\"\n",
    ")  # counting model\n",
    "wspace.factory(\"Gaussian::sigConstraint(gSigEff[1,0,3],ratioSigEff,0.05)\")  # 5% signal efficiency uncertainty\n",
    "wspace.factory(\"Gaussian::bkgConstraint(gSigBkg[1,0,3],ratioBkgEff,0.2)\")  # 10% background efficiency uncertainty\n",
    "wspace.factory(\"PROD::modelWithConstraints(countingModel,sigConstraint,bkgConstraint)\")  # product of terms\n",
    "wspace.Print()\n",
    "\n",
    "modelWithConstraints = wspace[\"modelWithConstraints\"]  # get the model\n",
    "obs = wspace[\"obs\"]  # get the observable\n",
    "s = wspace[\"s\"]  # get the signal we care about\n",
    "b = wspace[\"b\"]  # get the background and set it to a constant.  Uncertainty included in ratioBkgEff\n",
    "b.setConstant()\n",
    "\n",
    "ratioSigEff = wspace[\"ratioSigEff\"]  # get uncertain parameter to constrain\n",
    "ratioBkgEff = wspace[\"ratioBkgEff\"]  # get uncertain parameter to constrain\n",
    "constrainedParams = {ratioSigEff, ratioBkgEff}  # need to constrain these in the fit (should change default behavior)\n",
    "\n",
    "gSigEff = wspace[\"gSigEff\"]  # global observables for signal efficiency\n",
    "gSigBkg = wspace[\"gSigBkg\"]  # global obs for background efficiency\n",
    "gSigEff.setConstant()\n",
    "gSigBkg.setConstant()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3ad5997",
   "metadata": {},
   "source": [
    "Create an example dataset with 160 observed events"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8ea941cd",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:51.655878Z",
     "iopub.status.busy": "2026-05-19T20:35:51.655749Z",
     "iopub.status.idle": "2026-05-19T20:35:51.827106Z",
     "shell.execute_reply": "2026-05-19T20:35:51.826346Z"
    }
   },
   "outputs": [],
   "source": [
    "obs.setVal(160.0)\n",
    "dataOrig = ROOT.RooDataSet(\"exampleData\", \"exampleData\", {obs})\n",
    "dataOrig.add(obs)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c71db645",
   "metadata": {},
   "source": [
    "not necessary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "0836f1c2",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:51.829199Z",
     "iopub.status.busy": "2026-05-19T20:35:51.829072Z",
     "iopub.status.idle": "2026-05-19T20:35:52.023887Z",
     "shell.execute_reply": "2026-05-19T20:35:52.022869Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Minimization --  Including the following constraint terms in minimization: (sigConstraint,bkgConstraint)\n",
      "[#1] INFO:Minimization -- The global observables are not defined , normalize constraints with respect to the parameters (ratioSigEff,ratioBkgEff)\n",
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(modelWithConstraints) 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 957.834 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_modelWithConstraints_exampleData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.RooFitResult object at 0x(nil)>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "modelWithConstraints.fitTo(dataOrig, Constrain=constrainedParams, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70ddbd30",
   "metadata": {},
   "source": [
    "Now let's make some confidence intervals for s, our parameter of interest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6a056667",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:52.025615Z",
     "iopub.status.busy": "2026-05-19T20:35:52.025469Z",
     "iopub.status.idle": "2026-05-19T20:35:52.221116Z",
     "shell.execute_reply": "2026-05-19T20:35:52.220574Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:ObjectHandling -- RooWorkspace::import() importing dataset exampleData\n"
     ]
    }
   ],
   "source": [
    "modelConfig = ROOT.RooStats.ModelConfig(wspace)\n",
    "modelConfig.SetPdf(modelWithConstraints)\n",
    "modelConfig.SetParametersOfInterest({s})\n",
    "modelConfig.SetNuisanceParameters(constrainedParams)\n",
    "modelConfig.SetObservables(obs)\n",
    "modelConfig.SetGlobalObservables({gSigEff, gSigBkg})\n",
    "modelConfig.SetName(\"ModelConfig\")\n",
    "wspace.Import(modelConfig)\n",
    "wspace.Import(dataOrig)\n",
    "wspace.SetName(\"w\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66fd48d3",
   "metadata": {},
   "source": [
    "wspace.writeToFile(\"rs101_ws.root\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2137c011",
   "metadata": {},
   "source": [
    "Make sure we reference the data in the workspace from now on"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "838d2ab9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:52.223078Z",
     "iopub.status.busy": "2026-05-19T20:35:52.222948Z",
     "iopub.status.idle": "2026-05-19T20:35:52.331741Z",
     "shell.execute_reply": "2026-05-19T20:35:52.330749Z"
    }
   },
   "outputs": [],
   "source": [
    "data = wspace[dataOrig.GetName()]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "094ebfbc",
   "metadata": {},
   "source": [
    "First, let's use a Calculator based on the Profile Likelihood Ratio"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6c9dd3d9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:52.333379Z",
     "iopub.status.busy": "2026-05-19T20:35:52.333256Z",
     "iopub.status.idle": "2026-05-19T20:35:52.453266Z",
     "shell.execute_reply": "2026-05-19T20:35:52.452557Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:InputArguments -- The deprecated RooFit::CloneData(1) option passed to createNLL() is ignored.\n",
      "[#1] INFO:Minimization --  Including the following constraint terms in minimization: (sigConstraint,bkgConstraint)\n",
      "[#1] INFO:Minimization -- The following global observables have been defined and their values are taken from the model: (gSigEff,gSigBkg)\n",
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(modelWithConstraints) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 344.542 μs\n",
      "[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoGLobalFit - find MLE \n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_modelWithConstraints_exampleData) Summation contains a RooNLLVar, using its error level\n",
      "[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoMinimizeNLL - using Minuit2 / Migrad with strategy 1\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n",
      "[#1] INFO:Minimization -- \n",
      "  RooFitResult: minimized FCN value: 0.689755, estimated distance to minimum: 1.66436e-06\n",
      "                covariance matrix quality: Full, accurate covariance matrix\n",
      "                Status : MINIMIZE=0 \n",
      "\n",
      "    Floating Parameter    FinalValue +/-  Error   \n",
      "  --------------------  --------------------------\n",
      "           ratioBkgEff    1.0001e+00 +/-  1.99e-01\n",
      "           ratioSigEff    9.9991e-01 +/-  5.00e-02\n",
      "                     s    5.9992e+01 +/-  2.32e+01\n",
      "\n"
     ]
    }
   ],
   "source": [
    "plc = ROOT.RooStats.ProfileLikelihoodCalculator(data, modelConfig)\n",
    "plc.SetTestSize(0.05)\n",
    "lrinterval = plc.GetInterval()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e866a74",
   "metadata": {},
   "source": [
    "Let's make a plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "09e38eed",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:52.459124Z",
     "iopub.status.busy": "2026-05-19T20:35:52.458991Z",
     "iopub.status.idle": "2026-05-19T20:35:52.648093Z",
     "shell.execute_reply": "2026-05-19T20:35:52.647040Z"
    }
   },
   "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_modelWithConstraints_exampleData) 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=59.992)\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_modelWithConstraints_exampleData) 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=60.0341)\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": [
    "dataCanvas = ROOT.TCanvas(\"dataCanvas\")\n",
    "dataCanvas.Divide(2, 1)\n",
    "dataCanvas.cd(1)\n",
    "\n",
    "plotInt = ROOT.RooStats.LikelihoodIntervalPlot(lrinterval)\n",
    "plotInt.SetTitle(\"Profile Likelihood Ratio and Posterior for S\")\n",
    "plotInt.Draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0632d4af",
   "metadata": {},
   "source": [
    "Second, use a Calculator based on the Feldman Cousins technique"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "184ab34b",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:52.653308Z",
     "iopub.status.busy": "2026-05-19T20:35:52.653167Z",
     "iopub.status.idle": "2026-05-19T20:35:52.771092Z",
     "shell.execute_reply": "2026-05-19T20:35:52.770574Z"
    }
   },
   "outputs": [],
   "source": [
    "fc = ROOT.RooStats.FeldmanCousins(data, modelConfig)\n",
    "fc.UseAdaptiveSampling(True)\n",
    "fc.FluctuateNumDataEntries(False)  # number counting analysis: dataset always has 1 entry with N events observed\n",
    "fc.SetNBins(100)  # number of points to test per parameter\n",
    "fc.SetTestSize(0.05)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cdb613f8",
   "metadata": {},
   "source": [
    "fc.SaveBeltToFile(True) # optional"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "044002b6",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:52.773022Z",
     "iopub.status.busy": "2026-05-19T20:35:52.772903Z",
     "iopub.status.idle": "2026-05-19T20:35:56.084959Z",
     "shell.execute_reply": "2026-05-19T20:35:56.083885Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== Using the following for ModelConfig ===\n",
      "Observables:             RooArgSet:: = (obs)\n",
      "Parameters of Interest:  RooArgSet:: = (s)\n",
      "Nuisance Parameters:     RooArgSet:: = (ratioSigEff,ratioBkgEff)\n",
      "Global Observables:      RooArgSet:: = (gSigEff,gSigBkg)\n",
      "PDF:                     RooProdPdf::modelWithConstraints[ countingModel * sigConstraint * bkgConstraint ] = 0.00366119\n",
      "\n",
      "FeldmanCousins: ntoys per point: adaptive\n",
      "FeldmanCousins: nEvents per toy will not fluctuate, will always be 1\n",
      "FeldmanCousins: Model has nuisance parameters, will do profile construction\n",
      "FeldmanCousins: # points to test = 100\n",
      "NeymanConstruction: Prog: 1/100 total MC = 80 this test stat = 3.21178\n",
      " s=0.6 ratioSigEff=0.999975 ratioBkgEff=1.43644 [-inf, 4.68588]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 2/100 total MC = 80 this test stat = 3.08184\n",
      " s=1.8 ratioSigEff=1.00018 ratioBkgEff=1.42694 [-inf, 3.7189]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 3/100 total MC = 80 this test stat = 2.95515\n",
      " s=3 ratioSigEff=1.00055 ratioBkgEff=1.41769 [-inf, 3.91249]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 4/100 total MC = 80 this test stat = 2.83091\n",
      " s=4.2 ratioSigEff=1.00106 ratioBkgEff=1.40849 [-inf, 3.65947]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 5/100 total MC = 80 this test stat = 2.7092\n",
      " s=5.4 ratioSigEff=1.00133 ratioBkgEff=1.39955 [-inf, 3.10323]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 6/100 total MC = 80 this test stat = 2.59009\n",
      " s=6.6 ratioSigEff=1.00159 ratioBkgEff=1.3906 [-inf, 2.97611]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 7/100 total MC = 240 this test stat = 2.47431\n",
      " s=7.8 ratioSigEff=1.00102 ratioBkgEff=1.38084 [-inf, 3.25381]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 8/100 total MC = 80 this test stat = 2.36072\n",
      " s=9 ratioSigEff=1.00134 ratioBkgEff=1.37175 [-inf, 2.92353]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 9/100 total MC = 80 this test stat = 2.24982\n",
      " s=10.2 ratioSigEff=1.00166 ratioBkgEff=1.36272 [-inf, 3.4069]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 10/100 total MC = 80 this test stat = 2.14164\n",
      " s=11.4 ratioSigEff=1.00196 ratioBkgEff=1.35374 [-inf, 3.07011]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 11/100 total MC = 80 this test stat = 2.03623\n",
      " s=12.6 ratioSigEff=1.00273 ratioBkgEff=1.34405 [-inf, 3.24614]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 12/100 total MC = 80 this test stat = 1.93333\n",
      " s=13.8 ratioSigEff=1.00294 ratioBkgEff=1.33528 [-inf, 2.4475]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 13/100 total MC = 80 this test stat = 1.83331\n",
      " s=15 ratioSigEff=1.0023 ratioBkgEff=1.32684 [-inf, 2.70017]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 14/100 total MC = 80 this test stat = 1.73555\n",
      " s=16.2 ratioSigEff=1.00257 ratioBkgEff=1.31792 [-inf, 2.77026]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 15/100 total MC = 80 this test stat = 1.64101\n",
      " s=17.4 ratioSigEff=1.00283 ratioBkgEff=1.30904 [-inf, 2.84104]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 16/100 total MC = 80 this test stat = 1.54913\n",
      " s=18.6 ratioSigEff=1.00364 ratioBkgEff=1.2991 [-inf, 2.44366]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 17/100 total MC = 80 this test stat = 1.45967\n",
      " s=19.8 ratioSigEff=1.0038 ratioBkgEff=1.29046 [-inf, 2.51046]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 18/100 total MC = 80 this test stat = 1.3729\n",
      " s=21 ratioSigEff=1.00395 ratioBkgEff=1.28178 [-inf, 2.3088]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 19/100 total MC = 80 this test stat = 1.28897\n",
      " s=22.2 ratioSigEff=1.00408 ratioBkgEff=1.27309 [-inf, 2.28612]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 20/100 total MC = 80 this test stat = 1.20763\n",
      " s=23.4 ratioSigEff=1.0042 ratioBkgEff=1.26436 [-inf, 2.0941]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 21/100 total MC = 80 this test stat = 1.12898\n",
      " s=24.6 ratioSigEff=1.00431 ratioBkgEff=1.25562 [-inf, 2.07266]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 22/100 total MC = 80 this test stat = 1.05305\n",
      " s=25.8 ratioSigEff=1.0044 ratioBkgEff=1.24687 [-inf, 2.4819]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 23/100 total MC = 80 this test stat = 0.979804\n",
      " s=27 ratioSigEff=1.00448 ratioBkgEff=1.2381 [-inf, 1.94868]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 24/100 total MC = 80 this test stat = 0.909232\n",
      " s=28.2 ratioSigEff=1.00454 ratioBkgEff=1.22932 [-inf, 2.09127]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 25/100 total MC = 80 this test stat = 0.841264\n",
      " s=29.4 ratioSigEff=1.00408 ratioBkgEff=1.22097 [-inf, 1.9082]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 26/100 total MC = 80 this test stat = 0.776027\n",
      " s=30.6 ratioSigEff=1.00408 ratioBkgEff=1.21214 [-inf, 2.04865]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 27/100 total MC = 80 this test stat = 0.713453\n",
      " s=31.8 ratioSigEff=1.00406 ratioBkgEff=1.2033 [-inf, 1.4258]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 28/100 total MC = 80 this test stat = 0.653398\n",
      " s=33 ratioSigEff=1.00403 ratioBkgEff=1.19446 [-inf, 1.92614]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 29/100 total MC = 80 this test stat = 0.596234\n",
      " s=34.2 ratioSigEff=1.00399 ratioBkgEff=1.18562 [-inf, 1.53064]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 30/100 total MC = 80 this test stat = 0.541678\n",
      " s=35.4 ratioSigEff=1.00393 ratioBkgEff=1.17679 [-inf, 1.65725]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 31/100 total MC = 80 this test stat = 0.489749\n",
      " s=36.6 ratioSigEff=1.00386 ratioBkgEff=1.16795 [-inf, 1.42567]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 32/100 total MC = 80 this test stat = 0.440357\n",
      " s=37.8 ratioSigEff=1.00378 ratioBkgEff=1.15913 [-inf, 1.40855]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 33/100 total MC = 80 this test stat = 0.393811\n",
      " s=39 ratioSigEff=1.00369 ratioBkgEff=1.15032 [-inf, 1.2593]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 34/100 total MC = 80 this test stat = 0.349798\n",
      " s=40.2 ratioSigEff=1.00358 ratioBkgEff=1.14152 [-inf, 1.30825]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 35/100 total MC = 80 this test stat = 0.30842\n",
      " s=41.4 ratioSigEff=1.00347 ratioBkgEff=1.13274 [-inf, 0.874179]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 36/100 total MC = 80 this test stat = 0.269673\n",
      " s=42.6 ratioSigEff=1.00334 ratioBkgEff=1.12397 [-inf, 1.14949]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 37/100 total MC = 80 this test stat = 0.233551\n",
      " s=43.8 ratioSigEff=1.00319 ratioBkgEff=1.11574 [-inf, 1.07403]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 38/100 total MC = 80 this test stat = 0.200042\n",
      " s=45 ratioSigEff=1.00303 ratioBkgEff=1.10705 [-inf, 1.30848]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 39/100 total MC = 80 this test stat = 0.169154\n",
      " s=46.2 ratioSigEff=1.00285 ratioBkgEff=1.09838 [-inf, 0.987229]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 40/100 total MC = 80 this test stat = 0.140876\n",
      " s=47.4 ratioSigEff=1.00267 ratioBkgEff=1.08972 [-inf, 0.917557]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 41/100 total MC = 80 this test stat = 0.115202\n",
      " s=48.6 ratioSigEff=1.00247 ratioBkgEff=1.08109 [-inf, 0.850481]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 42/100 total MC = 80 this test stat = 0.0921253\n",
      " s=49.8 ratioSigEff=1.00226 ratioBkgEff=1.07247 [-inf, 0.891152]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 43/100 total MC = 80 this test stat = 0.0716406\n",
      " s=51 ratioSigEff=1.00204 ratioBkgEff=1.06387 [-inf, 1.04631]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 44/100 total MC = 80 this test stat = 0.0537413\n",
      " s=52.2 ratioSigEff=1.00181 ratioBkgEff=1.05529 [-inf, 0.574131]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 45/100 total MC = 80 this test stat = 0.0384208\n",
      " s=53.4 ratioSigEff=1.00156 ratioBkgEff=1.04672 [-inf, 0.749926]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 46/100 total MC = 80 this test stat = 0.0256726\n",
      " s=54.6 ratioSigEff=1.00131 ratioBkgEff=1.03818 [-inf, 0.839739]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 47/100 total MC = 80 this test stat = 0.0154896\n",
      " s=55.8 ratioSigEff=1.00104 ratioBkgEff=1.02966 [-inf, 0.715031]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 48/100 total MC = 80 this test stat = 0.00786498\n",
      " s=57 ratioSigEff=1.00075 ratioBkgEff=1.02116 [-inf, 0.574092]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 49/100 total MC = 80 this test stat = 0.00303984\n",
      " s=58.2 ratioSigEff=1.00152 ratioBkgEff=1.01164 [-inf, 0.731975]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 50/100 total MC = 80 this test stat = 0.000296144\n",
      " s=59.4 ratioSigEff=1.00057 ratioBkgEff=1.0038 [-inf, 0.692058]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 51/100 total MC = 80 this test stat = 0.000277433\n",
      " s=60.6 ratioSigEff=0.999598 ratioBkgEff=0.995997 [-inf, 0.645915]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 52/100 total MC = 80 this test stat = 0.00297545\n",
      " s=61.8 ratioSigEff=0.998613 ratioBkgEff=0.988241 [-inf, 0.513395]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 53/100 total MC = 80 this test stat = 0.00784733\n",
      " s=63 ratioSigEff=0.999173 ratioBkgEff=0.978981 [-inf, 0.477501]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 54/100 total MC = 80 this test stat = 0.0154172\n",
      " s=64.2 ratioSigEff=0.998822 ratioBkgEff=0.970614 [-inf, 0.721422]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 55/100 total MC = 80 this test stat = 0.0254769\n",
      " s=65.4 ratioSigEff=0.998461 ratioBkgEff=0.962271 [-inf, 0.678264]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 56/100 total MC = 80 this test stat = 0.0380399\n",
      " s=66.6 ratioSigEff=0.998087 ratioBkgEff=0.953952 [-inf, 0.636603]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 57/100 total MC = 80 this test stat = 0.0530874\n",
      " s=67.8 ratioSigEff=0.997703 ratioBkgEff=0.945657 [-inf, 0.596425]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 58/100 total MC = 80 this test stat = 0.0706058\n",
      " s=69 ratioSigEff=0.997308 ratioBkgEff=0.937388 [-inf, 0.70275]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 59/100 total MC = 80 this test stat = 0.0905894\n",
      " s=70.2 ratioSigEff=0.996902 ratioBkgEff=0.929144 [-inf, 0.93255]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 60/100 total MC = 80 this test stat = 0.11303\n",
      " s=71.4 ratioSigEff=0.996485 ratioBkgEff=0.920926 [-inf, 1.06482]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 61/100 total MC = 80 this test stat = 0.137918\n",
      " s=72.6 ratioSigEff=0.996057 ratioBkgEff=0.912734 [-inf, 0.780337]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 62/100 total MC = 80 this test stat = 0.165246\n",
      " s=73.8 ratioSigEff=0.995619 ratioBkgEff=0.904568 [-inf, 0.684448]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 63/100 total MC = 80 this test stat = 0.195001\n",
      " s=75 ratioSigEff=0.995169 ratioBkgEff=0.89643 [-inf, 1.03027]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 64/100 total MC = 80 this test stat = 0.227176\n",
      " s=76.2 ratioSigEff=0.99471 ratioBkgEff=0.888318 [-inf, 0.978263]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 65/100 total MC = 80 this test stat = 0.261776\n",
      " s=77.4 ratioSigEff=0.99424 ratioBkgEff=0.880234 [-inf, 1.11256]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 66/100 total MC = 80 this test stat = 0.298772\n",
      " s=78.6 ratioSigEff=0.993759 ratioBkgEff=0.872179 [-inf, 1.18776]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 67/100 total MC = 80 this test stat = 0.338144\n",
      " s=79.8 ratioSigEff=0.993269 ratioBkgEff=0.864151 [-inf, 1.48101]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 68/100 total MC = 80 this test stat = 0.379914\n",
      " s=81 ratioSigEff=0.992768 ratioBkgEff=0.856152 [-inf, 1.56755]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 69/100 total MC = 80 this test stat = 0.424071\n",
      " s=82.2 ratioSigEff=0.992257 ratioBkgEff=0.848182 [-inf, 1.21708]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 70/100 total MC = 80 this test stat = 0.470561\n",
      " s=83.4 ratioSigEff=0.991736 ratioBkgEff=0.840241 [-inf, 1.43809]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 71/100 total MC = 80 this test stat = 0.519388\n",
      " s=84.6 ratioSigEff=0.991205 ratioBkgEff=0.83233 [-inf, 1.84094]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 72/100 total MC = 80 this test stat = 0.570571\n",
      " s=85.8 ratioSigEff=0.990664 ratioBkgEff=0.824449 [-inf, 1.31514]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 73/100 total MC = 80 this test stat = 0.624119\n",
      " s=87 ratioSigEff=0.990113 ratioBkgEff=0.816598 [-inf, 1.18918]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 74/100 total MC = 80 this test stat = 0.679954\n",
      " s=88.2 ratioSigEff=0.989553 ratioBkgEff=0.808777 [-inf, 1.33503]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 75/100 total MC = 80 this test stat = 0.738105\n",
      " s=89.4 ratioSigEff=0.988983 ratioBkgEff=0.800988 [-inf, 1.56456]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 76/100 total MC = 80 this test stat = 0.798548\n",
      " s=90.6 ratioSigEff=0.988403 ratioBkgEff=0.79323 [-inf, 1.49965]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 77/100 total MC = 80 this test stat = 0.861306\n",
      " s=91.8 ratioSigEff=0.987814 ratioBkgEff=0.785503 [-inf, 1.66275]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 78/100 total MC = 80 this test stat = 0.926319\n",
      " s=93 ratioSigEff=0.987216 ratioBkgEff=0.777809 [-inf, 1.44643]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 79/100 total MC = 80 this test stat = 0.993583\n",
      " s=94.2 ratioSigEff=0.986608 ratioBkgEff=0.770146 [-inf, 2.19051]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 80/100 total MC = 80 this test stat = 1.06308\n",
      " s=95.4 ratioSigEff=0.985991 ratioBkgEff=0.762516 [-inf, 1.54054]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 81/100 total MC = 80 this test stat = 1.13458\n",
      " s=96.6 ratioSigEff=0.985365 ratioBkgEff=0.754919 [-inf, 1.86615]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 82/100 total MC = 80 this test stat = 1.20859\n",
      " s=97.8 ratioSigEff=0.98473 ratioBkgEff=0.747355 [-inf, 2.40993]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 83/100 total MC = 80 this test stat = 1.28501\n",
      " s=99 ratioSigEff=0.984086 ratioBkgEff=0.739824 [-inf, 2.32724]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 84/100 total MC = 80 this test stat = 1.36342\n",
      " s=100.2 ratioSigEff=0.983433 ratioBkgEff=0.732327 [-inf, 2.43281]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 85/100 total MC = 80 this test stat = 1.44405\n",
      " s=101.4 ratioSigEff=0.982771 ratioBkgEff=0.724864 [-inf, 2.44403]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 86/100 total MC = 80 this test stat = 1.52687\n",
      " s=102.6 ratioSigEff=0.982101 ratioBkgEff=0.717436 [-inf, 2.09032]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 87/100 total MC = 80 this test stat = 1.61182\n",
      " s=103.8 ratioSigEff=0.981422 ratioBkgEff=0.710041 [-inf, 2.76135]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 88/100 total MC = 80 this test stat = 1.69896\n",
      " s=105 ratioSigEff=0.980734 ratioBkgEff=0.702682 [-inf, 2.38331]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 89/100 total MC = 80 this test stat = 1.78823\n",
      " s=106.2 ratioSigEff=0.980038 ratioBkgEff=0.695358 [-inf, 2.39444]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 90/100 total MC = 80 this test stat = 1.87929\n",
      " s=107.4 ratioSigEff=0.979333 ratioBkgEff=0.688069 [-inf, 2.89798]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 91/100 total MC = 80 this test stat = 1.97313\n",
      " s=108.6 ratioSigEff=0.97862 ratioBkgEff=0.680815 [-inf, 3.1204]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 92/100 total MC = 80 this test stat = 2.06825\n",
      " s=109.8 ratioSigEff=0.977383 ratioBkgEff=0.67064 [-inf, 3.13169]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 93/100 total MC = 80 this test stat = 2.16592\n",
      " s=111 ratioSigEff=0.976625 ratioBkgEff=0.663285 [-inf, 2.93195]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 94/100 total MC = 80 this test stat = 2.26567\n",
      " s=112.2 ratioSigEff=0.975857 ratioBkgEff=0.655961 [-inf, 2.54424]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 95/100 total MC = 80 this test stat = 2.36747\n",
      " s=113.4 ratioSigEff=0.975049 ratioBkgEff=0.648488 [-inf, 3.05911]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 96/100 total MC = 80 this test stat = 2.47112\n",
      " s=114.6 ratioSigEff=0.97426 ratioBkgEff=0.641205 [-inf, 2.96555]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 97/100 total MC = 80 this test stat = 2.57725\n",
      " s=115.8 ratioSigEff=0.973462 ratioBkgEff=0.633952 [-inf, 3.5205]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 98/100 total MC = 240 this test stat = 2.68512\n",
      " s=117 ratioSigEff=0.972655 ratioBkgEff=0.626728 [-inf, 3.19934]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 99/100 total MC = 80 this test stat = 2.79507\n",
      " s=118.2 ratioSigEff=0.971839 ratioBkgEff=0.619534 [-inf, 3.77433]  in interval = 1\n",
      "\n",
      "NeymanConstruction: Prog: 100/100 total MC = 80 this test stat = 2.90706\n",
      " s=119.4 ratioSigEff=0.971014 ratioBkgEff=0.61237 [-inf, 3.66884]  in interval = 1\n",
      "\n",
      "[#1] INFO:Eval -- 100 points in interval\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "[#1] INFO:Minimization --  Including the following constraint terms in minimization: (sigConstraint,bkgConstraint)\n",
      "[#1] INFO:Minimization -- The global observables are not defined , normalize constraints with respect to the parameters (b,ratioBkgEff,ratioSigEff,s)\n",
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(modelWithConstraints) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 325.192 μs\n",
      "[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_modelWithConstraints_exampleData) Summation contains a RooNLLVar, using its error level\n",
      "[#1] INFO:Minimization -- [fitFCN] No discrete parameters, performing continuous minimization only\n"
     ]
    }
   ],
   "source": [
    "fcint = fc.GetInterval()\n",
    "\n",
    "fit = modelWithConstraints.fitTo(data, Save=True, PrintLevel=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d5f36fd",
   "metadata": {},
   "source": [
    "Third, use a Calculator based on Markov Chain monte carlo\n",
    "Before configuring the calculator, let's make a ProposalFunction\n",
    "that will achieve a high acceptance rate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0d7d8e75",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:56.093003Z",
     "iopub.status.busy": "2026-05-19T20:35:56.092814Z",
     "iopub.status.idle": "2026-05-19T20:35:57.141542Z",
     "shell.execute_reply": "2026-05-19T20:35:57.140804Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[#1] INFO:Minimization --  Including the following constraint terms in minimization: (sigConstraint,bkgConstraint)\n",
      "[#1] INFO:Minimization -- The following global observables have been defined and their values are taken from the model: (gSigEff,gSigBkg)\n",
      "[#1] INFO:Fitting -- RooAbsPdf::fitTo(modelWithConstraints) fixing normalization set for coefficient determination to observables in data\n",
      "[#1] INFO:Fitting -- Creation of NLL object took 337.811 μs\n",
      "Metropolis-Hastings progress: ....................................................................................................\n",
      "[#1] INFO:Eval -- Proposal acceptance rate: 48.36%\n",
      "[#1] INFO:Eval -- Number of steps in chain: 9672\n"
     ]
    }
   ],
   "source": [
    "ph = ROOT.RooStats.ProposalHelper()\n",
    "ph.SetVariables(fit.floatParsFinal())\n",
    "ph.SetCovMatrix(fit.covarianceMatrix())\n",
    "ph.SetUpdateProposalParameters(True)\n",
    "ph.SetCacheSize(100)\n",
    "pdfProp = ph.GetProposalFunction()\n",
    "\n",
    "mc = ROOT.RooStats.MCMCCalculator(data, modelConfig)\n",
    "mc.SetNumIters(20000)  # steps to propose in the chain\n",
    "mc.SetTestSize(0.05)  # 95% CL\n",
    "mc.SetNumBurnInSteps(40)  # ignore first N steps in chain as \"burn in\"\n",
    "mc.SetProposalFunction(pdfProp)\n",
    "mc.SetLeftSideTailFraction(0.5)  # find a \"central\" interval\n",
    "mcInt = mc.GetInterval()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c67d6e9",
   "metadata": {},
   "source": [
    "Get Lower and Upper limits from Profile Calculator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "e659b3cd",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:57.143060Z",
     "iopub.status.busy": "2026-05-19T20:35:57.142939Z",
     "iopub.status.idle": "2026-05-19T20:35:57.255219Z",
     "shell.execute_reply": "2026-05-19T20:35:57.254495Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Profile lower limit on s =  13.949699331790107\n",
      "Profile upper limit on s =  107.9503135662626\n"
     ]
    }
   ],
   "source": [
    "print(\"Profile lower limit on s = \", lrinterval.LowerLimit(s))\n",
    "print(\"Profile upper limit on s = \", lrinterval.UpperLimit(s))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80820b8e",
   "metadata": {},
   "source": [
    "Get Lower and Upper limits from FeldmanCousins with profile construction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a3204005",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:57.256780Z",
     "iopub.status.busy": "2026-05-19T20:35:57.256653Z",
     "iopub.status.idle": "2026-05-19T20:35:57.469450Z",
     "shell.execute_reply": "2026-05-19T20:35:57.468969Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "FC lower limit on s =  0.6\n",
      "FC upper limit on s =  119.39999999999999\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222957460\" style=\"width: 700px; height: 500px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222957460() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(28223,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222957460', 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_1779222957460();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "if fcint:\n",
    "    fcul = fcint.UpperLimit(s)\n",
    "    fcll = fcint.LowerLimit(s)\n",
    "    print(\"FC lower limit on s = \", fcll)\n",
    "    print(\"FC upper limit on s = \", fcul)\n",
    "    fcllLine = ROOT.TLine(fcll, 0, fcll, 1)\n",
    "    fculLine = ROOT.TLine(fcul, 0, fcul, 1)\n",
    "    fcllLine.SetLineColor(\"kRed\")\n",
    "    fculLine.SetLineColor(\"kRed\")\n",
    "    fcllLine.Draw(\"same\")\n",
    "    fculLine.Draw(\"same\")\n",
    "    dataCanvas.Update()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32aa1097",
   "metadata": {},
   "source": [
    "Plot MCMC interval and print some statistics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "6add1341",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:57.471256Z",
     "iopub.status.busy": "2026-05-19T20:35:57.471135Z",
     "iopub.status.idle": "2026-05-19T20:35:57.601922Z",
     "shell.execute_reply": "2026-05-19T20:35:57.601278Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MCMC lower limit on s =  19.047442766582563\n",
      "MCMC upper limit on s =  102.7400864812879\n",
      "MCMC Actual confidence level:  0.9500150557061127\n"
     ]
    }
   ],
   "source": [
    "mcPlot = ROOT.RooStats.MCMCIntervalPlot(mcInt)\n",
    "mcPlot.SetLineColor(\"kMagenta\")\n",
    "mcPlot.SetLineWidth(2)\n",
    "mcPlot.Draw(\"same\")\n",
    "\n",
    "mcul = mcInt.UpperLimit(s)\n",
    "mcll = mcInt.LowerLimit(s)\n",
    "print(\"MCMC lower limit on s = \", mcll)\n",
    "print(\"MCMC upper limit on s = \", mcul)\n",
    "print(\"MCMC Actual confidence level: \", mcInt.GetActualConfidenceLevel())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0e8fc3a",
   "metadata": {},
   "source": [
    "3-d plot of the parameter points"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "0848a317",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:57.603888Z",
     "iopub.status.busy": "2026-05-19T20:35:57.603768Z",
     "iopub.status.idle": "2026-05-19T20:35:57.707765Z",
     "shell.execute_reply": "2026-05-19T20:35:57.707127Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.TPad object at 0x5562188bb150>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataCanvas.cd(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7e2ee22",
   "metadata": {},
   "source": [
    "also plot the points in the markov chain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d99d08b5",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:57.709740Z",
     "iopub.status.busy": "2026-05-19T20:35:57.709592Z",
     "iopub.status.idle": "2026-05-19T20:35:57.862740Z",
     "shell.execute_reply": "2026-05-19T20:35:57.862084Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "plotting the chain data - nentries =  9672\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "9672"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chainData = mcInt.GetChainAsDataSet()\n",
    "\n",
    "print(\"plotting the chain data - nentries = \", chainData.numEntries())\n",
    "chain = ROOT.RooStats.GetAsTTree(\"chainTreeData\", \"chainTreeData\", chainData)\n",
    "chain.SetMarkerStyle(6)\n",
    "chain.SetMarkerColor(\"kRed\")\n",
    "\n",
    "chain.Draw(\"s:ratioSigEff:ratioBkgEff\", \"nll_MarkovChain_local_\", \"box\")  # 3-d box proportional to posterior"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "047e4be9",
   "metadata": {},
   "source": [
    "the points used in the profile construction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ea26494e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:57.864687Z",
     "iopub.status.busy": "2026-05-19T20:35:57.864556Z",
     "iopub.status.idle": "2026-05-19T20:35:57.987980Z",
     "shell.execute_reply": "2026-05-19T20:35:57.987639Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "plotting the scanned points used in the frequentist construction - npoints =  100\n"
     ]
    }
   ],
   "source": [
    "parScanData = fc.GetPointsToScan()\n",
    "print(\"plotting the scanned points used in the frequentist construction - npoints = \", parScanData.numEntries())\n",
    "\n",
    "gr = ROOT.TGraph2D(parScanData.numEntries())\n",
    "for ievt in range(parScanData.numEntries()):\n",
    "    evt = parScanData.get(ievt)\n",
    "    x = evt.getRealValue(\"ratioBkgEff\")\n",
    "    y = evt.getRealValue(\"ratioSigEff\")\n",
    "    z = evt.getRealValue(\"s\")\n",
    "    gr.SetPoint(ievt, x, y, z)\n",
    "\n",
    "gr.SetMarkerStyle(24)\n",
    "gr.Draw(\"P SAME\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa526895",
   "metadata": {},
   "source": [
    "print timing info"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "d0aa278e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:57.997456Z",
     "iopub.status.busy": "2026-05-19T20:35:57.997330Z",
     "iopub.status.idle": "2026-05-19T20:35:58.204033Z",
     "shell.execute_reply": "2026-05-19T20:35:58.203636Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Real time 0:00:06, CP time 4.960\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file rs101_limitexample.png has been created\n"
     ]
    }
   ],
   "source": [
    "t.Stop()\n",
    "t.Print()\n",
    "\n",
    "dataCanvas.SaveAs(\"rs101_limitexample.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c77e0e3",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "43bd1db4",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:35:58.215057Z",
     "iopub.status.busy": "2026-05-19T20:35:58.214911Z",
     "iopub.status.idle": "2026-05-19T20:35:58.333474Z",
     "shell.execute_reply": "2026-05-19T20:35:58.332828Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779222958331\" style=\"width: 700px; height: 500px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779222958331() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(48678,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779222958331', 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_1779222958331();\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
}
