'Number Counting Example' RooStats tutorial macro #100
This tutorial shows an example of a combination of two searches using number counting with background uncertainty.
The macro uses a RooStats "factory" to construct a PDF that represents the two number counting analyses with background uncertainties. The uncertainties are taken into account by considering a sideband measurement of a size that corresponds to the background uncertainty. The problem has been studied in these references:
After using the factory to make the model, we use a RooStats ProfileLikelihoodCalculator for a Hypothesis test and a confidence interval. The calculator takes into account systematics by eliminating nuisance parameters with the profile likelihood. This is equivalent to the method of MINOS.
[#0] WARNING:ObjectHandling -- NumberCountingPdfFactory: changed value of tau_0 to 100.01 to be consistent with background and its uncertainty. Also stored these values of tau into workspace with name . tau_0ExpectedNumberCountingData if you test with a different dataset, you should adjust tau appropriately.
[#0] WARNING:ObjectHandling -- NumberCountingPdfFactory: changed value of tau_1 to 100.01 to be consistent with background and its uncertainty. Also stored these values of tau into workspace with name . tau_1ExpectedNumberCountingData if you test with a different dataset, you should adjust tau appropriately.
[#1] INFO:InputArguments -- The deprecated RooFit::CloneData(1) option passed to createNLL() is ignored.
[#1] INFO:Fitting -- RooAbsPdf::fitTo(TopLevelPdf) fixing normalization set for coefficient determination to observables in data
[#1] INFO:Fitting -- using CPU computation library compiled with -mavx2
[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoGLobalFit - find MLE
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_TopLevelPdf_ExpectedNumberCountingData) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization
[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoMinimizeNLL - using Minuit2 / with strategy 1
[#1] INFO:Minimization --
RooFitResult: minimized FCN value: 17.6316, estimated distance to minimum: 4.66835e-14
covariance matrix quality: Full, accurate covariance matrix
Status : MINIMIZE=0
Floating Parameter FinalValue +/- Error
-------------------- --------------------------
b_0 1.0000e+02 +/- 9.99e-01
b_1 1.0000e+02 +/- 9.96e-01
masterSignal 1.0000e+00 +/- 4.78e-01
[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::GetHypoTest - do conditional fit
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_TopLevelPdf_ExpectedNumberCountingData) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization
[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoMinimizeNLL - using Minuit2 / with strategy 1
[#1] INFO:Minimization --
RooFitResult: minimized FCN value: 19.9696, estimated distance to minimum: 2.75635e-13
covariance matrix quality: Full, accurate covariance matrix
Status : MINIMIZE=0
Floating Parameter FinalValue +/- Error
-------------------- --------------------------
b_0 1.0020e+02 +/- 9.96e-01
b_1 1.0010e+02 +/- 9.95e-01
-------------------------------------------------
The p-value for the null is 0.015294
Corresponding to a significance of 2.16239
-------------------------------------------------
[#1] INFO:InputArguments -- The deprecated RooFit::CloneData(1) option passed to createNLL() is ignored.
[#1] INFO:Fitting -- RooAbsPdf::fitTo(TopLevelPdf) fixing normalization set for coefficient determination to observables in data
[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoGLobalFit - find MLE
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_TopLevelPdf_ExpectedNumberCountingData) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooAbsMinimizerFcn::setOptimizeConst: activating const optimization
[#0] PROGRESS:Minimization -- ProfileLikelihoodCalcultor::DoMinimizeNLL - using Minuit2 / with strategy 1
[#1] INFO:Minimization --
RooFitResult: minimized FCN value: 17.6316, estimated distance to minimum: 7.42432e-13
covariance matrix quality: Full, accurate covariance matrix
Status : MINIMIZE=0
Floating Parameter FinalValue +/- Error
-------------------- --------------------------
b_0 1.0000e+02 +/- 9.99e-01
b_1 1.0000e+02 +/- 9.96e-01
masterSignal 1.0000e+00 +/- 4.78e-01
[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[masterSignal]) Creating instance of MINUIT
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_TopLevelPdf_ExpectedNumberCountingData) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[masterSignal]) determining minimum likelihood for current configurations w.r.t all observable
[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[masterSignal]) minimum found at (masterSignal=1.00388)
.
[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[masterSignal]) Creating instance of MINUIT
[#1] INFO:Fitting -- RooAddition::defaultErrorLevel(nll_TopLevelPdf_ExpectedNumberCountingData) Summation contains a RooNLLVar, using its error level
[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[masterSignal]) determining minimum likelihood for current configurations w.r.t all observable
[#0] ERROR:InputArguments -- RooArgSet::checkForDup: ERROR argument with name masterSignal is already in this set
[#1] INFO:Minimization -- RooProfileLL::evaluate(RooEvaluatorWrapper_Profile[masterSignal]) minimum found at (masterSignal=1.00732)
..........................................................................................................................................................................................................lower limit on master signal = 0.089069
upper limit on master signal = 2.00127
-------------------------------------------------
Consider this parameter point:
RooRealVar::masterSignal = 0 +/- 0.477961 L(0 - 3)
It is NOT in the interval.
-------------------------------------------------
-------------------------------------------------
Consider this parameter point:
RooRealVar::masterSignal = 2 +/- 0.477961 L(0 - 3)
It IS in the interval.
-------------------------------------------------
#include <cassert>
void rs_numberCountingCombination_expected();
void rs_numberCountingCombination_observed();
void rs_numberCountingCombination_observedWithTau();
void rs_numberCountingCombination(int flag = 1)
{
if (flag == 1)
rs_numberCountingCombination_expected();
if (flag == 2)
rs_numberCountingCombination_observed();
if (flag == 3)
rs_numberCountingCombination_observedWithTau();
}
void rs_numberCountingCombination_expected()
{
double s[2] = {20., 10.};
double b[2] = {100., 100.};
double db[2] = {.0100, .0100};
f.AddModel(s, 2, &wspace,
"TopLevelPdf",
"masterSignal");
f.AddExpData(s,
b, db, 2, &wspace,
"ExpectedNumberCountingData");
nullParams.setRealValue("masterSignal", 0);
&nullParams);
std::unique_ptr<HypoTestResult> htr{plc.GetHypoTest()};
std::cout << "-------------------------------------------------" << std::endl;
std::cout << "The p-value for the null is " << htr->NullPValue() << std::endl;
std::cout << "Corresponding to a significance of " << htr->Significance() << std::endl;
std::cout << "-------------------------------------------------\n\n" << std::endl;
plc.SetParameters(paramsOfInterest);
std::unique_ptr<LikelihoodInterval> lrint{
static_cast<LikelihoodInterval *
>(plc.GetInterval())};
double lower = lrint->LowerLimit(*mu);
double upper = lrint->UpperLimit(*mu);
lrPlot.SetMaximum(3.);
lrPlot.Draw();
std::cout << "lower limit on master signal = " << lower << std::endl;
std::cout << "upper limit on master signal = " << upper << std::endl;
std::cout << "-------------------------------------------------" << std::endl;
std::cout << "Consider this parameter point:" << std::endl;
if (lrint->IsInInterval(paramsOfInterest))
std::cout << "It IS in the interval." << std::endl;
else
std::cout << "It is NOT in the interval." << std::endl;
std::cout << "-------------------------------------------------\n\n" << std::endl;
std::cout << "-------------------------------------------------" << std::endl;
std::cout << "Consider this parameter point:" << std::endl;
if (lrint->IsInInterval(paramsOfInterest))
std::cout << "It IS in the interval." << std::endl;
else
std::cout << "It is NOT in the interval." << std::endl;
std::cout << "-------------------------------------------------\n\n" << std::endl;
}
void rs_numberCountingCombination_observed()
{
double s[2] = {20., 10.};
f.AddModel(s, 2, &wspace,
"TopLevelPdf",
"masterSignal");
double mainMeas[2] = {123., 117.};
double bkgMeas[2] = {111.23, 98.76};
double dbMeas[2] = {.011, .0095};
f.AddData(mainMeas, bkgMeas, dbMeas, 2, &wspace,
"ObservedNumberCountingData");
nullParams.setRealValue("masterSignal", 0);
&nullParams);
wspace.var("tau_0")->Print();
wspace.var("tau_1")->Print();
std::unique_ptr<HypoTestResult> htr{plc.GetHypoTest()};
std::cout << "-------------------------------------------------" << std::endl;
std::cout << "The p-value for the null is " << htr->NullPValue() << std::endl;
std::cout << "Corresponding to a significance of " << htr->Significance() << std::endl;
std::cout << "-------------------------------------------------\n\n" << std::endl;
plc.SetParameters(paramsOfInterest);
std::unique_ptr<LikelihoodInterval> lrint{
static_cast<LikelihoodInterval *
>(plc.GetInterval())};
std::cout << "lower limit on master signal = " << lrint->LowerLimit(*mu) << std::endl;
std::cout << "upper limit on master signal = " << lrint->UpperLimit(*mu) << std::endl;
}
void rs_numberCountingCombination_observedWithTau()
{
double s[2] = {20., 10.};
f.AddModel(s, 2, &wspace,
"TopLevelPdf",
"masterSignal");
double mainMeas[2] = {123., 117.};
double sideband[2] = {11123., 9876.};
double tau[2] = {100., 100.};
f.AddDataWithSideband(mainMeas, sideband, tau, 2, &wspace,
"ObservedNumberCountingDataWithSideband");
nullParams.setRealValue("masterSignal", 0);
poi, 0.05, &nullParams);
std::unique_ptr<HypoTestResult> htr{plc.GetHypoTest()};
std::cout << "-------------------------------------------------" << std::endl;
std::cout << "The p-value for the null is " << htr->NullPValue() << std::endl;
std::cout << "Corresponding to a significance of " << htr->Significance() << std::endl;
std::cout << "-------------------------------------------------\n\n" << std::endl;
plc.SetParameters(paramsOfInterest);
std::unique_ptr<LikelihoodInterval> lrint{
static_cast<LikelihoodInterval *
>(plc.GetInterval())};
std::cout << "lower limit on master signal = " << lrint->LowerLimit(*mu) << std::endl;
std::cout << "upper limit on master signal = " << lrint->UpperLimit(*mu) << std::endl;
}
void Print(Option_t *options=nullptr) const override
Print the object to the defaultPrintStream().
RooAbsArg * first() const
bool setRealValue(const char *name, double newVal=0.0, bool verbose=false)
Set value of a RooAbsRealLValue stored in set with given name to newVal No error messages are printed...
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Variable that can be changed from the outside.
This class provides simple and straightforward utilities to plot a LikelihoodInterval object.
LikelihoodInterval is a concrete implementation of the RooStats::ConfInterval interface.
void SetConfidenceLevel(double cl) override
set the confidence level for the interval (e.g 0.682 for a 1-sigma interval)
A factory for building PDFs and data for a number counting combination.
The ProfileLikelihoodCalculator is a concrete implementation of CombinedCalculator (the interface cla...
Persistable container for RooFit projects.
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
Namespace for the RooStats classes.
- Author
- Kyle Cranmer
Definition in file rs_numberCountingCombination.C.