93 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
110 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
111 _refCoefRangeName(0),
113 _projCacheMgr(this,10),
115 _pdfList(
"!pdfs",
"List of PDFs",this),
116 _coefList(
"!coefficients",
"List of coefficients",this),
134 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
135 _refCoefRangeName(0),
137 _projCacheMgr(this,10),
139 _pdfList(
"!pdfs",
"List of PDFs",this),
140 _coefList(
"!coefficients",
"List of coefficients",this),
169 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
170 _refCoefRangeName(0),
172 _projCacheMgr(this,10),
174 _pdfList(
"!pdfs",
"List of PDFs",this),
175 _coefList(
"!coefficients",
"List of coefficients",this),
182 <<
") number of pdfs and coefficients inconsistent, must have Npdf=Ncoef or Npdf=Ncoef+1" << endl ;
186 if (recursiveFractions && inPdfList.
getSize()!=inCoefList.
getSize()+1) {
188 <<
") WARNING inconsistent input: recursive fractions options can only be used if Npdf=Ncoef+1, ignoring recursive fraction setting" << endl ;
196 for (
auto i = 0u; i < inCoefList.
size(); ++i) {
197 auto coef =
dynamic_cast<RooAbsReal*
>(inCoefList.
at(i));
198 auto pdf =
dynamic_cast<RooAbsPdf*
>(inPdfList.
at(i));
199 if (inPdfList.
at(i) ==
nullptr) {
201 <<
") number of pdfs and coefficients inconsistent, must have Npdf=Ncoef or Npdf=Ncoef+1" << endl ;
205 coutE(
InputArguments) <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") coefficient " << (coef ? coef->GetName() :
"") <<
" is not of type RooAbsReal, ignored" << endl ;
209 coutE(
InputArguments) <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << (pdf ? pdf->GetName() :
"") <<
" is not of type RooAbsPdf, ignored" << endl ;
215 if (recursiveFractions) {
216 partinCoefList.
add(*coef) ;
237 if (inPdfList.
size() == inCoefList.
size() + 1) {
241 coutF(
InputArguments) <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") last pdf " << pdf->GetName() <<
" is not of type RooAbsPdf, fatal error" << endl ;
242 throw std::invalid_argument(
"Last argument for RooAddPdf is not a PDF.");
247 if (recursiveFractions) {
280 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
281 _refCoefRangeName(0),
283 _projCacheMgr(this,10),
284 _pdfList(
"!pdfs",
"List of PDFs",this),
285 _coefList(
"!coefficients",
"List of coefficients",this),
287 _allExtendable(
kTRUE),
291 for (
const auto pdfArg : inPdfList) {
292 auto pdf =
dynamic_cast<const RooAbsPdf*
>(pdfArg);
295 coutE(
InputArguments) <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << (pdf ? pdf->GetName() :
"") <<
" is not of type RooAbsPdf, ignored" << endl ;
298 if (!pdf->canBeExtended()) {
299 coutE(
InputArguments) <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << pdf->GetName() <<
" is not extendable, ignored" << endl ;
318 _refCoefNorm(
"!refCoefNorm",this,other._refCoefNorm),
319 _refCoefRangeName((
TNamed*)other._refCoefRangeName),
320 _projectCoefs(other._projectCoefs),
321 _projCacheMgr(other._projCacheMgr,this),
322 _codeReg(other._codeReg),
323 _pdfList(
"!pdfs",this,other._pdfList),
324 _coefList(
"!coefficients",this,other._coefList),
325 _haveLastCoef(other._haveLastCoef),
326 _allExtendable(other._allExtendable),
327 _recursive(other._recursive)
358 if (refCoefNorm.
getSize()==0) {
431 RooArgSet* pdfDeps = pdf->getObservables(nset) ;
438 RooArgSet* coefDeps = coef ? coef->getObservables(nset) : 0 ;
447 name.Append(pdf->GetName()) ;
448 name.Append(
"_SupNorm") ;
452 cxcoutD(
Caching) <<
"RooAddPdf " <<
GetName() <<
" making supplemental normalization set " << supNSet <<
" for pdf component " << pdf->
GetName() << endl ;
455 snorm =
new RooRealVar(
name,
"Unit Supplemental normalization integral",1.0) ;
463 cxcoutD(
Caching) <<
"RooAddPdf::syncSuppNormList(" <<
GetName() <<
") synching supplemental normalization list for norm" << (nset?*nset:
RooArgSet()) << endl ;
503 cxcoutD(
Caching) <<
"ALEX: RooAddPdf::syncCoefProjList(" <<
GetName() <<
") projecting coefficients from "
504 << *nset2 << (rangeName?
":":
"") << (rangeName?rangeName:
"")
509 auto thePdf =
static_cast<const RooAbsPdf*
>(arg);
520 name.Append(thePdf->GetName()) ;
521 name.Append(
"_ProjectNorm") ;
522 pdfProj =
new RooRealVar(
name,
"Unit Projection normalization integral",1.0) ;
538 name.Append(thePdf->GetName()) ;
539 name.Append(
"_ProjSupNorm") ;
544 snorm =
new RooRealVar(
name,
"Unit Projection Supplemental normalization integral",1.0) ;
591 theName.
Append(thePdf->GetName()) ;
592 theName.
Append(
"_RangeNorm1") ;
593 rangeProj1 =
new RooRealVar(theName,
"Unit range normalization integral",1.0) ;
602 cxcoutD(
Caching) <<
"RooAddPdf::syncCoefProjList(" <<
GetName() <<
") rangename = " << (rangeName?rangeName:
"<null>")
603 <<
" nset = " << (nset?*nset:
RooArgSet()) << endl ;
619 theName.
Append(thePdf->GetName()) ;
620 theName.
Append(
"_RangeNorm2") ;
621 rangeProj2 =
new RooRealVar(theName,
"Unit range normalization integral",1.0) ;
648 auto& myCoefCache =
const_cast<std::vector<double>&
>(
_coefCache);
660 coefSum += myCoefCache[i] ;
665 coutW(
Eval) <<
"RooAddPdf::updateCoefCache(" <<
GetName() <<
") WARNING: total number of expected events is 0" << endl ;
668 myCoefCache[j] /= coefSum ;
679 auto coef =
static_cast<RooAbsReal*
>(coefArg);
680 myCoefCache[i] = coef->
getVal(nset) ;
681 coefSum += myCoefCache[i++];
684 coutW(
Eval) <<
"RooAddPdf::updateCoefCache(" <<
GetName() <<
") WARNING: sum of coefficients is zero 0" << endl ;
687 myCoefCache[j] /= coefSum;
696 auto coef =
static_cast<RooAbsReal*
>(coefArg);
697 myCoefCache[i] = coef->
getVal(nset) ;
699 lastCoef -= myCoefCache[i++];
708 <<
" WARNING: sum of PDF coefficients not in range [0-1], value="
711 coutW(
Eval) <<
" (no more will be printed)" ;
756 myCoefCache[i] *= proj ;
757 coefSum += myCoefCache[i] ;
763 ccoutD(
Caching) <<
" ALEX: POST-SYNC coef[" << i <<
"] = " << myCoefCache[i]
764 <<
" ( _coefCache[i]/coefSum = " << myCoefCache[i]*coefSum <<
"/" << coefSum <<
" ) "<< endl ;
769 myCoefCache[i] /= coefSum ;
786 if (nset==0 || nset->
getSize()==0) {
805 Double_t pdfVal = pdf->getVal(nset) ;
806 if (pdf->isSelectedComp()) {
817 if (pdf->isSelectedComp()) {
853 if (pdf->observableOverlaps(nset,*coef)) {
855 <<
" and PDF " << pdf->GetName() <<
" have one or more dependents in common" << endl ;
875 const RooArgSet* normSet,
const char* rangeName)
const
885 for (
const auto pdfArg :
_pdfList) {
886 auto pdf =
static_cast<const RooAbsPdf *
>(pdfArg);
888 pdf->getAnalyticalIntegralWN(allVars,subAnalVars,normSet,rangeName) ;
891 for (
const auto arg : allVars) {
892 if (!subAnalVars.
find(arg->GetName()) && pdf->
dependsOn(*arg)) {
900 if (allAnalVars.
getSize()==0) {
910 auto pdf =
static_cast<const RooAbsPdf *
>(arg);
912 RooArgSet* allAnalVars2 = pdf->getObservables(allAnalVars) ;
913 subCode[
n] = pdf->getAnalyticalIntegralWN(*allAnalVars2,subAnalVars,normSet,rangeName) ;
914 if (subCode[
n]==0 && allAnalVars2->
getSize()>0) {
916 <<
" advertises inconsistent set of integrals (e.g. (X,Y) but not X or Y individually."
917 <<
" Distributed analytical integration disabled. Please fix PDF" << endl ;
920 delete allAnalVars2 ;
928 analVars.
add(allAnalVars) ;
952 if (subCode.empty()) {
953 coutE(
InputArguments) <<
"RooAddPdf::analyticalIntegral(" <<
GetName() <<
"): ERROR unrecognized integration code, " << code << endl ;
982 Double_t val = pdf->analyticalIntegralWN(subCode[i],normSet,rangeName) ;
983 if (pdf->isSelectedComp()) {
1053 expectedTotal += ncomp ;
1059 return expectedTotal ;
1135 list<Double_t>* sumHint = 0 ;
1140 auto pdf =
static_cast<const RooAbsPdf*
>(arg);
1153 list<Double_t>* newSumHint =
new list<Double_t>(sumHint->size()+pdfHint->size()) ;
1156 merge(pdfHint->begin(),pdfHint->end(),sumHint->begin(),sumHint->end(),newSumHint->begin()) ;
1160 sumHint = newSumHint ;
1167 list<Double_t>::iterator new_end = unique(sumHint->begin(),sumHint->end()) ;
1168 sumHint->erase(new_end,sumHint->end()) ;
1180 list<Double_t>* sumBinB = 0 ;
1185 auto pdf =
static_cast<const RooAbsPdf *
>(arg);
1197 list<Double_t>* newSumBinB =
new list<Double_t>(sumBinB->size()+pdfBinB->size()) ;
1200 merge(pdfBinB->begin(),pdfBinB->end(),sumBinB->begin(),sumBinB->end(),newSumBinB->begin()) ;
1205 sumBinB = newSumBinB ;
1213 list<Double_t>::iterator new_end = unique(sumBinB->begin(),sumBinB->end()) ;
1214 sumBinB->erase(new_end,sumBinB->end()) ;
1227 auto pdf =
static_cast<const RooAbsPdf*
>(arg);
1228 if (pdf->dependsOn(obs) && !pdf->isBinnedDistribution(obs)) {
1244 while ((aarg=aiter.
next())) {
1246 trackNodes.
add(*aarg) ;
1275 os <<
"[%] * " << pdf->
GetName();
1286 os << pdf->GetName() ;
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 (of arbitrary type) an...
RooArgSet * getObservables(const RooArgSet &set, Bool_t valueOnly=kTRUE) const
Return the observables of this pdf given a set of observables.
Bool_t dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=0, Bool_t valueOnly=kFALSE) const
Test whether we depend on (ie, are served by) any object in the specified collection.
virtual CacheMode canNodeBeCached() const
void setOperMode(OperMode mode, Bool_t recurseADirty=kTRUE)
Change cache operation mode to given mode.
Bool_t addOwnedComponents(const RooArgSet &comps)
Take ownership of the contents of 'comps'.
OperMode operMode() const
RooFIter fwdIterator() const R__SUGGEST_ALTERNATIVE("begin()
One-time forward iterator.
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
Storage_t::size_type size() const
virtual void Print(Option_t *options=0) const
This method must be overridden when a class wants to print itself.
Bool_t equals(const RooAbsCollection &otherColl) const
Check if this and other collection have identically-named contents.
const char * GetName() const
Returns name of object.
TIterator * createIterator(Bool_t dir=kIterForward) const R__SUGGEST_ALTERNATIVE("begin()
TIterator-style iteration over contained elements.
virtual Bool_t remove(const RooAbsArg &var, Bool_t silent=kFALSE, Bool_t matchByNameOnly=kFALSE)
Remove the specified argument from our list.
RooAbsArg * find(const char *name) const
Find object with given name in list.
RooAbsGenContext is the abstract base class for generator contexts of RooAbsPdf objects.
virtual void resetErrorCounters(Int_t resetValue=10)
Reset error counter to given value, limiting the number of future error messages for this pdf to 'res...
TString _normRange
MC generator configuration specific for this object.
friend class RooRealIntegral
virtual Double_t expectedEvents(const RooArgSet *nset) const
Return expected number of events from this p.d.f for use in extended likelihood calculations.
RooArgSet * _normSet
Normalization integral (owned by _normMgr)
static Int_t _verboseEval
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...
virtual std::list< Double_t > * plotSamplingHint(RooAbsRealLValue &, Double_t, Double_t) const
virtual std::list< Double_t > * binBoundaries(RooAbsRealLValue &, Double_t, Double_t) const
Double_t getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
static void globalSelectComp(Bool_t flag)
Global switch controlling the activation of the selectComp() functionality.
static Bool_t _globalSelectComp
Component selection flag for RooAbsPdf::plotCompOn.
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 ...
Transient cache with transformed values of coefficients.
virtual RooArgList containedArgs(Action)
List all RooAbsArg derived contents in this cache element.
RooArgList _rangeProjList
RooArgList _refRangeProjList
RooAddPdf is an efficient implementation of a sum of PDFs of the form.
virtual void resetErrorCounters(Int_t resetValue=10)
Reset error counter to given value, limiting the number of future error messages for this pdf to 'res...
friend class RooAddGenContext
virtual void setCacheAndTrackHints(RooArgSet &)
Label OK'ed components of a RooAddPdf with cache-and-track.
virtual Double_t expectedEvents(const RooArgSet *nset) const
Return the number of expected events, which is either the sum of all coefficients or the sum of the c...
Bool_t isBinnedDistribution(const RooArgSet &obs) const
If all components that depend on obs are binned that so is the product.
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 fraction c...
Double_t evaluate() const
Calculate and return the current value.
void updateCoefficients(CacheElem &cache, const RooArgSet *nset) const
Update the coefficient values in the given cache element: calculate new remainder fraction,...
virtual ~RooAddPdf()
Destructor.
CacheElem * getProjCache(const RooArgSet *nset, const RooArgSet *iset=0, const char *rangeName=0) const
Retrieve cache element for the computation of the PDF normalisation.
RooObjCacheManager _projCacheMgr
void printMetaArgs(std::ostream &os) const
Customized printing of arguments of a RooAddPdf to more intuitively reflect the contents of the produ...
RooAddPdf()
Default constructor used for persistence.
virtual std::list< Double_t > * plotSamplingHint(RooAbsRealLValue &obs, Double_t xlo, Double_t xhi) const
Loop over components for plot sampling hints and merge them if there are multiple.
virtual std::list< Double_t > * binBoundaries(RooAbsRealLValue &, Double_t, Double_t) const
Loop over components for plot sampling hints and merge them if there are multiple.
void fixCoefNormalization(const RooArgSet &refCoefNorm)
By default the interpretation of the fraction coefficients is performed in the contextual choice of o...
virtual RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=0, const RooArgSet *auxProto=0, Bool_t verbose=kFALSE) const
Return specialized context to efficiently generate toy events from RooAddPdfs return RooAbsPdf::genCo...
Double_t analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=0) const
Return analytical integral defined by given scenario code.
virtual void selectNormalization(const RooArgSet *depSet=0, Bool_t force=kFALSE)
Interface function used by test statistics to freeze choice of observables for interpretation of frac...
void fixCoefRange(const char *rangeName)
By default, fraction coefficients are assumed to refer to the default fit range.
RooListProxy _pdfList
Registry of component analytical integration codes.
TNamed * _refCoefRangeName
const RooArgList & pdfList() const
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.
std::vector< double > _coefCache
Bool_t _haveLastCoef
List of supplemental normalization factors.
virtual Bool_t checkObservables(const RooArgSet *nset) const
Check if PDF is valid for given normalization set.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
virtual Bool_t add(const RooAbsCollection &col, Bool_t silent=kFALSE)
Add a collection of arguments to this collection by calling add() for each element in the source coll...
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=0, const TNamed *isetRangeName=0)
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=0)
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.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Reimplementation of standard RooArgList::add()
static RooMsgService & instance()
Return reference to singleton instance.
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.
static RooConstVar & value(Double_t value)
Return a constant value object with given value.
RooRealVar represents a fundamental (non-derived) real valued object.
Class RooRecursiveFraction is a RooAbsReal implementation that calculates the plain fraction of sum o...
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Overloaded RooArgSet::add() method inserts 'var' into set and registers 'var' as server to owner with...
virtual void removeAll()
Remove all argument inset using remove(const RooAbsArg&).
Iterator abstract base class.
virtual TObject * Next()=0
The TNamed class is the base class for all named ROOT classes.
virtual const char * GetName() const
Returns name of object.
const char * Data() const
TString & Append(const char *cs)
RooConstVar & RooConst(Double_t val)