104#include <sys/types.h>
110class ScaledDataWeightedAverage :
public RooAbsFunc {
113 :
RooAbsFunc{1}, _var{var}, _dataWeights{
data.getWeightBatch(0,
data.numEntries())}, _scaleFactor{scaleFactor}
116 _arg->recursiveRedirectServers(
RooArgList{var});
117 _evaluator = std::make_unique<RooFit::Evaluator>(*_arg);
118 std::stack<std::vector<double>>{}.swap(_vectorBuffers);
119 auto dataSpans = RooFit::BatchModeDataHelpers::getDataSpans(
data,
"",
nullptr,
false,
122 for (
auto const& item : dataSpans) {
123 _evaluator->setInput(item.first->GetName(), item.second,
false);
127 double operator()(
const double xvector[])
const override
129 double oldVal = _var.getVal();
130 _var.setVal(xvector[0]);
133 std::span<const double> pdfValues = _evaluator->run();
134 if (_dataWeights.empty()) {
135 out = std::accumulate(pdfValues.begin(), pdfValues.end(), 0.0) / pdfValues.size();
137 double weightsSum = 0.0;
138 for (std::size_t i = 0; i < pdfValues.size(); ++i) {
139 out += pdfValues[i] * _dataWeights[i];
140 weightsSum += _dataWeights[i];
154 std::unique_ptr<RooAbsReal> _arg;
155 std::span<const double> _dataWeights;
157 std::unique_ptr<RooFit::Evaluator> _evaluator;
158 std::stack<std::vector<double>> _vectorBuffers;
161struct EvalErrorData {
162 using ErrorList = std::map<const RooAbsArg *, std::pair<std::string, std::list<RooAbsReal::EvalError>>>;
168EvalErrorData &evalErrorData()
170 static EvalErrorData
data;
178 return evalErrorData().errorList.size();
183 return evalErrorData().errorList.begin();
214 double inMaxVal,
const char *unit) :
215 RooAbsArg(
name,title), _plotMin(inMinVal), _plotMax(inMaxVal), _unit(unit)
225 RooAbsArg(other,
name), _plotMin(other._plotMin), _plotMax(other._plotMax),
226 _plotBins(other._plotBins), _value(other._value), _unit(other._unit), _label(other._label),
227 _forceNumInt(other._forceNumInt), _selectComp(other._selectComp)
272 if (!assumeSameType) {
287 if(appendUnit && 0 != strlen(
getUnit())) {
332 <<
"): validation failed: " <<
value << std::endl ;
352 const RooArgSet* ,
const char* rangeName)
const
383 if (code==0)
return getVal(normSet) ;
397 coutF(Eval) <<
"RooAbsReal::analyticalIntegral(" <<
GetName() <<
") code " << code <<
" not implemented" << std::endl ;
458 os <<
indent <<
"--- RooAbsReal ---" << std::endl;
476 for (
auto const& arg : paramsOfInterest) {
487 auto out = std::make_unique<RooProfileLL>(
name.c_str(),(std::string(
"Profile of ") +
GetTitle()).c_str(),*
this,paramsOfInterest);
488 return RooFit::makeOwningPtr<RooAbsReal>(std::move(out));
520 pc.
defineString(
"rangeName",
"RangeWithName",0,
"",
true) ;
521 pc.
defineSet(
"normSet",
"NormSet",0,
nullptr) ;
522 pc.
defineObject(
"numIntConfig",
"NumIntConfig",0,
nullptr) ;
525 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
531 const char* rangeName = pc.
getString(
"rangeName",
nullptr,
true) ;
556 if (!rangeName || strchr(rangeName,
',')==
nullptr) {
562 std::vector<std::string> tokens =
ROOT::Split(rangeName,
",");
565 std::stringstream errMsg;
566 errMsg <<
GetName() <<
" : integrating with respect to the variables " << iset <<
" on the ranges \"" << rangeName
567 <<
"\" is not possible because the ranges are overlapping";
568 const std::string errMsgString = errMsg.str();
569 coutE(Integration) << errMsgString << std::endl;
570 throw std::invalid_argument(errMsgString);
574 for (
const std::string& token : tokens) {
578 const std::string title = std::string(
"Integral of ") +
GetTitle();
581 auto out = std::make_unique<RooAddition>(fullName.c_str(), title.c_str(), components);
582 out->addOwnedComponents(std::move(components));
583 return RooFit::makeOwningPtr<RooAbsReal>(std::move(out));
601 std::unique_ptr<RooAbsReal> integral;
606 const std::string title = std::string(
"Integral of ") +
GetTitle();
609 auto out = std::make_unique<RooRealIntegral>(
name.c_str(), title.c_str(), *
this, iset, nset, cfg, rangeName);
610 return RooFit::makeOwningPtr<RooAbsReal>(std::move(out));
614 while(!iset.
empty()) {
623 if (innerSet.
empty()) {
629 const std::string title = std::string(
"Integral of ") + integrand->
GetTitle();
632 std::unique_ptr<RooAbsReal> innerIntegral = std::move(integral);
635 integral = std::make_unique<RooRealIntegral>(
name.c_str(),title.c_str(),*integrand,innerSet,nset,cfg,rangeName);
639 integral->addOwnedComponents(std::move(innerIntegral));
646 if (integrand ==
this && !iset.
empty()) {
647 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 ;
651 integrand = integral.get();
659 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;
666 if (cacheParamsStr && strlen(cacheParamsStr)) {
668 std::unique_ptr<RooArgSet> intParams{integral->getVariables()};
672 if (!cacheParams.
empty()) {
673 cxcoutD(Caching) <<
"RooAbsReal::createIntObj(" <<
GetName() <<
") INFO: constructing " << cacheParams.
size()
674 <<
"-dim value cache for integral over " << iset2 <<
" as a function of " << cacheParams <<
" in range " << (rangeName?rangeName:
"<none>") << std::endl ;
676 auto cachedIntegral = std::make_unique<RooCachedReal>(
name.c_str(),
name.c_str(),*integral,cacheParams);
677 cachedIntegral->setInterpolationOrder(2) ;
678 cachedIntegral->addOwnedComponents(std::move(integral));
679 cachedIntegral->setCacheSource(
true) ;
680 if (integral->operMode()==
ADirty) {
681 cachedIntegral->setOperMode(
ADirty) ;
684 return RooFit::makeOwningPtr<RooAbsReal>(std::move(cachedIntegral));
712 for (
const auto aarg : allObs) {
717 RooAbsBinning& binning = arglv->getBinning(rangeName,
false,
true) ;
726 obsWithParamRange.
add(*aarg) ;
727 obsWithFixedRange.
remove(*aarg) ;
728 obsServingAsRangeParams.
add(loBoundObs,
false) ;
729 obsServingAsRangeParams.
add(hiBoundObs,
false) ;
736 RooArgSet obsWithFixedRangeNP(obsWithFixedRange) ;
737 obsWithFixedRangeNP.
remove(obsServingAsRangeParams) ;
740 RooArgSet obsWithParamRangeNP(obsWithParamRange) ;
741 obsWithParamRangeNP.
remove(obsServingAsRangeParams) ;
745 innerObs.
add(obsWithFixedRangeNP) ;
746 innerObs.
add(obsWithParamRangeNP) ;
764 }
else if (!omitEmpty) {
768 if (nset && !nset->
empty()) {
829 for (
const auto arg : dependentVars) {
832 <<
"\" of wrong type: " << arg->
ClassName() << std::endl;
839 <<
"\" is not a dependent and will be ignored." << std::endl;
844 leafNodes.
replace(*found,*arg);
846 leafNodes.
add(*arg) ;
851 for (
const auto lvs : lvDep) {
855 leafNodes.
add(*lvs) ;
862 if(
nullptr != projectedVars && projectedVars->
find(arg->
GetName())) {
864 <<
"\" cannot be both a dependent and a projected variable." << std::endl;
870 if(
nullptr != projectedVars) leafNodes.
remove(*projectedVars,
true);
875 coutE(Plotting) <<
"RooAbsPdf::createPlotProjection(" <<
GetName() <<
") Couldn't deep-clone PDF, abort," << std::endl ;
886 std::unique_ptr<RooArgSet> plotLeafNodes{leafNodes.
selectCommon(dependentVars)};
891 if(
nullptr != projectedVars) normSet.
add(*projectedVars);
892 if(
nullptr != condObs) {
893 normSet.
remove(*condObs,
true,
true) ;
900 if(
nullptr == projectedVars) projectedVars= ∅
905 std::string title = std::string{
"Projection of "} +
GetTitle();
907 std::unique_ptr<RooAbsReal> projected{theClone->
createIntegral(*projectedVars,normSet,rangeName)};
909 if(
nullptr == projected || !projected->isValid()) {
910 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":createPlotProjection: cannot integrate out ";
919 projected->SetName(
name.c_str()) ;
920 projected->SetTitle(title.c_str()) ;
924 cloneSet->
addOwned(std::move(projected));
948 double scaleFactor,
const RooArgSet *projectedVars,
bool scaleForDensity,
949 const RooArgSet* condObs,
bool setError)
const
952 if(
nullptr == hist) {
953 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: no valid histogram to fill" << std::endl;
959 if(hdim !=
int(plotVars.
size())) {
960 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: plotVars has the wrong dimension" << std::endl;
971 if(
nullptr == realVar) {
973 <<
"\" of type " << var->
ClassName() << std::endl;
978 <<
":fillHistogram: WARNING: variable is not an explicit dependent: " << realVar->
GetName() << std::endl;
991 allDeps.
add(*projectedVars) ;
994 coutE(InputArguments) <<
"RooAbsReal::fillHistogram(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
1002 cxcoutD(Plotting) <<
"RooAbsReal::fillHistogram(" <<
GetName() <<
") plot projection object is " << projected->
GetName() << std::endl ;
1011 TAxis *xaxis =
nullptr;
1012 TAxis *yaxis =
nullptr;
1013 TAxis *zaxis =
nullptr;
1019 assert(
nullptr != zvar &&
nullptr != zaxis);
1020 if (scaleForDensity) {
1028 assert(
nullptr != yvar &&
nullptr != yaxis);
1029 if (scaleForDensity) {
1037 assert(
nullptr != xvar &&
nullptr != xaxis);
1038 if (scaleForDensity) {
1043 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: cannot fill histogram with "
1044 << hdim <<
" dimensions" << std::endl;
1054 Int_t bins= xbins*ybins*zbins;
1055 for(
Int_t bin= 0; bin < bins; bin++) {
1058 if(bin % (xbins*ybins) == 0) {
1064 if(bin % xbins == 0) {
1065 ybin= (ybin%ybins) + 1;
1070 xbin= (xbin%xbins) + 1;
1074 coutE(InputArguments) <<
"RooAbsReal::fillHistogram: Internal Error!" << std::endl;
1080 coutW(Plotting) <<
"WARNING: Function evaluation error(s) at coordinates [x]=" << xvar->
getVal() ;
1081 if (hdim==2)
ccoutW(Plotting) <<
" [y]=" << yvar->
getVal() ;
1082 if (hdim==3)
ccoutW(Plotting) <<
" [z]=" << zvar->
getVal() ;
1083 ccoutW(Plotting) << std::endl ;
1125 bool correctForBinSize,
bool showProgress)
const
1128 if(
nullptr == hist) {
1129 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillDataHist: no valid RooDataHist to fill" << std::endl;
1136 coutE(InputArguments) <<
"RooAbsReal::fillDataHist(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
1154 if (showProgress && (i%onePct==0)) {
1155 ccoutP(Eval) <<
"." << std::flush ;
1158 double binVal = theClone->
getVal(normSet?normSet:obs)*scaleFactor ;
1159 if (correctForBinSize) {
1162 hist->
set(i, binVal, 0.);
1188 std::vector<RooRealVar*> histVars(3,
nullptr);
1190 for(std::size_t iVar = 0; iVar < varNames.size(); ++iVar) {
1191 if(varNames[iVar].empty())
continue;
1193 std::stringstream errMsg;
1194 errMsg <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR more than three variable names passed, but maximum number of supported variables is three";
1195 coutE(Plotting) << errMsg.str() << std::endl;
1196 throw std::invalid_argument(errMsg.str());
1198 auto var =
static_cast<RooRealVar*
>(vars->find(varNames[iVar].c_str()));
1200 std::stringstream errMsg;
1201 errMsg <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR variable " << varNames[iVar] <<
" does not exist in argset: " << *vars;
1202 coutE(Plotting) << errMsg.str() << std::endl;
1203 throw std::runtime_error(errMsg.str());
1205 histVars[iVar] = var;
1287 pc.
defineInt(
"intBinning",
"IntrinsicBinning",0,2) ;
1288 pc.
defineInt(
"extended",
"Extended",0,2) ;
1290 pc.
defineSet(
"compSet",
"SelectCompSet",0);
1292 pc.
defineSet(
"projObs",
"ProjectedObservables",0,
nullptr) ;
1295 pc.
defineMutex(
"SelectCompSet",
"SelectCompSpec") ;
1297 pc.
defineMutex(
"IntrinsicBinning",
"BinningName") ;
1298 pc.
defineMutex(
"IntrinsicBinning",
"BinningSpec") ;
1317 auto projObs = pc.
getSet(
"projObs");
1320 bool doScaling = pc.
getInt(
"scaling") ;
1326 if (!pdfSelf && doExtended == 1) {
1327 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName() <<
") WARNING extended mode requested for a non-pdf object, ignored" << std::endl ;
1331 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName() <<
") WARNING extended mode requested for a non-extendable pdf, ignored" << std::endl ;
1334 if (pdfSelf && doExtended==2) {
1336 }
else if(!pdfSelf) {
1340 const char* compSpec = pc.
getString(
"compSpec") ;
1342 bool haveCompSel = ( (compSpec && strlen(compSpec)>0) || compSet) ;
1344 std::unique_ptr<RooBinning> intBinning;
1345 if (doIntBinning>0) {
1350 if (doIntBinning==1) {
1351 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName()
1352 <<
") WARNING, intrinsic model binning requested for histogram, but model does not define bin boundaries, reverting to default binning"<< std::endl ;
1355 if (doIntBinning==2) {
1356 coutI(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName()
1357 <<
") INFO: Model has intrinsic binning definition, selecting that binning for the histogram"<< std::endl ;
1359 std::vector<double> edges(bl->size());
1361 for (
auto const& elem : *bl) { edges[i++] = elem ; }
1362 intBinning = std::make_unique<RooBinning>(bl->size()-1,edges.data()) ;
1367 RooCmdConfig::stripCmdList(argListCreate,
"Scaling,ProjectedObservables,IntrinsicBinning,SelectCompSet,SelectCompSpec,Extended") ;
1369 TH1* histo(
nullptr) ;
1372 argListCreate.
Add(&tmp) ;
1388 branchNodeSet.
remove(*arg) ;
1392 std::unique_ptr<RooArgSet> dirSelNodes;
1394 dirSelNodes = std::unique_ptr<RooArgSet>{branchNodeSet.
selectCommon(*compSet)};
1396 dirSelNodes = std::unique_ptr<RooArgSet>{branchNodeSet.
selectByName(compSpec)};
1398 if (!dirSelNodes->empty()) {
1399 coutI(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") directly selected PDF components: " << *dirSelNodes << std::endl ;
1405 coutE(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR: component selection set " << *compSet <<
" does not match any components of p.d.f." << std::endl ;
1407 coutE(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR: component selection expression '" << compSpec <<
"' does not select any components of p.d.f." << std::endl ;
1413 double scaleFactor(1.0) ;
1419 fillHistogram(histo,vars,scaleFactor,intObs,doScaling,projObs,
false) ;
1446 for (
unsigned int i = 0; i < branchNodeSet.
size(); ++i) {
1447 const auto arg = branchNodeSet[i];
1449 branchNodeSet.
remove(*arg) ;
1456 for (
const auto arg : branchNodeSet) {
1465 for (
const auto arg : branchNodeSet) {
1466 for (
const auto selNode : *selNodes) {
1467 if (selNode->dependsOn(*arg,
nullptr,
true)) {
1474 for (
const auto arg : branchNodeSet) {
1475 if (arg->
dependsOn(*selNodes,
nullptr,
true)) {
1480 tmp.remove(*selNodes,
true);
1483 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") indirectly selected PDF components: " << tmp << std::endl ;
1486 for (
const auto arg : branchNodeSet) {
1487 bool select = selNodes->
find(arg->
GetName()) !=
nullptr;
1641 argList.
Add(&rnorm) ;
1645 rcmd->
setString(0, rangeString.c_str());
1655 pc.
defineString(
"projectionRangeName",
"ProjectionRange",0,
"",
true) ;
1656 pc.
defineString(
"curveNameSuffix",
"CurveNameSuffix",0,
"") ;
1657 pc.
defineString(
"sliceCatState",
"SliceCat",0,
"",
true) ;
1660 pc.
defineSet(
"sliceSet",
"SliceVars",0) ;
1661 pc.
defineObject(
"sliceCatList",
"SliceCat",0,
nullptr,
true) ;
1670 pc.
defineInt(
"doEvalError",
"EvalErrorValue",0,0) ;
1671 pc.
defineInt(
"shiftToZero",
"ShiftToZero",0,0) ;
1672 pc.
defineSet(
"projDataSet",
"ProjData",0) ;
1676 pc.
defineSet(
"errorPars",
"VisualizeError",0) ;
1677 pc.
defineInt(
"linearMethod",
"VisualizeError",0,0) ;
1678 pc.
defineInt(
"binProjData",
"ProjData",0,0) ;
1681 pc.
defineInt(
"numee",
"PrintEvalErrors",0,10) ;
1682 pc.
defineInt(
"rangeAdjustNorm",
"Range",0,0) ;
1683 pc.
defineInt(
"rangeWNAdjustNorm",
"RangeWithName",0,0) ;
1687 pc.
defineInt(
"markerColor",
"MarkerColor",0,-999) ;
1688 pc.
defineInt(
"markerStyle",
"MarkerStyle",0,-999) ;
1690 pc.
defineInt(
"lineColor",
"LineColor",0,-999) ;
1691 pc.
defineInt(
"lineStyle",
"LineStyle",0,-999) ;
1692 pc.
defineInt(
"lineWidth",
"LineWidth",0,-999) ;
1693 pc.
defineInt(
"fillColor",
"FillColor",0,-999) ;
1694 pc.
defineInt(
"fillStyle",
"FillStyle",0,-999) ;
1696 pc.
defineInt(
"curveInvisible",
"Invisible",0,0) ;
1697 pc.
defineInt(
"showProg",
"ShowProgress",0,0) ;
1699 pc.
defineInt(
"interleave",
"NumCPU",1,0) ;
1703 pc.
defineInt(
"moveToBack",
"MoveToBack",0,0) ;
1707 pc.
defineMutex(
"VisualizeError",
"VisualizeErrorData") ;
1718 if (!drawOpt.
Contains(
"P") && errFR) {
1720 pc.
getInt(
"linearMethod"));
1740 std::unique_ptr<RooArgSet> sliceSet{sliceSetTmp ?
static_cast<RooArgSet*
>(sliceSetTmp->
Clone()) :
nullptr};
1746 if (
const char* sliceCatState = pc.
getString(
"sliceCatState",
nullptr,
true)) {
1751 sliceSet = std::make_unique<RooArgSet>();
1755 auto iter = sliceCatList.
begin();
1756 for (
auto const& catToken :
ROOT::Split(sliceCatState,
",")) {
1757 if (
auto scat =
static_cast<RooCategory*
>(*iter)) {
1759 scat->setLabel(catToken);
1761 sliceSet->add(*scat,
false) ;
1774 if (vlines==2) vlines=0 ;
1780 if (vlines==2) vlines=0 ;
1800 coutE(InputArguments) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") cannot find existing curve " << o.
addToCurveName <<
" to add to in RooPlot" << std::endl ;
1806 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have slice " << *sliceSet << std::endl ;
1811 for (
const auto sliceArg : *sliceSet) {
1812 if (
RooAbsArg* arg = projectedVars.
find(sliceArg->GetName())) {
1813 projectedVars.
remove(*arg) ;
1815 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") slice variable "
1816 << sliceArg->GetName() <<
" was not projected anyway" << std::endl ;
1819 }
else if (projSet) {
1820 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have projSet " << *projSet << std::endl ;
1823 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have neither sliceSet nor projSet " << std::endl ;
1828 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: projectedVars = " << projectedVars << std::endl ;
1852 if ((fillColor != -999 || fillStyle != -999) && !drawOpt.
Contains(
"F")) {
1853 coutW(Plotting) <<
"Fill color or style was set for plotting \"" <<
GetName()
1854 <<
"\", but these only have an effect when 'DrawOption(\"F\")' for fill is used at the same time." << std::endl;
1891 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have ProjData with observables = " << *o.
projData->
get() << std::endl ;
1894 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have ProjDataSet = " << *o.
projDataSet <<
" will only use this subset of projData" << std::endl ;
1896 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") using full ProjData" << std::endl ;
1901 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") ProjDataVars = " << projDataVars << std::endl ;
1907 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have input projSet = " << *o.
projSet << std::endl ;
1909 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") calculated projectedVars = " << *o.
projSet << std::endl ;
1916 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") frame->getNormVars() that are also observables = " << sliceSetTmp << std::endl ;
1918 sliceSetTmp.
remove(projectedVars,
true,
true) ;
1923 sliceSetTmp.
remove(*tmp,
true,
true) ;
1926 if (!sliceSetTmp.
empty()) {
1927 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on "
1928 << frame->
getPlotVar()->
GetName() <<
" represents a slice in " << sliceSetTmp << std::endl ;
1930 sliceSet.
add(sliceSetTmp) ;
1936 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") projectedVars = " << projectedVars <<
" sliceSet = " << sliceSet << std::endl ;
1939 RooArgSet* projDataNeededVars = nullptr ;
1942 projDataNeededVars = projectedVars.
selectCommon(projDataVars);
1943 projectedVars.
remove(projDataVars,
true,
true) ;
1948 double oldPlotVarVal = plotVar->
getVal();
1951 if (!projectedVars.
empty()) {
1952 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->GetName()
1953 <<
" integrates over variables " << projectedVars
1956 if (projDataNeededVars && !projDataNeededVars->
empty()) {
1957 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
1958 <<
" averages using data variables " << *projDataNeededVars << std::endl ;
1962 RooArgSet* projectionCompList = nullptr ;
1966 deps.
remove(projectedVars,
true,
true) ;
1967 if (projDataNeededVars) {
1968 deps.
remove(*projDataNeededVars,
true,
true) ;
1970 deps.
remove(*plotVar,
true,
true) ;
1971 deps.
add(*plotVar) ;
1977 coutE(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
1978 if (projDataNeededVars)
delete projDataNeededVars ;
1983 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot projection object is " << projection->
GetName() << std::endl ;
1990 fullNormSet.
add(projectedVars) ;
1991 if (projDataNeededVars && !projDataNeededVars->
empty()) {
1992 fullNormSet.
add(*projDataNeededVars) ;
1995 std::unique_ptr<RooArgSet> projectionComponents(projection->
getComponents());
1996 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*projectionComponents)) {
1998 pdf->selectNormalization(&fullNormSet) ;
2003 if (o.
projData && projDataNeededVars && !projDataNeededVars->
empty()) {
2007 std::unique_ptr<RooAbsData> projDataSelOwned;
2014 if (!sliceDataSet->empty()) {
2016 for(
RooAbsArg * sliceVar : *sliceDataSet) {
2033 if (!cutString.
IsNull()) {
2034 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") reducing given projection dataset to entries with " << cutString << std::endl ;
2036 projDataSelOwned = std::unique_ptr<RooAbsData>{
const_cast<RooAbsData*
>(o.
projData)->reduce(*projDataNeededVars, cutString.
IsNull() ? nullptr : cutString)};
2037 projDataSel = projDataSelOwned.
get();
2039 <<
") only the following components of the projection data will be used: " << *projDataNeededVars << std::endl ;
2048 if (!
dynamic_cast<RooCategory*
>(arg2)) allCat =
false ;
2052 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") unbinned projection dataset consist only of discrete variables,"
2053 <<
" performing projection with binned copy for optimization." << std::endl ;
2060 projDataSelOwned = std::make_unique<RooDataHist>(std::string(projDataSel->
GetName()) +
"_binned",
"Binned projection data",*projDataSel->
get(),*projDataSel);
2061 projDataSel = projDataSelOwned.
get();
2065 ScaledDataWeightedAverage scaleBind{*projection, *projDataSel, o.
scaleFactor, *plotVar};
2074 std::string curveName(projection->
GetName()) ;
2077 if (!sliceSet.
empty()) {
2091 curve->
SetName(curveName.c_str()) ;
2142 std::string curveName(projection->
GetName()) ;
2143 if (!sliceSet.
empty()) {
2169 curve->
SetName(curveName.c_str()) ;
2190 if (projDataNeededVars)
delete projDataNeededVars ;
2191 delete projectionCompList ;
2192 plotVar->setVal(oldPlotVarVal);
2223 projDataVars.
add(*tmp) ;
2231 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2232 <<
") function doesn't depend on asymmetry category " << asymCat.
GetName() << std::endl ;
2238 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2239 <<
") asymmetry category must have 2 or 3 states with index values -1,0,1" << std::endl ;
2253 sliceSetTmp.
remove(projectedVars,
true,
true) ;
2258 sliceSetTmp.
remove(*tmp,
true,
true) ;
2261 if (!sliceSetTmp.
empty()) {
2262 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") plot on "
2263 << frame->
getPlotVar()->
GetName() <<
" represents a slice in " << sliceSetTmp << std::endl ;
2265 sliceSet.
add(sliceSetTmp) ;
2273 RooArgSet* projDataNeededVars = nullptr ;
2275 projDataNeededVars = projectedVars.
selectCommon(projDataVars);
2276 projectedVars.
remove(projDataVars,
true,
true) ;
2289 if (!projectedVars.
empty()) {
2290 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
2291 <<
" projects variables " << projectedVars << std::endl ;
2293 if (projDataNeededVars && !projDataNeededVars->
empty()) {
2294 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
2295 <<
" averages using data variables "<< *projDataNeededVars << std::endl ;
2303 asymNeg->setIndex(-1) ;
2309 custNeg.replaceArg(asymCat,*asymNeg) ;
2310 std::unique_ptr<RooAbsReal> funcPos{
static_cast<RooAbsReal*
>(custPos.build())};
2311 std::unique_ptr<RooAbsReal> funcNeg{
static_cast<RooAbsReal*
>(custNeg.build())};
2321 depPos.
add(projDataVars) ;
2322 depNeg.
add(projDataVars) ;
2326 if (!posProj || !negProj) {
2327 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") Unable to create projections, abort" << std::endl ;
2333 asymName.
Append(
"_Asym[") ;
2337 asymTitle.
Append(
" Asymmetry of ") ;
2345 std::unique_ptr<RooAbsData> projDataSelOwned;
2352 if (!sliceDataSet.
empty()) {
2354 for(
RooAbsArg * sliceVar : sliceDataSet) {
2371 if (!cutString.
IsNull()) {
2372 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2373 <<
") reducing given projection dataset to entries with " << cutString << std::endl ;
2375 projDataSelOwned = std::unique_ptr<RooAbsData>{
const_cast<RooAbsData*
>(o.
projData)->reduce(*projDataNeededVars,cutString.
IsNull() ? nullptr : cutString)};
2376 projDataSel = projDataSelOwned.
get();
2377 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2378 <<
") only the following components of the projection data will be used: " << *projDataNeededVars << std::endl ;
2383 ScaledDataWeightedAverage scaleBind{funcAsym, *projDataSel, o.
scaleFactor, *plotVar};
2392 TString curveName(funcAsym.GetName()) ;
2395 if (!sliceSet.
empty()) {
2405 RooCurve *curve =
new RooCurve(funcAsym.GetName(),funcAsym.GetTitle(),scaleBind,
2413 ccoutW(Eval) << std::endl ;
2431 TString curveName(funcAsym.GetName()) ;
2432 if (!sliceSet.
empty()) {
2447 delete posProjCompList ;
2448 delete negProjCompList ;
2480 for(
auto * rrvFitRes : static_range_cast<RooRealVar*>(fr.
floatParsFinal())) {
2482 auto rrvInAbsReal =
static_cast<RooRealVar const*
>(allParamsInAbsReal.
find(*rrvFitRes));
2489 if (rrvFitRes->getError() <= std::abs(rrvFitRes->getVal()) * std::numeric_limits<double>::epsilon())
continue;
2492 if(!rrvInAbsReal)
continue;
2496 if(std::abs(rrvInAbsReal->getVal() - rrvFitRes->getVal()) > 0.01 * rrvFitRes->getError()) {
2497 std::stringstream errMsg;
2498 errMsg <<
"RooAbsReal::getPropagatedError(): the parameters of the RooAbsReal don't have"
2499 <<
" the same values as in the fit result! The logic of getPropagatedError is broken in this case.";
2501 throw std::runtime_error(errMsg.str());
2504 paramList.
add(*rrvInAbsReal);
2507 std::vector<double> plusVar;
2508 std::vector<double> minusVar;
2509 plusVar.reserve(paramList.
size());
2510 minusVar.reserve(paramList.
size());
2517 for (std::size_t ivar=0 ; ivar<paramList.
size() ; ivar++) {
2519 auto& rrv =
static_cast<RooRealVar&
>(paramList[ivar]);
2521 double cenVal = rrv.
getVal() ;
2522 double errVal = sqrt(V(ivar,ivar)) ;
2525 rrv.setVal(cenVal+errVal) ;
2526 plusVar.push_back(
getVal(nset)) ;
2529 rrv.setVal(cenVal-errVal) ;
2530 minusVar.push_back(
getVal(nset)) ;
2532 rrv.setVal(cenVal) ;
2545 std::vector<double> errVec(paramList.
size()) ;
2546 for (std::size_t i=0 ; i<paramList.
size() ; i++) {
2547 errVec[i] = std::sqrt(V(i,i)) ;
2548 for (std::size_t j=i ; j<paramList.
size() ; j++) {
2549 C(i,j) = V(i,j) / std::sqrt(V(i,i)*V(j,j));
2556 for (std::size_t j=0 ; j<plusVar.size() ; j++) {
2557 F[j] = (plusVar[j]-minusVar[j]) * 0.5;
2561 double sum =
F*(C*
F) ;
2608 for (
auto * cmd : static_range_cast<RooCmdArg*>(plotArgListTmp)) {
2609 if (std::string(
"Normalization")==cmd->GetName()) {
2612 plotArgList.
Add(cmd) ;
2615 plotArgList.
Add(cmd) ;
2622 auto plotFunc = [&](
RooAbsReal const& absReal) {
2625 absReal.plotOn(frame, tmp);
2632 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":plotOnWithErrorBand: no curve for central value available" << std::endl;
2635 frame->
remove(
nullptr,
false) ;
2659 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") INFO: visualizing " << Z <<
"-sigma uncertainties in parameters "
2660 << errorParams <<
" from fit result " << fr.
GetName() <<
" using " <<
n <<
" samplings." << std::endl ;
2665 std::unique_ptr<RooDataSet> generatedData{paramPdf->
generate(errorParams,
n)};
2666 std::vector<RooCurve*> cvec ;
2667 for (
int i=0 ; i<generatedData->numEntries() ; i++) {
2668 cloneParams.
assign(*generatedData->get(i)) ;
2669 plotFunc(*cloneFunc);
2670 cvec.push_back(frame->
getCurve()) ;
2671 frame->
remove(
nullptr,
false) ;
2683 for (std::vector<RooCurve*>::iterator i=cvec.begin() ; i!=cvec.end() ; ++i) {
2701 for (
auto const* frv : static_range_cast<RooRealVar*>(fr.
floatParsFinal())) {
2702 if (frv->getError() > frv->getVal() * std::numeric_limits<double>::epsilon()) {
2703 fpf_stripped.
add(*frv);
2721 std::vector<int> fpf_idx ;
2722 for (std::size_t i=0 ; i<fpf.
size() ; i++) {
2725 paramList.
add(*par) ;
2726 fpf_idx.push_back(i) ;
2730 std::vector<RooCurve *> plusVar;
2731 std::vector<RooCurve *> minusVar;
2740 for (std::size_t ivar=0 ; ivar<paramList.
size() ; ivar++) {
2744 double cenVal = rrv.
getVal() ;
2745 double errVal = sqrt(V(ivar,ivar)) ;
2748 (
static_cast<RooRealVar*
>(paramList.
at(ivar)))->setVal(cenVal+Z*errVal) ;
2751 plotFunc(*cloneFunc);
2752 plusVar.push_back(frame->
getCurve()) ;
2753 frame->
remove(
nullptr,
false) ;
2757 (
static_cast<RooRealVar*
>(paramList.
at(ivar)))->setVal(cenVal-Z*errVal) ;
2758 plotFunc(*cloneFunc);
2759 minusVar.push_back(frame->
getCurve()) ;
2760 frame->
remove(
nullptr,
false) ;
2762 (
static_cast<RooRealVar*
>(paramList.
at(ivar)))->setVal(cenVal) ;
2766 std::vector<double> errVec(paramList.
size()) ;
2767 for (std::size_t i=0 ; i<paramList.
size() ; i++) {
2768 errVec[i] = sqrt(V(i,i)) ;
2769 for (std::size_t j=i ; j<paramList.
size() ; j++) {
2770 C(i,j) = V(i,j)/sqrt(V(i,i)*V(j,j)) ;
2780 for (std::vector<RooCurve*>::iterator i=plusVar.begin() ; i!=plusVar.end() ; ++i) {
2783 for (std::vector<RooCurve*>::iterator i=minusVar.begin() ; i!=minusVar.end() ; ++i) {
2790 if (!band)
return frame ;
2795 pc.
defineString(
"curveNameSuffix",
"CurveNameSuffix",0,
"") ;
2796 pc.
defineInt(
"lineColor",
"LineColor",0,-999) ;
2797 pc.
defineInt(
"lineStyle",
"LineStyle",0,-999) ;
2798 pc.
defineInt(
"lineWidth",
"LineWidth",0,-999) ;
2799 pc.
defineInt(
"markerColor",
"MarkerColor",0,-999) ;
2800 pc.
defineInt(
"markerStyle",
"MarkerStyle",0,-999) ;
2802 pc.
defineInt(
"fillColor",
"FillColor",0,-999) ;
2803 pc.
defineInt(
"fillStyle",
"FillStyle",0,-999) ;
2805 pc.
defineInt(
"curveInvisible",
"Invisible",0,0) ;
2806 pc.
defineInt(
"moveToBack",
"MoveToBack",0,0) ;
2837 if (pc.
getString(
"curveName",
nullptr,
true)) {
2839 }
else if (pc.
getString(
"curveNameSuffix",
nullptr,
true)) {
2863 if(
nullptr == frame) {
2872 <<
":plotOn: frame does not specify a plot variable" << std::endl;
2885 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":plotOn: WARNING: variable is not an explicit dependent: "
2886 << var->
GetName() << std::endl;
2904 RooArgSet& projectedVars,
bool silent)
const
2906 cxcoutD(Plotting) <<
"RooAbsReal::makeProjectionSet(" <<
GetName() <<
") plotVar = " << plotVar->
GetName()
2907 <<
" allVars = " << (allVars?(*allVars):
RooArgSet()) << std::endl ;
2910 if (!allVars) return ;
2913 projectedVars.
add(*allVars) ;
2918 projectedVars.
remove(*found);
2921 std::unique_ptr<RooArgSet> plotServers{plotVar->
getObservables(&projectedVars)};
2925 cxcoutD(Plotting) <<
"RooAbsReal::makeProjectionSet(" <<
GetName() <<
") removing " << tmp->GetName()
2926 <<
" from projection set because it a server of " << plotVar->
GetName() << std::endl ;
2927 projectedVars.
remove(*tmp) ;
2933 <<
") WARNING: cannot project out frame variable ("
2934 << found->
GetName() <<
"), ignoring" << std::endl ;
2941 projectedVars.
remove(*arg,
true) ;
2944 <<
") function doesn't depend on projection variable "
2945 << arg->
GetName() <<
", ignoring" << std::endl ;
2982 auto binding = std::make_unique<RooRealBinding>(*
this,vars,nset,clipInvalid);
2983 if(!binding->isValid()) {
2984 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":bindVars: cannot bind to " << vars << std::endl ;
2999 auto other =
static_cast<const RooAbsReal*
>(source);
3000 assert(
dynamic_cast<const RooAbsReal*
>(source));
3002 _value = other->_treeReadBuffer ? other->_treeReadBuffer->operator
double() : other->_value;
3042 coutE(Eval) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") ERROR: TTree branch " <<
GetName()
3043 <<
" is an array and cannot be attached to a RooAbsReal" << std::endl ;
3053 std::map<std::string, std::pair<std::string, std::function<std::unique_ptr<TreeReadBuffer>()>>> typeMap {
3054 {
"Float_t", {
"FLOAT_TREE_BRANCH", [&](){
return createTreeReadBuffer<Float_t >(cleanName, t); }}},
3055 {
"Int_t", {
"INTEGER_TREE_BRANCH", [&](){
return createTreeReadBuffer<Int_t >(cleanName, t); }}},
3056 {
"UChar_t", {
"BYTE_TREE_BRANCH", [&](){
return createTreeReadBuffer<UChar_t >(cleanName, t); }}},
3057 {
"Bool_t", {
"BOOL_TREE_BRANCH", [&](){
return createTreeReadBuffer<Bool_t >(cleanName, t); }}},
3058 {
"Char_t", {
"SIGNEDBYTE_TREE_BRANCH", [&](){
return createTreeReadBuffer<Char_t >(cleanName, t); }}},
3059 {
"UInt_t", {
"UNSIGNED_INTEGER_TREE_BRANCH", [&](){
return createTreeReadBuffer<UInt_t >(cleanName, t); }}},
3060 {
"Long64_t", {
"LONG_TREE_BRANCH", [&](){
return createTreeReadBuffer<Long64_t >(cleanName, t); }}},
3061 {
"ULong64_t", {
"UNSIGNED_LONG_TREE_BRANCH", [&](){
return createTreeReadBuffer<ULong64_t>(cleanName, t); }}},
3062 {
"Short_t", {
"SHORT_TREE_BRANCH", [&](){
return createTreeReadBuffer<Short_t >(cleanName, t); }}},
3063 {
"UShort_t", {
"UNSIGNED_SHORT_TREE_BRANCH", [&](){
return createTreeReadBuffer<UShort_t >(cleanName, t); }}},
3066 auto typeDetails = typeMap.find(typeName.
Data());
3067 if (typeDetails != typeMap.end()) {
3068 coutI(DataHandling) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") TTree " << typeDetails->first <<
" branch " <<
GetName()
3069 <<
" will be converted to double precision." << std::endl ;
3082 coutE(InputArguments) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") data type " << typeName <<
" is not supported." << std::endl ;
3104 coutE(Eval) <<
"RooAbsReal::fillTreeBranch(" <<
GetName() <<
") ERROR: not attached to tree: " <<
cleanBranchName() << std::endl ;
3133 fund->removeRange();
3135 fund->setAttribute(
"fundamentalCopy");
3136 return RooFit::makeOwningPtr<RooAbsArg>(std::move(fund));
3242 const TList &nameList)
const
3245 bool isMatched(
true);
3246 for(
auto *
name : static_range_cast<TObjString*>(nameList)) {
3249 matched.
add(*found);
3259 if (isMatched &&
int(matched.
size())!=nameList.
GetSize()) {
3263 if(isMatched) matchedArgs.
add(matched);
3312 if (config)
return config ;
3325 if (config)
return config ;
3415 evalErrorData().count++ ;
3419 static bool inLogEvalError = false ;
3421 if (inLogEvalError) {
3424 inLogEvalError = true ;
3429 if (serverValueString) {
3434 oocoutE(
nullptr,Eval) <<
"RooAbsReal::logEvalError(" <<
"<STATIC>" <<
") evaluation error, " << std::endl
3435 <<
" origin : " << origName << std::endl
3436 <<
" message : " << ee.
_msg << std::endl
3437 <<
" server values: " << ee.
_srvval << std::endl ;
3439 auto &evalErrorList = evalErrorData().errorList[originator];
3440 evalErrorList.first = origName ;
3441 evalErrorList.second.push_back(ee) ;
3445 inLogEvalError = false ;
3471 evalErrorData().count++ ;
3475 static bool inLogEvalError = false ;
3477 if (inLogEvalError) {
3480 inLogEvalError = true ;
3485 if (serverValueString) {
3488 std::string srvval ;
3489 std::ostringstream oss ;
3500 p->print(oss,
true) ;
3505 std::ostringstream oss2 ;
3509 coutE(Eval) <<
"RooAbsReal::logEvalError(" <<
GetName() <<
") evaluation error, " << std::endl
3510 <<
" origin : " << oss2.str() << std::endl
3511 <<
" message : " << ee.
_msg << std::endl
3512 <<
" server values: " << ee.
_srvval << std::endl ;
3514 auto &evalErrorList = evalErrorData().errorList[
this];
3515 if (evalErrorList.second.size() >= 2048) {
3518 const EvalError& oee = evalErrorList.second.front();
3522 <<
") delayed evaluation error, " << std::endl
3523 <<
" origin : " << oss2.str() << std::endl
3524 <<
" message : " << oee.
_msg << std::endl
3525 <<
" server values: " << oee.
_srvval << std::endl ;
3526 evalErrorList.second.pop_front();
3528 evalErrorList.first = oss2.str() ;
3529 evalErrorList.second.push_back(ee) ;
3532 inLogEvalError = false ;
3547 evalErrorData().errorList.clear() ;
3549 evalErrorData().count = 0 ;
3585 os << evalErrorData().count <<
" errors counted" << std::endl;
3591 for (
auto const &item : evalErrorData().errorList) {
3592 if (maxPerNode == 0) {
3595 os << item.second.first;
3597 os <<
" has " << item.second.second.size() <<
" errors" << std::endl;
3602 os << item.second.first << std::endl;
3606 for (
auto const &item2 : item.second.second) {
3607 os <<
" " << item2._msg <<
" @ " << item2._srvval << std::endl;
3608 if (i > maxPerNode) {
3609 os <<
" ... (remaining " << item.second.second.size() - maxPerNode <<
" messages suppressed)"
3626 auto &evalErrors = evalErrorData();
3628 return evalErrors.count;
3632 for (
auto const &elem : evalErrors.errorList) {
3633 ntot += elem.second.second.size();
3653 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*compSet)) {
3655 if (!addNormSet.
empty()) {
3656 pdf->selectNormalization(&addNormSet,force) ;
3658 pdf->selectNormalization(
nullptr,force) ;
3678 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*compSet)) {
3680 pdf->selectNormalizationRange(rangeName,force) ;
3698 orderedObs.
add(obs) ;
3756 pc.
defineSet(
"supNormSet",
"SupNormSet",0,
nullptr) ;
3757 pc.
defineInt(
"numScanBins",
"ScanParameters",0,1000) ;
3758 pc.
defineInt(
"intOrder",
"ScanParameters",1,2) ;
3759 pc.
defineInt(
"doScanNum",
"ScanNum",0,1) ;
3760 pc.
defineInt(
"doScanAll",
"ScanAll",0,0) ;
3761 pc.
defineInt(
"doScanNon",
"ScanNone",0,0) ;
3765 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
3793 coutI(NumIntegration) <<
"RooAbsPdf::createRunningIntegral(" <<
GetName() <<
") integration over observable(s) " << iset <<
" involves numeric integration," << std::endl
3794 <<
" constructing cdf though numeric integration of sampled pdf in " << numScanBins <<
" bins and applying order "
3795 << intOrder <<
" interpolation on integrated histogram." << std::endl
3796 <<
" To override this choice of technique use argument ScanNone(), to change scan parameters use ScanParameters(nbins,order) argument" << std::endl ;
3814 ivar->
setBins(numScanBins,
"numcdf") ;
3815 auto ret = std::make_unique<RooNumRunningInt>(
name.c_str(),
name.c_str(),*
this,*ivar,
"numrunint") ;
3816 ret->setInterpolationOrder(intOrder) ;
3817 return RooFit::makeOwningPtr<RooAbsReal>(std::move(ret));
3835 coutW(InputArguments) <<
"RooAbsPdf::createRunningIntegral(" <<
GetName() <<
") WARNING ignoring non-RooRealVar input argument " << arg->
GetName() << std::endl ;
3849 for(
auto * rrv : static_range_cast<RooRealVar*>(ilist)) {
3853 cloneList.
add(*cloneArg) ;
3858 cloneLo->
setVal(rrv->getMin()) ;
3859 loList.
add(*cloneLo) ;
3871 finalNset.
add(cloneList,
true) ;
3872 std::unique_ptr<RooAbsReal> cdf{tmp->createIntegral(cloneList,finalNset,
"CDF")};
3875 cdf->addOwnedComponents(*tmp) ;
3876 cdf->addOwnedComponents(cloneList) ;
3877 cdf->addOwnedComponents(loList) ;
3891 if (realObs.
size() != obs.
size()) {
3892 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified observables are not variables of this p.d.f" << std::endl ;
3897 if (realPars.
size() != pars.
size()) {
3898 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified parameters are not variables of this p.d.f" << std::endl ;
3916 if (realObs.
size() != obs.
size()) {
3917 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified observables are not variables of this p.d.f" << std::endl ;
3922 if (realPars.
size() != pars.
size()) {
3923 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified parameters are not variables of this p.d.f" << std::endl ;
3928 for (std::size_t i=0 ; i<obs.
size() ; i++) {
3930 coutE(ObjectHandling) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: proposed observable " << obs.
at(0)->
GetName() <<
" is not of type RooRealVar" << std::endl ;
3934 for (std::size_t i=0 ; i<pars.
size() ; i++) {
3936 coutE(ObjectHandling) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: proposed parameter " << pars.
at(0)->
GetName() <<
" is not of type RooRealVar" << std::endl ;
3944 switch(obs.
size()) {
3967 coutE(InputArguments) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: " << obs.
size()
3968 <<
" observables specified, but a ROOT TFx can only have 1,2 or 3 observables" << std::endl ;
3973 for (std::size_t i=0 ; i<pars.
size() ; i++) {
4003 return new RooDerivative(
name.c_str(),title.c_str(),*
this,obs,normSet,order,eps) ;
4018 std::string title=
Form(
"%sMoment of order %d of %s w.r.t %s ",(central?
"Central ":
""),order,
GetName(),obs.
GetName()) ;
4020 if (order==2)
return new RooSecondMoment(
name.c_str(),title.c_str(),*
this,obs,central,takeRoot) ;
4021 return new RooMoment(
name.c_str(),title.c_str(),*
this,obs,order,central,takeRoot) ;
4037 std::string title=
Form(
"%sMoment of order %d of %s w.r.t %s ",(central?
"Central ":
""),order,
GetName(),obs.
GetName()) ;
4039 if (order==1)
return new RooFirstMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,intNormObs) ;
4040 if (order==2)
return new RooSecondMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,central,takeRoot,intNormObs) ;
4041 return new RooMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,order,central,takeRoot,intNormObs) ;
4304 return evalErrorData().mode ;
4318 evalErrorData().mode =
m;
4327 for (
auto const* arg : paramVars) {
4329 coutW(InputArguments) <<
"RooAbsReal::setParameterizeIntegral(" <<
GetName()
4330 <<
") function does not depend on listed parameter " << arg->
GetName() <<
", ignoring" << std::endl ;
4333 if (!plist.empty()) plist +=
":" ;
4351 std::span<const double> batch;
4357 std::vector<ServerData> ourServers;
4360 for (
auto server :
servers()) {
4361 auto serverValues = ctx.
at(server);
4362 if(serverValues.empty())
continue;
4365 auto oldOperMode = server->operMode();
4370 ourServers.push_back({server,
4374 server->_valueDirty,
4375 server->_shapeDirty});
4381 struct RestoreStateRAII {
4382 RestoreStateRAII(std::vector<ServerData>& servers) :
4383 _servers{servers} { }
4385 ~RestoreStateRAII() {
4386 for (
auto& serverData : _servers) {
4387 serverData.server->setCachedValue(serverData.oldValue,
true);
4388 serverData.server->setOperMode(serverData.oldOperMode);
4389 serverData.server->_valueDirty = serverData.oldValueDirty;
4390 serverData.server->_shapeDirty = serverData.oldShapeDirty;
4394 std::vector<ServerData>& _servers;
4395 } restoreState{ourServers};
4401 coutI(FastEvaluations) <<
"The class " <<
ClassName() <<
" does not implement the faster batch evaluation interface."
4402 <<
" Consider requesting or implementing it to benefit from a speed up." << std::endl;
4408 for (std::size_t i=0; i <
output.size(); ++i) {
4409 for (
auto& serv : ourServers) {
4410 serv.server->setCachedValue(serv.batch[std::min(i, serv.batch.size()-1)],
false);
4419 const bool tmpFast =
_fast;
4420 const double tmp =
_value;
4422 double fullEval = 0.;
4424 fullEval =
getValV(normalisationSet);
4433 if (std::isfinite(ret) && ( ret != 0. ? (ret - fullEval)/ret : ret - fullEval) > 1.E-9) {
4438 formatter <<
"--> (Scalar computation wrong here:)\n"
4439 <<
GetName() <<
" " <<
this <<
" _fast=" << tmpFast
4440 <<
"\n\tcached _value=" << std::setprecision(16) << tmp
4441 <<
"\n\treturning =" << ret
4442 <<
"\n\trecomputed =" << fullEval
4443 <<
"\n\tnew _value =" <<
_value <<
"] ";
4444 formatter <<
"\nServers:";
4458 bool nameChange,
bool isRecursiveStep)
4470 if(
auto realArg =
dynamic_cast<RooAbsReal*
>(arg)) {
4471 realArg->enableOffsetting(flag) ;
4497 std::stringstream errMsg;
4498 errMsg <<
"calling RooAbsReal::getVal() with r-value references to the normalization set is not allowed, because "
4499 "it breaks RooFits caching logic and potentially introduces significant overhead. Please explicitly "
4500 "create the RooArgSet outside the call to getVal().";
4501 coutF(Eval) << errMsg.str() << std::endl;
4502 throw std::runtime_error(errMsg.str());
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 mode
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 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...
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.
const char * GetName() const override
Returns name of object.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
TObject * Clone(const char *newname=nullptr) const override
Make a clone of an object using the Streamer facility.
bool overlaps(Iterator_t otherCollBegin, Iterator_t otherCollEnd) const
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
Storage_t::size_type size() const
RooAbsArg * first() const
virtual bool replace(const RooAbsArg &var1, const RooAbsArg &var2)
Replace var1 with var2 and return true for success.
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
std::string contentsString() const
Return comma separated list of contained object names as STL string.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract base class for binned and unbinned datasets.
virtual const RooArgSet * get() const
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
Abstract interface for evaluating a real-valued function of one real variable and performing numerica...
virtual double getMaxLimit(UInt_t dimension) const =0
virtual double operator()(const double xvector[]) const =0
virtual double getMinLimit(UInt_t dimension) const =0
Abstract base class for objects that are lvalues, i.e.
Abstract interface for all probability density functions.
virtual double expectedEvents(const RooArgSet *nset) const
Return expected number of events to be used in calculation of extended likelihood.
const char * normRange() const
RooFit::OwningPtr< RooDataSet > generate(const RooArgSet &whatVars, Int_t nEvents, const RooCmdArg &arg1, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={})
See RooAbsPdf::generate(const RooArgSet&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&,...
virtual ExtendMode extendMode() const
Returns ability of PDF to provide extended likelihood terms.
Abstract interface for proxy classes.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
TH1 * createHistogram(const char *name, 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
virtual double getMax(const char *name=nullptr) const
Get maximum of currently defined range.
virtual double getMin(const char *name=nullptr) const
Get minimum of currently defined range.
void setServerValues(const char *tmp)
void setMessage(const char *tmp)
Abstract base class for objects that represent a real value and implements functionality common to al...
RooDataHist * fillDataHist(RooDataHist *hist, const RooArgSet *nset, double scaleFactor, bool correctForBinVolume=false, bool showProgress=false) const
Fill a RooDataHist with values sampled from this function at the bin centers.
virtual void selectNormalizationRange(const char *rangeName=nullptr, bool force=false)
Interface function to force use of a given normalization range to interpret function value.
void plotOnCompSelect(RooArgSet *selNodes) const
Helper function for plotting of composite p.d.fs.
bool isSelectedComp() const
If true, the current pdf is a selected component (for use in plotting)
virtual std::list< double > * binBoundaries(RooAbsRealLValue &obs, double xlo, double xhi) const
Retrieve bin boundaries if this distribution is binned in obs.
void selectComp(bool flag)
TString _label
Plot label for objects value.
bool _selectComp
A buffer for reading values from trees.
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
double findRoot(RooRealVar &x, double xmin, double xmax, double yval)
Return value of x (in range xmin,xmax) at which function equals yval.
TreeReadBuffer * _treeReadBuffer
virtual double getValV(const RooArgSet *normalisationSet=nullptr) const
Return value of object.
static Int_t numEvalErrorItems()
RooAbsReal()
coverity[UNINIT_CTOR] Default constructor
friend class RooRealBinding
virtual void fixAddCoefNormalization(const RooArgSet &addNormSet=RooArgSet(), bool force=true)
Fix the interpretation of the coefficient of any RooAddPdf component in the expression tree headed by...
virtual Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &analVars, const RooArgSet *normSet, const char *rangeName=nullptr) const
Variant of getAnalyticalIntegral that is also passed the normalization set that should be applied to ...
bool _forceNumInt
Force numerical integration if flag set.
~RooAbsReal() override
Destructor.
void setParameterizeIntegral(const RooArgSet ¶mVars)
bool matchArgsByName(const RooArgSet &allArgs, RooArgSet &matchedArgs, const TList &nameList) const
Check if allArgs contains matching elements for each name in nameList.
void setTreeBranchStatus(TTree &t, bool active) override
(De)Activate associated tree branch
TH1 * fillHistogram(TH1 *hist, const RooArgList &plotVars, double scaleFactor=1, const RooArgSet *projectedVars=nullptr, bool scaling=true, const RooArgSet *condObs=nullptr, bool setError=true) const
Fill the ROOT histogram 'hist' with values sampled from this function at the bin centers.
RooFit::OwningPtr< RooAbsReal > createScanRI(const RooArgSet &iset, const RooArgSet &nset, Int_t numScanBins, Int_t intOrder)
Utility function for createRunningIntegral that construct an object implementing the numeric scanning...
double _DEBUG_getVal(const RooArgSet *normalisationSet) const
Debug version of getVal(), which is slow and does error checking.
RooFit::OwningPtr< RooAbsArg > createFundamental(const char *newname=nullptr) const override
Create a RooRealVar fundamental object with our properties.
bool plotSanityChecks(RooPlot *frame) const
Utility function for plotOn(), perform general sanity check on frame to ensure safe plotting operatio...
RooFit::OwningPtr< RooAbsFunc > bindVars(const RooArgSet &vars, const RooArgSet *nset=nullptr, bool clipInvalid=false) const
Create an interface adaptor f(vars) that binds us to the specified variables (in arbitrary order).
virtual void selectNormalization(const RooArgSet *depSet=nullptr, bool force=false)
Interface function to force use of a given set of observables to interpret function value.
RooDerivative * derivative(RooRealVar &obs, Int_t order=1, double eps=0.001)
Return function representing first, second or third order derivative of this function.
virtual RooFit::OwningPtr< RooFitResult > chi2FitTo(RooDataHist &data, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={})