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 }
void initialize()
The Minuit Migrad minimizer.
std::vector< limit > m_limits
The limit parameters.
Definition: MinuitMigrad.h:76
void add(const char *, double, double)
void fix(unsigned int)
bool isValid() const
hippodraw::MinuitMigrad class interface
MinuitMigrad(const MinuitMigrad &)
Private copy constructor to prevent user copying.
virtual Fitter * clone() const
Makes a copy of the receiving object.
std::string m_name
The name of the fitter.
Definition: Fitter.h:51
Structure to hold limit values, if any.
Definition: MinuitMigrad.h:68
Namespace for HippoDraw.
Definition: AxesType.cxx:21
The namespace for conversion to string.
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.
virtual void setStepSize(unsigned int i, double size)
Sets the step size used by MnMigrad.
hippodraw::StatedFCN class interface
void checkIndex(unsigned int index)
Checks the index and throws exception if out of range.
A Fitter class.
Definition: MinuitMigrad.h:54
The base class for fitters.
Definition: Fitter.h:33
const std::string & name() const
Returns the name of the fitter.
Definition: Fitter.cxx:57
StatedFCN * m_fcn
The objective function.
Definition: Fitter.h:59
virtual const std::vector< int > & getFixedFlags() const
Sets the limits of the model function parameter values.
Definition: Fitter.cxx:156
unsigned int nrow() const
bool set
true if limit has been set
Definition: MinuitMigrad.h:71
virtual bool calcBestFit()
Calculates the best fit.
string convert(int i)
Converts an integer to a string.
void initLimits()
Initializes the limits.
virtual int calcCovariance(std::vector< std::vector< double > > &cov)
Calculates the covariance matrix.

Generated for HippoDraw Class Library by doxygen