Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooAbsPdf.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitCore *
4  * File: $Id: RooAbsPdf.h,v 1.90 2007/07/21 21:32:52 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_ABS_PDF
17 #define ROO_ABS_PDF
18 
19 #include "RooAbsReal.h"
20 //#include "RooRealIntegral.h"
21 #include "RooNameSet.h"
22 #include "RooObjCacheManager.h"
23 #include "RooCmdArg.h"
24 
25 class RooDataSet;
26 class RooDataHist ;
27 class RooArgSet ;
28 class RooAbsGenContext ;
29 class RooFitResult ;
30 class RooExtendPdf ;
31 class RooCategory ;
32 class TPaveText;
33 class TH1F;
34 class TH2F;
35 class TList ;
36 class RooLinkedList ;
37 class RooNumGenConfig ;
38 class RooRealIntegral ;
39 
40 class RooAbsPdf : public RooAbsReal {
41 public:
42 
43  // Constructors, assignment etc
44  RooAbsPdf() ;
45  RooAbsPdf(const char *name, const char *title=0) ;
46  RooAbsPdf(const char *name, const char *title, Double_t minVal, Double_t maxVal) ;
47  // RooAbsPdf(const RooAbsPdf& other, const char* name=0);
48  virtual ~RooAbsPdf();
49 
50  // Toy MC generation
51 
52  ////////////////////////////////////////////////////////////////////////////////
53  /// See RooAbsPdf::generate(const RooArgSet&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&)
54  /// \param[in] nEvents How many events to generate
55  RooDataSet *generate(const RooArgSet &whatVars, Int_t nEvents, const RooCmdArg& arg1,
56  const RooCmdArg& arg2=RooCmdArg::none(), const RooCmdArg& arg3=RooCmdArg::none(),
57  const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none()) {
58  return generate(whatVars,RooFit::NumEvents(nEvents),arg1,arg2,arg3,arg4,arg5) ;
59  }
60  RooDataSet *generate(const RooArgSet &whatVars,
61  const RooCmdArg& arg1=RooCmdArg::none(),const RooCmdArg& arg2=RooCmdArg::none(),
62  const RooCmdArg& arg3=RooCmdArg::none(),const RooCmdArg& arg4=RooCmdArg::none(),
63  const RooCmdArg& arg5=RooCmdArg::none(),const RooCmdArg& arg6=RooCmdArg::none()) ;
64  RooDataSet *generate(const RooArgSet &whatVars, Double_t nEvents = 0, Bool_t verbose=kFALSE, Bool_t autoBinned=kTRUE,
65  const char* binnedTag="", Bool_t expectedData=kFALSE, Bool_t extended = kFALSE) const;
66  RooDataSet *generate(const RooArgSet &whatVars, const RooDataSet &prototype, Int_t nEvents= 0,
67  Bool_t verbose=kFALSE, Bool_t randProtoOrder=kFALSE, Bool_t resampleProto=kFALSE) const;
68 
69 
70  class GenSpec {
71  public:
72  virtual ~GenSpec() ;
73  GenSpec() { _genContext = 0 ; _protoData = 0 ; _init = kFALSE ; _extended=kFALSE, _nGen=0 ; _randProto = kFALSE ; _resampleProto=kFALSE ; }
74  private:
75  GenSpec(RooAbsGenContext* context, const RooArgSet& whatVars, RooDataSet* protoData, Int_t nGen, Bool_t extended,
76  Bool_t randProto, Bool_t resampleProto, TString dsetName, Bool_t init=kFALSE) ;
77  GenSpec(const GenSpec& other) ;
78 
79  friend class RooAbsPdf ;
80  RooAbsGenContext* _genContext ;
81  RooArgSet _whatVars ;
82  RooDataSet* _protoData ;
83  Int_t _nGen ;
84  Bool_t _extended ;
85  Bool_t _randProto ;
86  Bool_t _resampleProto ;
87  TString _dsetName ;
88  Bool_t _init ;
89  ClassDef(GenSpec,0) // Generation specification
90  } ;
91 
92  ///Prepare GenSpec configuration object for efficient generation of multiple datasets from identical specification.
93  GenSpec* prepareMultiGen(const RooArgSet &whatVars,
94  const RooCmdArg& arg1=RooCmdArg::none(),const RooCmdArg& arg2=RooCmdArg::none(),
95  const RooCmdArg& arg3=RooCmdArg::none(),const RooCmdArg& arg4=RooCmdArg::none(),
96  const RooCmdArg& arg5=RooCmdArg::none(),const RooCmdArg& arg6=RooCmdArg::none()) ;
97  ///Generate according to GenSpec obtained from prepareMultiGen().
98  RooDataSet* generate(GenSpec&) const ;
99 
100 
101  ////////////////////////////////////////////////////////////////////////////////
102  /// As RooAbsPdf::generateBinned(const RooArgSet&, const RooCmdArg&,const RooCmdArg&, const RooCmdArg&,const RooCmdArg&, const RooCmdArg&,const RooCmdArg&)
103  /// \param[in] nEvents How many events to generate
104  virtual RooDataHist *generateBinned(const RooArgSet &whatVars, Double_t nEvents, const RooCmdArg& arg1,
105  const RooCmdArg& arg2=RooCmdArg::none(), const RooCmdArg& arg3=RooCmdArg::none(),
106  const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none()) const {
107  return generateBinned(whatVars,RooFit::NumEvents(nEvents),arg1,arg2,arg3,arg4,arg5);
108  }
109  virtual RooDataHist *generateBinned(const RooArgSet &whatVars,
110  const RooCmdArg& arg1=RooCmdArg::none(),const RooCmdArg& arg2=RooCmdArg::none(),
111  const RooCmdArg& arg3=RooCmdArg::none(),const RooCmdArg& arg4=RooCmdArg::none(),
112  const RooCmdArg& arg5=RooCmdArg::none(),const RooCmdArg& arg6=RooCmdArg::none()) const;
113  virtual RooDataHist *generateBinned(const RooArgSet &whatVars, Double_t nEvents, Bool_t expectedData=kFALSE, Bool_t extended=kFALSE) const;
114 
115  virtual RooDataSet* generateSimGlobal(const RooArgSet& whatVars, Int_t nEvents) ;
116 
117  ///Helper calling plotOn(RooPlot*, RooLinkedList&) const
118  virtual RooPlot* plotOn(RooPlot* frame,
119  const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
120  const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(),
121  const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(),
122  const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none(),
123  const RooCmdArg& arg9=RooCmdArg::none(), const RooCmdArg& arg10=RooCmdArg::none()
124  ) const {
125  return RooAbsReal::plotOn(frame,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) ;
126  }
127  virtual RooPlot* plotOn(RooPlot* frame, RooLinkedList& cmdList) const ;
128 
129  /// Add a box with parameter values (and errors) to the specified frame
130  virtual RooPlot* paramOn(RooPlot* frame,
131  const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
132  const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(),
133  const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(),
134  const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
135 
136  virtual RooPlot* paramOn(RooPlot* frame, const RooAbsData* data, const char *label= "", Int_t sigDigits = 2,
137  Option_t *options = "NELU", Double_t xmin=0.50,
138  Double_t xmax= 0.99,Double_t ymax=0.95) ;
139 
140  // Built-in generator support
141  virtual Int_t getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const;
142  virtual void initGenerator(Int_t code) ;
143  virtual void generateEvent(Int_t code);
144  virtual Bool_t isDirectGenSafe(const RooAbsArg& arg) const ;
145 
146  // Configuration of MC generators used for this pdf
147  const RooNumGenConfig* getGeneratorConfig() const ;
148  static RooNumGenConfig* defaultGeneratorConfig() ;
149  RooNumGenConfig* specialGeneratorConfig() const ;
150  RooNumGenConfig* specialGeneratorConfig(Bool_t createOnTheFly) ;
151  void setGeneratorConfig() ;
152  void setGeneratorConfig(const RooNumGenConfig& config) ;
153 
154  // -log(L) fits to binned and unbinned data
155  virtual RooFitResult* fitTo(RooAbsData& data, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
156  const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
157  const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
158  virtual RooFitResult* fitTo(RooAbsData& data, const RooLinkedList& cmdList) ;
159 
160  virtual RooAbsReal* createNLL(RooAbsData& data, const RooLinkedList& cmdList) ;
161  virtual RooAbsReal* createNLL(RooAbsData& data, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
162  const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
163  const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
164 
165  // Chi^2 fits to histograms
166  using RooAbsReal::chi2FitTo ;
167  using RooAbsReal::createChi2 ;
168  virtual RooFitResult* chi2FitTo(RooDataHist& data, const RooLinkedList& cmdList) ;
169  virtual RooAbsReal* createChi2(RooDataHist& data, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
170  const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
171  const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
172 
173  // Chi^2 fits to X-Y datasets
174  virtual RooAbsReal* createChi2(RooDataSet& data, const RooLinkedList& cmdList) ;
175 
176 
177 
178 
179 
180  // Constraint management
181  virtual RooArgSet* getConstraints(const RooArgSet& /*observables*/, RooArgSet& /*constrainedParams*/, Bool_t /*stripDisconnected*/) const {
182  // Interface to retrieve constraint terms on this pdf. Default implementation returns null
183  return 0 ;
184  }
185  virtual RooArgSet* getAllConstraints(const RooArgSet& observables, RooArgSet& constrainedParams, Bool_t stripDisconnected=kTRUE) const ;
186 
187  // Project p.d.f into lower dimensional p.d.f
188  virtual RooAbsPdf* createProjection(const RooArgSet& iset) ;
189 
190  // Create cumulative density function from p.d.f
191  RooAbsReal* createCdf(const RooArgSet& iset, const RooArgSet& nset=RooArgSet()) ;
192  RooAbsReal* createCdf(const RooArgSet& iset, const RooCmdArg& arg1, const RooCmdArg& arg2=RooCmdArg::none(),
193  const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(),
194  const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(),
195  const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
196  RooAbsReal* createScanCdf(const RooArgSet& iset, const RooArgSet& nset, Int_t numScanBins, Int_t intOrder) ;
197 
198  // Function evaluation support
199  virtual Bool_t R__DEPRECATED(6,22,"Call traceEvalPdf() instead.") traceEvalHook(Double_t value) const ;
200  virtual Double_t getValV(const RooArgSet* set=0) const ;
201  virtual Double_t getLogVal(const RooArgSet* set=0) const ;
202 
203  virtual RooSpan<const double> getValBatch(std::size_t begin, std::size_t batchSize,
204  const RooArgSet* normSet = nullptr) const;
205  RooSpan<const double> getLogValBatch(std::size_t begin, std::size_t batchSize,
206  const RooArgSet* normSet = nullptr) const;
207 
208  Double_t getNorm(const RooArgSet& nset) const {
209  // Get p.d.f normalization term needed for observables 'nset'
210  return getNorm(&nset) ;
211  }
212  virtual Double_t getNorm(const RooArgSet* set=0) const ;
213 
214  virtual void resetErrorCounters(Int_t resetValue=10) ;
215  void setTraceCounter(Int_t value, Bool_t allNodes=kFALSE) ;
216 private:
217  Bool_t traceEvalPdf(Double_t value) const;
218 
219 public:
220 
221  Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;
222 
223  virtual Bool_t selfNormalized() const {
224  // If true, p.d.f is taken as self-normalized and no attempt is made to add a normalization term
225  // This default implementation return false
226  return kFALSE ;
227  }
228 
229  // Support for extended maximum likelihood, switched off by default
230  enum ExtendMode { CanNotBeExtended, CanBeExtended, MustBeExtended } ;
231  virtual ExtendMode extendMode() const {
232  // Returns ability of p.d.f to provided extended likelihood terms. Possible
233  // answers are CanNotBeExtended, CanBeExtended or MustBeExtended. This
234  // default implementation always return CanNotBeExtended
235  return CanNotBeExtended ;
236  }
237  inline Bool_t canBeExtended() const {
238  // If true p.d.f can provide extended likelihood term
239  return (extendMode() != CanNotBeExtended) ;
240  }
241  inline Bool_t mustBeExtended() const {
242  // If true p.d.f must extended likelihood term
243  return (extendMode() == MustBeExtended) ;
244  }
245  virtual Double_t expectedEvents(const RooArgSet* nset) const ;
246  virtual Double_t expectedEvents(const RooArgSet& nset) const {
247  // Return expecteded number of p.d.fs to be used in calculated of extended likelihood
248  return expectedEvents(&nset) ;
249  }
250 
251  // Printing interface (human readable)
252  virtual void printValue(std::ostream& os) const ;
253  virtual void printMultiline(std::ostream& os, Int_t contents, Bool_t verbose=kFALSE, TString indent="") const ;
254 
255  static void verboseEval(Int_t stat) ;
256  static int verboseEval() ;
257 
258  virtual Double_t extendedTerm(Double_t observedEvents, const RooArgSet* nset=0) const ;
259 
260  void setNormRange(const char* rangeName) ;
261  const char* normRange() const {
262  return _normRange.Length()>0 ? _normRange.Data() : 0 ;
263  }
264  void setNormRangeOverride(const char* rangeName) ;
265 
266  const RooAbsReal* getNormIntegral(const RooArgSet& nset) const { return getNormObj(0,&nset,0) ; }
267 
268 protected:
269 
270 public:
271  virtual const RooAbsReal* getNormObj(const RooArgSet* set, const RooArgSet* iset, const TNamed* rangeName=0) const ;
272 
273  virtual RooAbsGenContext* binnedGenContext(const RooArgSet &vars, Bool_t verbose= kFALSE) const ;
274 
275  virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0,
276  const RooArgSet* auxProto=0, Bool_t verbose= kFALSE) const ;
277 
278  virtual RooAbsGenContext* autoGenContext(const RooArgSet &vars, const RooDataSet* prototype=0, const RooArgSet* auxProto=0,
279  Bool_t verbose=kFALSE, Bool_t autoBinned=kTRUE, const char* binnedTag="") const ;
280 
281 private:
282 
283  RooDataSet *generate(RooAbsGenContext& context, const RooArgSet& whatVars, const RooDataSet* prototype,
284  Double_t nEvents, Bool_t verbose, Bool_t randProtoOrder, Bool_t resampleProto, Bool_t skipInit=kFALSE,
285  Bool_t extended=kFALSE) const ;
286 
287  // Implementation version
288  virtual RooPlot* paramOn(RooPlot* frame, const RooArgSet& params, Bool_t showConstants=kFALSE,
289  const char *label= "", Int_t sigDigits = 2, Option_t *options = "NELU", Double_t xmin=0.65,
290  Double_t xmax= 0.99,Double_t ymax=0.95, const RooCmdArg* formatCmd=0) ;
291 
292  void logBatchComputationErrors(RooSpan<const double>& outputs, std::size_t begin) const;
293 
294 protected:
295  virtual RooPlot *plotOn(RooPlot *frame, PlotOpt o) const;
296 
297  friend class RooEffGenContext ;
298  friend class RooAddGenContext ;
299  friend class RooProdGenContext ;
300  friend class RooSimGenContext ;
301  friend class RooSimSplitGenContext ;
302  friend class RooConvGenContext ;
303  friend class RooSimultaneous ;
304  friend class RooAddGenContextOrig ;
305  friend class RooProdPdf ;
306  friend class RooMCStudy ;
307 
308  Int_t* randomizeProtoOrder(Int_t nProto,Int_t nGen,Bool_t resample=kFALSE) const ;
309 
310  friend class RooExtendPdf ;
311  // This also forces the definition of a copy ctor in derived classes
312  RooAbsPdf(const RooAbsPdf& other, const char* name = 0);
313 
314  friend class RooRealIntegral ;
315  static Int_t _verboseEval ;
316 
317  virtual Bool_t syncNormalization(const RooArgSet* dset, Bool_t adjustProxies=kTRUE) const ;
318 
319  friend class RooAbsAnaConvPdf ;
320  mutable Double_t _rawValue ;
321  mutable RooAbsReal* _norm ; //! Normalization integral (owned by _normMgr)
322  mutable RooArgSet* _normSet ; //! Normalization set with for above integral
323 
324  class CacheElem : public RooAbsCacheElement {
325  public:
326  CacheElem(RooAbsReal& norm) : _norm(&norm) {} ;
327  void operModeHook(RooAbsArg::OperMode) ;
328  virtual ~CacheElem() ;
329  virtual RooArgList containedArgs(Action) { return RooArgList(*_norm) ; }
330  RooAbsReal* _norm ;
331  } ;
332  mutable RooObjCacheManager _normMgr ; // The cache manager
333 
334  friend class CacheElem ; // Cache needs to be able to clear _norm pointer
335 
336  virtual Bool_t redirectServersHook(const RooAbsCollection&, Bool_t, Bool_t, Bool_t) {
337  // Hook function intercepting redirectServer calls. Discard current normalization
338  // object if any server is redirected
339 
340  // Object is own by _normCacheManager that will delete object as soon as cache
341  // is sterilized by server redirect
342  _norm = 0 ;
343  return kFALSE ;
344  } ;
345 
346 
347  mutable Int_t _errorCount ; // Number of errors remaining to print
348  mutable Int_t _traceCount ; // Number of traces remaining to print
349  mutable Int_t _negCount ; // Number of negative probablities remaining to print
350 
351  Bool_t _selectComp ; // Component selection flag for RooAbsPdf::plotCompOn
352 
353  RooNumGenConfig* _specGeneratorConfig ; //! MC generator configuration specific for this object
354 
355  TString _normRange ; // Normalization range
356  static TString _normRangeOverride ;
357 
358  ClassDef(RooAbsPdf,4) // Abstract PDF with normalization support
359 };
360 
361 
362 #endif