RooProdPdf.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitCore                                                       *
00004  *    File: $Id: RooProdPdf.h,v 1.44 2007/07/16 21:04:28 wouter Exp $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
00007  *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
00008  *                                                                           *
00009  * Copyright (c) 2000-2005, Regents of the University of California          *
00010  *                          and Stanford University. All rights reserved.    *
00011  *                                                                           *
00012  * Redistribution and use in source and binary forms,                        *
00013  * with or without modification, are permitted according to the terms        *
00014  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
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   // Constraint management
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* /*nset*/, RooArgSet* /*list*/, 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   // The cache object
00119   class CacheElem : public RooAbsCacheElement {
00120   public:
00121     CacheElem() : _isRearranged(kFALSE), _rearrangedNum(0), _rearrangedDen(0) {} 
00122     virtual ~CacheElem() ;
00123     // Payload
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     // Cache management functions
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 ; // The cache manager
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 ; //! Registry of composite direct generator codes
00154 
00155   mutable RooArgSet* _curNormSet ; //!
00156   Double_t _cutOff ;       //  Cutoff parameter for running product
00157   RooListProxy _pdfList ;  //  List of PDF components
00158   RooLinkedList _pdfNSetList ; // List of PDF component normalization sets
00159   TIterator* _pdfIter ;    //! Iterator of PDF list
00160   Int_t _extendedIndex ;   //  Index of extended PDF (if any) 
00161 
00162   void useDefaultGen(Bool_t flag=kTRUE) { _useDefaultGen = flag ; }
00163   Bool_t _useDefaultGen ; // Use default or distributed event generator
00164 
00165   mutable TNamed* _refRangeName ; // Reference range name for interpretation of conditional products
00166 
00167   Bool_t _selfNorm ; // Is self-normalized
00168   RooArgSet _defNormSet ; // Default normalization set
00169   
00170 private:
00171 
00172   ClassDef(RooProdPdf,4) // PDF representing a product of PDFs
00173 };
00174 
00175 
00176 #endif

Generated on Tue Jul 5 14:26:18 2011 for ROOT_528-00b_version by  doxygen 1.5.1