00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROO_EFF_PROD
00013 #define ROO_EFF_PROD
00014
00015 #include "RooAbsPdf.h"
00016 #include "RooAbsReal.h"
00017 #include "RooRealProxy.h"
00018 #include "RooObjCacheManager.h"
00019
00020 class RooEffProd: public RooAbsPdf {
00021 public:
00022
00023 inline RooEffProd() : _nset(0), _fixedNset(0) { };
00024 virtual ~RooEffProd();
00025 RooEffProd(const char *name, const char *title, RooAbsPdf& pdf, RooAbsReal& efficiency);
00026 RooEffProd(const RooEffProd& other, const char* name=0);
00027
00028 virtual TObject* clone(const char* newname) const { return new RooEffProd(*this,newname); }
00029
00030 virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype,
00031 const RooArgSet* auxProto, Bool_t verbose) const;
00032
00033 virtual Double_t getVal(const RooArgSet* set=0) const ;
00034
00035 virtual Bool_t forceAnalyticalInt(const RooAbsArg& ) const {
00036
00037 return kTRUE ;
00038 }
00039 Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& numVars, const RooArgSet* normSet, const char* rangeName=0) const ;
00040 Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;
00041
00042 protected:
00043
00044 const RooAbsPdf* pdf() const {
00045
00046 return (RooAbsPdf*) _pdf.absArg() ;
00047 }
00048 const RooAbsReal* eff() const {
00049
00050 return (RooAbsReal*) _eff.absArg() ;
00051 }
00052
00053
00054 virtual Double_t evaluate() const ;
00055
00056 class CacheElem : public RooAbsCacheElement {
00057 public:
00058 CacheElem() : _clone(0), _int(0) {}
00059 virtual ~CacheElem() { delete _int ; delete _clone ; }
00060
00061 RooArgSet _intObs ;
00062 RooEffProd* _clone ;
00063 RooAbsReal* _int ;
00064
00065 virtual RooArgList containedArgs(Action) ;
00066 } ;
00067 mutable RooObjCacheManager _cacheMgr ;
00068
00069
00070
00071 RooRealProxy _pdf ;
00072 RooRealProxy _eff;
00073 mutable const RooArgSet* _nset ;
00074
00075 RooArgSet* _fixedNset ;
00076
00077 ClassDef(RooEffProd,2)
00078 };
00079
00080 #endif