ROOT  6.06/09
Reference Guide
MinuitFitter.cxx
Go to the documentation of this file.
1 // @(#)root/tmva $Id$
2 // Author: Andraes Hoecker
3 
4 /**********************************************************************************
5  * Project: TMVA - a Root-integrated toolkit for multivariate data analysis *
6  * Package: TMVA *
7  * Class : MinuitFitter *
8  * Web : http://tmva.sourceforge.net *
9  * *
10  * Description: *
11  * Implementation *
12  * *
13  * Authors (alphabetical): *
14  * Andreas Hoecker <Andreas.Hocker@cern.ch> - CERN, Switzerland *
15  * *
16  * Copyright (c) 2005: *
17  * CERN, Switzerland *
18  * MPI-K Heidelberg, Germany *
19  * *
20  * Redistribution and use in source and binary forms, with or without *
21  * modification, are permitted according to the terms listed in LICENSE *
22  * (http://tmva.sourceforge.net/LICENSE) *
23  **********************************************************************************/
24 
25 //_______________________________________________________________________
26 //
27 // Fitter using MINUIT
28 //_______________________________________________________________________
29 
30 #include "TFitter.h"
31 #include "TMVA/MinuitFitter.h"
32 #include "TMVA/MinuitWrapper.h"
33 #include "TMVA/Interval.h"
34 #include "TMVA/Timer.h"
35 
37 
38 ////////////////////////////////////////////////////////////////////////////////
39 /// constructor
40 
41 TMVA::MinuitFitter::MinuitFitter( IFitterTarget& target,
42  const TString& name,
43  std::vector<TMVA::Interval*>& ranges,
44  const TString& theOption )
45  : TMVA::FitterBase( target, name, ranges, theOption ),
46  TMVA::IFitterTarget( )
47 {
48  // default parameters settings for Simulated Annealing algorithm
49  DeclareOptions();
50  ParseOptions();
51 
52  Init(); // initialise the TFitter
53 }
54 
55 ////////////////////////////////////////////////////////////////////////////////
56 /// destructor
57 
59 {
60  delete fMinWrap;
61 }
62 
63 ////////////////////////////////////////////////////////////////////////////////
64 /// declare SA options
65 
67 {
68  DeclareOptionRef(fErrorLevel = 1, "ErrorLevel", "TMinuit: error level: 0.5=logL fit, 1=chi-squared fit" );
69  DeclareOptionRef(fPrintLevel = -1, "PrintLevel", "TMinuit: output level: -1=least, 0, +1=all garbage" );
70  DeclareOptionRef(fFitStrategy = 2, "FitStrategy", "TMinuit: fit strategy: 2=best" );
71  DeclareOptionRef(fPrintWarnings = kFALSE, "PrintWarnings", "TMinuit: suppress warnings" );
72  DeclareOptionRef(fUseImprove = kTRUE, "UseImprove", "TMinuit: use IMPROVE" );
73  DeclareOptionRef(fUseMinos = kTRUE, "UseMinos", "TMinuit: use MINOS" );
74  DeclareOptionRef(fBatch = kFALSE, "SetBatch", "TMinuit: use batch mode" );
75  DeclareOptionRef(fMaxCalls = 1000, "MaxCalls", "TMinuit: approximate maximum number of function calls" );
76  DeclareOptionRef(fTolerance = 0.1, "Tolerance", "TMinuit: tolerance to the function value at the minimum" );
77 }
78 
79 ////////////////////////////////////////////////////////////////////////////////
80 /// minuit-specific settings
81 
83 {
84  Double_t args[10];
85 
86  // Execute fitting
87  if (!fBatch) Log() << kINFO << "<MinuitFitter> Init " << Endl;
88 
89  // timing of MC
90  Timer timer;
91 
92  // initialize first -> prepare the fitter
93 
94  // instantiate minuit
95  // maximum number of fit parameters is equal to
96  // (2xnpar as workaround for TMinuit allocation bug (taken from RooMinuit))
97  fMinWrap = new MinuitWrapper( fFitterTarget, 2*GetNpars() );
98 
99  // output level
100  args[0] = fPrintLevel;
101  fMinWrap->ExecuteCommand( "SET PRINTOUT", args, 1 );
102 
103  if (fBatch) fMinWrap->ExecuteCommand( "SET BAT", args, 0 );
104 
105  // set fitter object, and clear
106  fMinWrap->Clear();
107 
108  // error level: 1 (2*log(L) fit
109  args[0] = fErrorLevel;
110  fMinWrap->ExecuteCommand( "SET ERR", args, 1 );
111 
112  // print warnings ?
113  if (!fPrintWarnings) fMinWrap->ExecuteCommand( "SET NOWARNINGS", args, 0 );
114 
115  // define fit strategy
116  args[0] = fFitStrategy;
117  fMinWrap->ExecuteCommand( "SET STRATEGY", args, 1 );
118 }
119 
120 ////////////////////////////////////////////////////////////////////////////////
121 /// performs the fit
122 
123 Double_t TMVA::MinuitFitter::Run( std::vector<Double_t>& pars )
124 {
125  // minuit-specific settings
126  Double_t args[10];
127 
128  // Execute fitting
129  if ( !fBatch ) Log() << kINFO << "<MinuitFitter> Fitting, please be patient ... " << Endl;
130 
131  // sanity check
132  if ((Int_t)pars.size() != GetNpars())
133  Log() << kFATAL << "<Run> Mismatch in number of parameters: (a)"
134  << GetNpars() << " != " << pars.size() << Endl;
135 
136  // timing of MC
137  Timer* timer = 0;
138  if (!fBatch) timer = new Timer();
139 
140  // define fit parameters
141  for (Int_t ipar=0; ipar<fNpars; ipar++) {
142  fMinWrap->SetParameter( ipar, Form( "Par%i",ipar ),
143  pars[ipar], fRanges[ipar]->GetWidth()/100.0,
144  fRanges[ipar]->GetMin(), fRanges[ipar]->GetMax() );
145  if (fRanges[ipar]->GetWidth() == 0.0) fMinWrap->FixParameter( ipar );
146  }
147 
148  // --------- execute the fit
149 
150  // continue with usual case
151  args[0] = fMaxCalls;
152  args[1] = fTolerance;
153 
154  // MIGRAD
155  fMinWrap->ExecuteCommand( "MIGrad", args, 2 );
156 
157  // IMPROVE
158  if (fUseImprove) fMinWrap->ExecuteCommand( "IMProve", args, 0 );
159 
160  // MINOS
161  if (fUseMinos) {
162  args[0] = 500;
163  fMinWrap->ExecuteCommand( "MINOs", args, 1 );
164  }
165 
166  // retrieve fit result (statistics)
167  Double_t chi2;
168  Double_t edm;
169  Double_t errdef;
170  Int_t nvpar;
171  Int_t nparx;
172  fMinWrap->GetStats( chi2, edm, errdef, nvpar, nparx );
173 
174  // sanity check
175  if (GetNpars() != nparx) {
176  Log() << kFATAL << "<Run> Mismatch in number of parameters: "
177  << GetNpars() << " != " << nparx << Endl;
178  }
179 
180  // retrieve parameters
181  for (Int_t ipar=0; ipar<GetNpars(); ipar++) {
182  Double_t errp, errm, errsym, globcor, currVal, currErr;
183  fMinWrap->GetParameter( ipar, currVal, currErr );
184  pars[ipar] = currVal;
185  fMinWrap->GetErrors( ipar, errp, errm, errsym, globcor );
186  }
187 
188  // clean up
189 
190  // get elapsed time
191  if (!fBatch) {
192  Log() << kINFO << "Elapsed time: " << timer->GetElapsedTime()
193  << " " << Endl;
194  delete timer;
195  }
196 
197  fMinWrap->Clear();
198 
199  return chi2;
200 }
201 
202 ////////////////////////////////////////////////////////////////////////////////
203 /// performs the fit by calliung Run(pars)
204 
205 Double_t TMVA::MinuitFitter::EstimatorFunction( std::vector<Double_t>& pars )
206 {
207  return Run( pars );
208 }
209 
210 
virtual void Clear(Option_t *="")
Definition: TObject.h:110
MsgLogger & Endl(MsgLogger &ml)
Definition: MsgLogger.h:162
virtual ~MinuitFitter()
destructor
Basic string class.
Definition: TString.h:137
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: Rtypes.h:92
STL namespace.
TStopwatch timer
Definition: pirndm.C:37
Double_t Run()
estimator function interface for fitting
Definition: FitterBase.cxx:73
void Init()
minuit-specific settings
void Init(TClassEdit::TInterpreterLookupHelper *helper)
Definition: TClassEdit.cxx:118
TString GetElapsedTime(Bool_t Scientific=kTRUE)
Definition: Timer.cxx:131
ClassImp(TMVA::MinuitFitter) TMVA
constructor
RooCmdArg Timer(Bool_t flag=kTRUE)
char * Form(const char *fmt,...)
double Double_t
Definition: RtypesCore.h:55
MinuitWrapper * fMinWrap
Definition: MinuitFitter.h:67
#define name(a, b)
Definition: linkTestLib0.cpp:5
Abstract ClassifierFactory template that handles arbitrary types.
Double_t EstimatorFunction(std::vector< Double_t > &pars)
performs the fit by calliung Run(pars)
const Bool_t kTRUE
Definition: Rtypes.h:91
void DeclareOptions()
declare SA options
Definition: math.cpp:60