79 std::vector<double> out(numBins);
81 for (
int i = 0; i < numBins; ++i) {
93using std::string, std::vector;
107 fSystToFix( measurement.GetConstantParams() ),
108 fParamValues( measurement.GetParamValues() ),
109 fNomLumi( measurement.GetLumi() ),
110 fLumiError( measurement.GetLumi()*measurement.GetLumiRelErr() ),
111 fLowBin( measurement.GetBinLow() ),
112 fHighBin( measurement.GetBinHigh() ),
128 if( proto_config ==
nullptr ) {
129 cxcoutFHF <<
"Error: Did not find 'ModelConfig' object in file: " << ws_single->
GetName() << std::endl;
133 if( measurement.GetPOIList().empty() ) {
134 cxcoutWHF <<
"No Parametetrs of interest are set" << std::endl;
138 std::stringstream sstream;
139 sstream <<
"Setting Parameter(s) of Interest as: ";
140 for(
auto const& item : measurement.GetPOIList()) {
141 sstream << item <<
" ";
146 for(
auto const& poi_name : measurement.GetPOIList()) {
151 cxcoutWHF <<
"WARNING: Can't find parameter of interest: " << poi_name
152 <<
" in Workspace. Not setting in ModelConfig." << std::endl;
156 proto_config->SetParametersOfInterest(params);
159 std::string NewModelName =
"newSimPdf";
165 RooAbsPdf* pdf = ws_single->pdf(NewModelName);
166 if( !pdf ) pdf = ws_single->pdf( ModelName );
167 const RooArgSet* observables = ws_single->set(
"observables");
170 if(!measurement.GetPOIList().empty()){
178 std::string SnapShotName =
"NominalParamValues";
179 ws_single->saveSnapshot(SnapShotName, ws_single->allVars());
181 for(
unsigned int i=0; i<measurement.GetAsimovDatasets().size(); ++i) {
185 std::string AsimovName = asimov.
GetName();
187 cxcoutPHF <<
"Generating additional Asimov Dataset: " << AsimovName << std::endl;
191 cxcoutPHF <<
"Importing Asimov dataset" << std::endl;
192 bool failure = ws_single->import(*asimov_dataset,
RooFit::Rename(AsimovName.c_str()));
194 cxcoutFHF <<
"Error: Failed to import Asimov dataset: " << AsimovName << std::endl;
200 ws_single->loadSnapshot(SnapShotName.c_str());
221 string ch_name = channel.
GetName();
225 if( ws_single ==
nullptr ) {
226 cxcoutFHF <<
"Error: Failed to make Single-Channel workspace for channel: " << ch_name
227 <<
" and measurement: " << measurement.GetName() << std::endl;
274 std::vector<std::unique_ptr<RooWorkspace>> channel_workspaces;
275 std::vector<std::string> channel_names;
279 if( ! channel.CheckHistograms() ) {
280 cxcoutFHF <<
"MakeModelAndMeasurementsFast: Channel: " << channel.GetName()
281 <<
" has uninitialized histogram pointers" << std::endl;
285 string ch_name = channel.GetName();
286 channel_names.push_back(ch_name);
289 channel_workspaces.emplace_back(histFactory.MakeSingleChannelModel(measurement, channel));
295 std::unique_ptr<RooWorkspace> ws{histFactory.MakeCombinedModel( channel_names, channel_workspaces )};
308template <
class Arg_t,
typename... Args_t>
311 Arg_t arg{
name.c_str(),
name.c_str(), std::forward<Args_t>(args)...};
313 return *
dynamic_cast<Arg_t *
>(ws.
arg(
name));
332std::pair<bool, std::string> isChannelDataConsistent(std::vector<std::unique_ptr<RooWorkspace>>
const &chs,
333 std::vector<std::string>
const &ch_names,
334 std::set<std::string>
const &allowedInconsistent)
337 std::set<std::string> referenceDataNames;
339 referenceDataNames.insert(
data->GetName());
343 for (std::size_t i = 1; i < chs.size(); ++i) {
344 std::set<std::string> thisDataNames;
346 thisDataNames.insert(
data->GetName());
350 std::vector<std::string> missing;
351 std::vector<std::string> extra;
352 std::set_difference(referenceDataNames.begin(), referenceDataNames.end(), thisDataNames.begin(),
353 thisDataNames.end(), std::back_inserter(missing));
354 std::set_difference(thisDataNames.begin(), thisDataNames.end(), referenceDataNames.begin(),
355 referenceDataNames.end(), std::back_inserter(extra));
358 auto isAllowed = [&](std::string
const &
name) {
return allowedInconsistent.count(
name) != 0; };
360 missing.erase(std::remove_if(missing.begin(), missing.end(), isAllowed), missing.end());
361 extra.erase(std::remove_if(extra.begin(), extra.end(), isAllowed), extra.end());
363 if (!missing.empty() || !extra.empty()) {
364 std::stringstream errMsg;
365 errMsg <<
"ERROR: Inconsistent datasets across channel workspaces.\n"
366 <<
"Workspace for channel \"" << ch_names[i] <<
"\" does not match "
367 <<
"the datasets in channel \"" << ch_names[0] <<
"\".\n";
369 if (!missing.empty()) {
370 errMsg <<
" Missing datasets:\n";
371 for (
const auto &
name : missing) {
372 errMsg <<
" - " <<
name <<
"\n";
376 if (!extra.empty()) {
377 errMsg <<
" Extra datasets:\n";
378 for (
const auto &
name : extra) {
379 errMsg <<
" - " <<
name <<
"\n";
383 errMsg <<
"All channel workspaces must contain exactly the same datasets.\n";
384 return {
false, errMsg.str()};
396 for (
unsigned int idx=0; idx <
fObsNameVec.size(); ++idx) {
420 cxcoutI(HistFactory) <<
"processing hist " << hist->
GetName() << std::endl;
422 cxcoutF(HistFactory) <<
"hist is empty" << std::endl;
428 unsigned int histndim(1);
429 std::string classname = hist->
ClassName();
430 if (classname.find(
"TH1")==0) { histndim=1; }
431 else if (classname.find(
"TH2")==0) { histndim=2; }
432 else if (classname.find(
"TH3")==0) { histndim=3; }
435 prefix +=
"_Hist_alphanominal";
437 RooDataHist histDHist(prefix +
"DHist",
"",observables,hist);
439 return &emplace<RooHistFunc>(proto, prefix, observables,histDHist,0);
445 std::vector<std::string> & constraintTermNames) {
446 std::string paramName = param.
GetName();
447 std::string nomName =
"nom_" + paramName;
448 std::string constraintName = paramName +
"Constraint";
451 if(proto.pdf(constraintName))
return;
455 const double gaussSigma = isUniform ? 100. : 1.0;
457 cxcoutIHF <<
"Added a uniform constraint for " << paramName <<
" as a Gaussian constraint with a very large sigma " << std::endl;
460 constraintTermNames.emplace_back(constraintName);
462 RooRealVar &nomParam = emplace<RooRealVar>(proto, nomName, 0., -10., 10.);
463 nomParam.setConstant();
464 emplace<RooGaussian>(proto, constraintName, paramVar, nomParam, gaussSigma);
465 paramVar.setError(gaussSigma);
466 const_cast<RooArgSet*
>(proto.set(
"globalObservables"))->add(nomParam);
473 for(
auto const& histoSys : histoSysList) {
474 params.add(getOrCreate<RooRealVar>(proto,
"alpha_" + histoSys.GetName(),
alphaLow,
alphaHigh));
484 RooWorkspace& proto,
const std::vector<HistoSys>& histoSysList,
485 const string& prefix,
490 std::vector<double> low;
491 std::vector<double> high;
494 for(
unsigned int j=0; j<histoSysList.size(); ++j){
495 std::string str = prefix +
"_" + std::to_string(j);
497 const HistoSys& histoSys = histoSysList.at(j);
498 auto lowDHist = std::make_unique<RooDataHist>(str+
"lowDHist",
"",obsList, histoSys.GetHistoLow());
499 auto highDHist = std::make_unique<RooDataHist>(str+
"highDHist",
"",obsList, histoSys.GetHistoHigh());
500 lowSet.addOwned(std::make_unique<RooHistFunc>((str+
"low").c_str(),
"",obsList,std::move(lowDHist),0));
501 highSet.addOwned(std::make_unique<RooHistFunc>((str+
"high").c_str(),
"",obsList,std::move(highDHist),0));
506 interp.setPositiveDefinite();
507 interp.setAllInterpCodes(4);
510 interp.setBinIntegrator(obsSet);
511 interp.forceNumInt();
515 return proto.arg(prefix);
523 std::vector<string> prodNames;
525 vector<NormFactor> normList = sample.GetNormFactorList();
526 vector<string> normFactorNames;
527 vector<string> rangeNames;
529 string overallNorm_times_sigmaEpsilon = sample.GetName() +
"_" + channel +
"_scaleFactors";
530 auto sigEps = proto.arg(sigmaEpsilon);
532 auto normFactor = std::make_unique<RooProduct>(overallNorm_times_sigmaEpsilon.c_str(), overallNorm_times_sigmaEpsilon.c_str(),
RooArgList(*sigEps));
534 if(!normList.empty()){
537 string varname = norm.GetName();
539 varname +=
"_" + channel;
545 std::stringstream range;
546 range <<
"[" << norm.GetVal() <<
"," << norm.GetLow() <<
"," << norm.GetHigh() <<
"]";
548 if( proto.obj(varname) ==
nullptr) {
549 cxcoutI(HistFactory) <<
"making normFactor: " << norm.GetName() << std::endl;
551 emplace<RooRealVar>(proto, varname, norm.GetVal(), norm.GetLow(), norm.GetHigh());
552 proto.var(varname)->setError(0);
555 prodNames.push_back(varname);
556 rangeNames.push_back(range.str());
557 normFactorNames.push_back(varname);
561 for (
const auto&
name : prodNames) {
562 auto arg = proto.arg(
name);
564 normFactor->addTerm(arg);
569 unsigned int rangeIndex=0;
570 for( vector<string>::iterator nit = normFactorNames.begin(); nit!=normFactorNames.end(); ++nit){
571 if( count (normFactorNames.begin(), normFactorNames.end(), *nit) > 1 ){
572 cxcoutI(HistFactory) <<
"<NormFactor Name =\""<<*nit<<
"\"> is duplicated for <Sample Name=\""
573 << sample.GetName() <<
"\">, but only one factor will be included. \n Instead, define something like"
574 <<
"\n\t<Function Name=\""<<*nit<<
"Squared\" Expression=\""<<*nit<<
"*"<<*nit<<
"\" Var=\""<<*nit<<rangeNames.at(rangeIndex)
575 <<
"\"> \nin your top-level XML's <Measurement> entry and use <NormFactor Name=\""<<*nit<<
"Squared\" in your channel XML file."<< std::endl;
585 std::vector<OverallSys>& systList,
586 vector<string>& constraintTermNames,
587 vector<string>& totSystTermNames) {
590 totSystTermNames.push_back(prefix);
593 vector<double> lowVec;
594 vector<double> highVec;
596 std::map<std::string, double>::iterator itconstr;
597 for(
unsigned int i = 0; i < systList.size(); ++i) {
600 std::string strname = sys.
GetName();
601 const char *
name = strname.c_str();
604 if (meas.GetNoSyst().count(sys.GetName()) > 0 ) {
605 cxcoutI(HistFactory) <<
"HistoToWorkspaceFast::AddConstraintTerm - skip systematic " << sys.GetName() << std::endl;
609 if (meas.GetGammaSyst().count(sys.GetName()) > 0 ) {
610 double relerr = meas.GetGammaSyst().find(sys.GetName() )->second;
612 cxcoutI(HistFactory) <<
"HistoToWorkspaceFast::AddConstraintTerm - zero uncertainty assigned - skip systematic " << sys.GetName() << std::endl;
615 const double tauVal = 1./(relerr*relerr);
616 const double sqtau = 1./relerr;
617 RooRealVar &beta = emplace<RooRealVar>(proto,
"beta_" + strname, 1., 0., 10.);
619 RooRealVar &yvar = emplace<RooRealVar>(proto,
"nom_" + std::string{beta.GetName()}, tauVal, 0., 10.);
621 RooRealVar &theta = emplace<RooRealVar>(proto,
"theta_" + strname, 1./tauVal);
623 RooPolyVar &alphaOfBeta = emplace<RooPolyVar>(proto,
"alphaOfBeta_" + strname, beta,
RooArgList{-sqtau, sqtau});
627 RooAddition &kappa = emplace<RooAddition>(proto,
"k_" + std::string{yvar.GetName()},
RooArgList{yvar, 1.0});
628 RooGamma &gamma = emplace<RooGamma>(proto, std::string{beta.GetName()} +
"Constraint", beta, kappa, theta,
RooFit::RooConst(0.0));
630 alphaOfBeta.Print(
"t");
633 constraintTermNames.push_back(gamma.GetName());
635 yvar.setConstant(
true);
636 const_cast<RooArgSet*
>(proto.set(
"globalObservables"))->add(yvar);
639 params.
add(alphaOfBeta);
640 cxcoutI(HistFactory) <<
"Added a gamma constraint for " <<
name << std::endl;
646 const bool isUniform = meas.GetUniformSyst().count(sys.GetName()) > 0;
647 makeGaussianConstraint(alpha, proto, isUniform, constraintTermNames);
650 if (meas.GetLogNormSyst().count(sys.GetName()) == 0 && meas.GetGammaSyst().count(sys.GetName()) == 0 ) {
655 if (meas.GetLogNormSyst().count(sys.GetName()) > 0 ) {
657 const double relerr = meas.GetLogNormSyst().find(sys.GetName() )->second;
660 proto,
"alphaOfBeta_" + sys.GetName(),
"x[0]*(pow(x[1],x[2])-1.)",
661 RooArgList{emplace<RooRealVar>(proto,
"tau_" + sys.GetName(), 1. / relerr),
662 emplace<RooRealVar>(proto,
"kappa_" + sys.GetName(), 1. + relerr), alpha});
664 cxcoutI(HistFactory) <<
"Added a log-normal constraint for " <<
name << std::endl;
666 alphaOfBeta.Print(
"t");
668 params.
add(alphaOfBeta);
673 lowVec.push_back(sys.GetLow());
674 highVec.push_back(sys.GetHigh());
678 if(!systList.empty()){
682 assert(!params.
empty());
683 assert(lowVec.size() == params.
size());
685 FlexibleInterpVar interp( (interpName).c_str(),
"", params, 1., lowVec, highVec);
686 interp.setAllInterpCodes(5);
688 proto.import(interp);
692 emplace<RooConstVar>(proto, interpName, 1.);
698 const vector<RooProduct*>& sampleScaleFactors, std::vector<vector<RooAbsArg*>>& sampleHistFuncs)
const {
699 assert(sampleScaleFactors.size() == sampleHistFuncs.size());
704 throw std::logic_error(
"HistFactory didn't process the observables correctly. Please file a bug report.");
706 auto firstHistFunc =
dynamic_cast<const RooHistFunc*
>(sampleHistFuncs.front().front());
707 if (!firstHistFunc) {
709 firstHistFunc =
dynamic_cast<const RooHistFunc*
>(piecewiseInt->nominalHist());
711 assert(firstHistFunc);
714 auto &binWidth = emplace<RooBinWidthFunction>(proto, totName +
"_binWidth", *firstHistFunc,
true);
719 for (
unsigned int i=0; i < sampleHistFuncs.size(); ++i) {
720 assert(!sampleHistFuncs[i].empty());
721 coefList.
add(*sampleScaleFactors[i]);
723 std::vector<RooAbsArg*>& thisSampleHistFuncs = sampleHistFuncs[i];
724 thisSampleHistFuncs.push_back(&binWidth);
726 if (thisSampleHistFuncs.size() == 1) {
728 shapeList.add(*thisSampleHistFuncs.front());
731 std::string
name = thisSampleHistFuncs.front()->GetName();
732 auto pos =
name.find(
"Hist_alpha");
733 if (pos != std::string::npos) {
734 name =
name.substr(0, pos) +
"shapes";
735 }
else if ( (pos =
name.find(
"nominal")) != std::string::npos) {
736 name =
name.substr(0, pos) +
"shapes";
739 RooProduct shapeProduct(
name.c_str(), thisSampleHistFuncs.front()->GetTitle(),
RooArgSet(thisSampleHistFuncs.begin(), thisSampleHistFuncs.end()));
741 shapeList.add(*proto.function(
name));
746 RooRealSumPdf tot(totName.c_str(), totName.c_str(), shapeList, coefList,
true);
747 tot.specialIntegratorConfig(
true)->method1D().setLabel(
"RooBinIntegrator") ;
748 tot.specialIntegratorConfig(
true)->method2D().setLabel(
"RooBinIntegrator") ;
749 tot.specialIntegratorConfig(
true)->methodND().setLabel(
"RooBinIntegrator") ;
753 tot.setAttribute(
"GenerateBinned");
756 if(
fCfg.binnedFitOptimization) {
757 tot.setAttribute(
"BinnedLikelihood");
770 for (
auto const *myargi : static_range_cast<RooRealVar *>(*params)) {
771 if (myargi->isConstant())
773 covFile <<
" & " << myargi->GetName();
775 covFile <<
"\\\\ \\hline \n";
776 for (
auto const *myargi : static_range_cast<RooRealVar *>(*params)) {
777 if(myargi->isConstant())
continue;
778 covFile << myargi->GetName();
779 for (
auto const *myargj : static_range_cast<RooRealVar *>(*params)) {
780 if(myargj->isConstant())
continue;
781 std::cout << myargi->GetName() <<
"," << myargj->GetName();
782 double corr =
result->correlation(*myargi, *myargj);
783 covFile <<
" & " << std::fixed << std::setprecision(2) << corr;
785 std::cout << std::endl;
786 covFile <<
" \\\\\n";
799 Error(
"MakeSingleChannelWorkspace",
800 "The input Channel does not contain any sample - return a nullptr");
804 const TH1* channel_hist_template = channel.
GetSamples().front().GetHisto();
805 if (channel_hist_template ==
nullptr) {
807 channel_hist_template = channel.
GetSamples().front().GetHisto();
809 if (channel_hist_template ==
nullptr) {
810 std::ostringstream stream;
811 stream <<
"The sample " << channel.
GetSamples().front().GetName()
812 <<
" in channel " << channel.
GetName() <<
" does not contain a histogram. This is the channel:\n";
813 channel.
Print(stream);
814 Error(
"MakeSingleChannelWorkspace",
"%s", stream.str().c_str());
820 <<
" has uninitialized histogram pointers" << std::endl;
827 vector<string> systToFix = measurement.GetConstantParams();
831 string channel_name = channel.
GetName();
841 for (
unsigned int idx=0; idx<
fObsNameVec.size(); ++idx ) {
851 throw hf_exc(
"HistFactory is limited to 1- to 3-dimensional histograms.");
854 cxcoutP(HistFactory) <<
"\n-----------------------------------------\n"
855 <<
"\tStarting to process '"
856 << channel_name <<
"' channel with " <<
fObsNameVec.size() <<
" observables"
857 <<
"\n-----------------------------------------\n" << std::endl;
862 auto protoOwner = std::make_unique<RooWorkspace>(channel_name.c_str(), (channel_name+
" workspace").c_str());
864 auto proto_config = std::make_unique<ModelConfig>(
"ModelConfig", &proto);
868 cxcoutI(HistFactory) <<
"will preprocess this line: " << func << std::endl;
873 RooArgSet likelihoodTerms(
"likelihoodTerms");
874 RooArgSet constraintTerms(
"constraintTerms");
875 vector<string> likelihoodTermNames;
876 vector<string> constraintTermNames;
877 vector<string> totSystTermNames;
879 std::vector<std::vector<RooAbsArg*>> allSampleHistFuncs;
880 std::vector<RooProduct*> sampleScaleFactors;
882 std::vector<std::pair<string, string>> statNamePairs;
883 std::vector<std::pair<const TH1 *, std::unique_ptr<TH1>>> statHistPairs;
884 const std::string statFuncName =
"mc_stat_" + channel_name;
892 auto &lumiVar = getOrCreate<RooRealVar>(proto,
"Lumi",
fNomLumi, 0.0, 10 *
fNomLumi);
897 emplace<RooGaussian>(proto,
"lumiConstraint", lumiVar, nominalLumiVar,
fLumiError);
899 proto.var(
"nominalLumi")->setConstant();
900 proto.defineSet(
"globalObservables",
"nominalLumi");
902 constraintTermNames.push_back(
"lumiConstraint");
904 proto.var(
"Lumi")->setConstant();
905 proto.defineSet(
"globalObservables",
RooArgSet());
912 string overallSystName = sample.GetName() +
"_" + channel_name +
"_epsilon";
914 string systSourcePrefix =
"alpha_";
919 sample.GetOverallSysList(), constraintTermNames , totSystTermNames);
921 allSampleHistFuncs.emplace_back();
922 std::vector<RooAbsArg*>& sampleHistFuncs = allSampleHistFuncs.back();
925 auto normFactors =
CreateNormFactor(proto, channel_name, overallSystName, sample, doRatio);
935 const TH1* nominal = sample.GetHisto();
947 string expPrefix = sample.
GetName() +
"_" + channel_name;
951 assert(nominalHistFunc);
953 if(sample.GetHistoSysList().empty()) {
955 cxcoutI(HistFactory) << sample.GetName() +
"_" + channel_name +
" has no variation histograms " << std::endl;
957 sampleHistFuncs.push_back(nominalHistFunc);
961 string constraintPrefix = sample.GetName() +
"_" + channel_name +
"_Hist_alpha";
964 RooArgList interpParams = makeInterpolationParameters(sample.GetHistoSysList(), proto);
967 for(std::size_t i = 0; i < interpParams.size(); ++i) {
968 bool isUniform = measurement.GetUniformSyst().count(sample.GetHistoSysList()[i].GetName()) > 0;
969 makeGaussianConstraint(interpParams[i], proto, isUniform, constraintTermNames);
973 sampleHistFuncs.push_back( makeLinInterp(interpParams, nominalHistFunc, proto,
974 sample.GetHistoSysList(), constraintPrefix, observables) );
977 sampleHistFuncs.front()->SetTitle( (nominal && strlen(nominal->
GetTitle())>0) ? nominal->
GetTitle() : sample.GetName().c_str() );
983 if( sample.GetStatError().GetActivate() ) {
986 cxcoutFHF <<
"Cannot include Stat Error for histograms of more than 3 dimensions." << std::endl;
994 cxcoutI(HistFactory) <<
"Sample: " << sample.GetName() <<
" to be included in Stat Error "
995 <<
"for channel " << channel_name
998 string UncertName = sample.GetName() +
"_" + channel_name +
"_StatAbsolUncert";
999 std::unique_ptr<TH1> statErrorHist;
1001 if( sample.GetStatError().GetErrorHist() ==
nullptr ) {
1003 cxcoutI(HistFactory) <<
"Making Statistical Uncertainty Hist for "
1004 <<
" Channel: " << channel_name
1005 <<
" Sample: " << sample.GetName()
1012 statErrorHist.reset(
static_cast<TH1*
>(sample.GetStatError().GetErrorHist()->Clone()));
1016 cxcoutI(HistFactory) <<
"Using external histogram for Stat Errors for "
1017 <<
"\tChannel: " << channel_name
1018 <<
"\tSample: " << sample.GetName()
1019 <<
"\tError Histogram: " << statErrorHist->GetName() << std::endl;
1022 statErrorHist->Multiply( nominal );
1023 statErrorHist->SetName( UncertName.c_str() );
1028 statHistPairs.emplace_back(nominal, std::move(statErrorHist));
1046 if( paramHist ==
nullptr ) {
1052 theObservables.
add( *proto.var(obsName) );
1057 std::string ParamSetPrefix =
"gamma_stat_" + channel_name;
1063 ParamHistFunc statUncertFunc(statFuncName.c_str(), statFuncName.c_str(),
1064 theObservables, statFactorParams );
1068 paramHist = proto.function( statFuncName);
1072 sampleHistFuncs.push_back(paramHist);
1081 if( !sample.GetShapeFactorList().empty() ) {
1084 cxcoutFHF <<
"Cannot include Stat Error for histograms of more than 3 dimensions." << std::endl;
1088 cxcoutI(HistFactory) <<
"Sample: " << sample.GetName() <<
" in channel: " << channel_name
1089 <<
" to be include a ShapeFactor."
1092 for(
ShapeFactor& shapeFactor : sample.GetShapeFactorList()) {
1094 std::string funcName = channel_name +
"_" + shapeFactor.GetName() +
"_shapeFactor";
1095 RooAbsArg *paramHist = proto.function(funcName);
1096 if( paramHist ==
nullptr ) {
1100 theObservables.
add( *proto.var(varName) );
1106 for (
auto *comp : shapeFactorParams) {
1109 if (
auto var =
dynamic_cast<RooRealVar *
>(comp)) {
1110 var->setVal(shapeFactor.GetVal());
1111 var->setMin(shapeFactor.GetLow());
1112 var->setMax(shapeFactor.GetHigh());
1117 ParamHistFunc shapeFactorFunc( funcName.c_str(), funcName.c_str(),
1118 theObservables, shapeFactorParams );
1121 if( shapeFactor.GetInitialShape() !=
nullptr ) {
1122 TH1* initialShape =
static_cast<TH1*
>(shapeFactor.GetInitialShape()->Clone());
1123 cxcoutI(HistFactory) <<
"Setting Shape Factor: " << shapeFactor.
GetName()
1124 <<
" to have initial shape from hist: "
1125 << initialShape->GetName()
1127 shapeFactorFunc.setShape( initialShape );
1131 if( shapeFactor.IsConstant() ) {
1132 cxcoutI(HistFactory) <<
"Setting Shape Factor: " << shapeFactor.GetName()
1133 <<
" to be constant" << std::endl;
1134 shapeFactorFunc.setConstant(
true);
1138 paramHist = proto.function(funcName);
1142 sampleHistFuncs.push_back(paramHist);
1152 if( !sample.GetShapeSysList().empty() ) {
1155 cxcoutFHF <<
"Cannot include Stat Error for histograms of more than 3 dimensions.\n";
1160 std::vector<string> ShapeSysNames;
1173 cxcoutI(HistFactory) <<
"Sample: " << sample.GetName() <<
" in channel: " << channel_name
1174 <<
" to include a ShapeSys." << std::endl;
1176 std::string funcName = channel_name +
"_" + shapeSys.GetName() +
"_ShapeSys";
1177 ShapeSysNames.push_back( funcName );
1178 auto paramHist =
static_cast<ParamHistFunc*
>(proto.function(funcName));
1179 if( paramHist ==
nullptr ) {
1186 theObservables.
add( *proto.var(varName) );
1190 std::string funcParams =
"gamma_" + shapeSys.GetName();
1196 ParamHistFunc shapeFactorFunc( funcName.c_str(), funcName.c_str(),
1197 theObservables, shapeFactorParams );
1200 paramHist =
static_cast<ParamHistFunc*
>(proto.function(funcName));
1209 const TH1* shapeErrorHist = shapeSys.GetErrorHist();
1224 for (
auto const& term : shapeConstraintsInfo.constraints) {
1226 constraintTermNames.emplace_back(term->GetName());
1230 for (
RooAbsArg * glob : shapeConstraintsInfo.globalObservables) {
1231 globalSet->
add(*proto.var(glob->GetName()));
1241 for(std::string
const&
name : ShapeSysNames) {
1242 sampleHistFuncs.push_back(proto.function(
name));
1252 if( !sample.GetNormalizeByTheory() ) {
1254 lumi = &emplace<RooRealVar>(proto,
"Lumi", measurement.GetLumi());
1260 normFactors->addTerm(lumi);
1266 auto normFactorsInWS =
dynamic_cast<RooProduct*
>(proto.arg(normFactors->GetName()));
1267 assert(normFactorsInWS);
1269 sampleScaleFactors.push_back(normFactorsInWS);
1274 if(!statHistPairs.empty()) {
1278 std::unique_ptr<TH1> fracStatError(
1280 if( fracStatError ==
nullptr ) {
1281 cxcoutFHF <<
"Error: Failed to make ScaledUncertaintyHist for: " << channel_name +
"_StatUncert" +
"_RelErr\n";
1287 auto chanStatUncertFunc =
static_cast<ParamHistFunc*
>(proto.function( statFuncName ));
1288 cxcoutI(HistFactory) <<
"About to create Constraint Terms from: "
1289 << chanStatUncertFunc->
GetName()
1290 <<
" params: " << chanStatUncertFunc->paramList()
1301 cxcoutI(HistFactory) <<
"Using Gaussian StatErrors in channel: " << channel.
GetName() << std::endl;
1304 cxcoutI(HistFactory) <<
"Using Poisson StatErrors in channel: " << channel.
GetName() << std::endl;
1309 chanStatUncertFunc->paramList(),
histToVector(*fracStatError),
1310 statRelErrorThreshold,
1311 statConstraintType);
1312 for (
auto const& term : statConstraintsInfo.constraints) {
1314 constraintTermNames.emplace_back(term->GetName());
1318 for (
RooAbsArg * glob : statConstraintsInfo.globalObservables) {
1319 globalSet->
add(*proto.var(glob->GetName()));
1328 sampleScaleFactors, allSampleHistFuncs);
1329 likelihoodTermNames.push_back(channel_name+
"_model");
1333 for(
unsigned int i=0; i<systToFix.size(); ++i){
1334 RooRealVar* temp = proto.var(systToFix.at(i));
1336 cxcoutW(HistFactory) <<
"could not find variable " << systToFix.at(i)
1337 <<
" could not set it to constant" << std::endl;
1346 for(
unsigned int i=0; i<constraintTermNames.size(); ++i){
1347 RooAbsArg* proto_arg = proto.arg(constraintTermNames[i]);
1348 if( proto_arg==
nullptr ) {
1349 cxcoutFHF <<
"Error: Cannot find arg set: " << constraintTermNames.at(i)
1350 <<
" in workspace: " << proto.
GetName() << std::endl;
1353 constraintTerms.add( *proto_arg );
1356 for(
unsigned int i=0; i<likelihoodTermNames.size(); ++i){
1357 RooAbsArg* proto_arg = (proto.arg(likelihoodTermNames[i]));
1358 if( proto_arg==
nullptr ) {
1359 cxcoutFHF <<
"Error: Cannot find arg set: " << likelihoodTermNames.at(i)
1360 <<
" in workspace: " << proto.
GetName() << std::endl;
1363 likelihoodTerms.add( *proto_arg );
1365 proto.defineSet(
"constraintTerms",constraintTerms);
1366 proto.defineSet(
"likelihoodTerms",likelihoodTerms);
1370 std::string observablesStr;
1373 observables.
add( *proto.var(
name) );
1374 if (!observablesStr.empty()) { observablesStr +=
","; }
1375 observablesStr +=
name;
1381 proto.defineSet(
"observables", observablesStr.c_str());
1382 proto.defineSet(
"observablesSet", observablesStr.c_str());
1386 cxcoutP(HistFactory) <<
"\n-----------------------------------------\n"
1387 <<
"\timport model into workspace"
1388 <<
"\n-----------------------------------------\n" << std::endl;
1390 auto model = std::make_unique<RooProdPdf>(
1391 (
"model_" + channel_name).c_str(),
1392 "product of Poissons across bins for a single channel", constraintTerms,
1400 proto_config->SetPdf(*model);
1401 proto_config->SetObservables(observables);
1402 proto_config->SetGlobalObservables(*proto.set(
"globalObservables"));
1406 proto.import(*proto_config,proto_config->GetName());
1407 proto.importClassCode();
1414 int asymcalcPrintLevel = 0;
1418 if (
fCfg.createPerRegionWorkspaces) {
1431 std::unique_ptr<RooDataSet> dataset;
1432 if(!
fCfg.storeDataError){
1433 dataset = std::make_unique<RooDataSet>(
"obsData",
"",*proto.set(
"observables"),
RooFit::WeightVar(
"weightVar"));
1435 const char* weightErrName=
"weightErr";
1440 proto.import(*dataset);
1445 if(
data.GetName().empty()) {
1446 cxcoutFHF <<
"Error: Additional Data histogram for channel: " << channel.
GetName()
1447 <<
" has no name! The name always needs to be set for additional datasets, "
1448 <<
"either via the \"Name\" tag in the XML or via RooStats::HistFactory::Data::SetName().\n";
1451 std::string
const& dataName =
data.GetName();
1452 TH1 const* mnominal =
data.GetHisto();
1454 cxcoutFHF <<
"Error: Additional Data histogram for channel: " << channel.
GetName()
1455 <<
" with name: " << dataName <<
" is nullptr\n";
1462 proto.import(dataset);
1475 TH1 const& mnominal,
1477 std::vector<std::string>
const& obsNameVec) {
1483 if (obsNameVec.empty() ) {
1484 Error(
"ConfigureHistFactoryDataset",
"Invalid input - return");
1488 TAxis const* ax = mnominal.GetXaxis();
1489 TAxis const* ay = mnominal.GetYaxis();
1490 TAxis const* az = mnominal.GetZaxis();
1493 const bool storeWeightErr = obsDataUnbinned.weightVar()->getAttribute(
"StoreError");
1495 for (
int i=1; i<=ax->GetNbins(); ++i) {
1498 proto.var( obsNameVec[0] )->setVal( xval );
1500 if(obsNameVec.size()==1) {
1501 double fval = mnominal.GetBinContent(i);
1502 double ferr = storeWeightErr ? mnominal.GetBinError(i) : 0.;
1503 obsDataUnbinned.add( *proto.set(
"observables"), fval, ferr );
1506 for(
int j=1; j<=ay->GetNbins(); ++j) {
1507 double yval = ay->GetBinCenter(j);
1508 proto.var( obsNameVec[1] )->setVal( yval );
1510 if(obsNameVec.size()==2) {
1511 double fval = mnominal.GetBinContent(i,j);
1512 double ferr = storeWeightErr ? mnominal.GetBinError(i, j) : 0.;
1513 obsDataUnbinned.add( *proto.set(
"observables"), fval, ferr );
1516 for(
int k=1; k<=az->GetNbins(); ++k) {
1517 double zval = az->GetBinCenter(k);
1518 proto.var( obsNameVec[2] )->setVal( zval );
1519 double fval = mnominal.GetBinContent(i,j,k);
1520 double ferr = storeWeightErr ? mnominal.GetBinError(i, j, k) : 0.;
1521 obsDataUnbinned.add( *proto.set(
"observables"), fval, ferr );
1538 std::vector<std::unique_ptr<RooWorkspace>> &chs)
1543 if (ch_names.empty() || chs.empty() ) {
1544 Error(
"MakeCombinedModel",
"Input vectors are empty - return a nullptr");
1547 if (chs.size() < ch_names.size() ) {
1548 Error(
"MakeCombinedModel",
"Input vector of workspace has an invalid size - return a nullptr");
1551 std::set<std::string> ch_names_set{ch_names.begin(), ch_names.end()};
1552 if (ch_names.size() != ch_names_set.size()) {
1553 Error(
"MakeCombinedModel",
"Input vector of channel names has duplicate names - return a nullptr");
1561 std::map<string, RooAbsPdf *> pdfMap;
1562 vector<RooAbsPdf *> models;
1565 for (
unsigned int i = 0; i < ch_names.size(); ++i) {
1566 obsList.
add(*
static_cast<ModelConfig *
>(chs[i]->obj(
"ModelConfig"))->GetObservables());
1568 cxcoutI(HistFactory) <<
"full list of observables:\n" << obsList << std::endl;
1571 std::map<std::string, int> channelMap;
1572 for(
unsigned int i = 0; i< ch_names.size(); ++i){
1573 string channel_name=ch_names[i];
1574 if (i == 0 && isdigit(channel_name[0])) {
1575 throw std::invalid_argument(
"The first channel name for HistFactory cannot start with a digit. Got " + channel_name);
1577 if (channel_name.find(
',') != std::string::npos) {
1578 throw std::invalid_argument(
"Channel names for HistFactory cannot contain ','. Got " + channel_name);
1581 channelMap[channel_name] = i;
1586 cxcoutFHF <<
"failed to find model for channel\n";
1589 models.push_back(model);
1590 auto &modelConfig = *
static_cast<ModelConfig *
>(chs[i]->obj(
"ModelConfig"));
1592 globalObs.add(*modelConfig.GetGlobalObservables(),
true);
1595 pdfMap[channel_name]=model;
1598 cxcoutP(HistFactory) <<
"\n-----------------------------------------\n"
1599 <<
"\tEntering combination"
1600 <<
"\n-----------------------------------------\n" << std::endl;
1601 auto combined = std::make_unique<RooWorkspace>(
"combined");
1604 RooCategory& channelCat = emplace<RooCategory>(*combined,
"channelCat", channelMap);
1606 auto simPdf= std::make_unique<RooSimultaneous>(
"simPdf",
"",pdfMap, channelCat);
1607 auto combined_config = std::make_unique<ModelConfig>(
"ModelConfig", combined.get());
1608 combined_config->SetWorkspace(*combined);
1611 combined->import(globalObs);
1612 combined->defineSet(
"globalObservables",globalObs);
1613 combined_config->SetGlobalObservables(*combined->set(
"globalObservables"));
1615 combined->defineSet(
"observables",{obsList, channelCat},
true);
1616 combined_config->SetObservables(*combined->set(
"observables"));
1620 bool isConsistent =
false;
1622 std::set<std::string> allowedInconsistent{
"asimovData"};
1623 std::tie(isConsistent, errMsg) = isChannelDataConsistent(chs, ch_names, allowedInconsistent);
1624 if (!isConsistent) {
1634 if(std::string(
"asimovData") ==
data->GetName()) {
1639 std::map<std::string, RooAbsData*> dataMap;
1640 for(
unsigned int i = 0; i < ch_names.size(); ++i){
1641 dataMap[ch_names[i]] = chs[i]->data(
data->GetName());
1651 cxcoutP(HistFactory) <<
"\n-----------------------------------------\n"
1652 <<
"\tImporting combined model"
1653 <<
"\n-----------------------------------------\n" << std::endl;
1658 std::string paramName = param_itr.first;
1659 double paramVal = param_itr.second;
1661 if(
RooRealVar* temp = combined->var( paramName )) {
1662 temp->setVal( paramVal );
1663 cxcoutI(HistFactory) <<
"setting " << paramName <<
" to the value: " << paramVal << std::endl;
1665 cxcoutE(HistFactory) <<
"could not find variable " << paramName <<
" could not set its value" << std::endl;
1669 for(
unsigned int i=0; i<
fSystToFix.size(); ++i){
1672 temp->setConstant();
1673 cxcoutI(HistFactory) <<
"setting " <<
fSystToFix.at(i) <<
" constant" << std::endl;
1675 cxcoutE(HistFactory) <<
"could not find variable " <<
fSystToFix.at(i) <<
" could not set it to constant" << std::endl;
1683 combined_config->SetPdf(*simPdf);
1686 combined->import(*combined_config,combined_config->GetName());
1687 combined->importClassCode();
1693 cxcoutP(HistFactory) <<
"\n-----------------------------------------\n"
1694 <<
"\tcreate toy data"
1695 <<
"\n-----------------------------------------\n" << std::endl;
1703 *combined->pdf(
"simPdf"),
1705 if( asimov_combined ) {
1706 combined->import( *asimov_combined,
RooFit::Rename(
"asimovData"));
1709 cxcoutFHF <<
"Error: Failed to create combined asimov dataset\n";
1723 auto ErrorHist =
static_cast<TH1*
>(Nominal->Clone( Name.c_str() ));
1726 int numBins = Nominal->GetNbinsX()*Nominal->GetNbinsY()*Nominal->GetNbinsZ();
1730 for(
int i_bin = 0; i_bin < numBins; ++i_bin) {
1734 while( Nominal->IsBinUnderflow(binNumber) || Nominal->IsBinOverflow(binNumber) ){
1738 double histError = Nominal->GetBinError( binNumber );
1741 if( histError != histError ) {
1742 cxcoutFHF <<
"Warning: In histogram " << Nominal->GetName() <<
" bin error for bin " << i_bin
1743 <<
" is NAN. Not using Error!!!\n";
1750 if( histError < 0 ) {
1751 cxcoutWHF <<
"Warning: In histogram " << Nominal->GetName() <<
" bin error for bin " << binNumber
1752 <<
" is < 0. Setting Error to 0" << std::endl;
1757 ErrorHist->SetBinContent( binNumber, histError );
1776 unsigned int numHists = HistVec.size();
1778 if( numHists == 0 ) {
1779 cxcoutE(HistFactory) <<
"Warning: Empty Hist Vector, cannot create total uncertainty" << std::endl;
1783 const TH1* HistTemplate = HistVec.at(0).first;
1784 int numBins = HistTemplate->
GetNbinsX()*HistTemplate->GetNbinsY()*HistTemplate->GetNbinsZ();
1788 for(
unsigned int i = 0; i < HistVec.size(); ++i ) {
1790 const TH1* nominal = HistVec.at(i).first;
1791 const TH1* error = HistVec.at(i).second.get();
1794 cxcoutE(HistFactory) <<
"Error: Provided hists have unequal bins" << std::endl;
1798 cxcoutE(HistFactory) <<
"Error: Provided hists have unequal bins" << std::endl;
1803 std::vector<double> TotalBinContent( numBins, 0.0);
1804 std::vector<double> HistErrorsSqr( numBins, 0.0);
1809 for(
int i_bins = 0; i_bins < numBins; ++i_bins) {
1812 while( HistTemplate->IsBinUnderflow(binNumber) || HistTemplate->IsBinOverflow(binNumber) ){
1816 for(
unsigned int i_hist = 0; i_hist < numHists; ++i_hist ) {
1818 const TH1* nominal = HistVec.at(i_hist).first;
1819 const TH1* error = HistVec.at(i_hist).second.get();
1826 if( histError != histError ) {
1827 cxcoutFHF <<
"In histogram " << error->
GetName() <<
" bin error for bin " << binNumber
1828 <<
" is NAN. Not using error!!";
1832 TotalBinContent.at(i_bins) += histValue;
1833 HistErrorsSqr.at(i_bins) += histError*histError;
1841 TH1* ErrorHist =
static_cast<TH1*
>(HistTemplate->Clone( Name.c_str() ));
1845 for(
int i = 0; i < numBins; ++i) {
1849 while( ErrorHist->IsBinUnderflow(binNumber) || ErrorHist->IsBinOverflow(binNumber) ){
1853 double ErrorsSqr = HistErrorsSqr.at(i);
1854 double TotalVal = TotalBinContent.at(i);
1856 if( TotalVal <= 0 ) {
1857 cxcoutW(HistFactory) <<
"Warning: Sum of histograms for bin: " << binNumber
1858 <<
" is <= 0. Setting error to 0"
1861 ErrorHist->SetBinContent( binNumber, 0.0 );
1865 double RelativeError = sqrt(ErrorsSqr) / TotalVal;
1869 if( RelativeError != RelativeError ) {
1870 cxcoutE(HistFactory) <<
"Error: bin " << i <<
" error is NAN\n"
1871 <<
" HistErrorsSqr: " << ErrorsSqr
1872 <<
" TotalVal: " << TotalVal;
1882 ErrorHist->SetBinError(binNumber, TotalVal);
1883 ErrorHist->SetBinContent(binNumber, RelativeError);
1885 cxcoutI(HistFactory) <<
"Making Total Uncertainty for bin " << binNumber
1886 <<
" Error = " << sqrt(ErrorsSqr)
1887 <<
" CentralVal = " << TotalVal
1888 <<
" RelativeError = " << RelativeError <<
"\n";
1892 return std::unique_ptr<TH1>(ErrorHist);
std::vector< double > histToVector(TH1 const &hist)
constexpr double alphaHigh
constexpr double alphaLow
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
A class which maps the current values of a RooRealVar (or a set of RooRealVars) to one of a number of...
static RooArgList createParamSet(RooWorkspace &w, const std::string &, const RooArgList &Vars)
Create the list of RooRealVar parameters which represent the height of the histogram bins.
The PiecewiseInterpolation is a class that can morph distributions into each other,...
Common abstract base class for objects that represent a value and a "shape" in RooFit.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Storage_t::size_type size() const
Abstract base class for binned and unbinned datasets.
Abstract interface for all probability density functions.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
void setConstant(bool value=true)
Abstract base class for objects that represent a real value and implements functionality common to al...
Calculates the sum of a set of RooAbsReal terms, or when constructed with two sets,...
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Implements a RooAbsBinning in terms of an array of boundary values, posing no constraints on the choi...
Object to represent discrete states.
Container class to hold N-dimensional binned data.
Container class to hold unbinned data.
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
Implementation of the Gamma PDF for RooFit/RooStats.
Switches the message service to a different level while the instance is alive.
A real-valued function sampled from a multidimensional histogram.
static RooMsgService & instance()
Return reference to singleton instance.
A RooAbsReal implementing a polynomial in terms of a list of RooAbsReal coefficients.
Represents the product of a given set of RooAbsReal objects.
Implements a PDF constructed from a sum of functions:
Variable that can be changed from the outside.
void setBins(Int_t nBins, const char *name=nullptr, bool shared=true)
Create a uniform binning under name 'name' for this variable.
void setBinning(const RooAbsBinning &binning, const char *name=nullptr, bool shared=true)
Add given binning under name 'name' with this variable.
static void SetPrintLevel(int level)
set print level (static function)
static RooAbsData * GenerateAsimovData(const RooAbsPdf &pdf, const RooArgSet &observables)
generate the asimov data for the observables (not the global ones) need to deal with the case of a si...
TODO Here, we are missing some documentation.
void ConfigureWorkspace(RooWorkspace *)
This class encapsulates all information for the statistical interpretation of one experiment.
std::vector< RooStats::HistFactory::Data > & GetAdditionalData()
retrieve vector of additional data objects
void Print(std::ostream &=std::cout)
HistFactory::StatErrorConfig & GetStatErrorConfig()
get information about threshold for statistical uncertainties and constraint term
RooStats::HistFactory::Data & GetData()
get data object
bool CheckHistograms() const
std::vector< RooStats::HistFactory::Sample > & GetSamples()
get vector of samples for this channel
std::string GetName() const
get name of channel
This class provides helper functions for creating likelihood models from histograms.
std::unique_ptr< RooProduct > CreateNormFactor(RooWorkspace &proto, std::string &channel, std::string &sigmaEpsilon, Sample &sample, bool doRatio)
void GuessObsNameVec(const TH1 *hist)
std::unique_ptr< RooWorkspace > MakeSingleChannelWorkspace(Measurement &measurement, Channel &channel)
void MakeTotalExpected(RooWorkspace &proto, const std::string &totName, const std::vector< RooProduct * > &sampleScaleFactors, std::vector< std::vector< RooAbsArg * > > &sampleHistFuncs) const
std::unique_ptr< TH1 > MakeScaledUncertaintyHist(const std::string &Name, std::vector< std::pair< const TH1 *, std::unique_ptr< TH1 > > > const &HistVec) const
std::vector< std::string > fPreprocessFunctions
RooHistFunc * MakeExpectedHistFunc(const TH1 *hist, RooWorkspace &proto, std::string prefix, const RooArgList &observables) const
Create the nominal hist function from hist, and register it in the workspace.
void SetFunctionsToPreprocess(std::vector< std::string > lines)
std::vector< std::string > fObsNameVec
RooFit::OwningPtr< RooWorkspace > MakeSingleChannelModel(Measurement &measurement, Channel &channel)
RooFit::OwningPtr< RooWorkspace > MakeCombinedModel(std::vector< std::string >, std::vector< std::unique_ptr< RooWorkspace > > &)
TH1 * MakeAbsolUncertaintyHist(const std::string &Name, const TH1 *Hist)
std::map< std::string, double > fParamValues
static void ConfigureWorkspaceForMeasurement(const std::string &ModelName, RooWorkspace *ws_single, Measurement &measurement)
void AddConstraintTerms(RooWorkspace &proto, Measurement &measurement, std::string prefix, std::string interpName, std::vector< OverallSys > &systList, std::vector< std::string > &likelihoodTermNames, std::vector< std::string > &totSystTermNames)
void ConfigureHistFactoryDataset(RooDataSet &obsData, TH1 const &nominal, RooWorkspace &proto, std::vector< std::string > const &obsNameVec)
static void PrintCovarianceMatrix(RooFitResult *result, RooArgSet *params, std::string filename)
std::vector< std::string > fSystToFix
HistoToWorkspaceFactoryFast()
RooArgList createObservables(const TH1 *hist, RooWorkspace &proto) const
Create observables of type RooRealVar. Creates 1 to 3 observables, depending on the type of the histo...
The RooStats::HistFactory::Measurement class can be used to construct a model by combining multiple R...
Configuration for an un- constrained overall systematic to scale sample normalisations.
Configuration for a constrained overall systematic to scale sample normalisations.
const std::string & GetName() const
*Un*constrained bin-by-bin variation of affected histogram.
Constrained bin-by-bin variation of affected histogram.
double GetRelErrorThreshold() const
Constraint::Type GetConstraintType() const
< A class that holds configuration information for a model using a workspace as a store
Persistable container for RooFit projects.
RooAbsPdf * pdf(RooStringView name) const
Retrieve p.d.f (RooAbsPdf) with given name. A null pointer is returned if not found.
RooAbsArg * arg(RooStringView name) const
Return RooAbsArg with given name. A null pointer is returned if none is found.
bool import(const RooAbsArg &arg, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}, const RooCmdArg &arg9={})
Import a RooAbsArg object, e.g.
Class to manage histogram axis.
Bool_t IsVariableBinSize() const
const char * GetTitle() const override
Returns title of object.
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
const TArrayD * GetXbins() const
TH1 is the base class of all histogram classes in ROOT.
virtual Int_t GetNbinsY() const
virtual Int_t GetNbinsZ() const
virtual Int_t GetDimension() const
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
virtual Int_t GetNbinsX() const
Bool_t IsBinUnderflow(Int_t bin, Int_t axis=0) const
Return true if the bin is underflow.
Bool_t IsBinOverflow(Int_t bin, Int_t axis=0) const
Return true if the bin is overflow.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
RooCmdArg RecycleConflictNodes(bool flag=true)
RooCmdArg Rename(const char *suffix)
RooCmdArg Conditional(const RooArgSet &pdfSet, const RooArgSet &depSet, bool depsAreCond=false)
RooConstVar & RooConst(double val)
RooCmdArg Index(RooCategory &icat)
RooCmdArg StoreError(const RooArgSet &aset)
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
RooCmdArg Import(const char *state, TH1 &histo)
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
OwningPtr< T > makeOwningPtr(std::unique_ptr< T > &&ptr)
Internal helper to turn a std::unique_ptr<T> into an OwningPtr.
constexpr double defaultShapeSysGammaMax
constexpr double minShapeUncertainty
constexpr double defaultStatErrorGammaMax
constexpr double defaultGammaMin
CreateGammaConstraintsOutput createGammaConstraints(RooArgList const ¶mList, std::span< const double > relSigmas, double minSigma, Constraint::Type type)
Namespace for the RooStats classes.
Configuration settings for HistFactory behavior.