00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ROO_ADD_MODEL
00017 #define ROO_ADD_MODEL
00018
00019 #include "RooResolutionModel.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
00028 class RooAddModel : public RooResolutionModel {
00029 public:
00030
00031 RooAddModel() ;
00032 RooAddModel(const char *name, const char *title, const RooArgList& pdfList, const RooArgList& coefList, Bool_t ownPdfList=kFALSE) ;
00033 RooAddModel(const RooAddModel& other, const char* name=0) ;
00034 virtual TObject* clone(const char* newname) const { return new RooAddModel(*this,newname) ; }
00035 virtual RooResolutionModel* convolution(RooFormulaVar* basis, RooAbsArg* owner) const ;
00036 virtual ~RooAddModel() ;
00037
00038 Double_t evaluate() const ;
00039 virtual Bool_t checkObservables(const RooArgSet* nset) const ;
00040
00041 virtual Int_t basisCode(const char* name) const ;
00042
00043 virtual Bool_t forceAnalyticalInt(const RooAbsArg& ) const {
00044
00045 return kTRUE ;
00046 }
00047 Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& numVars, const RooArgSet* normSet, const char* rangeName=0) const ;
00048 Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;
00049 virtual Bool_t selfNormalized() const {
00050
00051 return _basisCode==0 ? kTRUE : kFALSE ;
00052 }
00053
00054 virtual ExtendMode extendMode() const {
00055
00056 return (_haveLastCoef || _allExtendable) ? MustBeExtended : CanNotBeExtended;
00057 }
00058 virtual Double_t expectedEvents(const RooArgSet* nset) const ;
00059 virtual Double_t expectedEvents(const RooArgSet& nset) const {
00060
00061
00062 return expectedEvents(&nset) ;
00063 }
00064
00065 const RooArgList& pdfList() const {
00066
00067 return _pdfList ;
00068 }
00069 const RooArgList& coefList() const {
00070
00071 return _coefList ;
00072 }
00073
00074 Bool_t isDirectGenSafe(const RooAbsArg& arg) const ;
00075
00076 Int_t getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const;
00077 void generateEvent(Int_t code);
00078
00079
00080 void fixCoefNormalization(const RooArgSet& refCoefNorm) ;
00081 void fixCoefRange(const char* rangeName) ;
00082 virtual void resetErrorCounters(Int_t resetValue=10) ;
00083
00084 void printMetaArgs(ostream& os) const ;
00085
00086 protected:
00087
00088 friend class RooAddGenContext ;
00089 virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0,
00090 const RooArgSet* auxProto=0, Bool_t verbose= kFALSE) const ;
00091
00092 virtual void selectNormalization(const RooArgSet* depSet=0, Bool_t force=kFALSE) ;
00093 virtual void selectNormalizationRange(const char* rangeName=0, Bool_t force=kFALSE) ;
00094
00095 mutable RooSetProxy _refCoefNorm ;
00096 mutable TNamed* _refCoefRangeName ;
00097
00098 Bool_t _projectCoefs ;
00099 mutable Double_t* _coefCache ;
00100
00101
00102 class CacheElem : public RooAbsCacheElement {
00103 public:
00104 virtual ~CacheElem() {} ;
00105
00106 RooArgList _suppNormList ;
00107
00108 RooArgList _projList ;
00109 RooArgList _suppProjList ;
00110 RooArgList _refRangeProjList ;
00111 RooArgList _rangeProjList ;
00112
00113 virtual RooArgList containedArgs(Action) ;
00114
00115 } ;
00116 mutable RooObjCacheManager _projCacheMgr ;
00117 CacheElem* getProjCache(const RooArgSet* nset, const RooArgSet* iset=0, const char* rangeName=0) const ;
00118 void updateCoefficients(CacheElem& cache, const RooArgSet* nset) const ;
00119
00120 typedef RooArgList* pRooArgList ;
00121 void getCompIntList(const RooArgSet* nset, const RooArgSet* iset, pRooArgList& compIntList, Int_t& code, const char* isetRangeName) const ;
00122 class IntCacheElem : public RooAbsCacheElement {
00123 public:
00124 virtual ~IntCacheElem() {} ;
00125 RooArgList _intList ;
00126 virtual RooArgList containedArgs(Action) ;
00127 } ;
00128
00129 mutable RooObjCacheManager _intCacheMgr ;
00130
00131 mutable RooAICRegistry _codeReg ;
00132
00133 RooListProxy _pdfList ;
00134 RooListProxy _coefList ;
00135 mutable RooArgList* _snormList ;
00136 TIterator* _pdfIter ;
00137 TIterator* _coefIter ;
00138
00139 Bool_t _haveLastCoef ;
00140 Bool_t _allExtendable ;
00141
00142 mutable Int_t _coefErrCount ;
00143
00144 mutable RooArgSet _ownedComps ;
00145
00146 private:
00147
00148 ClassDef(RooAddModel,1)
00149 };
00150
00151 #endif