00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ROO_PROD_PDF
00017 #define ROO_PROD_PDF
00018
00019 #include "Riosfwd.h"
00020 #include "RooAbsPdf.h"
00021 #include "RooListProxy.h"
00022 #include "RooLinkedList.h"
00023 #include "RooAICRegistry.h"
00024 #include "RooCacheManager.h"
00025 #include "RooObjCacheManager.h"
00026 #include "RooCmdArg.h"
00027 #include <vector>
00028
00029 typedef RooArgList* pRooArgList ;
00030 typedef RooLinkedList* pRooLinkedList ;
00031
00032 class RooProdPdf : public RooAbsPdf {
00033 public:
00034 RooProdPdf() ;
00035 RooProdPdf(const char *name, const char *title, Double_t cutOff=0);
00036 RooProdPdf(const char *name, const char *title,
00037 RooAbsPdf& pdf1, RooAbsPdf& pdf2, Double_t cutOff=0) ;
00038 RooProdPdf(const char* name, const char* title, const RooArgList& pdfList, Double_t cutOff=0) ;
00039 RooProdPdf(const char* name, const char* title, const RooArgSet& fullPdfSet, const RooLinkedList& cmdArgList) ;
00040
00041 RooProdPdf(const char* name, const char* title, const RooArgSet& fullPdfSet,
00042 const RooCmdArg& arg1 , const RooCmdArg& arg2=RooCmdArg(),
00043 const RooCmdArg& arg3=RooCmdArg(), const RooCmdArg& arg4=RooCmdArg(),
00044 const RooCmdArg& arg5=RooCmdArg(), const RooCmdArg& arg6=RooCmdArg(),
00045 const RooCmdArg& arg7=RooCmdArg(), const RooCmdArg& arg8=RooCmdArg()) ;
00046
00047 RooProdPdf(const char* name, const char* title,
00048 const RooCmdArg& arg1, const RooCmdArg& arg2=RooCmdArg(),
00049 const RooCmdArg& arg3=RooCmdArg(), const RooCmdArg& arg4=RooCmdArg(),
00050 const RooCmdArg& arg5=RooCmdArg(), const RooCmdArg& arg6=RooCmdArg(),
00051 const RooCmdArg& arg7=RooCmdArg(), const RooCmdArg& arg8=RooCmdArg()) ;
00052
00053 RooProdPdf(const RooProdPdf& other, const char* name=0) ;
00054 virtual TObject* clone(const char* newname) const { return new RooProdPdf(*this,newname) ; }
00055 virtual ~RooProdPdf() ;
00056
00057 virtual Double_t getVal(const RooArgSet* set=0) const ;
00058 Double_t evaluate() const ;
00059 virtual Bool_t checkObservables(const RooArgSet* nset) const ;
00060
00061 virtual Bool_t forceAnalyticalInt(const RooAbsArg& dep) const ;
00062 Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& numVars, const RooArgSet* normSet, const char* rangeName=0) const ;
00063 Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;
00064 virtual Bool_t selfNormalized() const { return _selfNorm ; }
00065
00066 virtual ExtendMode extendMode() const ;
00067 virtual Double_t expectedEvents(const RooArgSet* nset) const ;
00068 virtual Double_t expectedEvents(const RooArgSet& nset) const { return expectedEvents(&nset) ; }
00069
00070 const RooArgList& pdfList() const { return _pdfList ; }
00071
00072 virtual Int_t getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const;
00073 virtual void initGenerator(Int_t code) ;
00074 virtual void generateEvent(Int_t code);
00075 virtual Bool_t isDirectGenSafe(const RooAbsArg& arg) const ;
00076
00077
00078 virtual RooArgSet* getConstraints(const RooArgSet& observables, RooArgSet& constrainedParams, Bool_t stripDisconnected) const ;
00079
00080 virtual std::list<Double_t>* plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const ;
00081
00082 void printMetaArgs(ostream& os) const ;
00083
00084 virtual void selectNormalizationRange(const char* rangeName=0, Bool_t force=kFALSE) ;
00085 void fixRefRange(const char* rangeName) ;
00086
00087 void setSelfNormalized(Bool_t flag) { _selfNorm = flag ; }
00088 void setDefNormSet(const RooArgSet& nset) { _defNormSet.removeAll() ; _defNormSet.addClone(nset) ; }
00089
00090 protected:
00091
00092
00093 RooAbsReal* makeCondPdfRatioCorr(RooAbsReal& term, const RooArgSet& termNset, const RooArgSet& termImpSet, const char* normRange, const char* refRange) const ;
00094
00095 virtual void getParametersHook(const RooArgSet* , RooArgSet* , Bool_t stripDisconnected) const ;
00096
00097 void initializeFromCmdArgList(const RooArgSet& fullPdfSet, const RooLinkedList& l) ;
00098
00099 void factorizeProduct(const RooArgSet& normSet, const RooArgSet& intSet,
00100 RooLinkedList& termList, RooLinkedList& normList,
00101 RooLinkedList& impDepList, RooLinkedList& crossDepList,
00102 RooLinkedList& intList) const;
00103 const char* makeRGPPName(const char* pfx, const RooArgSet& term, const RooArgSet& iset, const RooArgSet& nset, const char* isetRangeName) const ;
00104 void groupProductTerms(RooLinkedList& groupedTerms, RooArgSet& outerIntDeps,
00105 const RooLinkedList& terms, const RooLinkedList& norms,
00106 const RooLinkedList& imps, const RooLinkedList& ints, const RooLinkedList& cross) const ;
00107
00108
00109
00110 void getPartIntList(const RooArgSet* nset, const RooArgSet* iset, pRooArgList& partList, pRooLinkedList& nsetList,
00111 Int_t& code, const char* isetRangeName=0) const ;
00112
00113 std::vector<RooAbsReal*> processProductTerm(const RooArgSet* nset, const RooArgSet* iset, const char* isetRangeName,
00114 const RooArgSet* term,const RooArgSet& termNSet, const RooArgSet& termISet,
00115 Bool_t& isOwned, Bool_t forceWrap=kFALSE) const ;
00116
00117
00118
00119 class CacheElem : public RooAbsCacheElement {
00120 public:
00121 CacheElem() : _isRearranged(kFALSE), _rearrangedNum(0), _rearrangedDen(0) {}
00122 virtual ~CacheElem() ;
00123
00124 RooArgList _partList ;
00125 RooArgList _numList ;
00126 RooArgList _denList ;
00127 RooArgList _ownedList ;
00128 RooLinkedList _normList ;
00129 Bool_t _isRearranged ;
00130 RooAbsReal* _rearrangedNum ;
00131 RooAbsReal* _rearrangedDen ;
00132
00133 virtual RooArgList containedArgs(Action) ;
00134 virtual void printCompactTreeHook(std::ostream&, const char *, Int_t, Int_t) ;
00135 private:
00136 CacheElem(const CacheElem&) ;
00137 } ;
00138 mutable RooObjCacheManager _cacheMgr ;
00139
00140 void rearrangeProduct(CacheElem&) const;
00141 RooAbsReal* specializeIntegral(RooAbsReal& orig, const char* targetRangeName) const ;
00142 RooAbsReal* specializeRatio(RooFormulaVar& input, const char* targetRangeName) const ;
00143 Double_t calculate(const RooProdPdf::CacheElem& cache, Bool_t verbose=kFALSE) const ;
00144 Double_t calculate(const RooArgList* partIntList, const RooLinkedList* normSetList) const ;
00145
00146
00147 friend class RooProdGenContext ;
00148 virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0,
00149 const RooArgSet *auxProto=0, Bool_t verbose= kFALSE) const ;
00150
00151 RooArgSet* findPdfNSet(RooAbsPdf& pdf) const ;
00152
00153 mutable RooAICRegistry _genCode ;
00154
00155 mutable RooArgSet* _curNormSet ;
00156 Double_t _cutOff ;
00157 RooListProxy _pdfList ;
00158 RooLinkedList _pdfNSetList ;
00159 TIterator* _pdfIter ;
00160 Int_t _extendedIndex ;
00161
00162 void useDefaultGen(Bool_t flag=kTRUE) { _useDefaultGen = flag ; }
00163 Bool_t _useDefaultGen ;
00164
00165 mutable TNamed* _refRangeName ;
00166
00167 Bool_t _selfNorm ;
00168 RooArgSet _defNormSet ;
00169
00170 private:
00171
00172 ClassDef(RooProdPdf,4)
00173 };
00174
00175
00176 #endif