99 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
100 _refCoefRangeName(0),
101 _projectCoefs(false),
104 _haveLastCoef(false),
105 _allExtendable(false),
119 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
120 _refCoefRangeName(0),
122 _projCacheMgr(this,10),
124 _pdfList(
"!pdfs",
"List of PDFs",this),
125 _coefList(
"!coefficients",
"List of coefficients",this),
143 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
144 _refCoefRangeName(0),
146 _projCacheMgr(this,10),
148 _pdfList(
"!pdfs",
"List of PDFs",this),
149 _coefList(
"!coefficients",
"List of coefficients",this),
178 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
179 _refCoefRangeName(0),
181 _projCacheMgr(this,10),
183 _pdfList(
"!pdfs",
"List of PDFs",this),
184 _coefList(
"!coefficients",
"List of coefficients",this),
187 _recursive(recursiveFractions)
190 std::stringstream errorMsg;
191 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName()
192 <<
") number of pdfs and coefficients inconsistent, must have Npdf=Ncoef or Npdf=Ncoef+1." << endl ;
194 throw std::invalid_argument(errorMsg.str().c_str());
197 if (recursiveFractions && inPdfList.
getSize()!=inCoefList.
getSize()+1) {
198 std::stringstream errorMsg;
199 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName()
200 <<
"): Recursive fractions option can only be used if Npdf=Ncoef+1." << endl;
202 throw std::invalid_argument(errorMsg.str());
210 for (
auto i = 0u; i < inCoefList.
size(); ++i) {
211 auto coef =
dynamic_cast<RooAbsReal*
>(inCoefList.
at(i));
212 auto pdf =
dynamic_cast<RooAbsPdf*
>(inPdfList.
at(i));
213 if (inPdfList.
at(i) ==
nullptr) {
214 std::stringstream errorMsg;
215 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName()
216 <<
") number of pdfs and coefficients inconsistent, must have Npdf=Ncoef or Npdf=Ncoef+1" << endl ;
218 throw std::invalid_argument(errorMsg.str());
221 std::stringstream errorMsg;
222 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") coefficient " << (coef ? coef->GetName() :
"") <<
" is not of type RooAbsReal, ignored" << endl ;
224 throw std::invalid_argument(errorMsg.str());
227 std::stringstream errorMsg;
228 errorMsg <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << (pdf ? pdf->GetName() :
"") <<
" is not of type RooAbsPdf, ignored" << endl ;
230 throw std::invalid_argument(errorMsg.str());
235 if (recursiveFractions) {
236 partinCoefList.
add(*coef) ;
257 if (inPdfList.
size() == inCoefList.
size() + 1) {
262 throw std::invalid_argument(
"Last argument for RooAddPdf is not a PDF.");
267 if (recursiveFractions) {
300 _refCoefNorm(
"!refCoefNorm",
"Reference coefficient normalization set",this,
kFALSE,
kFALSE),
301 _refCoefRangeName(0),
303 _projCacheMgr(this,10),
304 _pdfList(
"!pdfs",
"List of PDFs",this),
305 _coefList(
"!coefficients",
"List of coefficients",this),
307 _allExtendable(
kTRUE),
311 for (
const auto pdfArg : inPdfList) {
312 auto pdf =
dynamic_cast<const RooAbsPdf*
>(pdfArg);
315 coutE(
InputArguments) <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << (pdf ? pdf->GetName() :
"") <<
" is not of type RooAbsPdf, ignored" << endl ;
318 if (!pdf->canBeExtended()) {
319 coutE(
InputArguments) <<
"RooAddPdf::RooAddPdf(" <<
GetName() <<
") pdf " << pdf->GetName() <<
" is not extendable, ignored" << endl ;
338 _refCoefNorm(
"!refCoefNorm",this,other._refCoefNorm),
339 _refCoefRangeName((
TNamed*)other._refCoefRangeName),
340 _projectCoefs(other._projectCoefs),
341 _projCacheMgr(other._projCacheMgr,this),
342 _codeReg(other._codeReg),
343 _pdfList(
"!pdfs",this,other._pdfList),
344 _coefList(
"!coefficients",this,other._coefList),
345 _haveLastCoef(other._haveLastCoef),
346 _allExtendable(other._allExtendable),
347 _recursive(other._recursive)
378 if (refCoefNorm.
getSize()==0) {
451 RooArgSet* pdfDeps = pdf->getObservables(nset) ;
458 RooArgSet* coefDeps = coef ? coef->getObservables(nset) : 0 ;
467 name.Append(pdf->GetName()) ;
468 name.Append(
"_SupNorm") ;
472 cxcoutD(
Caching) <<
"RooAddPdf " <<
GetName() <<
" making supplemental normalization set " << supNSet <<
" for pdf component " << pdf->
GetName() << endl ;
475 snorm =
new RooRealVar(
name,
"Unit Supplemental normalization integral",1.0) ;
483 cxcoutD(
Caching) <<
"RooAddPdf::syncSuppNormList(" <<
GetName() <<
") synching supplemental normalization list for norm" << (nset?*nset:
RooArgSet()) << endl ;
523 cxcoutD(
Caching) <<
"ALEX: RooAddPdf::syncCoefProjList(" <<
GetName() <<
") projecting coefficients from "
524 << *nset2 << (rangeName?
":":
"") << (rangeName?rangeName:
"")
529 auto thePdf =
static_cast<const RooAbsPdf*
>(arg);
540 name.Append(thePdf->GetName()) ;
541 name.Append(
"_ProjectNorm") ;
542 pdfProj =
new RooRealVar(
name,
"Unit Projection normalization integral",1.0) ;
558 name.Append(thePdf->GetName()) ;
559 name.Append(
"_ProjSupNorm") ;
564 snorm =
new RooRealVar(
name,
"Unit Projection Supplemental normalization integral",1.0) ;
611 theName.
Append(thePdf->GetName()) ;
612 theName.
Append(
"_RangeNorm1") ;
613 rangeProj1 =
new RooRealVar(theName,
"Unit range normalization integral",1.0) ;
622 cxcoutD(
Caching) <<
"RooAddPdf::syncCoefProjList(" <<
GetName() <<
") rangename = " << (rangeName?rangeName:
"<null>")
623 <<
" nset = " << (nset?*nset:
RooArgSet()) << endl ;
639 theName.
Append(thePdf->GetName()) ;
640 theName.
Append(
"_RangeNorm2") ;
641 rangeProj2 =
new RooRealVar(theName,
"Unit range normalization integral",1.0) ;
668 auto& myCoefCache =
const_cast<std::vector<double>&
>(
_coefCache);
680 coefSum += myCoefCache[i] ;
685 coutW(
Eval) <<
"RooAddPdf::updateCoefCache(" <<
GetName() <<
") WARNING: total number of expected events is 0" << endl ;
688 myCoefCache[j] /= coefSum ;
699 auto coef =
static_cast<RooAbsReal*
>(coefArg);
700 myCoefCache[i] = coef->
getVal(nset) ;
701 coefSum += myCoefCache[i++];
704 coutW(
Eval) <<
"RooAddPdf::updateCoefCache(" <<
GetName() <<
") WARNING: sum of coefficients is zero 0" << endl ;
707 myCoefCache[j] /= coefSum;
716 auto coef =
static_cast<RooAbsReal*
>(coefArg);
717 myCoefCache[i] = coef->
getVal(nset) ;
719 lastCoef -= myCoefCache[i++];
728 <<
" WARNING: sum of PDF coefficients not in range [0-1], value="
731 coutW(
Eval) <<
" (no more will be printed)" ;
775 myCoefCache[i] *= proj ;
776 coefSum += myCoefCache[i] ;
783 ccoutD(
Caching) <<
" ALEX: POST-SYNC coef[" << i <<
"] = " << myCoefCache[i]
784 <<
" ( _coefCache[i]/coefSum = " << myCoefCache[i]*coefSum <<
"/" << coefSum <<
" ) "<< endl ;
789 coutE(
Eval) <<
"RooAddPdf::updateCoefCache(" <<
GetName() <<
") sum of coefficients is zero." << endl ;
793 myCoefCache[i] /= coefSum ;
804 if (nset==0 || nset->
getSize()==0) {
813 return {nset, cache};
832 double snormVal = 1.;
838 if (pdf.isSelectedComp()) {
859 const std::size_t
n =
output.size();
862 for (
unsigned int pdfNo = 0; pdfNo <
_pdfList.
size(); ++pdfNo) {
864 auto pdfOutputs = pdf.
getValBatch(begin, batchSize, nset);
865 assert(pdfOutputs.size() ==
output.size());
871 if (pdf.isSelectedComp()) {
872 for (std::size_t i = 0; i <
n; ++i) {
873 output[i] += pdfOutputs[i] * coef;
905 for (
int i = 0; i < end; ++i) {
908 if (pdf->observableOverlaps(nset,*coef)) {
910 <<
" and PDF " << pdf->GetName() <<
" have one or more dependents in common" << endl ;
930 const RooArgSet* normSet,
const char* rangeName)
const
940 for (
const auto pdfArg :
_pdfList) {
941 auto pdf =
static_cast<const RooAbsPdf *
>(pdfArg);
943 pdf->getAnalyticalIntegralWN(allVars,subAnalVars,normSet,rangeName) ;
946 for (
const auto arg : allVars) {
947 if (!subAnalVars.
find(arg->GetName()) && pdf->
dependsOn(*arg)) {
955 if (allAnalVars.
getSize()==0) {
965 auto pdf =
static_cast<const RooAbsPdf *
>(arg);
967 RooArgSet* allAnalVars2 = pdf->getObservables(allAnalVars) ;
968 subCode[
n] = pdf->getAnalyticalIntegralWN(*allAnalVars2,subAnalVars,normSet,rangeName) ;
969 if (subCode[
n]==0 && allAnalVars2->
getSize()>0) {
971 <<
" advertises inconsistent set of integrals (e.g. (X,Y) but not X or Y individually."
972 <<
" Distributed analytical integration disabled. Please fix PDF" << endl ;
975 delete allAnalVars2 ;
983 analVars.
add(allAnalVars) ;
1007 if (subCode.empty()) {
1008 coutE(
InputArguments) <<
"RooAddPdf::analyticalIntegral(" <<
GetName() <<
"): ERROR unrecognized integration code, " << code << endl ;
1037 Double_t val = pdf->analyticalIntegralWN(subCode[i],normSet,rangeName) ;
1038 if (pdf->isSelectedComp()) {
1108 expectedTotal += ncomp ;
1114 return expectedTotal ;
1190 list<Double_t>* sumHint = 0 ;
1195 auto pdf =
static_cast<const RooAbsPdf*
>(arg);
1208 list<Double_t>* newSumHint =
new list<Double_t>(sumHint->size()+pdfHint->size()) ;
1211 merge(pdfHint->begin(),pdfHint->end(),sumHint->begin(),sumHint->end(),newSumHint->begin()) ;
1215 sumHint = newSumHint ;
1222 list<Double_t>::iterator new_end = unique(sumHint->begin(),sumHint->end()) ;
1223 sumHint->erase(new_end,sumHint->end()) ;
1235 list<Double_t>* sumBinB = 0 ;
1240 auto pdf =
static_cast<const RooAbsPdf *
>(arg);
1252 list<Double_t>* newSumBinB =
new list<Double_t>(sumBinB->size()+pdfBinB->size()) ;
1255 merge(pdfBinB->begin(),pdfBinB->end(),sumBinB->begin(),sumBinB->end(),newSumBinB->begin()) ;
1260 sumBinB = newSumBinB ;
1268 list<Double_t>::iterator new_end = unique(sumBinB->begin(),sumBinB->end()) ;
1269 sumBinB->erase(new_end,sumBinB->end()) ;
1282 auto pdf =
static_cast<const RooAbsPdf*
>(arg);
1283 if (pdf->dependsOn(obs) && !pdf->isBinnedDistribution(obs)) {
1299 while ((aarg=aiter.
next())) {
1301 trackNodes.
add(*aarg) ;
1330 os <<
"[%] * " << pdf->
GetName();
1341 os << pdf->GetName() ;
char * Form(const char *fmt,...)
RooSpan< double > makeWritableBatchInit(std::size_t begin, std::size_t batchSize, double value, const RooArgSet *const normSet=nullptr, Tag_t ownerTag=kUnspecified)
Make a batch and return a span pointing to the pdf-local memory.
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
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
RooFIter fwdIterator() const
One-time forward iterator.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
Storage_t::size_type size() const
RooAbsArg * first() 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.
virtual Bool_t remove(const RooAbsArg &var, Bool_t silent=kFALSE, Bool_t matchByNameOnly=kFALSE)
Remove the specified argument from our list.
TIterator * createIterator(Bool_t dir=kIterForward) const
TIterator-style iteration over contained elements.
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
RooSpan< const double > getValBatch(std::size_t begin, std::size_t batchSize, const RooArgSet *normSet=nullptr) const final
Compute batch of values for given range, and normalise by integrating over the observables in nset.
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.
RooAbsReal * createIntegral(const RooArgSet &iset, const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none()) const
Create an object that represents the integral of the function over one or more observables listed in ...
BatchHelpers::BatchData _batchData
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 RooSpan< double > evaluateBatch(std::size_t begin, std::size_t batchSize) const
Compute addition of PDFs in batches.
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.
std::pair< const RooArgSet *, CacheElem * > getNormAndCache() const
Coefficient error counter.
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)
void reset()
Clear the cache.
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.
Bool_t isActive(const RooAbsArg *self, RooFit::MsgTopic facility, RooFit::MsgLevel level)
Check if logging is active for given object/topic/RooFit::MsgLevel combination.
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 variable that can be changed from the outside.
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&).
A simple container to hold a batch of data values.
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)
static void output(int code)