/// \file /// \ingroup tutorial_roostats /// \notebook -js /// An example of using the HypoTestInverterOriginal class /// /// \macro_image /// \macro_output /// \macro_code /// /// \author Gregory Schott #include "RooRealVar.h" #include "RooConstVar.h" #include "RooProdPdf.h" #include "RooWorkspace.h" #include "RooDataSet.h" #include "RooPolynomial.h" #include "RooAddPdf.h" #include "RooExtendPdf.h" #include "RooStats/HypoTestInverterOriginal.h" #include "RooStats/HypoTestInverterResult.h" #include "RooStats/HypoTestInverterPlot.h" #include "RooStats/HybridCalculatorOriginal.h" #include "TGraphErrors.h" using namespace RooFit; using namespace RooStats; void rs801_HypoTestInverterOriginal() { // prepare the model RooRealVar lumi("lumi", "luminosity", 1); RooRealVar r("r", "cross-section ratio", 3.74, 0, 50); RooFormulaVar ns("ns", "1*r*lumi", RooArgList(lumi, r)); RooRealVar nb("nb", "background yield", 1); RooRealVar x("x", "dummy observable", 0, 1); RooConstVar p0(RooFit::RooConst(0)); RooPolynomial flatPdf("flatPdf", "flat PDF", x, p0); RooAddPdf totPdf("totPdf", "S+B model", RooArgList(flatPdf, flatPdf), RooArgList(ns, nb)); RooExtendPdf bkgPdf("bkgPdf", "B-only model", flatPdf, nb); RooDataSet *data = totPdf.generate(x, 1); // prepare the calculator HybridCalculatorOriginal myhc(*data, totPdf, bkgPdf, 0, 0); myhc.SetTestStatistic(2); myhc.SetNumberOfToys(1000); myhc.UseNuisance(false); // run the hypothesis-test inversion HypoTestInverterOriginal myInverter(myhc, r); myInverter.SetTestSize(0.10); myInverter.UseCLs(true); // myInverter.RunFixedScan(5,1,6); // scan for a 95% UL myInverter.RunAutoScan(3., 5, myInverter.Size() / 2, 0.005); // run an alternative autoscan algorithm // myInverter.RunAutoScan(1,6,myInverter.Size()/2,0.005,1); // myInverter.RunOnePoint(3.9); HypoTestInverterResult *results = myInverter.GetInterval(); HypoTestInverterPlot myInverterPlot("myInverterPlot", "", results); TGraphErrors *gr1 = myInverterPlot.MakePlot(); gr1->Draw("ALP"); double ulError = results->UpperLimitEstimatedError(); double upperLimit = results->UpperLimit(); std::cout << "The computed upper limit is: " << upperLimit << std::endl; std::cout << "an estimated error on this upper limit is: " << ulError << std::endl; // expected result: 4.10 } int main() { rs801_HypoTestInverterOriginal(); }