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");
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;
1431 std::unique_ptr<RooDataSet> dataset;
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.
const Double_t * GetArray() const
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.
bool createPerRegionWorkspaces
Control whether individual workspace files are created for each channel (default true).
bool binnedFitOptimization
Enable or disable optimization for binned likelihood fits (default true).
bool storeDataError
Control whether errors on the data histograms are stored in the workspace (default false).