74using std::endl, std::string, std::vector, std::list, std::ostream, std::map, std::ostringstream;
113 _pdfList(
"!pdfs",
"List of PDFs",this)
116 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
122 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
127 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" <<
GetName()
128 <<
") multiple components with extended terms detected,"
129 <<
" product will not be extendible." << endl ;
161 _pdfList(
"!pdfs",
"List of PDFs",this)
209 _pdfList(
"!pdfs",
"List of PDFs",this)
233 _pdfList(
"!pdfList",
"List of PDFs",this)
253 _pdfList(
"!pdfs",
"List of PDFs",this)
266 _cacheMgr(other._cacheMgr,this),
267 _genCode(other._genCode),
268 _cutOff(other._cutOff),
269 _pdfList(
"!pdfs",this,other._pdfList),
270 _extendedIndex(other._extendedIndex),
271 _useDefaultGen(other._useDefaultGen),
272 _refRangeName(other._refRangeName),
273 _selfNorm(other._selfNorm),
274 _defNormSet(other._defNormSet)
278 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(nset->GetName()));
292 Int_t numExtended(0) ;
295 for(
auto const* pdf : static_range_cast<RooAbsPdf*>(fullPdfSet)) {
297 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
299 if (pdf->canBeExtended()) {
307 for(
auto * carg : static_range_cast<RooCmdArg*>(
l)) {
309 if (0 == strcmp(carg->GetName(),
"Conditional")) {
311 Int_t argType = carg->getInt(0) ;
315 for(
auto * thePdf : static_range_cast<RooAbsPdf*>(*pdfSet)) {
318 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(0 == argType ?
"nset" :
"cset"));
321 if (thePdf->canBeExtended()) {
328 }
else if (0 != strlen(carg->GetName())) {
329 coutW(InputArguments) <<
"Unknown arg: " << carg->GetName() << endl ;
335 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" <<
GetName()
336 <<
") WARNING: multiple components with extended terms detected,"
337 <<
" product will not be extendible." << endl ;
386 cxcoutD(Eval) <<
"RooProdPdf::calculate(" <<
GetName() <<
") rearranged product calculation"
400 const auto normSet = cache.
_normList[i].get();
402 const double piVal = partInt.getVal(!normSet->empty() ? normSet :
nullptr);
420 std::vector<std::span<const double>> factors;
423 auto span = ctx.
at(i);
424 factors.push_back(span);
426 std::array<double, 1> special{
static_cast<double>(factors.size())};
434void eraseNullptrs(std::vector<T*>&
v) {
435 v.erase(std::remove_if(
v.begin(),
v.end(), [](T*
x){ return x == nullptr; } ),
v.end());
438void removeCommon(std::vector<RooAbsArg*> &
v, std::span<RooAbsArg * const> other) {
440 for (
auto const& arg : other) {
441 auto namePtrMatch = [&arg](
const RooAbsArg* elm) {
442 return elm !=
nullptr && elm->namePtr() == arg->namePtr();
445 auto found = std::find_if(
v.begin(),
v.end(), namePtrMatch);
446 if(found !=
v.end()) {
453void addCommon(std::vector<RooAbsArg*> &
v, std::vector<RooAbsArg*>
const& o1, std::vector<RooAbsArg*>
const& o2) {
455 for (
auto const& arg : o1) {
456 auto namePtrMatch = [&arg](
const RooAbsArg* elm) {
457 return elm->namePtr() == arg->namePtr();
460 if(std::find_if(o2.begin(), o2.end(), namePtrMatch) != o2.end()) {
478 std::vector<RooArgSet> depAllList;
479 std::vector<RooArgSet> depIntNoNormList;
487 std::vector<RooAbsArg*> pdfIntNoNormDeps;
488 std::vector<RooAbsArg*> pdfIntSet;
489 std::vector<RooAbsArg*> pdfNSet;
490 std::vector<RooAbsArg*> pdfCSet;
491 std::vector<RooAbsArg*> pdfNormDeps;
492 std::vector<RooAbsArg*> pdfAllDeps;
495 for(std::size_t iPdf = 0; iPdf <
_pdfList.
size(); ++iPdf) {
506 RooArgSet pdfLeafList(
"leafNodeServerList") ;
508 auto getObservablesOfCurrentPdf = [&pdfLeafList](
509 std::vector<RooAbsArg*> & out,
511 for (
const auto arg : pdfLeafList) {
512 if (arg->dependsOnValue(dataList) && arg->isLValue()) {
519 if (0 == strcmp(
"cset", pdfNSetOrig.
GetName())) {
520 getObservablesOfCurrentPdf(pdfNSet, normSet);
521 removeCommon(pdfNSet, pdfNSetOrig.
get());
522 pdfCSet = pdfNSetOrig.
get();
525 getObservablesOfCurrentPdf(pdfNSet, pdfNSetOrig);
533 getObservablesOfCurrentPdf(pdfAllDeps, normSet);
539 if (!pdfNSet.empty()) {
541 addCommon(pdfNormDeps, pdfAllDeps, pdfNSet);
544 pdfNormDeps = pdfAllDeps;
550 getObservablesOfCurrentPdf(pdfIntSet, intSet) ;
553 if (pdfNormDeps.empty() && !pdfCSet.empty()) {
554 removeCommon(pdfIntSet, pdfCSet);
558 pdfIntNoNormDeps.clear();
559 pdfIntNoNormDeps = pdfIntSet;
560 removeCommon(pdfIntNoNormDeps, pdfNormDeps);
567 auto lIter = termList.
begin();
568 auto ldIter = normList.
begin();
569 for(;lIter != termList.
end(); (++lIter, ++ldIter, ++j)) {
570 termNormDeps =
static_cast<RooArgSet*
>(*ldIter);
578 bool normOverlap = termNormDeps->
overlaps(pdfNormDeps.begin(), pdfNormDeps.end());
585 termNormDeps->
add(pdfNormDeps.begin(), pdfNormDeps.end(),
false);
586 depAllList[j].add(pdfAllDeps.begin(), pdfAllDeps.end(),
false);
588 termIntDeps->
add(pdfIntSet.begin(), pdfIntSet.end(),
false);
590 if (termIntNoNormDeps) {
591 termIntNoNormDeps->
add(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
false);
593 termIntNoNormDeps->
add(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
false);
600 if (!(pdfNormDeps.empty() && pdfAllDeps.empty() &&
601 pdfIntSet.empty()) || normSet.
empty()) {
603 termNormDeps =
new RooArgSet(
"termNormDeps");
604 depAllList.emplace_back(pdfAllDeps.begin(), pdfAllDeps.end(),
"termAllDeps");
605 termIntDeps =
new RooArgSet(pdfIntSet.begin(), pdfIntSet.end(),
"termIntDeps");
606 depIntNoNormList.emplace_back(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
"termIntNoNormDeps");
607 termIntNoNormDeps = &depIntNoNormList.back();
610 termNormDeps->
add(pdfNormDeps.begin(), pdfNormDeps.end(),
false);
613 normList.
Add(termNormDeps);
614 intList.
Add(termIntDeps);
623 auto lIter = termList.
begin();
624 auto ldIter = normList.
begin();
625 for(;lIter != termList.
end(); (++lIter, ++ldIter, ++i)) {
626 normDeps =
static_cast<RooArgSet*
>(*ldIter);
630 impDeps.
remove(*normDeps,
true,
true);
633 impDepList.
Add(snap);
638 auto crossDeps = std::unique_ptr<RooAbsCollection>{depIntNoNormList[i].selectCommon(*normDeps)};
641 crossDepList.
Add(snap);
660 Int_t sterileIdx(-1);
666 std::unique_ptr<CacheElem> cache =
createCacheElem(nset, iset, isetRangeName);
676 const char* isetRangeName)
const
684 auto cache = std::make_unique<CacheElem>();
707 std::list<std::vector<RooArgSet*>> groupedList;
715 std::map<std::string, RooArgSet> ratioTerms;
716 for (
auto const&
group : groupedList) {
717 if (1 ==
group.size()) {
736 bool rangeIdentical(
true);
738 for (
auto const* normObs : static_range_cast<RooRealVar*>(termNSet)) {
752 if (!rangeIdentical ) {
755 std::ostringstream str; termImpSet.
printValue(str);
757 ratioTerms[str.str()].addOwned(std::move(ratio));
764 for (
auto const& term :
group) {
775 bool rangeIdentical(
true);
778 for (
auto const* normObs : static_range_cast<RooRealVar*>(termNSet)) {
783 for (
auto const* normObs : static_range_cast<RooRealVar*>(termNSet)) {
789 if (!rangeIdentical ) {
792 std::ostringstream str; termImpSet.
printValue(str);
793 ratioTerms[str.str()].addOwned(std::move(ratio));
803 for (
auto const&
group : groupedList) {
804 for (
auto const& term :
group) {
813 if (!ratioTerms[str.str()].empty()) {
815 term->add(ratioTerms[str.str()]);
816 cache->_ownedList.addOwned(std::move(ratioTerms[str.str()]));
821 for (
auto const&
group : groupedList) {
825 if (1 ==
group.size()) {
832 xdeps =
static_cast<RooArgSet*
>(cross.At(termIdx));
841 termISet.
add(*integ);
845 termXSet.
add(*xdeps);
846 termImpSet.
add(*imps);
850 vector<RooAbsReal*> func =
processProductTerm(nset, iset, isetRangeName, term, termNSet, termISet, isOwned);
852 cache->_partList.add(*func[0]);
853 if (isOwned) cache->_ownedList.addOwned(std::unique_ptr<RooAbsArg>{func[0]});
855 cache->_normList.emplace_back(std::make_unique<RooArgSet>());
856 norm->snapshot(*cache->_normList.back(),
false);
858 cache->_numList.addOwned(std::unique_ptr<RooAbsArg>{func[1]});
859 cache->_denList.addOwned(std::unique_ptr<RooAbsArg>{func[2]});
867 for (
auto const &term :
group) {
870 norm =
static_cast<RooArgSet *
>(norms.
At(termIdx));
871 integ =
static_cast<RooArgSet *
>(ints.
At(termIdx));
872 xdeps =
static_cast<RooArgSet *
>(cross.At(termIdx));
879 termISet.
add(*integ);
881 termXSet.
add(*xdeps);
882 termImpSet.
add(*imps);
885 termISet.
remove(outerIntDeps,
true,
true);
887 bool isOwned =
false;
888 vector<RooAbsReal *> func =
889 processProductTerm(nset, iset, isetRangeName, term, termNSet, termISet, isOwned,
true);
892 compTermSet.
add(*func[0]);
893 if (isOwned) cache->_ownedList.addOwned(std::unique_ptr<RooAbsArg>{func[0]});
894 compTermNorm.
add(*norm,
false);
896 compTermNum.
add(*func[1]);
897 compTermDen.
add(*func[2]);
913 const std::string prodname =
makeRGPPName(
"SPECPROD", compTermSet, outerIntDeps,
RooArgSet(), isetRangeName);
914 auto prodtmp = std::make_unique<RooProduct>(prodname.c_str(), prodname.c_str(), compTermSet);
916 const std::string intname =
makeRGPPName(
"SPECINT", compTermSet, outerIntDeps,
RooArgSet(), isetRangeName);
917 auto inttmp = std::make_unique<RooRealIntegral>(intname.c_str(), intname.c_str(), *prodtmp, outerIntDeps,
nullptr,
nullptr, isetRangeName);
918 inttmp->setStringAttribute(
"PROD_TERM_TYPE",
"SPECINT");
920 cache->_partList.add(*inttmp);
924 auto prodtmp_num = std::make_unique<RooProduct>(prodname_num.c_str(), prodname_num.c_str(), compTermNum);
925 prodtmp_num->addOwnedComponents(compTermNum);
929 auto prodtmp_den = std::make_unique<RooProduct>(prodname_den.c_str(), prodname_den.c_str(), compTermDen);
930 prodtmp_den->addOwnedComponents(compTermDen);
933 std::string
name =
Form(
"SPEC_RATIO(%s,%s)", prodname_num.c_str(), prodname_den.c_str());
934 auto ndr = std::make_unique<RooFormulaVar>(
name.c_str(),
"@0/@1",
RooArgList(*prodtmp_num, *prodtmp_den));
937 std::unique_ptr<RooAbsReal> numtmp{ndr->createIntegral(outerIntDeps,isetRangeName)};
938 numtmp->addOwnedComponents(std::move(ndr));
940 cache->_ownedList.addOwned(std::move(prodtmp));
941 cache->_ownedList.addOwned(std::move(inttmp));
942 cache->_ownedList.addOwned(std::move(prodtmp_num));
943 cache->_ownedList.addOwned(std::move(prodtmp_den));
944 cache->_numList.addOwned(std::move(numtmp));
946 cache->_normList.emplace_back(std::make_unique<RooArgSet>());
947 compTermNorm.
snapshot(*cache->_normList.back(),
false);
973 std::unique_ptr<RooAbsReal> ratio_num{pdf.
createIntegral(termNset,normRangeTmp)};
974 std::unique_ptr<RooAbsReal> ratio_den{pdf.
createIntegral(termNset,refRange)};
975 auto ratio = std::make_unique<RooFormulaVar>(
Form(
"ratio(%s,%s)",ratio_num->GetName(),ratio_den->GetName()),
"@0/@1",
978 ratio->addOwnedComponents(std::move(ratio_num));
979 ratio->addOwnedComponents(std::move(ratio_den));
980 ratio->setAttribute(
"RATIO_TERM") ;
996 list<string> rangeComps ;
1000 char* save(
nullptr) ;
1001 char* token = R__STRTOK_R(buf.data(),
",",&save) ;
1003 rangeComps.push_back(token) ;
1004 token = R__STRTOK_R(
nullptr,
",",&save) ;
1009 std::map<std::string,RooArgSet> denListList ;
1011 string specIntRange ;
1036 std::unique_ptr<RooArgSet> components{orig->
getComponents()};
1038 if (carg->getAttribute(
"RATIO_TERM")) {
1050 nomList.
add(*funcCust) ;
1052 nomList.
add(*func) ;
1067 if (arg->getAttribute(
"RATIO_TERM")) {
1070 origNumTerm.
add(*arg) ;
1078 nomList.
add(origNumTerm) ;
1085 for (list<string>::iterator iter = rangeComps.begin() ; iter != rangeComps.end() ; ++iter) {
1106 for (
auto* parg : static_range_cast<RooAbsReal*>(dentmp->
components())) {
1109 if (ratio && parg->dependsOn(*ratio)) {
1128 partCust = cust.
build() ;
1133 partCust = cust.
build() ;
1143 string name =
Form(
"%s_divided_by_ratio",specializedPartCust->GetName()) ;
1144 auto specIntFinal = std::make_unique<RooFormulaVar>(
name.c_str(),
"@0/@1",
RooArgList(*specializedPartCust,*specializedRatio)) ;
1145 specIntFinal->addOwnedComponents(std::move(specializedPartCust));
1146 specIntFinal->addOwnedComponents(std::move(specializedRatio));
1148 denListList[*iter].addOwned(std::move(specIntFinal));
1169 tmp.add(*specRatio) ;
1171 auto specDenProd = std::make_unique<RooProduct>(pname.c_str(),pname.c_str(),tmp) ;
1172 std::unique_ptr<RooAbsReal> specInt;
1175 specInt = std::unique_ptr<RooAbsReal>{specDenProd->createIntegral((
static_cast<RooRealIntegral*
>(den))->intVars(),iter->c_str())};
1176 specInt->addOwnedComponents(std::move(specDenProd));
1180 specInt = std::unique_ptr<RooAbsReal>{specDenProd->
createIntegral(origInt->
intVars(),iter->c_str())};
1181 specInt->addOwnedComponents(std::move(specDenProd));
1183 throw string(
"this should not happen") ;
1187 string name =
Form(
"%s_divided_by_ratio",specInt->GetName()) ;
1188 auto specIntFinal = std::make_unique<RooFormulaVar>(
name.c_str(),
"@0/@1",
RooArgList(*specInt,*specRatio)) ;
1189 specIntFinal->addOwnedComponents(std::move(specInt));
1190 specIntFinal->addOwnedComponents(std::move(specRatio));
1191 denListList[*iter].addOwned(std::move(specIntFinal));
1202 if (nomList.
empty()) {
1209 std::unique_ptr<RooAbsReal> numerator = std::make_unique<RooProduct>(
name.c_str(),
name.c_str(),nomList) ;
1213 for (map<string,RooArgSet>::iterator iter = denListList.begin() ; iter != denListList.end() ; ++iter) {
1219 products.
add(*prod_comp) ;
1225 if (!specIntDeps.
empty()) {
1228 string namesr =
Form(
"SPEC_RATIO(%s,%s)",numerator->GetName(),norm->
GetName()) ;
1233 numerator = std::unique_ptr<RooAbsReal>{ndr->
createIntegral(specIntDeps,specIntRange.c_str())};
1262 std::unique_ptr<RooAbsReal> numint_spec{
specializeIntegral(*numint,targetRangeName)};
1264 std::unique_ptr<RooAbsReal> ret = std::make_unique<RooFormulaVar>(
Form(
"ratio(%s,%s)",numint_spec->GetName(),denint->
GetName()),
"@0/@1",
RooArgList(*numint_spec,*denint)) ;
1265 ret->addOwnedComponents(std::move(numint_spec));
1292 std::stringstream errMsg;
1293 errMsg <<
"specializeIntegral: unknown input type " <<
input.ClassName() <<
"::" <<
input.GetName();
1294 throw std::runtime_error(errMsg.str());
1306 for(
auto * term : static_range_cast<RooArgSet*>(terms)) {
1307 groupedTerms.emplace_back();
1308 groupedTerms.back().emplace_back(term) ;
1313 for(
auto * impDeps : static_range_cast<RooArgSet*>(imps)) {
1314 allImpDeps.
add(*impDeps,
false) ;
1319 for(
auto * intDeps : static_range_cast<RooArgSet*>(ints)) {
1320 allIntDeps.
add(*intDeps,
false) ;
1324 outerIntDeps.
add(*std::unique_ptr<RooArgSet>{allIntDeps.
selectCommon(allImpDeps)});
1327 for(
RooAbsArg * outerIntDep : outerIntDeps) {
1330 std::vector<RooArgSet*>* newGroup = nullptr ;
1333 bool needMerge = false ;
1334 auto group = groupedTerms.begin();
1335 auto nGroups = groupedTerms.size();
1336 for (
size_t iGroup = 0; iGroup < nGroups; ++iGroup) {
1339 for (
auto const& term2 : *
group) {
1346 if (termNormDeps->
contains(*outerIntDep) ||
1347 termIntDeps->
contains(*outerIntDep) ||
1348 termImpDeps->
contains(*outerIntDep)) {
1356 if (newGroup==
nullptr) {
1357 groupedTerms.emplace_back() ;
1358 newGroup = &groupedTerms.back() ;
1362 for (
auto& term2 : *
group) {
1363 newGroup->emplace_back(term2) ;
1384 bool& isOwned,
bool forceWrap)
const
1386 vector<RooAbsReal*> ret(3) ; ret[0] = nullptr ; ret[1] = nullptr ; ret[2] = nullptr ;
1391 if (!termNSet.
empty() && termNSet.
size()==termISet.
size() && isetRangeName==
nullptr) {
1402 if (nset && termNSet.
empty()) {
1410 if (iset && !termISet.
empty()) {
1411 if (term->
size()==1) {
1429 ret[1] = std::unique_ptr<RooAbsReal>{pdf->
createIntegral(termISet,isetRangeName)}.release();
1441 const std::string
name =
makeRGPPName(
"GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
1456 ret[1] = std::unique_ptr<RooAbsReal>{tmp_prod->
createIntegral(termISet,isetRangeName)}.release();
1465 if (nset && !nset->
empty() && term->
size()>1) {
1468 const std::string
name =
makeRGPPName(
"GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
1485 ret[1] = std::unique_ptr<RooAbsReal>{tmp_prod->
createIntegral(termISet,isetRangeName)}.release();
1493 for (
auto* pdf : static_range_cast<RooAbsPdf*>(*term)) {
1499 name.Append(
"_NORM[") ;
1501 for (
auto const* arg : termNSet) {
1507 name.Append(arg->GetName()) ;
1524 ret[2] = std::unique_ptr<RooAbsReal>{pdf->createIntegral(termNSet,
normRange())}.release();
1535 pdf->setStringAttribute(
"PROD_TERM_TYPE",
"IVb") ;
1538 ret[1] = std::unique_ptr<RooAbsReal>{pdf->createIntegral(
RooArgSet())}.release();
1539 ret[2] = !termNSet.
empty() ? std::unique_ptr<RooAbsReal>{pdf->createIntegral(termNSet,
normRange())}.release()
1545 coutE(Eval) <<
"RooProdPdf::processProductTerm(" <<
GetName() <<
") unidentified term!!!" << endl ;
1556 const RooArgSet& nset,
const char* isetRangeName)
const
1560 std::ostringstream os(pfx);
1565 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(term)) {
1566 if (!first) os <<
"_X_";
1568 os << pdf->GetName();
1603 const RooArgSet* normSet,
const char* rangeName)
const
1608 analVars.
add(allVars) ;
1636 if (cache==
nullptr) {
1674 coutF(Generation) <<
"Requesting expected number of events from a RooProdPdf that does not contain an extended p.d.f" << endl ;
1675 throw std::logic_error(std::string(
"RooProdPdf ") +
GetName() +
" could not be extended.");
1684 coutF(Generation) <<
"Requesting expected number of events from a RooProdPdf that does not contain an extended p.d.f" << endl ;
1685 throw std::logic_error(std::string(
"RooProdPdf ") +
GetName() +
" could not be extended.");
1696 const RooArgSet* auxProto,
bool verbose)
const
1714 for (
auto const* arg : directVars) {
1720 std::vector<Int_t> code;
1722 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1724 Int_t pdfCode = pdf->getGenerator(directSafe,pdfDirect,staticInitOK);
1725 code.push_back(pdfCode);
1727 generateVars.
add(pdfDirect) ;
1732 if (!generateVars.
empty()) {
1734 return masterCode+1 ;
1752 for (
auto* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1753 if (codeList[i]!=0) {
1754 pdf->initGenerator(codeList[i]) ;
1773 for (
auto* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1774 if (codeList[i]!=0) {
1775 pdf->generateEvent(codeList[i]) ;
1806 os <<
indent <<
"RooProdPdf begin partial integral cache" << endl ;
1809 auto indent2 = std::string(
indent) +
"[" + std::to_string(curElem) +
"]";
1810 for(
auto const& arg : _partList) {
1811 arg->printCompactTree(os,indent2.c_str()) ;
1814 if (curElem==maxElem) {
1815 os <<
indent <<
"RooProdPdf end partial integral cache" << endl ;
1832 for (
auto* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1834 if (pdf->dependsOn(arg)) {
1838 if (thePdf)
return false ;
1855 if (idx<0)
return nullptr;
1866 for(
auto arg : pdfs) {
1869 coutW(InputArguments) <<
"RooProdPdf::addPdfs(" <<
GetName() <<
") list arg "
1870 << arg->
GetName() <<
" is not a PDF, ignored" << endl ;
1881 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset"));
1885 if (numExtended>1) {
1886 coutW(InputArguments) <<
"RooProdPdf::addPdfs(" <<
GetName()
1887 <<
") WARNING: multiple components with extended terms detected,"
1888 <<
" product will not be extendible." << endl ;
1928 std::vector<TNamed const*> ptrs;
1929 ptrs.reserve(col.
size());
1931 ptrs.push_back(arg->namePtr());
1933 std::sort(ptrs.begin(), ptrs.end());
1937bool sortedNamePtrsOverlap(std::vector<TNamed const*>
const& ptrsA, std::vector<TNamed const*>
const& ptrsB)
1939 auto pA = ptrsA.begin();
1940 auto pB = ptrsB.begin();
1941 while (pA != ptrsA.end() && pB != ptrsB.end()) {
1944 }
else if (*pB < *pA) {
1966 auto constraints =
new RooArgSet{
"constraints"};
1969 auto observablesNamePtrs = sortedNamePtrs(observables);
1970 auto constrainedParamsNamePtrs = sortedNamePtrs(constrainedParams);
1973 for (std::size_t iPdf = 0; iPdf <
_pdfList.
size(); ++iPdf) {
1977 pdf->getParameters(
nullptr, tmp);
1982 bool isConstraint =
false;
1985 auto tmpNamePtrs = sortedNamePtrs(tmp);
1997 isConstraint = !sortedNamePtrsOverlap(tmpNamePtrs, observablesNamePtrs) &&
1998 sortedNamePtrsOverlap(tmpNamePtrs, constrainedParamsNamePtrs);
2001 constraints->add(*pdf) ;
2008 tmp.remove(observables,
false,
true);
2009 pdfParams.
add(tmp,
true) ;
2028 for (std::size_t iPdf = 0; iPdf <
_pdfList.
size(); ++iPdf) {
2033 if (
static_cast<int>(iPdf) ==
_extendedIndex || pdf->dependsOn(observables)) {
2035 pdf->getParameters(&observables, tmp);
2036 connectedPars->
add(tmp) ;
2039 return connectedPars ;
2049 if (!stripDisconnected) return ;
2050 if (!nset || nset->
empty()) return ;
2058 for (
auto param : *params) {
2059 bool anyDep(
false) ;
2060 for (
auto term : plist) {
2061 if (term->dependsOnValue(*param)) {
2066 tostrip.
add(*param) ;
2070 if (!tostrip.
empty()) {
2071 params->
remove(tostrip,
true,
true);
2108 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
2109 if (std::list<double>* hint = pdf->plotSamplingHint(obs,xlo,xhi)) {
2124 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
2125 if (pdf->dependsOn(obs) && !pdf->isBinnedDistribution(obs)) {
2143 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
2144 if (std::list<double>* hint = pdf->binBoundaries(obs,xlo,xhi)) {
2162 if (parg->canNodeBeCached()==
Always) {
2163 trackNodes.
add(*parg) ;
2170 if (
string(
"nset")==pdf_nset->GetName() && !pdf_nset->empty()) {
2171 parg->setStringAttribute(
"CATNormSet",getColonSeparatedNameString(*pdf_nset).c_str()) ;
2173 if (
string(
"cset")==pdf_nset->GetName()) {
2174 parg->setStringAttribute(
"CATCondSet",getColonSeparatedNameString(*pdf_nset).c_str()) ;
2177 coutW(Optimization) <<
"RooProdPdf::setCacheAndTrackHints(" <<
GetName() <<
") WARNING product pdf does not specify a normalization set for component " << parg->GetName() << endl ;
2192 if (i>0) os <<
" * " ;
2195 if (!ncset->
empty()) {
2196 if (
string(
"nset")==ncset->
GetName()) {
2201 for (
auto const* arg : *ncset) {
2207 os << arg->GetName() ;
2224 cxcoutD(LinkStateMgmt) <<
"RooProdPdf::redirectServersHook(" <<
GetName() <<
"): removing REMOVAL_DUMMY" << endl ;
2239 for(std::unique_ptr<RooArgSet>
const& normSet :
_pdfNSetList) {
2243 normSet->replace(arg, std::unique_ptr<RooAbsArg>{newArg->cloneTree()});
2253 os <<
"_partList\n";
2254 os << getColonSeparatedNameString(_partList) <<
"\n";
2256 os << getColonSeparatedNameString(_numList) <<
"\n";
2258 os << getColonSeparatedNameString(_denList) <<
"\n";
2259 os <<
"_ownedList\n";
2260 os << getColonSeparatedNameString(_ownedList) <<
"\n";
2261 os <<
"_normList\n";
2262 for(
auto const& set : _normList) {
2263 os << getColonSeparatedNameString(*set) <<
"\n";
2265 os <<
"_isRearranged" <<
"\n";
2266 os << _isRearranged <<
"\n";
2267 os <<
"_rearrangedNum" <<
"\n";
2268 if(_rearrangedNum) {
2269 os << getColonSeparatedNameString(*_rearrangedNum) <<
"\n";
2271 os <<
"nullptr" <<
"\n";
2273 os <<
"_rearrangedDen" <<
"\n";
2274 if(_rearrangedDen) {
2275 os << getColonSeparatedNameString(*_rearrangedDen) <<
"\n";
2277 os <<
"nullptr" <<
"\n";
2283 if (normSet.
empty())
2286 if (pdfNset && !pdfNset->empty()) {
2287 std::unique_ptr<RooArgSet> out;
2288 if (0 == strcmp(
"cset", pdfNset->GetName())) {
2292 out = std::make_unique<RooArgSet>(normSet);
2294 out->selectCommon(*pdfNset, common);
2295 out->remove(common);
2297 out = std::make_unique<RooArgSet>(*pdfNset);
2302 if (!arg->getStringAttribute(
"__prefix__")) {
2303 arg->SetName((std::string(prefix) + arg->GetName()).c_str());
2304 arg->setStringAttribute(
"__prefix__", prefix);
2322 _servers(
"!servers",
"List of servers", this), _prodPdf{std::move(prodPdf)}
2328 _servers(
"!servers",
"List of servers", this), _prodPdf{static_cast<
RooProdPdf *>(other._prodPdf->
Clone())}
2340 _prodPdf->doEvalImpl(
this, *_cache, ctx);
2345 if (_cache->_isRearranged) {
2346 ctx.
addResult(
this, ctx.
buildCall(
"RooFit::Detail::MathFuncs::ratio", *_cache->_rearrangedNum, *_cache->_rearrangedDen));
2348 ctx.
addResult(
this, ctx.
buildCall(
"RooFit::Detail::MathFuncs::product", _cache->_partList, _cache->_partList.size()));
2356 return _prodPdf->createExpectedEventsFunc(&
_normSet);
2362 const char *rangeName =
nullptr)
const override
2364 return _prodPdf->getAnalyticalIntegralWN(allVars, analVars, normSet, rangeName);
2368 return _prodPdf->getAnalyticalIntegral(allVars, numVars, rangeName);
2372 return _prodPdf->analyticalIntegralWN(code, normSet, rangeName);
2376 return _prodPdf->analyticalIntegral(code, rangeName);
2382 _cache = _prodPdf->createCacheElem(&
_normSet,
nullptr);
2383 auto &cache = *_cache;
2388 if (cache._isRearranged) {
2389 _servers.add(*cache._rearrangedNum);
2390 _servers.add(*cache._rearrangedDen);
2392 for (std::size_t i = 0; i < cache._partList.size(); ++i) {
2393 _servers.add(cache._partList[i]);
2398 double evaluate()
const override {
return _prodPdf->calculate(*_cache); }
2401 std::unique_ptr<RooProdPdf::CacheElem>
_cache;
2406std::unique_ptr<RooAbsArg>
2411 if (binnedInfo.binnedPdf && binnedInfo.binnedPdf !=
this) {
2412 return binnedInfo.binnedPdf->compileForNormSet(normSet, ctx);
2416 std::unique_ptr<RooProdPdf> prodPdfClone{
static_cast<RooProdPdf *
>(this->
Clone())};
2419 for (
const auto server : prodPdfClone->servers()) {
2421 RooArgSet const &nset = nsetForServer ? *nsetForServer : normSet;
2424 server->getObservables(&nset, depList);
2429 auto fixedProdPdf = std::make_unique<RooFixedProdPdf>(std::move(prodPdfClone), normSet);
2432 return fixedProdPdf;
static void indent(ostringstream &buf, int indent_level)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
const std::vector< Int_t > & retrieve(Int_t masterCode) const
Retrieve the array of integer codes associated with the given master code.
Int_t store(const std::vector< Int_t > &codeList, RooArgSet *set1=nullptr, RooArgSet *set2=nullptr, RooArgSet *set3=nullptr, RooArgSet *set4=nullptr)
Store given arrays of integer codes, and up to four RooArgSets in the registry (each setX pointer may...
Common abstract base class for objects that represent a value and a "shape" in RooFit.
RooExpensiveObjectCache & expensiveObjectCache() const
R__DEPRECATED(6, 36, "Use getObservables().") RooFit R__DEPRECATED(6, 36, "Use getObservables().") RooFit R__DEPRECATED(6, 36, "Use getObservables().") RooFit const RooAbsArg &testArg const
void setOperMode(OperMode mode, bool recurseADirty=true)
Set the operation mode of this node.
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
RooFit::OwningPtr< RooArgSet > getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
virtual void setExpensiveObjectCache(RooExpensiveObjectCache &cache)
bool addOwnedComponents(const RooAbsCollection &comps)
Take ownership of the contents of 'comps'.
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
friend class RooRealIntegral
RooFit::OwningPtr< RooArgSet > getComponents() const
Create a RooArgSet with all components (branch nodes) of the expression tree headed by this object.
TObject * Clone(const char *newname=nullptr) const override
Make a clone of an object using the Streamer facility.
void treeNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=nullptr, bool doBranch=true, bool doLeaf=true, bool valueOnly=false, bool recurseNonDerived=false) const
Fill supplied list with nodes of the arg tree, following all server links, starting with ourself as t...
RooAbsArg * findNewServer(const RooAbsCollection &newSet, bool nameChange) const
Find the new server in the specified set that matches the old server.
OperMode operMode() const
Query the operation mode of this node.
Abstract container object that can hold multiple RooAbsArg objects.
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
Storage_t const & get() const
Const access to the underlying stl container.
bool contains(const RooAbsArg &var) const
Check if collection contains an argument with the same name as var.
void printValue(std::ostream &os) const override
Print value of collection, i.e.
const char * GetName() const override
Returns name of object.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Int_t index(const RooAbsArg *arg) const
Returns index of given arg, or -1 if arg is not in the collection.
bool overlaps(Iterator_t otherCollBegin, Iterator_t otherCollEnd) const
Storage_t::size_type size() const
RooAbsArg * first() const
void clear()
Clear contents. If the collection is owning, it will also delete the contents.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract base class for generator contexts of RooAbsPdf objects.
Abstract interface for all probability density functions.
TString _normRange
Normalization range.
virtual bool isDirectGenSafe(const RooAbsArg &arg) const
Check if given observable can be safely generated using the pdfs internal generator mechanism (if tha...
RooArgSet const * _normSet
Normalization integral (owned by _normMgr)
bool canBeExtended() const
If true, PDF can provide extended likelihood term.
const char * normRange() const
bool redirectServersHook(const RooAbsCollection &newServerList, bool mustReplaceAll, bool nameChange, bool isRecursiveStep) override
The cache manager.
virtual RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false) const
Interface function to create a generator context from a p.d.f.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
Abstract base class for objects that represent a real value and implements functionality common to al...
RooFit::OwningPtr< RooAbsReal > createIntegral(const RooArgSet &iset, const RooCmdArg &arg1, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}) const
Create an object that represents the integral of the function over one or more observables listed in ...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
bool _forceNumInt
Force numerical integration if flag set.
TString integralNameSuffix(const RooArgSet &iset, const RooArgSet *nset=nullptr, const char *rangeName=nullptr, bool omitEmpty=false) const
Construct string with unique suffix name to give to integral object that encodes integrated observabl...
Calculates the sum of a set of RooAbsReal terms, or when constructed with two sets,...
const RooArgList & list1() const
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
RooArgSet * selectCommon(const RooAbsCollection &refColl) const
Use RooAbsCollection::selecCommon(), but return as RooArgSet.
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=nullptr)
Setter function without integration set.
RooArgSet selectFromSet1(RooArgSet const &argSet, int index) const
Create RooArgSet containing the objects that are both in the cached set 1 with a given index and an i...
T * getObjByIndex(Int_t index) const
Retrieve payload object by slot index.
RooArgSet selectFromSet2(RooArgSet const &argSet, int index) const
Create RooArgSet containing the objects that are both in the cached set 2 with a given index and an i...
void reset()
Clear the cache.
Int_t lastIndex() const
Return index of slot used in last get or set operation.
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=nullptr, const TNamed *isetRangeName=nullptr)
Getter function without integration set.
Named container for two doubles, two integers two object points and three string pointers that can be...
bool add(const RooAbsArg &var, bool valueServer, bool shapeServer, bool silent)
Overloaded RooCollection_t::add() method insert object into set and registers object as server to own...
bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false) override
Remove object 'var' from set and deregister 'var' as server to owner.
TObject * clone(const char *newname) const override
RooCustomizer is a factory class to produce clones of a prototype composite PDF object with the same ...
void replaceArg(const RooAbsArg &orig, const RooAbsArg &subst)
Replace any occurrence of arg 'orig' with arg 'subst'.
RooAbsArg * build(const char *masterCatState, bool verbose=false)
Build a clone of the prototype executing all registered 'replace' rules and 'split' rules for the mas...
Container class to hold unbinned data.
A class to maintain the context for squashing of RooFit models into code.
std::string buildCall(std::string const &funcname, Args_t const &...args)
Build the code to call the function with name funcname, passing some arguments.
void addResult(RooAbsArg const *key, std::string const &value)
A function to save an expression that includes/depends on the result of the input node.
void markAsCompiled(RooAbsArg &arg) const
bool likelihoodMode() const
void compileServer(RooAbsArg &server, RooAbsArg &arg, RooArgSet const &normSet)
std::span< const double > at(RooAbsArg const *arg, RooAbsArg const *caller=nullptr)
std::span< double > output()
RooBatchCompute::Config config(RooAbsArg const *arg) const
A RooProdPdf with a fixed normalization set can be replaced by this class.
void translate(RooFit::Detail::CodeSquashContext &ctx) const override
This function defines a translation for each RooAbsReal based object that can be used to express the ...
std::unique_ptr< RooProdPdf::CacheElem > _cache
RooFixedProdPdf(const RooFixedProdPdf &other, const char *name=nullptr)
RooFixedProdPdf(std::unique_ptr< RooProdPdf > &&prodPdf, RooArgSet const &normSet)
double analyticalIntegral(Int_t code, const char *rangeName=nullptr) const override
Implements the actual analytical integral(s) advertised by getAnalyticalIntegral.
bool selfNormalized() const override
Shows if a PDF is self-normalized, which means that no attempt is made to add a normalization term.
Int_t getAnalyticalIntegral(RooArgSet &allVars, RooArgSet &numVars, const char *rangeName=nullptr) const override
Interface function getAnalyticalIntergral advertises the analytical integrals that are supported.
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &analVars, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Variant of getAnalyticalIntegral that is also passed the normalization set that should be applied to ...
std::unique_ptr< RooAbsReal > createExpectedEventsFunc(const RooArgSet *) const override
Returns an object that represents the expected number of events for a given normalization set,...
TObject * clone(const char *newname) const override
double evaluate() const override
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
std::unique_ptr< RooProdPdf > _prodPdf
double expectedEvents(const RooArgSet *) const override
Return expected number of events to be used in calculation of extended likelihood.
void doEval(RooFit::EvalContext &ctx) const override
Base function for computing multiple values of a RooAbsReal.
bool canComputeBatchWithCuda() const override
bool forceAnalyticalInt(const RooAbsArg &dep) const override
double analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName) const override
Analytical integral with normalization (see RooAbsReal::analyticalIntegralWN() for further informatio...
ExtendMode extendMode() const override
Returns ability of PDF to provide extended likelihood terms.
General form of projected integral of product of PDFs, utility class for RooProdPdf.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
TObject * At(int index) const
Return object stored in sequential position given by index.
RooLinkedListIterImpl end() const
void Delete(Option_t *o=nullptr) override
Remove all elements in collection and delete all elements NB: Collection does not own elements,...
virtual void Add(TObject *arg)
RooLinkedListIterImpl begin() const
Int_t IndexOf(const char *name) const
Return position of given object in list.
static const char * str(const TNamed *ptr)
Return C++ string corresponding to given TNamed pointer.
static const TNamed * ptr(const char *stringPtr)
Return a unique TNamed pointer for given C++ string.
RooArgList containedArgs(Action) override
Return RooAbsArg components contained in the cache.
std::unique_ptr< RooAbsReal > _rearrangedNum
void printCompactTreeHook(std::ostream &, const char *, Int_t, Int_t) override
Hook function to print cache contents in tree printing of RooProdPdf.
std::vector< std::unique_ptr< RooArgSet > > _normList
std::unique_ptr< RooAbsReal > _rearrangedDen
void writeToStream(std::ostream &os) const
Efficient implementation of a product of PDFs of the form.
void setCacheAndTrackHints(RooArgSet &) override
Label OK'ed components of a RooProdPdf with cache-and-track, and label all RooProdPdf descendants wit...
Int_t getGenerator(const RooArgSet &directVars, RooArgSet &generateVars, bool staticInitOK=true) const override
Query internal generation capabilities of component p.d.f.s and aggregate capabilities into master co...
void rearrangeProduct(CacheElem &) const
void factorizeProduct(const RooArgSet &normSet, const RooArgSet &intSet, RooLinkedList &termList, RooLinkedList &normList, RooLinkedList &impDepList, RooLinkedList &crossDepList, RooLinkedList &intList) const
Factorize product in irreducible terms for given choice of integration/normalization.
double analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Return analytical integral defined by given scenario code.
~RooProdPdf() override
Destructor.
Int_t _extendedIndex
Index of extended PDF (if any)
std::unique_ptr< RooAbsReal > specializeRatio(RooFormulaVar &input, const char *targetRangeName) const
RooProdPdf()
Default constructor.
void removePdfs(RooAbsCollection const &pdfs)
Remove some PDFs from the factors of this RooProdPdf.
bool _useDefaultGen
Use default or distributed event generator.
std::vector< std::unique_ptr< RooArgSet > > _pdfNSetList
List of PDF component normalization sets.
std::unique_ptr< RooArgSet > fillNormSetForServer(RooArgSet const &normSet, RooAbsArg const &server) const
std::unique_ptr< RooAbsReal > specializeIntegral(RooAbsReal &orig, const char *targetRangeName) const
bool forceAnalyticalInt(const RooAbsArg &dep) const override
Force RooRealIntegral to offer all observables for internal integration.
std::unique_ptr< RooAbsArg > compileForNormSet(RooArgSet const &normSet, RooFit::Detail::CompileContext &ctx) const override
void getParametersHook(const RooArgSet *, RooArgSet *, bool stripDisconnected) const override
RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false) const override
Return generator context optimized for generating events from product p.d.f.s.
RooArgSet * getConstraints(const RooArgSet &observables, RooArgSet const &constrainedParams, RooArgSet &pdfParams) const override
Return all parameter constraint p.d.f.s on parameters listed in constrainedParams.
TNamed * _refRangeName
Reference range name for interpretation of conditional products.
RooAICRegistry _genCode
! Registry of composite direct generator codes
void addPdfs(RooAbsCollection const &pdfs)
Add some full PDFs to the factors of this RooProdPdf.
RooListProxy _pdfList
List of PDF components.
Int_t getPartIntList(const RooArgSet *nset, const RooArgSet *iset, const char *isetRangeName=nullptr) const
Return list of (partial) integrals of product terms for integration of p.d.f over observables iset wh...
void printMetaArgs(std::ostream &os) const override
Customized printing of arguments of a RooProdPdf to more intuitively reflect the contents of the prod...
std::list< double > * binBoundaries(RooAbsRealLValue &, double, double) const override
Forward the plot sampling hint from the p.d.f. that defines the observable obs.
RooObjCacheManager _cacheMgr
std::string makeRGPPName(const char *pfx, const RooArgSet &term, const RooArgSet &iset, const RooArgSet &nset, const char *isetRangeName) const
Make an appropriate automatic name for a RooGenProdProj object in getPartIntList()
bool isDirectGenSafe(const RooAbsArg &arg) const override
Forward determination of safety of internal generator code to component p.d.f that would generate the...
std::unique_ptr< RooAbsReal > makeCondPdfRatioCorr(RooAbsReal &term, const RooArgSet &termNset, const RooArgSet &termImpSet, const char *normRange, const char *refRange) const
For single normalization ranges.
RooArgSet * findPdfNSet(RooAbsPdf const &pdf) const
Look up user specified normalization set for given input PDF component.
ExtendMode extendMode() const override
If this product contains exactly one extendable p.d.f return the extension abilities of that p....
std::list< double > * plotSamplingHint(RooAbsRealLValue &obs, double xlo, double xhi) const override
Forward the plot sampling hint from the p.d.f. that defines the observable obs.
double expectedEvents(const RooArgSet *nset) const override
Return the expected number of events associated with the extendable input PDF in the product.
std::vector< RooAbsReal * > processProductTerm(const RooArgSet *nset, const RooArgSet *iset, const char *isetRangeName, const RooArgSet *term, const RooArgSet &termNSet, const RooArgSet &termISet, bool &isOwned, bool forceWrap=false) const
Calculate integrals of factorized product terms over observables iset while normalized to observables...
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &numVars, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Determine which part (if any) of given integral can be performed analytically.
friend class RooFixedProdPdf
bool isBinnedDistribution(const RooArgSet &obs) const override
If all components that depend on obs are binned that so is the product.
friend class RooProdGenContext
RooArgSet * getConnectedParameters(const RooArgSet &observables) const
Return all parameter constraint p.d.f.s on parameters listed in constrainedParams.
double calculate(const RooProdPdf::CacheElem &cache, bool verbose=false) const
Calculate running product of pdfs terms, using the supplied normalization set in 'normSetList' for ea...
RooArgSet _defNormSet
Default normalization set.
std::unique_ptr< RooAbsReal > createExpectedEventsFunc(const RooArgSet *nset) const override
Returns an object that represents the expected number of events for a given normalization set,...
CacheElem * getCacheElem(RooArgSet const *nset) const
The cache manager.
bool redirectServersHook(const RooAbsCollection &, bool, bool, bool) override
Implement support for node removal.
void initGenerator(Int_t code) override
Forward one-time initialization call to component generation initialization methods.
void doEvalImpl(RooAbsArg const *caller, const RooProdPdf::CacheElem &cache, RooFit::EvalContext &) const
Evaluate product of PDFs in batch mode.
void generateEvent(Int_t code) override
Generate a single event with configuration specified by 'code' Defer internal generation to component...
void groupProductTerms(std::list< std::vector< RooArgSet * > > &groupedTerms, RooArgSet &outerIntDeps, const RooLinkedList &terms, const RooLinkedList &norms, const RooLinkedList &imps, const RooLinkedList &ints, const RooLinkedList &cross) const
Group product into terms that can be calculated independently.
void fixRefRange(const char *rangeName)
std::unique_ptr< CacheElem > createCacheElem(const RooArgSet *nset, const RooArgSet *iset, const char *isetRangeName=nullptr) const
double evaluate() const override
Calculate current value of object.
void initializeFromCmdArgList(const RooArgSet &fullPdfSet, const RooLinkedList &l)
Initialize RooProdPdf configuration from given list of RooCmdArg configuration arguments and set of '...
void selectNormalizationRange(const char *rangeName=nullptr, bool force=false) override
Interface function used by test statistics to freeze choice of range for interpretation of conditiona...
double _cutOff
Cutoff parameter for running product.
Represents the product of a given set of RooAbsReal objects.
Performs hybrid numerical/analytical integrals of RooAbsReal objects.
RooFit::OwningPtr< RooAbsReal > createIntegral(const RooArgSet &iset, const RooArgSet *nset=nullptr, const RooNumIntConfig *cfg=nullptr, const char *rangeName=nullptr) const override
Create an object that represents the integral of the function over one or more observables listed in ...
RooArgSet intVars() const
const RooAbsReal & integrand() const
const char * intRange() const
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
Mother of all ROOT objects.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
RooConstVar & RooConst(double val)
void compute(Config cfg, Computer comp, std::span< double > output, VarSpan vars, ArgSpan extraArgs={})
BinnedLOutput getBinnedL(RooAbsPdf const &pdf)
std::string getColonSeparatedNameString(RooArgSet const &argSet, char delim=':')