104 _pdfList(
"!pdfs",
"List of PDFs",this),
139 _pdfList(
"!pdfs",
"List of PDFs",this),
146 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
152 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
157 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" <<
GetName()
158 <<
") multiple components with extended terms detected,"
159 <<
" product will not be extendible." << endl ;
192 _pdfList(
"!pdfs",
"List of PDFs",this),
200 Int_t numExtended(0) ;
204 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" <<
GetName() <<
") list arg "
205 << arg->
GetName() <<
" is not a PDF, ignored" << endl ;
210 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
220 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" <<
GetName()
221 <<
") WARNING: multiple components with extended terms detected,"
222 <<
" product will not be extendible." << endl ;
273 _pdfList(
"!pdfs",
"List of PDFs",this),
303 _pdfList(
"!pdfList",
"List of PDFs",this),
329 _pdfList(
"!pdfs",
"List of PDFs",this),
346 _cacheMgr(other._cacheMgr,this),
347 _genCode(other._genCode),
348 _cutOff(other._cutOff),
349 _pdfList(
"!pdfs",this,other._pdfList),
350 _extendedIndex(other._extendedIndex),
351 _useDefaultGen(other._useDefaultGen),
352 _refRangeName(other._refRangeName),
353 _selfNorm(other._selfNorm),
354 _defNormSet(other._defNormSet)
358 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(nset->GetName()));
372 Int_t numExtended(0) ;
375 for(
auto const* pdf : static_range_cast<RooAbsPdf*>(fullPdfSet)) {
377 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset")) ;
379 if (pdf->canBeExtended()) {
391 if (0 == strcmp(carg->
GetName(),
"Conditional")) {
402 _pdfNSetList.emplace_back(std::make_unique<RooArgSet>(0 == argType ?
"nset" :
"cset"));
412 }
else if (0 != strlen(carg->
GetName())) {
413 coutW(InputArguments) <<
"Unknown arg: " << carg->
GetName() << endl ;
419 coutW(InputArguments) <<
"RooProdPdf::RooProdPdf(" <<
GetName()
420 <<
") WARNING: multiple components with extended terms detected,"
421 <<
" product will not be extendible." << endl ;
472 cxcoutD(Eval) <<
"RooProdPdf::calculate(" <<
GetName() <<
") rearranged product calculation"
486 const auto normSet = cache.
_normList[i].get();
488 const Double_t piVal = partInt.getVal(normSet->getSize() > 0 ? normSet :
nullptr);
504 auto span = dataMap.
at(i);
508 if(span.size() == 1)
continue;
509 pdfs.push_back(span);
519void eraseNullptrs(std::vector<T*>&
v) {
520 v.erase(std::remove_if(
v.begin(),
v.end(), [](T*
x){ return x == nullptr; } ),
v.end());
523void removeCommon(std::vector<RooAbsArg*> &
v, std::span<RooAbsArg * const> other) {
525 for (
auto const& arg : other) {
526 auto namePtrMatch = [&arg](
const RooAbsArg* elm) {
527 return elm !=
nullptr && elm->namePtr() == arg->namePtr();
530 auto found = std::find_if(
v.begin(),
v.end(), namePtrMatch);
531 if(found !=
v.end()) {
538void addCommon(std::vector<RooAbsArg*> &
v, std::vector<RooAbsArg*>
const& o1, std::vector<RooAbsArg*>
const& o2) {
540 for (
auto const& arg : o1) {
541 auto namePtrMatch = [&arg](
const RooAbsArg* elm) {
542 return elm->namePtr() == arg->namePtr();
545 if(std::find_if(o2.begin(), o2.end(), namePtrMatch) != o2.end()) {
563 std::vector<RooArgSet> depAllList;
564 std::vector<RooArgSet> depIntNoNormList;
572 std::vector<RooAbsArg*> pdfIntNoNormDeps;
573 std::vector<RooAbsArg*> pdfIntSet;
574 std::vector<RooAbsArg*> pdfNSet;
575 std::vector<RooAbsArg*> pdfCSet;
576 std::vector<RooAbsArg*> pdfNormDeps;
577 std::vector<RooAbsArg*> pdfAllDeps;
580 for(std::size_t iPdf = 0; iPdf <
_pdfList.
size(); ++iPdf) {
591 RooArgSet pdfLeafList(
"leafNodeServerList") ;
593 auto getObservablesOfCurrentPdf = [&pdfLeafList](
594 std::vector<RooAbsArg*> & out,
596 for (
const auto arg : pdfLeafList) {
597 if (arg->dependsOnValue(dataList) && arg->isLValue()) {
604 if (0 == strcmp(
"cset", pdfNSetOrig.
GetName())) {
605 getObservablesOfCurrentPdf(pdfNSet, normSet);
606 removeCommon(pdfNSet, pdfNSetOrig.
get());
607 pdfCSet = pdfNSetOrig.
get();
610 getObservablesOfCurrentPdf(pdfNSet, pdfNSetOrig);
618 getObservablesOfCurrentPdf(pdfAllDeps, normSet);
624 if (!pdfNSet.empty()) {
626 addCommon(pdfNormDeps, pdfAllDeps, pdfNSet);
629 pdfNormDeps = pdfAllDeps;
635 getObservablesOfCurrentPdf(pdfIntSet, intSet) ;
638 if (pdfNormDeps.empty() && !pdfCSet.empty()) {
639 removeCommon(pdfIntSet, pdfCSet);
643 pdfIntNoNormDeps.clear();
644 pdfIntNoNormDeps = pdfIntSet;
645 removeCommon(pdfIntNoNormDeps, pdfNormDeps);
652 auto lIter = termList.
begin();
653 auto ldIter = normList.
begin();
654 for(;lIter != termList.
end(); (++lIter, ++ldIter, ++j)) {
655 termNormDeps =
static_cast<RooArgSet*
>(*ldIter);
663 bool normOverlap = termNormDeps->
overlaps(pdfNormDeps.begin(), pdfNormDeps.end());
670 termNormDeps->
add(pdfNormDeps.begin(), pdfNormDeps.end(),
false);
671 depAllList[j].add(pdfAllDeps.begin(), pdfAllDeps.end(),
false);
673 termIntDeps->
add(pdfIntSet.begin(), pdfIntSet.end(),
false);
675 if (termIntNoNormDeps) {
676 termIntNoNormDeps->
add(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
false);
678 termIntNoNormDeps->
add(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
false);
685 if (!(pdfNormDeps.empty() && pdfAllDeps.empty() &&
686 pdfIntSet.empty()) || 0 == normSet.
getSize()) {
689 termNormDeps =
new RooArgSet(
"termNormDeps");
690 depAllList.emplace_back(pdfAllDeps.begin(), pdfAllDeps.end(),
"termAllDeps");
691 termIntDeps =
new RooArgSet(pdfIntSet.begin(), pdfIntSet.end(),
"termIntDeps");
692 depIntNoNormList.emplace_back(pdfIntNoNormDeps.begin(), pdfIntNoNormDeps.end(),
"termIntNoNormDeps");
693 termIntNoNormDeps = &depIntNoNormList.back();
696 termNormDeps->
add(pdfNormDeps.begin(), pdfNormDeps.end(),
false);
699 normList.
Add(termNormDeps);
700 intList.
Add(termIntDeps);
709 auto lIter = termList.
begin();
710 auto ldIter = normList.
begin();
711 for(;lIter != termList.
end(); (++lIter, ++ldIter, ++i)) {
712 normDeps =
static_cast<RooArgSet*
>(*ldIter);
722 auto crossDeps = std::unique_ptr<RooAbsCollection>{depIntNoNormList[i].selectCommon(*normDeps)};
723 crossDepList.
Add(crossDeps->snapshot());
747 Int_t sterileIdx(-1);
771 std::list<std::vector<RooArgSet*>> groupedList;
779 map<string, RooArgSet> ratioTerms;
780 for (
auto const&
group : groupedList) {
781 if (1 ==
group.size()) {
789 RooArgSet termNSet(*norm), termImpSet(*imps);
800 RooFIter niter = termNSet.fwdIterator();
817 if (!rangeIdentical ) {
820 ostringstream str; termImpSet.
printValue(str);
822 ratioTerms[str.str()].add(*ratio);
830 for (
auto const& term :
group) {
835 RooArgSet termNSet(*norm), termImpSet(*imps);
841 RooFIter niter = termNSet.fwdIterator();
856 if (!rangeIdentical ) {
859 ostringstream str; termImpSet.
printValue(str);
860 ratioTerms[str.str()].add(*ratio);
870 for (
auto const&
group : groupedList) {
871 if (1 ==
group.size()) {
877 RooArgSet termNSet(*norm), termImpSet(*imps);
880 ostringstream str; termNSet.printValue(str);
881 if (ratioTerms[str.str()].getSize() > 0) {
883 term->
add(ratioTerms[str.str()]);
887 for (
auto const& term :
group) {
891 RooArgSet termNSet(*norm), termImpSet(*imps);
894 ostringstream str; termNSet.printValue(str);
895 if (ratioTerms[str.str()].getSize() > 0) {
897 term->add(ratioTerms[str.str()]);
903 for (
auto const&
group : groupedList) {
907 if (1 ==
group.size()) {
917 RooArgSet termNSet, termISet, termXSet, termImpSet;
920 termISet.
add(*integ);
924 termXSet.
add(*xdeps);
925 termImpSet.
add(*imps);
934 vector<RooAbsReal*> func =
processProductTerm(nset, iset, isetRangeName, term, termNSet, termISet, isOwned);
949 RooArgSet compTermSet, compTermNorm, compTermNum, compTermDen;
950 for (
auto const& term :
group) {
958 RooArgSet termNSet, termISet, termXSet, termImpSet;
959 termISet.
add(*integ);
961 termXSet.
add(*xdeps);
962 termImpSet.
add(*imps);
974 vector<RooAbsReal*> func =
processProductTerm(nset, iset, isetRangeName, term, termNSet, termISet, isOwned,
kTRUE);
977 compTermSet.
add(*func[0]);
981 compTermNum.
add(*func[1]);
982 compTermDen.
add(*func[2]);
1001 const std::string prodname =
makeRGPPName(
"SPECPROD", compTermSet, outerIntDeps,
RooArgSet(), isetRangeName);
1005 const std::string intname =
makeRGPPName(
"SPECINT", compTermSet, outerIntDeps,
RooArgSet(), isetRangeName);
1014 RooProduct* prodtmp_num =
new RooProduct(prodname_num.c_str(), prodname_num.c_str(), compTermNum);
1020 RooProduct* prodtmp_den =
new RooProduct(prodname_den.c_str(), prodname_den.c_str(), compTermDen);
1025 string name =
Form(
"SPEC_RATIO(%s,%s)", prodname_num.c_str(), prodname_den.c_str());
1105 list<string> rangeComps ;
1110 char* token = R__STRTOK_R(buf,
",",&save) ;
1112 rangeComps.push_back(token) ;
1113 token = R__STRTOK_R(0,
",",&save) ;
1119 map<string,RooArgSet> denListList ;
1121 string specIntRange ;
1164 nomList.
add(*funcCust) ;
1166 nomList.
add(*func) ;
1187 origNumTerm.
add(*arg) ;
1195 nomList.
add(origNumTerm) ;
1202 for (list<string>::iterator iter = rangeComps.begin() ; iter != rangeComps.end() ; ++iter) {
1248 partCust = cust.
build() ;
1253 partCust = cust.
build() ;
1263 string name =
Form(
"%s_divided_by_ratio",specializedPartCust->
GetName()) ;
1266 denListList[*iter].add(*specIntFinal) ;
1287 tmp.
add(*specRatio) ;
1299 throw string(
"this should not happen") ;
1305 denListList[*iter].add(*specIntFinal) ;
1327 for (map<string,RooArgSet>::iterator iter = denListList.begin() ; iter != denListList.end() ; ++iter) {
1332 products.
add(*prod_comp) ;
1338 if (specIntDeps.
getSize()>0) {
1347 numerator = numtmp ;
1424 groupedTerms.emplace_back();
1425 groupedTerms.back().emplace_back(term) ;
1446 outerIntDeps.
add(*tmp) ;
1455 std::vector<RooArgSet*>* newGroup = nullptr ;
1459 auto group = groupedTerms.begin();
1460 auto nGroups = groupedTerms.size();
1461 for (
size_t iGroup = 0; iGroup < nGroups; ++iGroup) {
1464 for (
auto const& term2 : *
group) {
1471 if (termNormDeps->
contains(*outerIntDep) ||
1472 termIntDeps->
contains(*outerIntDep) ||
1473 termImpDeps->
contains(*outerIntDep)) {
1481 if (newGroup==
nullptr) {
1482 groupedTerms.emplace_back() ;
1483 newGroup = &groupedTerms.back() ;
1487 for (
auto& term2 : *
group) {
1488 newGroup->emplace_back(term2) ;
1521 vector<RooAbsReal*> ret(3) ; ret[0] = 0 ; ret[1] = 0 ; ret[2] = 0 ;
1537 if (nset && termNSet.
getSize()==0) {
1545 if (iset && termISet.
getSize()>0) {
1576 const std::string
name =
makeRGPPName(
"GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
1603 const std::string
name =
makeRGPPName(
"GENPROJ_",*term,termISet,termNSet,isetRangeName) ;
1636 name.Append(
"_NORM[") ;
1683 coutE(Eval) <<
"RooProdPdf::processProductTerm(" <<
GetName() <<
") unidentified term!!!" << endl ;
1694 const RooArgSet& nset,
const char* isetRangeName)
const
1698 std::ostringstream os(pfx);
1706 if (!
first) os <<
"_X_";
1743 const RooArgSet* normSet,
const char* rangeName)
const
1748 analVars.
add(allVars) ;
1823 coutF(Generation) <<
"Requesting expected number of events from a RooProdPdf that does not contain an extended p.d.f" << endl ;
1824 throw std::logic_error(std::string(
"RooProdPdf ") +
GetName() +
" could not be extended.");
1863 std::vector<Int_t> code;
1869 code.push_back(pdfCode);
1871 generateVars.
add(pdfDirect) ;
1876 if (generateVars.
getSize()>0) {
1878 return masterCode+1 ;
1899 if (codeList[i]!=0) {
1922 if (codeList[i]!=0) {
1954 os <<
indent <<
"RooProdPdf begin partial integral cache" << endl ;
1957 auto indent2 = std::string(
indent) +
"[" + std::to_string(curElem) +
"]";
1958 for(
auto const& arg : _partList) {
1959 arg->printCompactTree(os,indent2.c_str()) ;
1962 if (curElem==maxElem) {
1963 os <<
indent <<
"RooProdPdf end partial integral cache" << endl ;
1987 if (thePdf)
return kFALSE ;
2004 if (idx<0)
return 0 ;
2028 constraints.
add(*pdf) ;
2044 finalConstraints->
add(*pdf) ;
2046 coutI(Minimization) <<
"RooProdPdf::getConstraints(" <<
GetName() <<
") omitting term " << pdf->
GetName()
2047 <<
" as constraint term as it does not share any parameters with the other pdfs in product. "
2048 <<
"To force inclusion in likelihood, add an explicit Constrain() argument for the target parameter" << endl ;
2059 return finalConstraints ;
2076 if (arg->dependsOn(observables)) {
2077 RooArgSet* tmp = arg->getParameters(observables) ;
2078 connectedPars->
add(*tmp) ;
2082 return connectedPars ;
2092 if (!stripDisconnected) return ;
2093 if (!nset || nset->
getSize()==0) return ;
2101 for (
auto param : *params) {
2103 for (
auto term : plist) {
2104 if (term->dependsOnValue(*param)) {
2109 tostrip.
add(*param) ;
2213 if (parg->canNodeBeCached()==
Always) {
2214 trackNodes.
add(*parg) ;
2222 if (
string(
"nset")==pdf_nset->
GetName() && pdf_nset->
getSize()>0) {
2223 parg->setStringAttribute(
"CATNormSet",getColonSeparatedNameString(*pdf_nset).c_str()) ;
2225 if (
string(
"cset")==pdf_nset->
GetName()) {
2226 parg->setStringAttribute(
"CATCondSet",getColonSeparatedNameString(*pdf_nset).c_str()) ;
2229 coutW(Optimization) <<
"RooProdPdf::setCacheAndTrackHints(" <<
GetName() <<
") WARNING product pdf does not specify a normalization set for component " << parg->GetName() << endl ;
2244 if (i>0) os <<
" * " ;
2248 if (
string(
"nset")==ncset->
GetName()) {
2278 cxcoutD(LinkStateMgmt) <<
"RooProdPdf::redirectServersHook(" <<
GetName() <<
"): removing REMOVAL_DUMMY" << endl ;
2293 for(std::unique_ptr<RooArgSet>
const& normSet :
_pdfNSetList) {
2298 normSet->releaseOwnership();
2299 normSet->replace(*arg, *newArg->cloneTree());
2300 normSet->takeOwnership();
2311 os <<
"_partList\n";
2312 os << getColonSeparatedNameString(_partList) <<
"\n";
2314 os << getColonSeparatedNameString(_numList) <<
"\n";
2316 os << getColonSeparatedNameString(_denList) <<
"\n";
2317 os <<
"_ownedList\n";
2318 os << getColonSeparatedNameString(_ownedList) <<
"\n";
2319 os <<
"_normList\n";
2320 for(
auto const& set : _normList) {
2321 os << getColonSeparatedNameString(*set) <<
"\n";
2323 os <<
"_isRearranged" <<
"\n";
2324 os << _isRearranged <<
"\n";
2325 os <<
"_rearrangedNum" <<
"\n";
2326 if(_rearrangedNum) {
2327 os << getColonSeparatedNameString(*_rearrangedNum) <<
"\n";
2329 os <<
"nullptr" <<
"\n";
2331 os <<
"_rearrangedDen" <<
"\n";
2332 if(_rearrangedDen) {
2333 os << getColonSeparatedNameString(*_rearrangedDen) <<
"\n";
2335 os <<
"nullptr" <<
"\n";
2344 if(normSet.
empty())
return nullptr;
2346 if (pdfNset && !pdfNset->empty()) {
2347 if (0 == strcmp(
"cset", pdfNset->GetName())) {
2351 auto out = std::make_unique<RooArgSet>(normSet);
2354 out->remove(common);
2357 return std::make_unique<RooArgSet>(*pdfNset);
static void indent(ostringstream &buf, int indent_level)
char * Form(const char *fmt,...)
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=0, RooArgSet *set2=0, RooArgSet *set3=0, RooArgSet *set4=0)
Store given arrays of integer codes, and up to four RooArgSets in the registry (each setX pointer may...
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
RooExpensiveObjectCache & expensiveObjectCache() const
Bool_t dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=0, Bool_t valueOnly=kFALSE) const
Test whether we depend on (ie, are served by) any object in the specified collection.
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
virtual TObject * Clone(const char *newname=0) const
Make a clone of an object using the Streamer facility.
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'.
void treeNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=0, Bool_t doBranch=kTRUE, Bool_t doLeaf=kTRUE, Bool_t valueOnly=kFALSE, Bool_t recurseNonDerived=kFALSE) const
Fill supplied list with nodes of the arg tree, following all server links, starting with ourself as t...
void setAttribute(const Text_t *name, Bool_t value=kTRUE)
Set (default) or clear a named boolean attribute of this object.
void setOperMode(OperMode mode, Bool_t recurseADirty=kTRUE)
Set the operation mode of this node.
Bool_t getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
Bool_t dependsOnValue(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=0) const
Check whether this object depends on values from an element in the serverList.
RooArgSet * getComponents() const
Create a RooArgSet with all components (branch nodes) of the expression tree headed by this object.
RooArgSet * getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooAbsArg * findNewServer(const RooAbsCollection &newSet, Bool_t 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.
RooAbsCacheElement is the abstract base class for objects to be stored in RooAbsCache cache manager o...
RooAbsCollection is an abstract container object that can hold multiple RooAbsArg objects.
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
Storage_t const & get() const
Const access to the underlying stl container.
Bool_t contains(const RooAbsArg &var) const
Check if collection contains an argument with the same name as var.
Int_t index(const RooAbsArg *arg) const
Returns index of given arg, or -1 if arg is not in the collection.
RooFIter fwdIterator() const
One-time forward iterator.
bool overlaps(Iterator_t otherCollBegin, Iterator_t otherCollEnd) const
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Add an argument and transfer the ownership to the collection.
Storage_t::size_type size() const
RooAbsArg * first() const
void clear()
Clear contents. If the collection is owning, it will also delete the contents.
bool selectCommon(const RooAbsCollection &refColl, RooAbsCollection &outColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
const char * GetName() const
Returns name of object.
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.
virtual void printValue(std::ostream &os) const
Print value of collection, i.e.
RooAbsGenContext is the abstract base class for generator contexts of RooAbsPdf objects.
virtual void generateEvent(Int_t code)
Interface for generation of an event using the algorithm corresponding to the specified code.
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.
TString _normRange
MC generator configuration specific for this object.
RooArgSet const * _normSet
Normalization integral (owned by _normMgr)
virtual Int_t getGenerator(const RooArgSet &directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const
Load generatedVars with the subset of directVars that we can generate events for, and return a code t...
Bool_t canBeExtended() const
If true, PDF can provide extended likelihood term.
friend class RooRealIntegral
const char * normRange() const
virtual Bool_t isDirectGenSafe(const RooAbsArg &arg) const
Check if given observable can be safely generated using the pdfs internal generator mechanism (if tha...
virtual void initGenerator(Int_t code)
Interface for one-time initialization to setup the generator for the specified code.
RooAbsRealLValue is the common abstract base class for objects that represent a real value that may a...
virtual Double_t getMax(const char *name=0) const
Get maximum of currently defined range.
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...
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 ...
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 std::list< Double_t > * binBoundaries(RooAbsRealLValue &obs, Double_t xlo, Double_t xhi) const
Retrieve bin boundaries if this distribution is binned in obs.
Double_t getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
virtual std::list< Double_t > * plotSamplingHint(RooAbsRealLValue &obs, Double_t xlo, Double_t xhi) const
Interface for returning an optional hint for initial sampling points when constructing a curve projec...
virtual Bool_t isBinnedDistribution(const RooArgSet &) const
Tests if the distribution is binned. Unless overridden by derived classes, this always returns false.
RooAddition 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.
virtual void compute(cudaStream_t *, Computer, RestrictArr, size_t, const VarVector &, const ArgVector &={})=0
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=0, const TNamed *isetRangeName=0)
RooArgSet selectFromSet1(RooArgSet const &argSet, int index) const
Create RooArgSet contatining the objects that are both in the cached set 1.
T * getObjByIndex(Int_t index) const
Retrieve payload object by slot index.
RooArgSet selectFromSet2(RooArgSet const &argSet, int index) const
Create RooArgSet contatining the objects that are both in the cached set 2.
void reset()
Clear the cache.
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=0)
RooCmdArg is a named container for two doubles, two integers two object points and three string point...
const RooArgSet * getSet(Int_t idx) const
Return RooArgSet stored in slot idx.
Int_t getInt(Int_t idx) const
virtual TObject * clone(const char *newname) const
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 occurence of arg 'orig' with arg 'subst'.
RooAbsArg * build(const char *masterCatState, Bool_t verbose=kFALSE)
Build a clone of the prototype executing all registered 'replace' rules and 'split' rules for the mas...
RooDataSet is a container class to hold unbinned data.
A one-time forward iterator working on RooLinkedList or RooAbsCollection.
RooAbsArg * next()
Return next element or nullptr if at end.
auto & at(RooAbsArg const *arg, RooAbsArg const *=nullptr)
RooGenProdProj is an auxiliary class for RooProdPdf that calculates a general normalised projection o...
RooLinkedList is an collection class for internal use, storing a collection of RooAbsArg pointers in ...
TObject * At(int index) const
Return object stored in sequential position given by index.
RooLinkedListIterImpl end() const
RooFIter fwdIterator() const
Create a one-time-use forward iterator for this list.
void Delete(Option_t *o=0)
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.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE) override
Reimplementation of standard RooArgList::add()
virtual Bool_t remove(const RooAbsArg &var, Bool_t silent=kFALSE, Bool_t matchByNameOnly=kFALSE) override
Reimplementation of standard RooArgList::remove()
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
RooProdPdf is an efficient implementation of a product of PDFs of the form.
void rearrangeProduct(CacheElem &) const
virtual Double_t expectedEvents(const RooArgSet *nset) const
Return the expected number of events associated with the extendable input PDF in the product.
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.
void computeBatch(cudaStream_t *, double *output, size_t nEvents, RooFit::Detail::DataMap const &) const
Evaluate product of PDFs in batch mode.
Int_t getPartIntList(const RooArgSet *nset, const RooArgSet *iset, const char *isetRangeName=0) const
Return list of (partial) integrals of product terms for integration of p.d.f over observables iset wh...
RooProdPdf()
Default constructor.
virtual Bool_t checkObservables(const RooArgSet *nset) const
Obsolete.
std::vector< std::unique_ptr< RooArgSet > > _pdfNSetList
std::unique_ptr< RooArgSet > fillNormSetForServer(RooArgSet const &normSet, RooAbsArg const &server) const
Fills a RooArgSet to be used as the normalization set for a server, given a normalization set for thi...
Double_t _cutOff
Registry of composite direct generator codes.
void printMetaArgs(std::ostream &os) const
Customized printing of arguments of a RooProdPdf to more intuitively reflect the contents of the prod...
void writeCacheToStream(std::ostream &os, RooArgSet const *nset) const
double evaluate() const
Calculate current value of object.
Bool_t isBinnedDistribution(const RooArgSet &obs) const
If all components that depend on obs are binned that so is the product.
virtual Bool_t isDirectGenSafe(const RooAbsArg &arg) const
Forward determination of safety of internal generator code to component p.d.f that would generate the...
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &numVars, const RooArgSet *normSet, const char *rangeName=0) const
Determine which part (if any) of given integral can be performed analytically.
RooAbsReal * specializeIntegral(RooAbsReal &orig, const char *targetRangeName) const
virtual ExtendMode extendMode() const
If this product contains exactly one extendable p.d.f return the extension abilities of that p....
RooObjCacheManager _cacheMgr
virtual void initGenerator(Int_t code)
Forward one-time initialization call to component generation initialization methods.
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()
Double_t analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=0) const
Return analytical integral defined by given scenario code.
virtual ~RooProdPdf()
Destructor.
virtual void getParametersHook(const RooArgSet *, RooArgSet *, Bool_t stripDisconnected) const
RooArgSet * findPdfNSet(RooAbsPdf const &pdf) const
Look up user specified normalization set for given input PDF component.
RooAbsReal * makeCondPdfRatioCorr(RooAbsReal &term, const RooArgSet &termNset, const RooArgSet &termImpSet, const char *normRange, const char *refRange) const
For single normalization ranges.
virtual void setCacheAndTrackHints(RooArgSet &)
Label OK'ed components of a RooProdPdf with cache-and-track, and label all RooProdPdf descendants wit...
virtual RooArgSet * getConstraints(const RooArgSet &observables, RooArgSet &constrainedParams, Bool_t stripDisconnected) const
Return all parameter constraint p.d.f.s on parameters listed in constrainedParams.
friend class RooProdGenContext
virtual Int_t getGenerator(const RooArgSet &directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const
Query internal generation capabilities of component p.d.f.s and aggregate capabilities into master co...
virtual void selectNormalizationRange(const char *rangeName=0, Bool_t force=kFALSE)
Interface function used by test statistics to freeze choice of range for interpretation of conditiona...
RooArgSet * getConnectedParameters(const RooArgSet &observables) const
Return all parameter constraint p.d.f.s on parameters listed in constrainedParams.
Double_t calculate(const RooProdPdf::CacheElem &cache, Bool_t verbose=kFALSE) const
Calculate running product of pdfs terms, using the supplied normalization set in 'normSetList' for ea...
virtual std::list< Double_t > * plotSamplingHint(RooAbsRealLValue &obs, Double_t xlo, Double_t xhi) const
Forward the plot sampling hint from the p.d.f. that defines the observable obs.
RooAbsReal * specializeRatio(RooFormulaVar &input, const char *targetRangeName) const
CacheElem * getCacheElem(RooArgSet const *nset) const
The cache manager.
Bool_t redirectServersHook(const RooAbsCollection &, Bool_t, Bool_t, Bool_t)
Implement support for node removal.
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)
virtual Bool_t forceAnalyticalInt(const RooAbsArg &dep) const
Force RooRealIntegral to offer all observables for internal integration.
virtual TObject * clone(const char *newname) const
virtual RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=0, const RooArgSet *auxProto=0, Bool_t verbose=kFALSE) const
Return generator context optimized for generating events from product p.d.f.s.
void initializeFromCmdArgList(const RooArgSet &fullPdfSet, const RooLinkedList &l)
Initialize RooProdPdf configuration from given list of RooCmdArg configuration arguments and set of '...
virtual void generateEvent(Int_t code)
Generate a single event with configuration specified by 'code' Defer internal generation to component...
std::vector< RooAbsReal * > processProductTerm(const RooArgSet *nset, const RooArgSet *iset, const char *isetRangeName, const RooArgSet *term, const RooArgSet &termNSet, const RooArgSet &termISet, Bool_t &isOwned, Bool_t forceWrap=kFALSE) const
Calculate integrals of factorized product terms over observables iset while normalized to observables...
virtual std::list< Double_t > * binBoundaries(RooAbsRealLValue &, Double_t, Double_t) const
Forward the plot sampling hint from the p.d.f. that defines the observable obs.
A RooProduct represents the product of a given set of RooAbsReal objects.
RooRealIntegral performs hybrid numerical/analytical integrals of RooAbsReal objects.
RooArgSet intVars() const
const RooAbsReal & integrand() const
RooRealVar represents a variable that can be changed from the outside.
The TNamed class is the base class for all named ROOT classes.
virtual const char * GetName() const
Returns name of object.
Mother of all ROOT objects.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
RooConstVar & RooConst(Double_t val)
std::vector< RooSpan< const double > > VarVector
R__EXTERN RooBatchComputeInterface * dispatchCUDA
R__EXTERN RooBatchComputeInterface * dispatchCPU
This dispatch pointer points to an implementation of the compute library, provided one has been loade...
std::vector< double > ArgVector
std::string getColonSeparatedNameString(RooArgSet const &argSet)
Create a string with all sorted names of RooArgSet elements separated by colons.
static void output(int code)