89template<
class HypoTestType>
90struct HypoTestWrapper {
92 static void SetToys(HypoTestType *
h,
int toyNull,
int toyAlt) {
h->SetToys(toyNull,toyAlt); }
131 if (!modelSB || ! modelB)
132 oocoutF((
TObject*)0,InputArguments) <<
"HypoTestInverter - model are not existing" << std::endl;
133 assert(modelSB && modelB);
135 oocoutI((
TObject*)0,InputArguments) <<
"HypoTestInverter ---- Input models: \n"
136 <<
"\t\t using as S+B (null) model : "
138 <<
"\t\t using as B (alternate) model : "
139 << modelB->
GetName() <<
"\n" << std::endl;
144 if (!bPdf || !bObs) {
145 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - B model has no pdf or observables defined" << std::endl;
150 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - pdf of B model has no parameters" << std::endl;
155 if (!poiB || !poiB->
find(scanVariable.
GetName()) ||
157 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter - using a B model with POI "
158 << scanVariable.
GetName() <<
" not equal to zero "
159 <<
" user must check input model configurations " << endl;
160 if (poiB)
delete poiB;
178 fCalcType(kUndefined),
179 fNBins(0), fXmin(1), fXmax(1),
198 fScannedVariable(scannedVariable),
204 fCalcType(kUndefined),
205 fNBins(0), fXmin(1), fXmax(1),
213 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
235 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - Type of hypotest calculator is not supported " <<std::endl;
251 fScannedVariable(scannedVariable),
258 fNBins(0), fXmin(1), fXmax(1),
266 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
284 fScannedVariable(scannedVariable),
290 fCalcType(kFrequentist),
291 fNBins(0), fXmin(1), fXmax(1),
299 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
316 fScannedVariable(scannedVariable),
322 fCalcType(kAsymptotic),
323 fNBins(0), fXmin(1), fXmax(1),
331 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
349 fScannedVariable(scannedVariable),
356 fNBins(0), fXmin(1), fXmax(1),
368 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
383 fCalculator0(0), fScannedVariable(0),
396 if (
this == &rhs)
return *
this;
461 TString results_name =
"result_";
464 TString title =
"HypoTestInverter Result For ";
495 oocoutI((
TObject*)0,
Eval) <<
"HypoTestInverter::GetInterval - return an already existing interval " << std::endl;
500 oocoutI((
TObject*)0,
Eval) <<
"HypoTestInverter::GetInterval - run a fixed scan" << std::endl;
503 oocoutE((
TObject*)0,
Eval) <<
"HypoTestInverter::GetInterval - error running a fixed scan " << std::endl;
506 oocoutI((
TObject*)0,
Eval) <<
"HypoTestInverter::GetInterval - run an automatic scan" << std::endl;
507 double limit(0),err(0);
510 oocoutE((
TObject*)0,
Eval) <<
"HypoTestInverter::GetInterval - error running an auto scan " << std::endl;
564 while (clsMidErr >=
fgCLAccuracy && (clsTarget == -1 || fabs(clsMid-clsTarget) < 3*clsMidErr) ) {
565 std::unique_ptr<HypoTestResult> more(hc.
GetHypoTest());
570 hcResult->
Append(more.get());
573 if (
fVerbose) std::cout << (
fUseCLs ?
"\tCLs = " :
"\tCLsplusb = ") << clsMid <<
" +/- " << clsMidErr << std::endl;
580 "\tCLs = " << hcResult->
CLs() <<
" +/- " << hcResult->
CLsError() <<
"\n" <<
581 "\tCLb = " << hcResult->
CLb() <<
" +/- " << hcResult->
CLbError() <<
"\n" <<
615 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunFixedScan - Please provide nBins>0\n";
618 if ( nBins==1 && xMin!=xMax ) {
619 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunFixedScan - nBins==1 -> I will run for xMin (" << xMin <<
")\n";
621 if ( xMin==xMax && nBins>1 ) {
622 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunFixedScan - xMin==xMax -> I will enforce nBins==1\n";
626 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunFixedScan - Please provide xMin ("
627 << xMin <<
") smaller than xMax (" << xMax <<
")\n";
631 if (xMin < fScannedVariable->getMin()) {
633 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunFixedScan - xMin < lower bound, using xmin = "
634 << xMin << std::endl;
638 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunFixedScan - xMax > upper bound, using xmax = "
639 << xMax << std::endl;
642 if (xMin <= 0. && scanLog) {
643 oocoutE((
TObject*)
nullptr, InputArguments) <<
"HypoTestInverter::RunFixedScan - cannot go in log steps if xMin <= 0" << std::endl;
648 for (
int i=0; i<nBins; i++) {
652 thisX =
exp(
log(xMin) + i*(
log(xMax)-
log(xMin))/(nBins-1) );
654 thisX = xMin + i*(xMax-xMin)/(nBins-1);
660 if ( status==
false ) {
661 oocoutW((
TObject*)0,
Eval) <<
"HypoTestInverter::RunFixedScan - The hypo test for point " << thisX <<
" failed. Skipping." << std::endl;
677 if ( rVal < fScannedVariable->getMin() ) {
678 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunOnePoint - Out of range: using the lower bound "
680 <<
" on the scanned variable rather than " << rVal<<
"\n";
686 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunOnePoint - Out of range: using the upper bound "
688 <<
" on the scanned variable rather than " << rVal<<
"\n";
703 const_cast<ModelConfig*
>(sbModel)->SetSnapshot(poi);
718 if (!std::isfinite(nullPV) || nullPV < 0. || nullPV > 1. || !std::isfinite(altPV) || altPV < 0. || altPV > 1.) {
726 else lastXtested = -999;
731 oocoutI((
TObject*)0,
Eval) <<
"HypoTestInverter::RunOnePoint - Merge with previous result for "
735 prevResult->
Append(result);
740 oocoutI((
TObject*)0,
Eval) <<
"HypoTestInverter::RunOnePoint - replace previous empty result\n";
777 if ((hint != 0) && (*hint >
r->getMin())) {
778 r->setMax(std::min<double>(3.0 * (*hint),
r->getMax()));
779 r->setMin(std::max<double>(0.3 * (*hint),
r->getMin()));
780 oocoutI((
TObject*)0,InputArguments) <<
"HypoTestInverter::RunLimit - Use hint value " << *hint
781 <<
" search in interval " <<
r->getMin() <<
" , " <<
r->getMax() << std::endl;
788 typedef std::pair<double,double> CLs_t;
789 double clsTarget =
fSize;
790 CLs_t clsMin(1,0), clsMax(0,0), clsMid(0,0);
791 double rMin =
r->getMin(), rMax =
r->getMax();
792 limit = 0.5*(rMax + rMin);
793 limitErr = 0.5*(rMax - rMin);
796 TF1 expoFit(
"expoFit",
"[0]*exp([1]*(x-[2]))", rMin, rMax);
800 if (
fVerbose > 0) std::cout <<
"Search for upper limit to the limit" << std::endl;
801 for (
int tries = 0; tries < 6; ++tries) {
803 oocoutE((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - Hypotest failed at upper limit of scan range: " << rMax << std::endl;
808 if (clsMax.first == 0 || clsMax.first + 3 * fabs(clsMax.second) < clsTarget )
break;
812 <<
" = " << rMax <<
" still getting "
813 << (
fUseCLs ?
"CLs" :
"CLsplusb") <<
" = " << clsMax.first << std::endl;
818 oocoutI((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - Search for lower limit to the limit" << std::endl;
826 oocoutE((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - Hypotest failed at lower limit of scan range: " << rMin << std::endl;
831 if (clsMin.first != 1 && clsMin.first - 3 * fabs(clsMin.second) < clsTarget) {
837 for (
int tries = 0; tries < 6; ++tries) {
839 oocoutE((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - Hypotest failed at lower limit of scan range: " << rMin << std::endl;
840 rMin = rMin == 0. ? 0.1 : rMin * 1.1;
844 if (clsMin.first == 1 || clsMin.first - 3 * fabs(clsMin.second) > clsTarget)
break;
848 <<
" = " << rMin <<
" still get " << (
fUseCLs ?
"CLs" :
"CLsplusb")
849 <<
" = " << clsMin.first << std::endl;
857 oocoutI((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - Now doing proper bracketing & bisection" << std::endl;
862 oocoutW((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - maximum number of toys reached " << std::endl;
868 limit = 0.5*(rMin+rMax); limitErr = 0.5*(rMax-rMin);
869 if (
fgAlgo ==
"logSecant" && clsMax.first != 0) {
870 double logMin =
log(clsMin.first), logMax =
log(clsMax.first), logTarget =
log(clsTarget);
871 limit = rMin + (rMax-rMin) * (logTarget - logMin)/(logMax - logMin);
872 if (clsMax.second != 0 && clsMin.second != 0) {
873 limitErr = hypot((logTarget-logMax) * (clsMin.second/clsMin.first), (logTarget-logMin) * (clsMax.second/clsMax.first));
874 limitErr *= (rMax-rMin)/((logMax-logMin)*(logMax-logMin));
877 r->setError(limitErr);
880 if (limitErr < std::max(absAccuracy, relAccuracy * limit)) {
882 oocoutI((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - reached accuracy " << limitErr
883 <<
" below " << std::max(absAccuracy, relAccuracy * limit) << std::endl;
889 oocoutE((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - Hypo test failed at x=" << limit <<
" when trying to find limit." << std::endl;
894 if (clsMid.second == -1) {
895 std::cerr <<
"Hypotest failed" << std::endl;
900 if (fabs(clsMid.first-clsTarget) >= 2*clsMid.second) {
901 if ((clsMid.first>clsTarget) == (clsMax.first>clsTarget)) {
902 rMax = limit; clsMax = clsMid;
904 rMin = limit; clsMin = clsMid;
907 if (
fVerbose > 0) std::cout <<
"Trying to move the interval edges closer" << std::endl;
908 double rMinBound = rMin, rMaxBound = rMax;
910 while (clsMin.second == 0 || fabs(rMin-limit) > std::max(absAccuracy, relAccuracy * limit)) {
911 rMin = 0.5*(rMin+limit);
913 oocoutE((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - Hypo test failed at x=" << rMin <<
" when trying to find limit from below." << std::endl;
917 if (fabs(clsMin.first-clsTarget) <= 2*clsMin.second)
break;
920 while (clsMax.second == 0 || fabs(rMax-limit) > std::max(absAccuracy, relAccuracy * limit)) {
921 rMax = 0.5*(rMax+limit);
923 oocoutE((
TObject*)0,
Eval) <<
"HypoTestInverter::RunLimit - Hypo test failed at x=" << rMin <<
" when trying to find limit from above." << std::endl;
927 if (fabs(clsMax.first-clsTarget) <= 2*clsMax.second)
break;
930 expoFit.
SetRange(rMinBound,rMaxBound);
938 std::cout <<
"Limit: " <<
r->
GetName() <<
" < " << limit <<
" +/- " << limitErr <<
" [" << rMin <<
", " << rMax <<
"]\n";
944 double rMinBound, rMaxBound; expoFit.
GetRange(rMinBound, rMaxBound);
945 limitErr = std::max(fabs(rMinBound-limit), fabs(rMaxBound-limit));
952 for (
int j = 0; j <
fLimitPlot->GetN(); ++j) {
955 for (
int i = 0, imax = 8; i <= imax; ++i, ++npoints) {
965 if (limitErr < std::max(absAccuracy, relAccuracy * limit))
break;
970 if (!
RunOnePoint(rTry,
true,clsTarget) )
return false;
982 double xmin =
r->getMin(),
xmax =
r->getMax();
983 for (
int j = 0; j <
fLimitPlot->GetN(); ++j) {
989 fLimitPlot->GetYaxis()->SetRangeUser(0.5*clsTarget, 1.5*clsTarget);
991 expoFit.
Draw(
"SAME");
1002 <<
"\tLimit: " <<
r->
GetName() <<
" < " << limit <<
" +/- " << limitErr <<
" @ " << (1-
fSize) * 100 <<
"% CL\n";
1027 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter::GetLowerLimitDistribution(false) - result not existing\n";
1033 TList * clsDist = 0;
1034 TList * clsbDist = 0;
1054 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter::GetUpperLimitDistribution(false) - result not existing\n";
1060 TList * clsDist = 0;
1061 TList * clsbDist = 0;
1089 if (!bModel || ! sbModel)
return 0;
1096 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter::RebuildDistribution - background snapshot not existing"
1097 <<
" assume is for POI = 0" << std::endl;
1102 paramPoint = *poibkg;
1106 if (!toymcSampler) {
1107 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter::RebuildDistribution - no toy MC sampler existing" << std::endl;
1125 bool storePValues = clsDist || clsbDist || clbDist;
1126 if (
fNBins <=0 && storePValues) {
1127 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter::RebuildDistribution - cannot return p values distribution with the auto scan" << std::endl;
1128 storePValues =
false;
1135 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - result is not existing and number of point to scan is not set"
1141 if (nToys <= 0) nToys = 100;
1143 std::vector<std::vector<double> > CLs_values(nPoints);
1144 std::vector<std::vector<double> > CLsb_values(nPoints);
1145 std::vector<std::vector<double> > CLb_values(nPoints);
1148 for (
int i = 0; i < nPoints; ++i) {
1149 CLs_values[i].reserve(nToys);
1150 CLb_values[i].reserve(nToys);
1151 CLsb_values[i].reserve(nToys);
1155 std::vector<double> limit_values; limit_values.reserve(nToys);
1157 oocoutI((
TObject*)0,InputArguments) <<
"HypoTestInverter - rebuilding the p value distributions by generating ntoys = "
1158 << nToys << std::endl;
1161 oocoutI((
TObject*)0,InputArguments) <<
"Rebuilding using parameter of interest point: ";
1164 oocoutI((
TObject*)0,InputArguments) <<
"And using nuisance parameters: ";
1168 assert(bModel->
GetPdf() );
1176 oocoutE((
TObject*)0,InputArguments) <<
"HypoTestInverter - RebuildDistributions - Error opening file " << outputfile
1177 <<
" - the resulting limits will not be stored" << std::endl;
1180 TH1D * hL =
new TH1D(
"lowerLimitDist",
"Rebuilt lower limit distribution",100,1.,0.);
1181 TH1D * hU =
new TH1D(
"upperLimitDist",
"Rebuilt upper limit distribution",100,1.,0.);
1182 TH1D * hN =
new TH1D(
"nObs",
"Observed events",100,1.,0.);
1185 std::vector<TH1*> hCLb;
1186 std::vector<TH1*> hCLsb;
1187 std::vector<TH1*> hCLs;
1189 for (
int i = 0; i < nPoints; ++i) {
1190 hCLb.push_back(
new TH1D(
TString::Format(
"CLbDist_bin%d",i),
"CLb distribution",100,1.,0.));
1191 hCLs.push_back(
new TH1D(
TString::Format(
"ClsDist_bin%d",i),
"CLs distribution",100,1.,0.));
1192 hCLsb.push_back(
new TH1D(
TString::Format(
"CLsbDist_bin%d",i),
"CLs+b distribution",100,1.,0.));
1198 for (
int itoy = 0; itoy < nToys; ++itoy) {
1200 oocoutP((
TObject*)0,
Eval) <<
"\nHypoTestInverter - RebuildDistributions - running toy # " << itoy <<
" / "
1201 << nToys << std::endl;
1204 printf(
"\n\nshnapshot of s+b model \n");
1208 if (itoy> 0) *allParams = saveParams;
1220 oocoutP((
TObject*)0,Generation) <<
"Generate observables are : ";
1224 for (
int i = 0; i < genObs.
getSize(); ++i) {
1241 if (
r == 0)
continue;
1243 double value = (isUpper) ?
r->UpperLimit() :
r->LowerLimit();
1244 limit_values.push_back( value );
1245 hU->
Fill(
r->UpperLimit() );
1246 hL->
Fill(
r->LowerLimit() );
1249 std::cout <<
"The computed upper limit for toy #" << itoy <<
" is " << value << std::endl;
1252 if (itoy%10 == 0 || itoy == nToys-1) {
1258 if (!storePValues)
continue;
1260 if (nPoints < r->ArraySize()) {
1261 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter: skip extra points" << std::endl;
1263 else if (nPoints >
r->ArraySize()) {
1264 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter: missing some points" << std::endl;
1268 for (
int ipoint = 0; ipoint < nPoints; ++ipoint) {
1271 CLs_values[ipoint].push_back( hr->
CLs() );
1272 CLsb_values[ipoint].push_back( hr->
CLsplusb() );
1273 CLb_values[ipoint].push_back( hr->
CLb() );
1274 hCLs[ipoint]->Fill( hr->
CLs() );
1275 hCLb[ipoint]->Fill( hr->
CLb() );
1276 hCLsb[ipoint]->Fill( hr->
CLsplusb() );
1279 oocoutW((
TObject*)0,InputArguments) <<
"HypoTestInverter: missing result for point: x = "
1284 if (itoy%10 == 0 || itoy == nToys-1) {
1285 for (
int ipoint = 0; ipoint < nPoints; ++ipoint) {
1299 if (clsDist) clsDist->
SetOwner(
true);
1300 if (clbDist) clbDist->
SetOwner(
true);
1301 if (clsbDist) clsbDist->
SetOwner(
true);
1303 oocoutI((
TObject*)0,InputArguments) <<
"HypoTestInverter: storing rebuilt p values " << std::endl;
1305 for (
int ipoint = 0; ipoint < nPoints; ++ipoint) {
1328 for (
int i = 0; i < nPoints && storePValues; ++i) {
1335 const char * disName = (isUpper) ?
"upperLimit_dist" :
"lowerLimit_dist";
RooArgSet * getVariables(Bool_t stripDisconnected=kTRUE) const
Return RooArgSet with all variables (tree leaf nodes of expresssion tree)
RooArgSet * getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooAbsCollection * selectCommon(const RooAbsCollection &refColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
RooAbsArg * first() const
virtual void Print(Option_t *options=0) const
This method must be overridden when a class wants to print itself.
RooAbsArg * find(const char *name) const
Find object with given name in list.
RooAbsData is the common abstract base class for binned and unbinned datasets.
virtual const RooArgSet * get() const
virtual Double_t sumEntries() const =0
Return effective number of entries in dataset, i.e., sum all weights.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
Bool_t canBeExtended() const
If true, PDF can provide extended likelihood term.
virtual Double_t getMax(const char *name=0) const
Get maximum of currently defined range.
virtual Double_t getMin(const char *name=0) const
Get miniminum of currently defined range.
Double_t getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE) override
Add element to non-owning set.
static Double_t uniform(TRandom *generator=randomGenerator())
Return a number uniformly distributed from (0,1)
RooRealVar represents a variable that can be changed from the outside.
virtual void setVal(Double_t value)
Set value of variable to 'value'.
Hypothesis Test Calculator based on the asymptotic formulae for the profile likelihood ratio.
Does a frequentist hypothesis test.
Same purpose as HybridCalculatorOriginal, but different implementation.
Common base class for the Hypothesis Test Calculators.
const ModelConfig * GetNullModel(void) const
const ModelConfig * GetAlternateModel(void) const
TestStatSampler * GetTestStatSampler(void) const
Returns instance of TestStatSampler.
virtual HypoTestResult * GetHypoTest() const
inherited methods from HypoTestCalculator interface
virtual void SetData(RooAbsData &data)
Set the DataSet.
Class to plot a HypoTestInverterResult, the output of the HypoTestInverter calculator.
TGraphErrors * MakePlot(Option_t *opt="")
return a TGraphErrors with the obtained observed p-values resultinf from the scan By default (Option ...
HypoTestInverterResult class holds the array of hypothesis test results and compute a confidence inte...
SamplingDistribution * GetLowerLimitDistribution() const
get expected lower limit distributions implemented using interpolation The size for the sampling dist...
HypoTestResult * GetResult(int index) const
return a pointer to the i^th result object
double fLowerLimitError
interpolation option (linear or spline)
int ArraySize() const
number of entries in the results array
virtual void SetConfidenceLevel(Double_t cl)
set the confidence level for the interval (eg. 0.95 for a 95% Confidence Interval)
std::vector< double > fXValues
number of points used to build expected p-values
void UseCLs(bool on=true)
flag to switch between using CLsb (default) or CLs as confidence level
double GetXValue(int index) const
function to return the value of the parameter of interest for the i^th entry in the results
double GetLastYError() const
TList fExpPValues
list of HypoTestResult for each point
double GetLastYValue() const
SamplingDistribution * GetUpperLimitDistribution() const
get expected upper limit distributions implemented using interpolation
A class for performing a hypothesis test inversion by scanning the hypothesis test results of a HypoT...
virtual void SetData(RooAbsData &)
Set the DataSet ( add to the the workspace if not already there ?)
static void CheckInputModels(const HypoTestCalculatorGeneric &hc, const RooRealVar &scanVar)
check the model given the given hypotestcalculator
static void SetCloseProof(Bool_t flag)
set flag to close proof for every new run
RooRealVar * fScannedVariable
pointer to the generic hypotest calculator used
virtual ~HypoTestInverter()
destructor (delete the HypoTestInverterResult)
static double fgCLAccuracy
std::unique_ptr< HypoTestCalculatorGeneric > fHC
SamplingDistribution * RebuildDistributions(bool isUpper=true, int nToys=100, TList *clsDist=0, TList *clsbDist=0, TList *clbDist=0, const char *outputfile="HypoTestInverterRebuiltDist.root")
rebuild the sampling distributions by generating some toys and find for each of them a new upper limi...
HypoTestInverterResult * fResults
HypoTestInverter()
default constructor (doesn't do anything)
bool SetTestStatistic(TestStatistic &stat)
set the test statistic to use
virtual Double_t ConfidenceLevel() const
Get the Confidence level for the test.
SamplingDistribution * GetUpperLimitDistribution(bool rebuild=false, int nToys=100)
get the distribution of lower limit if rebuild = false (default) it will re-use the results of the sc...
static unsigned int fgNToys
void Clear()
delete contained result and graph
TestStatistic * GetTestStatistic() const
return the test statistic which is or will be used by the class
virtual HypoTestInverterResult * GetInterval() const
Run a fixed scan or the automatic scan depending on the configuration.
static std::string fgAlgo
bool RunLimit(double &limit, double &limitErr, double absTol=0, double relTol=0, const double *hint=0) const
Run an automatic scan until the desired accuracy is reached.
std::unique_ptr< TGraphErrors > fLimitPlot
bool RunFixedScan(int nBins, double xMin, double xMax, bool scanLog=false) const
Run a fixed scan.
bool RunOnePoint(double thisX, bool adaptive=false, double clTarget=-1) const
run only one point at the given POI value
ECalculatorType fCalcType
SamplingDistribution * GetLowerLimitDistribution(bool rebuild=false, int nToys=100)
get the distribution of lower limit if rebuild = false (default) it will re-use the results of the sc...
HypoTestInverter & operator=(const HypoTestInverter &rhs)
assignment operator NOTE: this class does not copy the contained result and the HypoTestCalculator,...
HypoTestCalculatorGeneric * fCalculator0
int fTotalToysRun
plot of limits
static double fgRelAccuracy
void CreateResults() const
create a new HypoTestInverterResult to hold all computed results
static double fgAbsAccuracy
static RooRealVar * GetVariableToScan(const HypoTestCalculatorGeneric &hc)
get the variable to scan try first with null model if not go to alternate model
HypoTestResult * Eval(HypoTestCalculatorGeneric &hc, bool adaptive, double clsTarget) const
Run the Hypothesis test at a previous configured point (internal function called by RunOnePoint)
HypoTestResult is a base class for results from hypothesis tests.
void SetBackgroundAsAlt(Bool_t l=kTRUE)
Double_t CLbError() const
The error on the "confidence level" of the null hypothesis.
Bool_t GetPValueIsRightTail(void) const
Double_t GetTestStatisticData(void) const
virtual void Append(const HypoTestResult *other)
add values from another HypoTestResult
virtual Double_t CLb() const
Convert NullPValue into a "confidence level".
virtual Double_t CLsplusb() const
Convert AlternatePValue into a "confidence level".
virtual Double_t AlternatePValue() const
Return p-value for alternate hypothesis.
virtual Double_t NullPValue() const
Return p-value for null hypothesis.
void SetTestStatisticData(const Double_t tsd)
Double_t CLsplusbError() const
The error on the "confidence level" of the alternative hypothesis.
virtual Double_t CLs() const
is simply (not a method, but a quantity)
SamplingDistribution * GetNullDistribution(void) const
Double_t CLsError() const
The error on the ratio .
SamplingDistribution * GetAltDistribution(void) const
IntervalCalculator is an interface class for a tools which produce RooStats ConfIntervals.
ModelConfig is a simple class that holds configuration information specifying how a model should be u...
const RooArgSet * GetGlobalObservables() const
get RooArgSet for global observables (return NULL if not existing)
const RooArgSet * GetParametersOfInterest() const
get RooArgSet containing the parameter of interest (return NULL if not existing)
const RooArgSet * GetNuisanceParameters() const
get RooArgSet containing the nuisance parameters (return NULL if not existing)
const RooArgSet * GetObservables() const
get RooArgSet for observables (return NULL if not existing)
const RooArgSet * GetSnapshot() const
get RooArgSet for parameters for a particular hypothesis (return NULL if not existing)
RooAbsPdf * GetPdf() const
get model PDF (return NULL if pdf has not been specified or does not exist)
ProfileLikelihoodTestStat is an implementation of the TestStatistic interface that calculates the pro...
static void CloseProof(Option_t *option="s")
close all proof connections
This class simply holds a sampling distribution of some test statistic.
Int_t GetSize() const
size of samples
TestStatSampler is an interface class for a tools which produce RooStats SamplingDistributions.
virtual TestStatistic * GetTestStatistic() const =0
virtual void SetTestStatistic(TestStatistic *testStatistic)=0
TestStatistic is an interface class to provide a facility for construction test statistics distributi...
ToyMCSampler is an implementation of the TestStatSampler interface.
virtual void SetObservables(const RooArgSet &o)
virtual void SetPdf(RooAbsPdf &pdf)
virtual RooAbsData * GenerateToyData(RooArgSet ¶mPoint, RooAbsPdf &pdf) const
virtual void SetGlobalObservables(const RooArgSet &o)
virtual void SetNEventsPerToy(const Int_t nevents)
Forces the generation of exactly n events even for extended PDFs.
virtual void SetNuisanceParameters(const RooArgSet &np)
virtual void SetParametersForTestStat(const RooArgSet &nullpoi)
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual Double_t GetParError(Int_t ipar) const
Return value of parameter number ipar.
virtual void SetRange(Double_t xmin, Double_t xmax)
Initialize the upper and lower bounds to draw the function.
virtual void GetRange(Double_t *xmin, Double_t *xmax) const
Return range of a generic N-D function.
virtual void Draw(Option_t *option="")
Draw this function with its current attributes.
virtual void SetParameter(Int_t param, Double_t value)
virtual void FixParameter(Int_t ipar, Double_t value)
Fix the value of a parameter The specified value will be used in a fit operation.
virtual Double_t GetParameter(Int_t ipar) const
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
void Close(Option_t *option="") override
Close a file.
A TGraphErrors is a TGraph with error bars.
1-D histogram with a double per channel (see TH1 documentation)}
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
virtual void SetBuffer(Int_t buffersize, Option_t *option="")
Set the maximum number of entries to be kept in the buffer.
virtual TLine * DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Draw this line with new coordinates.
virtual void Add(TObject *obj)
virtual TObject * Remove(TObject *obj)
Remove object from the list.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
virtual void SetName(const char *name)
Set the name of the TNamed.
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
virtual const char * GetName() const
Returns name of object.
Mother of all ROOT objects.
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
@ kOverwrite
overwrite existing object with same name
virtual const char * GetName() const
Returns name of object.
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Namespace for the RooStats classes.
void PrintListContent(const RooArgList &l, std::ostream &os=std::cout)
Bool_t AreEqualRel(Double_t af, Double_t bf, Double_t relPrec)
Bool_t AreEqualAbs(Double_t af, Double_t bf, Double_t epsilon)