Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
ProposalFunction.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 
13 
14 
15 #ifndef ROOSTATS_ProposalFunction
16 #define ROOSTATS_ProposalFunction
17 
18 #include "Rtypes.h"
19 
20 #include "RooArgSet.h"
21 #include "RooMsgService.h"
22 #include "TIterator.h"
23 #include "RooRealVar.h"
24 
25 
26 namespace RooStats {
27 
28 /** \class ProposalFunction
29  \ingroup Roostats
30 ProposalFunction is an interface for all proposal functions that would be used
31 with a Markov Chain Monte Carlo algorithm.
32 Given a current point in the parameter space it proposes a new point.
33 Proposal functions may or may not be symmetric, in the sense that the
34 probability to propose X1 given we are at X2
35 need not be the same as the probability to propose X2 given that we are at X1.
36 In this case, the IsSymmetric method
37 should return false, and the Metropolis algorithm will need to take into account
38 the proposal density to maintain detailed balance.
39 */
40 
41 
42  class ProposalFunction : public TObject {
43 
44  public:
45  ///Default constructor
46  ProposalFunction() {}
47 
48  virtual ~ProposalFunction() {}
49 
50  /// Populate xPrime with the new proposed point,
51  /// possibly based on the current point x
52  virtual void Propose(RooArgSet& xPrime, RooArgSet& x) = 0;
53 
54  /// Determine whether or not the proposal density is symmetric for
55  /// points x1 and x2 - that is, whether the probability of reaching x2
56  /// from x1 is equal to the probability of reaching x1 from x2
57  virtual Bool_t IsSymmetric(RooArgSet& x1, RooArgSet& x2) = 0;
58 
59  /// Return the probability of proposing the point x1 given the starting
60  /// point x2
61  virtual Double_t GetProposalDensity(RooArgSet& x1, RooArgSet& x2) = 0;
62 
63  /// Check the parameters for which the ProposalFunction will
64  /// propose values to make sure they are all RooRealVars
65  /// Return true if all objects are RooRealVars, false otherwise
66  virtual bool CheckParameters(RooArgSet& params)
67  {
68  TIterator* it = params.createIterator();
69  TObject* obj;
70  while ((obj = it->Next()) != NULL) {
71  if (!dynamic_cast<RooRealVar*>(obj)) {
72  coutE(Eval) << "Error when checking parameters in"
73  << "ProposalFunction: "
74  << "Object \"" << obj->GetName() << "\" not of type "
75  << "RooRealVar" << std::endl;
76  delete it;
77  return false;
78  }
79  }
80  delete it;
81  // Made it here, so all parameters are RooRealVars
82  return true;
83  }
84 
85  protected:
86  ClassDef(ProposalFunction,1) /// Interface for the proposal function used with Markov Chain Monte Carlo
87  };
88 }
89 
90 #endif