196bool interpretExtendedCmdArg(
RooAbsPdf const& pdf,
int extendedCmdArg) {
198 if (extendedCmdArg == 2) {
202 <<
"p.d.f. provides expected number of events, including extended term in likelihood." << std::endl;
206 return extendedCmdArg;
209inline double getLog(
double prob,
RooAbsReal const *caller)
212 if (std::abs(prob) > 1e6) {
213 oocoutW(caller, Eval) <<
"RooAbsPdf::getLogVal(" << caller->
GetName()
214 <<
") WARNING: top-level pdf has a large value: " << prob << std::endl;
218 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to a negative number");
223 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to zero");
225 return -std::numeric_limits<double>::infinity();
229 caller->
logEvalError(
"getLogVal() top-level p.d.f evaluates to NaN");
234 return std::log(prob);
283 RooAbsReal(
name,title,plotMin,plotMax), _normMgr(this,10), _selectComp(
kTRUE), _specGeneratorConfig(0)
296 _normMgr(other._normMgr,this), _selectComp(other._selectComp), _normRange(other._normRange)
321 if (normVal < 0. || (normVal == 0. && rawVal != 0)) {
323 const std::string msg =
"p.d.f normalization integral is zero or negative: " + std::to_string(normVal);
330 logEvalError(
Form(
"p.d.f value is less than zero (%f), trying to recover", rawVal));
341 return (rawVal == 0. && normVal == 0.) ? 0. : rawVal / normVal;
412 auto * prevNorm =
_norm;
429 cxcoutD(Eval) <<
"RooAbsPdf::analyticalIntegralWN(" <<
GetName() <<
") code = " << code <<
" normset = " << (normSet?*normSet:
RooArgSet()) << endl ;
432 if (code==0)
return getVal(normSet) ;
452 logEvalError(
Form(
"p.d.f value is Not-a-Number (%f), forcing value to zero",value)) ;
456 logEvalError(
Form(
"p.d.f value is less than zero (%f), forcing value to zero",value)) ;
461 if(!error)
return error ;
484 if (!nset)
return 1 ;
492 coutW(Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
":: WARNING normalization is zero, nset = " ; nset->
Print(
"1") ;
493 if(
_errorCount == 10)
coutW(Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
") INFO: no more messages will be printed " << endl ;
512 return cache->
_norm ;
555 if (nsetChanged && adjustProxies) {
565 ((
RooAbsPdf*)
this)->setProxyNormSet(nset) ;
573 cxcoutD(Tracing) << IsA()->GetName() <<
"::syncNormalization(" <<
GetName()
574 <<
") recreating normalization integral " << endl ;
577 cxcoutD(Tracing) << IsA()->GetName() <<
"::syncNormalization(" <<
GetName() <<
") selfNormalized, creating unit norm" << endl;
583 auto ntitle = std::string(
GetTitle()) +
" Unit Normalization";
584 auto nname = std::string(
GetName()) +
"_UnitNorm";
595 if (cacheParamsStr && strlen(cacheParamsStr)) {
597 std::unique_ptr<RooArgSet> intParams{normInt->
getVariables()} ;
601 if (!cacheParams.
empty()) {
602 cxcoutD(Caching) <<
"RooAbsReal::createIntObj(" <<
GetName() <<
") INFO: constructing " << cacheParams.
getSize()
603 <<
"-dim value cache for integral over " << depList <<
" as a function of " << cacheParams <<
" in range " << (nr?nr:
"<default>") << endl ;
612 normInt= cachedIntegral ;
674 return getLog(
getVal(nset),
this);
684bool checkInfNaNNeg(
const T& inputs) {
690 for (
double val : inputs) {
691 inf |= !std::isfinite(val);
696 return inf || nan || neg;
707 for (
unsigned int i=0; i<outputs.
size(); ++i) {
708 const double value = outputs[i];
712 }
else if (!std::isfinite(outputs[i])){
715 }
else if (outputs[i] < 0.) {
716 logEvalError(
Form(
"p.d.f value of (%s) is less than zero (%f) for entry %zu",
730 auto pdfValues =
getValues(evalData, normSet);
740 for (std::size_t i = 0; i < pdfValues.
size(); ++i) {
741 output[i] = getLog(pdfValues[i],
this);
795 coutE(InputArguments) <<
fName <<
": this PDF does not support extended maximum likelihood"
801 coutE(InputArguments) <<
fName <<
": calculated negative expected events: " << expected
803 logEvalError(
"extendedTerm #expected events is <0 return a NaN");
809 if (std::abs(expected)<1
e-10 && std::abs(sumEntries)<1
e-10) {
815 logEvalError(
"extendedTerm #expected events is a NaN") ;
819 double extra = expected - sumEntries*log(expected);
821 if(sumEntriesW2 != 0.0) {
822 extra *= sumEntriesW2 / sumEntries;
949std::unique_ptr<RooAbsReal> createMultiRangeNLLCorrectionTerm(
950 RooAbsPdf const &pdf,
RooAbsData const &data, std::string
const &baseName, std::string
const &rangeNames)
952 double sumEntriesTotal = 0.0;
957 for (
const auto ¤tRangeName :
ROOT::
Split(rangeNames,
",")) {
958 const std::string currentName = baseName +
"_" + currentRangeName;
960 auto sumEntriesCurrent = data.
sumEntries(
"1", currentRangeName.c_str());
961 sumEntriesTotal += sumEntriesCurrent;
965 auto pdfIntegralCurrent = pdf.
createIntegral(depList, &depList,
nullptr, currentRangeName.c_str());
967 auto term =
new RooFormulaVar((currentName +
"_correctionTerm").c_str(),
968 (std::string(
"-(") + std::to_string(sumEntriesCurrent) +
" * log(x[0]))").c_str(),
972 integralList.
add(*pdfIntegralCurrent);
975 auto integralFull =
new RooAddition((baseName +
"_correctionFullIntegralTerm").c_str(),
980 auto fullRangeTerm =
new RooFormulaVar((baseName +
"_foobar").c_str(),
981 (std::string(
"(") + std::to_string(sumEntriesTotal) +
" * log(x[0]))").c_str(),
984 termList.
add(*fullRangeTerm);
985 return std::unique_ptr<RooAbsReal>{
986 new RooAddition((baseName +
"_correction").c_str(),
"correction", termList,
true)};
1003 auto baseName = std::string(
"nll_") +
GetName() +
"_" + data.
GetName();
1010 pc.
defineString(
"globstag",
"GlobalObservablesTag",0,
"") ;
1011 pc.
defineString(
"globssource",
"GlobalObservablesSource",0,
"data") ;
1014 pc.
defineInt(
"splitRange",
"SplitRange",0,0) ;
1017 pc.
defineInt(
"interleave",
"NumCPU",1,0) ;
1019 pc.
defineInt(
"optConst",
"Optimize",0,0) ;
1020 pc.
defineInt(
"cloneData",
"CloneData", 0, 2);
1021 pc.
defineObject(
"projDepSet",
"ProjectedObservables",0,0) ;
1023 pc.
defineSet(
"glObs",
"GlobalObservables",0,0) ;
1024 pc.
defineInt(
"doOffset",
"OffsetLikelihood",0,0) ;
1025 pc.
defineSet(
"extCons",
"ExternalConstraints",0,0) ;
1026 pc.
defineInt(
"BatchMode",
"BatchMode", 0, 0);
1027 pc.
defineDouble(
"IntegrateBins",
"IntegrateBins", 0, -1.);
1029 pc.
defineMutex(
"GlobalObservables",
"GlobalObservablesTag") ;
1039 const char* addCoefRangeName = pc.
getString(
"addCoefRange",0,
kTRUE) ;
1040 const bool ext = interpretExtendedCmdArg(*
this, pc.
getInt(
"ext")) ;
1044 if (numcpu_strategy==3 && !this->
InheritsFrom(
"RooSimultaneous") ) {
1045 coutW(Minimization) <<
"Cannot use a NumCpu Strategy = 3 when the pdf is not a RooSimultaneus, "
1046 "falling back to default strategy = 0" << endl;
1047 numcpu_strategy = 0;
1059 cloneData = optConst ;
1072 for (
auto arg : obs) {
1074 if (rrv) rrv->
setRange(
"fit",rangeLo,rangeHi) ;
1084 projDeps.
add(*tmp) ;
1087 const std::string globalObservablesSource = pc.
getString(
"globssource",
"data",
false);
1088 if(globalObservablesSource !=
"data" && globalObservablesSource !=
"model") {
1089 std::string errMsg =
"RooAbsPdf::fitTo: GlobalObservablesSource can only be \"data\" or \"model\"!";
1090 coutE(InputArguments) << errMsg << std::endl;
1091 throw std::invalid_argument(errMsg);
1093 const bool takeGlobalObservablesFromData = globalObservablesSource ==
"data";
1099 baseName +
"_constr",
1106 takeGlobalObservablesFromData,
1114 std::move(constraintTerm),
1115 rangeName ? rangeName :
"",
1116 addCoefRangeName ? addCoefRangeName :
"",
1122 takeGlobalObservablesFromData).release();
1127 std::unique_ptr<RooAbsReal> nll ;
1138 if (!rangeName || strchr(rangeName,
',')==0) {
1142 cfg.
rangeName = rangeName ? rangeName :
"";
1143 nll = std::make_unique<RooNLLVar>(baseName.c_str(),
"-log(likelihood)",*
this,data,projDeps, ext, cfg);
1150 throw std::runtime_error(
1151 std::string(
"Error in RooAbsPdf::createNLL! The ranges ") + rangeName +
" are overlapping!");
1153 for (
const auto& token : tokens) {
1155 auto nllComp = std::make_unique<RooNLLVar>((baseName +
"_" + token).c_str(),
"-log(likelihood)",
1156 *
this,data,projDeps,ext,cfg);
1157 nllComp->batchMode(pc.
getInt(
"BatchMode"));
1158 nllList.
addOwned(std::move(nllComp)) ;
1169 nllList.
addOwned(createMultiRangeNLLCorrectionTerm(*
this, data, baseName, rangeName));
1172 nll = std::make_unique<RooAddition>(baseName.c_str(),
"-log(likelihood)",nllList) ;
1173 nll->addOwnedComponents(std::move(nllList));
1178 if (constraintTerm) {
1179 auto orignll = std::move(nll) ;
1180 nll = std::make_unique<RooAddition>(
Form(
"%s_with_constr",baseName.c_str()),
"nllWithCons",
RooArgSet(*orignll,*constraintTerm)) ;
1181 nll->addOwnedComponents(std::move(orignll),std::move(constraintTerm)) ;
1189 nll->enableOffsetting(
true) ;
1192 return nll.release() ;
1210 std::unique_ptr<RooFitResult> rw(minimizer.
save());
1214 <<
"RooAbsPdf::fitTo(" << this->
GetName()
1215 <<
") Calculating covariance matrix according to the asymptotically correct approach. If you find this "
1216 "method useful please consider citing https://arxiv.org/abs/1911.01303."
1220 auto nFloatPars = rw->floatParsFinal().getSize();
1222 for (
int k = 0; k < nFloatPars; k++) {
1223 for (
int l = 0;
l < nFloatPars;
l++) {
1230 std::vector<std::unique_ptr<RooDerivative>> derivatives;
1231 const RooArgList &floated = rw->floatParsFinal();
1232 std::unique_ptr<RooArgSet> floatingparams{
1234 for (
const auto paramresult : floated) {
1235 auto paraminternal =
static_cast<RooRealVar *
>(floatingparams->find(*paramresult));
1236 assert(floatingparams->find(*paramresult)->IsA() == RooRealVar::Class());
1237 derivatives.emplace_back(this->
derivative(*paraminternal, obs, 1));
1241 for (
int j = 0; j < data.
numEntries(); j++) {
1245 std::vector<double> diffs(floated.
getSize(), 0.0);
1246 for (
int k = 0; k < floated.
getSize(); k++) {
1247 const auto paramresult =
static_cast<RooRealVar *
>(floated.
at(k));
1248 auto paraminternal =
static_cast<RooRealVar *
>(floatingparams->find(*paramresult));
1250 double diff = derivatives[k]->
getVal();
1252 *paraminternal = paramresult->getVal();
1256 double prob =
getVal(&obs);
1257 for (
int k = 0; k < floated.
getSize(); k++) {
1258 for (
int l = 0;
l < floated.
getSize();
l++) {
1259 num(k,
l) += data.
weight() * data.
weight() * diffs[k] * diffs[
l] / (prob * prob);
1271 return rw->covQual();
1290 std::unique_ptr<RooFitResult> rw{minimizer.
save()};
1292 coutI(Fitting) <<
"RooAbsPdf::fitTo(" << this->
GetName()
1293 <<
") Calculating sum-of-weights-squared correction matrix for covariance matrix"
1296 std::unique_ptr<RooFitResult> rw2{minimizer.
save()};
1304 coutE(Fitting) <<
"RooAbsPdf::fitTo(" << this->
GetName()
1305 <<
") ERROR: Cannot apply sum-of-weights correction to covariance matrix: correction "
1306 "matrix calculated with weight-squared is singular"
1315 for (
int i = 0; i < matC.
GetNrows(); ++i) {
1316 for (
int j = 0; j < i; ++j) {
1317 matC(j, i) = matC(i, j);
1325 return std::min(rw->covQual(), rw2->covQual());
1496 coutW(InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") WARNING: a likelihood fit is requested of what appears to be weighted data.\n"
1497 <<
" While the estimated values of the parameters will always be calculated taking the weights into account,\n"
1498 <<
" there are multiple ways to estimate the errors of the parameters. You are advised to make an \n"
1499 <<
" explicit choice for the error calculation:\n"
1500 <<
" - Either provide SumW2Error(true), to calculate a sum-of-weights-corrected HESSE error matrix\n"
1501 <<
" (error will be proportional to the number of events in MC).\n"
1502 <<
" - Or provide SumW2Error(false), to return errors from original HESSE error matrix\n"
1503 <<
" (which will be proportional to the sum of the weights, i.e., a dataset with <sum of weights> events).\n"
1504 <<
" - Or provide AsymptoticError(true), to use the asymptotically correct expression\n"
1505 <<
" (for details see https://arxiv.org/abs/1911.01303)."
1510 coutE(InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
"): sum-of-weights and asymptotic error correction do not work with MINOS errors. Not fitting." << endl;
1514 coutW(InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") WARNING: asymptotic correction does not apply to MINOS errors" << endl ;
1519 coutE(InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") ERROR: Cannot compute both asymptotically correct and SumW2 errors." << endl ;
1526 m.setMinimizerType(cfg.
minType.c_str());
1529 m.setPrintEvalErrors(cfg.
numee);
1533 if (!cfg.
fitOpt.empty()) {
1541 if (opts.
Contains(
"v"))
m.setVerbose(1) ;
1542 if (opts.
Contains(
"t"))
m.setProfile(1) ;
1544 if (opts.
Contains(
"c"))
m.optimizeConst(1) ;
1547 if (opts.
Contains(
"0"))
m.setStrategy(0) ;
1549 if (opts.
Contains(
"0"))
m.setStrategy(1) ;
1553 auto ret = (opts.
Contains(
"r")) ?
m.save() : 0 ;
1557 return std::unique_ptr<RooFitResult>(ret);
1566 if (cfg.
hesse)
m.hesse();
1568 int corrCovQual = -1;
1570 if (
m.getNPar()>0) {
1578 std::unique_ptr<RooFitResult> ret;
1581 auto title = std::string(
"Result of fit of p.d.f. ") +
GetName() +
" to dataset " + data.
GetName();
1582 ret.reset(
m.save(
name.c_str(),title.c_str()));
1608 "RangeWithName,SumCoefRange,NumCPU,SplitRange,Constrained,Constrain,ExternalConstraints,"
1609 "CloneData,GlobalObservables,GlobalObservablesSource,GlobalObservablesTag,OffsetLikelihood,"
1610 "BatchMode,IntegrateBins");
1628 pc.
defineInt(
"numee",
"PrintEvalErrors",0,minimizerDefaults.
numee) ;
1633 pc.
defineInt(
"doOffset",
"OffsetLikelihood",0,0) ;
1661 conf.
defineInt(
"BatchMode",
"BatchMode",0,0);
1664 if (conf.
getInt(
"BatchMode") != 0) {
1670 size_t nEvents =
static_cast<size_t>(prefit*data.
numEntries());
1671 if (prefit > 0.5 || nEvents < 100) {
1672 oocoutW(
this,InputArguments) <<
"PrefitDataFraction should be in suitable range."
1673 <<
"With the current PrefitDataFraction=" << prefit
1674 <<
", the number of events would be " << nEvents<<
" out of "
1675 << data.
numEntries() <<
". Skipping prefit..." << endl;
1693 pc.
filterCmdList(tinyCmdList,
"Prefit,Hesse,Minos,Verbose,Save,Timer");
1697 tinyCmdList.
Add(&hesse_option);
1698 tinyCmdList.
Add(&print_option);
1700 fitTo(tiny,tinyCmdList);
1704 std::unique_ptr<RooAbsReal> nll{
createNLL(data,nllCmdList)};
1742 RooLinkedList chi2CmdList = pc.
filterCmdList(fitCmdList,
"Range,RangeWithName,NumCPU,Optimize,ProjectedObservables,AddCoefRange,SplitRange,DataError,Extended,IntegrateBins") ;
1808 if (!rangeName || strchr(rangeName,
',')==0) {
1811 chi2 =
new RooChi2Var(baseName.c_str(),baseName.c_str(),*
this,data,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
1817 string rcmd =
"RangeWithName" ;
1818 if (arg1.
GetName()==rcmd) rarg = &arg1 ;
1819 if (arg2.
GetName()==rcmd) rarg = &arg2 ;
1820 if (arg3.
GetName()==rcmd) rarg = &arg3 ;
1821 if (arg4.
GetName()==rcmd) rarg = &arg4 ;
1822 if (arg5.
GetName()==rcmd) rarg = &arg5 ;
1823 if (arg6.
GetName()==rcmd) rarg = &arg6 ;
1824 if (arg7.
GetName()==rcmd) rarg = &arg7 ;
1825 if (arg8.
GetName()==rcmd) rarg = &arg8 ;
1829 for (std::string& token :
ROOT::Split(rangeName,
",")) {
1833 &arg1==rarg?subRangeCmd:arg1,&arg2==rarg?subRangeCmd:arg2,
1834 &arg3==rarg?subRangeCmd:arg3,&arg4==rarg?subRangeCmd:arg4,
1835 &arg5==rarg?subRangeCmd:arg5,&arg6==rarg?subRangeCmd:arg6,
1836 &arg7==rarg?subRangeCmd:arg7,&arg8==rarg?subRangeCmd:arg8) ;
1837 chi2List.
add(*chi2Comp) ;
1858 pc.
defineInt(
"integrate",
"Integrate",0,0) ;
1908 os <<
indent <<
"--- RooAbsPdf ---" << endl;
1911 os <<
indent <<
" Normalization integral: " << endl ;
1912 auto moreIndent = std::string(
indent.Data()) +
" " ;
1935 return new RooGenContext(*
this,vars,prototype,auxProto,verbose) ;
1942 Bool_t verbose,
Bool_t autoBinned,
const char* binnedTag)
const
1944 if (prototype || (auxProto && auxProto->
getSize()>0)) {
1945 return genContext(vars,prototype,auxProto,verbose);
2022 pc.
defineInt(
"randProto",
"PrototypeData",0,0) ;
2023 pc.
defineInt(
"resampleProto",
"PrototypeData",1,0) ;
2025 pc.
defineInt(
"extended",
"Extended",0,0) ;
2026 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
2027 pc.
defineInt(
"autoBinned",
"AutoBinned",0,1) ;
2028 pc.
defineInt(
"expectedData",
"ExpectedData",0,0) ;
2035 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2042 const char* dsetName = pc.
getString(
"dsetName") ;
2048 const char* binnedTag = pc.
getString(
"binnedTag") ;
2063 }
else if (nEvents==0) {
2064 cxcoutI(Generation) <<
"No number of events specified , number of events generated is "
2068 if (extended && protoData && !randProto) {
2069 cxcoutI(Generation) <<
"WARNING Using generator option Extended() (Poisson distribution of #events) together "
2070 <<
"with a prototype dataset implies incomplete sampling or oversampling of proto data. "
2071 <<
"Set randomize flag in ProtoData() option to randomize prototype dataset order and thus "
2072 <<
"to randomize the set of over/undersampled prototype events for each generation cycle." << endl ;
2079 data =
generate(whatVars,*protoData,
Int_t(nEvents),verbose,randProto,resampleProto) ;
2081 data =
generate(whatVars,nEvents,verbose,autoBinned,binnedTag,expectedData, extended) ;
2085 if (dsetName && strlen(dsetName)>0) {
2114 pc.
defineInt(
"randProto",
"PrototypeData",0,0) ;
2115 pc.
defineInt(
"resampleProto",
"PrototypeData",1,0) ;
2117 pc.
defineInt(
"extended",
"Extended",0,0) ;
2118 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
2119 pc.
defineInt(
"autoBinned",
"AutoBinned",0,1) ;
2125 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2132 const char* dsetName = pc.
getString(
"dsetName") ;
2139 const char* binnedTag = pc.
getString(
"binnedTag") ;
2143 return new GenSpec(cx,whatVars,protoData,nEvents,extended,randProto,resampleProto,dsetName) ;
2193 return new RooDataSet(
"emptyData",
"emptyData",whatVars) ;
2203 if(0 != context && context->
isValid()) {
2207 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") cannot create a valid context" << endl;
2209 if(0 != context)
delete context;
2223 if (nEvents==0 && (prototype==0 || prototype->
numEntries()==0)) {
2224 return new RooDataSet(
"emptyData",
"emptyData",whatVars) ;
2230 if (resampleProto) {
2231 randProtoOrder=
kTRUE ;
2234 if (randProtoOrder && prototype && prototype->
numEntries()!=nEvents) {
2235 coutI(Generation) <<
"RooAbsPdf::generate (Re)randomizing event order in prototype dataset (Nevt=" << nEvents <<
")" << endl ;
2242 generated= context.
generate(nEvents,skipInit,extended);
2245 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") do not have a valid generator context" << endl;
2280 RooDataSet* data =
generate(*context,whatVars,&prototype,nEvents,verbose,randProtoOrder,resampleProto) ;
2284 coutE(Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") ERROR creating generator context" << endl ;
2300 if (!resampleProto) {
2302 std::iota(lut, lut + nProto, 0);
2308 for (
int i = nProto-1; i > 0; --i) {
2373 if(server == &arg)
continue;
2374 if(server->dependsOn(arg)) {
2416 pc.
defineInt(
"extended",
"Extended",0,0) ;
2417 pc.
defineInt(
"nEvents",
"NumEvents",0,0) ;
2419 pc.
defineInt(
"expectedData",
"ExpectedData",0,0) ;
2422 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2430 nEvents = pc.
getInt(
"nEvents") ;
2435 const char* dsetName = pc.
getString(
"dsetName") ;
2440 cxcoutI(Generation) <<
" Extended mode active, number of events generated (" << nEvents <<
") is Poisson fluctuation on "
2441 <<
GetName() <<
"::expectedEvents() = " << nEvents << endl ;
2446 }
else if (nEvents==0) {
2447 cxcoutI(Generation) <<
"No number of events specified , number of events generated is "
2455 if (dsetName && strlen(dsetName)>0) {
2498 coutE(InputArguments) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") ERROR: No event count provided and p.d.f does not provide expected number of events" << endl ;
2504 if (expectedData || extended) {
2517 Int_t histOutSum(0) ;
2524 hist->
set(i, w, sqrt(w));
2526 }
else if (extended) {
2530 hist->
set(w,sqrt(w)) ;
2536 if (hist->
weight()>histMax) {
2537 histMax = hist->
weight() ;
2540 histOutSum += histOut[i] ;
2545 if (!expectedData && !extended) {
2550 Int_t nEvtExtra = abs(
Int_t(nEvents)-histOutSum) ;
2551 Int_t wgt = (histOutSum>nEvents) ? -1 : 1 ;
2554 std::size_t counter = 0;
2555 bool havePrintedInfo =
false;
2556 while(nEvtExtra>0) {
2559 hist->
get(ibinRand) ;
2562 if (ranY<hist->weight()) {
2564 histOut[ibinRand]++ ;
2567 if (histOut[ibinRand]>0) {
2568 histOut[ibinRand]-- ;
2576 if ((counter++ > 10*nEvents || nEvents > 1.E7) && !havePrintedInfo) {
2577 havePrintedInfo =
true;
2578 coutP(Generation) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") Performing costly accept/reject sampling. If this takes too long, use "
2579 <<
"extended mode to speed up the process." << std::endl;
2586 hist->
set(histOut[i],sqrt(1.0*histOut[i])) ;
2589 }
else if (expectedData) {
2612 return generate(whatVars,nEvents) ;
2616void removeRangeOverlap(std::vector<std::pair<double, double>>& ranges) {
2618 std::sort(ranges.begin(), ranges.end());
2620 for (
auto it = ranges.begin(); it != ranges.end(); ++it) {
2621 double& startL = it->first;
2622 double& endL = it->second;
2624 for (
auto innerIt = it+1; innerIt != ranges.end(); ++innerIt) {
2625 const double startR = innerIt->first;
2626 const double endR = innerIt->second;
2628 if (startL <= startR && startR <= endL) {
2630 endL = std::max(endL, endR);
2631 *innerIt = make_pair(0., 0.);
2636 auto newEnd = std::remove_if(ranges.begin(), ranges.end(),
2637 [](
const std::pair<double,double>& input){
2638 return input.first == input.second;
2640 ranges.erase(newEnd, ranges.end());
2758 cmdList.
Add(plotRange) ;
2763 cmdList.
Add(normRange2) ;
2766 if (plotRange || normRange2) {
2767 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f was fitted in a subrange and no explicit "
2768 << (plotRange?
"Range()":
"") << ((plotRange&&normRange2)?
" and ":
"")
2769 << (normRange2?
"NormRange()":
"") <<
" was specified. Plotting / normalising in fit range. To override, do one of the following"
2770 <<
"\n\t- Clear the automatic fit range attribute: <pdf>.setStringAttribute(\"fitrange\", nullptr);"
2771 <<
"\n\t- Explicitly specify the plotting range: Range(\"<rangeName>\")."
2772 <<
"\n\t- Explicitly specify where to compute the normalisation: NormRange(\"<rangeName>\")."
2773 <<
"\n\tThe default (full) range can be denoted with Range(\"\") / NormRange(\"\")."<< endl ;
2790 pc.
defineInt(
"rangeAdjustNorm",
"Range",0,0) ;
2791 pc.
defineInt(
"rangeWNAdjustNorm",
"RangeWithName",0,0) ;
2792 pc.
defineMutex(
"SelectCompSet",
"SelectCompSpec") ;
2806 const char* compSpec = pc.
getString(
"compSpec") ;
2808 Bool_t haveCompSel = ( (compSpec && strlen(compSpec)>0) || compSet) ;
2811 std::string nameSuffix ;
2812 if (compSpec && strlen(compSpec)>0) {
2813 nameSuffix.append(
"_Comp[") ;
2814 nameSuffix.append(compSpec) ;
2815 nameSuffix.append(
"]") ;
2816 }
else if (compSet) {
2817 nameSuffix.append(
"_Comp[") ;
2819 nameSuffix.append(
"]") ;
2823 pc.
stripCmdList(cmdList,
"SelectCompSet,SelectCompSpec") ;
2827 RooCmdArg cnsuffix(
"CurveNameSuffix",0,0,0,0,nameSuffix.c_str(),0,0,0) ;
2828 cmdList.
Add(&cnsuffix);
2837 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << endl ;
2850 std::vector<pair<Double_t,Double_t> > rangeLim;
2857 rangeLim.push_back(make_pair(rangeLo,rangeHi)) ;
2858 adjustNorm = pc.
getInt(
"rangeAdjustNorm") ;
2859 hasCustomRange =
kTRUE ;
2861 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") only plotting range ["
2862 << rangeLo <<
"," << rangeHi <<
"]" ;
2864 ccoutI(Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << endl ;
2866 ccoutI(Plotting) << endl ;
2869 nameSuffix.append(
Form(
"_Range[%f_%f]",rangeLo,rangeHi)) ;
2873 for (
const std::string& rangeNameToken :
ROOT::Split(pc.
getString(
"rangeName",
"",
false),
",")) {
2874 const char* thisRangeName = rangeNameToken.empty() ? nullptr : rangeNameToken.c_str();
2876 coutE(Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2882 adjustNorm = pc.
getInt(
"rangeWNAdjustNorm") ;
2883 hasCustomRange =
kTRUE ;
2885 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") only plotting range '" << pc.
getString(
"rangeName",
"",
false) <<
"'" ;
2887 ccoutI(Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << endl ;
2889 ccoutI(Plotting) << endl ;
2892 nameSuffix.append(
Form(
"_Range[%s]",pc.
getString(
"rangeName"))) ;
2897 for (
const auto& rangeNameToken :
ROOT::Split(pc.
getString(
"normRangeName",
"",
false),
",")) {
2898 const char* thisRangeName = rangeNameToken.empty() ? nullptr : rangeNameToken.c_str();
2900 coutE(Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2906 adjustNorm =
kTRUE ;
2907 hasCustomRange =
kTRUE ;
2908 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f. curve is normalized using explicit choice of ranges '" << pc.
getString(
"normRangeName",
"",
false) <<
"'" << endl ;
2910 nameSuffix.append(
Form(
"_NormRange[%s]",pc.
getString(
"rangeName"))) ;
2914 if (hasCustomRange && adjustNorm) {
2916 const std::size_t oldSize = rangeLim.size();
2917 removeRangeOverlap(rangeLim);
2919 if (oldSize != rangeLim.size() && !pc.
hasProcessed(
"NormRange")) {
2923 coutE(Plotting) <<
"Requested plot/integration ranges overlap. For correct plotting, new ranges "
2924 "will be defined." << std::endl;
2927 std::string rangesNoOverlap;
2928 for (
auto it = rangeLim.begin(); it != rangeLim.end(); ++it) {
2929 std::stringstream rangeName;
2930 rangeName <<
"Remove_overlap_range_" << it - rangeLim.begin();
2931 plotVar->setRange(rangeName.str().c_str(), it->first, it->second);
2932 if (!rangesNoOverlap.empty())
2933 rangesNoOverlap +=
",";
2934 rangesNoOverlap += rangeName.str();
2939 rangeArg->
setString(0, rangesNoOverlap.c_str());
2942 cmdList.
Add(plotRange);
2947 for (
const auto& riter : rangeLim) {
2952 scaleFactor *= rangeNevt/nExpected ;
2958 scaleFactor *= nExpected ;
2960 scaleFactor /= nExpected ;
2979 for (
const auto arg : branchNodeSet) {
2981 branchNodeSet.
remove(*arg) ;
2992 if (dirSelNodes->
getSize()>0) {
2993 coutI(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") directly selected PDF components: " << *dirSelNodes << endl ;
2999 coutE(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection set " << *compSet <<
" does not match any components of p.d.f." << endl ;
3001 coutE(Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection expression '" << compSpec <<
"' does not select any components of p.d.f." << endl ;
3006 delete dirSelNodes ;
3010 RooCmdArg cnsuffix(
"CurveNameSuffix",0,0,0,0,nameSuffix.c_str(),0,0,0) ;
3011 cmdList.
Add(&cnsuffix);
3053 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << endl ;
3125 pc.
defineInt(
"showc",
"ShowConstants",0,0) ;
3129 pc.
defineInt(
"dummy",
"FormatArgs",0,0) ;
3138 const char* label = pc.
getString(
"label") ;
3145 const char* formatStr = pc.
getString(
"formatStr") ;
3160 std::unique_ptr<RooArgSet> selParams{
static_cast<RooArgSet*
>(pdfParams->selectCommon(*params))} ;
3207 Bool_t showLabel= (label != 0 && strlen(label) > 0);
3212 for (
const auto param : params) {
3214 if(showConstants || !var->isConstant())
ymin-= dy;
3217 std::string labelString = label;
3218 unsigned int numLines = std::count(labelString.begin(), labelString.end(),
'\n') + 1;
3219 if (showLabel)
ymin -= numLines * dy;
3225 box->SetFillColor(0);
3226 box->SetBorderSize(0);
3227 box->SetTextAlign(12);
3228 box->SetTextSize(0.04F);
3229 box->SetFillStyle(0);
3231 for (
const auto param : params) {
3232 auto var =
static_cast<const RooRealVar*
>(param);
3233 if(var->isConstant() && !showConstants)
continue;
3235 TString *formatted= options ? var->format(sigDigits, options) : var->format(*formatCmd) ;
3236 box->AddText(formatted->
Data());
3298 pdfOwner->
_norm = 0 ;
3314 name.append(
"_Proj[") ;
3317 for(
auto const& arg : iset) {
3323 name.append(arg->GetName()) ;
3374 pc.
defineInt(
"numScanBins",
"ScanParameters",0,1000) ;
3375 pc.
defineInt(
"intOrder",
"ScanParameters",1,2) ;
3376 pc.
defineInt(
"doScanNum",
"ScanNumCdf",0,1) ;
3377 pc.
defineInt(
"doScanAll",
"ScanAllCdf",0,0) ;
3378 pc.
defineInt(
"doScanNon",
"ScanNoCdf",0,0) ;
3379 pc.
defineMutex(
"ScanNumCdf",
"ScanAllCdf",
"ScanNoCdf") ;
3382 pc.
process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
3408 Int_t isNum= (tmp->numIntRealVars().getSize()>0) ;
3411 coutI(NumIntegration) <<
"RooAbsPdf::createCdf(" <<
GetName() <<
") integration over observable(s) " << iset <<
" involves numeric integration," << endl
3412 <<
" constructing cdf though numeric integration of sampled pdf in " << numScanBins <<
" bins and applying order "
3413 << intOrder <<
" interpolation on integrated histogram." << endl
3414 <<
" To override this choice of technique use argument ScanNone(), to change scan parameters use ScanParameters(nbins,order) argument" << endl ;
3426 ivar->
setBins(numScanBins,
"numcdf") ;
3444 for (
const auto arg : *comps) {
3445 auto pdf =
dynamic_cast<const RooAbsPdf*
>(arg) ;
3447 std::unique_ptr<RooArgSet> compRet(pdf->
getConstraints(observables,constrainedParams,stripDisconnected));
3502 if (config)
return config ;
3540 delete _genContext ;
3548 _genContext(context), _whatVars(whatVars), _protoData(protoData), _nGen(nGen), _extended(extended),
3549 _randProto(randProto), _resampleProto(resampleProto), _dsetName(dsetName), _init(init)
header file containing the templated implementation of matrix inversion routines for use with ROOT's ...
static void indent(ostringstream &buf, int indent_level)
char * Form(const char *fmt,...)
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...
RooArgSet * getObservables(const RooArgSet &set, Bool_t valueOnly=kTRUE) const
Given a set of possible observables, return the observables that this PDF depends on.
void clearValueAndShapeDirty() const
RooWorkspace * _myws
Prevent 'AlwaysDirty' mode for this node.
Bool_t dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=0, Bool_t valueOnly=kFALSE) const
Test whether we depend on (ie, are served by) any object in the specified collection.
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
virtual TObject * Clone(const char *newname=0) const
Make a clone of an object using the Streamer facility.
bool addOwnedComponents(const RooAbsCollection &comps)
Take ownership of the contents of 'comps'.
virtual void Print(Option_t *options=0) const
Print the object to the defaultPrintStream().
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
Bool_t isValueDirty() const
RooArgSet * getVariables(Bool_t stripDisconnected=kTRUE) const
Return RooArgSet with all variables (tree leaf nodes of expresssion tree)
void setOperMode(OperMode mode, Bool_t recurseADirty=kTRUE)
Set the operation mode of this node.
Bool_t getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
virtual void applyWeightSquared(bool flag)
Disables or enables the usage of squared weights.
void setProxyNormSet(const RooArgSet *nset)
Forward a change in the cached normalization argset to all the registered proxies.
friend class RooProjectedPdf
RefCountList_t _serverList
RooArgSet * getComponents() const
Create a RooArgSet with all components (branch nodes) of the expression tree headed by this object.
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...
void branchNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=0, Bool_t recurseNonDerived=kFALSE) const
Fill supplied list with all branch nodes of the arg tree starting with ourself as top node.
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.
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...
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
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...
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Add an argument and transfer the ownership to the collection.
RooAbsArg * first() const
RooAbsCollection * selectByName(const char *nameList, Bool_t verbose=kFALSE) const
Create a subset of the current collection, consisting only of those elements with names matching the ...
virtual void Print(Option_t *options=0) const
This method must be overridden when a class wants to print itself.
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...
RooAbsCollection * selectByAttrib(const char *name, Bool_t value) const
Create a subset of the current collection, consisting only of those elements with the specified attri...
std::string contentsString() const
Return comma separated list of contained object names as STL string.
virtual Bool_t remove(const RooAbsArg &var, Bool_t silent=kFALSE, Bool_t matchByNameOnly=kFALSE)
Remove the specified argument from our list.
TIterator * createIterator(Bool_t dir=kIterForward) const
TIterator-style iteration over contained elements.
RooAbsArg * find(const char *name) const
Find object with given name in list.
RooAbsData is the common abstract base class for binned and unbinned datasets.
virtual const RooArgSet * get() const
virtual Bool_t isNonPoissonWeighted() const
virtual Double_t sumEntries() const =0
Return effective number of entries in dataset, i.e., sum all weights.
virtual Double_t weight() const =0
virtual Bool_t isWeighted() const
double sumEntriesW2() const
Return sum of squared weights of this data.
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 RooDataSet * generate(Double_t nEvents=0, Bool_t skipInit=kFALSE, Bool_t extendedMode=kFALSE)
Generate the specified number of events with nEvents>0 and and return a dataset containing the genera...
virtual void setExpectedData(Bool_t)
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.
virtual ~CacheElem()
Destructor of normalization cache element.
RooAbsGenContext * _genContext
GenSpec * prepareMultiGen(const RooArgSet &whatVars, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none())
Prepare GenSpec configuration object for efficient generation of multiple datasets from identical spe...
int calcSumW2CorrectedCovariance(RooMinimizer &minimizer, RooAbsReal &nll) const
Apply correction to errors and covariance matrix.
RooObjCacheManager _normMgr
Double_t getNorm(const RooArgSet &nset) const
Get normalisation term needed to normalise the raw values returned by getVal().
virtual void generateEvent(Int_t code)
Interface for generation of an event using the algorithm corresponding to the specified code.
virtual ~RooAbsPdf()
Destructor.
void logBatchComputationErrors(RooSpan< const double > &outputs, std::size_t begin) const
Scan through outputs and fix+log all nans and negative values.
RooSpan< const double > getLogProbabilities(RooBatchCompute::RunContext &evalData, const RooArgSet *normSet=nullptr) const
Compute the log-likelihoods for all events in the requested batch.
RooSpan< const double > getValues(RooBatchCompute::RunContext &evalData, const RooArgSet *normSet) const
Compute batch of values for given input data, and normalise by integrating over the observables in no...
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...
virtual RooFitResult * chi2FitTo(RooDataHist &data, const RooLinkedList &cmdList)
Calls RooAbsPdf::createChi2(RooDataSet& data, const RooLinkedList& cmdList) and returns fit result.
static int verboseEval()
Return global level of verbosity for p.d.f. evaluations.
Bool_t traceEvalPdf(Double_t value) const
Check that passed value is positive and not 'not-a-number'.
virtual RooAbsReal * createNLL(RooAbsData &data, const RooLinkedList &cmdList)
Construct representation of -log(L) of PDFwith given dataset.
virtual RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=0, const RooArgSet *auxProto=0, Bool_t verbose=kFALSE) const
Interface function to create a generator context from a p.d.f.
RooAbsReal * createScanCdf(const RooArgSet &iset, const RooArgSet &nset, Int_t numScanBins, Int_t intOrder)
TString _normRange
MC generator configuration specific for this object.
void setNormRange(const char *rangeName)
virtual RooDataHist * generateBinned(const RooArgSet &whatVars, Double_t nEvents, const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none()) const
As RooAbsPdf::generateBinned(const RooArgSet&, const RooCmdArg&,const RooCmdArg&, const RooCmdArg&,...
virtual RooFitResult * fitTo(RooAbsData &data, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none())
Fit PDF to given dataset.
RooArgSet const * _normSet
Normalization integral (owned by _normMgr)
virtual Int_t getGenerator(const RooArgSet &directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const
Load generatedVars with the subset of directVars that we can generate events for, and return a code t...
RooNumGenConfig * specialGeneratorConfig() const
Returns the specialized integrator configuration for this RooAbsReal.
Bool_t canBeExtended() const
If true, PDF can provide extended likelihood term.
virtual Bool_t selfNormalized() const
Shows if a PDF is self-normalized, which means that no attempt is made to add a normalization term.
virtual void printMultiline(std::ostream &os, Int_t contents, Bool_t verbose=kFALSE, TString indent="") const
Print multi line detailed information of this RooAbsPdf.
Double_t analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=0) const
Analytical integral with normalization (see RooAbsReal::analyticalIntegralWN() for further informatio...
virtual RooPlot * paramOn(RooPlot *frame, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none())
Add a box with parameter values (and errors) to the specified frame.
RooDataSet * generate(const RooArgSet &whatVars, Int_t nEvents, const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none())
See RooAbsPdf::generate(const RooArgSet&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&,...
virtual RooAbsGenContext * autoGenContext(const RooArgSet &vars, const RooDataSet *prototype=0, const RooArgSet *auxProto=0, Bool_t verbose=kFALSE, Bool_t autoBinned=kTRUE, const char *binnedTag="") const
int calcAsymptoticCorrectedCovariance(RooMinimizer &minimizer, RooAbsData const &data)
Use the asymptotically correct approach to estimate errors in the presence of weights.
virtual void printValue(std::ostream &os) const
Print value of p.d.f, also print normalization integral that was last used, if any.
virtual RooArgSet * getAllConstraints(const RooArgSet &observables, RooArgSet &constrainedParams, Bool_t stripDisconnected=kTRUE) const
This helper function finds and collects all constraints terms of all component p.d....
virtual Bool_t syncNormalization(const RooArgSet *dset, Bool_t adjustProxies=kTRUE) const
Verify that the normalization integral cached with this PDF is valid for given set of normalization o...
virtual Double_t getValV(const RooArgSet *set=0) const
Return current value, normalized by integrating over the observables in nset.
virtual RooPlot * plotOn(RooPlot *frame, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none(), const RooCmdArg &arg9=RooCmdArg::none(), const RooCmdArg &arg10=RooCmdArg::none()) const
Helper calling plotOn(RooPlot*, RooLinkedList&) const.
virtual RooArgSet * getConstraints(const RooArgSet &, RooArgSet &, Bool_t) const
void setTraceCounter(Int_t value, Bool_t allNodes=kFALSE)
Reset trace counter to given value, limiting the number of future trace messages for this pdf to 'val...
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.
virtual const RooAbsReal * getNormObj(const RooArgSet *set, const RooArgSet *iset, const TNamed *rangeName=0) const
Return pointer to RooAbsReal object that implements calculation of integral over observables iset in ...
virtual Double_t getLogVal(const RooArgSet *set=0) const
Return the log of the current value with given normalization An error message is printed if the argum...
Int_t * randomizeProtoOrder(Int_t nProto, Int_t nGen, Bool_t resample=kFALSE) const
Return lookup table with randomized order for nProto prototype events.
virtual Double_t expectedEvents(const RooArgSet *nset) const
Return expected number of events to be used in calculation of extended likelihood.
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.
virtual RooAbsReal * createChi2(RooDataHist &data, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none())
Create a from a histogram and this function.
void setNormRangeOverride(const char *rangeName)
virtual 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 Bool_t isDirectGenSafe(const RooAbsArg &arg) const
Check if given observable can be safely generated using the pdfs internal generator mechanism (if tha...
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 RooAbsGenContext * binnedGenContext(const RooArgSet &vars, Bool_t verbose=kFALSE) const
Return a binned generator context.
static RooNumGenConfig * defaultGeneratorConfig()
Returns the default numeric MC generator configuration for all RooAbsReals.
RooNumGenConfig * _specGeneratorConfig
static TString _normRangeOverride
static Int_t _verboseEval
virtual RooAbsPdf * createProjection(const RooArgSet &iset)
Return a p.d.f that represent a projection of this p.d.f integrated over given observables.
double extendedTerm(double sumEntries, double expected, double sumEntriesW2=0.0) const
std::pair< double, double > getRange(const char *name=0) const
Get low and high bound of the variable.
virtual Bool_t hasRange(const char *name) const
Check if variable has a binning with given name.
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
void plotOnCompSelect(RooArgSet *selNodes) const
Helper function for plotting of composite p.d.fs.
RooAbsReal * createIntegral(const RooArgSet &iset, const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none()) const
Create an object that represents the integral of the function over one or more observables listed in ...
RooDerivative * derivative(RooRealVar &obs, Int_t order=1, Double_t eps=0.001)
Return function representing first, second or third order derivative of this function.
virtual Double_t evaluate() const =0
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
TString integralNameSuffix(const RooArgSet &iset, const RooArgSet *nset=0, const char *rangeName=0, Bool_t omitEmpty=kFALSE) const
Construct string with unique suffix name to give to integral object that encodes integrated observabl...
RooAbsReal * createIntRI(const RooArgSet &iset, const RooArgSet &nset=RooArgSet())
Utility function for createRunningIntegral.
virtual RooPlot * plotOn(RooPlot *frame, const RooCmdArg &arg1=RooCmdArg(), const RooCmdArg &arg2=RooCmdArg(), const RooCmdArg &arg3=RooCmdArg(), const RooCmdArg &arg4=RooCmdArg(), const RooCmdArg &arg5=RooCmdArg(), const RooCmdArg &arg6=RooCmdArg(), const RooCmdArg &arg7=RooCmdArg(), const RooCmdArg &arg8=RooCmdArg(), const RooCmdArg &arg9=RooCmdArg(), const RooCmdArg &arg10=RooCmdArg()) const
Plot (project) PDF on specified frame.
RooFitResult * chi2FitDriver(RooAbsReal &fcn, RooLinkedList &cmdList)
Internal driver function for chi2 fits.
virtual RooSpan< const double > getValues(RooBatchCompute::RunContext &evalData, const RooArgSet *normSet=nullptr) const
virtual void printMultiline(std::ostream &os, Int_t contents, Bool_t verbose=kFALSE, TString indent="") const
Structure printing.
Double_t getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
Bool_t plotSanityChecks(RooPlot *frame) const
Utility function for plotOn(), perform general sanity check on frame to ensure safe plotting operatio...
static void setEvalErrorLoggingMode(ErrorLoggingMode m)
Set evaluation error logging mode.
virtual Double_t analyticalIntegral(Int_t code, const char *rangeName=0) const
Implements the actual analytical integral(s) advertised by getAnalyticalIntegral.
const RooNumIntConfig * getIntegratorConfig() const
Return the numeric integration configuration used for this object.
virtual Bool_t isBinnedDistribution(const RooArgSet &) const
Tests if the distribution is binned. Unless overridden by derived classes, this always returns false.
void logEvalError(const char *message, const char *serverValueString=0) const
Log evaluation error message.
RooDataHist * fillDataHist(RooDataHist *hist, const RooArgSet *nset, Double_t scaleFactor, Bool_t correctForBinVolume=kFALSE, Bool_t showProgress=kFALSE) const
Fill a RooDataHist with values sampled from this function at the bin centers.
RooAddition calculates the sum of a set of RooAbsReal terms, or when constructed with two sets,...
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.
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=0, const TNamed *isetRangeName=0)
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=0)
RooCachedReal is an implementation of RooAbsCachedReal that can cache any external RooAbsReal input f...
void setCacheSource(Bool_t flag)
RooChi2Var implements a simple calculation from a binned dataset and a PDF.
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)
void setString(Int_t idx, const char *value)
Class RooCmdConfig is a configurable parser for RooCmdArg named arguments.
TObject * getObject(const char *name, TObject *obj=0)
Return TObject property registered with name 'name'.
Bool_t 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...
void defineMutex(const char *argName1, const char *argName2)
Define arguments named argName1 and argName2 mutually exclusive.
Bool_t defineObject(const char *name, const char *argName, Int_t setNum, const TObject *obj=0, Bool_t isArray=kFALSE)
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_t convEmptyToNull=kFALSE)
Return string property registered with name 'name'.
Int_t getInt(const char *name, Int_t defaultValue=0)
Return integer property registered with name 'name'.
Bool_t defineDouble(const char *name, const char *argName, Int_t doubleNum, Double_t defValue=0.)
Define Double_t property name 'name' mapped to Double_t in slot 'doubleNum' in RooCmdArg with name ar...
Double_t getDouble(const char *name, Double_t defaultValue=0)
Return Double_t property registered with name 'name'.
void allowUndefined(Bool_t flag=kTRUE)
void stripCmdList(RooLinkedList &cmdList, const char *cmdsToPurge)
Utility function that strips command names listed (comma separated) in cmdsToPurge from cmdList.
Bool_t defineSet(const char *name, const char *argName, Int_t setNum, const RooArgSet *set=0)
Define TObject property name 'name' mapped to object in slot 'setNum' in RooCmdArg with name argName ...
Bool_t defineString(const char *name, const char *argName, Int_t stringNum, const char *defValue="", Bool_t appendMode=kFALSE)
Define Double_t property name 'name' mapped to Double_t in slot 'stringNum' in RooCmdArg with name ar...
RooArgSet * getSet(const char *name, RooArgSet *set=0)
Return RooArgSet property registered with name 'name'.
Bool_t ok(Bool_t verbose) const
Return true of parsing was successful.
RooLinkedList filterCmdList(RooLinkedList &cmdInList, const char *cmdNameList, Bool_t removeFromInList=kTRUE)
Utility function to filter commands listed in cmdNameList from cmdInList.
Bool_t process(const RooCmdArg &arg)
Process given RooCmdArg.
Bool_t hasProcessed(const char *cmdName) const
Return true if RooCmdArg with name 'cmdName' has been processed.
static 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, RooWorkspace *workspace)
Create the parameter constraint sum to add to the negative log-likelihood.
The RooDataHist is a container class to hold N-dimensional binned data.
double weight(std::size_t i) const
Return weight of i-th bin.
void set(std::size_t binNumber, double weight, double wgtErr)
Set bin content of bin that was last loaded with get(std::size_t).
Double_t sumEntries() const override
Sum the weights of all bins.
Int_t numEntries() const override
Return the number of bins.
void SetName(const char *name) override
Change the name of the RooDataHist.
const RooArgSet * get() const override
Get bin centre of current bin.
RooDataSet is a container class to hold unbinned data.
void SetName(const char *name) override
Change the name of this dataset into the given name.
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
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 ...
TObject * FindObject(const char *name) const
Return pointer to obejct with given name.
virtual void Add(TObject *arg)
RooMinimizer is a wrapper class around ROOT::Fit:Fitter that provides a seamless interface between th...
Int_t hesse()
Execute HESSE.
RooFitResult * save(const char *name=0, const char *title=0)
Save and return a RooFitResult snapshot of current minimizer status.
void applyCovarianceMatrix(TMatrixDSym &V)
Apply results of given external covariance matrix.
Class RooNLLVar implements a -log(likelihood) calculation from a dataset and a PDF.
void batchMode(bool on=true)
static const char * str(const TNamed *ptr)
Return C++ string corresponding to given TNamed pointer.
Class RooNumCdf is an implementation of RooNumRunningInt specialized to calculate cumulative distribu...
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.
void sterilize()
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_t invisible=kFALSE)
Add a generic object to this plot.
Double_t getFitRangeNEvt() const
Return the number of events in the fit range.
Double_t getFitRangeBinW() const
Return the bin width that is being used to normalise the PDF.
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.
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,...
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.
RooRealVar represents a variable that can be changed from the outside.
void setBins(Int_t nBins, const char *name=0)
Create a uniform binning under name 'name' for this variable.
void setRange(const char *name, Double_t min, Double_t max)
Set a fit or plotting range.
A simple container to hold a batch of data values.
constexpr std::span< T >::pointer data() const
constexpr std::span< T >::index_type size() const noexcept
RooXYChi2Var implements a simple chi^2 calculation from an unbinned dataset with values x,...
Iterator abstract base class.
virtual TObject * Next()=0
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.
virtual const char * GetTitle() const
Returns title of object.
virtual const char * GetName() const
Returns name of object.
Mother of all ROOT objects.
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 ToLower()
Change string to lower-case.
void Clear()
Clear string without changing its capacity.
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) 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, Bool_t reinterpretAsWeight=kFALSE)
RooCmdArg Hesse(Bool_t flag=kTRUE)
RooCmdArg PrintLevel(Int_t code)
RooCmdArg NormRange(const char *rangeNameList)
RooCmdArg Range(const char *rangeName, Bool_t adjustNorm=kTRUE)
RooCmdArg Normalization(Double_t scaleFactor)
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
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, std::string const &addCoefRangeName, RooArgSet const &projDeps, bool isExtended, double integrateOverBinsPrecision, RooFit::BatchModeOption batchMode, bool doOffset, bool takeGlobalObservablesFromData)
BatchModeOption
For setting the batch mode flag with the BatchMode() command argument to RooAbsPdf::fitTo();.
bool checkIfRangesOverlap(RooAbsPdf const &pdf, RooAbsData const &data, std::vector< std::string > const &rangeNames, bool splitRange)
Check if there is any overlap when a list of ranges is applied to a set of observables.
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.
std::string getColonSeparatedNameString(RooArgSet const &argSet)
Create a string with all sorted names of RooArgSet elements separated by colons.
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754
Configuration struct for RooAbsPdf::minimizeNLL with all the default.
const RooArgSet * minosSet
std::string rangeName
Stores the configuration parameters for RooAbsTestStatistic.
std::string addCoefRangeName
bool takeGlobalObservablesFromData
double integrateOverBinsPrecision
RooFit::MPSplit interleave
This struct enables passing computation data around between elements of a computation graph.
std::vector< double > logProbabilities
Possibility to register log probabilities.
static double packFloatIntoNaN(float payload)
Pack float into mantissa of a NaN.
#define Split(a, ahi, alo)
static void output(int code)