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 }

Generated for HippoDraw Class Library by doxygen