200 coutI(Minimization) <<
"p.d.f. provides expected number of events, including extended term in likelihood."
210 if (extendedCmdArg == 0) {
212 std::string errMsg =
"You used the Extended(false) option on a pdf where the fit MUST be extended! "
213 "The parameters are not well defined and you're getting nonsensical results.";
214 coutE(InputArguments) << errMsg << std::endl;
217 return extendedCmdArg;
222inline double getLog(
double prob,
RooAbsReal const *caller)
225 if (std::abs(prob) > 1e6) {
226 oocoutW(caller, Eval) <<
"RooAbsPdf::getLogVal(" << caller->
GetName()
227 <<
") WARNING: top-level pdf has a large value: " << prob << std::endl;
231 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to a negative number");
236 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to zero");
238 return -std::numeric_limits<double>::infinity();
242 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to NaN");
247 return std::log(prob);
253 const char* rangeName,
bool splitRange)
261 if(!rangeName || splitRange)
return;
266 std::string fitrangeValue;
268 for (
auto const &subrange : subranges) {
269 if (subrange.empty())
271 std::string fitrangeValueSubrange = std::string(
"fit_") + baseName;
272 if (subranges.size() > 1) {
273 fitrangeValueSubrange +=
"_" + subrange;
275 fitrangeValue += fitrangeValueSubrange +
",";
278 if(arg->isCategory())
continue;
279 auto& observable =
static_cast<RooRealVar&
>(*arg);
281 observable.
setRange(fitrangeValueSubrange.c_str(), observable.getMin(subrange.c_str()),
282 observable.getMax(subrange.c_str()));
285 pdf.
setStringAttribute(
"fitrange", fitrangeValue.substr(0, fitrangeValue.size() - 1).c_str());
333 double plotMin,
double plotMax) :
334 RooAbsReal(
name,title,plotMin,plotMax), _normMgr(this,10), _selectComp(true)
347 _normMgr(other._normMgr,this), _selectComp(other._selectComp), _normRange(other._normRange)
369 if (normVal < 0. || (normVal == 0. && rawVal != 0)) {
371 const std::string msg =
"p.d.f normalization integral is zero or negative: " + std::to_string(normVal);
378 logEvalError(
Form(
"p.d.f value is less than zero (%f), trying to recover", rawVal));
389 return (rawVal == 0. && normVal == 0.) ? 0. : rawVal / normVal;
419 bool nintChanged(
false) ;
451 cxcoutD(Eval) <<
"RooAbsPdf::analyticalIntegralWN(" <<
GetName() <<
") code = " << code <<
" normset = " << (normSet?*normSet:
RooArgSet()) << endl ;
454 if (code==0)
return getVal(normSet) ;
483 if(!error)
return error ;
506 if (!nset)
return 1 ;
514 coutW(Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
":: WARNING normalization is zero, nset = " ; nset->
Print(
"1") ;
515 if(
_errorCount == 10)
coutW(Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
") INFO: no more messages will be printed " << endl ;
533 return cache->
_norm ;
595 ((
RooAbsPdf*)
this)->setProxyNormSet(nset) ;
604 <<
") recreating normalization integral " << endl ;
607 cxcoutD(Tracing) <<
ClassName() <<
"::syncNormalization(" <<
GetName() <<
") selfNormalized, creating unit norm" << endl;
613 auto ntitle = std::string(
GetTitle()) +
" Unit Normalization";
614 auto nname = std::string(
GetName()) +
"_UnitNorm";
628 static_cast<RooRealIntegral*
>(normInt)->setAllowComponentSelection(
false);
633 if (cacheParamsStr && strlen(cacheParamsStr)) {
635 std::unique_ptr<RooArgSet> intParams{normInt->
getVariables()} ;
639 if (!cacheParams.
empty()) {
640 cxcoutD(Caching) <<
"RooAbsReal::createIntObj(" <<
GetName() <<
") INFO: constructing " << cacheParams.
getSize()
641 <<
"-dim value cache for integral over " << depList <<
" as a function of " << cacheParams <<
" in range " << (nr?nr:
"<default>") << endl ;
650 normInt= cachedIntegral ;
692 for(
auto * pdf : dynamic_range_cast<RooAbsPdf*>(branchList)) {
693 if (pdf) pdf->setTraceCounter(
value,
false) ;
708 return getLog(
getVal(nset),
this);
718bool checkInfNaNNeg(
const T& inputs) {
724 for (
double val : inputs) {
725 inf |= !std::isfinite(val);
730 return inf || nan || neg;
741 for (
unsigned int i=0; i<outputs.size(); ++i) {
742 const double value = outputs[i];
746 }
else if (!std::isfinite(outputs[i])){
749 }
else if (outputs[i] < 0.) {
750 logEvalError(
Form(
"p.d.f value of (%s) is less than zero (%f) for entry %zu",
758 for (std::size_t i = 0; i < pdfValues.size(); ++i) {
759 output[i] = getLog(pdfValues[i],
this);
820 coutE(InputArguments) <<
GetName() <<
": this PDF does not support extended maximum likelihood"
826 coutE(InputArguments) <<
GetName() <<
": calculated negative expected events: " << expected
828 logEvalError(
"extendedTerm #expected events is <0 return a NaN");
834 if (std::abs(expected)<1
e-10 && std::abs(sumEntries)<1
e-10) {
840 logEvalError(
"extendedTerm #expected events is a NaN") ;
844 double extra = doOffset
845 ? (expected - sumEntries) - sumEntries * (std::log(expected) - std::log(sumEntries))
846 : expected - sumEntries * std::log(expected);
848 if(sumEntriesW2 != 0.0) {
849 extra *= sumEntriesW2 / sumEntries;
880 double sumW =
data.sumEntries();
883 sumW2 =
data.sumEntriesW2();
985 auto baseName = std::string(
"nll_") +
GetName() +
"_" +
data.GetName();
993 pc.
defineString(
"rangeName",
"RangeWithName",0,
"",
true) ;
995 pc.
defineString(
"globstag",
"GlobalObservablesTag",0,
"") ;
996 pc.
defineString(
"globssource",
"GlobalObservablesSource",0,
"data") ;
999 pc.
defineInt(
"splitRange",
"SplitRange",0,0) ;
1002 pc.
defineInt(
"interleave",
"NumCPU",1,0) ;
1004 pc.
defineInt(
"optConst",
"Optimize",0,0) ;
1005 pc.
defineInt(
"cloneData",
"CloneData", 0, 2);
1006 pc.
defineSet(
"projDepSet",
"ProjectedObservables",0,0) ;
1008 pc.
defineSet(
"glObs",
"GlobalObservables",0,0) ;
1009 pc.
defineInt(
"doOffset",
"OffsetLikelihood",0,0) ;
1010 pc.
defineSet(
"extCons",
"ExternalConstraints",0,0) ;
1011 pc.
defineInt(
"BatchMode",
"BatchMode", 0, defaultBatchModeInt);
1012 pc.
defineDouble(
"IntegrateBins",
"IntegrateBins", 0, -1.);
1014 pc.
defineMutex(
"GlobalObservables",
"GlobalObservablesTag") ;
1015 pc.
defineInt(
"ModularL",
"ModularL", 0, 0);
1029 if (pc.
getInt(
"ModularL")) {
1030 int lut[3] = {2, 1, 0};
1038 if (
auto tmp = pc.
getSet(
"cPars"))
1041 if (
auto tmp = pc.
getSet(
"extCons"))
1042 extConsSet.
add(*tmp);
1044 if (
auto tmp = pc.
getSet(
"glObs"))
1047 const std::string rangeName = pc.
getString(
"globstag",
"",
false);
1050 builder.Extended(ext)
1051 .ConstrainedParameters(cParsSet)
1052 .ExternalConstraints(extConsSet)
1053 .GlobalObservables(glObsSet)
1054 .GlobalObservablesTag(rangeName.c_str());
1056 return RooFit::Detail::owningPtr(std::make_unique<RooFit::TestStatistics::RooRealL>(
"likelihood",
"", builder.build()));
1060 const char* rangeName = pc.
getString(
"rangeName",0,
true) ;
1061 const char* addCoefRangeName = pc.
getString(
"addCoefRange",0,
true) ;
1066 if (numcpu_strategy==3 && !this->
InheritsFrom(
"RooSimultaneous") ) {
1067 coutW(Minimization) <<
"Cannot use a NumCpu Strategy = 3 when the pdf is not a RooSimultaneous, "
1068 "falling back to default strategy = 0" << endl;
1069 numcpu_strategy = 0;
1074 bool verbose = pc.
getInt(
"verbose") ;
1080 coutE(Minimization) <<
"The Offset(\"bin\") option doesn't support fits to RooDataSet yet, only to RooDataHist."
1081 " Falling back to no offsetting." << endl;
1087 cloneData = optConst ;
1091 double rangeLo = pc.
getDouble(
"rangeLo") ;
1092 double rangeHi = pc.
getDouble(
"rangeHi") ;
1097 for (
auto arg : obs) {
1099 if (rrv) rrv->
setRange(
"fit",rangeLo,rangeHi) ;
1107 resetFitrangeAttributes(*
this,
data, baseName, rangeName, splitRange);
1110 auto tmp = pc.
getSet(
"projDepSet");
1112 projDeps.
add(*tmp) ;
1115 const std::string globalObservablesSource = pc.
getString(
"globssource",
"data",
false);
1116 if(globalObservablesSource !=
"data" && globalObservablesSource !=
"model") {
1117 std::string errMsg =
"RooAbsPdf::fitTo: GlobalObservablesSource can only be \"data\" or \"model\"!";
1118 coutE(InputArguments) << errMsg << std::endl;
1119 throw std::invalid_argument(errMsg);
1121 const bool takeGlobalObservablesFromData = globalObservablesSource ==
"data";
1126 auto createConstr = [&](
RooAbsPdf const& pdf,
bool removeConstraintsFromPdf=
false) -> std::unique_ptr<RooAbsReal> {
1128 baseName +
"_constr",
1135 takeGlobalObservablesFromData,
1136 removeConstraintsFromPdf
1152 normSet.
remove(projDeps,
true,
true);
1158 ctx.setLikelihoodMode(
true);
1160 std::unique_ptr<RooAbsPdf> pdfClone = std::unique_ptr<RooAbsPdf>{
static_cast<RooAbsPdf *
>(head.release())};
1169 if (addCoefRangeName) {
1171 <<
") fixing interpretation of coefficients of any component to range "
1172 << addCoefRangeName <<
"\n";
1173 pdfClone->fixAddCoefRange(addCoefRangeName,
false);
1176 std::unique_ptr<RooAbsReal> compiledConstr;
1177 if(std::unique_ptr<RooAbsReal> constr = createConstr(*
this)) {
1179 compiledConstr->addOwnedComponents(std::move(constr));
1185 std::move(compiledConstr),
1186 rangeName ? rangeName :
"",
1192 std::unique_ptr<RooAbsReal> nllWrapper;
1195 static int iFuncWrapper = 0;
1196 std::string wrapperName =
"nll_func_wrapper_" + std::to_string(iFuncWrapper++);
1197 nllWrapper = std::make_unique<RooFuncWrapper>(wrapperName.c_str(), wrapperName.c_str(), *nll, normSet, &
data,
1201 nllWrapper = std::make_unique<RooEvaluatorWrapper>(*nll,
1202 std::move(evaluator), rangeName ? rangeName :
"",
dynamic_cast<RooSimultaneous *
>(pdfClone.get()), takeGlobalObservablesFromData);
1203 nllWrapper->setData(
data,
false);
1206 nllWrapper->addOwnedComponents(std::move(nll));
1207 nllWrapper->addOwnedComponents(std::move(pdfClone));
1212 RooAbsPdf &actualPdf = binnedLInfo.binnedPdf ? *binnedLInfo.binnedPdf : *
this;
1216 std::unique_ptr<RooAbsReal> nll ;
1225 cfg.
binnedL = binnedLInfo.isBinnedL;
1227 cfg.
rangeName = rangeName ? rangeName :
"";
1228 auto nllVar = std::make_unique<RooNLLVar>(baseName.c_str(),
"-log(likelihood)",actualPdf,
data,projDeps, ext, cfg);
1230 nll = std::move(nllVar);
1234 if (std::unique_ptr<RooAbsReal> constraintTerm = createConstr(*
this)) {
1246 constraintTerm->setData(
data,
false);
1252 auto orignll = std::move(nll) ;
1253 nll = std::make_unique<RooAddition>((baseName +
"_with_constr").c_str(),
"nllWithCons",
RooArgSet(*orignll,*constraintTerm)) ;
1254 nll->addOwnedComponents(std::move(orignll),std::move(constraintTerm)) ;
1262 nll->enableOffsetting(
true) ;
1283 std::unique_ptr<RooFitResult> rw(minimizer.
save());
1287 <<
"RooAbsPdf::fitTo(" << this->
GetName()
1288 <<
") Calculating covariance matrix according to the asymptotically correct approach. If you find this "
1289 "method useful please consider citing https://arxiv.org/abs/1911.01303."
1293 auto nFloatPars = rw->floatParsFinal().getSize();
1295 for (
int k = 0; k < nFloatPars; k++) {
1296 for (
int l = 0;
l < nFloatPars;
l++) {
1303 std::vector<std::unique_ptr<RooDerivative>> derivatives;
1304 const RooArgList &floated = rw->floatParsFinal();
1305 std::unique_ptr<RooArgSet> floatingparams{
1307 for (
const auto paramresult : floated) {
1308 auto paraminternal =
static_cast<RooRealVar *
>(floatingparams->find(*paramresult));
1310 derivatives.emplace_back(this->
derivative(*paraminternal, obs, 1));
1314 for (
int j = 0; j <
data.numEntries(); j++) {
1318 std::vector<double> diffs(floated.
getSize(), 0.0);
1319 for (
int k = 0; k < floated.
getSize(); k++) {
1320 const auto paramresult =
static_cast<RooRealVar *
>(floated.
at(k));
1321 auto paraminternal =
static_cast<RooRealVar *
>(floatingparams->find(*paramresult));
1323 double diff = derivatives[k]->
getVal();
1325 *paraminternal = paramresult->getVal();
1329 double prob =
getVal(&obs);
1330 for (
int k = 0; k < floated.
getSize(); k++) {
1331 for (
int l = 0;
l < floated.
getSize();
l++) {
1332 num(k,
l) +=
data.weightSquared() * diffs[k] * diffs[
l] / (prob * prob);
1344 return rw->covQual();
1363 std::unique_ptr<RooFitResult> rw{minimizer.
save()};
1365 coutI(Fitting) <<
"RooAbsPdf::fitTo(" << this->
GetName()
1366 <<
") Calculating sum-of-weights-squared correction matrix for covariance matrix"
1369 std::unique_ptr<RooFitResult> rw2{minimizer.
save()};
1377 coutE(Fitting) <<
"RooAbsPdf::fitTo(" << this->
GetName()
1378 <<
") ERROR: Cannot apply sum-of-weights correction to covariance matrix: correction "
1379 "matrix calculated with weight-squared is singular"
1388 for (
int i = 0; i < matC.
GetNrows(); ++i) {
1389 for (
int j = 0; j < i; ++j) {
1390 matC(j, i) = matC(i, j);
1398 return std::min(rw->covQual(), rw2->covQual());
1417 bool weightedData =
data.isNonPoissonWeighted();
1421 coutW(InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") WARNING: a likelihood fit is requested of what appears to be weighted data.\n"
1422 <<
" While the estimated values of the parameters will always be calculated taking the weights into account,\n"
1423 <<
" there are multiple ways to estimate the errors of the parameters. You are advised to make an \n"
1424 <<
" explicit choice for the error calculation:\n"
1425 <<
" - Either provide SumW2Error(true), to calculate a sum-of-weights-corrected HESSE error matrix\n"
1426 <<
" (error will be proportional to the number of events in MC).\n"
1427 <<
" - Or provide SumW2Error(false), to return errors from original HESSE error matrix\n"
1428 <<
" (which will be proportional to the sum of the weights, i.e., a dataset with <sum of weights> events).\n"
1429 <<
" - Or provide AsymptoticError(true), to use the asymptotically correct expression\n"
1430 <<
" (for details see https://arxiv.org/abs/1911.01303)."
1435 coutE(InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
"): sum-of-weights and asymptotic error correction do not work with MINOS errors. Not fitting." << endl;
1439 coutW(InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") WARNING: asymptotic correction does not apply to MINOS errors" << endl ;
1444 coutE(InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") ERROR: Cannot compute both asymptotically correct and SumW2 errors." << endl ;
1457 m.setMinimizerType(cfg.
minType.c_str());
1460 m.setPrintEvalErrors(cfg.
numee);
1469 if (cfg.
hesse)
m.hesse();
1471 int corrCovQual = -1;
1473 if (
m.getNPar()>0) {
1481 std::unique_ptr<RooFitResult> ret;
1483 auto name = std::string(
"fitresult_") +
GetName() +
"_" +
data.GetName();
1484 auto title = std::string(
"Result of fit of p.d.f. ") +
GetName() +
" to dataset " +
data.GetName();
1485 ret = std::unique_ptr<RooFitResult>{
m.save(
name.c_str(),title.c_str())};
1658 std::string nllCmdListString =
"ProjectedObservables,Extended,Range,"
1659 "RangeWithName,SumCoefRange,NumCPU,SplitRange,Constrained,Constrain,ExternalConstraints,"
1660 "CloneData,GlobalObservables,GlobalObservablesSource,GlobalObservablesTag,"
1661 "BatchMode,IntegrateBins,ModularL";
1664 nllCmdListString +=
",OffsetLikelihood";
1683 pc.
defineInt(
"numee",
"PrintEvalErrors",0,minimizerDefaults.
numee) ;
1689 pc.
defineInt(
"doOffset",
"OffsetLikelihood",0,0) ;
1690 pc.
defineInt(
"parallelize",
"Parallelize", 0, 0);
1691 pc.
defineInt(
"enableParallelGradient",
"ParallelGradientOptions", 0, 0);
1692 pc.
defineInt(
"enableParallelDescent",
"ParallelDescentOptions", 0, 0);
1693 pc.
defineInt(
"timingAnalysis",
"TimingAnalysis", 0, 0);
1706 if (pc.
getInt(
"timingAnalysis") && !this->InheritsFrom(
"RooSimultaneous") ) {
1707 coutW(Minimization) <<
"The timingAnalysis feature was built for minimization with RooSimultaneous "
1708 "and is not implemented for other PDF's. Please create a RooSimultaneous to "
1709 "enable this feature." << endl;
1721 conf.
defineInt(
"BatchMode",
"BatchMode",0,0);
1724 if (conf.
getInt(
"BatchMode") != 0) {
1730 size_t nEvents =
static_cast<size_t>(prefit*
data.numEntries());
1731 if (prefit > 0.5 || nEvents < 100) {
1732 coutW(InputArguments) <<
"PrefitDataFraction should be in suitable range."
1733 <<
"With the current PrefitDataFraction=" << prefit
1734 <<
", the number of events would be " << nEvents<<
" out of "
1735 <<
data.numEntries() <<
". Skipping prefit..." << endl;
1738 size_t step =
data.numEntries()/nEvents;
1743 for (
int i=0; i<
data.numEntries(); i+=step)
1749 pc.
filterCmdList(tinyCmdList,
"Prefit,Hesse,Minos,Verbose,Save,Timer");
1753 tinyCmdList.
Add(&hesse_option);
1754 tinyCmdList.
Add(&print_option);
1756 fitTo(tiny,tinyCmdList);
1761 if (pc.
getInt(
"parallelize") != 0 || pc.
getInt(
"enableParallelGradient") || pc.
getInt(
"enableParallelDescent")) {
1764 nllCmdList.
Add(&modularL_option);
1767 std::unique_ptr<RooAbsReal> nll{
createNLL(
data,nllCmdList)};
1823 os <<
indent <<
"--- RooAbsPdf ---" << endl;
1826 os <<
indent <<
" Normalization integral: " << endl ;
1827 auto moreIndent = std::string(
indent.Data()) +
" " ;
1848 const RooArgSet* auxProto,
bool verbose)
const
1850 return new RooGenContext(*
this,vars,prototype,auxProto,verbose) ;
1857 bool verbose,
bool autoBinned,
const char* binnedTag)
const
1859 if (prototype || (auxProto && auxProto->
getSize()>0)) {
1860 return genContext(vars,prototype,auxProto,verbose);
1937 pc.
defineInt(
"randProto",
"PrototypeData",0,0) ;
1938 pc.
defineInt(
"resampleProto",
"PrototypeData",1,0) ;
1940 pc.
defineInt(
"extended",
"Extended",0,0) ;
1941 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
1942 pc.
defineInt(
"autoBinned",
"AutoBinned",0,1) ;
1943 pc.
defineInt(
"expectedData",
"ExpectedData",0,0) ;
1950 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
1957 const char* dsetName = pc.
getString(
"dsetName") ;
1958 bool verbose = pc.
getInt(
"verbose") ;
1959 bool randProto = pc.
getInt(
"randProto") ;
1960 bool resampleProto = pc.
getInt(
"resampleProto") ;
1961 bool extended = pc.
getInt(
"extended") ;
1962 bool autoBinned = pc.
getInt(
"autoBinned") ;
1963 const char* binnedTag = pc.
getString(
"binnedTag") ;
1965 double nEventsD = pc.
getInt(
"nEventsD") ;
1967 bool expectedData = pc.
getInt(
"expectedData") ;
1969 double nEvents = (nEventsD>0) ? nEventsD :
double(nEventsI);
1978 }
else if (nEvents==0) {
1979 cxcoutI(Generation) <<
"No number of events specified , number of events generated is "
1983 if (extended && protoData && !randProto) {
1984 cxcoutI(Generation) <<
"WARNING Using generator option Extended() (Poisson distribution of #events) together "
1985 <<
"with a prototype dataset implies incomplete sampling or oversampling of proto data. "
1986 <<
"Set randomize flag in ProtoData() option to randomize prototype dataset order and thus "
1987 <<
"to randomize the set of over/undersampled prototype events for each generation cycle." << endl ;
1992 std::unique_ptr<RooDataSet>
data;
1994 data = std::unique_ptr<RooDataSet>{
generate(whatVars,*protoData,
Int_t(nEvents),verbose,randProto,resampleProto)};
1996 data = std::unique_ptr<RooDataSet>{
generate(whatVars,nEvents,verbose,autoBinned,binnedTag,expectedData, extended)};
2000 if (dsetName && strlen(dsetName)>0) {
2001 data->SetName(dsetName) ;
2029 pc.
defineInt(
"randProto",
"PrototypeData",0,0) ;
2030 pc.
defineInt(
"resampleProto",
"PrototypeData",1,0) ;
2032 pc.
defineInt(
"extended",
"Extended",0,0) ;
2033 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
2034 pc.
defineInt(
"autoBinned",
"AutoBinned",0,1) ;
2040 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2047 const char* dsetName = pc.
getString(
"dsetName") ;
2049 bool verbose = pc.
getInt(
"verbose") ;
2050 bool randProto = pc.
getInt(
"randProto") ;
2051 bool resampleProto = pc.
getInt(
"resampleProto") ;
2052 bool extended = pc.
getInt(
"extended") ;
2053 bool autoBinned = pc.
getInt(
"autoBinned") ;
2054 const char* binnedTag = pc.
getString(
"binnedTag") ;
2058 return new GenSpec(cx,whatVars,protoData,nEvents,extended,randProto,resampleProto,dsetName) ;
2112 std::unique_ptr<RooAbsGenContext> context{
autoGenContext(whatVars,0,0,verbose,autoBinned,binnedTag)};
2117 std::unique_ptr<RooDataSet> generated;
2118 if(0 != context && context->isValid()) {
2119 generated = std::unique_ptr<RooDataSet>{context->generate(nEvents,
false, extended)};
2122 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") cannot create a valid context" << endl;
2134 double nEvents,
bool ,
bool randProtoOrder,
bool resampleProto,
2135 bool skipInit,
bool extended)
const
2137 if (nEvents==0 && (prototype==0 || prototype->
numEntries()==0)) {
2138 return std::make_unique<RooDataSet>(
"emptyData",
"emptyData",whatVars);
2141 std::unique_ptr<RooDataSet> generated;
2144 if (resampleProto) {
2145 randProtoOrder=true ;
2148 if (randProtoOrder && prototype && prototype->
numEntries()!=nEvents) {
2149 coutI(Generation) <<
"RooAbsPdf::generate (Re)randomizing event order in prototype dataset (Nevt=" << nEvents <<
")" << endl ;
2156 generated = std::unique_ptr<RooDataSet>{context.
generate(nEvents,skipInit,extended)};
2159 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") do not have a valid generator context" << endl;
2190 Int_t nEvents,
bool verbose,
bool randProtoOrder,
bool resampleProto)
const
2192 std::unique_ptr<RooAbsGenContext> context{
genContext(whatVars,&prototype,0,verbose)};
2196 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") ERROR creating generator context" << endl ;
2211 if (!resampleProto) {
2213 std::iota(lut, lut + nProto, 0);
2219 for (
int i = nProto-1; i > 0; --i) {
2284 if(server == &arg)
continue;
2285 if(server->dependsOn(arg)) {
2326 pc.
defineInt(
"extended",
"Extended",0,0) ;
2327 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
2329 pc.
defineInt(
"expectedData",
"ExpectedData",0,0) ;
2332 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2338 double nEvents = pc.
getDouble(
"nEventsD") ;
2340 nEvents = pc.
getInt(
"nEvents") ;
2343 bool extended = pc.
getInt(
"extended") ;
2344 bool expectedData = pc.
getInt(
"expectedData") ;
2345 const char* dsetName = pc.
getString(
"dsetName") ;
2350 cxcoutI(Generation) <<
" Extended mode active, number of events generated (" << nEvents <<
") is Poisson fluctuation on "
2351 <<
GetName() <<
"::expectedEvents() = " << nEvents << endl ;
2356 }
else if (nEvents==0) {
2357 cxcoutI(Generation) <<
"No number of events specified , number of events generated is "
2365 if (dsetName && strlen(dsetName)>0) {
2366 data->SetName(dsetName) ;
2403 auto hist = std::make_unique<RooDataHist>(
"genData",
"genData",whatVars);
2408 coutE(InputArguments) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") ERROR: No event count provided and p.d.f does not provide expected number of events" << endl ;
2413 if (expectedData || extended) {
2424 vector<int> histOut(hist->numEntries()) ;
2425 double histMax(-1) ;
2426 Int_t histOutSum(0) ;
2427 for (
int i=0 ; i<hist->numEntries() ; i++) {
2432 double w=hist->weight()*nEvents ;
2433 hist->set(i,
w, sqrt(
w));
2435 }
else if (extended) {
2439 hist->set(
w,sqrt(
w)) ;
2445 if (hist->weight()>histMax) {
2446 histMax = hist->weight() ;
2449 histOutSum += histOut[i] ;
2454 if (!expectedData && !extended) {
2459 Int_t nEvtExtra = std::abs(
Int_t(nEvents)-histOutSum) ;
2460 Int_t wgt = (histOutSum>nEvents) ? -1 : 1 ;
2463 std::size_t counter = 0;
2464 bool havePrintedInfo =
false;
2465 while(nEvtExtra>0) {
2468 hist->get(ibinRand) ;
2471 if (ranY<hist->weight()) {
2473 histOut[ibinRand]++ ;
2476 if (histOut[ibinRand]>0) {
2477 histOut[ibinRand]-- ;
2485 if ((counter++ > 10*nEvents || nEvents > 1.E7) && !havePrintedInfo) {
2486 havePrintedInfo =
true;
2487 coutP(Generation) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") Performing costly accept/reject sampling. If this takes too long, use "
2488 <<
"extended mode to speed up the process." << std::endl;
2493 for (
int i=0 ; i<hist->numEntries() ; i++) {
2495 hist->set(histOut[i],sqrt(1.0*histOut[i])) ;
2498 }
else if (expectedData) {
2503 double corr = nEvents/hist->sumEntries() ;
2504 for (
int i=0 ; i<hist->numEntries() ; i++) {
2506 hist->set(hist->weight()*corr,sqrt(hist->weight()*corr)) ;
2521 return generate(whatVars,nEvents) ;
2525void removeRangeOverlap(std::vector<std::pair<double, double>>& ranges) {
2527 std::sort(ranges.begin(), ranges.end());
2529 for (
auto it = ranges.begin(); it != ranges.end(); ++it) {
2530 double& startL = it->first;
2531 double& endL = it->second;
2533 for (
auto innerIt = it+1; innerIt != ranges.end(); ++innerIt) {
2534 const double startR = innerIt->first;
2535 const double endR = innerIt->second;
2537 if (startL <= startR && startR <= endL) {
2539 endL = std::max(endL, endR);
2540 *innerIt = make_pair(0., 0.);
2545 auto newEnd = std::remove_if(ranges.begin(), ranges.end(),
2546 [](
const std::pair<double,double>&
input){
2547 return input.first == input.second;
2549 ranges.erase(newEnd, ranges.end());
2662 std::unique_ptr<RooCmdArg> plotRange;
2663 std::unique_ptr<RooCmdArg> normRange2;
2667 cmdList.
Add(plotRange.get());
2672 cmdList.
Add(normRange2.get());
2675 if (plotRange || normRange2) {
2676 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f was fitted in a subrange and no explicit "
2677 << (plotRange?
"Range()":
"") << ((plotRange&&normRange2)?
" and ":
"")
2678 << (normRange2?
"NormRange()":
"") <<
" was specified. Plotting / normalising in fit range. To override, do one of the following"
2679 <<
"\n\t- Clear the automatic fit range attribute: <pdf>.removeStringAttribute(\"fitrange\");"
2680 <<
"\n\t- Explicitly specify the plotting range: Range(\"<rangeName>\")."
2681 <<
"\n\t- Explicitly specify where to compute the normalisation: NormRange(\"<rangeName>\")."
2682 <<
"\n\tThe default (full) range can be denoted with Range(\"\") / NormRange(\"\")."<< endl ;
2692 pc.
defineSet(
"compSet",
"SelectCompSet",0) ;
2699 pc.
defineInt(
"rangeAdjustNorm",
"Range",0,0) ;
2700 pc.
defineInt(
"rangeWNAdjustNorm",
"RangeWithName",0,0) ;
2701 pc.
defineMutex(
"SelectCompSet",
"SelectCompSpec") ;
2713 double scaleFactor = pc.
getDouble(
"scaleFactor") ;
2715 const char* compSpec = pc.
getString(
"compSpec") ;
2717 bool haveCompSel = ( (compSpec && strlen(compSpec)>0) || compSet) ;
2720 std::string nameSuffix ;
2721 if (compSpec && strlen(compSpec)>0) {
2722 nameSuffix.append(
"_Comp[") ;
2723 nameSuffix.append(compSpec) ;
2724 nameSuffix.append(
"]") ;
2725 }
else if (compSet) {
2734 RooCmdArg cnsuffix(
"CurveNameSuffix",0,0,0,0,nameSuffix.c_str(),0,0,0) ;
2735 cmdList.
Add(&cnsuffix);
2740 double nExpected(1) ;
2744 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << endl ;
2755 bool hasCustomRange(
false), adjustNorm(
false) ;
2757 std::vector<pair<double,double> > rangeLim;
2762 double rangeLo = pc.
getDouble(
"rangeLo") ;
2763 double rangeHi = pc.
getDouble(
"rangeHi") ;
2764 rangeLim.push_back(make_pair(rangeLo,rangeHi)) ;
2765 adjustNorm = pc.
getInt(
"rangeAdjustNorm") ;
2766 hasCustomRange = true ;
2768 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") only plotting range ["
2769 << rangeLo <<
"," << rangeHi <<
"]" ;
2771 ccoutI(Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << endl ;
2773 ccoutI(Plotting) << endl ;
2776 nameSuffix.append(
Form(
"_Range[%f_%f]",rangeLo,rangeHi)) ;
2780 for (
const std::string& rangeNameToken :
ROOT::Split(pc.
getString(
"rangeName",
"",
false),
",")) {
2781 const char* thisRangeName = rangeNameToken.empty() ? nullptr : rangeNameToken.c_str();
2783 coutE(Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2789 adjustNorm = pc.
getInt(
"rangeWNAdjustNorm") ;
2790 hasCustomRange = true ;
2792 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") only plotting range '" << pc.
getString(
"rangeName",
"",
false) <<
"'" ;
2794 ccoutI(Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << endl ;
2796 ccoutI(Plotting) << endl ;
2799 nameSuffix.append(
"_Range[" + std::string(pc.
getString(
"rangeName")) +
"]");
2804 for (
const auto& rangeNameToken :
ROOT::Split(pc.
getString(
"normRangeName",
"",
false),
",")) {
2805 const char* thisRangeName = rangeNameToken.empty() ? nullptr : rangeNameToken.c_str();
2807 coutE(Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2814 hasCustomRange = true ;
2815 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f. curve is normalized using explicit choice of ranges '" << pc.
getString(
"normRangeName",
"",
false) <<
"'" << endl ;
2817 nameSuffix.append(
"_NormRange[" + std::string(pc.
getString(
"rangeName")) +
"]");
2821 if (hasCustomRange && adjustNorm) {
2823 const std::size_t oldSize = rangeLim.size();
2824 removeRangeOverlap(rangeLim);
2826 if (oldSize != rangeLim.size() && !pc.
hasProcessed(
"NormRange")) {
2830 coutE(Plotting) <<
"Requested plot/integration ranges overlap. For correct plotting, new ranges "
2831 "will be defined." << std::endl;
2834 std::string rangesNoOverlap;
2835 for (
auto it = rangeLim.begin(); it != rangeLim.end(); ++it) {
2836 std::stringstream rangeName;
2837 rangeName <<
"Remove_overlap_range_" << it - rangeLim.begin();
2838 plotVar->setRange(rangeName.str().c_str(), it->first, it->second);
2839 if (!rangesNoOverlap.empty())
2840 rangesNoOverlap +=
",";
2841 rangesNoOverlap += rangeName.str();
2846 rangeArg->
setString(0, rangesNoOverlap.c_str());
2848 plotRange = std::make_unique<RooCmdArg>(
RooFit::Range(rangesNoOverlap.c_str()));
2849 cmdList.
Add(plotRange.get());
2853 double rangeNevt(0) ;
2854 for (
const auto& riter : rangeLim) {
2859 scaleFactor *= rangeNevt/nExpected ;
2865 scaleFactor *= nExpected ;
2867 scaleFactor /= nExpected ;
2886 for (
const auto arg : branchNodeSet) {
2888 branchNodeSet.
remove(*arg) ;
2893 std::unique_ptr<RooArgSet> dirSelNodes;
2899 if (dirSelNodes->getSize()>0) {
2900 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") directly selected PDF components: " << *dirSelNodes << endl ;
2906 coutE(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection set " << *compSet <<
" does not match any components of p.d.f." << endl ;
2908 coutE(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection expression '" << compSpec <<
"' does not select any components of p.d.f." << endl ;
2915 RooCmdArg cnsuffix(
"CurveNameSuffix",0,0,0,0,nameSuffix.c_str(),0,0,0) ;
2916 cmdList.
Add(&cnsuffix);
2947 double nExpected(1) ;
2951 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << endl ;
3021 pc.
defineInt(
"showc",
"ShowConstants",0,0) ;
3022 pc.
defineSet(
"params",
"Parameters",0,0) ;
3023 pc.
defineInt(
"dummy",
"FormatArgs",0,0) ;
3033 const char* label = pc.
getString(
"label") ;
3037 int showc = pc.
getInt(
"showc") ;
3042 params = std::unique_ptr<RooArgSet>{
static_cast<RooArgSet*
>(params->selectCommon(*requestedParams))};
3064 bool showLabel= (label != 0 && strlen(label) > 0);
3069 for (
const auto param : params) {
3071 if(showConstants || !var->isConstant())
ymin-= dy;
3074 std::string labelString = label;
3075 unsigned int numLines = std::count(labelString.begin(), labelString.end(),
'\n') + 1;
3076 if (showLabel)
ymin -= numLines * dy;
3081 box->SetName((std::string(
GetName()) +
"_paramBox").c_str());
3082 box->SetFillColor(0);
3083 box->SetBorderSize(0);
3084 box->SetTextAlign(12);
3085 box->SetTextSize(0.04F);
3086 box->SetFillStyle(0);
3088 for (
const auto param : params) {
3089 auto var =
static_cast<const RooRealVar*
>(param);
3090 if(var->isConstant() && !showConstants)
continue;
3092 std::unique_ptr<TString> formatted{formatCmd ? var->format(*formatCmd) : var->format(2,
"NELU")};
3093 box->AddText(formatted->Data());
3154 pdfOwner->
_norm = 0 ;
3170 name.append(
"_Proj[") ;
3173 for(
auto const& arg : iset) {
3179 name.append(arg->GetName()) ;
3229 pc.
defineSet(
"supNormSet",
"SupNormSet",0,0) ;
3230 pc.
defineInt(
"numScanBins",
"ScanParameters",0,1000) ;
3231 pc.
defineInt(
"intOrder",
"ScanParameters",1,2) ;
3232 pc.
defineInt(
"doScanNum",
"ScanNumCdf",0,1) ;
3233 pc.
defineInt(
"doScanAll",
"ScanAllCdf",0,0) ;
3234 pc.
defineInt(
"doScanNon",
"ScanNoCdf",0,0) ;
3235 pc.
defineMutex(
"ScanNumCdf",
"ScanAllCdf",
"ScanNoCdf") ;
3238 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
3267 coutI(NumIntegration) <<
"RooAbsPdf::createCdf(" <<
GetName() <<
") integration over observable(s) " << iset <<
" involves numeric integration," << endl
3268 <<
" constructing cdf though numeric integration of sampled pdf in " << numScanBins <<
" bins and applying order "
3269 << intOrder <<
" interpolation on integrated histogram." << endl
3270 <<
" To override this choice of technique use argument ScanNone(), to change scan parameters use ScanParameters(nbins,order) argument" << endl ;
3282 ivar->
setBins(numScanBins,
"numcdf") ;
3283 auto ret = std::make_unique<RooNumCdf>(
name.c_str(),
name.c_str(),*
this,*ivar,
"numcdf");
3284 ret->setInterpolationOrder(intOrder) ;
3296 bool stripDisconnected,
bool removeConstraintsFromPdf)
const
3301 for (
const auto arg : *comps) {
3302 auto pdf =
dynamic_cast<const RooAbsPdf*
>(arg) ;
3304 std::unique_ptr<RooArgSet> compRet(
3305 pdf->getConstraints(observables,constrainedParams,stripDisconnected,removeConstraintsFromPdf));
3307 ret->
add(*compRet,
false) ;
3360 if (config)
return config ;
3392 delete _genContext ;
3399 bool extended,
bool randProto,
bool resampleProto,
TString dsetName,
bool init) :
3400 _genContext(context), _whatVars(whatVars), _protoData(protoData), _nGen(nGen), _extended(extended),
3401 _randProto(randProto), _resampleProto(resampleProto), _dsetName(dsetName), _init(init)
3408void sterilizeClientCaches(
RooAbsArg & arg) {
3410 for(std::size_t iClient = 0; iClient <
clients.size(); ++iClient) {
3412 const std::size_t oldClientsSize =
clients.size();
3415 for(
int iCache = 0; iCache < client->
numCaches(); ++iCache) {
3417 cacheMgr->sterilize();
3424 if(
clients.size() != oldClientsSize) {
3425 auto clientIter = std::find(
clients.begin(),
clients.end(), client);
3426 if(clientIter ==
clients.end()) {
3427 throw std::runtime_error(
"After a clients caches were cleared, the client was gone! This should not happen.");
3429 iClient = std::distance(
clients.begin(), clientIter);
3448 sterilizeClientCaches(*
this);
3468 sterilizeClientCaches(*
this);
3482 bool nameChange,
bool isRecursiveStep)
3500std::unique_ptr<RooAbsArg>
3506 std::unique_ptr<RooAbsPdf> pdfClone(
static_cast<RooAbsPdf *
>(this->
Clone()));
3509 auto newArg = std::make_unique<RooNormalizedPdf>(*pdfClone, normSet);
3513 for (
RooAbsArg *server : newArg->servers()) {
3517 newArg->addOwnedComponents(std::move(pdfClone));
3527 std::stringstream errMsg;
3529 <<
" did not overload RooAbsPdf::createExpectedEventsFunc()!";
3530 coutE(InputArguments) << errMsg.str() << std::endl;
header file containing the templated implementation of matrix inversion routines for use with ROOT's ...
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.
class to compute the Cholesky decomposition of a matrix
bool Invert(M &m) const
place the inverse into m
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
virtual void applyWeightSquared(bool flag)
Disables or enables the usage of squared weights.
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.
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
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 const RooArgSet * get() const
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...
int calcSumW2CorrectedCovariance(RooMinimizer &minimizer, RooAbsReal &nll) const
Apply correction to errors and covariance matrix.
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
double getValV(const RooArgSet *set=nullptr) const override
Return current value, normalized by integrating over the observables in nset.
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...
virtual RooFit::OwningPtr< RooAbsReal > createNLL(RooAbsData &data, const RooLinkedList &cmdList={})
Construct representation of -log(L) of PDF with given dataset.
Int_t * randomizeProtoOrder(Int_t nProto, Int_t nGen, bool resample=false) const
Return lookup table with randomized order for nProto prototype events.
virtual RooFit::OwningPtr< RooFitResult > fitTo(RooAbsData &data, const RooLinkedList &cmdList={})
Fit PDF to given dataset.
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.
static constexpr int extendedFitDefault
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.
int calcAsymptoticCorrectedCovariance(RooMinimizer &minimizer, RooAbsData const &data)
Use the asymptotically correct approach to estimate errors in the presence of weights.
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.
Int_t _negCount
Number of negative probabilities remaining to print.
std::unique_ptr< RooFitResult > minimizeNLL(RooAbsReal &nll, RooAbsData const &data, MinimizerConfig const &cfg)
Minimizes a given NLL variable by finding the optimal parameters with the RooMinimzer.
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.
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...
RooDerivative * derivative(RooRealVar &obs, Int_t order=1, double eps=0.001)
Return function representing first, second or third order derivative of this function.
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.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
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.
bool defineObject(const char *name, const char *argName, Int_t setNum, const TObject *obj=nullptr, bool isArray=false)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
double getDouble(const char *name, double defaultValue=0.0)
Return double property registered with name 'name'.
RooArgSet * getSet(const char *name, RooArgSet *set=nullptr)
Return RooArgSet property registered with name 'name'.
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.
Int_t getInt(const char *name, Int_t defaultValue=0)
Return integer property registered with name 'name'.
static void stripCmdList(RooLinkedList &cmdList, const char *cmdsToPurge)
Utility function that strips command names listed (comma separated) in cmdsToPurge from cmdList.
bool defineInt(const char *name, const char *argName, Int_t intNum, Int_t defValue=0)
Define integer property name 'name' mapped to integer in slot 'intNum' in RooCmdArg with name argName...
bool defineString(const char *name, const char *argName, Int_t stringNum, const char *defValue="", bool appendMode=false)
Define double property name 'name' mapped to double in slot 'stringNum' in RooCmdArg with name argNam...
bool ok(bool verbose) const
Return true of parsing was successful.
TObject * getObject(const char *name, TObject *obj=nullptr)
Return TObject property registered with name 'name'.
const char * getString(const char *name, const char *defaultValue="", bool convEmptyToNull=false)
Return string property registered with name 'name'.
void allowUndefined(bool flag=true)
If flag is true the processing of unrecognized RooCmdArgs is not considered an error.
bool defineSet(const char *name, const char *argName, Int_t setNum, const RooArgSet *set=nullptr)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
RooLinkedList filterCmdList(RooLinkedList &cmdInList, const char *cmdNameList, bool removeFromInList=true) const
Utility function to filter commands listed in cmdNameList from cmdInList.
bool defineDouble(const char *name, const char *argName, Int_t doubleNum, double defValue=0.0)
Define double property name 'name' mapped to double in slot 'doubleNum' in RooCmdArg with name argNam...
RooDataSet is a container class to hold unbinned data.
void markAsCompiled(RooAbsArg &arg) const
void compileServers(RooAbsArg &arg, RooArgSet const &normSet)
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 obejct with given name.
RooMinimizer is a wrapper class around ROOT::Fit:Fitter that provides a seamless interface between th...
RooFit::OwningPtr< RooFitResult > save(const char *name=nullptr, const char *title=nullptr)
Save and return a RooFitResult snapshot of current minimizer status.
int hesse()
Execute HESSE.
void applyCovarianceMatrix(TMatrixDSym const &V)
Apply results of given external covariance matrix.
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.
TMatrixTSym< Element > & Similarity(const TMatrixT< Element > &n)
Calculate B * (*this) * B^T , final matrix will be (nrowsb x nrowsb) This is a similarity transform w...
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 BatchMode(std::string const &batchMode="cpu")
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)
std::string & defaultBatchMode()
Get a handle on the default BatchMode option that is used when creating likelihoods.
OffsetMode
For setting the offset mode with the Offset() command argument to RooAbsPdf::fitTo()
BatchModeOption
For setting the batch mode flag with the BatchMode() 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.
Configuration struct for RooAbsPdf::minimizeNLL with all the default.
bool enableParallelGradient
bool enableParallelDescent
const RooArgSet * minosSet
std::string rangeName
Stores the configuration parameters for RooAbsTestStatistic.
std::string addCoefRangeName
bool takeGlobalObservablesFromData
double integrateOverBinsPrecision
RooFit::MPSplit interleave
Config argument to RooMinimizer ctor.
bool enableParallelDescent
bool enableParallelGradient
__roodevice__ static __roohost__ double packFloatIntoNaN(float payload)
Pack float into mantissa of a NaN.