72#include <unordered_map>
73#include <unordered_set>
79using std::endl, std::string, std::vector, std::list, std::ostream, std::map, std::ostringstream;
116 _pdfList(
"!pdfs",
"List of PDFs",this)
119 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
125 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
130 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" <<
GetName()
131 <<
") multiple components with extended terms detected,"
132 <<
" product will not be extendable." << std::endl ;
163 _pdfList(
"!pdfs",
"List of PDFs",this)
210 _pdfList(
"!pdfs",
"List of PDFs",this)
233 _pdfList(
"!pdfList",
"List of PDFs",this)
252 _pdfList(
"!pdfs",
"List of PDFs",this)
264 _cacheMgr(other._cacheMgr,this),
265 _genCode(other._genCode),
266 _cutOff(other._cutOff),
267 _pdfList(
"!pdfs",this,other._pdfList),
268 _extendedIndex(other._extendedIndex),
269 _useDefaultGen(other._useDefaultGen),
270 _refRangeName(other._refRangeName),
271 _selfNorm(other._selfNorm),
272 _defNormSet(other._defNormSet)
275 for(
auto const& nset : other._pdfNSetList) {
276 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(nset->GetName()));
289 Int_t numExtended(0) ;
292 for(
auto const* pdf : static_range_cast<RooAbsPdf*>(fullPdfSet)) {
294 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
296 if (pdf->canBeExtended()) {
304 for(
auto * carg : static_range_cast<RooCmdArg*>(
l)) {
306 if (0 == strcmp(carg->GetName(),
"Conditional")) {
308 Int_t argType = carg->getInt(0) ;
309 auto pdfSet =
static_cast<RooArgSet const*
>(carg->getSet(0));
310 auto normSet =
static_cast<RooArgSet const*
>(carg->getSet(1));
312 for(
auto * thePdf : static_range_cast<RooAbsPdf*>(*pdfSet)) {
315 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(0 == argType ?
"nset" :
"cset"));
318 if (thePdf->canBeExtended()) {
325 }
else if (0 != strlen(carg->GetName())) {
326 coutW(InputArguments) <<
"Unknown arg: " << carg->GetName() << std::endl ;
332 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" <<
GetName()
333 <<
") WARNING: multiple components with extended terms detected,"
334 <<
" product will not be extendable." << std::endl ;
382 cxcoutD(Eval) <<
"RooProdPdf::calculate(" <<
GetName() <<
") rearranged product calculation"
396 const auto normSet = cache.
_normList[i].get();
398 const double piVal = partInt.getVal(!normSet->empty() ? normSet :
nullptr);
410void eraseNullptrs(std::vector<T*>&
v) {
411 v.erase(std::remove_if(
v.begin(),
v.end(), [](T*
x){ return x == nullptr; } ),
v.end());
414void removeCommon(std::vector<RooAbsArg*> &
v, std::span<RooAbsArg * const> other) {
416 for (
auto const& arg : other) {
417 auto namePtrMatch = [&arg](
const RooAbsArg* elm) {
418 return elm !=
nullptr && elm->namePtr() == arg->namePtr();
421 auto found = std::find_if(
v.begin(),
v.end(), namePtrMatch);
422 if(found !=
v.end()) {
429void addCommon(std::vector<RooAbsArg*> &
v, std::vector<RooAbsArg*>
const& o1, std::vector<RooAbsArg*>
const& o2) {
431 for (
auto const& arg : o1) {
432 auto namePtrMatch = [&arg](
const RooAbsArg* elm) {
433 return elm->namePtr() == arg->namePtr();
436 if(std::find_if(o2.begin(), o2.end(), namePtrMatch) != o2.end()) {
445 const char *range = normRange.
Length() > 0 ? normRange.
Data() :
nullptr;
448 if (normObs->getMin(range) != normObs->getMin(refRange) || normObs->getMax(range) != normObs->getMax(refRange))
463 std::vector<RooArgSet> depAllList;
464 std::vector<RooArgSet> depIntNoNormList;
471 std::vector<RooAbsArg*> pdfIntNoNormDeps;
472 std::vector<RooAbsArg*> pdfIntSet;
473 std::vector<RooAbsArg*> pdfNSet;
474 std::vector<RooAbsArg*> pdfCSet;
475 std::vector<RooAbsArg*> pdfNormDeps;
476 std::vector<RooAbsArg*> pdfAllDeps;
479 for(std::size_t iPdf = 0; iPdf <
_pdfList.
size(); ++iPdf) {
490 RooArgSet pdfLeafList(
"leafNodeServerList") ;
492 auto getObservablesOfCurrentPdf = [&pdfLeafList](
493 std::vector<RooAbsArg*> & out,
495 for (
const auto arg : pdfLeafList) {
496 if (arg->dependsOnValue(dataList) && arg->isLValue()) {
503 if (0 == strcmp(
"cset", pdfNSetOrig.GetName())) {
504 getObservablesOfCurrentPdf(pdfNSet, normSet);
505 removeCommon(pdfNSet, pdfNSetOrig.get());
506 pdfCSet = pdfNSetOrig.get();
509 getObservablesOfCurrentPdf(pdfNSet, pdfNSetOrig);
517 getObservablesOfCurrentPdf(pdfAllDeps, normSet);
521 if (!pdfNSet.empty()) {
523 addCommon(pdfNormDeps, pdfAllDeps, pdfNSet);
526 pdfNormDeps = pdfAllDeps;
530 getObservablesOfCurrentPdf(pdfIntSet, intSet) ;
533 if (pdfNormDeps.empty() && !pdfCSet.empty()) {
534 removeCommon(pdfIntSet, pdfCSet);
537 pdfIntNoNormDeps.clear();
538 pdfIntNoNormDeps = pdfIntSet;
539 removeCommon(pdfIntNoNormDeps, pdfNormDeps);
544 auto lIter = factorized.terms.begin();
545 auto ldIter = factorized.norms.begin();
546 for(;lIter != factorized.terms.end(); (++lIter, ++ldIter, ++j)) {
555 bool normOverlap = termNormDeps->
overlaps(pdfNormDeps.begin(), pdfNormDeps.end());
560 termNormDeps->
add(pdfNormDeps.begin(), pdfNormDeps.end(),
false);
561 depAllList[j].add(pdfAllDeps.begin(), pdfAllDeps.end(),
false);
563 termIntDeps->
add(pdfIntSet.begin(), pdfIntSet.end(),
false);
565 if (termIntNoNormDeps) {
566 termIntNoNormDeps->add(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
false);
568 termIntNoNormDeps->add(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
false);
575 if (!(pdfNormDeps.empty() && pdfAllDeps.empty() &&
576 pdfIntSet.empty()) || normSet.empty()) {
579 depAllList.emplace_back(pdfAllDeps.begin(), pdfAllDeps.end(),
"termAllDeps");
580 termIntDeps =
new RooArgSet(pdfIntSet.begin(), pdfIntSet.end(),
"termIntDeps");
581 depIntNoNormList.emplace_back(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
"termIntNoNormDeps");
582 termIntNoNormDeps = &depIntNoNormList.back();
585 termNormDeps->
add(pdfNormDeps.begin(), pdfNormDeps.end(),
false);
587 factorized.terms.Add(term);
588 factorized.norms.Add(termNormDeps);
589 factorized.ints.Add(termIntDeps);
598 auto lIter = factorized.terms.
begin();
599 auto ldIter = factorized.norms.begin();
600 for(;lIter != factorized.terms.end(); (++lIter, ++ldIter, ++i)) {
601 normDeps =
static_cast<RooArgSet*
>(*ldIter);
605 impDeps.remove(*normDeps,
true,
true);
608 factorized.imps.Add(snap);
612 auto crossDeps = std::unique_ptr<RooAbsCollection>{depIntNoNormList[i].
selectCommon(*normDeps)};
615 factorized.cross.Add(snap);
631 Int_t sterileIdx(-1);
637 std::unique_ptr<CacheElem> cache =
createCacheElem(nset, iset, isetRangeName);
647 const char* isetRangeName)
const
650 auto cache = std::make_unique<CacheElem>();
661 std::list<std::vector<RooArgSet*>> groupedList;
667 std::map<std::string, RooArgSet> ratioTerms;
668 for (
auto const&
group : groupedList) {
669 if (1 ==
group.size()) {
672 Int_t termIdx = factorized.terms.IndexOf(term);
684 std::ostringstream str; termImpSet.printValue(str);
685 ratioTerms[str.str()].addOwned(std::move(ratio));
690 for (
auto const& term :
group) {
692 Int_t termIdx = factorized.terms.IndexOf(term);
703 std::ostringstream str; termImpSet.printValue(str);
704 ratioTerms[str.str()].addOwned(std::move(ratio));
714 for (
auto const&
group : groupedList) {
715 for (
auto const& term :
group) {
716 Int_t termIdx = factorized.terms.IndexOf(term);
723 ostringstream str; termNSet.printValue(str);
724 if (!ratioTerms[str.str()].empty()) {
725 term->add(ratioTerms[str.str()]);
726 cache->_ownedList.addOwned(std::move(ratioTerms[str.str()]));
731 for (
auto const&
group : groupedList) {
732 if (1 ==
group.size()) {
735 Int_t termIdx = factorized.terms.IndexOf(term);
736 RooArgSet *norm = factorized.termNormDeps(termIdx);
737 RooArgSet *integ = factorized.termIntDeps(termIdx);
738 RooArgSet *xdeps = factorized.termCrossDeps(termIdx);
739 RooArgSet *imps = factorized.termImpDeps(termIdx);
751 cache->_partList.add(*func.x0);
752 if (func.isOwned) cache->_ownedList.addOwned(std::unique_ptr<RooAbsArg>{func.x0});
754 cache->_normList.emplace_back(std::make_unique<RooArgSet>());
755 norm->snapshot(*cache->_normList.back(),
false);
757 cache->_numList.addOwned(std::move(func.x1));
758 cache->_denList.addOwned(std::move(func.x2));
765 for (
auto const &term :
group) {
766 Int_t termIdx = factorized.terms.IndexOf(term);
767 RooArgSet *norm = factorized.termNormDeps(termIdx);
768 RooArgSet *integ = factorized.termIntDeps(termIdx);
769 RooArgSet *xdeps = factorized.termCrossDeps(termIdx);
770 RooArgSet *imps = factorized.termImpDeps(termIdx);
778 termISet.
remove(outerIntDeps,
true,
true);
780 auto func =
processProductTerm(nset, iset, isetRangeName, term, termNSet, termISet,
true);
782 compTermSet.add(*func.x0);
783 if (func.isOwned) cache->_ownedList.addOwned(std::unique_ptr<RooAbsArg>{func.x0});
784 compTermNorm.add(*norm,
false);
786 compTermNum.add(*func.x1.release());
787 compTermDen.add(*func.x2.release());
798 const std::string prodname =
makeRGPPName(
"SPECPROD", compTermSet, outerIntDeps,
RooArgSet(), isetRangeName);
799 auto prodtmp = std::make_unique<RooProduct>(prodname.c_str(), prodname.c_str(), compTermSet);
801 const std::string intname =
makeRGPPName(
"SPECINT", compTermSet, outerIntDeps,
RooArgSet(), isetRangeName);
802 auto inttmp = std::make_unique<RooRealIntegral>(intname.c_str(), intname.c_str(), *prodtmp, outerIntDeps,
nullptr,
nullptr, isetRangeName);
803 inttmp->setStringAttribute(
"PROD_TERM_TYPE",
"SPECINT");
805 cache->_partList.add(*inttmp);
809 auto prodtmp_num = std::make_unique<RooProduct>(prodname_num.c_str(), prodname_num.c_str(), compTermNum);
810 prodtmp_num->addOwnedComponents(compTermNum);
814 auto prodtmp_den = std::make_unique<RooProduct>(prodname_den.c_str(), prodname_den.c_str(), compTermDen);
815 prodtmp_den->addOwnedComponents(compTermDen);
818 std::string
name =
Form(
"SPEC_RATIO(%s,%s)", prodname_num.c_str(), prodname_den.c_str());
819 auto ndr = std::make_unique<RooFormulaVar>(
name.c_str(),
"@0/@1",
RooArgList(*prodtmp_num, *prodtmp_den));
822 std::unique_ptr<RooAbsReal> numtmp{ndr->createIntegral(outerIntDeps,isetRangeName)};
823 numtmp->addOwnedComponents(std::move(ndr));
825 cache->_ownedList.addOwned(std::move(prodtmp));
826 cache->_ownedList.addOwned(std::move(inttmp));
827 cache->_ownedList.addOwned(std::move(prodtmp_num));
828 cache->_ownedList.addOwned(std::move(prodtmp_den));
829 cache->_numList.addOwned(std::move(numtmp));
831 cache->_normList.emplace_back(std::make_unique<RooArgSet>());
832 compTermNorm.snapshot(*cache->_normList.back(),
false);
861 std::unique_ptr<RooAbsReal> ratio_num{pdf.
createIntegral(termNset,normRangeTmp)};
862 std::unique_ptr<RooAbsReal> ratio_den{pdf.
createIntegral(termNset,refRange)};
863 auto ratio = std::make_unique<RooFormulaVar>(
Form(
"ratio(%s,%s)",ratio_num->GetName(),ratio_den->GetName()),
"@0/@1",
866 ratio->addOwnedComponents(std::move(ratio_num));
867 ratio->addOwnedComponents(std::move(ratio_den));
868 ratio->setAttribute(
"RATIO_TERM") ;
883 std::map<std::string,RooArgSet> denListList ;
885 string specIntRange ;
898 if (
string(
"SPECINT")==part->getStringAttribute(
"PROD_TERM_TYPE")) {
901 auto specratio =
static_cast<RooFormulaVar const*
>(&orig->integrand()) ;
904 std::unique_ptr<RooArgSet> components{orig->
getComponents()};
906 if (carg->getAttribute(
"RATIO_TERM")) {
915 nomList.add(*cust.build()) ;
931 if (arg->getAttribute(
"RATIO_TERM")) {
934 origNumTerm.add(*arg) ;
940 nomList.add(origNumTerm) ;
947 for (
auto iter = rangeComps.begin() ; iter != rangeComps.end() ; ++iter) {
951 if (
string(
"SPECINT")==part->getStringAttribute(
"PROD_TERM_TYPE")) {
954 auto specRatio =
static_cast<RooFormulaVar const*
>(&orig->integrand()) ;
955 specIntDeps.add(orig->intVars()) ;
956 if (orig->intRange()) {
957 specIntRange = orig->intRange() ;
962 for (
auto* parg : static_range_cast<RooAbsReal*>(dentmp->components())) {
963 if (ratio && parg->dependsOn(*ratio)) {
975 RooCustomizer cust(*tmpadd->list1().first(), (
"blah_" + *iter).c_str());
976 cust.replaceArg(*ratio,*specializedRatio) ;
977 partCust = cust.build() ;
981 cust.replaceArg(*ratio, *specializedRatio);
982 partCust = cust.build();
990 string name =
Form(
"%s_divided_by_ratio",specializedPartCust->GetName()) ;
991 auto specIntFinal = std::make_unique<RooFormulaVar>(
name.c_str(),
"@0/@1",
RooArgList(*specializedPartCust,*specializedRatio)) ;
992 specIntFinal->addOwnedComponents(std::move(specializedPartCust));
993 specIntFinal->addOwnedComponents(std::move(specializedRatio));
995 denListList[*iter].addOwned(std::move(specIntFinal));
1011 tmp.add(*specRatio) ;
1013 auto specDenProd = std::make_unique<RooProduct>(pname.c_str(),pname.c_str(),tmp) ;
1014 std::unique_ptr<RooAbsReal> specInt;
1017 specInt = std::unique_ptr<RooAbsReal>{specDenProd->createIntegral((
static_cast<RooRealIntegral*
>(den))->intVars(),iter->c_str())};
1018 specInt->addOwnedComponents(std::move(specDenProd));
1022 specInt = std::unique_ptr<RooAbsReal>{specDenProd->
createIntegral(origInt->intVars(),iter->c_str())};
1023 specInt->addOwnedComponents(std::move(specDenProd));
1025 throw string(
"this should not happen") ;
1029 string name =
Form(
"%s_divided_by_ratio",specInt->GetName()) ;
1030 auto specIntFinal = std::make_unique<RooFormulaVar>(
name.c_str(),
"@0/@1",
RooArgList(*specInt,*specRatio)) ;
1031 specIntFinal->addOwnedComponents(std::move(specInt));
1032 specIntFinal->addOwnedComponents(std::move(specRatio));
1033 denListList[*iter].addOwned(std::move(specIntFinal));
1044 if (nomList.empty()) {
1048 string name = std::string{
GetName()} +
"_numerator";
1051 std::unique_ptr<RooAbsReal> numerator = std::make_unique<RooProduct>(
name.c_str(),
name.c_str(),nomList) ;
1054 for (map<string,RooArgSet>::iterator iter = denListList.begin() ; iter != denListList.end() ; ++iter) {
1058 prod_comp->addOwnedComponents(std::move(iter->second));
1059 products.add(*prod_comp) ;
1063 norm->addOwnedComponents(products) ;
1065 if (!specIntDeps.empty()) {
1068 string namesr =
Form(
"SPEC_RATIO(%s,%s)",numerator->GetName(),norm->GetName()) ;
1070 ndr->addOwnedComponents(std::move(numerator));
1073 numerator = std::unique_ptr<RooAbsReal>{ndr->createIntegral(specIntDeps,specIntRange.c_str())};
1097 std::unique_ptr<RooAbsReal> numint_spec{
specializeIntegral(*numint,targetRangeName)};
1099 std::unique_ptr<RooAbsReal> ret = std::make_unique<RooFormulaVar>(
Form(
"ratio(%s,%s)",numint_spec->GetName(),denint->GetName()),
"@0/@1",
RooArgList(*numint_spec,*denint)) ;
1100 ret->addOwnedComponents(std::move(numint_spec));
1125 std::stringstream errMsg;
1126 errMsg <<
"specializeIntegral: unknown input type " <<
input.ClassName() <<
"::" <<
input.GetName();
1127 throw std::runtime_error(errMsg.str());
1138 for(
auto * term : static_range_cast<RooArgSet*>(factorized.terms)) {
1139 groupedTerms.emplace_back();
1140 groupedTerms.back().emplace_back(term) ;
1145 for(
auto * impDeps : static_range_cast<RooArgSet*>(factorized.imps)) {
1146 allImpDeps.
add(*impDeps,
false) ;
1151 for(
auto * intDeps : static_range_cast<RooArgSet*>(factorized.ints)) {
1152 allIntDeps.
add(*intDeps,
false) ;
1155 outerIntDeps.removeAll() ;
1156 outerIntDeps.add(*std::unique_ptr<RooArgSet>{allIntDeps.selectCommon(allImpDeps)});
1159 for(
RooAbsArg * outerIntDep : outerIntDeps) {
1162 std::vector<RooArgSet*>* newGroup = nullptr ;
1165 bool needMerge = false ;
1166 auto group = groupedTerms.begin();
1167 auto nGroups = groupedTerms.size();
1168 for (
size_t iGroup = 0; iGroup < nGroups; ++iGroup) {
1171 for (
auto const& term2 : *
group) {
1173 Int_t termIdx = factorized.terms.IndexOf(term2) ;
1174 if (factorized.termNormDeps(termIdx)->contains(*outerIntDep) ||
1175 factorized.termIntDeps(termIdx)->contains(*outerIntDep) ||
1176 factorized.termImpDeps(termIdx)->contains(*outerIntDep)) {
1184 if (newGroup==
nullptr) {
1185 groupedTerms.emplace_back() ;
1186 newGroup = &groupedTerms.back() ;
1190 for (
auto& term2 : *
group) {
1191 newGroup->emplace_back(term2) ;
1212 bool forceWrap)
const
1219 if (!termNSet.empty() && termNSet.size()==termISet.size() && isetRangeName==
nullptr) {
1226 if (nset && termNSet.
empty()) {
1231 if (iset && !termISet.empty()) {
1232 if (term->size()==1) {
1239 ret.x0 = std::unique_ptr<RooAbsReal>{pdf->
createIntegral(termISet,termNSet,isetRangeName)}.release();
1241 ret.x0->setStringAttribute(
"PROD_TERM_TYPE",
"IIIa") ;
1246 ret.x1 = std::unique_ptr<RooAbsReal>{pdf->
createIntegral(termISet,isetRangeName)};
1257 const std::string
name =
makeRGPPName(
"GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
1258 ret.x0 =
new RooGenProdProj(
name.c_str(),
name.c_str(),*term,termISet,termNSet,isetRangeName) ;
1259 ret.x0->setStringAttribute(
"PROD_TERM_TYPE",
"IIIb") ;
1269 ret.x1 = std::unique_ptr<RooAbsReal>{tmp_prod->createIntegral(termISet,isetRangeName)};
1270 ret.x2 = std::unique_ptr<RooAbsReal>{tmp_prod->createIntegral(termNSet,
normRange())};
1278 if (nset && !nset->
empty() && term->size()>1) {
1281 const std::string
name =
makeRGPPName(
"GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
1282 ret.x0 =
new RooGenProdProj(
name.c_str(),
name.c_str(),*term,termISet,termNSet,isetRangeName,
normRange()) ;
1285 ret.x0->setStringAttribute(
"PROD_TERM_TYPE",
"IVa") ;
1295 ret.x1 = std::unique_ptr<RooAbsReal>{tmp_prod->createIntegral(termISet,isetRangeName)};
1296 ret.x2 = std::unique_ptr<RooAbsReal>{tmp_prod->createIntegral(termNSet,
normRange())};
1303 for (
auto* pdf : static_range_cast<RooAbsPdf*>(*term)) {
1305 ret.isOwned =
false;
1316 ret0->setStringAttribute(
"PROD_TERM_TYPE",
"IVb") ;
1318 ret.x1 = std::unique_ptr<RooAbsReal>{pdf->createIntegral(
RooArgSet())};
1319 ret.x2 = std::unique_ptr<RooAbsReal>{pdf->createIntegral(termNSet,
normRange())};
1323 coutE(Eval) <<
"RooProdPdf::processProductTerm(" <<
GetName() <<
") unidentified term!!!" << std::endl ;
1334 const RooArgSet& nset,
const char* isetRangeName)
const
1338 std::ostringstream os;
1344 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(term)) {
1345 if (!first) os <<
"_X_";
1347 os << pdf->GetName();
1382 const RooArgSet* normSet,
const char* rangeName)
const
1387 analVars.add(allVars) ;
1415 if (cache==
nullptr) {
1452 coutF(Generation) <<
"Requesting expected number of events from a RooProdPdf that does not contain an extended p.d.f" << std::endl ;
1453 throw std::logic_error(std::string(
"RooProdPdf ") +
GetName() +
" could not be extended.");
1462 coutF(Generation) <<
"Requesting expected number of events from a RooProdPdf that does not contain an extended p.d.f" << std::endl ;
1463 throw std::logic_error(std::string(
"RooProdPdf ") +
GetName() +
" could not be extended.");
1474 const RooArgSet* auxProto,
bool verbose)
const
1492 for (
auto const* arg : directVars) {
1498 std::vector<Int_t> code;
1500 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1502 Int_t pdfCode = pdf->getGenerator(directSafe,pdfDirect,staticInitOK);
1503 code.push_back(pdfCode);
1505 generateVars.add(pdfDirect) ;
1510 if (!generateVars.empty()) {
1515 return std::distance(
_genCode.begin(), found) + 1;
1517 _genCode.emplace_back(std::move(code));
1533 const std::vector<int>& codeList =
_genCode[code-1];
1535 for (
auto* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1536 if (codeList[i]!=0) {
1537 pdf->initGenerator(codeList[i]) ;
1554 const std::vector<Int_t>& codeList =
_genCode[code-1];
1556 for (
auto* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1557 if (codeList[i]!=0) {
1558 pdf->generateEvent(codeList[i]) ;
1572 ret.
add(_partList) ;
1575 if (_rearrangedNum) ret.add(*_rearrangedNum) ;
1576 if (_rearrangedDen) ret.add(*_rearrangedDen) ;
1589 os <<
indent <<
"RooProdPdf begin partial integral cache" << std::endl ;
1592 auto indent2 = std::string(
indent) +
"[" + std::to_string(curElem) +
"]";
1593 for(
auto const& arg : _partList) {
1594 arg->printCompactTree(os,indent2.c_str()) ;
1597 if (curElem==maxElem) {
1598 os <<
indent <<
"RooProdPdf end partial integral cache" << std::endl ;
1615 for (
auto* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1617 if (pdf->dependsOn(arg)) {
1621 if (thePdf)
return false ;
1627 return thePdf?(thePdf->isDirectGenSafe(arg)):false ;
1648 for(
auto arg : pdfs) {
1651 coutW(InputArguments) <<
"RooProdPdf::addPdfs(" <<
GetName() <<
") list arg "
1652 << arg->GetName() <<
" is not a PDF, ignored" << std::endl ;
1663 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset"));
1667 if (numExtended>1) {
1668 coutW(InputArguments) <<
"RooProdPdf::addPdfs(" <<
GetName()
1669 <<
") WARNING: multiple components with extended terms detected,"
1670 <<
" product will not be extendable." << std::endl ;
1710 std::vector<TNamed const*> ptrs;
1711 ptrs.reserve(col.size());
1713 ptrs.push_back(arg->namePtr());
1715 std::sort(ptrs.begin(), ptrs.end());
1719bool sortedNamePtrsOverlap(std::vector<TNamed const*>
const& ptrsA, std::vector<TNamed const*>
const& ptrsB)
1721 auto pA = ptrsA.begin();
1722 auto pB = ptrsB.begin();
1723 while (pA != ptrsA.end() && pB != ptrsB.end()) {
1726 }
else if (*pB < *pA) {
1746std::unique_ptr<RooArgSet>
1749 auto constraints = std::make_unique<RooArgSet>(
"constraints");
1752 auto observablesNamePtrs = sortedNamePtrs(observables);
1753 auto constrainedParamsNamePtrs = sortedNamePtrs(constrainedParams);
1756 for (std::size_t iPdf = 0; iPdf <
_pdfList.
size(); ++iPdf) {
1760 pdf->getParameters(
nullptr, tmp);
1765 bool isConstraint =
false;
1768 auto tmpNamePtrs = sortedNamePtrs(tmp);
1780 isConstraint = !sortedNamePtrsOverlap(tmpNamePtrs, observablesNamePtrs) &&
1781 sortedNamePtrsOverlap(tmpNamePtrs, constrainedParamsNamePtrs);
1784 constraints->add(*pdf) ;
1791 tmp.remove(observables,
false,
true);
1792 pdfParams.add(tmp,
true) ;
1811 for (std::size_t iPdf = 0; iPdf <
_pdfList.
size(); ++iPdf) {
1816 if (
static_cast<int>(iPdf) ==
_extendedIndex || pdf->dependsOn(observables)) {
1818 pdf->getParameters(&observables, tmp);
1819 connectedPars->
add(tmp) ;
1822 return connectedPars ;
1855 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1856 if (std::list<double>* hint = pdf->plotSamplingHint(obs,xlo,xhi)) {
1871 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1872 if (pdf->dependsOn(obs) && !pdf->isBinnedDistribution(obs)) {
1890 for (
auto const* pdf : static_range_cast<RooAbsPdf*>(
_pdfList)) {
1891 if (std::list<double>* hint = pdf->binBoundaries(obs,xlo,xhi)) {
1908 if (i>0) os <<
" * " ;
1911 if (!ncset->empty()) {
1912 if (
string(
"nset")==ncset->GetName()) {
1917 for (
auto const* arg : *ncset) {
1923 os << arg->GetName() ;
1940 cxcoutD(LinkStateMgmt) <<
"RooProdPdf::redirectServersHook(" <<
GetName() <<
"): removing REMOVAL_DUMMY" << std::endl ;
1955 for(std::unique_ptr<RooArgSet>
const& normSet :
_pdfNSetList) {
1959 normSet->replace(arg, std::unique_ptr<RooAbsArg>{newArg->cloneTree()});
1969 os <<
"_partList\n";
1970 os << getColonSeparatedNameString(_partList) <<
"\n";
1972 os << getColonSeparatedNameString(_numList) <<
"\n";
1974 os << getColonSeparatedNameString(_denList) <<
"\n";
1975 os <<
"_ownedList\n";
1976 os << getColonSeparatedNameString(_ownedList) <<
"\n";
1977 os <<
"_normList\n";
1978 for(
auto const& set : _normList) {
1979 os << getColonSeparatedNameString(*set) <<
"\n";
1981 os <<
"_isRearranged" <<
"\n";
1982 os << _isRearranged <<
"\n";
1983 os <<
"_rearrangedNum" <<
"\n";
1984 if(_rearrangedNum) {
1985 os << getColonSeparatedNameString(*_rearrangedNum) <<
"\n";
1987 os <<
"nullptr" <<
"\n";
1989 os <<
"_rearrangedDen" <<
"\n";
1990 if(_rearrangedDen) {
1991 os << getColonSeparatedNameString(*_rearrangedDen) <<
"\n";
1993 os <<
"nullptr" <<
"\n";
1999 if (normSet.empty())
2002 if (pdfNset && !pdfNset->empty()) {
2003 std::unique_ptr<RooArgSet> out;
2004 if (0 == strcmp(
"cset", pdfNset->GetName())) {
2008 out = std::make_unique<RooArgSet>(normSet);
2010 out->selectCommon(*pdfNset, common);
2011 out->remove(common);
2013 out = std::make_unique<RooArgSet>(*pdfNset);
2018 if (!arg->getStringAttribute(
"__prefix__")) {
2019 arg->SetName((std::string(prefix) + arg->GetName()).c_str());
2020 arg->setStringAttribute(
"__prefix__", prefix);
2030std::unique_ptr<RooAbsArg>
2033 if (ctx.likelihoodMode()) {
2035 if (binnedInfo.binnedPdf && binnedInfo.binnedPdf !=
this) {
2036 return binnedInfo.binnedPdf->compileForNormSet(normSet, ctx);
2040 std::unique_ptr<RooProdPdf> prodPdfClone{
static_cast<RooProdPdf *
>(this->
Clone())};
2058 std::vector<std::pair<RooAbsPdf *, std::string>> restoreNormRanges;
2059 if (
const char *prodNormRange =
normRange()) {
2060 std::vector<std::string> rangeTokens =
ROOT::Split(prodNormRange,
",",
true);
2061 for (
auto *pdf : static_range_cast<RooAbsPdf *>(prodPdfClone->_pdfList)) {
2063 pdf->getObservables(&normSet, pdfObs);
2064 bool rangeDefined = !pdfObs.
empty();
2067 for (
auto const &token : rangeTokens) {
2068 if (!lval || !lval->hasRange(token.c_str())) {
2069 rangeDefined =
false;
2073 if (rangeDefined && std::string(pdf->normRange() ? pdf->normRange() :
"") != prodNormRange) {
2074 restoreNormRanges.emplace_back(pdf, pdf->normRange() ? pdf->normRange() :
"");
2075 pdf->setNormRange(prodNormRange);
2087 std::unordered_set<std::string> jointlyNormalized;
2088 if (!normSet.empty()) {
2090 prodPdfClone->factorizeProduct(normSet,
RooArgSet{}, factorized);
2091 for (
auto *term : static_range_cast<RooArgSet *>(factorized.terms)) {
2092 if (term->size() > 1) {
2094 jointlyNormalized.insert(pdf->GetName());
2100 for (
const auto server : prodPdfClone->servers()) {
2102 RooArgSet const &nset = nsetForServer ? *nsetForServer : normSet;
2105 server->getObservables(&nset, depList);
2107 ctx.compileServer(*server, *prodPdfClone, depList);
2110 for (
auto const &[pdf, oldRange] : restoreNormRanges) {
2111 pdf->setNormRange(oldRange.empty() ? nullptr : oldRange.c_str());
2118 std::unordered_map<RooAbsArg *, RooAbsArg *> unwrapped;
2119 for (
RooAbsArg *pdf : prodPdfClone->_pdfList) {
2121 if (normalized && jointlyNormalized.count(normalized->pdf().GetName())) {
2122 unwrapped[normalized] =
const_cast<RooAbsPdf *
>(&normalized->pdf());
2125 std::unique_ptr<RooProdPdf> cacheProdPdf;
2126 if (!unwrapped.empty()) {
2127 cacheProdPdf.reset(
static_cast<RooProdPdf *
>(prodPdfClone->Clone()));
2137 auto fixedProdPdf = std::make_unique<RooFit::Detail::RooFixedProdPdf>(
2138 std::move(prodPdfClone), ctx.mapToCompiled(normSet), cacheProdPdf.get());
2139 ctx.markAsCompiled(*fixedProdPdf);
2141 return fixedProdPdf;
2152RooFixedProdPdf::RooFixedProdPdf(std::unique_ptr<RooProdPdf> &&prodPdf,
RooArgSet const &normSet,
2154 :
RooAbsPdf(prodPdf->GetName(), prodPdf->GetTitle()),
2156 _servers(
"!servers",
"List of servers", this),
2157 _prodPdf{std::move(prodPdf)}
2159 auto cache = (cacheProdPdf ? cacheProdPdf :
_prodPdf.get())->createCacheElem(&
_normSet,
nullptr);
2164 cache->_ownedList.releaseOwnership();
2165 cache->_numList.releaseOwnership();
2166 cache->_denList.releaseOwnership();
2181 for (
RooAbsArg *arg : cache->_partList) {
2188 _normSet{other._normSet},
2189 _servers(
"!servers", this, other._servers),
2190 _prodPdf{static_cast<
RooProdPdf *>(other._prodPdf->Clone())},
2191 _isRearranged{other._isRearranged}
2206 std::vector<std::span<const double>> factors;
2209 auto span = ctx.at(arg);
2210 factors.push_back(span);
2212 std::array<double, 1> special{
static_cast<double>(factors.size())};
2223 for (
auto *arg : static_range_cast<RooAbsReal *>(*
partList())) {
2224 value *= arg->getVal();
ROOT::RRangeCast< T, false, Range_t > static_range_cast(Range_t &&coll)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
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.
Common abstract base class for objects that represent a value and a "shape" in RooFit.
RooExpensiveObjectCache & expensiveObjectCache() const
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...
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'.
bool redirectServers(const RooAbsCollection &newServerList, bool mustReplaceAll=false, bool nameChange=false, bool isRecursionStep=false)
Replace all direct servers of this object with the new servers in newServerList.
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.
bool contains(const char *name) const
Check if collection contains an argument with a specific name.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
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
const_iterator begin() const
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 set with for above integral
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
Hook function intercepting redirectServer calls.
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...
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...
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 ...
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.
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=nullptr) const override
RooCustomizer is a factory class to produce clones of a prototype composite PDF object with the same ...
Container class to hold unbinned data.
void markAsCompiled(RooAbsArg &arg) const
A RooProdPdf with a fixed normalization set can be replaced by this class.
RooArgSet const * partList() const
double evaluate() const override
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
void doEval(RooFit::EvalContext &ctx) const override
Evaluate product of PDFs in batch mode.
std::unique_ptr< RooProdPdf > _prodPdf
RooAbsReal const * rearrangedDen() const
RooFixedProdPdf(std::unique_ptr< RooProdPdf > &&prodPdf, RooArgSet const &normSet, RooProdPdf const *cacheProdPdf=nullptr)
RooAbsReal const * rearrangedNum() const
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
void Delete(Option_t *o=nullptr) override
Remove all elements in collection and delete all elements NB: Collection does not own elements,...
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.
std::unique_ptr< 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.
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
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
void factorizeProduct(const RooArgSet &normSet, const RooArgSet &intSet, Factorized &factorized) const
Factorize product in irreducible terms for given choice of integration/normalization.
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
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.
TNamed * _refRangeName
Reference range name for interpretation of conditional products.
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
! The cache manager
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...
ProcessProductTermOutput processProductTerm(const RooArgSet *nset, const RooArgSet *iset, const char *isetRangeName, const RooArgSet *term, const RooArgSet &termNSet, const RooArgSet &termISet, bool forceWrap=false) const
Calculate integrals of factorized product terms over observables iset while normalized to observables...
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.
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.
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
bool redirectServersHook(const RooAbsCollection &, bool, bool, bool) override
Implement support for node removal.
void groupProductTerms(std::list< std::vector< RooArgSet * > > &groupedTerms, RooArgSet &outerIntDeps, Factorized const &factorized) const
Group product into terms that can be calculated independently.
std::vector< std::vector< int > > _genCode
! Registry of composite direct generator codes
void initGenerator(Int_t code) override
Forward one-time initialization call to component generation initialization methods.
void generateEvent(Int_t code) override
Generate a single event with configuration specified by 'code' Defer internal generation to component...
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 ...
const RooAbsReal & integrand() const
Variable that can be changed from the outside.
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
Mother of all ROOT objects.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
RooConstVar & RooConst(double val)
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
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=':')