Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooProdPdf.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitCore *
4  * File: $Id: RooProdPdf.h,v 1.44 2007/07/16 21:04:28 wouter Exp $
5  * Authors: *
6  * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7  * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8  * *
9  * Copyright (c) 2000-2005, Regents of the University of California *
10  * and Stanford University. All rights reserved. *
11  * *
12  * Redistribution and use in source and binary forms, *
13  * with or without modification, are permitted according to the terms *
14  * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15  *****************************************************************************/
16 #ifndef ROO_PROD_PDF
17 #define ROO_PROD_PDF
18 
19 #include "RooAbsPdf.h"
20 #include "RooListProxy.h"
21 #include "RooLinkedList.h"
22 #include "RooAICRegistry.h"
23 #include "RooCacheManager.h"
24 #include "RooObjCacheManager.h"
25 #include "RooCmdArg.h"
26 #include <vector>
27 
28 typedef RooArgList* pRooArgList ;
29 typedef RooLinkedList* pRooLinkedList ;
30 
31 class RooProdPdf : public RooAbsPdf {
32 public:
33  RooProdPdf() ;
34  RooProdPdf(const char *name, const char *title, Double_t cutOff=0);
35  RooProdPdf(const char *name, const char *title,
36  RooAbsPdf& pdf1, RooAbsPdf& pdf2, Double_t cutOff=0) ;
37  RooProdPdf(const char* name, const char* title, const RooArgList& pdfList, Double_t cutOff=0) ;
38  RooProdPdf(const char* name, const char* title, const RooArgSet& fullPdfSet, const RooLinkedList& cmdArgList) ;
39 
40  RooProdPdf(const char* name, const char* title, const RooArgSet& fullPdfSet,
41  const RooCmdArg& arg1 , const RooCmdArg& arg2=RooCmdArg(),
42  const RooCmdArg& arg3=RooCmdArg(), const RooCmdArg& arg4=RooCmdArg(),
43  const RooCmdArg& arg5=RooCmdArg(), const RooCmdArg& arg6=RooCmdArg(),
44  const RooCmdArg& arg7=RooCmdArg(), const RooCmdArg& arg8=RooCmdArg()) ;
45 
46  RooProdPdf(const char* name, const char* title,
47  const RooCmdArg& arg1, const RooCmdArg& arg2=RooCmdArg(),
48  const RooCmdArg& arg3=RooCmdArg(), const RooCmdArg& arg4=RooCmdArg(),
49  const RooCmdArg& arg5=RooCmdArg(), const RooCmdArg& arg6=RooCmdArg(),
50  const RooCmdArg& arg7=RooCmdArg(), const RooCmdArg& arg8=RooCmdArg()) ;
51 
52  RooProdPdf(const RooProdPdf& other, const char* name=0) ;
53  virtual TObject* clone(const char* newname) const { return new RooProdPdf(*this,newname) ; }
54  virtual ~RooProdPdf() ;
55 
56  virtual Double_t getValV(const RooArgSet* set=0) const ;
57  virtual Bool_t checkObservables(const RooArgSet* nset) const ;
58 
59  virtual Bool_t forceAnalyticalInt(const RooAbsArg& dep) const ;
60  Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& numVars, const RooArgSet* normSet, const char* rangeName=0) const ;
61  Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;
62  virtual Bool_t selfNormalized() const { return _selfNorm ; }
63 
64  virtual ExtendMode extendMode() const ;
65  virtual Double_t expectedEvents(const RooArgSet* nset) const ;
66  virtual Double_t expectedEvents(const RooArgSet& nset) const { return expectedEvents(&nset) ; }
67 
68  const RooArgList& pdfList() const { return _pdfList ; }
69 
70  virtual Int_t getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const;
71  virtual void initGenerator(Int_t code) ;
72  virtual void generateEvent(Int_t code);
73  virtual Bool_t isDirectGenSafe(const RooAbsArg& arg) const ;
74 
75  // Constraint management
76  virtual RooArgSet* getConstraints(const RooArgSet& observables, RooArgSet& constrainedParams, Bool_t stripDisconnected) const ;
77 
78  virtual std::list<Double_t>* plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const ;
79  virtual std::list<Double_t>* binBoundaries(RooAbsRealLValue& /*obs*/, Double_t /*xlo*/, Double_t /*xhi*/) const ;
80  Bool_t isBinnedDistribution(const RooArgSet& obs) const ;
81 
82  void printMetaArgs(std::ostream& os) const ;
83 
84  virtual void selectNormalizationRange(const char* rangeName=0, Bool_t force=kFALSE) ;
85  void fixRefRange(const char* rangeName) ;
86 
87  void setSelfNormalized(Bool_t flag) { _selfNorm = flag ; }
88  void setDefNormSet(const RooArgSet& nset) { _defNormSet.removeAll() ; _defNormSet.addClone(nset) ; }
89 
90 
91  Bool_t redirectServersHook(const RooAbsCollection& /*newServerList*/, Bool_t /*mustReplaceAll*/, Bool_t /*nameChange*/, Bool_t /*isRecursive*/) ;
92 
93  RooArgSet* getConnectedParameters(const RooArgSet& observables) const ;
94 
95  RooArgSet* findPdfNSet(RooAbsPdf& pdf) const ;
96 
97 
98 private:
99 
100  Double_t evaluate() const ;
101  virtual RooSpan<double> evaluateBatch(std::size_t begin, std::size_t size) const;
102 
103  RooAbsReal* makeCondPdfRatioCorr(RooAbsReal& term, const RooArgSet& termNset, const RooArgSet& termImpSet, const char* normRange, const char* refRange) const ;
104 
105  virtual void getParametersHook(const RooArgSet* /*nset*/, RooArgSet* /*list*/, Bool_t stripDisconnected) const ;
106 
107  void initializeFromCmdArgList(const RooArgSet& fullPdfSet, const RooLinkedList& l) ;
108 
109  void factorizeProduct(const RooArgSet& normSet, const RooArgSet& intSet,
110  RooLinkedList& termList, RooLinkedList& normList,
111  RooLinkedList& impDepList, RooLinkedList& crossDepList,
112  RooLinkedList& intList) const;
113  std::string makeRGPPName(const char* pfx, const RooArgSet& term, const RooArgSet& iset, const RooArgSet& nset, const char* isetRangeName) const ;
114  void groupProductTerms(RooLinkedList& groupedTerms, RooArgSet& outerIntDeps,
115  const RooLinkedList& terms, const RooLinkedList& norms,
116  const RooLinkedList& imps, const RooLinkedList& ints, const RooLinkedList& cross) const ;
117 
118 
119 
120  Int_t getPartIntList(const RooArgSet* nset, const RooArgSet* iset, const char* isetRangeName=0) const ;
121 
122  std::vector<RooAbsReal*> processProductTerm(const RooArgSet* nset, const RooArgSet* iset, const char* isetRangeName,
123  const RooArgSet* term,const RooArgSet& termNSet, const RooArgSet& termISet,
124  Bool_t& isOwned, Bool_t forceWrap=kFALSE) const ;
125 
126 
127  virtual CacheMode canNodeBeCached() const { return RooAbsArg::NotAdvised ; } ;
128  virtual void setCacheAndTrackHints(RooArgSet&) ;
129 
130  // The cache object
131  class CacheElem : public RooAbsCacheElement {
132  public:
133  CacheElem() : _isRearranged(kFALSE) { }
134  virtual ~CacheElem() = default;
135  // Payload
136  RooArgList _partList ;
137  RooArgList _numList ;
138  RooArgList _denList ;
139  RooArgList _ownedList ;
140  std::vector<std::unique_ptr<RooArgSet>> _normList;
141  Bool_t _isRearranged ;
142  std::unique_ptr<RooAbsReal> _rearrangedNum{};
143  std::unique_ptr<RooAbsReal> _rearrangedDen{};
144  // Cache management functions
145  virtual RooArgList containedArgs(Action) ;
146  virtual void printCompactTreeHook(std::ostream&, const char *, Int_t, Int_t) ;
147  private:
148  CacheElem(const CacheElem&) ;
149  } ;
150  mutable RooObjCacheManager _cacheMgr ; // The cache manager
151 
152  void rearrangeProduct(CacheElem&) const;
153  RooAbsReal* specializeIntegral(RooAbsReal& orig, const char* targetRangeName) const ;
154  RooAbsReal* specializeRatio(RooFormulaVar& input, const char* targetRangeName) const ;
155  Double_t calculate(const RooProdPdf::CacheElem& cache, Bool_t verbose=kFALSE) const ;
156 
157 
158  friend class RooProdGenContext ;
159  virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0,
160  const RooArgSet *auxProto=0, Bool_t verbose= kFALSE) const ;
161 
162 
163  mutable RooAICRegistry _genCode ; //! Registry of composite direct generator codes
164 
165  mutable RooArgSet* _curNormSet = nullptr; //!
166  Double_t _cutOff ; // Cutoff parameter for running product
167  RooListProxy _pdfList ; // List of PDF components
168  RooLinkedList _pdfNSetList ; // List of PDF component normalization sets
169  Int_t _extendedIndex ; // Index of extended PDF (if any)
170 
171  void useDefaultGen(Bool_t flag=kTRUE) { _useDefaultGen = flag ; }
172  Bool_t _useDefaultGen ; // Use default or distributed event generator
173 
174  mutable TNamed* _refRangeName ; // Reference range name for interpretation of conditional products
175 
176  Bool_t _selfNorm ; // Is self-normalized
177  RooArgSet _defNormSet ; // Default normalization set
178 
179 private:
180 
181  ClassDef(RooProdPdf,4) // PDF representing a product of PDFs
182 };
183 
184 
185 #endif