92 _funcList(
"!funcList",
"List of functions",this),
93 _coefList(
"!coefList",
"List of coefficients",this),
110 _normIntMgr(this,10),
111 _funcList(
"!funcList",
"List of functions",this),
112 _coefList(
"!coefList",
"List of coefficients",this),
153 _normIntMgr(this,10),
154 _funcList(
"!funcList",
"List of functions",this),
155 _coefList(
"!coefList",
"List of coefficients",this),
161 <<
") number of pdfs and coefficients inconsistent, must have Nfunc=Ncoef or Nfunc=Ncoef+1" << endl ;
166 for (
unsigned int i = 0; i < inCoefList.
size(); ++i) {
167 const auto& func = inFuncList[i];
168 const auto& coef = inCoefList[i];
170 if (!
dynamic_cast<const RooAbsReal*
>(&coef)) {
171 coutW(
InputArguments) <<
"RooRealSumPdf::RooRealSumPdf(" <<
GetName() <<
") coefficient " << coef.GetName() <<
" is not of type RooAbsReal, ignored" << endl ;
174 if (!
dynamic_cast<const RooAbsReal*
>(&func)) {
175 coutW(
InputArguments) <<
"RooRealSumPdf::RooRealSumPdf(" <<
GetName() <<
") func " << func.GetName() <<
" is not of type RooAbsReal, ignored" << endl ;
182 if (inFuncList.
size() == inCoefList.
size() + 1) {
183 const auto& func = inFuncList[inFuncList.
size()-1];
184 if (!
dynamic_cast<const RooAbsReal*
>(&func)) {
185 coutE(
InputArguments) <<
"RooRealSumPdf::RooRealSumPdf(" <<
GetName() <<
") last func " << func.GetName() <<
" is not of type RooAbsReal, fatal error" << endl ;
201 _normIntMgr(other._normIntMgr,this),
202 _funcList(
"!funcList",this,other._funcList),
203 _coefList(
"!coefList",this,other._coefList),
204 _extended(other._extended),
205 _doFloor(other._doFloor)
248 auto func =
static_cast<const RooAbsReal*
>(*funcIt++);
249 auto coef =
static_cast<const RooAbsReal*
>(coefArg);
253 cxcoutD(
Eval) <<
"RooRealSumPdf::eval(" <<
GetName() <<
") coefVal = " << coefVal <<
" funcVal = " << func->IsA()->GetName() <<
"::" << func->GetName() <<
" = " << func->getVal() << endl ;
254 if (func->isSelectedComp()) {
255 value += func->getVal()*coefVal ;
257 lastCoef -= coef->getVal() ;
264 auto func =
static_cast<const RooAbsReal*
>(*funcIt);
265 if (func->isSelectedComp()) {
266 value += func->getVal()*lastCoef ;
269 cxcoutD(
Eval) <<
"RooRealSumPdf::eval(" <<
GetName() <<
") lastCoef = " << lastCoef <<
" funcVal = " << func->getVal() << endl ;
272 if (lastCoef<0 || lastCoef>1) {
274 <<
") WARNING: sum of FUNC coefficients not in range [0-1], value="
275 << 1-lastCoef <<
". This means that the PDF is not properly normalised. If the PDF was meant to be extended, provide as many coefficients as functions." << endl ;
306 if (func.observableOverlaps(nset, coef)) {
308 <<
" and FUNC " << func.GetName() <<
" have one or more observables in common" << endl ;
311 if (coef.dependsOn(*nset)) {
313 <<
" depends on one or more of the following observables" ; nset->
Print(
"1") ;
328 const RooArgSet* normSet2,
const char* rangeName)
const
331 if (allVars.
getSize()==0)
return 0 ;
335 analVars.
add(allVars) ;
340 Int_t sterileIdx(-1) ;
352 const auto func =
static_cast<RooAbsReal*
>(elm);
357 if (normSet && normSet->
getSize()>0) {
384 if (code==0)
return getVal(normSet2) ;
409 const auto coef =
static_cast<const RooAbsReal*
>(coefArg);
410 const auto func =
static_cast<const RooAbsReal*
>(*funcIt++);
411 const auto funcInt =
static_cast<RooAbsReal*
>(*funcIntIt++);
413 Double_t coefVal = coef->getVal(normSet2) ;
416 if (normSet2 ==0 || func->isSelectedComp()) {
418 value += funcInt->getVal()*coefVal ;
420 lastCoef -= coef->getVal(normSet2) ;
426 const auto func =
static_cast<const RooAbsReal*
>(*funcIt);
427 const auto funcInt =
static_cast<RooAbsReal*
>(*funcIntIt);
430 if (normSet2 ==0 || func->isSelectedComp()) {
432 value += funcInt->getVal()*lastCoef ;
436 if (lastCoef<0 || lastCoef>1) {
438 <<
" WARNING: sum of FUNC coefficients not in range [0-1], value="
439 << 1-lastCoef << endl ;
444 if (normSet2 && normSet2->
getSize()>0) {
450 auto coef =
static_cast<RooAbsReal*
>(coefAsArg);
451 auto funcNorm =
static_cast<RooAbsReal*
>(*funcNormIter++);
453 Double_t coefVal = coef->getVal(normSet2);
456 normVal += funcNorm->getVal()*coefVal ;
462 auto funcNorm =
static_cast<RooAbsReal*
>(*funcNormIter);
465 normVal += funcNorm->getVal()*lastCoef;
469 return value / normVal;
489 list<Double_t>* sumBinB = 0 ;
496 list<Double_t>* funcBinB = func->
binBoundaries(obs,xlo,xhi) ;
505 list<Double_t>* newSumBinB =
new list<Double_t>(sumBinB->size()+funcBinB->size()) ;
508 merge(funcBinB->begin(),funcBinB->end(),sumBinB->begin(),sumBinB->end(),newSumBinB->begin()) ;
513 sumBinB = newSumBinB ;
521 list<Double_t>::iterator new_end = unique(sumBinB->begin(),sumBinB->end()) ;
522 sumBinB->erase(new_end,sumBinB->end()) ;
538 if (func->dependsOn(obs) && !func->isBinnedDistribution(obs)) {
554 list<Double_t>* sumHint = 0 ;
572 list<Double_t>* newSumHint =
new list<Double_t>(sumHint->size()+funcHint->size()) ;
575 merge(funcHint->begin(),funcHint->end(),sumHint->begin(),sumHint->end(),newSumHint->begin()) ;
579 sumHint = newSumHint ;
587 list<Double_t>::iterator new_end = unique(sumHint->begin(),sumHint->end()) ;
588 sumHint->erase(new_end,sumHint->end()) ;
603 if (sarg->canNodeBeCached()==
Always) {
604 trackNodes.
add(*sarg) ;
630 const auto func = *(funcIter++);
631 os << coef->GetName() <<
" * " << func->GetName();
635 os <<
" + [%] * " << (*funcIter)->GetName() ;
645 os << func->GetName() ;
static RooMathCoreReg dummy
RooArgSet * getObservables(const RooArgSet &set, Bool_t valueOnly=kTRUE) const
Return the observables of this pdf given a set of observables.
RooArgSet * getParameters(const RooAbsData *data, Bool_t stripDisconnected=kTRUE) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooAbsCacheElement is the abstract base class for objects to be stored in RooAbsCache cache manager o...
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
const_iterator end() const
Storage_t::size_type size() const
const_iterator begin() const
virtual void Print(Option_t *options=0) const
This method must be overridden when a class wants to print itself.
Double_t getNorm(const RooArgSet &nset) const
RooAbsRealLValue is the common abstract base class for objects that represent a real value that may a...
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 ...
void logEvalError(const char *message, const char *serverValueString=0) const
Log evaluation error message.
RooArgList is a container object that can hold multiple RooAbsArg objects.
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)
const RooNameSet * nameSet2ByIndex(Int_t index) const
Retrieve RooNameSet associated with slot at given index.
T * getObjByIndex(Int_t index) const
Retrieve payload object by slot index.
const RooNameSet * nameSet1ByIndex(Int_t index) const
Retrieve RooNameSet associated with slot at given index.
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=0)
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Reimplementation of standard RooArgList::add()
static const TNamed * ptr(const char *stringPtr)
Return a unique TNamed pointer for given C++ string.
RooArgSet * select(const RooArgSet &list) const
Construct a RooArgSet of objects in input 'list' whose names match to those in the internal name list...
RooRealIntegral performs hybrid numerical/analytical integrals of RooAbsReal objects.
The class RooRealSumPdf implements a PDF constructed from a sum of functions:
virtual ExtendMode extendMode() const
RooObjCacheManager _normIntMgr
Double_t evaluate() const
Calculate the current value.
RooRealSumPdf()
Default constructor coverity[UNINIT_CTOR].
virtual Double_t expectedEvents(const RooArgSet *nset) const
Return expected number of events from this p.d.f for use in extended likelihood calculations.
Bool_t isBinnedDistribution(const RooArgSet &obs) const
static Bool_t _doFloorGlobal
virtual std::list< Double_t > * plotSamplingHint(RooAbsRealLValue &, Double_t, Double_t) const
virtual ~RooRealSumPdf()
Destructor.
virtual Bool_t checkObservables(const RooArgSet *nset) const
Check if FUNC is valid for given normalization set.
void printMetaArgs(std::ostream &os) const
Customized printing of arguments of a RooRealSumPdf to more intuitively reflect the contents of the p...
virtual void setCacheAndTrackHints(RooArgSet &)
Label OK'ed components of a RooRealSumPdf with cache-and-track.
virtual std::list< Double_t > * binBoundaries(RooAbsRealLValue &, Double_t, Double_t) const
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &numVars, const RooArgSet *normSet, const char *rangeName=0) const
Advertise that all integrals can be handled internally.
Double_t analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=0) const
Implement analytical integrations by deferring integration of component functions to integrators of c...
bool haveLastCoef() const
virtual const char * GetName() const
Returns name of object.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".