82template<
class HypoTestType>
85 static void SetToys(HypoTestType *
h,
int toyNull,
int toyAlt) {
h->SetToys(toyNull,toyAlt); }
117 if (!modelSB || ! modelB)
118 oocoutF(
nullptr,InputArguments) <<
"HypoTestInverter - model are not existing" << std::endl;
119 assert(modelSB && modelB);
121 oocoutI(
nullptr,InputArguments) <<
"HypoTestInverter ---- Input models: \n"
122 <<
"\t\t using as S+B (null) model : "
124 <<
"\t\t using as B (alternate) model : "
125 << modelB->
GetName() <<
"\n" << std::endl;
130 if (!bPdf || !bObs) {
131 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - B model has no pdf or observables defined" << std::endl;
134 std::unique_ptr<RooArgSet> bParams{bPdf->
getParameters(*bObs)};
136 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - pdf of B model has no parameters" << std::endl;
139 if (bParams->find(scanVariable.
GetName() ) ) {
141 if (!poiB || !poiB->
find(scanVariable.
GetName()) ||
143 oocoutW(
nullptr, InputArguments)
144 <<
"HypoTestInverter - using a B model with POI " << scanVariable.
GetName() <<
" not equal to zero "
145 <<
" user must check input model configurations " << std::endl;
147 if (poiB)
delete poiB;
199 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
222 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - Type of hypotest calculator is not supported " <<std::endl;
253 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
286 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
319 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
356 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - Cannot guess the variable to scan " << std::endl;
384 if (
this == &rhs)
return *
this;
417 return fCalculator0->GetTestStatSampler()->GetTestStatistic();
429 fCalculator0->GetTestStatSampler()->SetTestStatistic(&stat);
449 TString results_name =
"result_";
452 TString title =
"HypoTestInverter Result For ";
483 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::GetInterval - return an already existing interval " << std::endl;
488 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::GetInterval - run a fixed scan" << std::endl;
491 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::GetInterval - error running a fixed scan " << std::endl;
494 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::GetInterval - run an automatic scan" << std::endl;
499 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::GetInterval - error running an auto scan " << std::endl;
522 if (hcResult ==
nullptr) {
523 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::Eval - HypoTest failed" << std::endl;
553 while (clsMidErr >=
fgCLAccuracy && (clsTarget == -1 || std::abs(clsMid-clsTarget) < 3*clsMidErr) ) {
554 std::unique_ptr<HypoTestResult> more(hc.
GetHypoTest());
559 hcResult->
Append(more.get());
562 if (
fVerbose)
oocoutP(
nullptr,
Eval) << (
fUseCLs ?
"\tCLs = " :
"\tCLsplusb = ") << clsMid <<
" +/- " << clsMidErr << std::endl;
569 "\tCLs = " << hcResult->
CLs() <<
" +/- " << hcResult->
CLsError() <<
"\n" <<
570 "\tCLb = " << hcResult->
CLb() <<
" +/- " << hcResult->
CLbError() <<
"\n" <<
599 fResults->fFittedLowerLimit =
false;
600 fResults->fFittedUpperLimit =
false;
604 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter::RunFixedScan - Please provide nBins>0\n";
607 if ( nBins==1 && xMin!=xMax ) {
608 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter::RunFixedScan - nBins==1 -> I will run for xMin (" << xMin <<
")\n";
610 if ( xMin==xMax && nBins>1 ) {
611 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter::RunFixedScan - xMin==xMax -> I will enforce nBins==1\n";
615 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter::RunFixedScan - Please provide xMin ("
616 << xMin <<
") smaller than xMax (" << xMax <<
")\n";
620 if (xMin < fScannedVariable->getMin()) {
622 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter::RunFixedScan - xMin < lower bound, using xmin = "
623 << xMin << std::endl;
627 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter::RunFixedScan - xMax > upper bound, using xmax = "
628 << xMax << std::endl;
631 if (xMin <= 0. && scanLog) {
632 oocoutE(
nullptr, InputArguments) <<
"HypoTestInverter::RunFixedScan - cannot go in log steps if xMin <= 0" << std::endl;
637 for (
int i=0; i<nBins; i++) {
641 thisX = exp( log(xMin) + i*(log(xMax)-log(xMin))/(nBins-1) );
643 thisX = xMin + i * (xMax - xMin) / (nBins - 1);
650 if ( status==
false ) {
651 oocoutW(
nullptr,
Eval) <<
"HypoTestInverter::RunFixedScan - The hypo test for point " << thisX <<
" failed. Skipping." << std::endl;
667 if ( rVal < fScannedVariable->getMin() ) {
668 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter::RunOnePoint - Out of range: using the lower bound "
670 <<
" on the scanned variable rather than " << rVal<<
"\n";
676 oocoutE(
nullptr, InputArguments) <<
"HypoTestInverter::RunOnePoint - Out of range: using the upper bound "
694 const_cast<ModelConfig*
>(sbModel)->SetSnapshot(poi);
700 std::unique_ptr<HypoTestResult> result(
Eval(*
fCalculator0,adaptive,clTarget) );
707 const double nullPV = result->NullPValue();
708 const double altPV = result->AlternatePValue();
709 if (!std::isfinite(nullPV) || nullPV < 0. || nullPV > 1. || !std::isfinite(altPV) || altPV < 0. || altPV > 1.) {
711 fScannedVariable->getVal() <<
". null p-value=" << nullPV <<
", alternate p-value=" << altPV << std::endl;
717 else lastXtested = -999;
722 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::RunOnePoint - Merge with previous result for "
726 prevResult->
Append(result.get());
730 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::RunOnePoint - replace previous empty result\n";
731 auto oldObj =
fResults->fYObjects.Remove(prevResult);
734 fResults->fYObjects.Add(result.release());
741 fResults->fYObjects.Add(result.release());
769 if ((hint !=
nullptr) && (*hint >
r->getMin())) {
770 r->setMax(std::min<double>(3.0 * (*hint),
r->getMax()));
771 r->setMin(std::max<double>(0.3 * (*hint),
r->getMin()));
772 oocoutI(
nullptr,InputArguments) <<
"HypoTestInverter::RunLimit - Use hint value " << *hint
773 <<
" search in interval " <<
r->getMin() <<
" , " <<
r->getMax() << std::endl;
780 typedef std::pair<double,double> CLs_t;
781 double clsTarget =
fSize;
785 double rMin =
r->getMin();
786 double rMax =
r->getMax();
787 limit = 0.5*(rMax + rMin);
788 limitErr = 0.5*(rMax - rMin);
791 TF1 expoFit(
"expoFit",
"[0]*exp([1]*(x-[2]))", rMin, rMax);
793 fLimitPlot = std::make_unique<TGraphErrors>();
795 if (
fVerbose > 0)
oocoutI(
nullptr,
Eval) <<
"Search for upper limit to the limit" << std::endl;
796 for (
int tries = 0; tries < 6; ++tries) {
798 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Hypotest failed at upper limit of scan range: " << rMax << std::endl;
802 clsMax = std::make_pair(
fResults->GetLastYValue(),
fResults->GetLastYError() );
803 if (clsMax.first == 0 || clsMax.first + 3 * std::abs(clsMax.second) < clsTarget )
break;
806 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Cannot determine upper limit of scan range. At " <<
r->GetName()
807 <<
" = " << rMax <<
" still getting "
808 << (
fUseCLs ?
"CLs" :
"CLsplusb") <<
" = " << clsMax.first << std::endl;
813 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Search for lower limit to the limit" << std::endl;
821 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Hypotest failed at lower limit of scan range: " << rMin << std::endl;
824 clsMin = std::make_pair(
fResults->GetLastYValue(),
fResults->GetLastYError() );
826 if (clsMin.first != 1 && clsMin.first - 3 * std::abs(clsMin.second) < clsTarget) {
832 for (
int tries = 0; tries < 6; ++tries) {
834 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Hypotest failed at lower limit of scan range: " << rMin << std::endl;
835 rMin = rMin == 0. ? 0.1 : rMin * 1.1;
838 clsMin = std::make_pair(
fResults->GetLastYValue(),
fResults->GetLastYError() );
839 if (clsMin.first == 1 || clsMin.first - 3 * std::abs(clsMin.second) > clsTarget)
break;
842 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Cannot determine lower limit of scan range. At " <<
r->GetName()
843 <<
" = " << rMin <<
" still get " << (
fUseCLs ?
"CLs" :
"CLsplusb")
844 <<
" = " << clsMin.first << std::endl;
852 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Now doing proper bracketing & bisection" << std::endl;
857 oocoutW(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - maximum number of toys reached " << std::endl;
863 limit = 0.5*(rMin+rMax); limitErr = 0.5*(rMax-rMin);
864 if (
fgAlgo ==
"logSecant" && clsMax.first != 0) {
865 double logMin = log(clsMin.first);
866 double logMax = log(clsMax.first);
867 double logTarget = log(clsTarget);
868 limit = rMin + (rMax-rMin) * (logTarget - logMin)/(logMax - logMin);
869 if (clsMax.second != 0 && clsMin.second != 0) {
870 limitErr = hypot((logTarget-logMax) * (clsMin.second/clsMin.first), (logTarget-logMin) * (clsMax.second/clsMax.first));
871 limitErr *= (rMax-rMin)/((logMax-logMin)*(logMax-logMin));
874 r->setError(limitErr);
877 if (limitErr < std::max(absAccuracy, relAccuracy * limit)) {
879 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - reached accuracy " << limitErr <<
" below "
880 << std::max(absAccuracy, relAccuracy * limit) << std::endl;
887 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Hypo test failed at x=" << limit <<
" when trying to find limit." << std::endl;
890 clsMid = std::make_pair(
fResults->GetLastYValue(),
fResults->GetLastYError() );
892 if (clsMid.second == -1) {
893 oocoutE(
nullptr,
Eval) <<
"Hypotest failed" << std::endl;
898 if (std::abs(clsMid.first-clsTarget) >= 2*clsMid.second) {
899 if ((clsMid.first>clsTarget) == (clsMax.first>clsTarget)) {
900 rMax = limit; clsMax = clsMid;
902 rMin = limit; clsMin = clsMid;
905 if (
fVerbose > 0)
oocoutI(
nullptr,
Eval) <<
"Trying to move the interval edges closer" << std::endl;
906 double rMinBound = rMin;
907 double rMaxBound = rMax;
909 while (clsMin.second == 0 || std::abs(rMin-limit) > std::max(absAccuracy, relAccuracy * limit)) {
910 rMin = 0.5*(rMin+limit);
912 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Hypo test failed at x=" << rMin <<
" when trying to find limit from below." << std::endl;
915 clsMin = std::make_pair(
fResults->GetLastYValue(),
fResults->GetLastYError() );
916 if (std::abs(clsMin.first-clsTarget) <= 2*clsMin.second)
break;
919 while (clsMax.second == 0 || std::abs(rMax-limit) > std::max(absAccuracy, relAccuracy * limit)) {
920 rMax = 0.5*(rMax+limit);
922 oocoutE(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Hypo test failed at x=" << rMin <<
" when trying to find limit from above." << std::endl;
925 clsMax = std::make_pair(
fResults->GetLastYValue(),
fResults->GetLastYError() );
926 if (std::abs(clsMax.first-clsTarget) <= 2*clsMax.second)
break;
929 expoFit.
SetRange(rMinBound,rMaxBound);
936 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Before fit --- \n";
937 oocoutI(
nullptr,
Eval) <<
"Limit: " <<
r->GetName() <<
" < " << limit <<
" +/- " << limitErr <<
" [" << rMin <<
", " << rMax <<
"]\n";
941 expoFit.
SetParameter(1,log(clsMax.first/clsMin.first)/(rMax-rMin));
945 expoFit.
GetRange(rMinBound, rMaxBound);
946 limitErr = std::max(std::abs(rMinBound-limit), std::abs(rMaxBound-limit));
953 for (
int j = 0; j <
fLimitPlot->GetN(); ++j) {
956 for (
int i = 0, imax = 8; i <= imax; ++i, ++npoints) {
966 if (limitErr < std::max(absAccuracy, relAccuracy * limit))
break;
971 if (!
RunOnePoint(rTry,
true,clsTarget) )
return false;
983 double xmin =
r->getMin();
984 double xmax =
r->getMax();
985 for (
int j = 0; j <
fLimitPlot->GetN(); ++j) {
991 fLimitPlot->GetYaxis()->SetRangeUser(0.5*clsTarget, 1.5*clsTarget);
993 expoFit.
Draw(
"SAME");
997 line.SetLineWidth(1);
line.SetLineStyle(2);
998 line.DrawLine(limit-limitErr, 0, limit-limitErr,
fLimitPlot->GetY()[0]);
999 line.DrawLine(limit+limitErr, 0, limit+limitErr,
fLimitPlot->GetY()[0]);
1003 oocoutI(
nullptr,
Eval) <<
"HypoTestInverter::RunLimit - Result: \n"
1004 <<
"\tLimit: " <<
r->GetName() <<
" < " << limit <<
" +/- " << limitErr <<
" @ " << (1-
fSize) * 100 <<
"% CL\n";
1009 fResults->fUpperLimitError = limitErr;
1010 fResults->fFittedUpperLimit =
true;
1014 fResults->fFittedLowerLimit =
true;
1029 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter::GetLowerLimitDistribution(false) - result not existing\n";
1032 return fResults->GetLowerLimitDistribution();
1035 TList * clsDist =
nullptr;
1036 TList * clsbDist =
nullptr;
1038 else clsbDist = &
fResults->fExpPValues;
1056 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter::GetUpperLimitDistribution(false) - result not existing\n";
1059 return fResults->GetUpperLimitDistribution();
1062 TList * clsDist =
nullptr;
1063 TList * clsbDist =
nullptr;
1065 else clsbDist = &
fResults->fExpPValues;
1091 if (!bModel || ! sbModel)
return nullptr;
1098 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter::RebuildDistribution - background snapshot not existing"
1099 <<
" assume is for POI = 0" << std::endl;
1104 paramPoint.
assign(*poibkg);
1108 if (!toymcSampler) {
1109 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter::RebuildDistribution - no toy MC sampler existing" << std::endl;
1127 bool storePValues = clsDist || clsbDist || clbDist;
1128 if (
fNBins <=0 && storePValues) {
1129 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter::RebuildDistribution - cannot return p values distribution with the auto scan" << std::endl;
1130 storePValues =
false;
1137 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - result is not existing and number of point to scan is not set"
1143 if (nToys <= 0) nToys = 100;
1145 std::vector<std::vector<double> > CLs_values(nPoints);
1146 std::vector<std::vector<double> > CLsb_values(nPoints);
1147 std::vector<std::vector<double> > CLb_values(nPoints);
1150 for (
int i = 0; i < nPoints; ++i) {
1151 CLs_values[i].reserve(nToys);
1152 CLb_values[i].reserve(nToys);
1153 CLsb_values[i].reserve(nToys);
1157 std::vector<double> limit_values; limit_values.reserve(nToys);
1159 oocoutI(
nullptr,InputArguments) <<
"HypoTestInverter - rebuilding the p value distributions by generating ntoys = "
1160 << nToys << std::endl;
1163 oocoutI(
nullptr,InputArguments) <<
"Rebuilding using parameter of interest point: ";
1166 oocoutI(
nullptr,InputArguments) <<
"And using nuisance parameters: ";
1170 assert(bModel->
GetPdf() );
1174 allParams->snapshot(saveParams);
1176 std::unique_ptr<TFile> fileOut{
TFile::Open(outputfile,
"RECREATE")};
1178 oocoutE(
nullptr,InputArguments) <<
"HypoTestInverter - RebuildDistributions - Error opening file " << outputfile
1179 <<
" - the resulting limits will not be stored" << std::endl;
1182 TH1D * hL =
new TH1D(
"lowerLimitDist",
"Rebuilt lower limit distribution",100,1.,0.);
1183 TH1D * hU =
new TH1D(
"upperLimitDist",
"Rebuilt upper limit distribution",100,1.,0.);
1184 TH1D * hN =
new TH1D(
"nObs",
"Observed events",100,1.,0.);
1187 std::vector<TH1*> hCLb;
1188 std::vector<TH1*> hCLsb;
1189 std::vector<TH1*> hCLs;
1191 for (
int i = 0; i < nPoints; ++i) {
1192 hCLb.push_back(
new TH1D(
TString::Format(
"CLbDist_bin%d",i),
"CLb distribution",100,1.,0.));
1193 hCLs.push_back(
new TH1D(
TString::Format(
"ClsDist_bin%d",i),
"CLs distribution",100,1.,0.));
1194 hCLsb.push_back(
new TH1D(
TString::Format(
"CLsbDist_bin%d",i),
"CLs+b distribution",100,1.,0.));
1200 for (
int itoy = 0; itoy < nToys; ++itoy) {
1202 oocoutP(
nullptr,
Eval) <<
"\nHypoTestInverter - RebuildDistributions - running toy # " << itoy <<
" / "
1203 << nToys << std::endl;
1206 oocoutI(
nullptr,
Eval) <<
"\n\nsnapshot of s+b model \n";
1211 allParams->assign(saveParams);
1224 oocoutP(
nullptr,Generation) <<
"Generate observables are : ";
1228 for (std::size_t i = 0; i < genObs.
size(); ++i) {
1230 if (
x) nObs +=
x->getVal();
1245 if (
r ==
nullptr)
continue;
1247 double value = (isUpper) ?
r->UpperLimit() :
r->LowerLimit();
1248 limit_values.push_back( value );
1249 hU->
Fill(
r->UpperLimit() );
1250 hL->
Fill(
r->LowerLimit() );
1253 oocoutI(
nullptr,
Eval) <<
"The computed upper limit for toy #" << itoy <<
" is " << value << std::endl;
1256 if (itoy%10 == 0 || itoy == nToys-1) {
1262 if (!storePValues)
continue;
1264 if (nPoints < r->ArraySize()) {
1265 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter: skip extra points" << std::endl;
1267 else if (nPoints >
r->ArraySize()) {
1268 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter: missing some points" << std::endl;
1272 for (
int ipoint = 0; ipoint < nPoints; ++ipoint) {
1275 CLs_values[ipoint].push_back( hr->
CLs() );
1276 CLsb_values[ipoint].push_back( hr->
CLsplusb() );
1277 CLb_values[ipoint].push_back( hr->
CLb() );
1278 hCLs[ipoint]->Fill( hr->
CLs() );
1279 hCLb[ipoint]->Fill( hr->
CLb() );
1280 hCLsb[ipoint]->Fill( hr->
CLsplusb() );
1283 oocoutW(
nullptr,InputArguments) <<
"HypoTestInverter: missing result for point: x = "
1284 <<
fResults->GetXValue(ipoint) << std::endl;
1288 if (itoy%10 == 0 || itoy == nToys-1) {
1289 for (
int ipoint = 0; ipoint < nPoints; ++ipoint) {
1303 if (clsDist) clsDist->
SetOwner(
true);
1304 if (clbDist) clbDist->
SetOwner(
true);
1305 if (clsbDist) clsbDist->
SetOwner(
true);
1307 oocoutI(
nullptr,InputArguments) <<
"HypoTestInverter: storing rebuilt p values " << std::endl;
1309 for (
int ipoint = 0; ipoint < nPoints; ++ipoint) {
1329 for (
int i = 0; i < nPoints && storePValues; ++i) {
1336 const char * disName = (isUpper) ?
"upperLimit_dist" :
"lowerLimit_dist";
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
RooFit::OwningPtr< 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...
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree).
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
Storage_t::size_type size() const
RooAbsArg * first() const
RooAbsArg * find(const char *name) const
Find object with given name in list.
void Print(Option_t *options=nullptr) const override
This method must be overridden when a class wants to print itself.
Abstract base class for binned and unbinned datasets.
virtual double sumEntries() const =0
Return effective number of entries in dataset, i.e., sum all weights.
virtual const RooArgSet * get() const
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
Abstract interface for all probability density functions.
bool canBeExtended() const
If true, PDF can provide extended likelihood term.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
static double uniform(TRandom *generator=randomGenerator())
Return a number uniformly distributed from (0,1).
Variable that can be changed from the outside.
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
HypoTestResult * GetHypoTest() const override
inherited methods from HypoTestCalculator interface
const ModelConfig * GetAlternateModel(void) const
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...
static void CheckInputModels(const HypoTestCalculatorGeneric &hc, const RooRealVar &scanVar)
check the model given the given hypotestcalculator
RooRealVar * fScannedVariable
pointer to the constrained variable
static double fgCLAccuracy
std::unique_ptr< HypoTestCalculatorGeneric > fHC
! pointer to the generic hypotest calculator used
bool RunLimit(double &limit, double &limitErr, double absTol=0, double relTol=0, const double *hint=nullptr) const
Run an automatic scan until the desired accuracy is reached.
void SetData(RooAbsData &) override
Set the DataSet ( add to the workspace if not already there ?).
HypoTestInverterResult * fResults
pointer to the result
SamplingDistribution * RebuildDistributions(bool isUpper=true, int nToys=100, TList *clsDist=nullptr, TList *clsbDist=nullptr, TList *clbDist=nullptr, const char *outputfile="HypoTestInverterRebuiltDist.root")
function to rebuild the distributions
int fMaxToys
maximum number of toys to run
HypoTestInverter()
default constructor (used only for I/O)
~HypoTestInverter() override
destructor
double ConfidenceLevel() const override
Get the Confidence level for the test.
bool SetTestStatistic(TestStatistic &stat)
set the test statistic
HypoTestInverterResult * GetInterval() const override
Run a fixed scan or the automatic scan depending on the configuration.
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
get the test statistic
static std::string fgAlgo
std::unique_ptr< TGraphErrors > fLimitPlot
! plot of limits
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 upper/lower limit distribution
HypoTestInverter & operator=(const HypoTestInverter &rhs)
assignment
HypoTestCalculatorGeneric * fCalculator0
pointer to the calculator passed in the constructor
static double fgRelAccuracy
void CreateResults() const
create a new HypoTestInverterResult to hold all computed results
static double fgAbsAccuracy
static RooRealVar * GetVariableToScan(const HypoTestCalculatorGeneric &hc)
helper functions
HypoTestResult * Eval(HypoTestCalculatorGeneric &hc, bool adaptive, double clsTarget) const
run the hybrid at a single point
HypoTestResult is a base class for results from hypothesis tests.
virtual double CLsplusb() const
Convert AlternatePValue into a "confidence level".
double GetTestStatisticData(void) const
virtual void Append(const HypoTestResult *other)
add values from another HypoTestResult
double CLsError() const
The error on the ratio .
void SetBackgroundAsAlt(bool l=true)
bool GetPValueIsRightTail(void) const
double CLbError() const
The error on the "confidence level" of the null hypothesis.
void SetTestStatisticData(const double tsd)
double CLsplusbError() const
The error on the "confidence level" of the alternative hypothesis.
SamplingDistribution * GetNullDistribution(void) const
virtual double CLs() const
is simply (not a method, but a quantity)
virtual double CLb() const
Convert NullPValue into a "confidence level".
SamplingDistribution * GetAltDistribution(void) const
IntervalCalculator is an interface class for a tools which produce RooStats ConfIntervals.
< A class that holds configuration information for a model using a workspace as a store
const RooArgSet * GetGlobalObservables() const
get RooArgSet for global observables (return nullptr if not existing)
const RooArgSet * GetParametersOfInterest() const
get RooArgSet containing the parameter of interest (return nullptr if not existing)
const RooArgSet * GetNuisanceParameters() const
get RooArgSet containing the nuisance parameters (return nullptr if not existing)
const RooArgSet * GetObservables() const
get RooArgSet for observables (return nullptr if not existing)
const RooArgSet * GetSnapshot() const
get RooArgSet for parameters for a particular hypothesis (return nullptr if not existing)
RooAbsPdf * GetPdf() const
get model PDF (return nullptr if pdf has not been specified or does not exist)
ProfileLikelihoodTestStat is an implementation of the TestStatistic interface that calculates the pro...
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
Get the TestStatistic.
TestStatistic is an interface class to provide a facility for construction test statistics distributi...
ToyMCSampler is an implementation of the TestStatSampler interface.
void SetParametersForTestStat(const RooArgSet &nullpoi) override
Set the Pdf, add to the workspace if not already there.
void SetObservables(const RooArgSet &o) override
specify the observables in the dataset (needed to evaluate the test statistic)
virtual RooAbsData * GenerateToyData(RooArgSet ¶mPoint, RooAbsPdf &pdf) const
generates toy data without weight
void SetNuisanceParameters(const RooArgSet &np) override
specify the nuisance parameters (eg. the rest of the parameters)
void SetPdf(RooAbsPdf &pdf) override
Set the Pdf, add to the workspace if not already there.
void SetGlobalObservables(const RooArgSet &o) override
specify the conditional observables
virtual void SetNEventsPerToy(const Int_t nevents)
Forces the generation of exactly n events even for extended PDFs.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual void GetRange(Double_t *xmin, Double_t *xmax) const
virtual void SetRange(Double_t xmin, Double_t xmax)
void Draw(Option_t *option="") override
Default Draw method for all objects.
virtual Double_t GetParError(Int_t ipar) const
virtual void FixParameter(Int_t ipar, Double_t value)
virtual void SetParameter(Int_t param, Double_t value)
virtual Double_t GetParameter(Int_t ipar) const
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.
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 bufsize, Option_t *option="")
Set the maximum number of entries to be kept in the buffer.
Use the TLine constructor to create a simple line.
void Add(TObject *obj) override
const char * GetName() const override
Returns name of object.
virtual void SetName(const char *name)
Set the name of the TNamed.
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
@ kOverwrite
overwrite existing object with same name
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)
useful function to print in one line the content of a set with their values
Bool_t AreEqualRel(Double_t af, Double_t bf, Double_t relPrec)
Comparing floating points.
Bool_t AreEqualAbs(Double_t af, Double_t bf, Double_t epsilon)
Comparing floating points.
static void SetToys(HypoTestType *h, int toyNull, int toyAlt)