00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ROO_ADD_PDF
00017 #define ROO_ADD_PDF
00018
00019 #include "RooAbsPdf.h"
00020 #include "RooListProxy.h"
00021 #include "RooSetProxy.h"
00022 #include "RooAICRegistry.h"
00023 #include "RooNormSetCache.h"
00024 #include "RooNameSet.h"
00025 #include "RooCacheManager.h"
00026 #include "RooObjCacheManager.h"
00027 #include "RooNameReg.h"
00028
00029 class RooAddPdf : public RooAbsPdf {
00030 public:
00031
00032 RooAddPdf() ;
00033 RooAddPdf(const char *name, const char *title=0);
00034 RooAddPdf(const char *name, const char *title,
00035 RooAbsPdf& pdf1, RooAbsPdf& pdf2, RooAbsReal& coef1) ;
00036 RooAddPdf(const char *name, const char *title, const RooArgList& pdfList) ;
00037 RooAddPdf(const char *name, const char *title, const RooArgList& pdfList, const RooArgList& coefList, Bool_t recursiveFraction=kFALSE) ;
00038
00039 RooAddPdf(const RooAddPdf& other, const char* name=0) ;
00040 virtual TObject* clone(const char* newname) const { return new RooAddPdf(*this,newname) ; }
00041 virtual ~RooAddPdf() ;
00042
00043 Double_t evaluate() const ;
00044 virtual Bool_t checkObservables(const RooArgSet* nset) const ;
00045
00046 virtual Bool_t forceAnalyticalInt(const RooAbsArg& ) const {
00047
00048 return kTRUE ;
00049 }
00050 Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& numVars, const RooArgSet* normSet, const char* rangeName=0) const ;
00051 Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;
00052 virtual Bool_t selfNormalized() const {
00053
00054 return kTRUE ;
00055 }
00056
00057 virtual ExtendMode extendMode() const {
00058
00059 return (_haveLastCoef || _allExtendable) ? MustBeExtended : CanNotBeExtended;
00060 }
00061 virtual Double_t expectedEvents(const RooArgSet* nset) const ;
00062 virtual Double_t expectedEvents(const RooArgSet& nset) const {
00063
00064
00065 return expectedEvents(&nset) ;
00066 }
00067
00068 const RooArgList& pdfList() const {
00069
00070 return _pdfList ;
00071 }
00072 const RooArgList& coefList() const {
00073
00074 return _coefList ;
00075 }
00076
00077 void fixCoefNormalization(const RooArgSet& refCoefNorm) ;
00078 void fixCoefRange(const char* rangeName) ;
00079
00080 const RooArgSet& getCoefNormalization() const { return _refCoefNorm ; }
00081 const char* getCoefRange() const { return _refCoefRangeName?RooNameReg::str(_refCoefRangeName):"" ; }
00082
00083 virtual void resetErrorCounters(Int_t resetValue=10) ;
00084
00085 virtual std::list<Double_t>* plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const ;
00086
00087 void printMetaArgs(ostream& os) const ;
00088
00089 protected:
00090
00091 virtual void selectNormalization(const RooArgSet* depSet=0, Bool_t force=kFALSE) ;
00092 virtual void selectNormalizationRange(const char* rangeName=0, Bool_t force=kFALSE) ;
00093
00094 mutable RooSetProxy _refCoefNorm ;
00095 mutable TNamed* _refCoefRangeName ;
00096
00097 Bool_t _projectCoefs ;
00098 mutable Double_t* _coefCache ;
00099
00100
00101 class CacheElem : public RooAbsCacheElement {
00102 public:
00103 virtual ~CacheElem() {} ;
00104
00105 RooArgList _suppNormList ;
00106
00107 RooArgList _projList ;
00108 RooArgList _suppProjList ;
00109 RooArgList _refRangeProjList ;
00110 RooArgList _rangeProjList ;
00111
00112 virtual RooArgList containedArgs(Action) ;
00113
00114 } ;
00115 mutable RooObjCacheManager _projCacheMgr ;
00116 CacheElem* getProjCache(const RooArgSet* nset, const RooArgSet* iset=0, const char* rangeName=0) const ;
00117 void updateCoefficients(CacheElem& cache, const RooArgSet* nset) const ;
00118
00119
00120 friend class RooAddGenContext ;
00121 virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0,
00122 const RooArgSet* auxProto=0, Bool_t verbose= kFALSE) const ;
00123
00124
00125 mutable RooAICRegistry _codeReg ;
00126
00127 RooListProxy _pdfList ;
00128 RooListProxy _coefList ;
00129 mutable RooArgList* _snormList ;
00130 TIterator* _pdfIter ;
00131 TIterator* _coefIter ;
00132
00133 Bool_t _haveLastCoef ;
00134 Bool_t _allExtendable ;
00135
00136 mutable Int_t _coefErrCount ;
00137
00138 private:
00139
00140 ClassDef(RooAddPdf,2)
00141 };
00142
00143 #endif