Belle II Software  release-08-01-10
NewtonFitterGSL.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * Forked from https://github.com/iLCSoft/MarlinKinfit *
6  * *
7  * Further information about the fit engine and the user interface *
8  * provided in MarlinKinfit can be found at *
9  * https://www.desy.de/~blist/kinfit/doc/html/ *
10  * and in the LCNotes LC-TOOL-2009-001 and LC-TOOL-2009-004 available *
11  * from http://www-flc.desy.de/lcnotes/ *
12  * *
13  * See git log for contributors and copyright holders. *
14  * This file is licensed under LGPL-3.0, see LICENSE.md. *
15  **************************************************************************/
16 
17 #ifndef __NEWTONFITTERGSL_H
18 #define __NEWTONFITTERGSL_H
19 
20 #include "analysis/OrcaKinFit/BaseFitter.h"
21 
22 #include <gsl/gsl_vector.h>
23 #include <gsl/gsl_matrix.h>
24 #include <gsl/gsl_permutation.h>
25 #include <gsl/gsl_eigen.h>
26 
27 // Class NewtonFitterGSL
29 
30 namespace Belle2 {
36  namespace OrcaKinFit {
37 
38  class NewtonFitterGSL : public BaseFitter {
39  public:
43  virtual ~NewtonFitterGSL();
44 
46  virtual double fit() override;
47 
49  virtual int getError() const override;
50 
52  virtual double getProbability() const override;
54  virtual double getChi2() const override;
56  virtual int getDoF() const override;
58  virtual int getIterations() const override;
59 
61  virtual int getNcon() const;
62 
64  virtual int getNsoft() const;
65 
67  virtual int getNpar() const;
68 
70  virtual int getNunm() const;
71 
73  virtual bool initialize() override;
74 
76  virtual void setDebug(int debuglevel);
77 
78  protected:
80  virtual double calcChi2();
81 
83  int calcDx();
84 
86  int calcDxSVD();
87 
89  void printMy(const double M[], const double y[], int idim);
90 
91  bool updateParams(gsl_vector* xnew);
92  void fillxold();
93  void fillperr();
94  int calcM(bool errorpropagation = false);
95  int calcy();
96  int optimizeScale();
97  int invertM();
98 
99  void calcCovMatrix();
100 
101  double meritFunction(double mu);
102  double meritFunctionDeriv();
103 
104  enum {NPARMAX = 50, NCONMAX = 10, NUNMMAX = 10};
105 
106  int npar;
107  int ncon;
108  int nsoft;
109  int nunm;
110  int ierr;
111  int nit;
112 
113  double fitprob;
114  double chi2;
115 
116  static void ini_gsl_permutation(gsl_permutation*& p, unsigned int size);
117  static void ini_gsl_vector(gsl_vector*& v, int unsigned size);
118  static void ini_gsl_matrix(gsl_matrix*& m, int unsigned size1, unsigned int size2);
119 
120  static void debug_print(gsl_matrix* m, const char* name);
121  static void debug_print(gsl_vector* v, const char* name);
122 
123  private:
124  unsigned int idim;
125  gsl_vector* x;
126  gsl_vector* xold;
127  gsl_vector* xbest;
128  gsl_vector* dx;
129  gsl_vector* dxscal;
130  gsl_vector* grad;
131  gsl_vector* y;
132  gsl_vector* yscal;
133  gsl_vector* perr;
134  gsl_vector* v1;
135  gsl_vector* v2;
136  gsl_vector* Meval;
137 
138  gsl_matrix* M;
139  gsl_matrix* Mscal;
140  gsl_matrix* M1;
141  gsl_matrix* M2;
142  gsl_matrix* M3;
143  gsl_matrix* M4;
144  gsl_matrix* M5;
145  gsl_matrix* Mevec;
146  gsl_matrix* CC;
147  gsl_matrix* CC1;
148  gsl_matrix* CCinv;
149 
150  gsl_permutation* permM;
151  gsl_eigen_symmv_workspace* ws;
152  unsigned int wsdim;
153 
154  double chi2best;
155  double chi2new;
156  double chi2old;
157  double fvalbest;
158  double scale;
159  double scalebest;
160  double stepsize;
161  double stepbest;
162  enum {NITMAX = 100};
163  double scalevals[NITMAX];
164  double fvals[NITMAX];
165 
166  int imerit;
167 
168  int debug;
169  };
170 
171  }// end OrcaKinFit namespace
173 } // end Belle2 namespace
174 
175 #endif // __NEWTONFITTERGSL_H
Abstract base class for fitting engines of kinematic fits.
Definition: BaseFitter.h:47
int ncon
total number of hard constraints
int calcDxSVD()
Calculate the vector dx to update the parameters; returns fail code, 0=OK.
int npar
total number of parameters
virtual double calcChi2()
Calculate the chi2.
void printMy(const double M[], const double y[], int idim)
Print a Matrix M and a vector y of dimension idim.
virtual int getNsoft() const
Get the number of soft constraints of the last fit.
virtual double fit() override
The fit method, returns the fit probability.
virtual bool initialize() override
Initialize the fitter.
virtual int getNcon() const
Get the number of hard constraints of the last fit.
int nsoft
total number of soft constraints
virtual int getError() const override
Get the error code of the last fit: 0=OK, 1=failed.
int nunm
total number of unmeasured parameters
int calcDx()
Calculate the vector dx to update the parameters; returns fail code, 0=OK.
virtual int getNunm() const
Get the number of unmeasured parameters of the last fit.
virtual int getIterations() const override
Get the number of iterations of the last fit.
virtual double getProbability() const override
Get the fit probability of the last fit.
virtual void setDebug(int debuglevel)
Set the Debug Level.
virtual int getDoF() const override
Get the number of degrees of freedom of the last fit.
virtual double getChi2() const override
Get the chi**2 of the last fit.
virtual int getNpar() const
Get the number of all parameters of the last fit.
virtual ~NewtonFitterGSL()
Virtual destructor.
Abstract base class for different kinds of events.