197 coutI(Minimization) <<
"p.d.f. provides expected number of events, including extended term in likelihood."
207 if (extendedCmdArg == 0) {
209 std::string errMsg =
"You used the Extended(false) option on a pdf where the fit MUST be extended! "
210 "The parameters are not well defined and you're getting nonsensical results.";
211 coutE(InputArguments) << errMsg << std::endl;
214 return extendedCmdArg;
219inline double getLog(
double prob,
RooAbsReal const *caller)
222 if (std::abs(prob) > 1e6) {
223 oocoutW(caller, Eval) <<
"RooAbsPdf::getLogVal(" << caller->
GetName()
224 <<
") WARNING: top-level pdf has a large value: " << prob << std::endl;
228 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to a negative number");
233 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to zero");
235 return -std::numeric_limits<double>::infinity();
239 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to NaN");
244 return std::log(prob);
250 const char* rangeName,
bool splitRange)
258 if(!rangeName || splitRange)
return;
263 std::string fitrangeValue;
265 for (
auto const &subrange : subranges) {
266 if (subrange.empty())
268 std::string fitrangeValueSubrange = std::string(
"fit_") + baseName;
269 if (subranges.size() > 1) {
270 fitrangeValueSubrange +=
"_" + subrange;
272 fitrangeValue += fitrangeValueSubrange +
",";
275 if(arg->isCategory())
continue;
276 auto& observable =
static_cast<RooRealVar&
>(*arg);
278 observable.
setRange(fitrangeValueSubrange.c_str(), observable.getMin(subrange.c_str()),
279 observable.getMax(subrange.c_str()));
282 pdf.
setStringAttribute(
"fitrange", fitrangeValue.substr(0, fitrangeValue.size() - 1).c_str());
330 double plotMin,
double plotMax) :
331 RooAbsReal(
name,title,plotMin,plotMax), _normMgr(this,10), _selectComp(true)
344 _normMgr(other._normMgr,this), _selectComp(other._selectComp), _normRange(other._normRange)
366 if (normVal < 0. || (normVal == 0. && rawVal != 0)) {
368 const std::string msg =
"p.d.f normalization integral is zero or negative: " + std::to_string(normVal);
375 logEvalError(
Form(
"p.d.f value is less than zero (%f), trying to recover", rawVal));
386 return (rawVal == 0. && normVal == 0.) ? 0. : rawVal / normVal;
416 bool nintChanged(
false) ;
448 cxcoutD(Eval) <<
"RooAbsPdf::analyticalIntegralWN(" <<
GetName() <<
") code = " << code <<
" normset = " << (normSet?*normSet:
RooArgSet()) << endl ;
451 if (code==0)
return getVal(normSet) ;
480 if(!error)
return error ;
503 if (!nset)
return 1 ;
511 coutW(Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
":: WARNING normalization is zero, nset = " ; nset->
Print(
"1") ;
512 if(
_errorCount == 10)
coutW(Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
") INFO: no more messages will be printed " << endl ;
530 return cache->
_norm ;
592 ((
RooAbsPdf*)
this)->setProxyNormSet(nset) ;
601 <<
") recreating normalization integral " << endl ;
604 cxcoutD(Tracing) <<
ClassName() <<
"::syncNormalization(" <<
GetName() <<
") selfNormalized, creating unit norm" << endl;
610 auto ntitle = std::string(
GetTitle()) +
" Unit Normalization";
611 auto nname = std::string(
GetName()) +
"_UnitNorm";
625 static_cast<RooRealIntegral*
>(normInt)->setAllowComponentSelection(
false);
630 if (cacheParamsStr && strlen(cacheParamsStr)) {
632 std::unique_ptr<RooArgSet> intParams{normInt->
getVariables()} ;
636 if (!cacheParams.
empty()) {
637 cxcoutD(Caching) <<
"RooAbsReal::createIntObj(" <<
GetName() <<
") INFO: constructing " << cacheParams.
getSize()
638 <<
"-dim value cache for integral over " << depList <<
" as a function of " << cacheParams <<
" in range " << (nr?nr:
"<default>") << endl ;
647 normInt= cachedIntegral ;
689 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(branchList)) {
690 if (pdf) pdf->setTraceCounter(
value,
false) ;
705 return getLog(
getVal(nset),
this);
715bool checkInfNaNNeg(
const T& inputs) {
721 for (
double val : inputs) {
722 inf |= !std::isfinite(val);
727 return inf || nan || neg;
738 for (
unsigned int i=0; i<outputs.size(); ++i) {
739 const double value = outputs[i];
743 }
else if (!std::isfinite(outputs[i])){
746 }
else if (outputs[i] < 0.) {
747 logEvalError(
Form(
"p.d.f value of (%s) is less than zero (%f) for entry %zu",
755 for (std::size_t i = 0; i < pdfValues.size(); ++i) {
756 output[i] = getLog(pdfValues[i],
this);
817 coutE(InputArguments) <<
GetName() <<
": this PDF does not support extended maximum likelihood"
823 coutE(InputArguments) <<
GetName() <<
": calculated negative expected events: " << expected
825 logEvalError(
"extendedTerm #expected events is <0 return a NaN");
831 if (std::abs(expected)<1
e-10 && std::abs(sumEntries)<1
e-10) {
837 logEvalError(
"extendedTerm #expected events is a NaN") ;
841 double extra = doOffset
842 ? (expected - sumEntries) - sumEntries * (std::log(expected) - std::log(sumEntries))
843 : expected - sumEntries * std::log(expected);
845 if(sumEntriesW2 != 0.0) {
846 extra *= sumEntriesW2 / sumEntries;
877 double sumW =
data.sumEntries();
880 sumW2 =
data.sumEntriesW2();
1024 auto baseName = std::string(
"nll_") +
GetName() +
"_" +
data.GetName();
1029 pc.
defineString(
"rangeName",
"RangeWithName",0,
"",
true) ;
1031 pc.
defineString(
"globstag",
"GlobalObservablesTag",0,
"") ;
1032 pc.
defineString(
"globssource",
"GlobalObservablesSource",0,
"data") ;
1035 pc.
defineInt(
"splitRange",
"SplitRange",0,0) ;
1038 pc.
defineInt(
"interleave",
"NumCPU",1,0) ;
1040 pc.
defineInt(
"optConst",
"Optimize",0,0) ;
1041 pc.
defineInt(
"cloneData",
"CloneData", 0, 2);
1042 pc.
defineSet(
"projDepSet",
"ProjectedObservables",0,0) ;
1044 pc.
defineSet(
"glObs",
"GlobalObservables",0,0) ;
1045 pc.
defineInt(
"doOffset",
"OffsetLikelihood",0,0) ;
1046 pc.
defineSet(
"extCons",
"ExternalConstraints",0,0) ;
1048 pc.
defineDouble(
"IntegrateBins",
"IntegrateBins", 0, -1.);
1050 pc.
defineMutex(
"GlobalObservables",
"GlobalObservablesTag") ;
1051 pc.
defineInt(
"ModularL",
"ModularL", 0, 0);
1065 if (pc.
getInt(
"ModularL")) {
1066 int lut[3] = {2, 1, 0};
1074 if (
auto tmp = pc.
getSet(
"cPars"))
1077 if (
auto tmp = pc.
getSet(
"extCons"))
1078 extConsSet.
add(*tmp);
1080 if (
auto tmp = pc.
getSet(
"glObs"))
1083 const std::string rangeName = pc.
getString(
"globstag",
"",
false);
1086 builder.Extended(ext)
1087 .ConstrainedParameters(cParsSet)
1088 .ExternalConstraints(extConsSet)
1089 .GlobalObservables(glObsSet)
1090 .GlobalObservablesTag(rangeName.c_str());
1092 return std::make_unique<RooFit::TestStatistics::RooRealL>(
"likelihood",
"", builder.build());
1096 const char* rangeName = pc.
getString(
"rangeName",0,
true) ;
1097 const char* addCoefRangeName = pc.
getString(
"addCoefRange",0,
true) ;
1102 if (numcpu_strategy==3 && !this->
InheritsFrom(
"RooSimultaneous") ) {
1103 coutW(Minimization) <<
"Cannot use a NumCpu Strategy = 3 when the pdf is not a RooSimultaneous, "
1104 "falling back to default strategy = 0" << endl;
1105 numcpu_strategy = 0;
1110 bool verbose = pc.
getInt(
"verbose") ;
1117 cloneData = optConst ;
1121 double rangeLo = pc.
getDouble(
"rangeLo") ;
1122 double rangeHi = pc.
getDouble(
"rangeHi") ;
1127 for (
auto arg : obs) {
1129 if (rrv) rrv->
setRange(
"fit",rangeLo,rangeHi) ;
1137 resetFitrangeAttributes(*
this,
data, baseName, rangeName, splitRange);
1140 auto tmp = pc.
getSet(
"projDepSet");
1142 projDeps.
add(*tmp) ;
1145 const std::string globalObservablesSource = pc.
getString(
"globssource",
"data",
false);
1146 if(globalObservablesSource !=
"data" && globalObservablesSource !=
"model") {
1147 std::string errMsg =
"RooAbsPdf::fitTo: GlobalObservablesSource can only be \"data\" or \"model\"!";
1148 coutE(InputArguments) << errMsg << std::endl;
1149 throw std::invalid_argument(errMsg);
1151 const bool takeGlobalObservablesFromData = globalObservablesSource ==
"data";
1156 auto createConstr = [&](
RooAbsPdf const& pdf,
bool removeConstraintsFromPdf=
false) -> std::unique_ptr<RooAbsReal> {
1158 baseName +
"_constr",
1165 takeGlobalObservablesFromData,
1166 removeConstraintsFromPdf
1182 normSet.
remove(projDeps,
true,
true);
1188 ctx.setLikelihoodMode(
true);
1190 std::unique_ptr<RooAbsPdf> pdfClone = std::unique_ptr<RooAbsPdf>{
static_cast<RooAbsPdf *
>(head.release())};
1199 if (addCoefRangeName) {
1201 <<
") fixing interpretation of coefficients of any component to range "
1202 << addCoefRangeName <<
"\n";
1203 pdfClone->fixAddCoefRange(addCoefRangeName,
false);
1206 std::unique_ptr<RooAbsReal> compiledConstr;
1207 if(std::unique_ptr<RooAbsReal> constr = createConstr(*
this)) {
1209 compiledConstr->addOwnedComponents(std::move(constr));
1215 std::move(compiledConstr),
1216 rangeName ? rangeName :
"",
1222 std::unique_ptr<RooAbsReal> nllWrapper;
1225 static int iFuncWrapper = 0;
1226 std::string wrapperName =
"nll_func_wrapper_" + std::to_string(iFuncWrapper++);
1229 nllWrapper = std::make_unique<RooFuncWrapper>(wrapperName.c_str(), wrapperName.c_str(), *nll, normSet, &
data,
1230 simPdf, createGradient);
1233 nllWrapper = std::make_unique<RooEvaluatorWrapper>(*nll,
1234 std::move(evaluator), rangeName ? rangeName :
"",
dynamic_cast<RooSimultaneous *
>(pdfClone.get()), takeGlobalObservablesFromData);
1235 nllWrapper->setData(
data,
false);
1238 nllWrapper->addOwnedComponents(std::move(nll));
1239 nllWrapper->addOwnedComponents(std::move(pdfClone));
1244 RooAbsPdf &actualPdf = binnedLInfo.binnedPdf ? *binnedLInfo.binnedPdf : *
this;
1248 std::unique_ptr<RooAbsReal> nll ;
1257 cfg.
binnedL = binnedLInfo.isBinnedL;
1259 cfg.
rangeName = rangeName ? rangeName :
"";
1260 auto nllVar = std::make_unique<RooNLLVar>(baseName.c_str(),
"-log(likelihood)",actualPdf,
data,projDeps, ext, cfg);
1262 nll = std::move(nllVar);
1266 if (std::unique_ptr<RooAbsReal> constraintTerm = createConstr(*
this)) {
1278 constraintTerm->setData(
data,
false);
1284 auto orignll = std::move(nll) ;
1285 nll = std::make_unique<RooAddition>((baseName +
"_with_constr").c_str(),
"nllWithCons",
RooArgSet(*orignll,*constraintTerm)) ;
1286 nll->addOwnedComponents(std::move(orignll),std::move(constraintTerm)) ;
1294 nll->enableOffsetting(
true) ;
1431 std::string nllCmdListString =
"ProjectedObservables,Extended,Range,"
1432 "RangeWithName,SumCoefRange,NumCPU,SplitRange,Constrained,Constrain,ExternalConstraints,"
1433 "CloneData,GlobalObservables,GlobalObservablesSource,GlobalObservablesTag,"
1434 "EvalBackend,IntegrateBins,ModularL";
1437 nllCmdListString +=
",OffsetLikelihood";
1451 if (pc.
getInt(
"timingAnalysis") && !this->InheritsFrom(
"RooSimultaneous") ) {
1452 coutW(Minimization) <<
"The timingAnalysis feature was built for minimization with RooSimultaneous "
1453 "and is not implemented for other PDF's. Please create a RooSimultaneous to "
1454 "enable this feature." << endl;
1461 size_t nEvents =
static_cast<size_t>(prefit*
data.numEntries());
1462 if (prefit > 0.5 || nEvents < 100) {
1463 coutW(InputArguments) <<
"PrefitDataFraction should be in suitable range."
1464 <<
"With the current PrefitDataFraction=" << prefit
1465 <<
", the number of events would be " << nEvents<<
" out of "
1466 <<
data.numEntries() <<
". Skipping prefit..." << endl;
1469 size_t step =
data.numEntries()/nEvents;
1474 for (
int i=0; i<
data.numEntries(); i+=step)
1480 pc.
filterCmdList(tinyCmdList,
"Prefit,Hesse,Minos,Verbose,Save,Timer");
1484 tinyCmdList.
Add(&hesse_option);
1485 tinyCmdList.
Add(&print_option);
1487 fitTo(tiny,tinyCmdList);
1492 if (pc.
getInt(
"parallelize") != 0 || pc.
getInt(
"enableParallelGradient") || pc.
getInt(
"enableParallelDescent")) {
1495 nllCmdList.
Add(&modularL_option);
1498 std::unique_ptr<RooAbsReal> nll{
createNLL(
data,nllCmdList)};
1529 os <<
indent <<
"--- RooAbsPdf ---" << endl;
1532 os <<
indent <<
" Normalization integral: " << endl ;
1533 auto moreIndent = std::string(
indent.Data()) +
" " ;
1554 const RooArgSet* auxProto,
bool verbose)
const
1556 return new RooGenContext(*
this,vars,prototype,auxProto,verbose) ;
1563 bool verbose,
bool autoBinned,
const char* binnedTag)
const
1565 if (prototype || (auxProto && auxProto->
getSize()>0)) {
1566 return genContext(vars,prototype,auxProto,verbose);
1643 pc.
defineInt(
"randProto",
"PrototypeData",0,0) ;
1644 pc.
defineInt(
"resampleProto",
"PrototypeData",1,0) ;
1646 pc.
defineInt(
"extended",
"Extended",0,0) ;
1647 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
1648 pc.
defineInt(
"autoBinned",
"AutoBinned",0,1) ;
1649 pc.
defineInt(
"expectedData",
"ExpectedData",0,0) ;
1656 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
1663 const char* dsetName = pc.
getString(
"dsetName") ;
1664 bool verbose = pc.
getInt(
"verbose") ;
1665 bool randProto = pc.
getInt(
"randProto") ;
1666 bool resampleProto = pc.
getInt(
"resampleProto") ;
1667 bool extended = pc.
getInt(
"extended") ;
1668 bool autoBinned = pc.
getInt(
"autoBinned") ;
1669 const char* binnedTag = pc.
getString(
"binnedTag") ;
1671 double nEventsD = pc.
getInt(
"nEventsD") ;
1673 bool expectedData = pc.
getInt(
"expectedData") ;
1675 double nEvents = (nEventsD>0) ? nEventsD :
double(nEventsI);
1684 }
else if (nEvents==0) {
1685 cxcoutI(Generation) <<
"No number of events specified , number of events generated is "
1689 if (extended && protoData && !randProto) {
1690 cxcoutI(Generation) <<
"WARNING Using generator option Extended() (Poisson distribution of #events) together "
1691 <<
"with a prototype dataset implies incomplete sampling or oversampling of proto data. "
1692 <<
"Set randomize flag in ProtoData() option to randomize prototype dataset order and thus "
1693 <<
"to randomize the set of over/undersampled prototype events for each generation cycle." << endl ;
1698 std::unique_ptr<RooDataSet>
data;
1700 data = std::unique_ptr<RooDataSet>{
generate(whatVars,*protoData,
Int_t(nEvents),verbose,randProto,resampleProto)};
1702 data = std::unique_ptr<RooDataSet>{
generate(whatVars,nEvents,verbose,autoBinned,binnedTag,expectedData, extended)};
1706 if (dsetName && strlen(dsetName)>0) {
1707 data->SetName(dsetName) ;
1735 pc.
defineInt(
"randProto",
"PrototypeData",0,0) ;
1736 pc.
defineInt(
"resampleProto",
"PrototypeData",1,0) ;
1738 pc.
defineInt(
"extended",
"Extended",0,0) ;
1739 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
1740 pc.
defineInt(
"autoBinned",
"AutoBinned",0,1) ;
1746 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
1753 const char* dsetName = pc.
getString(
"dsetName") ;
1755 bool verbose = pc.
getInt(
"verbose") ;
1756 bool randProto = pc.
getInt(
"randProto") ;
1757 bool resampleProto = pc.
getInt(
"resampleProto") ;
1758 bool extended = pc.
getInt(
"extended") ;
1759 bool autoBinned = pc.
getInt(
"autoBinned") ;
1760 const char* binnedTag = pc.
getString(
"binnedTag") ;
1764 return new GenSpec(cx,whatVars,protoData,nEvents,extended,randProto,resampleProto,dsetName) ;
1818 std::unique_ptr<RooAbsGenContext> context{
autoGenContext(whatVars,0,0,verbose,autoBinned,binnedTag)};
1823 std::unique_ptr<RooDataSet> generated;
1824 if(0 != context && context->isValid()) {
1825 generated = std::unique_ptr<RooDataSet>{context->generate(nEvents,
false, extended)};
1828 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") cannot create a valid context" << endl;
1840 double nEvents,
bool ,
bool randProtoOrder,
bool resampleProto,
1841 bool skipInit,
bool extended)
const
1843 if (nEvents==0 && (prototype==0 || prototype->
numEntries()==0)) {
1844 return std::make_unique<RooDataSet>(
"emptyData",
"emptyData",whatVars);
1847 std::unique_ptr<RooDataSet> generated;
1850 if (resampleProto) {
1851 randProtoOrder=true ;
1854 if (randProtoOrder && prototype && prototype->
numEntries()!=nEvents) {
1855 coutI(Generation) <<
"RooAbsPdf::generate (Re)randomizing event order in prototype dataset (Nevt=" << nEvents <<
")" << endl ;
1862 generated = std::unique_ptr<RooDataSet>{context.
generate(nEvents,skipInit,extended)};
1865 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") do not have a valid generator context" << endl;
1896 Int_t nEvents,
bool verbose,
bool randProtoOrder,
bool resampleProto)
const
1898 std::unique_ptr<RooAbsGenContext> context{
genContext(whatVars,&prototype,0,verbose)};
1902 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") ERROR creating generator context" << endl ;
1917 if (!resampleProto) {
1919 std::iota(lut, lut + nProto, 0);
1925 for (
int i = nProto-1; i > 0; --i) {
1990 if(server == &arg)
continue;
1991 if(server->dependsOn(arg)) {
2032 pc.
defineInt(
"extended",
"Extended",0,0) ;
2033 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
2035 pc.
defineInt(
"expectedData",
"ExpectedData",0,0) ;
2038 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2044 double nEvents = pc.
getDouble(
"nEventsD") ;
2046 nEvents = pc.
getInt(
"nEvents") ;
2049 bool extended = pc.
getInt(
"extended") ;
2050 bool expectedData = pc.
getInt(
"expectedData") ;
2051 const char* dsetName = pc.
getString(
"dsetName") ;
2056 cxcoutI(Generation) <<
" Extended mode active, number of events generated (" << nEvents <<
") is Poisson fluctuation on "
2057 <<
GetName() <<
"::expectedEvents() = " << nEvents << endl ;
2062 }
else if (nEvents==0) {
2063 cxcoutI(Generation) <<
"No number of events specified , number of events generated is "
2071 if (dsetName && strlen(dsetName)>0) {
2072 data->SetName(dsetName) ;
2109 auto hist = std::make_unique<RooDataHist>(
"genData",
"genData",whatVars);
2114 coutE(InputArguments) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") ERROR: No event count provided and p.d.f does not provide expected number of events" << endl ;
2119 if (expectedData || extended) {
2130 vector<int> histOut(hist->numEntries()) ;
2131 double histMax(-1) ;
2132 Int_t histOutSum(0) ;
2133 for (
int i=0 ; i<hist->numEntries() ; i++) {
2138 double w=hist->weight()*nEvents ;
2139 hist->set(i,
w, sqrt(
w));
2141 }
else if (extended) {
2145 hist->set(
w,sqrt(
w)) ;
2151 if (hist->weight()>histMax) {
2152 histMax = hist->weight() ;
2155 histOutSum += histOut[i] ;
2160 if (!expectedData && !extended) {
2165 Int_t nEvtExtra = std::abs(
Int_t(nEvents)-histOutSum) ;
2166 Int_t wgt = (histOutSum>nEvents) ? -1 : 1 ;
2169 std::size_t counter = 0;
2170 bool havePrintedInfo =
false;
2171 while(nEvtExtra>0) {
2174 hist->get(ibinRand) ;
2177 if (ranY<hist->weight()) {
2179 histOut[ibinRand]++ ;
2182 if (histOut[ibinRand]>0) {
2183 histOut[ibinRand]-- ;
2191 if ((counter++ > 10*nEvents || nEvents > 1.E7) && !havePrintedInfo) {
2192 havePrintedInfo =
true;
2193 coutP(Generation) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") Performing costly accept/reject sampling. If this takes too long, use "
2194 <<
"extended mode to speed up the process." << std::endl;
2199 for (
int i=0 ; i<hist->numEntries() ; i++) {
2201 hist->set(histOut[i],sqrt(1.0*histOut[i])) ;
2204 }
else if (expectedData) {
2209 double corr = nEvents/hist->sumEntries() ;
2210 for (
int i=0 ; i<hist->numEntries() ; i++) {
2212 hist->set(hist->weight()*corr,sqrt(hist->weight()*corr)) ;
2227 return generate(whatVars,nEvents) ;
2231void removeRangeOverlap(std::vector<std::pair<double, double>>& ranges) {
2233 std::sort(ranges.begin(), ranges.end());
2235 for (
auto it = ranges.begin(); it != ranges.end(); ++it) {
2236 double& startL = it->first;
2237 double& endL = it->second;
2239 for (
auto innerIt = it+1; innerIt != ranges.end(); ++innerIt) {
2240 const double startR = innerIt->first;
2241 const double endR = innerIt->second;
2243 if (startL <= startR && startR <= endL) {
2245 endL = std::max(endL, endR);
2246 *innerIt = make_pair(0., 0.);
2251 auto newEnd = std::remove_if(ranges.begin(), ranges.end(),
2252 [](
const std::pair<double,double>&
input){
2253 return input.first == input.second;
2255 ranges.erase(newEnd, ranges.end());
2368 std::unique_ptr<RooCmdArg> plotRange;
2369 std::unique_ptr<RooCmdArg> normRange2;
2373 cmdList.
Add(plotRange.get());
2378 cmdList.
Add(normRange2.get());
2381 if (plotRange || normRange2) {
2382 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f was fitted in a subrange and no explicit "
2383 << (plotRange?
"Range()":
"") << ((plotRange&&normRange2)?
" and ":
"")
2384 << (normRange2?
"NormRange()":
"") <<
" was specified. Plotting / normalising in fit range. To override, do one of the following"
2385 <<
"\n\t- Clear the automatic fit range attribute: <pdf>.removeStringAttribute(\"fitrange\");"
2386 <<
"\n\t- Explicitly specify the plotting range: Range(\"<rangeName>\")."
2387 <<
"\n\t- Explicitly specify where to compute the normalisation: NormRange(\"<rangeName>\")."
2388 <<
"\n\tThe default (full) range can be denoted with Range(\"\") / NormRange(\"\")."<< endl ;
2398 pc.
defineSet(
"compSet",
"SelectCompSet",0) ;
2405 pc.
defineInt(
"rangeAdjustNorm",
"Range",0,0) ;
2406 pc.
defineInt(
"rangeWNAdjustNorm",
"RangeWithName",0,0) ;
2407 pc.
defineMutex(
"SelectCompSet",
"SelectCompSpec") ;
2419 double scaleFactor = pc.
getDouble(
"scaleFactor") ;
2421 const char* compSpec = pc.
getString(
"compSpec") ;
2423 bool haveCompSel = ( (compSpec && strlen(compSpec)>0) || compSet) ;
2426 std::string nameSuffix ;
2427 if (compSpec && strlen(compSpec)>0) {
2428 nameSuffix.append(
"_Comp[") ;
2429 nameSuffix.append(compSpec) ;
2430 nameSuffix.append(
"]") ;
2431 }
else if (compSet) {
2440 RooCmdArg cnsuffix(
"CurveNameSuffix",0,0,0,0,nameSuffix.c_str(),0,0,0) ;
2441 cmdList.
Add(&cnsuffix);
2446 double nExpected(1) ;
2450 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << endl ;
2461 bool hasCustomRange(
false), adjustNorm(
false) ;
2463 std::vector<pair<double,double> > rangeLim;
2468 double rangeLo = pc.
getDouble(
"rangeLo") ;
2469 double rangeHi = pc.
getDouble(
"rangeHi") ;
2470 rangeLim.push_back(make_pair(rangeLo,rangeHi)) ;
2471 adjustNorm = pc.
getInt(
"rangeAdjustNorm") ;
2472 hasCustomRange = true ;
2474 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") only plotting range ["
2475 << rangeLo <<
"," << rangeHi <<
"]" ;
2477 ccoutI(Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << endl ;
2479 ccoutI(Plotting) << endl ;
2482 nameSuffix.append(
Form(
"_Range[%f_%f]",rangeLo,rangeHi)) ;
2486 for (
const std::string& rangeNameToken :
ROOT::Split(pc.
getString(
"rangeName",
"",
false),
",")) {
2487 const char* thisRangeName = rangeNameToken.empty() ? nullptr : rangeNameToken.c_str();
2489 coutE(Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2495 adjustNorm = pc.
getInt(
"rangeWNAdjustNorm") ;
2496 hasCustomRange = true ;
2498 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") only plotting range '" << pc.
getString(
"rangeName",
"",
false) <<
"'" ;
2500 ccoutI(Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << endl ;
2502 ccoutI(Plotting) << endl ;
2505 nameSuffix.append(
"_Range[" + std::string(pc.
getString(
"rangeName")) +
"]");
2510 for (
const auto& rangeNameToken :
ROOT::Split(pc.
getString(
"normRangeName",
"",
false),
",")) {
2511 const char* thisRangeName = rangeNameToken.empty() ? nullptr : rangeNameToken.c_str();
2513 coutE(Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2520 hasCustomRange = true ;
2521 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f. curve is normalized using explicit choice of ranges '" << pc.
getString(
"normRangeName",
"",
false) <<
"'" << endl ;
2523 nameSuffix.append(
"_NormRange[" + std::string(pc.
getString(
"rangeName")) +
"]");
2527 if (hasCustomRange && adjustNorm) {
2529 const std::size_t oldSize = rangeLim.size();
2530 removeRangeOverlap(rangeLim);
2532 if (oldSize != rangeLim.size() && !pc.
hasProcessed(
"NormRange")) {
2536 coutE(Plotting) <<
"Requested plot/integration ranges overlap. For correct plotting, new ranges "
2537 "will be defined." << std::endl;
2540 std::string rangesNoOverlap;
2541 for (
auto it = rangeLim.begin(); it != rangeLim.end(); ++it) {
2542 std::stringstream rangeName;
2543 rangeName <<
"Remove_overlap_range_" << it - rangeLim.begin();
2544 plotVar->setRange(rangeName.str().c_str(), it->first, it->second);
2545 if (!rangesNoOverlap.empty())
2546 rangesNoOverlap +=
",";
2547 rangesNoOverlap += rangeName.str();
2552 rangeArg->
setString(0, rangesNoOverlap.c_str());
2554 plotRange = std::make_unique<RooCmdArg>(
RooFit::Range(rangesNoOverlap.c_str()));
2555 cmdList.
Add(plotRange.get());
2559 double rangeNevt(0) ;
2560 for (
const auto& riter : rangeLim) {
2565 scaleFactor *= rangeNevt/nExpected ;
2571 scaleFactor *= nExpected ;
2573 scaleFactor /= nExpected ;
2592 for (
const auto arg : branchNodeSet) {
2594 branchNodeSet.
remove(*arg) ;
2599 std::unique_ptr<RooArgSet> dirSelNodes;
2605 if (dirSelNodes->getSize()>0) {
2606 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") directly selected PDF components: " << *dirSelNodes << endl ;
2612 coutE(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection set " << *compSet <<
" does not match any components of p.d.f." << endl ;
2614 coutE(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection expression '" << compSpec <<
"' does not select any components of p.d.f." << endl ;
2621 RooCmdArg cnsuffix(
"CurveNameSuffix",0,0,0,0,nameSuffix.c_str(),0,0,0) ;
2622 cmdList.
Add(&cnsuffix);
2653 double nExpected(1) ;
2657 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << endl ;
2727 pc.
defineInt(
"showc",
"ShowConstants",0,0) ;
2728 pc.
defineSet(
"params",
"Parameters",0,0) ;
2729 pc.
defineInt(
"dummy",
"FormatArgs",0,0) ;
2739 const char* label = pc.
getString(
"label") ;
2743 int showc = pc.
getInt(
"showc") ;
2748 params = std::unique_ptr<RooArgSet>{
static_cast<RooArgSet*
>(params->selectCommon(*requestedParams))};
2770 bool showLabel= (label != 0 && strlen(label) > 0);
2775 for (
const auto param : params) {
2777 if(showConstants || !var->isConstant())
ymin-= dy;
2780 std::string labelString = label;
2781 unsigned int numLines = std::count(labelString.begin(), labelString.end(),
'\n') + 1;
2782 if (showLabel)
ymin -= numLines * dy;
2787 box->SetName((std::string(
GetName()) +
"_paramBox").c_str());
2788 box->SetFillColor(0);
2789 box->SetBorderSize(0);
2790 box->SetTextAlign(12);
2791 box->SetTextSize(0.04F);
2792 box->SetFillStyle(0);
2794 for (
const auto param : params) {
2795 auto var =
static_cast<const RooRealVar*
>(param);
2796 if(var->isConstant() && !showConstants)
continue;
2798 std::unique_ptr<TString> formatted{formatCmd ? var->format(*formatCmd) : var->format(2,
"NELU")};
2799 box->AddText(formatted->Data());
2860 pdfOwner->
_norm = 0 ;
2876 name.append(
"_Proj[") ;
2879 for(
auto const& arg : iset) {
2885 name.append(arg->GetName()) ;
2935 pc.
defineSet(
"supNormSet",
"SupNormSet",0,0) ;
2936 pc.
defineInt(
"numScanBins",
"ScanParameters",0,1000) ;
2937 pc.
defineInt(
"intOrder",
"ScanParameters",1,2) ;
2938 pc.
defineInt(
"doScanNum",
"ScanNumCdf",0,1) ;
2939 pc.
defineInt(
"doScanAll",
"ScanAllCdf",0,0) ;
2940 pc.
defineInt(
"doScanNon",
"ScanNoCdf",0,0) ;
2941 pc.
defineMutex(
"ScanNumCdf",
"ScanAllCdf",
"ScanNoCdf") ;
2944 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
2973 coutI(NumIntegration) <<
"RooAbsPdf::createCdf(" <<
GetName() <<
") integration over observable(s) " << iset <<
" involves numeric integration," << endl
2974 <<
" constructing cdf though numeric integration of sampled pdf in " << numScanBins <<
" bins and applying order "
2975 << intOrder <<
" interpolation on integrated histogram." << endl
2976 <<
" To override this choice of technique use argument ScanNone(), to change scan parameters use ScanParameters(nbins,order) argument" << endl ;
2988 ivar->
setBins(numScanBins,
"numcdf") ;
2989 auto ret = std::make_unique<RooNumCdf>(
name.c_str(),
name.c_str(),*
this,*ivar,
"numcdf");
2990 ret->setInterpolationOrder(intOrder) ;
3002 bool stripDisconnected,
bool removeConstraintsFromPdf)
const
3007 for (
const auto arg : *comps) {
3008 auto pdf =
dynamic_cast<const RooAbsPdf*
>(arg) ;
3010 std::unique_ptr<RooArgSet> compRet(
3011 pdf->getConstraints(observables,constrainedParams,stripDisconnected,removeConstraintsFromPdf));
3013 ret->
add(*compRet,
false) ;
3066 if (config)
return config ;
3098 delete _genContext ;
3105 bool extended,
bool randProto,
bool resampleProto,
TString dsetName,
bool init) :
3106 _genContext(context), _whatVars(whatVars), _protoData(protoData), _nGen(nGen), _extended(extended),
3107 _randProto(randProto), _resampleProto(resampleProto), _dsetName(dsetName), _init(init)
3114void sterilizeClientCaches(
RooAbsArg & arg) {
3116 for(std::size_t iClient = 0; iClient <
clients.size(); ++iClient) {
3118 const std::size_t oldClientsSize =
clients.size();
3121 for(
int iCache = 0; iCache < client->
numCaches(); ++iCache) {
3123 cacheMgr->sterilize();
3130 if(
clients.size() != oldClientsSize) {
3131 auto clientIter = std::find(
clients.begin(),
clients.end(), client);
3132 if(clientIter ==
clients.end()) {
3133 throw std::runtime_error(
"After a clients caches were cleared, the client was gone! This should not happen.");
3135 iClient = std::distance(
clients.begin(), clientIter);
3154 sterilizeClientCaches(*
this);
3174 sterilizeClientCaches(*
this);
3188 bool nameChange,
bool isRecursiveStep)
3206std::unique_ptr<RooAbsArg>
3212 std::unique_ptr<RooAbsPdf> pdfClone(
static_cast<RooAbsPdf *
>(this->
Clone()));
3215 auto newArg = std::make_unique<RooNormalizedPdf>(*pdfClone, normSet);
3219 for (
RooAbsArg *server : newArg->servers()) {
3223 newArg->addOwnedComponents(std::move(pdfClone));
3233 std::stringstream errMsg;
3235 <<
" did not overload RooAbsPdf::createExpectedEventsFunc()!";
3236 coutE(InputArguments) << errMsg.str() << std::endl;
std::unique_ptr< RooAbsReal > createConstraintTerm(std::string const &name, RooAbsPdf const &pdf, RooAbsData const &data, RooArgSet const *constrainedParameters, RooArgSet const *externalConstraints, RooArgSet const *globalObservables, const char *globalObservablesTag, bool takeGlobalObservablesFromData, bool removeConstraintsFromPdf)
Create the parameter constraint sum to add to the negative log-likelihood.
static void indent(ostringstream &buf, int indent_level)
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 input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
void clearValueAndShapeDirty() const
void Print(Option_t *options=nullptr) const override
Print the object to the defaultPrintStream().
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.
void setOperMode(OperMode mode, bool recurseADirty=true)
Set the operation mode of this node.
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
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.
bool addOwnedComponents(const RooAbsCollection &comps)
Take ownership of the contents of 'comps'.
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
virtual std::unique_ptr< RooAbsArg > compileForNormSet(RooArgSet const &normSet, RooFit::Detail::CompileContext &ctx) const
RooFit::OwningPtr< RooArgSet > getComponents() const
Create a RooArgSet with all components (branch nodes) of the expression tree headed by this object.
void removeStringAttribute(const Text_t *key)
Delete a string attribute with a given key.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree)
RooAbsCache * getCache(Int_t index) const
Return registered cache object by index.
const RefCountList_t & clients() const
List of all clients of this object.
bool isValueDirty() const
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.
TObject * Clone(const char *newname=nullptr) const override
Make a clone of an object using the Streamer facility.
RefCountList_t _serverList
Int_t numCaches() const
Return number of registered caches.
RooAbsArg * findServer(const char *name) const
Return server of this with name name. Returns nullptr if not found.
OperMode operMode() const
Query the operation mode of this node.
RooAbsArg * _owner
! Pointer to owning RooAbsArg
void setInterpolationOrder(Int_t order)
Set interpolation order of RooHistFunct representing cache histogram.
RooAbsCategoryLValue is the common abstract base class for objects that represent a discrete value th...
RooAbsCollection is an abstract container object that can hold multiple RooAbsArg objects.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
Int_t getSize() const
Return the number of elements in the collection.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
RooAbsArg * first() const
RooAbsCollection * selectByName(const char *nameList, bool verbose=false) const
Create a subset of the current collection, consisting only of those elements with names matching the ...
bool selectCommon(const RooAbsCollection &refColl, RooAbsCollection &outColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
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.
void Print(Option_t *options=nullptr) const override
This method must be overridden when a class wants to print itself.
RooAbsData is the common abstract base class for binned and unbinned datasets.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
RooAbsGenContext is the abstract base class for generator contexts of RooAbsPdf objects.
virtual void setExpectedData(bool)
virtual RooDataSet * generate(double nEvents=0, bool skipInit=false, bool extendedMode=false)
Generate the specified number of events with nEvents>0 and and return a dataset containing the genera...
virtual void setProtoDataOrder(Int_t *lut)
Set the traversal order of prototype data to that in the lookup tables passed as argument.
Normalization set with for above integral.
~CacheElem() override
Destructor of normalization cache element.
RooAbsGenContext * _genContext
virtual bool syncNormalization(const RooArgSet *dset, bool adjustProxies=true) const
Verify that the normalization integral cached with this PDF is valid for given set of normalization o...
double getNorm(const RooArgSet &nset) const
Get normalisation term needed to normalise the raw values returned by getVal().
std::unique_ptr< RooAbsArg > compileForNormSet(RooArgSet const &normSet, RooFit::Detail::CompileContext &ctx) const override
RooObjCacheManager _normMgr
std::unique_ptr< RooNumGenConfig > _specGeneratorConfig
! MC generator configuration specific for this object
bool interpretExtendedCmdArg(int extendedCmdArg) const
RooFit::OwningPtr< RooAbsReal > createNLL(RooAbsData &data, CmdArgs_t const &... cmdArgs)
Construct representation of -log(L) of PDF with given dataset.
double getValV(const RooArgSet *set=nullptr) const override
Return current value, normalized by integrating over the observables in nset.
virtual std::unique_ptr< RooFitResult > fitToImpl(RooAbsData &data, const RooLinkedList &cmdList)
Protected implementation of the likelihood fitting routine.
bool _selectComp
Component selection flag for RooAbsPdf::plotCompOn.
virtual void generateEvent(Int_t code)
Interface for generation of an event using the algorithm corresponding to the specified code.
RooFit::OwningPtr< RooAbsReal > createScanCdf(const RooArgSet &iset, const RooArgSet &nset, Int_t numScanBins, Int_t intOrder)
void setGeneratorConfig()
Remove the specialized numeric MC generator configuration associated with this object.
virtual void resetErrorCounters(Int_t resetValue=10)
Reset error counter to given value, limiting the number of future error messages for this pdf to 'res...
static int verboseEval()
Return global level of verbosity for p.d.f. evaluations.
RooFit::OwningPtr< RooAbsReal > createCdf(const RooArgSet &iset, const RooArgSet &nset=RooArgSet())
Create a cumulative distribution function of this p.d.f in terms of the observables listed in iset.
bool isActiveNormSet(RooArgSet const *normSet) const
Checks if normSet is the currently active normalization set of this PDF, meaning is exactly the same ...
virtual double expectedEvents(const RooArgSet *nset) const
Return expected number of events to be used in calculation of extended likelihood.
virtual RooAbsGenContext * binnedGenContext(const RooArgSet &vars, bool verbose=false) const
Return a binned generator context.
TString _normRange
Normalization range.
virtual bool isDirectGenSafe(const RooAbsArg &arg) const
Check if given observable can be safely generated using the pdfs internal generator mechanism (if tha...
Int_t * randomizeProtoOrder(Int_t nProto, Int_t nGen, bool resample=false) const
Return lookup table with randomized order for nProto prototype events.
void setNormRange(const char *rangeName)
~RooAbsPdf() override
Destructor.
RooArgSet const * _normSet
Normalization integral (owned by _normMgr)
RooPlot * plotOn(RooPlot *frame, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}, const RooCmdArg &arg9={}, const RooCmdArg &arg10={}) const override
Helper calling plotOn(RooPlot*, RooLinkedList&) const.
RooNumGenConfig * specialGeneratorConfig() const
Returns the specialized integrator configuration for this RooAbsReal.
virtual bool selfNormalized() const
Shows if a PDF is self-normalized, which means that no attempt is made to add a normalization term.
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Print multi line detailed information of this RooAbsPdf.
Int_t _traceCount
Number of traces remaining to print.
bool canBeExtended() const
If true, PDF can provide extended likelihood term.
void setTraceCounter(Int_t value, bool allNodes=false)
Reset trace counter to given value, limiting the number of future trace messages for this pdf to 'val...
GenSpec * prepareMultiGen(const RooArgSet &whatVars, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={})
Prepare GenSpec configuration object for efficient generation of multiple datasets from identical spe...
Int_t _errorCount
Number of errors remaining to print.
virtual std::unique_ptr< RooAbsReal > createExpectedEventsFunc(const RooArgSet *nset) const
Returns an object that represents the expected number of events for a given normalization set,...
virtual RooPlot * paramOn(RooPlot *frame, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={})
Add a box with parameter values (and errors) to the specified frame.
RooFit::OwningPtr< RooFitResult > fitTo(RooAbsData &data, CmdArgs_t const &... cmdArgs)
Fit PDF to given dataset.
Int_t _negCount
Number of negative probabilities remaining to print.
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 const RooAbsReal * getNormObj(const RooArgSet *set, const RooArgSet *iset, const TNamed *rangeName=nullptr) const
Return pointer to RooAbsReal object that implements calculation of integral over observables iset in ...
void setActiveNormSet(RooArgSet const *normSet) const
Setter for the _normSet member, which should never be set directly.
double analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Analytical integral with normalization (see RooAbsReal::analyticalIntegralWN() for further informatio...
void setNormRangeOverride(const char *rangeName)
virtual RooFit::OwningPtr< RooDataSet > generateSimGlobal(const RooArgSet &whatVars, Int_t nEvents)
Special generator interface for generation of 'global observables' – for RooStats tools.
double normalizeWithNaNPacking(double rawVal, double normVal) const
virtual RooAbsGenContext * autoGenContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false, bool autoBinned=true, const char *binnedTag="") const
RooArgSet * getAllConstraints(const RooArgSet &observables, RooArgSet &constrainedParams, bool stripDisconnected=true, bool removeConstraintsFromPdf=false) const
This helper function finds and collects all constraints terms of all component p.d....
const RooNumGenConfig * getGeneratorConfig() const
Return the numeric MC generator configuration used for this object.
virtual void initGenerator(Int_t code)
Interface for one-time initialization to setup the generator for the specified code.
virtual ExtendMode extendMode() const
Returns ability of PDF to provide extended likelihood terms.
RooAbsPdf()
Default constructor.
virtual RooFit::OwningPtr< RooDataHist > generateBinned(const RooArgSet &whatVars, double nEvents, const RooCmdArg &arg1, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}) const
As RooAbsPdf::generateBinned(const RooArgSet&, const RooCmdArg&,const RooCmdArg&, const RooCmdArg&,...
bool traceEvalPdf(double value) const
Check that passed value is positive and not 'not-a-number'.
static RooNumGenConfig * defaultGeneratorConfig()
Returns the default numeric MC generator configuration for all RooAbsReals.
bool redirectServersHook(const RooAbsCollection &newServerList, bool mustReplaceAll, bool nameChange, bool isRecursiveStep) override
The cache manager.
void printValue(std::ostream &os) const override
Print value of p.d.f, also print normalization integral that was last used, if any.
virtual std::unique_ptr< RooAbsReal > createNLLImpl(RooAbsData &data, const RooLinkedList &cmdList)
Protected implementation of the NLL creation routine.
void logBatchComputationErrors(std::span< const double > &outputs, std::size_t begin) const
Scan through outputs and fix+log all nans and negative values.
virtual RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false) const
Interface function to create a generator context from a p.d.f.
void getLogProbabilities(std::span< const double > pdfValues, double *output) const
static TString _normRangeOverride
static Int_t _verboseEval
double extendedTerm(double sumEntries, double expected, double sumEntriesW2=0.0, bool doOffset=false) const
virtual Int_t getGenerator(const RooArgSet &directVars, RooArgSet &generateVars, bool staticInitOK=true) const
Load generatedVars with the subset of directVars that we can generate events for, and return a code t...
virtual RooAbsPdf * createProjection(const RooArgSet &iset)
Return a p.d.f that represent a projection of this p.d.f integrated over given observables.
virtual double getLogVal(const RooArgSet *set=nullptr) const
Return the log of the current value with given normalization An error message is printed if the argum...
bool hasRange(const char *name) const override
Check if variable has a binning with given name.
std::pair< double, double > getRange(const char *name=nullptr) const
Get low and high bound of the variable.
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
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.
void plotOnCompSelect(RooArgSet *selNodes) const
Helper function for plotting of composite p.d.fs.
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 ...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
bool plotSanityChecks(RooPlot *frame) const
Utility function for plotOn(), perform general sanity check on frame to ensure safe plotting operatio...
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Structure printing.
bool redirectServersHook(const RooAbsCollection &newServerList, bool mustReplaceAll, bool nameChange, bool isRecursiveStep) override
Function that is called at the end of redirectServers().
double _value
Cache for current value of object.
virtual double analyticalIntegral(Int_t code, const char *rangeName=nullptr) const
Implements the actual analytical integral(s) advertised by getAnalyticalIntegral.
static void setEvalErrorLoggingMode(ErrorLoggingMode m)
Set evaluation error logging mode.
TString integralNameSuffix(const RooArgSet &iset, const RooArgSet *nset=nullptr, const char *rangeName=nullptr, bool omitEmpty=false) const
Construct string with unique suffix name to give to integral object that encodes integrated observabl...
virtual double evaluate() const =0
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
void logEvalError(const char *message, const char *serverValueString=nullptr) const
Log evaluation error message.
const RooNumIntConfig * getIntegratorConfig() const
Return the numeric integration configuration used for this object.
virtual bool isBinnedDistribution(const RooArgSet &) const
Tests if the distribution is binned. Unless overridden by derived classes, this always returns false.
RooFit::OwningPtr< RooAbsReal > createIntRI(const RooArgSet &iset, const RooArgSet &nset={})
Utility function for createRunningIntegral.
virtual RooPlot * plotOn(RooPlot *frame, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}, const RooCmdArg &arg9={}, const RooCmdArg &arg10={}) const
Plot (project) PDF on specified frame.
virtual double offset() const
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooBinnedGenContext is an efficient implementation of the generator context specific for binned pdfs.
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=nullptr)
Setter function without integration set.
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=nullptr, const TNamed *isetRangeName=nullptr)
Getter function without integration set.
RooCachedReal is an implementation of RooAbsCachedReal that can cache any external RooAbsReal input f...
void setCacheSource(bool flag)
RooCmdArg is a named container for two doubles, two integers two object points and three string point...
void setInt(Int_t idx, Int_t value)
Int_t getInt(Int_t idx) const
void setString(Int_t idx, const char *value)
Class RooCmdConfig is a configurable parser for RooCmdArg named arguments.
void defineMutex(const char *head, Args_t &&... tail)
Define arguments where any pair is mutually exclusive.
bool process(const RooCmdArg &arg)
Process given RooCmdArg.
bool hasProcessed(const char *cmdName) const
Return true if RooCmdArg with name 'cmdName' has been processed.
double getDouble(const char *name, double defaultValue=0.0) const
Return double property registered with name 'name'.
bool defineDouble(const char *name, const char *argName, int doubleNum, double defValue=0.0)
Define double property name 'name' mapped to double in slot 'doubleNum' in RooCmdArg with name argNam...
static void stripCmdList(RooLinkedList &cmdList, const char *cmdsToPurge)
Utility function that strips command names listed (comma separated) in cmdsToPurge from cmdList.
RooArgSet * getSet(const char *name, RooArgSet *set=nullptr) const
Return RooArgSet property registered with name 'name'.
bool defineSet(const char *name, const char *argName, int setNum, const RooArgSet *set=nullptr)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
bool ok(bool verbose) const
Return true of parsing was successful.
bool defineObject(const char *name, const char *argName, int setNum, const TObject *obj=nullptr, bool isArray=false)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
const char * getString(const char *name, const char *defaultValue="", bool convEmptyToNull=false) const
Return string property registered with name 'name'.
bool defineString(const char *name, const char *argName, int stringNum, const char *defValue="", bool appendMode=false)
Define double property name 'name' mapped to double in slot 'stringNum' in RooCmdArg with name argNam...
bool defineInt(const char *name, const char *argName, int intNum, int defValue=0)
Define integer property name 'name' mapped to integer in slot 'intNum' in RooCmdArg with name argName...
void allowUndefined(bool flag=true)
If flag is true the processing of unrecognized RooCmdArgs is not considered an error.
int getInt(const char *name, int defaultValue=0) const
Return integer property registered with name 'name'.
RooLinkedList filterCmdList(RooLinkedList &cmdInList, const char *cmdNameList, bool removeFromInList=true) const
Utility function to filter commands listed in cmdNameList from cmdInList.
TObject * getObject(const char *name, TObject *obj=nullptr) const
Return TObject property registered with name 'name'.
RooDataSet is a container class to hold unbinned data.
void markAsCompiled(RooAbsArg &arg) const
void compileServers(RooAbsArg &arg, RooArgSet const &normSet)
static Value & defaultValue()
Class RooGenContext implement a universal generator context for all RooAbsPdf classes that do not hav...
Switches the message service to a different level while the instance is alive.
RooLinkedList is an collection class for internal use, storing a collection of RooAbsArg pointers in ...
virtual void Add(TObject *arg)
TObject * FindObject(const char *name) const override
Return pointer to object with given name.
static const char * str(const TNamed *ptr)
Return C++ string corresponding to given TNamed pointer.
RooNumGenConfig holds the configuration parameters of the various numeric integrators used by RooReal...
static RooNumGenConfig & defaultConfig()
Return reference to instance of default numeric integrator configuration object.
Class RooObjCacheManager is an implementation of class RooCacheManager<RooAbsCacheElement> and specia...
void sterilize() override
Clear the cache payload but retain slot mapping w.r.t to normalization and integration sets.
A RooPlot is a plot frame and a container for graphics objects within that frame.
void addObject(TObject *obj, Option_t *drawOptions="", bool invisible=false)
Add a generic object to this plot.
double getFitRangeNEvt() const
Return the number of events in the fit range.
const RooArgSet * getNormVars() const
RooAbsRealLValue * getPlotVar() const
void updateNormVars(const RooArgSet &vars)
Install the given set of observables are reference normalization variables for this frame.
double getFitRangeBinW() const
Return the bin width that is being used to normalise the PDF.
virtual void printStream(std::ostream &os, Int_t contents, StyleOption style, TString indent="") const
Print description of object on ostream, printing contents set by contents integer,...
Class RooProjectedPdf is a RooAbsPdf implementation that represent a projection of a given input p....
static UInt_t integer(UInt_t max, TRandom *generator=randomGenerator())
Return an integer uniformly distributed from [0,n-1].
static TRandom * randomGenerator()
Return a pointer to a singleton random-number generator implementation.
RooRealIntegral performs hybrid numerical/analytical integrals of RooAbsReal objects.
const RooArgSet & numIntRealVars() const
RooRealVar represents a variable that can be changed from the outside.
void setRange(const char *name, double min, double max)
Set a fit or plotting range.
void setBins(Int_t nBins, const char *name=nullptr)
Create a uniform binning under name 'name' for this variable.
RooSimultaneous facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
A Pave (see TPave) with text, lines or/and boxes inside.
virtual Int_t Poisson(Double_t mean)
Generates a random integer N according to a Poisson law.
virtual Double_t Uniform(Double_t x1=1)
Returns a uniform deviate on the interval (0, x1).
virtual UInt_t Integer(UInt_t imax)
Returns a random integer uniformly distributed on the interval [ 0, imax-1 ].
void Clear()
Clear string without changing its capacity.
const char * Data() const
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
RooCmdArg SupNormSet(const RooArgSet &nset)
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
RooCmdArg Hesse(bool flag=true)
RooCmdArg ModularL(bool flag=false)
RooCmdArg PrintLevel(Int_t code)
RooCmdArg NormRange(const char *rangeNameList)
RooCmdArg Range(const char *rangeName, bool adjustNorm=true)
RooCmdArg Normalization(double scaleFactor)
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
std::unique_ptr< RooAbsReal > createNLL(RooAbsPdf &pdf, RooAbsData &data, std::unique_ptr< RooAbsReal > &&constraints, std::string const &rangeName, RooArgSet const &projDeps, bool isExtended, double integrateOverBinsPrecision, RooFit::OffsetMode offset)
OwningPtr< T > owningPtr(std::unique_ptr< T > &&ptr)
Internal helper to turn a std::unique_ptr<T> into an OwningPtr.
std::unique_ptr< T > compileForNormSet(T const &arg, RooArgSet const &normSet)
void defineMinimizationOptions(RooCmdConfig &pc)
std::unique_ptr< RooFitResult > minimize(RooAbsReal &model, RooAbsReal &nll, RooAbsData const &data, RooCmdConfig const &pc)
constexpr int extendedFitDefault
OffsetMode
For setting the offset mode with the Offset() command argument to RooAbsPdf::fitTo()
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
std::string getColonSeparatedNameString(RooArgSet const &argSet, char delim=':')
Create a string with all sorted names of RooArgSet elements separated by delimiters.
std::unique_ptr< T > cloneTreeWithSameParameters(T const &arg, RooArgSet const *observables=nullptr)
Clone RooAbsArg object and reattach to original parameters.
RooArgSet selectFromArgSet(RooArgSet const &, std::string const &names)
Construct a RooArgSet of objects in a RooArgSet whose names match to those in the names string.
BinnedLOutput getBinnedL(RooAbsPdf const &pdf)
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754.
std::string rangeName
Stores the configuration parameters for RooAbsTestStatistic.
std::string addCoefRangeName
bool takeGlobalObservablesFromData
double integrateOverBinsPrecision
RooFit::MPSplit interleave
__roodevice__ static __roohost__ double packFloatIntoNaN(float payload)
Pack float into mantissa of a NaN.