78#ifdef ROOFIT_LEGACY_EVAL_BACKEND
109#include <sys/types.h>
115class ScaledDataWeightedAverage :
public RooAbsFunc {
118 :
RooAbsFunc{1}, _var{var}, _dataWeights{
data.getWeightBatch(0,
data.numEntries())}, _scaleFactor{scaleFactor}
121 _arg->recursiveRedirectServers(
RooArgList{var});
122 _evaluator = std::make_unique<RooFit::Evaluator>(*_arg);
123 std::stack<std::vector<double>>{}.swap(_vectorBuffers);
124 auto dataSpans = RooFit::BatchModeDataHelpers::getDataSpans(
data,
"",
nullptr,
false,
127 for (
auto const& item : dataSpans) {
128 _evaluator->setInput(item.first->GetName(), item.second,
false);
132 double operator()(
const double xvector[])
const override
134 double oldVal = _var.getVal();
135 _var.setVal(xvector[0]);
138 std::span<const double> pdfValues = _evaluator->run();
139 if (_dataWeights.empty()) {
140 out = std::accumulate(pdfValues.begin(), pdfValues.end(), 0.0) / pdfValues.size();
142 double weightsSum = 0.0;
143 for (std::size_t i = 0; i < pdfValues.size(); ++i) {
144 out += pdfValues[i] * _dataWeights[i];
145 weightsSum += _dataWeights[i];
159 std::unique_ptr<RooAbsReal> _arg;
160 std::span<const double> _dataWeights;
162 std::unique_ptr<RooFit::Evaluator> _evaluator;
163 std::stack<std::vector<double>> _vectorBuffers;
205 double inMaxVal,
const char *unit) :
206 RooAbsArg(
name,title), _plotMin(inMinVal), _plotMax(inMaxVal), _unit(unit)
216 RooAbsArg(other,
name), _plotMin(other._plotMin), _plotMax(other._plotMax),
217 _plotBins(other._plotBins), _value(other._value), _unit(other._unit), _label(other._label),
218 _forceNumInt(other._forceNumInt), _selectComp(other._selectComp)
257 if (!assumeSameType) {
273 if(appendUnit && 0 != strlen(
getUnit())) {
337 <<
"): validation failed: " <<
value << std::endl ;
357 const RooArgSet* ,
const char* rangeName)
const
388 if (code==0)
return getVal(normSet) ;
402 coutF(Eval) <<
"RooAbsReal::analyticalIntegral(" <<
GetName() <<
") code " << code <<
" not implemented" << std::endl ;
463 os <<
indent <<
"--- RooAbsReal ---" << std::endl;
481 for (
auto const& arg : paramsOfInterest) {
492 auto out = std::make_unique<RooProfileLL>(
name.c_str(),(std::string(
"Profile of ") +
GetTitle()).c_str(),*
this,paramsOfInterest);
527 pc.
defineString(
"rangeName",
"RangeWithName",0,
"",
true) ;
528 pc.
defineSet(
"normSet",
"NormSet",0,
nullptr) ;
529 pc.
defineObject(
"numIntConfig",
"NumIntConfig",0,
nullptr) ;
532 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
538 const char* rangeName = pc.
getString(
"rangeName",
nullptr,
true) ;
563 if (!rangeName || strchr(rangeName,
',')==
nullptr) {
569 std::vector<std::string> tokens =
ROOT::Split(rangeName,
",");
572 std::stringstream errMsg;
573 errMsg <<
GetName() <<
" : integrating with respect to the variables " << iset <<
" on the ranges \"" << rangeName
574 <<
"\" is not possible because the ranges are overlapping";
575 const std::string errMsgString = errMsg.str();
576 coutE(Integration) << errMsgString << std::endl;
577 throw std::invalid_argument(errMsgString);
581 for (
const std::string& token : tokens) {
585 const std::string title = std::string(
"Integral of ") +
GetTitle();
588 auto out = std::make_unique<RooAddition>(fullName.c_str(), title.c_str(), components);
589 out->addOwnedComponents(std::move(components));
590 return RooFit::Detail::owningPtr<RooAbsReal>(std::move(out));
608 std::unique_ptr<RooAbsReal> integral;
613 const std::string title = std::string(
"Integral of ") +
GetTitle();
616 auto out = std::make_unique<RooRealIntegral>(
name.c_str(), title.c_str(), *
this, iset, nset, cfg, rangeName);
617 return RooFit::Detail::owningPtr<RooAbsReal>(std::move(out));
621 while(!iset.
empty()) {
630 if (innerSet.
empty()) {
636 const std::string title = std::string(
"Integral of ") + integrand->
GetTitle();
639 std::unique_ptr<RooAbsReal> innerIntegral = std::move(integral);
642 integral = std::make_unique<RooRealIntegral>(
name.c_str(),title.c_str(),*integrand,innerSet,nset,cfg,rangeName);
646 integral->addOwnedComponents(std::move(innerIntegral));
653 if (integrand ==
this && !iset.
empty()) {
654 coutI(Integration) <<
GetName() <<
" : multidimensional integration over observables with parameterized ranges in terms of other integrated observables detected, using recursive integration strategy to construct final integral" << std::endl ;
658 integrand = integral.get();
666 coutE(Integration) <<
GetName() <<
" : ERROR while defining recursive integral over observables with parameterized integration ranges, please check that integration rangs specify uniquely defined integral " << std::endl;
673 if (cacheParamsStr && strlen(cacheParamsStr)) {
675 std::unique_ptr<RooArgSet> intParams{integral->getVariables()};
679 if (!cacheParams.
empty()) {
680 cxcoutD(Caching) <<
"RooAbsReal::createIntObj(" <<
GetName() <<
") INFO: constructing " << cacheParams.
size()
681 <<
"-dim value cache for integral over " << iset2 <<
" as a function of " << cacheParams <<
" in range " << (rangeName?rangeName:
"<none>") << std::endl ;
683 auto cachedIntegral = std::make_unique<RooCachedReal>(
name.c_str(),
name.c_str(),*integral,cacheParams);
684 cachedIntegral->setInterpolationOrder(2) ;
685 cachedIntegral->addOwnedComponents(std::move(integral));
686 cachedIntegral->setCacheSource(
true) ;
687 if (integral->operMode()==
ADirty) {
688 cachedIntegral->setOperMode(
ADirty) ;
691 return RooFit::Detail::owningPtr<RooAbsReal>(std::move(cachedIntegral));
719 for (
const auto aarg : allObs) {
724 RooAbsBinning& binning = arglv->getBinning(rangeName,
false,
true) ;
733 obsWithParamRange.
add(*aarg) ;
734 obsWithFixedRange.
remove(*aarg) ;
735 obsServingAsRangeParams.
add(loBoundObs,
false) ;
736 obsServingAsRangeParams.
add(hiBoundObs,
false) ;
743 RooArgSet obsWithFixedRangeNP(obsWithFixedRange) ;
744 obsWithFixedRangeNP.
remove(obsServingAsRangeParams) ;
747 RooArgSet obsWithParamRangeNP(obsWithParamRange) ;
748 obsWithParamRangeNP.
remove(obsServingAsRangeParams) ;
752 innerObs.
add(obsWithFixedRangeNP) ;
753 innerObs.
add(obsWithParamRangeNP) ;
770 name.Append(
"_Int[") ;
782 name.Append(rangeName) ;
785 }
else if (!omitEmpty) {
786 name.Append(
"_Int[]") ;
789 if (nset && !nset->
empty()) {
794 name.Append(
"_Norm[") ;
864 for (
const auto arg : dependentVars) {
867 <<
"\" of wrong type: " << arg->
ClassName() << std::endl;
874 <<
"\" is not a dependent and will be ignored." << std::endl;
879 leafNodes.
replace(*found,*arg);
881 leafNodes.
add(*arg) ;
886 for (
const auto lvs : lvDep) {
890 leafNodes.
add(*lvs) ;
897 if(
nullptr != projectedVars && projectedVars->
find(arg->
GetName())) {
899 <<
"\" cannot be both a dependent and a projected variable." << std::endl;
905 if(
nullptr != projectedVars) leafNodes.
remove(*projectedVars,
true);
910 coutE(Plotting) <<
"RooAbsPdf::createPlotProjection(" <<
GetName() <<
") Couldn't deep-clone PDF, abort," << std::endl ;
921 std::unique_ptr<RooArgSet> plotLeafNodes{
static_cast<RooArgSet*
>(leafNodes.
selectCommon(dependentVars))};
926 if(
nullptr != projectedVars) normSet.
add(*projectedVars);
927 if(
nullptr != condObs) {
928 normSet.
remove(*condObs,
true,
true) ;
935 if(
nullptr == projectedVars) projectedVars= ∅
941 title.
Prepend(
"Projection of ");
944 std::unique_ptr<RooAbsReal> projected{theClone->
createIntegral(*projectedVars,normSet,rangeName)};
946 if(
nullptr == projected || !projected->isValid()) {
947 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":createPlotProjection: cannot integrate out ";
956 projected->SetName(
name.Data()) ;
957 projected->SetTitle(title.
Data()) ;
961 cloneSet->
addOwned(std::move(projected));
985 double scaleFactor,
const RooArgSet *projectedVars,
bool scaleForDensity,
986 const RooArgSet* condObs,
bool setError)
const
989 if(
nullptr == hist) {
990 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: no valid histogram to fill" << std::endl;
996 if(hdim != plotVars.
getSize()) {
997 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: plotVars has the wrong dimension" << std::endl;
1008 if(
nullptr == realVar) {
1010 <<
"\" of type " << var->
ClassName() << std::endl;
1015 <<
":fillHistogram: WARNING: variable is not an explicit dependent: " << realVar->
GetName() << std::endl;
1017 plotClones.
addClone(*realVar,
true);
1027 if (projectedVars) {
1028 allDeps.
add(*projectedVars) ;
1031 coutE(InputArguments) <<
"RooAbsReal::fillHistogram(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
1039 cxcoutD(Plotting) <<
"RooAbsReal::fillHistogram(" <<
GetName() <<
") plot projection object is " << projected->
GetName() << std::endl ;
1042 Int_t xbins(0),ybins(1),zbins(1);
1046 TAxis *xaxis =
nullptr;
1047 TAxis *yaxis =
nullptr;
1048 TAxis *zaxis =
nullptr;
1054 assert(
nullptr != zvar &&
nullptr != zaxis);
1055 if (scaleForDensity) {
1063 assert(
nullptr != yvar &&
nullptr != yaxis);
1064 if (scaleForDensity) {
1072 assert(
nullptr != xvar &&
nullptr != xaxis);
1073 if (scaleForDensity) {
1078 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: cannot fill histogram with "
1079 << hdim <<
" dimensions" << std::endl;
1086 Int_t xbin(0),ybin(0),zbin(0);
1087 Int_t bins= xbins*ybins*zbins;
1088 for(
Int_t bin= 0; bin < bins; bin++) {
1091 if(bin % (xbins*ybins) == 0) {
1097 if(bin % xbins == 0) {
1098 ybin= (ybin%ybins) + 1;
1103 xbin= (xbin%xbins) + 1;
1107 coutE(InputArguments) <<
"RooAbsReal::fillHistogram: Internal Error!" << std::endl;
1113 coutW(Plotting) <<
"WARNING: Function evaluation error(s) at coordinates [x]=" << xvar->
getVal() ;
1114 if (hdim==2)
ccoutW(Plotting) <<
" [y]=" << yvar->
getVal() ;
1115 if (hdim==3)
ccoutW(Plotting) <<
" [z]=" << zvar->
getVal() ;
1116 ccoutW(Plotting) << std::endl ;
1158 bool correctForBinSize,
bool showProgress)
const
1161 if(
nullptr == hist) {
1162 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillDataHist: no valid RooDataHist to fill" << std::endl;
1169 coutE(InputArguments) <<
"RooAbsReal::fillDataHist(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
1187 if (showProgress && (i%onePct==0)) {
1188 ccoutP(Eval) <<
"." << std::flush ;
1191 double binVal = theClone->
getVal(normSet?normSet:obs)*scaleFactor ;
1192 if (correctForBinSize) {
1195 hist->
set(i, binVal, 0.);
1221 std::vector<RooRealVar*> histVars(3,
nullptr);
1223 for(std::size_t iVar = 0; iVar < varNames.size(); ++iVar) {
1224 if(varNames[iVar].empty())
continue;
1226 std::stringstream errMsg;
1227 errMsg <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR more than three variable names passed, but maximum number of supported variables is three";
1228 coutE(Plotting) << errMsg.str() << std::endl;
1229 throw std::invalid_argument(errMsg.str());
1231 auto var =
static_cast<RooRealVar*
>(vars->find(varNames[iVar].c_str()));
1233 std::stringstream errMsg;
1234 errMsg <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR variable " << varNames[iVar] <<
" does not exist in argset: " << *vars;
1235 coutE(Plotting) << errMsg.str() << std::endl;
1236 throw std::runtime_error(errMsg.str());
1238 histVars[iVar] = var;
1320 pc.
defineInt(
"intBinning",
"IntrinsicBinning",0,2) ;
1321 pc.
defineInt(
"extended",
"Extended",0,2) ;
1323 pc.
defineSet(
"compSet",
"SelectCompSet",0);
1325 pc.
defineSet(
"projObs",
"ProjectedObservables",0,
nullptr) ;
1328 pc.
defineMutex(
"SelectCompSet",
"SelectCompSpec") ;
1330 pc.
defineMutex(
"IntrinsicBinning",
"BinningName") ;
1331 pc.
defineMutex(
"IntrinsicBinning",
"BinningSpec") ;
1350 auto projObs = pc.
getSet(
"projObs");
1353 bool doScaling = pc.
getInt(
"scaling") ;
1359 if (!pdfSelf && doExtended == 1) {
1360 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName() <<
") WARNING extended mode requested for a non-pdf object, ignored" << std::endl ;
1364 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName() <<
") WARNING extended mode requested for a non-extendable pdf, ignored" << std::endl ;
1367 if (pdfSelf && doExtended==2) {
1369 }
else if(!pdfSelf) {
1373 const char* compSpec = pc.
getString(
"compSpec") ;
1375 bool haveCompSel = ( (compSpec && strlen(compSpec)>0) || compSet) ;
1377 std::unique_ptr<RooBinning> intBinning;
1378 if (doIntBinning>0) {
1383 if (doIntBinning==1) {
1384 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName()
1385 <<
") WARNING, intrinsic model binning requested for histogram, but model does not define bin boundaries, reverting to default binning"<< std::endl ;
1388 if (doIntBinning==2) {
1389 coutI(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName()
1390 <<
") INFO: Model has intrinsic binning definition, selecting that binning for the histogram"<< std::endl ;
1392 std::vector<double> edges(bl->size());
1394 for (
auto const& elem : *bl) { edges[i++] = elem ; }
1395 intBinning = std::make_unique<RooBinning>(bl->size()-1,edges.data()) ;
1400 RooCmdConfig::stripCmdList(argListCreate,
"Scaling,ProjectedObservables,IntrinsicBinning,SelectCompSet,SelectCompSpec,Extended") ;
1402 TH1* histo(
nullptr) ;
1405 argListCreate.
Add(&tmp) ;
1421 branchNodeSet.
remove(*arg) ;
1425 std::unique_ptr<RooArgSet> dirSelNodes;
1431 if (!dirSelNodes->empty()) {
1432 coutI(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") directly selected PDF components: " << *dirSelNodes << std::endl ;
1438 coutE(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR: component selection set " << *compSet <<
" does not match any components of p.d.f." << std::endl ;
1440 coutE(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR: component selection expression '" << compSpec <<
"' does not select any components of p.d.f." << std::endl ;
1446 double scaleFactor(1.0) ;
1452 fillHistogram(histo,vars,scaleFactor,intObs,doScaling,projObs,
false) ;
1479 for (
unsigned int i = 0; i < branchNodeSet.
size(); ++i) {
1480 const auto arg = branchNodeSet[i];
1482 branchNodeSet.
remove(*arg) ;
1489 for (
const auto arg : branchNodeSet) {
1498 for (
const auto arg : branchNodeSet) {
1499 for (
const auto selNode : *selNodes) {
1500 if (selNode->dependsOn(*arg,
nullptr,
true)) {
1507 for (
const auto arg : branchNodeSet) {
1508 if (arg->
dependsOn(*selNodes,
nullptr,
true)) {
1513 tmp.
remove(*selNodes,
true);
1516 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") indirectly selected PDF components: " << tmp << std::endl ;
1519 for (
const auto arg : branchNodeSet) {
1520 bool select = selNodes->
find(arg->
GetName()) !=
nullptr;
1674 argList.
Add(&rnorm) ;
1676 std::vector<std::string> rlist;
1680 rlist.emplace_back(rangeNameToken);
1683 for (
const auto& rangeString : rlist) {
1685 rcmd->
setString(0, rangeString.c_str());
1695 pc.
defineString(
"projectionRangeName",
"ProjectionRange",0,
"",
true) ;
1696 pc.
defineString(
"curveNameSuffix",
"CurveNameSuffix",0,
"") ;
1697 pc.
defineString(
"sliceCatState",
"SliceCat",0,
"",
true) ;
1700 pc.
defineSet(
"sliceSet",
"SliceVars",0) ;
1701 pc.
defineObject(
"sliceCatList",
"SliceCat",0,
nullptr,
true) ;
1710 pc.
defineInt(
"doEvalError",
"EvalErrorValue",0,0) ;
1711 pc.
defineInt(
"shiftToZero",
"ShiftToZero",0,0) ;
1712 pc.
defineSet(
"projDataSet",
"ProjData",0) ;
1716 pc.
defineSet(
"errorPars",
"VisualizeError",0) ;
1717 pc.
defineInt(
"linearMethod",
"VisualizeError",0,0) ;
1718 pc.
defineInt(
"binProjData",
"ProjData",0,0) ;
1721 pc.
defineInt(
"numee",
"PrintEvalErrors",0,10) ;
1722 pc.
defineInt(
"rangeAdjustNorm",
"Range",0,0) ;
1723 pc.
defineInt(
"rangeWNAdjustNorm",
"RangeWithName",0,0) ;
1727 pc.
defineInt(
"markerColor",
"MarkerColor",0,-999) ;
1728 pc.
defineInt(
"markerStyle",
"MarkerStyle",0,-999) ;
1730 pc.
defineInt(
"lineColor",
"LineColor",0,-999) ;
1731 pc.
defineInt(
"lineStyle",
"LineStyle",0,-999) ;
1732 pc.
defineInt(
"lineWidth",
"LineWidth",0,-999) ;
1733 pc.
defineInt(
"fillColor",
"FillColor",0,-999) ;
1734 pc.
defineInt(
"fillStyle",
"FillStyle",0,-999) ;
1736 pc.
defineInt(
"curveInvisible",
"Invisible",0,0) ;
1737 pc.
defineInt(
"showProg",
"ShowProgress",0,0) ;
1739 pc.
defineInt(
"interleave",
"NumCPU",1,0) ;
1743 pc.
defineInt(
"moveToBack",
"MoveToBack",0,0) ;
1747 pc.
defineMutex(
"VisualizeError",
"VisualizeErrorData") ;
1761 bool linMethod = pc.
getInt(
"linearMethod") ;
1762 if (!drawOpt.
Contains(
"P") && errFR) {
1783 std::unique_ptr<RooArgSet> sliceSet{sliceSetTmp ?
static_cast<RooArgSet*
>(sliceSetTmp->
Clone()) :
nullptr};
1789 const char* sliceCatState = pc.
getString(
"sliceCatState",
nullptr,
true) ;
1791 if (sliceCatState) {
1795 sliceSet = std::make_unique<RooArgSet>();
1800 auto iter = sliceCatList.
begin();
1801 for (
unsigned int i=0; i < catTokens.size(); ++i) {
1802 if (
auto scat =
static_cast<RooCategory*
>(*iter)) {
1804 scat->setLabel(catTokens[i]) ;
1806 sliceSet->add(*scat,
false) ;
1819 if (vlines==2) vlines=0 ;
1825 if (vlines==2) vlines=0 ;
1845 coutE(InputArguments) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") cannot find existing curve " << o.
addToCurveName <<
" to add to in RooPlot" << std::endl ;
1851 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have slice " << *sliceSet << std::endl ;
1856 for (
const auto sliceArg : *sliceSet) {
1859 projectedVars.
remove(*arg) ;
1861 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") slice variable "
1862 << sliceArg->GetName() <<
" was not projected anyway" << std::endl ;
1865 }
else if (projSet) {
1866 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have projSet " << *projSet << std::endl ;
1869 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have neither sliceSet nor projSet " << std::endl ;
1874 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: projectedVars = " << projectedVars << std::endl ;
1904 if ((fillColor != -999 || fillStyle != -999) && !drawOpt.
Contains(
"F")) {
1905 coutW(Plotting) <<
"Fill color or style was set for plotting \"" <<
GetName()
1906 <<
"\", but these only have an effect when 'DrawOption(\"F\")' for fill is used at the same time." << std::endl;
1946 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have ProjData with observables = " << *o.
projData->
get() << std::endl ;
1949 projDataVars.
add(*tmp) ;
1950 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have ProjDataSet = " << *o.
projDataSet <<
" will only use this subset of projData" << std::endl ;
1952 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") using full ProjData" << std::endl ;
1957 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") ProjDataVars = " << projDataVars << std::endl ;
1963 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have input projSet = " << *o.
projSet << std::endl ;
1965 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") calculated projectedVars = " << *o.
projSet << std::endl ;
1972 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") frame->getNormVars() that are also observables = " << sliceSetTmp << std::endl ;
1974 sliceSetTmp.
remove(projectedVars,
true,
true) ;
1979 sliceSetTmp.
remove(*tmp,
true,
true) ;
1982 if (!sliceSetTmp.
empty()) {
1983 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on "
1984 << frame->
getPlotVar()->
GetName() <<
" represents a slice in " << sliceSetTmp << std::endl ;
1986 sliceSet.
add(sliceSetTmp) ;
1992 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") projectedVars = " << projectedVars <<
" sliceSet = " << sliceSet << std::endl ;
1995 RooArgSet* projDataNeededVars = nullptr ;
1999 projectedVars.
remove(projDataVars,
true,
true) ;
2004 double oldPlotVarVal = plotVar->
getVal();
2007 if (!projectedVars.
empty()) {
2008 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->GetName()
2009 <<
" integrates over variables " << projectedVars
2012 if (projDataNeededVars && !projDataNeededVars->
empty()) {
2013 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
2014 <<
" averages using data variables " << *projDataNeededVars << std::endl ;
2018 RooArgSet* projectionCompList = nullptr ;
2022 deps.
remove(projectedVars,
true,
true) ;
2023 if (projDataNeededVars) {
2024 deps.
remove(*projDataNeededVars,
true,
true) ;
2026 deps.
remove(*plotVar,
true,
true) ;
2027 deps.
add(*plotVar) ;
2033 coutE(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
2034 if (projDataNeededVars)
delete projDataNeededVars ;
2039 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot projection object is " << projection->
GetName() << std::endl ;
2046 fullNormSet.
add(projectedVars) ;
2047 if (projDataNeededVars && !projDataNeededVars->
empty()) {
2048 fullNormSet.
add(*projDataNeededVars) ;
2051 std::unique_ptr<RooArgSet> projectionComponents(projection->
getComponents());
2052 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*projectionComponents)) {
2054 pdf->selectNormalization(&fullNormSet) ;
2059 if (o.
projData && projDataNeededVars && !projDataNeededVars->
empty()) {
2063 std::unique_ptr<RooAbsData> projDataSelOwned;
2070 if (!sliceDataSet->empty()) {
2072 for(
RooAbsArg * sliceVar : *sliceDataSet) {
2089 if (!cutString.
IsNull()) {
2090 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") reducing given projection dataset to entries with " << cutString << std::endl ;
2092 projDataSelOwned = std::unique_ptr<RooAbsData>{
const_cast<RooAbsData*
>(o.
projData)->reduce(*projDataNeededVars, cutString.
IsNull() ? nullptr : cutString)};
2093 projDataSel = projDataSelOwned.
get();
2095 <<
") only the following components of the projection data will be used: " << *projDataNeededVars << std::endl ;
2104 if (!
dynamic_cast<RooCategory*
>(arg2)) allCat =
false ;
2108 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") unbinned projection dataset consist only of discrete variables,"
2109 <<
" performing projection with binned copy for optimization." << std::endl ;
2116 projDataSelOwned = std::make_unique<RooDataHist>(std::string(projDataSel->
GetName()) +
"_binned",
"Binned projection data",*projDataSel->
get(),*projDataSel);
2117 projDataSel = projDataSelOwned.
get();
2121 ScaledDataWeightedAverage scaleBind{*projection, *projDataSel, o.
scaleFactor, *plotVar};
2130 std::string curveName(projection->
GetName()) ;
2133 if (!sliceSet.
empty()) {
2147 curve->
SetName(curveName.c_str()) ;
2198 std::string curveName(projection->
GetName()) ;
2199 if (!sliceSet.
empty()) {
2225 curve->
SetName(curveName.c_str()) ;
2246 if (projDataNeededVars)
delete projDataNeededVars ;
2247 delete projectionCompList ;
2248 plotVar->setVal(oldPlotVarVal);
2268 projectedVars.
remove(*arg) ;
2270 coutI(Plotting) <<
"RooAbsReal::plotSliceOn(" <<
GetName() <<
") slice variable "
2271 << sliceArg->GetName() <<
" was not projected anyway" << std::endl ;
2313 projDataVars.
add(*tmp) ;
2321 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2322 <<
") function doesn't depend on asymmetry category " << asymCat.
GetName() << std::endl ;
2328 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2329 <<
") asymmetry category must have 2 or 3 states with index values -1,0,1" << std::endl ;
2343 sliceSetTmp.
remove(projectedVars,
true,
true) ;
2348 sliceSetTmp.
remove(*tmp,
true,
true) ;
2351 if (!sliceSetTmp.
empty()) {
2352 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") plot on "
2353 << frame->
getPlotVar()->
GetName() <<
" represents a slice in " << sliceSetTmp << std::endl ;
2355 sliceSet.
add(sliceSetTmp) ;
2363 RooArgSet* projDataNeededVars = nullptr ;
2366 projectedVars.
remove(projDataVars,
true,
true) ;
2379 if (!projectedVars.
empty()) {
2380 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
2381 <<
" projects variables " << projectedVars << std::endl ;
2383 if (projDataNeededVars && !projDataNeededVars->
empty()) {
2384 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
2385 <<
" averages using data variables "<< *projDataNeededVars << std::endl ;
2393 asymNeg->setIndex(-1) ;
2399 custNeg.replaceArg(asymCat,*asymNeg) ;
2400 std::unique_ptr<RooAbsReal> funcPos{
static_cast<RooAbsReal*
>(custPos.build())};
2401 std::unique_ptr<RooAbsReal> funcNeg{
static_cast<RooAbsReal*
>(custNeg.build())};
2404 RooArgSet *posProjCompList, *negProjCompList ;
2410 depPos.
add(projDataVars) ;
2411 depNeg.
add(projDataVars) ;
2415 if (!posProj || !negProj) {
2416 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") Unable to create projections, abort" << std::endl ;
2422 asymName.
Append(
"_Asym[") ;
2426 asymTitle.
Append(
" Asymmetry of ") ;
2434 std::unique_ptr<RooAbsData> projDataSelOwned;
2441 if (!sliceDataSet.
empty()) {
2443 for(
RooAbsArg * sliceVar : sliceDataSet) {
2460 if (!cutString.
IsNull()) {
2461 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2462 <<
") reducing given projection dataset to entries with " << cutString << std::endl ;
2464 projDataSelOwned = std::unique_ptr<RooAbsData>{
const_cast<RooAbsData*
>(o.
projData)->reduce(*projDataNeededVars,cutString.
IsNull() ? nullptr : cutString)};
2465 projDataSel = projDataSelOwned.
get();
2466 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2467 <<
") only the following components of the projection data will be used: " << *projDataNeededVars << std::endl ;
2472 ScaledDataWeightedAverage scaleBind{funcAsym, *projDataSel, o.
scaleFactor, *plotVar};
2481 TString curveName(funcAsym.GetName()) ;
2484 if (!sliceSet.
empty()) {
2494 RooCurve *curve =
new RooCurve(funcAsym.GetName(),funcAsym.GetTitle(),scaleBind,
2502 ccoutW(Eval) << std::endl ;
2520 TString curveName(funcAsym.GetName()) ;
2521 if (!sliceSet.
empty()) {
2536 delete posProjCompList ;
2537 delete negProjCompList ;
2569 for(
auto * rrvFitRes : static_range_cast<RooRealVar*>(fr.
floatParsFinal())) {
2571 auto rrvInAbsReal =
static_cast<RooRealVar const*
>(allParamsInAbsReal.
find(*rrvFitRes));
2578 if (rrvFitRes->getError() <= std::abs(rrvFitRes->getVal()) * std::numeric_limits<double>::epsilon())
continue;
2581 if(!rrvInAbsReal)
continue;
2585 if(std::abs(rrvInAbsReal->getVal() - rrvFitRes->getVal()) > 0.01 * rrvFitRes->getError()) {
2586 std::stringstream errMsg;
2587 errMsg <<
"RooAbsReal::getPropagatedError(): the parameters of the RooAbsReal don't have"
2588 <<
" the same values as in the fit result! The logic of getPropagatedError is broken in this case.";
2590 throw std::runtime_error(errMsg.str());
2593 paramList.
add(*rrvInAbsReal);
2596 std::vector<double> plusVar;
2597 std::vector<double> minusVar;
2598 plusVar.reserve(paramList.
size());
2599 minusVar.reserve(paramList.
size());
2606 for (
Int_t ivar=0 ; ivar<paramList.
getSize() ; ivar++) {
2608 auto& rrv =
static_cast<RooRealVar&
>(paramList[ivar]);
2610 double cenVal = rrv.
getVal() ;
2611 double errVal = sqrt(V(ivar,ivar)) ;
2614 rrv.setVal(cenVal+errVal) ;
2615 plusVar.push_back(
getVal(nset)) ;
2618 rrv.setVal(cenVal-errVal) ;
2619 minusVar.push_back(
getVal(nset)) ;
2621 rrv.setVal(cenVal) ;
2634 std::vector<double> errVec(paramList.
size()) ;
2635 for (
int i=0 ; i<paramList.
getSize() ; i++) {
2636 errVec[i] = std::sqrt(V(i,i)) ;
2637 for (
int j=i ; j<paramList.
getSize() ; j++) {
2638 C(i,j) = V(i,j) / std::sqrt(V(i,i)*V(j,j));
2645 for (
unsigned int j=0 ; j<plusVar.size() ; j++) {
2646 F[j] = (plusVar[j]-minusVar[j])/2 ;
2650 double sum =
F*(C*
F) ;
2697 for (
auto * cmd : static_range_cast<RooCmdArg*>(plotArgListTmp)) {
2698 if (std::string(
"Normalization")==cmd->GetName()) {
2701 plotArgList.
Add(cmd) ;
2704 plotArgList.
Add(cmd) ;
2711 auto plotFunc = [&](
RooAbsReal const& absReal) {
2714 absReal.plotOn(frame, tmp);
2721 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":plotOnWithErrorBand: no curve for central value available" << std::endl;
2724 frame->
remove(
nullptr,
false) ;
2748 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") INFO: visualizing " << Z <<
"-sigma uncertainties in parameters "
2749 << errorParams <<
" from fit result " << fr.
GetName() <<
" using " <<
n <<
" samplings." << std::endl ;
2754 std::unique_ptr<RooDataSet> generatedData{paramPdf->
generate(errorParams,
n)};
2755 std::vector<RooCurve*> cvec ;
2756 for (
int i=0 ; i<generatedData->numEntries() ; i++) {
2757 cloneParams.
assign(*generatedData->get(i)) ;
2758 plotFunc(*cloneFunc);
2759 cvec.push_back(frame->
getCurve()) ;
2760 frame->
remove(
nullptr,
false) ;
2772 for (std::vector<RooCurve*>::iterator i=cvec.begin() ; i!=cvec.end() ; ++i) {
2790 for (
auto const* frv : static_range_cast<RooRealVar*>(fr.
floatParsFinal())) {
2791 if (frv->getError() > frv->getVal() * std::numeric_limits<double>::epsilon()) {
2792 fpf_stripped.
add(*frv);
2810 std::vector<int> fpf_idx ;
2814 paramList.
add(*par) ;
2815 fpf_idx.push_back(i) ;
2819 std::vector<RooCurve*> plusVar, minusVar ;
2828 for (
Int_t ivar=0 ; ivar<paramList.
getSize() ; ivar++) {
2832 double cenVal = rrv.
getVal() ;
2833 double errVal = sqrt(V(ivar,ivar)) ;
2836 ((
RooRealVar*)paramList.
at(ivar))->setVal(cenVal+Z*errVal) ;
2839 plotFunc(*cloneFunc);
2840 plusVar.push_back(frame->
getCurve()) ;
2841 frame->
remove(
nullptr,
false) ;
2845 ((
RooRealVar*)paramList.
at(ivar))->setVal(cenVal-Z*errVal) ;
2846 plotFunc(*cloneFunc);
2847 minusVar.push_back(frame->
getCurve()) ;
2848 frame->
remove(
nullptr,
false) ;
2854 std::vector<double> errVec(paramList.
size()) ;
2855 for (
int i=0 ; i<paramList.
getSize() ; i++) {
2856 errVec[i] = sqrt(V(i,i)) ;
2857 for (
int j=i ; j<paramList.
getSize() ; j++) {
2858 C(i,j) = V(i,j)/sqrt(V(i,i)*V(j,j)) ;
2868 for (std::vector<RooCurve*>::iterator i=plusVar.begin() ; i!=plusVar.end() ; ++i) {
2871 for (std::vector<RooCurve*>::iterator i=minusVar.begin() ; i!=minusVar.end() ; ++i) {
2878 if (!band)
return frame ;
2883 pc.
defineString(
"curveNameSuffix",
"CurveNameSuffix",0,
"") ;
2884 pc.
defineInt(
"lineColor",
"LineColor",0,-999) ;
2885 pc.
defineInt(
"lineStyle",
"LineStyle",0,-999) ;
2886 pc.
defineInt(
"lineWidth",
"LineWidth",0,-999) ;
2887 pc.
defineInt(
"markerColor",
"MarkerColor",0,-999) ;
2888 pc.
defineInt(
"markerStyle",
"MarkerStyle",0,-999) ;
2890 pc.
defineInt(
"fillColor",
"FillColor",0,-999) ;
2891 pc.
defineInt(
"fillStyle",
"FillStyle",0,-999) ;
2893 pc.
defineInt(
"curveInvisible",
"Invisible",0,0) ;
2894 pc.
defineInt(
"moveToBack",
"MoveToBack",0,0) ;
2925 if (pc.
getString(
"curveName",
nullptr,
true)) {
2927 }
else if (pc.
getString(
"curveNameSuffix",
nullptr,
true)) {
2951 if(
nullptr == frame) {
2960 <<
":plotOn: frame does not specify a plot variable" << std::endl;
2973 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":plotOn: WARNING: variable is not an explicit dependent: "
2974 << var->
GetName() << std::endl;
2992 RooArgSet& projectedVars,
bool silent)
const
2994 cxcoutD(Plotting) <<
"RooAbsReal::makeProjectionSet(" <<
GetName() <<
") plotVar = " << plotVar->
GetName()
2995 <<
" allVars = " << (allVars?(*allVars):
RooArgSet()) << std::endl ;
2998 if (!allVars) return ;
3001 projectedVars.
add(*allVars) ;
3006 projectedVars.
remove(*found);
3009 std::unique_ptr<RooArgSet> plotServers{plotVar->
getObservables(&projectedVars)};
3013 cxcoutD(Plotting) <<
"RooAbsReal::makeProjectionSet(" <<
GetName() <<
") removing " << tmp->
GetName()
3014 <<
" from projection set because it a server of " << plotVar->
GetName() << std::endl ;
3015 projectedVars.
remove(*tmp) ;
3021 <<
") WARNING: cannot project out frame variable ("
3022 << found->
GetName() <<
"), ignoring" << std::endl ;
3029 projectedVars.
remove(*arg,
true) ;
3032 <<
") function doesn't depend on projection variable "
3033 << arg->
GetName() <<
", ignoring" << std::endl ;
3070 auto binding = std::make_unique<RooRealBinding>(*
this,vars,nset,clipInvalid);
3071 if(!binding->isValid()) {
3072 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":bindVars: cannot bind to " << vars << std::endl ;
3087 auto other =
static_cast<const RooAbsReal*
>(source);
3088 assert(
dynamic_cast<const RooAbsReal*
>(source));
3090 _value = other->_treeReadBuffer ? other->_treeReadBuffer->operator
double() : other->_value;
3130 coutE(Eval) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") ERROR: TTree branch " <<
GetName()
3131 <<
" is an array and cannot be attached to a RooAbsReal" << std::endl ;
3141 std::map<std::string, std::pair<std::string, std::function<std::unique_ptr<TreeReadBuffer>()>>> typeMap {
3142 {
"Float_t", {
"FLOAT_TREE_BRANCH", [&](){
return createTreeReadBuffer<Float_t >(cleanName, t); }}},
3143 {
"Int_t", {
"INTEGER_TREE_BRANCH", [&](){
return createTreeReadBuffer<Int_t >(cleanName, t); }}},
3144 {
"UChar_t", {
"BYTE_TREE_BRANCH", [&](){
return createTreeReadBuffer<UChar_t >(cleanName, t); }}},
3145 {
"Bool_t", {
"BOOL_TREE_BRANCH", [&](){
return createTreeReadBuffer<Bool_t >(cleanName, t); }}},
3146 {
"Char_t", {
"SIGNEDBYTE_TREE_BRANCH", [&](){
return createTreeReadBuffer<Char_t >(cleanName, t); }}},
3147 {
"UInt_t", {
"UNSIGNED_INTEGER_TREE_BRANCH", [&](){
return createTreeReadBuffer<UInt_t >(cleanName, t); }}},
3148 {
"Long64_t", {
"LONG_TREE_BRANCH", [&](){
return createTreeReadBuffer<Long64_t >(cleanName, t); }}},
3149 {
"ULong64_t", {
"UNSIGNED_LONG_TREE_BRANCH", [&](){
return createTreeReadBuffer<ULong64_t>(cleanName, t); }}},
3150 {
"Short_t", {
"SHORT_TREE_BRANCH", [&](){
return createTreeReadBuffer<Short_t >(cleanName, t); }}},
3151 {
"UShort_t", {
"UNSIGNED_SHORT_TREE_BRANCH", [&](){
return createTreeReadBuffer<UShort_t >(cleanName, t); }}},
3154 auto typeDetails = typeMap.find(typeName.
Data());
3155 if (typeDetails != typeMap.end()) {
3156 coutI(DataHandling) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") TTree " << typeDetails->first <<
" branch " <<
GetName()
3157 <<
" will be converted to double precision." << std::endl ;
3167 coutE(InputArguments) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") data type " << typeName <<
" is not supported." << std::endl ;
3189 coutE(Eval) <<
"RooAbsReal::fillTreeBranch(" <<
GetName() <<
") ERROR: not attached to tree: " <<
cleanBranchName() << std::endl ;
3218 fund->removeRange();
3220 fund->setAttribute(
"fundamentalCopy");
3221 return RooFit::Detail::owningPtr<RooAbsArg>(std::move(fund));
3327 const TList &nameList)
const
3330 bool isMatched(
true);
3331 for(
auto *
name : static_range_cast<TObjString*>(nameList)) {
3334 matched.
add(*found);
3348 if(isMatched) matchedArgs.
add(matched);
3397 if (config)
return config ;
3410 if (config)
return config ;
3504 static bool inLogEvalError = false ;
3506 if (inLogEvalError) {
3509 inLogEvalError = true ;
3514 if (serverValueString) {
3519 oocoutE(
nullptr,Eval) <<
"RooAbsReal::logEvalError(" <<
"<STATIC>" <<
") evaluation error, " << std::endl
3520 <<
" origin : " << origName << std::endl
3521 <<
" message : " << ee.
_msg << std::endl
3522 <<
" server values: " << ee.
_srvval << std::endl ;
3529 inLogEvalError = false ;
3559 static bool inLogEvalError = false ;
3561 if (inLogEvalError) {
3564 inLogEvalError = true ;
3569 if (serverValueString) {
3572 std::string srvval ;
3573 std::ostringstream oss ;
3584 p->print(oss,
true) ;
3589 std::ostringstream oss2 ;
3593 coutE(Eval) <<
"RooAbsReal::logEvalError(" <<
GetName() <<
") evaluation error, " << std::endl
3594 <<
" origin : " << oss2.str() << std::endl
3595 <<
" message : " << ee.
_msg << std::endl
3596 <<
" server values: " << ee.
_srvval << std::endl ;
3605 <<
") delayed evaluation error, " << std::endl
3606 <<
" origin : " << oss2.str() << std::endl
3607 <<
" message : " << oee.
_msg << std::endl
3608 <<
" server values: " << oee.
_srvval << std::endl ;
3615 inLogEvalError = false ;
3671 if (maxPerNode<0) return ;
3674 if (maxPerNode==0) {
3677 os << iter->second.first ;
3679 os <<
" has " << iter->second.second.size() <<
" errors" << std::endl ;
3684 os << iter->second.first << std::endl ;
3688 for(
auto iter2 = iter->second.second.begin();iter2!=iter->second.second.end() ; ++iter2, i++) {
3689 os <<
" " << iter2->_msg <<
" @ " << iter2->_srvval << std::endl ;
3691 os <<
" ... (remaining " << iter->second.second.size() - maxPerNode <<
" messages suppressed)" << std::endl ;
3712 ntot += elem.second.second.size() ;
3732 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*compSet)) {
3734 if (!addNormSet.
empty()) {
3735 pdf->selectNormalization(&addNormSet,force) ;
3737 pdf->selectNormalization(
nullptr,force) ;
3757 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*compSet)) {
3759 pdf->selectNormalizationRange(rangeName,force) ;
3777 orderedObs.
add(obs) ;
3835 pc.
defineSet(
"supNormSet",
"SupNormSet",0,
nullptr) ;
3836 pc.
defineInt(
"numScanBins",
"ScanParameters",0,1000) ;
3837 pc.
defineInt(
"intOrder",
"ScanParameters",1,2) ;
3838 pc.
defineInt(
"doScanNum",
"ScanNum",0,1) ;
3839 pc.
defineInt(
"doScanAll",
"ScanAll",0,0) ;
3840 pc.
defineInt(
"doScanNon",
"ScanNone",0,0) ;
3844 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
3872 coutI(NumIntegration) <<
"RooAbsPdf::createRunningIntegral(" <<
GetName() <<
") integration over observable(s) " << iset <<
" involves numeric integration," << std::endl
3873 <<
" constructing cdf though numeric integration of sampled pdf in " << numScanBins <<
" bins and applying order "
3874 << intOrder <<
" interpolation on integrated histogram." << std::endl
3875 <<
" To override this choice of technique use argument ScanNone(), to change scan parameters use ScanParameters(nbins,order) argument" << std::endl ;
3893 ivar->
setBins(numScanBins,
"numcdf") ;
3894 auto ret = std::make_unique<RooNumRunningInt>(
name.c_str(),
name.c_str(),*
this,*ivar,
"numrunint") ;
3895 ret->setInterpolationOrder(intOrder) ;
3914 coutW(InputArguments) <<
"RooAbsPdf::createRunningIntegral(" <<
GetName() <<
") WARNING ignoring non-RooRealVar input argument " << arg->
GetName() << std::endl ;
3928 for(
auto * rrv : static_range_cast<RooRealVar*>(ilist)) {
3932 cloneList.
add(*cloneArg) ;
3937 cloneLo->
setVal(rrv->getMin()) ;
3938 loList.
add(*cloneLo) ;
3950 finalNset.
add(cloneList,
true) ;
3951 std::unique_ptr<RooAbsReal> cdf{tmp->
createIntegral(cloneList,finalNset,
"CDF")};
3954 cdf->addOwnedComponents(*tmp) ;
3955 cdf->addOwnedComponents(cloneList) ;
3956 cdf->addOwnedComponents(loList) ;
3970 if (realObs.
size() != obs.
size()) {
3971 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified observables are not variables of this p.d.f" << std::endl ;
3976 if (realPars.
size() != pars.
size()) {
3977 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified parameters are not variables of this p.d.f" << std::endl ;
3995 if (realObs.
size() != obs.
size()) {
3996 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified observables are not variables of this p.d.f" << std::endl ;
4001 if (realPars.
size() != pars.
size()) {
4002 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified parameters are not variables of this p.d.f" << std::endl ;
4007 for (
int i=0 ; i<obs.
getSize() ; i++) {
4009 coutE(ObjectHandling) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: proposed observable " << obs.
at(0)->
GetName() <<
" is not of type RooRealVar" << std::endl ;
4013 for (
int i=0 ; i<pars.
getSize() ; i++) {
4015 coutE(ObjectHandling) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: proposed parameter " << pars.
at(0)->
GetName() <<
" is not of type RooRealVar" << std::endl ;
4046 coutE(InputArguments) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: " << obs.
size()
4047 <<
" observables specified, but a ROOT TFx can only have 1,2 or 3 observables" << std::endl ;
4052 for (
int i=0 ; i<pars.
getSize() ; i++) {
4082 return new RooDerivative(
name.c_str(),title.c_str(),*
this,obs,normSet,order,eps) ;
4097 std::string title=
Form(
"%sMoment of order %d of %s w.r.t %s ",(central?
"Central ":
""),order,
GetName(),obs.
GetName()) ;
4099 if (order==2)
return new RooSecondMoment(
name.c_str(),title.c_str(),*
this,obs,central,takeRoot) ;
4100 return new RooMoment(
name.c_str(),title.c_str(),*
this,obs,order,central,takeRoot) ;
4116 std::string title=
Form(
"%sMoment of order %d of %s w.r.t %s ",(central?
"Central ":
""),order,
GetName(),obs.
GetName()) ;
4118 if (order==1)
return new RooFirstMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,intNormObs) ;
4119 if (order==2)
return new RooSecondMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,central,takeRoot,intNormObs) ;
4120 return new RooMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,order,central,takeRoot,intNormObs) ;
4214 auto createChi2DataHistCmdArgs =
"Range,RangeWithName,NumCPU,Optimize,IntegrateBins,ProjectedObservables,"
4215 "AddCoefRange,SplitRange,DataError,Extended";
4249#ifdef ROOFIT_LEGACY_EVAL_BACKEND
4252 std::string baseName =
"chi2_" + std::string(
GetName()) +
"_" +
data.GetName();
4257 auto chi2 = std::make_unique<RooChi2Var>(baseName.c_str(), baseName.c_str(), *
this,
data, arg1, arg2, arg3, arg4,
4258 arg5, arg6, arg7, arg8);
4263 throw std::runtime_error(
"createChi2() is not supported without the legacy evaluation backend");
4281 for(
auto * arg : static_range_cast<RooCmdArg*>(cmdList)) {
4288 return createChi2(
data,*cmds[0],*cmds[1],*cmds[2],*cmds[3],*cmds[4],*cmds[5],*cmds[6],*cmds[7]) ;
4352 auto createChi2DataSetCmdArgs =
"YVar,Integrate,RangeWithName,NumCPU,Verbose";
4363 std::unique_ptr<RooAbsReal> xychi2{
createChi2(xydata, chi2CmdList)};
4402#ifdef ROOFIT_LEGACY_EVAL_BACKEND
4406 pc.
defineInt(
"integrate",
"Integrate", 0, 0);
4408 pc.
defineString(
"rangeName",
"RangeWithName", 0,
"",
true);
4410 pc.
defineInt(
"interleave",
"NumCPU", 1, 0);
4411 pc.
defineInt(
"verbose",
"Verbose", 0, 0);
4420 bool integrate = pc.
getInt(
"integrate");
4422 const char *rangeName = pc.
getString(
"rangeName", 0,
true);
4426 if (numcpu_strategy == 3 && !this->
InheritsFrom(
"RooSimultaneous")) {
4427 coutW(Minimization) <<
"Cannot use a NumCpu Strategy = 3 when the pdf is not a RooSimultaneous, "
4428 "falling back to default strategy = 0"
4430 numcpu_strategy = 0;
4433 bool verbose = pc.
getInt(
"verbose");
4436 cfg.
rangeName = rangeName ? rangeName :
"";
4442 std::string
name =
"chi2_" + std::string(
GetName()) +
"_" +
data.GetName();
4445 std::make_unique<RooXYChi2Var>(
name.c_str(),
name.c_str(), *
this,
data, yvar, integrate, cfg));
4447 throw std::runtime_error(
"createChi2() is not supported without the legacy evaluation backend");
4481 for (
auto const* arg : paramVars) {
4483 coutW(InputArguments) <<
"RooAbsReal::setParameterizeIntegral(" <<
GetName()
4484 <<
") function does not depend on listed parameter " << arg->
GetName() <<
", ignoring" << std::endl ;
4487 if (!plist.empty()) plist +=
":" ;
4504 std::span<const double> batch;
4510 std::vector<ServerData> ourServers;
4513 for (
auto server :
servers()) {
4514 auto serverValues = dataMap.
at(server);
4515 if(serverValues.empty())
continue;
4518 auto oldOperMode = server->operMode();
4523 ourServers.push_back({server,
4527 server->_valueDirty,
4528 server->_shapeDirty});
4534 struct RestoreStateRAII {
4535 RestoreStateRAII(std::vector<ServerData>& servers) :
4536 _servers{servers} { }
4538 ~RestoreStateRAII() {
4539 for (
auto& serverData : _servers) {
4540 serverData.server->setCachedValue(serverData.oldValue,
true);
4541 serverData.server->setOperMode(serverData.oldOperMode);
4542 serverData.server->_valueDirty = serverData.oldValueDirty;
4543 serverData.server->_shapeDirty = serverData.oldShapeDirty;
4547 std::vector<ServerData>& _servers;
4548 } restoreState{ourServers};
4554 coutI(FastEvaluations) <<
"The class " <<
ClassName() <<
" does not implement the faster batch evaluation interface."
4555 <<
" Consider requesting or implementing it to benefit from a speed up." << std::endl;
4561 for (std::size_t i=0; i < nEvents; ++i) {
4562 for (
auto& serv : ourServers) {
4563 serv.server->setCachedValue(serv.batch[std::min(i, serv.batch.size()-1)],
false);
4581 std::stringstream errorMsg;
4582 errorMsg <<
"An analytical integral function for class \"" <<
ClassName() <<
"\" has not yet been implemented.";
4583 coutE(Minimization) << errorMsg.str() << std::endl;
4584 throw std::runtime_error(errorMsg.str().c_str());
4589 const bool tmpFast =
_fast;
4590 const double tmp =
_value;
4592 double fullEval = 0.;
4594 fullEval =
getValV(normalisationSet);
4603 if (std::isfinite(ret) && ( ret != 0. ? (ret - fullEval)/ret : ret - fullEval) > 1.E-9) {
4608 formatter <<
"--> (Scalar computation wrong here:)\n"
4609 <<
GetName() <<
" " <<
this <<
" _fast=" << tmpFast
4610 <<
"\n\tcached _value=" << std::setprecision(16) << tmp
4611 <<
"\n\treturning =" << ret
4612 <<
"\n\trecomputed =" << fullEval
4613 <<
"\n\tnew _value =" <<
_value <<
"] ";
4614 formatter <<
"\nServers:";
4628 bool nameChange,
bool isRecursiveStep)
4640 if(
auto realArg =
dynamic_cast<RooAbsReal*
>(arg)) {
4641 realArg->enableOffsetting(flag) ;
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
static void indent(ostringstream &buf, int indent_level)
winID h TVirtualViewer3D TVirtualGLPainter p
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 result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t SetLineColor
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
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 Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t format
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
R__EXTERN TSystem * gSystem
Common abstract base class for objects that represent a value and a "shape" in RooFit.
bool dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr, bool valueOnly=false) const
Test whether we depend on (ie, are served by) any object in the specified collection.
bool recursiveRedirectServers(const RooAbsCollection &newServerList, bool mustReplaceAll=false, bool nameChange=false, bool recurseInNewSet=true)
Recursively replace all servers with the new servers in newSet.
const TNamed * namePtr() const
De-duplicated pointer to this object's name.
void setShapeDirty()
Notify that a shape-like property (e.g. binning) has changed.
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
bool isValueDirtyAndClear() const
RooFit::OwningPtr< RooArgSet > getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooFit::OwningPtr< RooArgSet > getObservables(const RooArgSet &set, bool valueOnly=true) const
Given a set of possible observables, return the observables that this PDF depends on.
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
RooFit::OwningPtr< RooArgSet > getComponents() const
Create a RooArgSet with all components (branch nodes) of the expression tree headed by this object.
const RefCountList_t & servers() const
List of all servers of this object.
bool dependsOnValue(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr) const
Check whether this object depends on values from an element in the serverList.
void removeStringAttribute(const Text_t *key)
Delete a string attribute with a given key.
void setValueDirty()
Mark the element dirty. This forces a re-evaluation when a value is requested.
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree)
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Implement multi-line detailed printing.
virtual RooAbsArg * cloneTree(const char *newname=nullptr) const
Clone tree expression of objects.
TString cleanBranchName() const
Construct a mangled name from the actual name that is free of any math symbols that might be interpre...
Int_t numProxies() const
Return the number of registered proxies.
static bool _inhibitDirty
void setAttribute(const Text_t *name, bool value=true)
Set (default) or clear a named boolean attribute of this object.
void setProxyNormSet(const RooArgSet *nset)
Forward a change in the cached normalization argset to all the registered proxies.
void branchNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=nullptr, bool recurseNonDerived=false) const
Fill supplied list with all branch nodes of the arg tree starting with ourself as top node.
RooAbsProxy * getProxy(Int_t index) const
Return the nth proxy from the proxy list.
TObject * Clone(const char *newname=nullptr) const override
Make a clone of an object using the Streamer facility.
RefCountList_t _serverList
void leafNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=nullptr, bool recurseNonDerived=false) const
Fill supplied list with all leaf nodes of the arg tree, starting with ourself as top node.
virtual bool isFundamental() const
Is this object a fundamental type that can be added to a dataset? Fundamental-type subclasses overrid...
virtual bool redirectServersHook(const RooAbsCollection &newServerList, bool mustReplaceAll, bool nameChange, bool isRecursiveStep)
Function that is called at the end of redirectServers().
virtual bool checkObservables(const RooArgSet *nset) const
Overloadable function in which derived classes can implement consistency checks of the variables.
void treeNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=nullptr, bool doBranch=true, bool doLeaf=true, bool valueOnly=false, bool recurseNonDerived=false) const
Fill supplied list with nodes of the arg tree, following all server links, starting with ourself as t...
RooAbsBinning is the abstract base class for RooRealVar binning definitions.
virtual bool isParameterized() const
Interface function.
virtual RooAbsReal * highBoundFunc() const
Return pointer to RooAbsReal parameterized upper bound, if any.
virtual RooAbsReal * lowBoundFunc() const
Return pointer to RooAbsReal parameterized lower bound, if any.
Abstract base class for objects that represent a discrete value that can be set from the outside,...
virtual bool setIndex(value_type index, bool printError=true)=0
Change category state by specifying the index code of the desired state.
A space to attach TBranches.
virtual value_type getCurrentIndex() const
Return index number of current state.
bool isSignType(bool mustHaveZero=false) const
Determine if category has 2 or 3 states with index values -1,0,1.
Abstract container object that can hold multiple RooAbsArg objects.
RooFit::UniqueId< RooAbsCollection > const & uniqueId() const
Returns a unique ID that is different for every instantiated RooAbsCollection.
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
Int_t getSize() const
Return the number of elements in the collection.
const char * GetName() const override
Returns name of object.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.