220 RooAbsReal(
name,title), _norm(0), _normSet(0), _normMgr(this,10), _selectComp(
kTRUE), _specGeneratorConfig(0)
233 RooAbsReal(
name,title,plotMin,plotMax), _norm(0), _normSet(0), _normMgr(this,10), _selectComp(
kTRUE), _specGeneratorConfig(0)
246 _normMgr(other._normMgr,this), _selectComp(other._selectComp), _normRange(other._normRange)
315 if (normVal < 0. || (normVal == 0. && rawVal != 0)) {
318 std::stringstream msg;
319 msg <<
"p.d.f normalization integral is zero or negative: " << normVal;
324 if (error || (rawVal == 0. && normVal == 0.)) {
327 _value = rawVal / normVal ;
364 maxSize = outputs.size();
384 maxSize = outputs.size();
390 || (normVal == 0. && std::any_of(outputs.begin(), outputs.end(), [](
double val){return val != 0;}))) {
392 "\n\tInt(%s) = %f",
GetName(), normVal));
395 if (normVal != 1. && normVal > 0.) {
396 const double invNorm = 1./normVal;
397 for (
double& val : outputs) {
419 cxcoutD(
Eval) <<
"RooAbsPdf::analyticalIntegralWN(" <<
GetName() <<
") code = " << code <<
" normset = " << (normSet?*normSet:
RooArgSet()) << endl ;
422 if (code==0)
return getVal(normSet) ;
442 logEvalError(
Form(
"p.d.f value is Not-a-Number (%f), forcing value to zero",value)) ;
446 logEvalError(
Form(
"p.d.f value is less than zero (%f), forcing value to zero",value)) ;
451 if(!error)
return error ;
473 if (!nset)
return 1 ;
481 coutW(
Eval) <<
"RooAbsPdf::getNorm(" <<
GetName() <<
":: WARNING normalization is zero, nset = " ; nset->
Print(
"1") ;
501 return cache->
_norm ;
547 if (nsetChanged && adjustProxies) {
557 ((
RooAbsPdf*)
this)->setProxyNormSet(nset) ;
565 <<
") recreating normalization integral " << endl ;
568 cxcoutD(
Tracing) << IsA()->GetName() <<
"::syncNormalization(" <<
GetName() <<
") selfNormalized, creating unit norm" << endl;
586 if (cacheParamsStr && strlen(cacheParamsStr)) {
594 if (cacheParams->
getSize()>0) {
596 <<
"-dim value cache for integral over " << *depList <<
" as a function of " << *cacheParams <<
" in range " << (nr?nr:
"<default>") << endl ;
605 normInt= cachedIntegral ;
704 if (
fabs(prob)>1e6) {
705 coutW(
Eval) <<
"RooAbsPdf::getLogVal(" <<
GetName() <<
") WARNING: large likelihood value: " << prob << endl ;
709 logEvalError(
"getLogVal() top-level p.d.f evaluates to a negative number") ;
711 return std::numeric_limits<double>::quiet_NaN();
715 logEvalError(
"getLogVal() top-level p.d.f evaluates to zero") ;
717 return -std::numeric_limits<double>::infinity();
721 logEvalError(
"getLogVal() top-level p.d.f evaluates to NaN") ;
723 return -std::numeric_limits<double>::infinity();
736bool checkInfNaNNeg(
const T& inputs) {
742 for (
double val : inputs) {
743 inf |= !std::isfinite(val);
748 return inf || nan || neg;
759 for (
unsigned int i=0; i<outputs.
size(); ++i) {
760 const double value = outputs[i];
764 }
else if (!std::isfinite(outputs[i])){
767 }
else if (outputs[i] < 0.) {
768 logEvalError(
Form(
"p.d.f value of (%s) is less than zero (%f) for entry %zu",
784 auto pdfValues =
getValBatch(begin, maxSize, normSet);
786 if (checkInfNaNNeg(pdfValues)) {
792 for (std::size_t i = 0; i < pdfValues.size(); ++i) {
793 const double prob = pdfValues[i];
798 theLog = std::numeric_limits<double>::quiet_NaN();
800 theLog = -std::numeric_limits<double>::infinity();
835 if (
fabs(expected)<1
e-10 &&
fabs(observed)<1
e-10) {
841 logEvalError(
"extendedTerm #expected events is <0 or NaN") ;
872 << observed <<
" events. extendedTerm = " << extra << endl;
963 pc.defineString(
"rangeName",
"RangeWithName",0,
"",
kTRUE) ;
964 pc.defineString(
"addCoefRange",
"SumCoefRange",0,
"") ;
965 pc.defineString(
"globstag",
"GlobalObservablesTag",0,
"") ;
966 pc.defineDouble(
"rangeLo",
"Range",0,-999.) ;
967 pc.defineDouble(
"rangeHi",
"Range",1,-999.) ;
968 pc.defineInt(
"splitRange",
"SplitRange",0,0) ;
969 pc.defineInt(
"ext",
"Extended",0,2) ;
970 pc.defineInt(
"numcpu",
"NumCPU",0,1) ;
971 pc.defineInt(
"interleave",
"NumCPU",1,0) ;
972 pc.defineInt(
"verbose",
"Verbose",0,0) ;
973 pc.defineInt(
"optConst",
"Optimize",0,0) ;
974 pc.defineInt(
"cloneData",
"CloneData", 0, 2);
975 pc.defineSet(
"projDepSet",
"ProjectedObservables",0,0) ;
976 pc.defineSet(
"cPars",
"Constrain",0,0) ;
977 pc.defineSet(
"glObs",
"GlobalObservables",0,0) ;
979 pc.defineInt(
"doOffset",
"OffsetLikelihood",0,0) ;
980 pc.defineSet(
"extCons",
"ExternalConstraints",0,0) ;
981 pc.defineInt(
"BatchMode",
"BatchMode", 0, 0);
982 pc.defineMutex(
"Range",
"RangeWithName") ;
984 pc.defineMutex(
"GlobalObservables",
"GlobalObservablesTag") ;
987 pc.process(cmdList) ;
993 const char* rangeName =
pc.getString(
"rangeName",0,
kTRUE) ;
994 const char* addCoefRangeName =
pc.getString(
"addCoefRange",0,
kTRUE) ;
995 const char* globsTag =
pc.getString(
"globstag",0,
kTRUE) ;
997 Int_t numcpu =
pc.getInt(
"numcpu") ;
1000 Int_t splitr =
pc.getInt(
"splitRange") ;
1002 Int_t optConst =
pc.getInt(
"optConst") ;
1003 Int_t cloneData =
pc.getInt(
"cloneData") ;
1004 Int_t doOffset =
pc.getInt(
"doOffset") ;
1008 cloneData = optConst ;
1014 if (
pc.hasProcessed(
"GlobalObservablesTag")) {
1015 if (glObs)
delete glObs ;
1018 coutI(
Minimization) <<
"User-defined specification of global observables definition with tag named '" << globsTag <<
"'" << endl ;
1020 }
else if (!
pc.hasProcessed(
"GlobalObservables")) {
1025 if (defGlobObsTag) {
1026 coutI(
Minimization) <<
"p.d.f. provides built-in specification of global observables definition with tag named '" << defGlobObsTag <<
"'" << endl ;
1027 if (glObs)
delete glObs ;
1041 doStripDisconnected=
kTRUE ;
1049 coutI(
Minimization) <<
"p.d.f. provides expected number of events, including extended term in likelihood." << endl ;
1053 if (
pc.hasProcessed(
"Range")) {
1059 for (
auto arg : *obs) {
1061 if (rrv) rrv->
setRange(
"fit",rangeLo,rangeHi) ;
1070 projDeps.
add(*tmp) ;
1077 if (!rangeName || strchr(rangeName,
',')==0) {
1081 auto theNLL =
new RooNLLVar(baseName.c_str(),
"-log(likelihood)",
1082 *
this,data,projDeps,ext,rangeName,addCoefRangeName,numcpu,interl,
1084 theNLL->batchMode(
pc.getInt(
"BatchMode"));
1090 for (
const auto& token : tokens) {
1091 auto nllComp =
new RooNLLVar(
Form(
"%s_%s",baseName.c_str(),token.c_str()),
"-log(likelihood)",
1092 *
this,data,projDeps,ext,token.c_str(),addCoefRangeName,numcpu,interl,
1094 nllComp->batchMode(
pc.getInt(
"BatchMode"));
1095 nllList.
add(*nllComp) ;
1110 <<
" entries" << endl;
1111 allConstraints.
add(*constr);
1115 if (cPars && cPars->
getSize() > 0) {
1117 allConstraints.
add(*constraints);
1121 allConstraints.
add(*extCons);
1129 <<
" with " << allConstraints.
getSize() <<
" entries" << endl;
1137 if (allConstraints.
getSize()>0 && cPars) {
1139 coutI(
Minimization) <<
" Including the following constraint terms in minimization: " << allConstraints << endl ;
1141 coutI(
Minimization) <<
"The following global observables have been defined: " << *glObs << endl ;
1143 nllCons =
new RooConstraintSum(
Form(
"%s_constr",baseName.c_str()),
"nllCons",allConstraints,glObs ? *glObs : *cPars) ;
1156 if (doStripDisconnected) {
1314 RooLinkedList nllCmdList =
pc.filterCmdList(fitCmdList,
"ProjectedObservables,Extended,Range,"
1315 "RangeWithName,SumCoefRange,NumCPU,SplitRange,Constrained,Constrain,ExternalConstraints,"
1316 "CloneData,GlobalObservables,GlobalObservablesTag,OffsetLikelihood,BatchMode");
1318 pc.defineDouble(
"prefit",
"Prefit",0,0);
1319 pc.defineString(
"fitOpt",
"FitOptions",0,
"") ;
1320 pc.defineInt(
"optConst",
"Optimize",0,2) ;
1321 pc.defineInt(
"verbose",
"Verbose",0,0) ;
1322 pc.defineInt(
"doSave",
"Save",0,0) ;
1323 pc.defineInt(
"doTimer",
"Timer",0,0) ;
1324 pc.defineInt(
"plevel",
"PrintLevel",0,1) ;
1325 pc.defineInt(
"strat",
"Strategy",0,1) ;
1326 pc.defineInt(
"initHesse",
"InitialHesse",0,0) ;
1327 pc.defineInt(
"hesse",
"Hesse",0,1) ;
1328 pc.defineInt(
"minos",
"Minos",0,0) ;
1329 pc.defineInt(
"ext",
"Extended",0,2) ;
1330 pc.defineInt(
"numcpu",
"NumCPU",0,1) ;
1331 pc.defineInt(
"numee",
"PrintEvalErrors",0,10) ;
1332 pc.defineInt(
"doEEWall",
"EvalErrorWall",0,1) ;
1333 pc.defineInt(
"doWarn",
"Warnings",0,1) ;
1334 pc.defineInt(
"doSumW2",
"SumW2Error",0,-1) ;
1335 pc.defineInt(
"doAsymptoticError",
"AsymptoticError",0,-1) ;
1336 pc.defineInt(
"doOffset",
"OffsetLikelihood",0,0) ;
1337 pc.defineString(
"mintype",
"Minimizer",0,
"Minuit") ;
1338 pc.defineString(
"minalg",
"Minimizer",1,
"minuit") ;
1339 pc.defineObject(
"minosSet",
"Minos",0,0) ;
1340 pc.defineSet(
"cPars",
"Constrain",0,0) ;
1341 pc.defineSet(
"extCons",
"ExternalConstraints",0,0) ;
1342 pc.defineMutex(
"FitOptions",
"Verbose") ;
1343 pc.defineMutex(
"FitOptions",
"Save") ;
1344 pc.defineMutex(
"FitOptions",
"Timer") ;
1345 pc.defineMutex(
"FitOptions",
"Strategy") ;
1346 pc.defineMutex(
"FitOptions",
"InitialHesse") ;
1347 pc.defineMutex(
"FitOptions",
"Hesse") ;
1348 pc.defineMutex(
"FitOptions",
"Minos") ;
1349 pc.defineMutex(
"Range",
"RangeWithName") ;
1350 pc.defineMutex(
"InitialHesse",
"Minimizer") ;
1353 pc.process(fitCmdList) ;
1360 const char* fitOpt =
pc.getString(
"fitOpt",0,
kTRUE) ;
1361 Int_t optConst =
pc.getInt(
"optConst") ;
1363 Int_t doSave =
pc.getInt(
"doSave") ;
1364 Int_t doTimer =
pc.getInt(
"doTimer") ;
1365 Int_t plevel =
pc.getInt(
"plevel") ;
1366 Int_t strat =
pc.getInt(
"strat") ;
1367 Int_t initHesse=
pc.getInt(
"initHesse") ;
1368 Int_t hesse =
pc.getInt(
"hesse") ;
1369 Int_t minos =
pc.getInt(
"minos") ;
1370 Int_t numee =
pc.getInt(
"numee") ;
1371 Int_t doEEWall =
pc.getInt(
"doEEWall") ;
1372 Int_t doWarn =
pc.getInt(
"doWarn") ;
1373 Int_t doSumW2 =
pc.getInt(
"doSumW2") ;
1374 Int_t doAsymptotic =
pc.getInt(
"doAsymptoticError");
1376#ifdef __ROOFIT_NOROOMINIMIZER
1377 const char* minType =0 ;
1379 const char* minType =
pc.getString(
"mintype",
"Minuit") ;
1380 const char* minAlg =
pc.getString(
"minalg",
"minuit") ;
1387 if (weightedData && doSumW2==-1 && doAsymptotic==-1) {
1388 coutW(
InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") WARNING: a likelihood fit is requested of what appears to be weighted data.\n"
1389 <<
" While the estimated values of the parameters will always be calculated taking the weights into account,\n"
1390 <<
" there are multiple ways to estimate the errors of the parameters. You are advised to make an \n"
1391 <<
" explicit choice for the error calculation:\n"
1392 <<
" - Either provide SumW2Error(true), to calculate a sum-of-weights-corrected HESSE error matrix\n"
1393 <<
" (error will be proportional to the number of events in MC).\n"
1394 <<
" - Or provide SumW2Error(false), to return errors from original HESSE error matrix\n"
1395 <<
" (which will be proportional to the sum of the weights, i.e., a dataset with <sum of weights> events).\n"
1396 <<
" - Or provide AsymptoticError(true), to use the asymptotically correct expression\n"
1397 <<
" (for details see https://arxiv.org/abs/1911.01303)."
1403 if (doSumW2==1 && minos) {
1404 coutW(
InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") WARNING: sum-of-weights correction does not apply to MINOS errors" << endl ;
1406 if (doAsymptotic==1 && minos) {
1407 coutW(
InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") WARNING: asymptotic correction does not apply to MINOS errors" << endl ;
1411 size_t nEvents =
static_cast<size_t>(prefit*data.
numEntries());
1412 if (prefit > 0.5 || nEvents < 100) {
1414 <<
"With the current PrefitDataFraction=" << prefit
1415 <<
", the number of events would be " << nEvents<<
" out of "
1416 << data.
numEntries() <<
". Skipping prefit..." << endl;
1434 pc.filterCmdList(tinyCmdList,
"Prefit,Hesse,Minos,Verbose,Save,Timer");
1438 tinyCmdList.
Add(&hesse_option);
1439 tinyCmdList.
Add(&print_option);
1441 fitTo(tiny,tinyCmdList);
1449 if (doSumW2==1 && doAsymptotic==1) {
1450 coutE(
InputArguments) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") ERROR: Cannot compute both asymptotically correct and SumW2 errors." << endl ;
1456 if (
string(minType)!=
"OldMinuit") {
1458#ifndef __ROOFIT_NOROOMINIMIZER
1461 m.setMinimizerType(minType) ;
1463 m.setEvalErrorWall(doEEWall) ;
1468 m.setPrintEvalErrors(numee) ;
1470 m.setPrintLevel(plevel) ;
1475 m.optimizeConst(optConst) ;
1481 ret =
m.fit(fitOpt) ;
1496 m.setStrategy(strat) ;
1505 m.minimize(minType,minAlg) ;
1513 if (doAsymptotic==1 &&
m.getNPar()>0) {
1515 std::unique_ptr<RooFitResult> rw(
m.save());
1518 coutI(
Fitting) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") Calculating covariance matrix according to the asymptotically correct approach. If you find this method useful please consider citing https://arxiv.org/abs/1911.01303." << endl;
1522 for (
int k=0; k<rw->floatParsFinal().getSize(); k++)
1523 for (
int l=0;
l<rw->floatParsFinal().getSize();
l++)
1527 std::vector<std::unique_ptr<RooDerivative> > derivatives;
1528 const RooArgList& floated = rw->floatParsFinal();
1529 std::unique_ptr<RooArgSet> floatingparams( (
RooArgSet*)
getParameters(data)->selectByAttrib(
"Constant",
false) );
1530 for (
const auto paramresult : floated) {
1531 auto paraminternal =
static_cast<RooRealVar*
>(floatingparams->find(*paramresult));
1533 std::unique_ptr<RooDerivative> deriv(
derivative(*paraminternal, *obs, 1) );
1534 derivatives.push_back(std::move(deriv));
1540 *obs = *data.
get(j);
1542 std::vector<Double_t> diffs(floated.
getSize(), 0.0);
1543 for (
int k=0; k < floated.
getSize(); k++) {
1544 const auto paramresult =
static_cast<RooRealVar*
>(floated.
at(k));
1545 auto paraminternal =
static_cast<RooRealVar*
>(floatingparams->find(*paramresult));
1549 *paraminternal = paramresult->getVal();
1554 for (
int k=0; k<floated.
getSize(); k++) {
1556 num(k,
l) += data.
weight()*data.
weight()*diffs.at(k)*diffs.at(
l)/(prob*prob);
1563 m.applyCovarianceMatrix(num);
1566 if (doSumW2==1 &&
m.getNPar()>0) {
1569 vector<RooNLLVar*> nllComponents;
1575 if (!nllComp)
continue;
1576 nllComponents.push_back(nllComp);
1583 for (vector<RooNLLVar*>::iterator it = nllComponents.begin(); nllComponents.end() != it; ++it) {
1584 (*it)->applyWeightSquared(
kTRUE);
1586 coutI(
Fitting) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") Calculating sum-of-weights-squared correction matrix for covariance matrix" << endl ;
1589 for (vector<RooNLLVar*>::iterator it = nllComponents.begin(); nllComponents.end() != it; ++it) {
1590 (*it)->applyWeightSquared(
kFALSE);
1597 CholeskyDecompGenDim<Double_t> decomp(matC.
GetNrows(), matC);
1600 <<
") ERROR: Cannot apply sum-of-weights correction to covariance matrix: correction matrix calculated with weight-squared is singular" <<endl ;
1603 decomp.Invert(matC);
1606 for (
int i = 0; i < matC.
GetNrows(); ++i)
1607 for (
int j = 0; j < i; ++j) matC(j, i) = matC(i, j);
1611 m.applyCovarianceMatrix(matC);
1621 m.minos(*minosSet) ;
1630 string title =
Form(
"Result of fit of p.d.f. %s to dataset %s",
GetName(),data.
GetName()) ;
1631 ret =
m.save(
name.c_str(),title.c_str()) ;
1636 m.optimizeConst(0) ;
1645 m.setEvalErrorWall(doEEWall) ;
1650 m.setPrintEvalErrors(numee) ;
1652 m.setPrintLevel(plevel) ;
1657 m.optimizeConst(optConst) ;
1663 ret =
m.fit(fitOpt) ;
1678 m.setStrategy(strat) ;
1695 if (doAsymptotic==1 &&
m.getNPar()>0) {
1697 std::unique_ptr<RooFitResult> rw(
m.save());
1700 coutI(
Fitting) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") Calculating covariance matrix according to the asymptotically correct approach. If you find this method useful please consider citing https://arxiv.org/abs/1911.01303." << endl;
1704 for (
int k=0; k<rw->floatParsFinal().getSize(); k++)
1705 for (
int l=0;
l<rw->floatParsFinal().getSize();
l++)
1709 std::vector<std::unique_ptr<RooDerivative> > derivatives;
1710 const RooArgList& floated = rw->floatParsFinal();
1711 std::unique_ptr<RooArgSet> floatingparams( (
RooArgSet*)
getParameters(data)->selectByAttrib(
"Constant",
false) );
1712 for (
int k=0; k<floated.
getSize(); k++) {
1715 std::unique_ptr<RooDerivative> deriv(
derivative(*paraminternal, *obs, 1) );
1716 derivatives.push_back(std::move(deriv));
1722 *obs = *data.
get(j);
1724 std::vector<Double_t> diffs(floated.
getSize(), 0.0);
1725 for (
int k=0; k<floated.
getSize(); k++) {
1731 *paraminternal = paramresult->
getVal();
1736 for (
int k=0; k<floated.
getSize(); k++) {
1738 num(k,
l) += data.
weight()*data.
weight()*diffs.at(k)*diffs.at(
l)/(prob*prob);
1745 m.applyCovarianceMatrix(num);
1748 if (doSumW2==1 &&
m.getNPar()>0) {
1751 list<RooNLLVar*> nllComponents ;
1758 nllComponents.push_back(nllComp) ;
1766 for (list<RooNLLVar*>::iterator iter1=nllComponents.begin() ; iter1!=nllComponents.end() ; ++iter1) {
1767 (*iter1)->applyWeightSquared(
kTRUE) ;
1769 coutI(
Fitting) <<
"RooAbsPdf::fitTo(" <<
GetName() <<
") Calculating sum-of-weights-squared correction matrix for covariance matrix" << endl ;
1772 for (list<RooNLLVar*>::iterator iter2=nllComponents.begin() ; iter2!=nllComponents.end() ; ++iter2) {
1773 (*iter2)->applyWeightSquared(
kFALSE) ;
1780 CholeskyDecompGenDim<Double_t> decomp(matC.
GetNrows(), matC);
1783 <<
") ERROR: Cannot apply sum-of-weights correction to covariance matrix: correction matrix calculated with weight-squared is singular" <<endl ;
1786 decomp.Invert(matC);
1789 for (
int i = 0; i < matC.
GetNrows(); ++i)
1790 for (
int j = 0; j < i; ++j) matC(j, i) = matC(i, j);
1794 m.applyCovarianceMatrix(matC);
1804 m.minos(*minosSet) ;
1813 string title =
Form(
"Result of fit of p.d.f. %s to dataset %s",
GetName(),data.
GetName()) ;
1814 ret =
m.save(
name.c_str(),title.c_str()) ;
1820 m.optimizeConst(0) ;
1844 RooLinkedList chi2CmdList =
pc.filterCmdList(fitCmdList,
"Range,RangeWithName,NumCPU,Optimize,ProjectedObservables,AddCoefRange,SplitRange,DataError,Extended") ;
1893 pc.defineString(
"rangeName",
"RangeWithName",0,
"",
kTRUE) ;
1895 pc.process(cmdList) ;
1899 const char* rangeName =
pc.getString(
"rangeName",0,
kTRUE) ;
1906 if (!rangeName || strchr(rangeName,
',')==0) {
1909 chi2 =
new RooChi2Var(baseName.c_str(),baseName.c_str(),*
this,data,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
1915 string rcmd =
"RangeWithName" ;
1916 if (arg1.
GetName()==rcmd) rarg = &arg1 ;
1917 if (arg2.
GetName()==rcmd) rarg = &arg2 ;
1918 if (arg3.
GetName()==rcmd) rarg = &arg3 ;
1919 if (arg4.
GetName()==rcmd) rarg = &arg4 ;
1920 if (arg5.
GetName()==rcmd) rarg = &arg5 ;
1921 if (arg6.
GetName()==rcmd) rarg = &arg6 ;
1922 if (arg7.
GetName()==rcmd) rarg = &arg7 ;
1923 if (arg8.
GetName()==rcmd) rarg = &arg8 ;
1927 const size_t bufSize = strlen(rangeName)+1;
1928 char* buf =
new char[bufSize] ;
1929 strlcpy(buf,rangeName,bufSize) ;
1930 char* token = strtok(buf,
",") ;
1935 &arg1==rarg?subRangeCmd:arg1,&arg2==rarg?subRangeCmd:arg2,
1936 &arg3==rarg?subRangeCmd:arg3,&arg4==rarg?subRangeCmd:arg4,
1937 &arg5==rarg?subRangeCmd:arg5,&arg6==rarg?subRangeCmd:arg6,
1938 &arg7==rarg?subRangeCmd:arg7,&arg8==rarg?subRangeCmd:arg8) ;
1939 chi2List.
add(*chi2Comp) ;
1940 token = strtok(0,
",") ;
1962 pc.defineInt(
"integrate",
"Integrate",0,0) ;
1963 pc.defineObject(
"yvar",
"YVar",0,0) ;
1966 pc.process(cmdList) ;
1972 Bool_t integrate =
pc.getInt(
"integrate") ;
2009 os <<
indent <<
"--- RooAbsPdf ---" << endl;
2012 os <<
indent <<
" Normalization integral: " << endl ;
2045 if (prototype || (auxProto && auxProto->
getSize()>0)) {
2111 pc.defineObject(
"proto",
"PrototypeData",0,0) ;
2112 pc.defineString(
"dsetName",
"Name",0,
"") ;
2113 pc.defineInt(
"randProto",
"PrototypeData",0,0) ;
2114 pc.defineInt(
"resampleProto",
"PrototypeData",1,0) ;
2115 pc.defineInt(
"verbose",
"Verbose",0,0) ;
2116 pc.defineInt(
"extended",
"Extended",0,0) ;
2117 pc.defineInt(
"nEvents",
"NumEvents",0,0) ;
2118 pc.defineInt(
"autoBinned",
"AutoBinned",0,1) ;
2119 pc.defineInt(
"expectedData",
"ExpectedData",0,0) ;
2120 pc.defineDouble(
"nEventsD",
"NumEventsD",0,-1.) ;
2121 pc.defineString(
"binnedTag",
"GenBinned",0,
"") ;
2122 pc.defineMutex(
"GenBinned",
"ProtoData") ;
2123 pc.defineMutex(
"Extended",
"NumEvents");
2126 pc.process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2133 const char* dsetName =
pc.getString(
"dsetName") ;
2135 Bool_t randProto =
pc.getInt(
"randProto") ;
2136 Bool_t resampleProto =
pc.getInt(
"resampleProto") ;
2137 Bool_t extended =
pc.getInt(
"extended") ;
2138 Bool_t autoBinned =
pc.getInt(
"autoBinned") ;
2139 const char* binnedTag =
pc.getString(
"binnedTag") ;
2140 Int_t nEventsI =
pc.getInt(
"nEvents") ;
2143 Bool_t expectedData =
pc.getInt(
"expectedData") ;
2154 }
else if (nEvents==0) {
2155 cxcoutI(
Generation) <<
"No number of events specified , number of events generated is "
2159 if (extended && protoData && !randProto) {
2160 cxcoutI(
Generation) <<
"WARNING Using generator option Extended() (Poisson distribution of #events) together "
2161 <<
"with a prototype dataset implies incomplete sampling or oversampling of proto data. "
2162 <<
"Set randomize flag in ProtoData() option to randomize prototype dataset order and thus "
2163 <<
"to randomize the set of over/undersampled prototype events for each generation cycle." << endl ;
2172 data =
generate(whatVars,nEvents,
verbose,autoBinned,binnedTag,expectedData, extended) ;
2176 if (dsetName && strlen(dsetName)>0) {
2203 pc.defineObject(
"proto",
"PrototypeData",0,0) ;
2204 pc.defineString(
"dsetName",
"Name",0,
"") ;
2205 pc.defineInt(
"randProto",
"PrototypeData",0,0) ;
2206 pc.defineInt(
"resampleProto",
"PrototypeData",1,0) ;
2207 pc.defineInt(
"verbose",
"Verbose",0,0) ;
2208 pc.defineInt(
"extended",
"Extended",0,0) ;
2209 pc.defineInt(
"nEvents",
"NumEvents",0,0) ;
2210 pc.defineInt(
"autoBinned",
"AutoBinned",0,1) ;
2211 pc.defineString(
"binnedTag",
"GenBinned",0,
"") ;
2212 pc.defineMutex(
"GenBinned",
"ProtoData") ;
2216 pc.process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2223 const char* dsetName =
pc.getString(
"dsetName") ;
2224 Int_t nEvents =
pc.getInt(
"nEvents") ;
2226 Bool_t randProto =
pc.getInt(
"randProto") ;
2227 Bool_t resampleProto =
pc.getInt(
"resampleProto") ;
2228 Bool_t extended =
pc.getInt(
"extended") ;
2229 Bool_t autoBinned =
pc.getInt(
"autoBinned") ;
2230 const char* binnedTag =
pc.getString(
"binnedTag") ;
2234 return new GenSpec(cx,whatVars,protoData,nEvents,extended,randProto,resampleProto,dsetName) ;
2284 return new RooDataSet(
"emptyData",
"emptyData",whatVars) ;
2294 if(0 != context && context->
isValid()) {
2300 if(0 != context)
delete context;
2314 if (nEvents==0 && (prototype==0 || prototype->
numEntries()==0)) {
2315 return new RooDataSet(
"emptyData",
"emptyData",whatVars) ;
2321 if (resampleProto) {
2322 randProtoOrder=
kTRUE ;
2325 if (randProtoOrder && prototype && prototype->
numEntries()!=nEvents) {
2326 coutI(
Generation) <<
"RooAbsPdf::generate (Re)randomizing event order in prototype dataset (Nevt=" << nEvents <<
")" << endl ;
2333 generated= context.
generate(nEvents,skipInit,extended);
2336 coutE(
Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") do not have a valid generator context" << endl;
2375 coutE(
Generation) <<
"RooAbsPdf::generate(" <<
GetName() <<
") ERROR creating generator context" << endl ;
2392 for (i=0 ; i<nProto ; i++) {
2400 if (!resampleProto) {
2402 for (i=0 ; i<nProto ; i++) {
2411 for (i=0 ; i<nProto ; i++) {
2473 if(server == &arg)
continue;
2474 if(server->dependsOn(arg)) {
2513 pc.defineString(
"dsetName",
"Name",0,
"") ;
2514 pc.defineInt(
"verbose",
"Verbose",0,0) ;
2515 pc.defineInt(
"extended",
"Extended",0,0) ;
2516 pc.defineInt(
"nEvents",
"NumEvents",0,0) ;
2517 pc.defineDouble(
"nEventsD",
"NumEventsD",0,-1.) ;
2518 pc.defineInt(
"expectedData",
"ExpectedData",0,0) ;
2521 pc.process(arg1,arg2,arg3,arg4,arg5,arg6) ;
2527 Double_t nEvents =
pc.getDouble(
"nEventsD") ;
2529 nEvents =
pc.getInt(
"nEvents") ;
2532 Bool_t extended =
pc.getInt(
"extended") ;
2533 Bool_t expectedData =
pc.getInt(
"expectedData") ;
2534 const char* dsetName =
pc.getString(
"dsetName") ;
2539 cxcoutI(
Generation) <<
" Extended mode active, number of events generated (" << nEvents <<
") is Poisson fluctuation on "
2540 <<
GetName() <<
"::expectedEvents() = " << nEvents << endl ;
2545 }
else if (nEvents==0) {
2546 cxcoutI(
Generation) <<
"No number of events specified , number of events generated is "
2554 if (dsetName && strlen(dsetName)>0) {
2585 coutE(
InputArguments) <<
"RooAbsPdf::generateBinned(" <<
GetName() <<
") ERROR: No event count provided and p.d.f does not provide expected number of events" << endl ;
2591 if (expectedData || extended) {
2604 Int_t histOutSum(0) ;
2613 }
else if (extended) {
2623 if (hist->
weight()>histMax) {
2624 histMax = hist->
weight() ;
2627 histOutSum += histOut[i] ;
2632 if (!expectedData && !extended) {
2637 Int_t nEvtExtra = abs(
Int_t(nEvents)-histOutSum) ;
2638 Int_t wgt = (histOutSum>nEvents) ? -1 : 1 ;
2641 while(nEvtExtra>0) {
2644 hist->
get(ibinRand) ;
2647 if (ranY<hist->weight()) {
2649 histOut[ibinRand]++ ;
2652 if (histOut[ibinRand]>0) {
2653 histOut[ibinRand]-- ;
2665 hist->
set(histOut[i],
sqrt(1.0*histOut[i])) ;
2668 }
else if (expectedData) {
2691 return generate(whatVars,nEvents) ;
2695void removeRangeOverlap(std::vector<std::pair<double, double>>& ranges) {
2697 std::sort(ranges.begin(), ranges.end());
2699 for (
auto it = ranges.begin(); it != ranges.end(); ++it) {
2700 double& startL = it->first;
2701 double& endL = it->second;
2703 for (
auto innerIt = it+1; innerIt != ranges.end(); ++innerIt) {
2704 const double startR = innerIt->first;
2705 const double endR = innerIt->second;
2707 if (startL <= startR && startR <= endL) {
2709 endL = std::max(endL, endR);
2710 *innerIt = make_pair(0., 0.);
2715 auto newEnd = std::remove_if(ranges.begin(), ranges.end(),
2716 [](
const std::pair<double,double>& input){
2717 return input.first == input.second;
2719 ranges.erase(newEnd, ranges.end());
2809 cmdList.
Add(plotRange) ;
2814 cmdList.
Add(normRange2) ;
2817 if (plotRange || normRange2) {
2818 coutI(
Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f was fitted in range and no explicit "
2819 << (plotRange?
"plot":
"") << ((plotRange&&normRange2)?
",":
"")
2820 << (normRange2?
"norm":
"") <<
" range was specified, using fit range as default" << endl ;
2828 pc.defineDouble(
"scaleFactor",
"Normalization",0,1.0) ;
2829 pc.defineInt(
"scaleType",
"Normalization",0,
Relative) ;
2830 pc.defineObject(
"compSet",
"SelectCompSet",0) ;
2831 pc.defineString(
"compSpec",
"SelectCompSpec",0) ;
2832 pc.defineObject(
"asymCat",
"Asymmetry",0) ;
2833 pc.defineDouble(
"rangeLo",
"Range",0,-999.) ;
2834 pc.defineDouble(
"rangeHi",
"Range",1,-999.) ;
2835 pc.defineString(
"rangeName",
"RangeWithName",0,
"") ;
2836 pc.defineString(
"normRangeName",
"NormRange",0,
"") ;
2837 pc.defineInt(
"rangeAdjustNorm",
"Range",0,0) ;
2838 pc.defineInt(
"rangeWNAdjustNorm",
"RangeWithName",0,0) ;
2839 pc.defineMutex(
"SelectCompSet",
"SelectCompSpec") ;
2840 pc.defineMutex(
"Range",
"RangeWithName") ;
2841 pc.allowUndefined() ;
2844 pc.process(cmdList) ;
2851 Double_t scaleFactor =
pc.getDouble(
"scaleFactor") ;
2853 const char* compSpec =
pc.getString(
"compSpec") ;
2855 Bool_t haveCompSel = ( (compSpec && strlen(compSpec)>0) || compSet) ;
2859 if (compSpec && strlen(compSpec)>0) {
2860 nameSuffix.
Append(
"_Comp[") ;
2861 nameSuffix.
Append(compSpec) ;
2863 }
else if (compSet) {
2864 nameSuffix.
Append(
"_Comp[") ;
2870 pc.stripCmdList(cmdList,
"SelectCompSet,SelectCompSpec") ;
2874 RooCmdArg cnsuffix(
"CurveNameSuffix",0,0,0,0,nameSuffix.
Data(),0,0,0) ;
2875 cmdList.
Add(&cnsuffix);
2884 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << endl ;
2896 std::vector<pair<Double_t,Double_t> > rangeLim;
2899 if (
pc.hasProcessed(
"Range")) {
2903 rangeLim.push_back(make_pair(rangeLo,rangeHi)) ;
2904 adjustNorm =
pc.getInt(
"rangeAdjustNorm") ;
2905 hasCustomRange =
kTRUE ;
2908 << rangeLo <<
"," << rangeHi <<
"]" ;
2909 if (!
pc.hasProcessed(
"NormRange")) {
2910 ccoutI(
Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << endl ;
2915 nameSuffix.
Append(
Form(
"_Range[%f_%f]",rangeLo,rangeHi)) ;
2917 }
else if (
pc.hasProcessed(
"RangeWithName")) {
2920 coutE(
Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2924 const double rangeLo = frame->
getPlotVar()->
getMin(rangeNameToken.c_str());
2925 const double rangeHi = frame->
getPlotVar()->
getMax(rangeNameToken.c_str());
2926 rangeLim.push_back(make_pair(rangeLo,rangeHi));
2928 adjustNorm =
pc.getInt(
"rangeWNAdjustNorm") ;
2929 hasCustomRange =
kTRUE ;
2932 if (!
pc.hasProcessed(
"NormRange")) {
2933 ccoutI(
Plotting) <<
", curve is normalized to data in " << (adjustNorm?
"given":
"full") <<
" range" << endl ;
2938 nameSuffix.
Append(
Form(
"_Range[%s]",
pc.getString(
"rangeName"))) ;
2941 if (
pc.hasProcessed(
"NormRange")) {
2945 coutE(
Plotting) <<
"Range '" << rangeNameToken <<
"' not defined for variable '"
2949 const double rangeLo = frame->
getPlotVar()->
getMin(rangeNameToken.c_str());
2950 const double rangeHi = frame->
getPlotVar()->
getMax(rangeNameToken.c_str());
2951 rangeLim.push_back(make_pair(rangeLo,rangeHi));
2953 adjustNorm =
kTRUE ;
2954 hasCustomRange =
kTRUE ;
2955 coutI(
Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") p.d.f. curve is normalized using explicit choice of ranges '" <<
pc.getString(
"normRangeName",0,
kTRUE) <<
"'" << endl ;
2957 nameSuffix.
Append(
Form(
"_NormRange[%s]",
pc.getString(
"rangeName"))) ;
2961 if (hasCustomRange && adjustNorm) {
2962 const std::size_t oldSize = rangeLim.size();
2963 removeRangeOverlap(rangeLim);
2965 if (oldSize != rangeLim.size()) {
2968 coutE(
Plotting) <<
"Requested ranges overlap. For correct plotting, new ranges "
2969 "will be defined." << std::endl;
2972 std::string rangesNoOverlap;
2973 for (
auto it = rangeLim.begin(); it != rangeLim.end(); ++it) {
2974 std::stringstream rangeName;
2975 rangeName <<
"Remove_overlap_range_" << it - rangeLim.begin();
2976 plotVar->setRange(rangeName.str().c_str(), it->first, it->second);
2977 if (!rangesNoOverlap.empty())
2978 rangesNoOverlap +=
",";
2979 rangesNoOverlap += rangeName.str();
2984 rangeArg->
setString(0, rangesNoOverlap.c_str());
2987 cmdList.
Add(plotRange);
2992 for (
const auto& riter : rangeLim) {
2997 scaleFactor *= rangeNevt/nExpected ;
3003 scaleFactor *= nExpected ;
3005 scaleFactor /= nExpected ;
3024 for (
const auto arg : branchNodeSet) {
3026 branchNodeSet.
remove(*arg) ;
3037 if (dirSelNodes->
getSize()>0) {
3038 coutI(
Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") directly selected PDF components: " << *dirSelNodes << endl ;
3044 coutE(
Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection set " << *compSet <<
" does not match any components of p.d.f." << endl ;
3046 coutE(
Plotting) <<
"RooAbsPdf::plotOn(" <<
GetName() <<
") ERROR: component selection expression '" << compSpec <<
"' does not select any components of p.d.f." << endl ;
3051 delete dirSelNodes ;
3055 RooCmdArg cnsuffix(
"CurveNameSuffix",0,0,0,0,nameSuffix.
Data(),0,0,0) ;
3056 cmdList.
Add(&cnsuffix);
3098 <<
"): ERROR the 'Expected' scale option can only be used on extendable PDFs" << endl ;
3165 pc.defineString(
"label",
"Label",0,
"") ;
3166 pc.defineDouble(
"xmin",
"Layout",0,0.50) ;
3167 pc.defineDouble(
"xmax",
"Layout",1,0.99) ;
3168 pc.defineInt(
"ymaxi",
"Layout",0,
Int_t(0.95*10000)) ;
3169 pc.defineInt(
"showc",
"ShowConstants",0,0) ;
3170 pc.defineObject(
"params",
"Parameters",0,0) ;
3171 pc.defineString(
"formatStr",
"Format",0,
"NELU") ;
3172 pc.defineInt(
"sigDigit",
"Format",0,2) ;
3173 pc.defineInt(
"dummy",
"FormatArgs",0,0) ;
3174 pc.defineMutex(
"Format",
"FormatArgs") ;
3177 pc.process(cmdList) ;
3182 const char* label =
pc.getString(
"label") ;
3186 Int_t showc =
pc.getInt(
"showc") ;
3189 const char* formatStr =
pc.getString(
"formatStr") ;
3190 Int_t sigDigit =
pc.getInt(
"sigDigit") ;
3196 if (
pc.hasProcessed(
"FormatArgs")) {
3206 if (
pc.hasProcessed(
"FormatArgs")) {
3254 Bool_t showLabel= (label != 0 && strlen(label) > 0);
3265 if(showLabel)
ymin-= dy;
3271 box->SetFillColor(0);
3272 box->SetBorderSize(1);
3273 box->SetTextAlign(12);
3274 box->SetTextSize(0.04F);
3275 box->SetFillStyle(1001);
3276 box->SetFillColor(0);
3280 if(var->
isConstant() && !showConstants)
continue;
3283 box->AddText(formatted->
Data());
3287 if(showLabel)
box->AddText(label);
3350 pdfOwner->
_norm = 0 ;
3366 name.Append(
"_Proj[") ;
3428 pc.defineObject(
"supNormSet",
"SupNormSet",0,0) ;
3429 pc.defineInt(
"numScanBins",
"ScanParameters",0,1000) ;
3430 pc.defineInt(
"intOrder",
"ScanParameters",1,2) ;
3431 pc.defineInt(
"doScanNum",
"ScanNumCdf",0,1) ;
3432 pc.defineInt(
"doScanAll",
"ScanAllCdf",0,0) ;
3433 pc.defineInt(
"doScanNon",
"ScanNoCdf",0,0) ;
3434 pc.defineMutex(
"ScanNumCdf",
"ScanAllCdf",
"ScanNoCdf") ;
3437 pc.process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
3448 Int_t numScanBins =
pc.getInt(
"numScanBins") ;
3449 Int_t intOrder =
pc.getInt(
"intOrder") ;
3450 Int_t doScanNum =
pc.getInt(
"doScanNum") ;
3451 Int_t doScanAll =
pc.getInt(
"doScanAll") ;
3452 Int_t doScanNon =
pc.getInt(
"doScanNon") ;
3467 coutI(
NumIntegration) <<
"RooAbsPdf::createCdf(" <<
GetName() <<
") integration over observable(s) " << iset <<
" involves numeric integration," << endl
3468 <<
" constructing cdf though numeric integration of sampled pdf in " << numScanBins <<
" bins and applying order "
3469 << intOrder <<
" interpolation on integrated histogram." << endl
3470 <<
" To override this choice of technique use argument ScanNone(), to change scan parameters use ScanParameters(nbins,order) argument" << endl ;
3482 ivar->
setBins(numScanBins,
"numcdf") ;
3500 for (
const auto arg : *comps) {
3501 auto pdf =
dynamic_cast<const RooAbsPdf*
>(arg) ;
3502 if (pdf && !ret->
find(pdf->GetName())) {
3503 std::unique_ptr<RooArgSet> compRet(pdf->getConstraints(observables,constrainedParams,stripDisconnected));
3558 if (config)
return config ;
3596 delete _genContext ;
3604 _genContext(context), _whatVars(whatVars), _protoData(protoData), _nGen(nGen), _extended(extended),
3605 _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,...)
Status_t status(std::size_t begin, std::size_t size) const
Return the status of the batch starting at begin.
RooSpan< const double > getBatch(std::size_t begin, std::size_t batchSize) const
bool setStatus(std::size_t begin, std::size_t size, Status_t stat)
Set the status of a batch with the given start point and size.
void markDirty()
Mark all batches dirty. This will trigger recomputations.
RooSpan< double > makeWritableBatchUnInit(std::size_t begin, std::size_t batchSize)
Make a batch and return a span pointing to the pdf-local memory.
class to compute the Cholesky decomposition of a matrix
RooAbsArg is the common abstract base class for objects that represent a value (of arbitrary type) an...
RooArgSet * getObservables(const RooArgSet &set, Bool_t valueOnly=kTRUE) const
Return the observables of this pdf given a set of observables.
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.
virtual TObject * Clone(const char *newname=0) const
Make a clone of an object using the Streamer facility.
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'.
RooArgSet * getParameters(const RooAbsData *data, Bool_t stripDisconnected=kTRUE) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
Bool_t isValueDirty() const
RooArgSet * getVariables(Bool_t stripDisconnected=kTRUE) const
Return RooArgSet with all variables (tree leaf nodes of expresssion tree)
virtual void constOptimizeTestStatistic(ConstOpCode opcode, Bool_t doAlsoTrackingOpt=kTRUE)
Interface function signaling a request to perform constant term optimization.
void setOperMode(OperMode mode, Bool_t recurseADirty=kTRUE)
Change cache operation mode to given mode.
OperMode _operMode
Mark batches as dirty (only meaningful for RooAbsReal).
Bool_t addOwnedComponents(const RooArgSet &comps)
Take ownership of the contents of 'comps'.
Bool_t getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
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
Bool_t isConstant() const
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
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 * selectCommon(const RooAbsCollection &refColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
RooAbsArg * first() const
void reserve(Storage_t::size_type count)
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.
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.
TIterator * createIterator(Bool_t dir=kIterForward) const R__SUGGEST_ALTERNATIVE("begin()
TIterator-style iteration over contained elements.
virtual Bool_t remove(const RooAbsArg &var, Bool_t silent=kFALSE, Bool_t matchByNameOnly=kFALSE)
Remove the specified argument from our list.
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 weight() const =0
virtual Bool_t isWeighted() const
virtual Int_t numEntries() const
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.
void operModeHook(RooAbsArg::OperMode)
Dummy implementation.
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...
RooSpan< const double > getLogValBatch(std::size_t begin, std::size_t batchSize, const RooArgSet *normSet=nullptr) const
Compute the log-likelihoods for all events in the requested batch.
RooObjCacheManager _normMgr
Double_t getNorm(const RooArgSet &nset) const
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.
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 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.
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 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.
virtual RooSpan< const double > getValBatch(std::size_t begin, std::size_t batchSize, const RooArgSet *normSet=nullptr) const
Compute batch of values for given range, and normalise by integrating over the observables in nset.
Bool_t canBeExtended() const
virtual Bool_t selfNormalized() const
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...
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
virtual Double_t extendedTerm(Double_t observedEvents, const RooArgSet *nset=0) const
Return the extended likelihood term ( ) of this PDF for the given number of observed events.
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 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.
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 * 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.
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 access order for prototype events, given nProto prototype data ev...
virtual Double_t expectedEvents(const RooArgSet *nset) const
Return expected number of events from this p.d.f for use in extended likelihood calculations.
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.
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
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
RooArgSet * _normSet
Normalization integral (owned by _normMgr)
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.
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 Double_t getMax(const char *name=0) const
Get maximum of currently defined range.
virtual Bool_t hasRange(const char *name) const
Check if variable has a binning with given name.
virtual Double_t getMin(const char *name=0) const
Get miniminum of currently defined range.
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.
TString getTitle(Bool_t appendUnit=kFALSE) const
Return this variable's title string.
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 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.
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...
virtual RooSpan< double > evaluateBatch(std::size_t begin, std::size_t maxSize) const
Evaluate function for a batch of input data points.
RooAbsReal * createIntRI(const RooArgSet &iset, const RooArgSet &nset=RooArgSet())
Utility function for createRunningIntegral.
RooFitResult * chi2FitDriver(RooAbsReal &fcn, RooLinkedList &cmdList)
Internal driver function for chi2 fits.
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.
virtual void enableOffsetting(Bool_t)
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 ...
BatchHelpers::BatchData _batchData
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
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.
virtual Bool_t add(const RooAbsCollection &col, Bool_t silent=kFALSE)
Add a collection of arguments to this collection by calling add() for each element in the source coll...
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)
Class RooChi2Var implements a simple chi^2 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.
RooConstraintSum calculates the sum of the -(log) likelihoods of a set of RooAbsPfs that represent co...
The RooDataHist is a container class to hold N-dimensional binned data.
virtual Double_t weight() const
void set(Double_t weight, Double_t wgtErr=-1)
Set the weight and weight error of the bin enclosing the current (i.e.
virtual Double_t sumEntries() const
virtual Int_t numEntries() const
Return the number of bins.
virtual const RooArgSet * get() const
void SetName(const char *name)
Change the name of the RooDataHist.
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.
virtual void add(const RooArgSet &row, Double_t weight=1.0, Double_t weightError=0) override
Add a data point, with its coordinates specified in the 'data' argset, to the data set.
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
const TMatrixDSym & covarianceMatrix() const
Return covariance matrix.
Class RooGenContext implement a universal generator context for all RooAbsPdf classes that do not hav...
RooInt is a minimal implementation of a TObject holding a Int_t value.
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...
RooMinuit is a wrapper class around TFitter/TMinuit that provides a seamless interface between the MI...
Class RooNLLVar implements a -log(likelihood) calculation from a dataset and a PDF.
static const char * str(const TNamed *ptr)
Return C++ string corresponding to given TNamed pointer.
RooNameSet is a utility class that stores the names the objects in a RooArget.
RooArgSet * select(const RooArgSet &list) const
Construct a RooArgSet of objects in input 'list' whose names match to those in the internal name list...
void setNameList(const char *givenList)
const char * content() const
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.
const RooArgSet & numIntRealVars() const
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 range named 'name to [min,max].
TString * format(const RooCmdArg &formatArg) const
Format contents of RooRealVar for pretty printing on RooPlot parameter boxes.
A simple container to hold a batch of data values.
constexpr std::span< T >::index_type size() const noexcept
Bool_t defineSetInternal(const char *name, const RooArgSet &aset)
const RooArgSet * set(const char *name)
Return pointer to previously defined named set with given nmame If no such set is found a null pointe...
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.
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
TString & Append(const char *cs)
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)
EvaluateInfo init(std::vector< RooRealProxy > parameters, std::vector< ArrayWrapper * > wrappers, std::vector< double * > arrays, size_t begin, size_t batchSize)
VecExpr< UnaryOp< Fabs< T >, VecExpr< A, T, D >, T >, T, D > fabs(const VecExpr< A, T, D > &rhs)
RooCmdArg WeightVar(const char *name, Bool_t reinterpretAsWeight=kFALSE)
RooCmdArg NormRange(const char *rangeNameList)
RooCmdArg Hesse(Bool_t flag=kTRUE)
RooCmdArg SupNormSet(const RooArgSet &nset)
RooCmdArg PrintLevel(Int_t code)
RooCmdArg Range(const char *rangeName, Bool_t adjustNorm=kTRUE)
RooCmdArg Normalization(Double_t scaleFactor)
std::vector< std::string > tokenise(const std::string &str, const std::string &delims)
Tokenise the string by splitting at the characters in delims.
static constexpr double pc
static void output(int code)