MinuitMigrad.cxx
Go to the documentation of this file.
1 
12 #include "MinuitMigrad.h"
13 
14 #include "StatedFCN.h"
15 
16 #include "pattern/string_convert.h"
17 
18 #ifdef HAVE_MINUIT
19 #include <Minuit/FunctionMinimum.h>
20 #include <Minuit/MinuitParameter.h>
21 #include <Minuit/MnMigrad.h>
23 #endif
24 
25 #ifdef HAVE_MINUIT2
26 #include <Minuit2/FunctionMinimum.h>
27 #include <Minuit2/MinuitParameter.h>
28 #include <Minuit2/MnMigrad.h>
29 #include <Minuit2/MnUserParameters.h>
30 using namespace ROOT::Minuit2;
31 #endif
32 
33 #include <stdexcept>
34 
35 using std::string;
36 using std::vector;
37 
38 using namespace hippodraw;
39 
40 MinuitMigrad::
41 MinuitMigrad ( const char * name )
42  : Fitter ( name ),
43  m_minimizer ( 0 ) // null pointer
44 {
45 }
46 
48 MinuitMigrad ( const MinuitMigrad & mm )
49  : Fitter ( mm ),
50  m_minimizer ( 0 )
51 {
52 // if ( mm.m_minimizer != 0 ) {
53 // m_minimizer = new MnMigrad ( * mm.m_minimizer );
54 // }
55 }
56 
57 Fitter *
59 clone ( ) const
60 {
61  return new MinuitMigrad ( *this );
62 }
63 void
66 {
67  m_minimizer = 0;
68  bool yes = m_fcn -> hasFunction ();
69  if ( yes ) {
70  const vector < double > & parms = m_fcn -> getParameters ();
71  const vector < int > & fixes = m_fcn -> getFixedFlags ();
72  assert ( fixes.size() == parms.size() );
73  unsigned int size = parms.size ();
74  MnUserParameters mn_parms;
75 
76  // Minuit has limit of 11 characters in parameter names. So we
77  // don't give the real names which could be longer.
78  for ( unsigned int i = 0; i < size; i++ ) {
79  const string name = String::convert ( i );
80  double value = parms [ i ];
81 #ifdef HAVE_MINUIT
82  mn_parms.add ( name.c_str(), value, 0.1 );
83 #else
84  mn_parms.Add ( name.c_str(), value, 0.1 );
85 #endif
86 
87  if ( fixes [ i ] != 0 ) {
88 #ifdef HAVE_MINUIT
89  mn_parms.fix ( i );
90 #else
91  mn_parms.Fix ( i );
92 #endif
93  }
94  }
95 
96  m_minimizer = new MnMigrad ( *m_fcn, mn_parms );
97 
98  if ( m_limits.empty () == false ) {
99  for ( unsigned int i = 0; i < m_limits.size (); i++ ) {
100  if ( m_limits[i].set == true ) {
101 #ifdef HAVE_MINUIT
102  m_minimizer -> setLimits ( i, m_limits[i].lower, m_limits[i].upper );
103 #else
104  m_minimizer -> SetLimits ( i, m_limits[i].lower, m_limits[i].upper );
105 #endif
106  }
107  }
108  }
109 
110  }
111 }
112 
113 void
115 checkIndex ( unsigned int i )
116 {
117  if ( m_minimizer == 0 ) initialize ();
118 
119  if ( m_minimizer == 0 ) {
120  string what ( m_name );
121  what += ": model function no yet set";
122  throw std::runtime_error ( what );
123  }
124  const vector < double > & parms = m_fcn -> getParameters ();
125  unsigned int size = parms.size();
126  if ( i < size == false ) {
127  string what ( m_name );
128  what += ": index to parameter out of range";
129  throw std::runtime_error ( what );
130  }
131 }
132 
133 void
136 {
137  const vector < double > & parms = m_fcn -> getParameters ();
138  for ( unsigned int i = 0; i < parms.size(); i ++ ) {
139  limit l;
140  l.set = false;
141  m_limits.push_back ( l );
142  }
143 }
144 
145 void
147 setLimits ( unsigned int i, double lower, double upper )
148 {
149  if ( m_limits.empty() == true ) {
150  initLimits ();
151  }
152 
153  checkIndex ( i );
154 
155  m_limits[i].lower = lower;
156  m_limits[i].upper = upper;
157  m_limits[i].set = true;
158 }
159 
160 void
162 setStepSize ( unsigned int i, double size )
163 {
164  checkIndex ( i );
165 #ifdef HAVE_MINUIT2
166  m_minimizer -> SetError ( i, size );
167 #else
168  m_minimizer -> setError ( i, size );
169 #endif
170 }
171 
178 bool
181 {
182  initialize ();
183  FunctionMinimum fun_min = m_minimizer -> operator () ();
184  // in the above call, hidden parameters are maxfcn=0, edm=1.e-5
185 
186 #ifdef HAVE_MINUIT2
187  bool yes = fun_min.IsValid ();
188 #else
189  bool yes = fun_min.isValid ();
190 #endif
191 
192  if ( yes ) {
193 
194 #ifdef HAVE_MINUIT2
195  std::vector < double > cur_parms = m_minimizer -> Params();
196 #else
197  std::vector < double > cur_parms = m_minimizer -> params();
198 #endif
199  m_fcn -> setParameters ( cur_parms );
200  }
201  return yes;
202 }
203 
204 int
206 calcCovariance ( std::vector < std::vector < double > >& covar )
207 {
208  if ( m_minimizer == 0 ) initialize ();
209 
210 #ifdef HAVE_MINUIT2
211  const MnUserCovariance & covar_m = m_minimizer ->Covariance ();
212  unsigned int size = covar_m.Nrow ();
213 #else
214  const MnUserCovariance & covar_m = m_minimizer ->covariance ();
215  unsigned int size = covar_m.nrow ();
216 #endif
217  covar.resize ( size );
218  for ( unsigned int i = 0; i < size; i++ ) {
219  covar[i].resize ( size, 0.0 );
220  }
221 
222  for ( unsigned int i = 0; i < size; i++ ) {
223  for ( unsigned int j = 0; j < size; j++ ) {
224  covar[i][j] = covar_m ( i, j );
225  }
226  }
227 
228  return EXIT_SUCCESS;
229 }
unsigned int i
A Fitter class.
Definition: MinuitMigrad.h:54
void add(const char *, double, double)
void fix(unsigned int)
bool isValid() const
virtual void setStepSize(unsigned int i, double size)
Sets the step size used by MnMigrad.
void initLimits()
Initializes the limits.
std::string m_name
The name of the fitter.
Definition: Fitter.h:51
void initialize()
The Minuit Migrad minimizer.
The namespace for conversion to string.
return yes
Definition: CanvasView.cxx:883
The base class for fitters.
Definition: Fitter.h:33
virtual int calcCovariance(std::vector< std::vector< double > > &cov)
Calculates the covariance matrix.
intp size(numeric::array arr)
Definition: num_util.cpp:296
virtual void setLimits(unsigned int i, double lower, double upper)
Sets the upper and lower limits of the parameter.
string convert(int i)
Converts an integer to a string.
virtual bool calcBestFit()
Calculates the best fit.
Structure to hold limit values, if any.
Definition: MinuitMigrad.h:68
const std::string & name() const
Returns the name of the fitter.
Definition: Fitter.cxx:57
hippodraw::MinuitMigrad class interface
bool set
true if limit has been set
Definition: MinuitMigrad.h:71
std::vector< limit > m_limits
The limit parameters.
Definition: MinuitMigrad.h:76
void checkIndex(unsigned int index)
Checks the index and throws exception if out of range.
unsigned int nrow() const
MinuitMigrad(const MinuitMigrad &)
Private copy constructor to prevent user copying.
hippodraw::StatedFCN class interface
virtual const std::vector< int > & getFixedFlags() const
Sets the limits of the model function parameter values.
Definition: Fitter.cxx:156
virtual Fitter * clone() const
Makes a copy of the receiving object.
StatedFCN * m_fcn
The objective function.
Definition: Fitter.h:59

Generated for HippoDraw Class Library by doxygen