Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
PdfProposal.h
Go to the documentation of this file.
1 // @(#)root/roostats:$Id$
2 // Authors: Kevin Belasco 17/06/2009
3 // Authors: Kyle Cranmer 17/06/2009
4 /*************************************************************************
5  * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOSTATS_PdfProposal
13 #define ROOSTATS_PdfProposal
14 
15 #include "Rtypes.h"
16 
18 
19 #include "RooArgSet.h"
20 #include "RooMsgService.h"
21 #include "RooRealVar.h"
22 #include "RooDataSet.h"
23 #include "RooAbsPdf.h"
24 
25 #include <map>
26 
27 
28 namespace RooStats {
29 
30  class PdfProposal : public ProposalFunction {
31 
32  public:
33  PdfProposal();
34  PdfProposal(RooAbsPdf& pdf);
35 
36  /// Populate xPrime with a new proposed point
37  virtual void Propose(RooArgSet& xPrime, RooArgSet& x);
38 
39  /// Determine whether or not the proposal density is symmetric for
40  /// points x1 and x2 - that is, whether the probabilty of reaching x2
41  /// from x1 is equal to the probability of reaching x1 from x2
42  virtual Bool_t IsSymmetric(RooArgSet& x1, RooArgSet& x2);
43 
44  /// Return the probability of proposing the point x1 given the starting
45  /// point x2
46  virtual Double_t GetProposalDensity(RooArgSet& x1, RooArgSet& x2);
47 
48  /// Set the PDF to be the proposal density function
49  virtual void SetPdf(RooAbsPdf& pdf) { fPdf = &pdf; }
50 
51  /// Get the PDF is the proposal density function
52  virtual const RooAbsPdf* GetPdf() const { return fPdf; }
53 
54  /// specify a mapping between a parameter of the proposal function and
55  /// a parameter of interest. this mapping is used to set the value of
56  /// proposalParam equal to the value of update to determine the
57  /// proposal function.
58  /// proposalParam is a parameter of the proposal function that must
59  /// be set to the value of update (from the current point) in order to
60  /// propose a new point.
61  virtual void AddMapping(RooRealVar& proposalParam, RooAbsReal& update);
62 
63  virtual void Reset()
64  {
65  delete fCache;
66  fCache = NULL;
67  fCachePosition = 0;
68  fLastX.removeAll();
69  }
70 
71  virtual void printMappings()
72  {
73  std::map<RooRealVar*, RooAbsReal*>::iterator it;
74  for (it = fMap.begin(); it != fMap.end(); it++)
75  std::cout << it->first->GetName() << " => " << it->second->GetName() << std::endl;
76  }
77 
78  /// Set how many points to generate each time we propose from a new point
79  /// Default (and minimum) is 1
80  virtual void SetCacheSize(Int_t size)
81  {
82  if (size > 0)
83  fCacheSize = size;
84  else
85  coutE(Eval) << "Warning: Requested non-positive cache size: " <<
86  size << ". Cache size unchanged." << std::endl;
87  }
88 
89  /// set whether we own the PDF that serves as the proposal density function
90  /// By default, when constructed, PdfProposal does NOT own the PDF.
91  virtual void SetOwnsPdf(Bool_t ownsPdf) { fOwnsPdf = ownsPdf; }
92 
93  //virtual void SetIsAlwaysSymmetric(Bool_t isAlwaysSymmetric)
94  //{ fIsAlwaysSymmetric = isAlwaysSymmetric; }
95 
96  virtual ~PdfProposal()
97  {
98  delete fCache;
99  if (fOwnsPdf)
100  delete fPdf;
101  }
102 
103  protected:
104  RooAbsPdf* fPdf; /// the proposal density function
105  std::map<RooRealVar*, RooAbsReal*> fMap; /// map of values in pdf to update
106  std::map<RooRealVar*, RooAbsReal*>::iterator fIt; /// pdf iterator
107  RooArgSet fLastX; /// the last point we were at
108  Int_t fCacheSize; /// how many points to generate each time
109  Int_t fCachePosition; /// our position in the cached proposal data set
110  RooDataSet* fCache; /// the cached proposal data set
111  RooArgSet fMaster; /// pointers to master variables needed for updates
112  Bool_t fOwnsPdf; /// whether we own the proposal density function
113  //Bool_t fIsAlwaysSymmetric; // does Q(x1 | x2) == Q(x2 | x1) for all x1, x2
114 
115  /// determine whether these two RooArgSets represent the same point
116  virtual Bool_t Equals(RooArgSet& x1, RooArgSet& x2);
117 
118  /// Interface for tools setting limits (producing confidence intervals)
119  ClassDef(PdfProposal,1)
120  };
121 }
122 
123 #endif