Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TLinearMinimizer.cxx
Go to the documentation of this file.
1// @(#)root/minuit:$Id$
2// Author: L. Moneta Wed Oct 25 16:28:55 2006
3
4/**********************************************************************
5 * *
6 * Copyright (c) 2006 LCG ROOT Math Team, CERN/PH-SFT *
7 * *
8 * *
9 **********************************************************************/
10
11// Implementation file for class TLinearMinimizer
12
13#include "TLinearMinimizer.h"
14#include "Math/IParamFunction.h"
15#include "TF1.h"
16#include "TUUID.h"
17#include "TROOT.h"
18#include "Fit/BasicFCN.h"
19#include "Fit/BinData.h"
20#include "Fit/Chi2FCN.h"
21
22#include "TLinearFitter.h"
23#include "TVirtualMutex.h"
24
25#include <iostream>
26#include <cassert>
27#include <algorithm>
28#include <functional>
29
30
31
32// namespace ROOT {
33
34// namespace Fit {
35
36
37// structure used for creating the TF1 representing the basis functions
38// they are the derivatives w.r.t the parameters of the model function
39template<class Func>
41 BasisFunction(const Func & f, int k) :
42 fKPar(k),
43 fFunc(&f)
44 {}
45
46 double operator() ( double * x, double *) {
47 return fFunc->ParameterDerivative(x,fKPar);
48 }
49
50 unsigned int fKPar; // param component
51 const Func * fFunc;
52};
53
54////////////////////////////////////////////////////////////////////////////////
55/// \class TLinearMinimizer
56/// \see Minuit2 for a newer version of this class
57///
58/// TLinearMinimizer, simple class implementing the ROOT::Math::Minimizer
59/// interface usingTLinearFitter. This class uses TLinearFitter to find directly
60/// (by solving a system of linear equations) the minimum of a least-square
61/// function which has a linear dependence in the fit parameters. This class is
62/// not used directly, but via the ROOT::Fitter class, when calling the
63/// LinearFit method. It is instantiates using the plug-in manager
64/// (plug-in name is "Linear").
65////////////////////////////////////////////////////////////////////////////////
66
68
69
71 fRobust(false),
72 fDim(0),
73 fNFree(0),
74 fMinVal(0),
75 fObjFunc(nullptr),
76 fFitter(nullptr)
77{
78 // Default constructor implementation.
79 // type is not used - needed for consistency with other minimizer plug-ins
80}
81
83 fRobust(false),
84 fDim(0),
85 fNFree(0),
86 fMinVal(0),
87 fObjFunc(nullptr),
88 fFitter(nullptr)
89{
90 // constructor passing a type of algorithm, (supported now robust via LTS regression)
91
92 // select type from the string
93 std::string algoname(type);
94 std::transform(algoname.begin(), algoname.end(), algoname.begin(), (int(*)(int)) tolower );
95
96 if (algoname.find("robust") != std::string::npos) fRobust = true;
97
98}
99
101{
102 // Destructor implementation.
103 if (fFitter) delete fFitter;
104}
105
107 Minimizer()
108{
109 // Implementation of copy constructor.
110}
111
113{
114 // Implementation of assignment operator.
115 if (this == &rhs) return *this; // time saving self-test
116 return *this;
117}
118
119
121 // Set the function to be minimized. The function must be a Chi2 gradient function
122 // When performing a linear fit we need the basis functions, which are the partial derivatives with respect to the parameters of the model function.
123
124 if(!objfunc.HasGradient()) {
125 // Set function to be minimized. Flag an error since only support Gradient objective functions
126 Error("TLinearMinimizer::SetFunction(IMultiGenFunction)","Wrong type of function used for Linear fitter");
127 }
128
130 const Chi2Func * chi2func = dynamic_cast<const Chi2Func *>(&objfunc);
131 if (chi2func ==nullptr) {
132 Error("TLinearMinimizer::SetFunction(IMultiGenFunction)","Wrong type of function used for Linear fitter");
133 return;
134 }
135 fObjFunc = chi2func;
136
137 // need to get the gradient parametric model function
138 typedef ROOT::Math::IParamMultiGradFunction ModelFunc;
139 const ModelFunc * modfunc = dynamic_cast<const ModelFunc*>( &(chi2func->ModelFunction()) );
140 assert(modfunc != nullptr);
141
142 fDim = chi2func->NDim(); // number of parameters
143 fNFree = fDim; // in case of no fixed parameters
144 // get the basis functions (derivatives of the modelfunc)
145 TObjArray flist(fDim);
146 flist.SetOwner(kFALSE); // we do not want to own the list - it will be owned by the TLinearFitter class
147 for (unsigned int i = 0; i < fDim; ++i) {
148 // t.b.f: should not create TF1 classes
149 // when creating TF1 (if another function with same name exists it is
150 // deleted since it is added in function list in gROOT
151 // fix the problem using meaniful names (difficult to re-produce)
152 BasisFunction<ModelFunc > bf(*modfunc,i);
153 TUUID u;
154 std::string fname = "_LinearMinimimizer_BasisFunction_" +
155 std::string(u.AsString() );
156 TF1 * f = new TF1(fname.c_str(),ROOT::Math::ParamFunctor(bf),0,1,0,1,TF1::EAddToList::kNo);
157 flist.Add(f);
158 }
159
160 // create TLinearFitter (do it now because only now now the coordinate dimensions)
161 if (fFitter) delete fFitter; // reset by deleting previous copy
162 fFitter = new TLinearFitter( static_cast<const ModelFunc::BaseFunc&>(*modfunc).NDim() );
163
164 fFitter->StoreData(fRobust); // need a copy of data in case of robust fitting
165
166 fFitter->SetBasisFunctions(&flist);
167
168 // get the fitter data
169 const ROOT::Fit::BinData & data = chi2func->Data();
170 // add the data but not store them
171 std::vector<double> xc(data.NDim());
172 for (unsigned int i = 0; i < data.Size(); ++i) {
173 double y = 0;
174 const double * x1 = data.GetPoint(i,y);
175 double ey = 1;
176 if (! data.Opt().fErrors1) {
177 ey = data.Error(i);
178 }
179 // in case of bin volume- scale the data according to the bin volume
180 double binVolume = 1.;
181 double * x = nullptr;
182 if (data.Opt().fBinVolume) {
183 // compute the bin volume
184 const double * x2 = data.BinUpEdge(i);
185 for (unsigned int j = 0; j < data.NDim(); ++j) {
186 binVolume *= (x2[j]-x1[j]);
187 // we are always using bin centers
188 xc[j] = 0.5 * (x2[j]+ x1[j]);
189 }
190 if (data.Opt().fNormBinVolume) binVolume /= data.RefVolume();
191 // we cannot scale f so we scale the points
192 y /= binVolume;
193 ey /= binVolume;
194 x = xc.data();
195 } else {
196 x = const_cast<double*>(x1);
197 }
198 //std::cout << "adding point " << i << " x " << x[0] << " y " << y << " e " << ey << std::endl;
199 fFitter->AddPoint( x , y, ey);
200 }
201
202}
203
204bool TLinearMinimizer::SetFixedVariable(unsigned int ivar, const std::string & /* name */ , double val) {
205 // set a fixed variable.
206 if (!fFitter) return false;
207 fFitter->FixParameter(ivar, val);
208 return true;
209}
210
212 // find directly the minimum of the chi2 function
213 // solving the linear equation. Use TVirtualFitter::Eval.
214
215 if (fFitter == nullptr || fObjFunc == nullptr) return false;
216
218
219 int iret = 0;
220 if (!fRobust)
221 iret = fFitter->Eval();
222 else {
223 // robust fitting - get h parameter using tolerance (t.b. improved)
224 double h = Tolerance();
225 if (PrintLevel() > 0)
226 std::cout << "TLinearMinimizer: Robust fitting with h = " << h << std::endl;
227 iret = fFitter->EvalRobust(h);
228 }
229 fStatus = iret;
230
231 if (iret != 0) {
232 Warning("Minimize","TLinearFitter failed in finding the solution");
233 return false;
234 }
235
236
237 // get parameter values
238 fParams.resize( fDim);
239 // no error available for robust fitting
240 if (!fRobust) fErrors.resize( fDim);
241 for (unsigned int i = 0; i < fDim; ++i) {
242 fParams[i] = fFitter->GetParameter( i);
243 if (!fRobust) fErrors[i] = fFitter->GetParError( i );
244 }
245 fCovar.resize(fDim*fDim);
246 double * cov = fFitter->GetCovarianceMatrix();
247
248 if (!fRobust && cov) std::copy(cov,cov+fDim*fDim,fCovar.begin() );
249
250 // calculate chi2 value
251
252 fMinVal = (*fObjFunc)(&fParams.front());
253
254 return true;
255
256}
257
258
259// } // end namespace Fit
260
261// } // end namespace ROOT
262
#define f(i)
Definition RSha256.hxx:104
#define h(i)
Definition RSha256.hxx:106
constexpr Bool_t kFALSE
Definition RtypesCore.h:101
#define ClassImp(name)
Definition Rtypes.h:377
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Definition TError.cxx:185
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Definition TError.cxx:229
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
Definition BinData.h:52
Chi2FCN class for binned fits using the least square methods.
Definition Chi2FCN.h:46
Documentation for the abstract class IBaseFunctionMultiDim.
Definition IFunction.h:61
Interface (abstract class) for parametric gradient multi-dimensional functions providing in addition ...
double Tolerance() const
absolute tolerance
Definition Minimizer.h:315
int fStatus
status of minimizer
Definition Minimizer.h:391
int PrintLevel() const
minimizer configuration parameters
Definition Minimizer.h:306
Param Functor class for Multidimensional functions.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
1-Dim function class
Definition TF1.h:233
Int_t GetNumberFreeParameters() const override
virtual Int_t Eval()
Perform the fit and evaluate the parameters Returns 0 if the fit is ok, 1 if there are errors.
virtual void SetBasisFunctions(TObjArray *functions)
set the basis functions in case the fitting function is not set directly The TLinearFitter will manag...
virtual Int_t EvalRobust(Double_t h=-1)
Finds the parameters of the fitted function in case data contains outliers.
Double_t GetParError(Int_t ipar) const override
Returns the error of parameter #ipar
void FixParameter(Int_t ipar) override
Fixes paramter #ipar at its current value.
virtual void AddPoint(Double_t *x, Double_t y, Double_t e=1)
Adds 1 point to the fitter.
Double_t * GetCovarianceMatrix() const override
Returns covariance matrix.
Double_t GetParameter(Int_t ipar) const override
virtual void StoreData(Bool_t store)
TLinearMinimizer class: minimizer implementation based on TMinuit.
void SetFunction(const ROOT::Math::IMultiGenFunction &func) override
set the fit model function
TLinearMinimizer & operator=(const TLinearMinimizer &rhs)
Assignment operator.
TLinearFitter * fFitter
~TLinearMinimizer() override
Destructor (no operations)
bool fRobust
return reference to the objective function virtual const ROOT::Math::IGenFunction & Function() const;
const ROOT::Math::IMultiGradFunction * fObjFunc
bool Minimize() override
method to perform the minimization
std::vector< double > fParams
TLinearMinimizer(int type=0)
Default constructor.
std::vector< double > fCovar
std::vector< double > fErrors
bool SetFixedVariable(unsigned int, const std::string &, double) override
set fixed variable (override if minimizer supports them )
An array of TObjects.
Definition TObjArray.h:31
void Add(TObject *obj) override
Definition TObjArray.h:68
This class defines a UUID (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDent...
Definition TUUID.h:42
const char * AsString() const
Return UUID as string. Copy string immediately since it will be reused.
Definition TUUID.cxx:571
Double_t y[n]
Definition legend1.C:17
Double_t x[n]
Definition legend1.C:17
Double_t ey[n]
Definition legend1.C:17
double operator()(double *x, double *)
BasisFunction(const Func &f, int k)
unsigned int fKPar
const Func * fFunc