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);
120 RooFit::Detail::BatchModeDataHelpers::getDataSpans(
data,
"",
nullptr,
false,
121 true, _vectorBuffers);
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;
195 double inMaxVal,
const char *unit) :
196 RooAbsArg(
name,title), _plotMin(inMinVal), _plotMax(inMaxVal), _unit(unit)
206 RooAbsArg(other,
name), _plotMin(other._plotMin), _plotMax(other._plotMax),
207 _plotBins(other._plotBins), _value(other._value), _unit(other._unit), _label(other._label),
208 _forceNumInt(other._forceNumInt), _selectComp(other._selectComp)
247 if (!assumeSameType) {
262 if(appendUnit && 0 != strlen(
getUnit())) {
307 <<
"): validation failed: " <<
value << std::endl ;
327 const RooArgSet* ,
const char* rangeName)
const
358 if (code==0)
return getVal(normSet) ;
372 coutF(Eval) <<
"RooAbsReal::analyticalIntegral(" <<
GetName() <<
") code " << code <<
" not implemented" << std::endl ;
433 os <<
indent <<
"--- RooAbsReal ---" << std::endl;
451 for (
auto const& arg : paramsOfInterest) {
462 auto out = std::make_unique<RooProfileLL>(
name.c_str(),(std::string(
"Profile of ") +
GetTitle()).c_str(),*
this,paramsOfInterest);
463 return RooFit::makeOwningPtr<RooAbsReal>(std::move(out));
495 pc.
defineString(
"rangeName",
"RangeWithName",0,
"",
true) ;
496 pc.
defineSet(
"normSet",
"NormSet",0,
nullptr) ;
497 pc.
defineObject(
"numIntConfig",
"NumIntConfig",0,
nullptr) ;
500 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
506 const char* rangeName = pc.
getString(
"rangeName",
nullptr,
true) ;
531 if (!rangeName || strchr(rangeName,
',')==
nullptr) {
537 std::vector<std::string> tokens =
ROOT::Split(rangeName,
",");
540 std::stringstream errMsg;
541 errMsg <<
GetName() <<
" : integrating with respect to the variables " << iset <<
" on the ranges \"" << rangeName
542 <<
"\" is not possible because the ranges are overlapping";
543 const std::string errMsgString = errMsg.str();
544 coutE(Integration) << errMsgString << std::endl;
545 throw std::invalid_argument(errMsgString);
549 for (
const std::string& token : tokens) {
553 const std::string title = std::string(
"Integral of ") +
GetTitle();
556 auto out = std::make_unique<RooAddition>(fullName.c_str(), title.c_str(), components);
557 out->addOwnedComponents(std::move(components));
558 return RooFit::makeOwningPtr<RooAbsReal>(std::move(out));
576 std::unique_ptr<RooAbsReal> integral;
581 const std::string title = std::string(
"Integral of ") +
GetTitle();
584 auto out = std::make_unique<RooRealIntegral>(
name.c_str(), title.c_str(), *
this, iset, nset, cfg, rangeName);
585 return RooFit::makeOwningPtr<RooAbsReal>(std::move(out));
589 while(!iset.
empty()) {
598 if (innerSet.
empty()) {
604 const std::string title = std::string(
"Integral of ") + integrand->
GetTitle();
607 std::unique_ptr<RooAbsReal> innerIntegral = std::move(integral);
610 integral = std::make_unique<RooRealIntegral>(
name.c_str(),title.c_str(),*integrand,innerSet,nset,cfg,rangeName);
614 integral->addOwnedComponents(std::move(innerIntegral));
621 if (integrand ==
this && !iset.
empty()) {
622 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 ;
626 integrand = integral.get();
634 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;
641 if (cacheParamsStr && strlen(cacheParamsStr)) {
643 std::unique_ptr<RooArgSet> intParams{integral->getVariables()};
647 if (!cacheParams.
empty()) {
648 cxcoutD(Caching) <<
"RooAbsReal::createIntObj(" <<
GetName() <<
") INFO: constructing " << cacheParams.
size()
649 <<
"-dim value cache for integral over " << iset2 <<
" as a function of " << cacheParams <<
" in range " << (rangeName?rangeName:
"<none>") << std::endl ;
651 auto cachedIntegral = std::make_unique<RooCachedReal>(
name.c_str(),
name.c_str(),*integral,cacheParams);
652 cachedIntegral->setInterpolationOrder(2) ;
653 cachedIntegral->addOwnedComponents(std::move(integral));
654 cachedIntegral->setCacheSource(
true) ;
655 if (integral->operMode()==
ADirty) {
656 cachedIntegral->setOperMode(
ADirty) ;
659 return RooFit::makeOwningPtr<RooAbsReal>(std::move(cachedIntegral));
687 for (
const auto aarg : allObs) {
692 RooAbsBinning& binning = arglv->getBinning(rangeName,
false,
true) ;
701 obsWithParamRange.
add(*aarg) ;
702 obsWithFixedRange.
remove(*aarg) ;
703 obsServingAsRangeParams.
add(loBoundObs,
false) ;
704 obsServingAsRangeParams.
add(hiBoundObs,
false) ;
711 RooArgSet obsWithFixedRangeNP(obsWithFixedRange) ;
712 obsWithFixedRangeNP.
remove(obsServingAsRangeParams) ;
715 RooArgSet obsWithParamRangeNP(obsWithParamRange) ;
716 obsWithParamRangeNP.
remove(obsServingAsRangeParams) ;
720 innerObs.
add(obsWithFixedRangeNP) ;
721 innerObs.
add(obsWithParamRangeNP) ;
739 }
else if (!omitEmpty) {
743 if (nset && !nset->
empty()) {
804 for (
const auto arg : dependentVars) {
807 <<
"\" of wrong type: " << arg->
ClassName() << std::endl;
814 <<
"\" is not a dependent and will be ignored." << std::endl;
819 leafNodes.
replace(*found,*arg);
821 leafNodes.
add(*arg) ;
826 for (
const auto lvs : lvDep) {
830 leafNodes.
add(*lvs) ;
837 if(
nullptr != projectedVars && projectedVars->
find(arg->
GetName())) {
839 <<
"\" cannot be both a dependent and a projected variable." << std::endl;
845 if(
nullptr != projectedVars) leafNodes.
remove(*projectedVars,
true);
850 coutE(Plotting) <<
"RooAbsPdf::createPlotProjection(" <<
GetName() <<
") Couldn't deep-clone PDF, abort," << std::endl ;
861 std::unique_ptr<RooArgSet> plotLeafNodes{leafNodes.
selectCommon(dependentVars)};
866 if(
nullptr != projectedVars) normSet.
add(*projectedVars);
867 if(
nullptr != condObs) {
868 normSet.
remove(*condObs,
true,
true) ;
875 if(
nullptr == projectedVars) projectedVars= ∅
880 std::string title = std::string{
"Projection of "} +
GetTitle();
882 std::unique_ptr<RooAbsReal> projected{theClone->
createIntegral(*projectedVars,normSet,rangeName)};
884 if(
nullptr == projected || !projected->isValid()) {
885 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":createPlotProjection: cannot integrate out ";
894 projected->SetName(
name.c_str()) ;
895 projected->SetTitle(title.c_str()) ;
899 cloneSet->
addOwned(std::move(projected));
923 double scaleFactor,
const RooArgSet *projectedVars,
bool scaleForDensity,
924 const RooArgSet* condObs,
bool setError)
const
927 if(
nullptr == hist) {
928 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: no valid histogram to fill" << std::endl;
934 if(hdim !=
int(plotVars.
size())) {
935 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: plotVars has the wrong dimension" << std::endl;
946 if(
nullptr == realVar) {
948 <<
"\" of type " << var->
ClassName() << std::endl;
953 <<
":fillHistogram: WARNING: variable is not an explicit dependent: " << realVar->
GetName() << std::endl;
966 allDeps.
add(*projectedVars) ;
969 coutE(InputArguments) <<
"RooAbsReal::fillHistogram(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
977 cxcoutD(Plotting) <<
"RooAbsReal::fillHistogram(" <<
GetName() <<
") plot projection object is " << projected->
GetName() << std::endl ;
986 TAxis *xaxis =
nullptr;
987 TAxis *yaxis =
nullptr;
988 TAxis *zaxis =
nullptr;
994 assert(
nullptr != zvar &&
nullptr != zaxis);
995 if (scaleForDensity) {
1003 assert(
nullptr != yvar &&
nullptr != yaxis);
1004 if (scaleForDensity) {
1012 assert(
nullptr != xvar &&
nullptr != xaxis);
1013 if (scaleForDensity) {
1018 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillHistogram: cannot fill histogram with "
1019 << hdim <<
" dimensions" << std::endl;
1029 Int_t bins= xbins*ybins*zbins;
1030 for(
Int_t bin= 0; bin < bins; bin++) {
1033 if(bin % (xbins*ybins) == 0) {
1039 if(bin % xbins == 0) {
1040 ybin= (ybin%ybins) + 1;
1045 xbin= (xbin%xbins) + 1;
1049 coutE(InputArguments) <<
"RooAbsReal::fillHistogram: Internal Error!" << std::endl;
1055 coutW(Plotting) <<
"WARNING: Function evaluation error(s) at coordinates [x]=" << xvar->
getVal() ;
1056 if (hdim==2)
ccoutW(Plotting) <<
" [y]=" << yvar->
getVal() ;
1057 if (hdim==3)
ccoutW(Plotting) <<
" [z]=" << zvar->
getVal() ;
1058 ccoutW(Plotting) << std::endl ;
1100 bool correctForBinSize,
bool showProgress)
const
1103 if(
nullptr == hist) {
1104 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":fillDataHist: no valid RooDataHist to fill" << std::endl;
1111 coutE(InputArguments) <<
"RooAbsReal::fillDataHist(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
1129 if (showProgress && (i%onePct==0)) {
1130 ccoutP(Eval) <<
"." << std::flush ;
1133 double binVal = theClone->
getVal(normSet?normSet:obs)*scaleFactor ;
1134 if (correctForBinSize) {
1137 hist->
set(i, binVal, 0.);
1163 std::vector<RooRealVar*> histVars(3,
nullptr);
1165 for(std::size_t iVar = 0; iVar < varNames.size(); ++iVar) {
1166 if(varNames[iVar].empty())
continue;
1168 std::stringstream errMsg;
1169 errMsg <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR more than three variable names passed, but maximum number of supported variables is three";
1170 coutE(Plotting) << errMsg.str() << std::endl;
1171 throw std::invalid_argument(errMsg.str());
1173 auto var =
static_cast<RooRealVar*
>(vars->find(varNames[iVar].c_str()));
1175 std::stringstream errMsg;
1176 errMsg <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR variable " << varNames[iVar] <<
" does not exist in argset: " << *vars;
1177 coutE(Plotting) << errMsg.str() << std::endl;
1178 throw std::runtime_error(errMsg.str());
1180 histVars[iVar] = var;
1262 pc.
defineInt(
"intBinning",
"IntrinsicBinning",0,2) ;
1263 pc.
defineInt(
"extended",
"Extended",0,2) ;
1265 pc.
defineSet(
"compSet",
"SelectCompSet",0);
1267 pc.
defineSet(
"projObs",
"ProjectedObservables",0,
nullptr) ;
1270 pc.
defineMutex(
"SelectCompSet",
"SelectCompSpec") ;
1272 pc.
defineMutex(
"IntrinsicBinning",
"BinningName") ;
1273 pc.
defineMutex(
"IntrinsicBinning",
"BinningSpec") ;
1292 auto projObs = pc.
getSet(
"projObs");
1295 bool doScaling = pc.
getInt(
"scaling") ;
1301 if (!pdfSelf && doExtended == 1) {
1302 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName() <<
") WARNING extended mode requested for a non-pdf object, ignored" << std::endl ;
1306 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName() <<
") WARNING extended mode requested for a non-extendable pdf, ignored" << std::endl ;
1309 if (pdfSelf && doExtended==2) {
1311 }
else if(!pdfSelf) {
1315 const char* compSpec = pc.
getString(
"compSpec") ;
1317 bool haveCompSel = ( (compSpec && strlen(compSpec)>0) || compSet) ;
1319 std::unique_ptr<RooBinning> intBinning;
1320 if (doIntBinning>0) {
1325 if (doIntBinning==1) {
1326 coutW(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName()
1327 <<
") WARNING, intrinsic model binning requested for histogram, but model does not define bin boundaries, reverting to default binning"<< std::endl ;
1330 if (doIntBinning==2) {
1331 coutI(InputArguments) <<
"RooAbsReal::createHistogram(" <<
GetName()
1332 <<
") INFO: Model has intrinsic binning definition, selecting that binning for the histogram"<< std::endl ;
1334 std::vector<double> edges(bl->size());
1336 for (
auto const& elem : *bl) { edges[i++] = elem ; }
1337 intBinning = std::make_unique<RooBinning>(bl->size()-1,edges.data()) ;
1342 RooCmdConfig::stripCmdList(argListCreate,
"Scaling,ProjectedObservables,IntrinsicBinning,SelectCompSet,SelectCompSpec,Extended") ;
1344 TH1* histo(
nullptr) ;
1347 argListCreate.
Add(&tmp) ;
1363 branchNodeSet.
remove(*arg) ;
1367 std::unique_ptr<RooArgSet> dirSelNodes;
1369 dirSelNodes = std::unique_ptr<RooArgSet>{branchNodeSet.
selectCommon(*compSet)};
1371 dirSelNodes = std::unique_ptr<RooArgSet>{branchNodeSet.
selectByName(compSpec)};
1373 if (!dirSelNodes->empty()) {
1374 coutI(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") directly selected PDF components: " << *dirSelNodes << std::endl ;
1380 coutE(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR: component selection set " << *compSet <<
" does not match any components of p.d.f." << std::endl ;
1382 coutE(Plotting) <<
"RooAbsPdf::createHistogram(" <<
GetName() <<
") ERROR: component selection expression '" << compSpec <<
"' does not select any components of p.d.f." << std::endl ;
1388 double scaleFactor(1.0) ;
1394 fillHistogram(histo,vars,scaleFactor,intObs,doScaling,projObs,
false) ;
1421 for (
unsigned int i = 0; i < branchNodeSet.
size(); ++i) {
1422 const auto arg = branchNodeSet[i];
1424 branchNodeSet.
remove(*arg) ;
1431 for (
const auto arg : branchNodeSet) {
1440 for (
const auto arg : branchNodeSet) {
1441 for (
const auto selNode : *selNodes) {
1442 if (selNode->dependsOn(*arg,
nullptr,
true)) {
1449 for (
const auto arg : branchNodeSet) {
1450 if (arg->
dependsOn(*selNodes,
nullptr,
true)) {
1455 tmp.remove(*selNodes,
true);
1458 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") indirectly selected PDF components: " << tmp << std::endl ;
1461 for (
const auto arg : branchNodeSet) {
1462 bool select = selNodes->
find(arg->
GetName()) !=
nullptr;
1616 argList.
Add(&rnorm) ;
1620 rcmd->
setString(0, rangeString.c_str());
1630 pc.
defineString(
"projectionRangeName",
"ProjectionRange",0,
"",
true) ;
1631 pc.
defineString(
"curveNameSuffix",
"CurveNameSuffix",0,
"") ;
1632 pc.
defineString(
"sliceCatState",
"SliceCat",0,
"",
true) ;
1635 pc.
defineSet(
"sliceSet",
"SliceVars",0) ;
1636 pc.
defineObject(
"sliceCatList",
"SliceCat",0,
nullptr,
true) ;
1645 pc.
defineInt(
"doEvalError",
"EvalErrorValue",0,0) ;
1646 pc.
defineInt(
"shiftToZero",
"ShiftToZero",0,0) ;
1647 pc.
defineSet(
"projDataSet",
"ProjData",0) ;
1651 pc.
defineSet(
"errorPars",
"VisualizeError",0) ;
1652 pc.
defineInt(
"linearMethod",
"VisualizeError",0,0) ;
1653 pc.
defineInt(
"binProjData",
"ProjData",0,0) ;
1656 pc.
defineInt(
"numee",
"PrintEvalErrors",0,10) ;
1657 pc.
defineInt(
"rangeAdjustNorm",
"Range",0,0) ;
1658 pc.
defineInt(
"rangeWNAdjustNorm",
"RangeWithName",0,0) ;
1662 pc.
defineInt(
"markerColor",
"MarkerColor",0,-999) ;
1663 pc.
defineInt(
"markerStyle",
"MarkerStyle",0,-999) ;
1665 pc.
defineInt(
"lineColor",
"LineColor",0,-999) ;
1666 pc.
defineInt(
"lineStyle",
"LineStyle",0,-999) ;
1667 pc.
defineInt(
"lineWidth",
"LineWidth",0,-999) ;
1668 pc.
defineInt(
"fillColor",
"FillColor",0,-999) ;
1669 pc.
defineInt(
"fillStyle",
"FillStyle",0,-999) ;
1671 pc.
defineInt(
"curveInvisible",
"Invisible",0,0) ;
1672 pc.
defineInt(
"showProg",
"ShowProgress",0,0) ;
1674 pc.
defineInt(
"interleave",
"NumCPU",1,0) ;
1678 pc.
defineInt(
"moveToBack",
"MoveToBack",0,0) ;
1682 pc.
defineMutex(
"VisualizeError",
"VisualizeErrorData") ;
1693 if (!drawOpt.
Contains(
"P") && errFR) {
1695 pc.
getInt(
"linearMethod"));
1715 std::unique_ptr<RooArgSet> sliceSet{sliceSetTmp ?
static_cast<RooArgSet*
>(sliceSetTmp->
Clone()) :
nullptr};
1721 if (
const char* sliceCatState = pc.
getString(
"sliceCatState",
nullptr,
true)) {
1726 sliceSet = std::make_unique<RooArgSet>();
1730 auto iter = sliceCatList.
begin();
1731 for (
auto const& catToken :
ROOT::Split(sliceCatState,
",")) {
1732 if (
auto scat =
static_cast<RooCategory*
>(*iter)) {
1734 scat->setLabel(catToken);
1736 sliceSet->add(*scat,
false) ;
1749 if (vlines==2) vlines=0 ;
1755 if (vlines==2) vlines=0 ;
1775 coutE(InputArguments) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") cannot find existing curve " << o.
addToCurveName <<
" to add to in RooPlot" << std::endl ;
1781 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have slice " << *sliceSet << std::endl ;
1786 for (
const auto sliceArg : *sliceSet) {
1787 if (
RooAbsArg* arg = projectedVars.
find(sliceArg->GetName())) {
1788 projectedVars.
remove(*arg) ;
1790 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") slice variable "
1791 << sliceArg->GetName() <<
" was not projected anyway" << std::endl ;
1794 }
else if (projSet) {
1795 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have projSet " << *projSet << std::endl ;
1798 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: have neither sliceSet nor projSet " << std::endl ;
1803 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") Preprocessing: projectedVars = " << projectedVars << std::endl ;
1827 if ((fillColor != -999 || fillStyle != -999) && !drawOpt.
Contains(
"F")) {
1828 coutW(Plotting) <<
"Fill color or style was set for plotting \"" <<
GetName()
1829 <<
"\", but these only have an effect when 'DrawOption(\"F\")' for fill is used at the same time." << std::endl;
1866 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have ProjData with observables = " << *o.
projData->
get() << std::endl ;
1869 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have ProjDataSet = " << *o.
projDataSet <<
" will only use this subset of projData" << std::endl ;
1871 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") using full ProjData" << std::endl ;
1876 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") ProjDataVars = " << projDataVars << std::endl ;
1882 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") have input projSet = " << *o.
projSet << std::endl ;
1884 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") calculated projectedVars = " << *o.
projSet << std::endl ;
1891 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") frame->getNormVars() that are also observables = " << sliceSetTmp << std::endl ;
1893 sliceSetTmp.
remove(projectedVars,
true,
true) ;
1898 sliceSetTmp.
remove(*tmp,
true,
true) ;
1901 if (!sliceSetTmp.
empty()) {
1902 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on "
1903 << frame->
getPlotVar()->
GetName() <<
" represents a slice in " << sliceSetTmp << std::endl ;
1905 sliceSet.
add(sliceSetTmp) ;
1911 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") projectedVars = " << projectedVars <<
" sliceSet = " << sliceSet << std::endl ;
1914 RooArgSet* projDataNeededVars = nullptr ;
1917 projDataNeededVars = projectedVars.
selectCommon(projDataVars);
1918 projectedVars.
remove(projDataVars,
true,
true) ;
1923 double oldPlotVarVal = plotVar->
getVal();
1926 if (!projectedVars.
empty()) {
1927 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->GetName()
1928 <<
" integrates over variables " << projectedVars
1931 if (projDataNeededVars && !projDataNeededVars->
empty()) {
1932 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
1933 <<
" averages using data variables " << *projDataNeededVars << std::endl ;
1937 RooArgSet* projectionCompList = nullptr ;
1941 deps.
remove(projectedVars,
true,
true) ;
1942 if (projDataNeededVars) {
1943 deps.
remove(*projDataNeededVars,
true,
true) ;
1945 deps.
remove(*plotVar,
true,
true) ;
1946 deps.
add(*plotVar) ;
1952 coutE(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") error in checkObservables, abort" << std::endl ;
1953 if (projDataNeededVars)
delete projDataNeededVars ;
1958 cxcoutD(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot projection object is " << projection->
GetName() << std::endl ;
1965 fullNormSet.
add(projectedVars) ;
1966 if (projDataNeededVars && !projDataNeededVars->
empty()) {
1967 fullNormSet.
add(*projDataNeededVars) ;
1970 std::unique_ptr<RooArgSet> projectionComponents(projection->
getComponents());
1971 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*projectionComponents)) {
1973 pdf->selectNormalization(&fullNormSet) ;
1978 if (o.
projData && projDataNeededVars && !projDataNeededVars->
empty()) {
1982 std::unique_ptr<RooAbsData> projDataSelOwned;
1989 if (!sliceDataSet->empty()) {
1991 for(
RooAbsArg * sliceVar : *sliceDataSet) {
2008 if (!cutString.
IsNull()) {
2009 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") reducing given projection dataset to entries with " << cutString << std::endl ;
2011 projDataSelOwned = std::unique_ptr<RooAbsData>{
const_cast<RooAbsData*
>(o.
projData)->reduce(*projDataNeededVars, cutString.
IsNull() ? nullptr : cutString)};
2012 projDataSel = projDataSelOwned.
get();
2014 <<
") only the following components of the projection data will be used: " << *projDataNeededVars << std::endl ;
2023 if (!
dynamic_cast<RooCategory*
>(arg2)) allCat =
false ;
2027 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") unbinned projection dataset consist only of discrete variables,"
2028 <<
" performing projection with binned copy for optimization." << std::endl ;
2035 projDataSelOwned = std::make_unique<RooDataHist>(std::string(projDataSel->
GetName()) +
"_binned",
"Binned projection data",*projDataSel->
get(),*projDataSel);
2036 projDataSel = projDataSelOwned.
get();
2040 ScaledDataWeightedAverage scaleBind{*projection, *projDataSel, o.
scaleFactor, *plotVar};
2049 std::string curveName(projection->
GetName()) ;
2052 if (!sliceSet.
empty()) {
2066 curve->
SetName(curveName.c_str()) ;
2117 std::string curveName(projection->
GetName()) ;
2118 if (!sliceSet.
empty()) {
2144 curve->
SetName(curveName.c_str()) ;
2165 if (projDataNeededVars)
delete projDataNeededVars ;
2166 delete projectionCompList ;
2167 plotVar->setVal(oldPlotVarVal);
2198 projDataVars.
add(*tmp) ;
2206 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2207 <<
") function doesn't depend on asymmetry category " << asymCat.
GetName() << std::endl ;
2213 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2214 <<
") asymmetry category must have 2 or 3 states with index values -1,0,1" << std::endl ;
2228 sliceSetTmp.
remove(projectedVars,
true,
true) ;
2233 sliceSetTmp.
remove(*tmp,
true,
true) ;
2236 if (!sliceSetTmp.
empty()) {
2237 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") plot on "
2238 << frame->
getPlotVar()->
GetName() <<
" represents a slice in " << sliceSetTmp << std::endl ;
2240 sliceSet.
add(sliceSetTmp) ;
2248 RooArgSet* projDataNeededVars = nullptr ;
2250 projDataNeededVars = projectedVars.
selectCommon(projDataVars);
2251 projectedVars.
remove(projDataVars,
true,
true) ;
2264 if (!projectedVars.
empty()) {
2265 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
2266 <<
" projects variables " << projectedVars << std::endl ;
2268 if (projDataNeededVars && !projDataNeededVars->
empty()) {
2269 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") plot on " << plotVar->
GetName()
2270 <<
" averages using data variables "<< *projDataNeededVars << std::endl ;
2278 asymNeg->setIndex(-1) ;
2284 custNeg.replaceArg(asymCat,*asymNeg) ;
2285 std::unique_ptr<RooAbsReal> funcPos{
static_cast<RooAbsReal*
>(custPos.build())};
2286 std::unique_ptr<RooAbsReal> funcNeg{
static_cast<RooAbsReal*
>(custNeg.build())};
2296 depPos.
add(projDataVars) ;
2297 depNeg.
add(projDataVars) ;
2301 if (!posProj || !negProj) {
2302 coutE(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName() <<
") Unable to create projections, abort" << std::endl ;
2308 asymName.
Append(
"_Asym[") ;
2312 asymTitle.
Append(
" Asymmetry of ") ;
2320 std::unique_ptr<RooAbsData> projDataSelOwned;
2327 if (!sliceDataSet.
empty()) {
2329 for(
RooAbsArg * sliceVar : sliceDataSet) {
2346 if (!cutString.
IsNull()) {
2347 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2348 <<
") reducing given projection dataset to entries with " << cutString << std::endl ;
2350 projDataSelOwned = std::unique_ptr<RooAbsData>{
const_cast<RooAbsData*
>(o.
projData)->reduce(*projDataNeededVars,cutString.
IsNull() ? nullptr : cutString)};
2351 projDataSel = projDataSelOwned.
get();
2352 coutI(Plotting) <<
"RooAbsReal::plotAsymOn(" <<
GetName()
2353 <<
") only the following components of the projection data will be used: " << *projDataNeededVars << std::endl ;
2358 ScaledDataWeightedAverage scaleBind{funcAsym, *projDataSel, o.
scaleFactor, *plotVar};
2367 TString curveName(funcAsym.GetName()) ;
2370 if (!sliceSet.
empty()) {
2380 RooCurve *curve =
new RooCurve(funcAsym.GetName(),funcAsym.GetTitle(),scaleBind,
2388 ccoutW(Eval) << std::endl ;
2406 TString curveName(funcAsym.GetName()) ;
2407 if (!sliceSet.
empty()) {
2422 delete posProjCompList ;
2423 delete negProjCompList ;
2455 for(
auto * rrvFitRes : static_range_cast<RooRealVar*>(fr.
floatParsFinal())) {
2457 auto rrvInAbsReal =
static_cast<RooRealVar const*
>(allParamsInAbsReal.
find(*rrvFitRes));
2464 if (rrvFitRes->getError() <= std::abs(rrvFitRes->getVal()) * std::numeric_limits<double>::epsilon())
continue;
2467 if(!rrvInAbsReal)
continue;
2471 if(std::abs(rrvInAbsReal->getVal() - rrvFitRes->getVal()) > 0.01 * rrvFitRes->getError()) {
2472 std::stringstream errMsg;
2473 errMsg <<
"RooAbsReal::getPropagatedError(): the parameters of the RooAbsReal don't have"
2474 <<
" the same values as in the fit result! The logic of getPropagatedError is broken in this case.";
2476 throw std::runtime_error(errMsg.str());
2479 paramList.
add(*rrvInAbsReal);
2482 std::vector<double> plusVar;
2483 std::vector<double> minusVar;
2484 plusVar.reserve(paramList.
size());
2485 minusVar.reserve(paramList.
size());
2492 for (std::size_t ivar=0 ; ivar<paramList.
size() ; ivar++) {
2494 auto& rrv =
static_cast<RooRealVar&
>(paramList[ivar]);
2496 double cenVal = rrv.
getVal() ;
2497 double errVal = sqrt(V(ivar,ivar)) ;
2500 rrv.setVal(cenVal+errVal) ;
2501 plusVar.push_back(
getVal(nset)) ;
2504 rrv.setVal(cenVal-errVal) ;
2505 minusVar.push_back(
getVal(nset)) ;
2507 rrv.setVal(cenVal) ;
2520 std::vector<double> errVec(paramList.
size()) ;
2521 for (std::size_t i=0 ; i<paramList.
size() ; i++) {
2522 errVec[i] = std::sqrt(V(i,i)) ;
2523 for (std::size_t j=i ; j<paramList.
size() ; j++) {
2524 C(i,j) = V(i,j) / std::sqrt(V(i,i)*V(j,j));
2531 for (std::size_t j=0 ; j<plusVar.size() ; j++) {
2532 F[j] = (plusVar[j]-minusVar[j]) * 0.5;
2536 double sum =
F*(C*
F) ;
2583 for (
auto * cmd : static_range_cast<RooCmdArg*>(plotArgListTmp)) {
2584 if (std::string(
"Normalization")==cmd->GetName()) {
2587 plotArgList.
Add(cmd) ;
2590 plotArgList.
Add(cmd) ;
2597 auto plotFunc = [&](
RooAbsReal const& absReal) {
2600 absReal.plotOn(frame, tmp);
2607 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":plotOnWithErrorBand: no curve for central value available" << std::endl;
2610 frame->
remove(
nullptr,
false) ;
2634 coutI(Plotting) <<
"RooAbsReal::plotOn(" <<
GetName() <<
") INFO: visualizing " << Z <<
"-sigma uncertainties in parameters "
2635 << errorParams <<
" from fit result " << fr.
GetName() <<
" using " <<
n <<
" samplings." << std::endl ;
2640 std::unique_ptr<RooDataSet> generatedData{paramPdf->
generate(errorParams,
n)};
2641 std::vector<RooCurve*> cvec ;
2642 for (
int i=0 ; i<generatedData->numEntries() ; i++) {
2643 cloneParams.
assign(*generatedData->get(i)) ;
2644 plotFunc(*cloneFunc);
2645 cvec.push_back(frame->
getCurve()) ;
2646 frame->
remove(
nullptr,
false) ;
2658 for (std::vector<RooCurve*>::iterator i=cvec.begin() ; i!=cvec.end() ; ++i) {
2676 for (
auto const* frv : static_range_cast<RooRealVar*>(fr.
floatParsFinal())) {
2677 if (frv->getError() > frv->getVal() * std::numeric_limits<double>::epsilon()) {
2678 fpf_stripped.
add(*frv);
2696 std::vector<int> fpf_idx ;
2697 for (std::size_t i=0 ; i<fpf.
size() ; i++) {
2700 paramList.
add(*par) ;
2701 fpf_idx.push_back(i) ;
2705 std::vector<RooCurve *> plusVar;
2706 std::vector<RooCurve *> minusVar;
2715 for (std::size_t ivar=0 ; ivar<paramList.
size() ; ivar++) {
2719 double cenVal = rrv.
getVal() ;
2720 double errVal = sqrt(V(ivar,ivar)) ;
2723 (
static_cast<RooRealVar*
>(paramList.
at(ivar)))->setVal(cenVal+Z*errVal) ;
2726 plotFunc(*cloneFunc);
2727 plusVar.push_back(frame->
getCurve()) ;
2728 frame->
remove(
nullptr,
false) ;
2732 (
static_cast<RooRealVar*
>(paramList.
at(ivar)))->setVal(cenVal-Z*errVal) ;
2733 plotFunc(*cloneFunc);
2734 minusVar.push_back(frame->
getCurve()) ;
2735 frame->
remove(
nullptr,
false) ;
2737 (
static_cast<RooRealVar*
>(paramList.
at(ivar)))->setVal(cenVal) ;
2741 std::vector<double> errVec(paramList.
size()) ;
2742 for (std::size_t i=0 ; i<paramList.
size() ; i++) {
2743 errVec[i] = sqrt(V(i,i)) ;
2744 for (std::size_t j=i ; j<paramList.
size() ; j++) {
2745 C(i,j) = V(i,j)/sqrt(V(i,i)*V(j,j)) ;
2755 for (std::vector<RooCurve*>::iterator i=plusVar.begin() ; i!=plusVar.end() ; ++i) {
2758 for (std::vector<RooCurve*>::iterator i=minusVar.begin() ; i!=minusVar.end() ; ++i) {
2765 if (!band)
return frame ;
2770 pc.
defineString(
"curveNameSuffix",
"CurveNameSuffix",0,
"") ;
2771 pc.
defineInt(
"lineColor",
"LineColor",0,-999) ;
2772 pc.
defineInt(
"lineStyle",
"LineStyle",0,-999) ;
2773 pc.
defineInt(
"lineWidth",
"LineWidth",0,-999) ;
2774 pc.
defineInt(
"markerColor",
"MarkerColor",0,-999) ;
2775 pc.
defineInt(
"markerStyle",
"MarkerStyle",0,-999) ;
2777 pc.
defineInt(
"fillColor",
"FillColor",0,-999) ;
2778 pc.
defineInt(
"fillStyle",
"FillStyle",0,-999) ;
2780 pc.
defineInt(
"curveInvisible",
"Invisible",0,0) ;
2781 pc.
defineInt(
"moveToBack",
"MoveToBack",0,0) ;
2812 if (pc.
getString(
"curveName",
nullptr,
true)) {
2814 }
else if (pc.
getString(
"curveNameSuffix",
nullptr,
true)) {
2838 if(
nullptr == frame) {
2847 <<
":plotOn: frame does not specify a plot variable" << std::endl;
2860 coutE(Plotting) <<
ClassName() <<
"::" <<
GetName() <<
":plotOn: WARNING: variable is not an explicit dependent: "
2861 << var->
GetName() << std::endl;
2879 RooArgSet& projectedVars,
bool silent)
const
2881 cxcoutD(Plotting) <<
"RooAbsReal::makeProjectionSet(" <<
GetName() <<
") plotVar = " << plotVar->
GetName()
2882 <<
" allVars = " << (allVars?(*allVars):
RooArgSet()) << std::endl ;
2885 if (!allVars) return ;
2888 projectedVars.
add(*allVars) ;
2893 projectedVars.
remove(*found);
2896 std::unique_ptr<RooArgSet> plotServers{plotVar->
getObservables(&projectedVars)};
2900 cxcoutD(Plotting) <<
"RooAbsReal::makeProjectionSet(" <<
GetName() <<
") removing " << tmp->GetName()
2901 <<
" from projection set because it a server of " << plotVar->
GetName() << std::endl ;
2902 projectedVars.
remove(*tmp) ;
2908 <<
") WARNING: cannot project out frame variable ("
2909 << found->
GetName() <<
"), ignoring" << std::endl ;
2916 projectedVars.
remove(*arg,
true) ;
2919 <<
") function doesn't depend on projection variable "
2920 << arg->
GetName() <<
", ignoring" << std::endl ;
2957 auto binding = std::make_unique<RooRealBinding>(*
this,vars,nset,clipInvalid);
2958 if(!binding->isValid()) {
2959 coutE(InputArguments) <<
ClassName() <<
"::" <<
GetName() <<
":bindVars: cannot bind to " << vars << std::endl ;
2974 auto other =
static_cast<const RooAbsReal*
>(source);
2975 assert(
dynamic_cast<const RooAbsReal*
>(source));
2977 _value = other->_treeReadBuffer ? other->_treeReadBuffer->operator
double() : other->_value;
3017 coutE(Eval) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") ERROR: TTree branch " <<
GetName()
3018 <<
" is an array and cannot be attached to a RooAbsReal" << std::endl ;
3028 std::map<std::string, std::pair<std::string, std::function<std::unique_ptr<TreeReadBuffer>()>>> typeMap {
3029 {
"Float_t", {
"FLOAT_TREE_BRANCH", [&](){
return createTreeReadBuffer<Float_t >(cleanName, t); }}},
3030 {
"Int_t", {
"INTEGER_TREE_BRANCH", [&](){
return createTreeReadBuffer<Int_t >(cleanName, t); }}},
3031 {
"UChar_t", {
"BYTE_TREE_BRANCH", [&](){
return createTreeReadBuffer<UChar_t >(cleanName, t); }}},
3032 {
"Bool_t", {
"BOOL_TREE_BRANCH", [&](){
return createTreeReadBuffer<Bool_t >(cleanName, t); }}},
3033 {
"Char_t", {
"SIGNEDBYTE_TREE_BRANCH", [&](){
return createTreeReadBuffer<Char_t >(cleanName, t); }}},
3034 {
"UInt_t", {
"UNSIGNED_INTEGER_TREE_BRANCH", [&](){
return createTreeReadBuffer<UInt_t >(cleanName, t); }}},
3035 {
"Long64_t", {
"LONG_TREE_BRANCH", [&](){
return createTreeReadBuffer<Long64_t >(cleanName, t); }}},
3036 {
"ULong64_t", {
"UNSIGNED_LONG_TREE_BRANCH", [&](){
return createTreeReadBuffer<ULong64_t>(cleanName, t); }}},
3037 {
"Short_t", {
"SHORT_TREE_BRANCH", [&](){
return createTreeReadBuffer<Short_t >(cleanName, t); }}},
3038 {
"UShort_t", {
"UNSIGNED_SHORT_TREE_BRANCH", [&](){
return createTreeReadBuffer<UShort_t >(cleanName, t); }}},
3041 auto typeDetails = typeMap.find(typeName.
Data());
3042 if (typeDetails != typeMap.end()) {
3043 coutI(DataHandling) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") TTree " << typeDetails->first <<
" branch " <<
GetName()
3044 <<
" will be converted to double precision." << std::endl ;
3054 coutE(InputArguments) <<
"RooAbsReal::attachToTree(" <<
GetName() <<
") data type " << typeName <<
" is not supported." << std::endl ;
3076 coutE(Eval) <<
"RooAbsReal::fillTreeBranch(" <<
GetName() <<
") ERROR: not attached to tree: " <<
cleanBranchName() << std::endl ;
3105 fund->removeRange();
3107 fund->setAttribute(
"fundamentalCopy");
3108 return RooFit::makeOwningPtr<RooAbsArg>(std::move(fund));
3214 const TList &nameList)
const
3217 bool isMatched(
true);
3218 for(
auto *
name : static_range_cast<TObjString*>(nameList)) {
3221 matched.
add(*found);
3231 if (isMatched &&
int(matched.
size())!=nameList.
GetSize()) {
3235 if(isMatched) matchedArgs.
add(matched);
3284 if (config)
return config ;
3297 if (config)
return config ;
3391 static bool inLogEvalError = false ;
3393 if (inLogEvalError) {
3396 inLogEvalError = true ;
3401 if (serverValueString) {
3406 oocoutE(
nullptr,Eval) <<
"RooAbsReal::logEvalError(" <<
"<STATIC>" <<
") evaluation error, " << std::endl
3407 <<
" origin : " << origName << std::endl
3408 <<
" message : " << ee.
_msg << std::endl
3409 <<
" server values: " << ee.
_srvval << std::endl ;
3416 inLogEvalError = false ;
3446 static bool inLogEvalError = false ;
3448 if (inLogEvalError) {
3451 inLogEvalError = true ;
3456 if (serverValueString) {
3459 std::string srvval ;
3460 std::ostringstream oss ;
3471 p->print(oss,
true) ;
3476 std::ostringstream oss2 ;
3480 coutE(Eval) <<
"RooAbsReal::logEvalError(" <<
GetName() <<
") evaluation error, " << std::endl
3481 <<
" origin : " << oss2.str() << std::endl
3482 <<
" message : " << ee.
_msg << std::endl
3483 <<
" server values: " << ee.
_srvval << std::endl ;
3492 <<
") delayed evaluation error, " << std::endl
3493 <<
" origin : " << oss2.str() << std::endl
3494 <<
" message : " << oee.
_msg << std::endl
3495 <<
" server values: " << oee.
_srvval << std::endl ;
3502 inLogEvalError = false ;
3558 if (maxPerNode<0) return ;
3561 if (maxPerNode==0) {
3564 os << iter->second.first ;
3566 os <<
" has " << iter->second.second.size() <<
" errors" << std::endl ;
3571 os << iter->second.first << std::endl ;
3575 for(
auto iter2 = iter->second.second.begin();iter2!=iter->second.second.end() ; ++iter2, i++) {
3576 os <<
" " << iter2->_msg <<
" @ " << iter2->_srvval << std::endl ;
3578 os <<
" ... (remaining " << iter->second.second.size() - maxPerNode <<
" messages suppressed)" << std::endl ;
3599 ntot += elem.second.second.size() ;
3619 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*compSet)) {
3621 if (!addNormSet.
empty()) {
3622 pdf->selectNormalization(&addNormSet,force) ;
3624 pdf->selectNormalization(
nullptr,force) ;
3644 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(*compSet)) {
3646 pdf->selectNormalizationRange(rangeName,force) ;
3664 orderedObs.
add(obs) ;
3722 pc.
defineSet(
"supNormSet",
"SupNormSet",0,
nullptr) ;
3723 pc.
defineInt(
"numScanBins",
"ScanParameters",0,1000) ;
3724 pc.
defineInt(
"intOrder",
"ScanParameters",1,2) ;
3725 pc.
defineInt(
"doScanNum",
"ScanNum",0,1) ;
3726 pc.
defineInt(
"doScanAll",
"ScanAll",0,0) ;
3727 pc.
defineInt(
"doScanNon",
"ScanNone",0,0) ;
3731 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
3759 coutI(NumIntegration) <<
"RooAbsPdf::createRunningIntegral(" <<
GetName() <<
") integration over observable(s) " << iset <<
" involves numeric integration," << std::endl
3760 <<
" constructing cdf though numeric integration of sampled pdf in " << numScanBins <<
" bins and applying order "
3761 << intOrder <<
" interpolation on integrated histogram." << std::endl
3762 <<
" To override this choice of technique use argument ScanNone(), to change scan parameters use ScanParameters(nbins,order) argument" << std::endl ;
3780 ivar->
setBins(numScanBins,
"numcdf") ;
3781 auto ret = std::make_unique<RooNumRunningInt>(
name.c_str(),
name.c_str(),*
this,*ivar,
"numrunint") ;
3782 ret->setInterpolationOrder(intOrder) ;
3783 return RooFit::makeOwningPtr<RooAbsReal>(std::move(ret));
3801 coutW(InputArguments) <<
"RooAbsPdf::createRunningIntegral(" <<
GetName() <<
") WARNING ignoring non-RooRealVar input argument " << arg->
GetName() << std::endl ;
3815 for(
auto * rrv : static_range_cast<RooRealVar*>(ilist)) {
3819 cloneList.
add(*cloneArg) ;
3824 cloneLo->
setVal(rrv->getMin()) ;
3825 loList.
add(*cloneLo) ;
3837 finalNset.
add(cloneList,
true) ;
3838 std::unique_ptr<RooAbsReal> cdf{tmp->createIntegral(cloneList,finalNset,
"CDF")};
3841 cdf->addOwnedComponents(*tmp) ;
3842 cdf->addOwnedComponents(cloneList) ;
3843 cdf->addOwnedComponents(loList) ;
3857 if (realObs.
size() != obs.
size()) {
3858 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified observables are not variables of this p.d.f" << std::endl ;
3863 if (realPars.
size() != pars.
size()) {
3864 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified parameters are not variables of this p.d.f" << std::endl ;
3882 if (realObs.
size() != obs.
size()) {
3883 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified observables are not variables of this p.d.f" << std::endl ;
3888 if (realPars.
size() != pars.
size()) {
3889 coutE(InputArguments) <<
"RooAbsReal::functor(" <<
GetName() <<
") ERROR: one or more specified parameters are not variables of this p.d.f" << std::endl ;
3894 for (std::size_t i=0 ; i<obs.
size() ; i++) {
3896 coutE(ObjectHandling) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: proposed observable " << obs.
at(0)->
GetName() <<
" is not of type RooRealVar" << std::endl ;
3900 for (std::size_t i=0 ; i<pars.
size() ; i++) {
3902 coutE(ObjectHandling) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: proposed parameter " << pars.
at(0)->
GetName() <<
" is not of type RooRealVar" << std::endl ;
3910 switch(obs.
size()) {
3933 coutE(InputArguments) <<
"RooAbsReal::asTF(" <<
GetName() <<
") ERROR: " << obs.
size()
3934 <<
" observables specified, but a ROOT TFx can only have 1,2 or 3 observables" << std::endl ;
3939 for (std::size_t i=0 ; i<pars.
size() ; i++) {
3969 return new RooDerivative(
name.c_str(),title.c_str(),*
this,obs,normSet,order,eps) ;
3984 std::string title=
Form(
"%sMoment of order %d of %s w.r.t %s ",(central?
"Central ":
""),order,
GetName(),obs.
GetName()) ;
3986 if (order==2)
return new RooSecondMoment(
name.c_str(),title.c_str(),*
this,obs,central,takeRoot) ;
3987 return new RooMoment(
name.c_str(),title.c_str(),*
this,obs,order,central,takeRoot) ;
4003 std::string title=
Form(
"%sMoment of order %d of %s w.r.t %s ",(central?
"Central ":
""),order,
GetName(),obs.
GetName()) ;
4005 if (order==1)
return new RooFirstMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,intNormObs) ;
4006 if (order==2)
return new RooSecondMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,central,takeRoot,intNormObs) ;
4007 return new RooMoment(
name.c_str(),title.c_str(),*
this,obs,normObs,order,central,takeRoot,intNormObs) ;
4293 for (
auto const* arg : paramVars) {
4295 coutW(InputArguments) <<
"RooAbsReal::setParameterizeIntegral(" <<
GetName()
4296 <<
") function does not depend on listed parameter " << arg->
GetName() <<
", ignoring" << std::endl ;
4299 if (!plist.empty()) plist +=
":" ;
4317 std::span<const double> batch;
4323 std::vector<ServerData> ourServers;
4326 for (
auto server :
servers()) {
4327 auto serverValues = ctx.
at(server);
4328 if(serverValues.empty())
continue;
4331 auto oldOperMode = server->operMode();
4336 ourServers.push_back({server,
4340 server->_valueDirty,
4341 server->_shapeDirty});
4347 struct RestoreStateRAII {
4348 RestoreStateRAII(std::vector<ServerData>& servers) :
4349 _servers{servers} { }
4351 ~RestoreStateRAII() {
4352 for (
auto& serverData : _servers) {
4353 serverData.server->setCachedValue(serverData.oldValue,
true);
4354 serverData.server->setOperMode(serverData.oldOperMode);
4355 serverData.server->_valueDirty = serverData.oldValueDirty;
4356 serverData.server->_shapeDirty = serverData.oldShapeDirty;
4360 std::vector<ServerData>& _servers;
4361 } restoreState{ourServers};
4367 coutI(FastEvaluations) <<
"The class " <<
ClassName() <<
" does not implement the faster batch evaluation interface."
4368 <<
" Consider requesting or implementing it to benefit from a speed up." << std::endl;
4374 for (std::size_t i=0; i <
output.size(); ++i) {
4375 for (
auto& serv : ourServers) {
4376 serv.server->setCachedValue(serv.batch[std::min(i, serv.batch.size()-1)],
false);
4394 std::stringstream errorMsg;
4395 errorMsg <<
"An analytical integral function for class \"" <<
ClassName() <<
"\" has not yet been implemented.";
4396 coutE(Minimization) << errorMsg.str() << std::endl;
4397 throw std::runtime_error(errorMsg.str().c_str());
4402 const bool tmpFast =
_fast;
4403 const double tmp =
_value;
4405 double fullEval = 0.;
4407 fullEval =
getValV(normalisationSet);
4416 if (std::isfinite(ret) && ( ret != 0. ? (ret - fullEval)/ret : ret - fullEval) > 1.E-9) {
4421 formatter <<
"--> (Scalar computation wrong here:)\n"
4422 <<
GetName() <<
" " <<
this <<
" _fast=" << tmpFast
4423 <<
"\n\tcached _value=" << std::setprecision(16) << tmp
4424 <<
"\n\treturning =" << ret
4425 <<
"\n\trecomputed =" << fullEval
4426 <<
"\n\tnew _value =" <<
_value <<
"] ";
4427 formatter <<
"\nServers:";
4441 bool nameChange,
bool isRecursiveStep)
4453 if(
auto realArg =
dynamic_cast<RooAbsReal*
>(arg)) {
4454 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 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 ...
virtual double getMax(const char *name=nullptr) const
Get maximum of currently defined range.
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 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)
std::unique_ptr< TreeReadBuffer > _treeReadBuffer
virtual std::list< double > * binBoundaries(RooAbsRealLValue &obs, double xlo, double xhi) const
Retrieve bin boundaries if this distribution is binned in obs.
RooFit::OwningPtr< RooAbsReal > createIntegral(const RooArgSet &iset, 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
Create an object that represents the integral of the function over one or more observables listed in ...
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.
virtual double getValV(const RooArgSet *normalisationSet=nullptr) const
Return value of object.
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...
static std::map< const RooAbsArg *, std::pair< std::string, std::list< EvalError > > > _evalErrorList
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={})
Perform a fit to given histogram.
TF1 * asTF(const RooArgList &obs, const RooArgList &pars=RooArgList(), const RooArgSet &nset=RooArgSet()) const
Return a ROOT TF1,2,3 object bound to this RooAbsReal with given definition of observables and parame...
TString _unit
Unit for objects value.
static RooNumIntConfig * defaultIntegratorConfig()
Returns the default numeric integration configuration for all RooAbsReals.
bool readFromStream(std::istream &is, bool compact, bool verbose=false) override
Read object contents from stream (dummy for now)
bool matchArgs(const RooArgSet &allDeps, RooArgSet &numDeps, const RooArgProxy &a) const
Utility function for use in getAnalyticalIntegral().
void fillTreeBranch(TTree &t) override
Fill the tree branch that associated with this object with its current value.
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Structure printing.
virtual RooPlot * plotAsymOn(RooPlot *frame, const RooAbsCategoryLValue &asymCat, PlotOpt o) const