179inline double getLog(
double prob,
RooAbsReal const *caller)
183 caller->logEvalError(
"getLogVal() top-level p.d.f evaluates to a negative number");
187 if (std::isinf(prob)) {
188 oocoutW(caller, Eval) <<
"RooAbsPdf::getLogVal(" << caller->GetName()
189 <<
") WARNING: top-level pdf has an infinite value" << std::endl;
193 caller->logEvalError(
"getLogVal() top-level p.d.f evaluates to zero");
195 return -std::numeric_limits<double>::infinity();
199 caller->logEvalError(
"getLogVal() top-level p.d.f evaluates to NaN");
204 return std::log(prob);
211 lst.Replace(old, &obj);
219using std::endl, std::string, std::ostream, std::vector, std::pair, std::make_pair;
250 double plotMin,
double plotMax) :
251 RooAbsReal(
name,title,plotMin,plotMax), _normMgr(this,10), _selectComp(true)
264 _normMgr(other._normMgr,this), _selectComp(other._selectComp), _normRange(other._normRange)
269 if (other._specGeneratorConfig) {
310 bool nintChanged(
false) ;
342 cxcoutD(Eval) <<
"RooAbsPdf::analyticalIntegralWN(" <<
GetName() <<
") code = " << code <<
" normset = " << (normSet?*normSet:
RooArgSet()) << std::endl ;
345 if (code==0)
return getVal(normSet) ;
374 if(!error)
return error ;
397 if (!nset)
return 1 ;
405 coutW(Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
":: WARNING normalization is zero, nset = " ; nset->
Print(
"1") ;
406 if(
_errorCount == 10)
coutW(Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
") INFO: no more messages will be printed " << std::endl ;
424 return cache->
_norm.get();
465 bool nintChanged = (
_norm != cache->
_norm.get());
494 <<
") recreating normalization integral " << std::endl;
498 <<
") selfNormalized, creating unit norm" << std::endl;
504 auto ntitle = std::string(
GetTitle()) +
" Unit Normalization";
505 auto nname = std::string(
GetName()) +
"_UnitNorm";
521 static_cast<RooRealIntegral *
>(normInt)->setAllowComponentSelection(
false);
526 if (cacheParamsStr && strlen(cacheParamsStr)) {
528 std::unique_ptr<RooArgSet> intParams{normInt->getVariables()};
532 if (!cacheParams.empty()) {
533 cxcoutD(Caching) <<
"RooAbsReal::createIntObj(" <<
GetName() <<
") INFO: constructing "
534 << cacheParams.size() <<
"-dim value cache for integral over " << depList
535 <<
" as a function of " << cacheParams <<
" in range " << (nr ? nr :
"<default>")
537 std::string
name = normInt->GetName() + (
"_CACHE_[" + cacheParams.contentsString()) +
"]";
539 cachedIntegral->setInterpolationOrder(2);
540 cachedIntegral->addOwnedComponents(*normInt);
541 cachedIntegral->setCacheSource(
true);
542 if (normInt->operMode() ==
ADirty) {
543 cachedIntegral->setOperMode(
ADirty);
545 normInt = cachedIntegral;
586 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(branchList)) {
587 if (pdf) pdf->setTraceCounter(
value,
false) ;
602 return getLog(
getVal(nset),
this);
619bool checkInfNaNNeg(
const T& inputs) {
625 for (
double val : inputs) {
626 inf |= !std::isfinite(val);
631 return inf || nan || neg;
642 for (
unsigned int i=0; i<outputs.size(); ++i) {
643 const double value = outputs[i];
647 }
else if (!std::isfinite(outputs[i])){
650 }
else if (outputs[i] < 0.) {
651 logEvalError(
Form(
"p.d.f value of (%s) is less than zero (%f) for entry %zu",
659 for (std::size_t i = 0; i < pdfValues.size(); ++i) {
660 output[i] = getLog(pdfValues[i],
this);
721 coutE(InputArguments) <<
GetName() <<
": this PDF does not support extended maximum likelihood"
727 coutE(InputArguments) <<
GetName() <<
": calculated negative expected events: " << expected
729 logEvalError(
"extendedTerm #expected events is <0 return a NaN");
735 if (std::abs(expected)<1
e-10 && std::abs(sumEntries)<1
e-10) {
741 logEvalError(
"extendedTerm #expected events is a NaN") ;
745 double extra = doOffset
746 ? (expected - sumEntries) - sumEntries * (std::log(expected) - std::log(sumEntries))
747 : expected - sumEntries * std::log(expected);
749 if(sumEntriesW2 != 0.0) {
750 extra *= sumEntriesW2 / sumEntries;
781 double sumW =
data.sumEntries();
784 sumW2 =
data.sumEntriesW2();
908 return RooFit::FitHelpers::createNLL(*
this,
data, cmdList);
1039 return RooFit::FitHelpers::fitTo(*
this,
data, cmdList,
false);
1068 os <<
indent <<
"--- RooAbsPdf ---" << std::endl;
1069 os <<
indent <<
"Cached value = " <<
_value << std::endl ;
1071 os <<
indent <<
" Normalization integral: " << std::endl ;
1072 auto moreIndent = std::string(
indent.Data()) +
" " ;
1093 const RooArgSet* auxProto,
bool verbose)
const
1095 return new RooGenContext(*
this,vars,prototype,auxProto,verbose) ;
1102 bool verbose,
bool autoBinned,
const char* binnedTag)
const
1104 if (prototype || (auxProto && !auxProto->empty())) {
1105 return genContext(vars,prototype,auxProto,verbose);
1112 context=
genContext(vars,
nullptr,
nullptr,verbose);
1182 pc.
defineInt(
"randProto",
"PrototypeData",0,0) ;
1183 pc.
defineInt(
"resampleProto",
"PrototypeData",1,0) ;
1185 pc.
defineInt(
"extended",
"Extended",0,0) ;
1186 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
1187 pc.
defineInt(
"autoBinned",
"AutoBinned",0,1) ;
1188 pc.
defineInt(
"expectedData",
"ExpectedData",0,0) ;
1195 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
1202 const char* dsetName = pc.
getString(
"dsetName") ;
1203 bool verbose = pc.
getInt(
"verbose") ;
1204 bool randProto = pc.
getInt(
"randProto") ;
1205 bool resampleProto = pc.
getInt(
"resampleProto") ;
1206 bool extended = pc.
getInt(
"extended") ;
1207 bool autoBinned = pc.
getInt(
"autoBinned") ;
1208 const char* binnedTag = pc.
getString(
"binnedTag") ;
1210 double nEventsD = pc.
getInt(
"nEventsD") ;
1212 bool expectedData = pc.
getInt(
"expectedData") ;
1214 double nEvents = (nEventsD>0) ? nEventsD :
double(nEventsI);
1223 }
else if (nEvents==0) {
1224 cxcoutI(Generation) <<
"No number of events specified , number of events generated is "
1228 if (extended && protoData && !randProto) {
1229 cxcoutI(Generation) <<
"WARNING Using generator option Extended() (Poisson distribution of #events) together "
1230 <<
"with a prototype dataset implies incomplete sampling or oversampling of proto data. "
1231 <<
"Set randomize flag in ProtoData() option to randomize prototype dataset order and thus "
1232 <<
"to randomize the set of over/undersampled prototype events for each generation cycle." << std::endl ;
1237 std::unique_ptr<RooDataSet>
data;
1239 data = std::unique_ptr<RooDataSet>{
generate(whatVars,*protoData,
Int_t(nEvents),verbose,randProto,resampleProto)};
1241 data = std::unique_ptr<RooDataSet>{
generate(whatVars,nEvents,verbose,autoBinned,binnedTag,expectedData, extended)};
1245 if (dsetName && strlen(dsetName)>0) {
1246 data->SetName(dsetName) ;
1274 pc.
defineInt(
"randProto",
"PrototypeData",0,0) ;
1275 pc.
defineInt(
"resampleProto",
"PrototypeData",1,0) ;
1277 pc.
defineInt(
"extended",
"Extended",0,0) ;
1278 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
1279 pc.
defineInt(
"autoBinned",
"AutoBinned",0,1) ;
1285 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
1292 const char* dsetName = pc.
getString(
"dsetName") ;
1294 bool verbose = pc.
getInt(
"verbose") ;
1295 bool randProto = pc.
getInt(
"randProto") ;
1296 bool resampleProto = pc.
getInt(
"resampleProto") ;
1297 bool extended = pc.
getInt(
"extended") ;
1298 bool autoBinned = pc.
getInt(
"autoBinned") ;
1299 const char* binnedTag = pc.
getString(
"binnedTag") ;
1303 return new GenSpec(cx,whatVars,protoData,nEvents,extended,randProto,resampleProto,dsetName) ;
1319 double nEvt = spec._nGen == 0 ?
expectedEvents(spec._whatVars) : spec._nGen;
1321 std::unique_ptr<RooDataSet> ret{
generate(*spec._genContext,spec._whatVars,spec._protoData, nEvt,
false,spec._randProto,spec._resampleProto,
1322 spec._init,spec._extended)};
1357 std::unique_ptr<RooAbsGenContext> context{
autoGenContext(whatVars,
nullptr,
nullptr,verbose,autoBinned,binnedTag)};
1359 context->setExpectedData(
true) ;
1362 std::unique_ptr<RooDataSet> generated;
1363 if(
nullptr != context && context->isValid()) {
1364 generated = std::unique_ptr<RooDataSet>{context->generate(nEvents,
false, extended)};
1367 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") cannot create a valid context" << std::endl;
1379 double nEvents,
bool ,
bool randProtoOrder,
bool resampleProto,
1380 bool skipInit,
bool extended)
const
1382 if (nEvents==0 && (prototype==
nullptr || prototype->numEntries()==0)) {
1383 return std::make_unique<RooDataSet>(
"emptyData",
"emptyData",whatVars);
1386 std::unique_ptr<RooDataSet> generated;
1389 if (resampleProto) {
1390 randProtoOrder=true ;
1393 if (randProtoOrder && prototype && prototype->numEntries()!=nEvents) {
1394 coutI(Generation) <<
"RooAbsPdf::generate (Re)randomizing event order in prototype dataset (Nevt=" << nEvents <<
")" << std::endl ;
1401 generated = std::unique_ptr<RooDataSet>{context.
generate(nEvents,skipInit,extended)};
1404 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") do not have a valid generator context" << std::endl;
1435 Int_t nEvents,
bool verbose,
bool randProtoOrder,
bool resampleProto)
const
1437 std::unique_ptr<RooAbsGenContext> context{
genContext(whatVars,&prototype,
nullptr,verbose)};
1441 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") ERROR creating generator context" << std::endl ;
1456 if (!resampleProto) {
1458 std::iota(lut, lut + nProto, 0);
1464 for (
int i = nProto-1; i > 0; --i) {
1529 if(server == &arg)
continue;
1530 if(server->dependsOn(arg)) {
1571 pc.
defineInt(
"extended",
"Extended",0,0) ;
1572 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
1574 pc.
defineInt(
"expectedData",
"ExpectedData",0,0) ;
1577 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
1583 double nEvents = pc.
getDouble(
"nEventsD") ;
1585 nEvents = pc.
getInt(
"nEvents") ;
1588 bool extended = pc.
getInt(
"extended") ;
1589 bool expectedData = pc.
getInt(
"expectedData") ;
1590 const char* dsetName = pc.
getString(
"dsetName") ;
1595 cxcoutI(Generation) <<
" Extended mode active, number of events generated (" << nEvents <<
") is Poisson fluctuation on "
1596 <<
GetName() <<
"::expectedEvents() = " << nEvents << std::endl ;
1601 }
else if (nEvents==0) {
1602 cxcoutI(Generation) <<
"No number of events specified , number of events generated is "
1610 if (dsetName && strlen(dsetName)>0) {
1611 data->SetName(dsetName) ;
1648 auto hist = std::make_unique<RooDataHist>(
"genData",
"genData",whatVars);
1653 coutE(InputArguments) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") ERROR: No event count provided and p.d.f does not provide expected number of events" << std::endl ;
1658 if (expectedData || extended) {
1669 vector<int> histOut(hist->numEntries()) ;
1670 double histMax(-1) ;
1671 Int_t histOutSum(0) ;
1672 for (
int i=0 ; i<hist->numEntries() ; i++) {
1674 const double wi = hist->weight(i) ;
1678 double w=wi*nEvents ;
1679 hist->set(i,
w, sqrt(
w));
1681 }
else if (extended) {
1685 hist->set(i,
w, sqrt(
w)) ;
1695 histOutSum += histOut[i] ;
1700 if (!expectedData && !extended) {
1705 Int_t nEvtExtra = std::abs(
Int_t(nEvents)-histOutSum) ;
1706 Int_t wgt = (histOutSum>nEvents) ? -1 : 1 ;
1709 std::size_t counter = 0;
1710 bool havePrintedInfo =
false;
1711 while(nEvtExtra>0) {
1714 hist->get(ibinRand) ;
1717 if (ranY<hist->weight(ibinRand)) {
1719 histOut[ibinRand]++ ;
1722 if (histOut[ibinRand]>0) {
1723 histOut[ibinRand]-- ;
1731 if ((counter++ > 10*nEvents || nEvents > 1.E7) && !havePrintedInfo) {
1732 havePrintedInfo =
true;
1733 coutP(Generation) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") Performing costly accept/reject sampling. If this takes too long, use "
1734 <<
"extended mode to speed up the process." << std::endl;
1739 for (
int i=0 ; i<hist->numEntries() ; i++) {
1740 hist->set(i, histOut[i], sqrt(1.0*histOut[i])) ;
1743 }
else if (expectedData) {
1748 double corr = nEvents/hist->sumEntries() ;
1749 for (
int i=0 ; i<hist->numEntries() ; i++) {
1750 const double wnew = hist->weight(i)*corr ;
1751 hist->set(i, wnew, sqrt(wnew)) ;
1766 return generate(whatVars,nEvents) ;
1770void removeRangeOverlap(std::vector<std::pair<double, double>>& ranges) {
1772 std::sort(ranges.begin(), ranges.end());
1774 for (
auto it = ranges.begin(); it != ranges.end(); ++it) {
1775 double& startL = it->first;
1776 double& endL = it->second;
1778 for (
auto innerIt = it+1; innerIt != ranges.end(); ++innerIt) {
1779 const double startR = innerIt->first;
1780 const double endR = innerIt->second;
1782 if (startL <= startR && startR <= endL) {
1784 endL = std::max(endL, endR);
1785 *innerIt = make_pair(0., 0.);
1790 auto newEnd = std::remove_if(ranges.begin(), ranges.end(),
1791 [](
const std::pair<double,double>&
input){
1792 return input.first == input.second;
1794 ranges.erase(newEnd, ranges.end());
1907 std::unique_ptr<RooCmdArg> plotRange;
1908 std::unique_ptr<RooCmdArg> normRange2;
1910 !cmdList.FindObject(
"RangeWithName")) {
1912 cmdList.Add(plotRange.get());
1917 cmdList.Add(normRange2.get());
1920 if (plotRange || normRange2) {
1921 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f was fitted in a subrange and no explicit "
1922 << (plotRange?
"Range()":
"") << ((plotRange&&normRange2)?
" and ":
"")
1923 << (normRange2?
"NormRange()":
"") <<
" was specified. Plotting / normalising in fit range. To override, do one of the following"
1924 <<
"\n\t- Clear the automatic fit range attribute: <pdf>.removeStringAttribute(\"fitrange\");"
1925 <<
"\n\t- Explicitly specify the plotting range: Range(\"<rangeName>\")."
1926 <<
"\n\t- Explicitly specify where to compute the normalisation: NormRange(\"<rangeName>\")."
1927 <<
"\n\tThe default (full) range can be denoted with Range(\"\") / NormRange(\"\")."<< std::endl ;
1937 pc.
defineSet(
"compSet",
"SelectCompSet",0) ;
1944 pc.
defineInt(
"rangeAdjustNorm",
"Range",0,0) ;
1945 pc.
defineInt(
"rangeWNAdjustNorm",
"RangeWithName",0,0) ;
1946 pc.
defineMutex(
"SelectCompSet",
"SelectCompSpec") ;
1958 double scaleFactor = pc.
getDouble(
"scaleFactor") ;
1960 const char* compSpec = pc.
getString(
"compSpec") ;
1962 bool haveCompSel = ( (compSpec && strlen(compSpec)>0) || compSet) ;
1965 std::stringstream nameSuffix;
1966 if (compSpec && strlen(compSpec)>0) {
1967 nameSuffix <<
"_Comp[" << compSpec <<
"]";
1968 }
else if (compSet) {
1977 RooCmdArg cnsuffix(
"CurveNameSuffix", 0, 0, 0, 0, nameSuffix.str().c_str(),
nullptr,
nullptr,
nullptr);
1978 cmdList.Add(&cnsuffix);
1983 double nExpected(1) ;
1987 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << std::endl ;
1998 bool hasCustomRange(
false);
1999 bool adjustNorm(
false);
2001 std::vector<pair<double,double> > rangeLim;
2006 double rangeLo = pc.
getDouble(
"rangeLo") ;
2007 double rangeHi = pc.
getDouble(
"rangeHi") ;
2008 rangeLim.push_back(make_pair(rangeLo,rangeHi)) ;
2009 adjustNorm = pc.
getInt(
"rangeAdjustNorm") ;
2010 hasCustomRange = true ;
2012 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") only plotting range ["
2013 << rangeLo <<
"," << rangeHi <<
"]" ;
2015 ccoutI(Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << std::endl ;
2017 ccoutI(Plotting) << std::endl ;
2020 nameSuffix <<
"_Range[" << rangeLo <<
"_" << rangeHi <<
"]";
2024 for (
const std::string& rangeNameToken :
ROOT::Split(pc.
getString(
"rangeName",
"",
false),
",")) {
2025 const char* thisRangeName = rangeNameToken.empty() ? nullptr : rangeNameToken.c_str();
2027 coutE(Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2033 adjustNorm = pc.
getInt(
"rangeWNAdjustNorm") ;
2034 hasCustomRange = true ;
2036 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") only plotting range '" << pc.
getString(
"rangeName",
"",
false) <<
"'" ;
2038 ccoutI(Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << std::endl ;
2040 ccoutI(Plotting) << std::endl ;
2043 nameSuffix <<
"_Range[" << pc.
getString(
"rangeName") <<
"]";
2048 for (
const auto& rangeNameToken :
ROOT::Split(pc.
getString(
"normRangeName",
"",
false),
",")) {
2049 const char* thisRangeName = rangeNameToken.empty() ? nullptr : rangeNameToken.c_str();
2051 coutE(Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2058 hasCustomRange = true ;
2059 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f. curve is normalized using explicit choice of ranges '" << pc.
getString(
"normRangeName",
"",
false) <<
"'" << std::endl ;
2061 nameSuffix <<
"_NormRange[" << pc.
getString(
"rangeName") <<
"]";
2064 if (hasCustomRange && adjustNorm) {
2066 const std::size_t oldSize = rangeLim.size();
2067 removeRangeOverlap(rangeLim);
2069 if (oldSize != rangeLim.size() && !pc.
hasProcessed(
"NormRange")) {
2073 coutE(Plotting) <<
"Requested plot/integration ranges overlap. For correct plotting, new ranges "
2074 "will be defined." << std::endl;
2077 std::string rangesNoOverlap;
2078 for (
auto it = rangeLim.begin(); it != rangeLim.end(); ++it) {
2079 std::stringstream rangeName;
2080 rangeName <<
"Remove_overlap_range_" << it - rangeLim.begin();
2081 plotVar->setRange(rangeName.str().c_str(), it->first, it->second);
2082 if (!rangesNoOverlap.empty())
2083 rangesNoOverlap +=
",";
2084 rangesNoOverlap += rangeName.str();
2087 auto rangeArg =
static_cast<RooCmdArg*
>(cmdList.FindObject(
"RangeWithName"));
2089 rangeArg->
setString(0, rangesNoOverlap.c_str());
2091 plotRange = std::make_unique<RooCmdArg>(
RooFit::Range(rangesNoOverlap.c_str()));
2092 cmdList.Add(plotRange.get());
2096 double rangeNevt(0) ;
2097 for (
const auto& riter : rangeLim) {
2102 scaleFactor *= rangeNevt/nExpected ;
2111 scaleFactor *= nExp / nExpected;
2122 scaleFactor *= nExpected ;
2124 scaleFactor /= nExpected ;
2133 replaceOrAdd(cmdList, tmp);
2143 for (
const auto arg : branchNodeSet) {
2145 branchNodeSet.remove(*arg) ;
2150 std::unique_ptr<RooArgSet> dirSelNodes;
2152 dirSelNodes = std::unique_ptr<RooArgSet>{branchNodeSet.selectCommon(*compSet)};
2154 dirSelNodes = std::unique_ptr<RooArgSet>{branchNodeSet.selectByName(compSpec)};
2156 if (!dirSelNodes->empty()) {
2157 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") directly selected PDF components: " << *dirSelNodes << std::endl ;
2163 coutE(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection set " << *compSet <<
" does not match any components of p.d.f." << std::endl ;
2165 coutE(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection expression '" << compSpec <<
"' does not select any components of p.d.f." << std::endl ;
2171 RooCmdArg cnsuffix(
"CurveNameSuffix", 0, 0, 0, 0, nameSuffix.str().c_str(),
nullptr,
nullptr,
nullptr);
2172 cmdList.Add(&cnsuffix);
2203 double nExpected(1) ;
2207 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << std::endl ;
2267 cmdList.Add(
const_cast<RooCmdArg*
>(&arg3)) ; cmdList.Add(
const_cast<RooCmdArg*
>(&arg4)) ;
2268 cmdList.Add(
const_cast<RooCmdArg*
>(&arg5)) ; cmdList.Add(
const_cast<RooCmdArg*
>(&arg6)) ;
2269 cmdList.Add(
const_cast<RooCmdArg*
>(&arg7)) ; cmdList.Add(
const_cast<RooCmdArg*
>(&arg8)) ;
2277 pc.
defineInt(
"showc",
"ShowConstants",0,0) ;
2278 pc.
defineSet(
"params",
"Parameters",0,
nullptr) ;
2279 pc.
defineInt(
"dummy",
"FormatArgs",0,0) ;
2287 auto formatCmd =
static_cast<RooCmdArg const*
>(cmdList.FindObject(
"FormatArgs")) ;
2289 const char* label = pc.
getString(
"label") ;
2293 int showc = pc.
getInt(
"showc") ;
2298 params = std::unique_ptr<RooArgSet>{params->selectCommon(*requestedParams)};
2320 bool showLabel= (label !=
nullptr && strlen(label) > 0);
2326 for (
const auto param : params) {
2328 if(showConstants || !var->isConstant())
ymin-= dy;
2331 std::string labelString = label;
2332 unsigned int numLines = std::count(labelString.begin(), labelString.end(),
'\n') + 1;
2333 if (showLabel)
ymin -= numLines * dy;
2337 if(!
box)
return nullptr;
2338 box->SetName((std::string(
GetName()) +
"_paramBox").c_str());
2339 box->SetFillColor(0);
2340 box->SetBorderSize(0);
2341 box->SetTextAlign(12);
2342 box->SetTextSize(0.04F);
2343 box->SetFillStyle(0);
2345 for (
const auto param : params) {
2346 auto var =
static_cast<const RooRealVar*
>(param);
2347 if(var->isConstant() && !showConstants)
continue;
2349 box->AddText((formatCmd ? var->format(*formatCmd) : var->format(2,
"NELU")).c_str());
2409 if (pdfOwner->_norm ==
_norm.get()) {
2410 pdfOwner->
_norm = nullptr ;
2470 pc.
defineSet(
"supNormSet",
"SupNormSet",0,
nullptr) ;
2471 pc.
defineInt(
"numScanBins",
"ScanParameters",0,1000) ;
2472 pc.
defineInt(
"intOrder",
"ScanParameters",1,2) ;
2473 pc.
defineInt(
"doScanNum",
"ScanNumCdf",0,1) ;
2474 pc.
defineInt(
"doScanAll",
"ScanAllCdf",0,0) ;
2475 pc.
defineInt(
"doScanNon",
"ScanNoCdf",0,0) ;
2476 pc.
defineMutex(
"ScanNumCdf",
"ScanAllCdf",
"ScanNoCdf") ;
2479 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
2508 coutI(NumericIntegration) <<
"RooAbsPdf::createCdf(" <<
GetName() <<
") integration over observable(s) " << iset <<
" involves numeric integration," << std::endl
2509 <<
" constructing cdf though numeric integration of sampled pdf in " << numScanBins <<
" bins and applying order "
2510 << intOrder <<
" interpolation on integrated histogram." << std::endl
2511 <<
" To override this choice of technique use argument ScanNone(), to change scan parameters use ScanParameters(nbins,order) argument" << std::endl ;
2523 ivar->
setBins(numScanBins,
"numcdf") ;
2524 auto ret = std::make_unique<RooNumCdf>(
name.c_str(),
name.c_str(),*
this,*ivar,
"numcdf");
2525 ret->setInterpolationOrder(intOrder) ;
2526 return RooFit::makeOwningPtr<RooAbsReal>(std::move(ret));
2536std::unique_ptr<RooArgSet>
2543 for (
const auto arg : *comps) {
2544 auto pdf =
dynamic_cast<const RooAbsPdf*
>(arg) ;
2545 if (pdf && !constraints.
find(pdf->GetName())) {
2546 if (
auto compRet = pdf->getConstraints(observables,constrainedParams, pdfParams)) {
2547 constraints.
add(*compRet,
false) ;
2555 auto finalConstraints = std::make_unique<RooArgSet>(
"AllConstraints");
2556 for(
auto * pdf : static_range_cast<RooAbsPdf*>(constraints)) {
2559 pdf->getParameters(
nullptr, tmp);
2560 conParams.
add(tmp,
true) ;
2562 if (pdf->dependsOnValue(pdfParams) || !stripDisconnected) {
2563 finalConstraints->add(*pdf) ;
2565 coutI(Minimization) <<
"RooAbsPdf::getAllConstraints(" <<
GetName() <<
") omitting term " << pdf->GetName()
2566 <<
" as constraint term as it does not share any parameters with the other pdfs in product. "
2567 <<
"To force inclusion in likelihood, add an explicit Constrain() argument for the target parameter" << std::endl ;
2575 cexl.
remove(pdfParams,
true,
true) ;
2576 constrainedParams.remove(cexl,
true,
true) ;
2578 return finalConstraints ;
2657 bool extended,
bool randProto,
bool resampleProto,
TString dsetName,
bool init) :
2658 _genContext(context), _whatVars(whatVars), _protoData(protoData), _nGen(nGen), _extended(extended),
2659 _randProto(randProto), _resampleProto(resampleProto), _dsetName(dsetName), _init(init)
2666void sterilizeClientCaches(
RooAbsArg & arg) {
2668 for(std::size_t iClient = 0; iClient <
clients.size(); ++iClient) {
2670 const std::size_t oldClientsSize =
clients.size();
2673 for(
int iCache = 0; iCache < client->numCaches(); ++iCache) {
2675 cacheMgr->sterilize();
2682 if(
clients.size() != oldClientsSize) {
2683 auto clientIter = std::find(
clients.begin(),
clients.end(), client);
2684 if(clientIter ==
clients.end()) {
2685 throw std::runtime_error(
"After a clients caches were cleared, the client was gone! This should not happen.");
2687 iClient = std::distance(
clients.begin(), clientIter);
2702 sterilizeClientCaches(*
this);
2718 sterilizeClientCaches(*
this);
2732 bool nameChange,
bool isRecursiveStep)
2750std::unique_ptr<RooAbsArg>
2756 std::unique_ptr<RooAbsPdf> pdfClone(
static_cast<RooAbsPdf *
>(this->
Clone()));
2759 auto newArg = std::make_unique<RooFit::Detail::RooNormalizedPdf>(*pdfClone, normSet);
2763 ctx.markSubtreeAsCompiled(*newArg);
2764 newArg->addOwnedComponents(std::move(pdfClone));
2774 std::stringstream errMsg;
2776 <<
" did not overload RooAbsPdf::createExpectedEventsFunc()!";
2777 coutE(InputArguments) << errMsg.str() << std::endl;
int Int_t
Signed integer 4 bytes (int)
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.
Common abstract base class for objects that represent a value and a "shape" in RooFit.
void clearValueAndShapeDirty() const
void Print(Option_t *options=nullptr) const override
Print the object to the defaultPrintStream().
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'.
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.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
const RefCountList_t & clients() const
List of all clients of this object.
bool isValueDirty() const
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
RooAbsArg * findServer(const char *name) const
Return server of this with name name. Returns nullptr if not found.
RooAbsArg * _owner
! Pointer to owning RooAbsArg
Abstract base class for objects that represent a discrete value that can be set from the outside,...
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.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add 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.
void Print(Option_t *options=nullptr) const override
This method must be overridden when a class wants to print itself.
Abstract base class for binned and unbinned datasets.
Abstract base class for generator contexts of RooAbsPdf objects.
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.
std::unique_ptr< RooAbsReal > _norm
~CacheElem() override
Destructor of normalization cache element.
Abstract interface for all probability density functions.
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
! The cache manager
std::unique_ptr< RooNumGenConfig > _specGeneratorConfig
! MC generator configuration specific for this object
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.
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...
std::unique_ptr< RooArgSet > getAllConstraints(const RooArgSet &observables, RooArgSet &constrainedParams, bool stripDisconnected=true) const
This helper function finds and collects all constraints terms of all component p.d....
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 set with for above integral
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.
virtual double getCorrection() const
This function returns the penalty term.
Int_t _traceCount
Number of traces remaining to print.
bool canBeExtended() const
If true, PDF can provide extended likelihood term.
RooAbsReal * _norm
! Normalization integral (owned by _normMgr)
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...
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...
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,...
Int_t _negCount
Number of negative probabilities remaining to print.
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< 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.
virtual RooAbsGenContext * autoGenContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false, bool autoBinned=true, const char *binnedTag="") const
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
Hook function intercepting redirectServer calls.
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.
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.
void plotOnCompSelect(RooArgSet *selNodes) const
Helper function for plotting of composite p.d.fs.
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.
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.
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 ...
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * selectCommon(const RooAbsCollection &refColl) const
Use RooAbsCollection::selecCommon(), but return as RooArgSet.
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.
Implementation of RooAbsCachedReal that can cache any external RooAbsReal input function provided in ...
Named container for two doubles, two integers two object points and three string pointers that can be...
void setString(Int_t idx, const char *value)
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'.
TObject * getObject(const char *name, TObject *obj=nullptr) const
Return TObject property registered with name 'name'.
Container class to hold unbinned data.
void compileServers(RooAbsArg &arg, RooArgSet const &normSet)
Implements a universal generator context for all RooAbsPdf classes that do not have or need a special...
Switches the message service to a different level while the instance is alive.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
virtual void Add(TObject *arg)
static const char * str(const TNamed *ptr)
Return C++ string corresponding to given TNamed pointer.
Holds the configuration parameters of the various numeric integrators used by RooRealIntegral.
static RooNumGenConfig & defaultConfig()
Return reference to instance of default numeric integrator configuration object.
Implementation of a RooCacheManager<RooAbsCacheElement> that specializes in the storage of cache elem...
void sterilize() override
Clear the cache payload but retain slot mapping w.r.t to normalization and integration sets.
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,...
A RooAbsPdf implementation that represent a projection of a given input p.d.f and the object returned...
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.
Performs hybrid numerical/analytical integrals of RooAbsReal objects.
const RooArgSet & numIntRealVars() const
Variable that can be changed from the outside.
void setBins(Int_t nBins, const char *name=nullptr, bool shared=true)
Create a uniform binning under name 'name' for this variable.
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.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
A Pave (see TPave) with text, lines or/and boxes inside.
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 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.
double normalizeWithNaNPacking(RooAbsPdf const &pdf, double rawVal, double normVal)
T * OwningPtr
An alias for raw pointers for indicating that the return type of a RooFit function is an owning point...
OwningPtr< T > makeOwningPtr(std::unique_ptr< T > &&ptr)
Internal helper to turn a std::unique_ptr<T> into an OwningPtr.
RooArgSet selectFromArgSet(RooArgSet const &, std::string const &names)
std::string getColonSeparatedNameString(RooArgSet const &argSet, char delim=':')
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754.
static double packFloatIntoNaN(float payload)
Pack float into mantissa of a NaN.