Diana Software
QFitter.cc
Go to the documentation of this file.
1 #include "QFitter.hh"
2 #include "QMathFunction.hh"
3 #include "QVector.hh"
4 #include "TF1.h"
5 #include "TH1D.h"
6 #include "TVirtualFitter.h"
7 
9 
11 
12 QFitter::QFitter(QRoutinePointer funcpointer, unsigned int NParameters, double LowBound, double UpBound): QMathFunction(funcpointer,NParameters,LowBound,UpBound)
13 {
14  fVerbose = false;
15  fFunctionP = NULL;
16  fParMin = new double[fNParameters];
17  fParMax = new double[fNParameters];
18  fParErr = new double[fNParameters];
19  fIsFixed = new bool[fNParameters];
20 }
21 
23 {
24  fVerbose = false;
25  fFunctionP = NULL;
26  fParMin = new double[fNParameters];
27  fParMax = new double[fNParameters];
28  fParErr = new double[fNParameters];
29  fIsFixed = new bool[fNParameters];
30 
31 }
32 
34 {
35  delete [] fParMin;
36  delete [] fParErr;
37  delete [] fParMax;
38  delete [] fIsFixed;
39 }
41 {
42  for(size_t p = 0; p < fNParameters; p++) {
43  if(std::string(fParNames[p]) != "")
44  printf("%s ",fParNames[p]);
45  else
46  printf("%u ",(unsigned int)p);
47  if(fIsFixed[p])
48  printf("%f - Fixed\n", fParameters[p]);
49  else
50  printf("%f - [%f, %f]\n", fParameters[p], fParMin[p], fParMax[p]);
51  }
52 }
53 
55 {
56  for(size_t p = 0; p < fNParameters; p++) {
57  if(std::string(fParNames[p]) != "")
58  printf("%s ",fParNames[p]);
59  else
60  printf("%u ",(unsigned int)p);
61  if(fIsFixed[p])
62  printf("%f - Fixed\n", fParameters[p]);
63  else
64  printf("%f +/- %f\n", fParameters[p], fParErr[p]);
65  }
66 
67 }
68 void QFitter::SetParameter(unsigned int p, double val, double min, double max)
69 {
70  if(p < fNParameters) {
71  fParameters[p] = val;
72  fParMin[p] = min;
73  fParMax[p] = max;
74  fIsFixed[p] = false;
75  }
76 
77 }
78 
79 void QFitter::SetParameter(unsigned int p, const char* name, double val, double min, double max)
80 {
81  SetParameter(p,val,min,max);
82  SetParName(p,name);
83 
84 }
85 void QFitter::FixParameter(unsigned int p, double val)
86 {
87  if(p < fNParameters) {
88  fParameters[p] = val;
89  fIsFixed[p] = true;
90  }
91 }
92 
93 void QFitter::FixParameter(unsigned int p, const char* name, double val)
94 {
95  FixParameter(p,val);
96  SetParName(p,name);
97 }
98 double QFitter::RootRoutine(double* x, double* params)
99 {
100  return fFunctionP->Eval(*x, params);
101 }
102 
103 QError QFitter::Fit(const QVector& data, double minfit, double maxfit, double binsize)
104 {
105  QVector errors(data.Size());
106  errors.Initialize(1.0);
107  return Fit(data,errors,minfit,maxfit,binsize);
108 }
109 
110 QError QFitter::Fit(const QVector& data, double error, double minfit, double maxfit, double binsize)
111 {
112  QVector errors(data.Size());
113  errors.Initialize(error);
114  return Fit(data,errors,minfit,maxfit,binsize);
115 }
116 
117 
118 QError QFitter::Fit(const QVector& data, const QVector& errors, double minfit, double maxfit, double binsize)
119 {
120  QError err;
121 
122  // checks
123  if(maxfit > fUpBound || minfit < fLowBound) {
125  err.SetDescription("Fit range greater than function range");
126  return err;
127  }
128 
129  // create tf1
130  fFunctionP = this;
131  TF1 f1("QFitter",&(RootRoutine),fLowBound,fUpBound,fNParameters);
132 
133  SetTF1(f1);
134 
135  // initialize histogram
136  size_t nPoints = data.Size();
137  TH1D histo("hQFitter","",nPoints,-binsize/2,nPoints*binsize-binsize/2);
138  for(size_t i = 0; i < nPoints; i++) {
139  histo.SetBinContent(i+1,data[i]);
140  double error = errors[i];
141  if(error == 0.0) error = 1.0;
142  histo.SetBinError(i+1,error);
143  }
144 
145  // fit!
146  int fiterr;
148  fResiduals.Clear();
149  fResiduals.Resize(nPoints);
150  if(fVerbose) fiterr = histo.Fit(&f1,"N R","",minfit,maxfit);
151  else fiterr = histo.Fit(&f1,"N R Q","",minfit,maxfit);
152 
153  if(fiterr < 5) {
154 
155  fChiSquare = f1.GetChisquare()/f1.GetNDF();
156 
157  for(size_t p = 0; p < fNParameters; p++) {
158  fParameters[p] = f1.GetParameter(p);
159  fParErr[p] = f1.GetParError(p);
160  }
161 
162  for(size_t i = 0; i < nPoints; i++) {
163  double x = binsize*i;
164  if(x < minfit || x > maxfit) fResiduals[i] = 0.0;
165  else fResiduals[i] = Eval(x) - data[i];
166  }
167 
168 
169  err = QERR_SUCCESS;
170  }
171  else {
173  err.SetDescription("Fit failed");
174  }
175 
176  return err;
177 }
178 
179 void QFitter::SetTF1(TF1& f1)
180 {
182  for(unsigned int p = 0; p < fNParameters; p++) {
183  if(fIsFixed[p]) {
184  f1.FixParameter(p,fParameters[p]);
185  } else {
186  f1.SetParLimits(p,fParMin[p],fParMax[p]);
187  f1.SetParError(p,fParErr[p]);
188  }
189  }
190 }
191 
double max
Definition: CheckOF.C:53
err
Definition: CheckOF.C:114
TH1D histo("histo","My histogram", 10,-5, 5)
#define Q_DOUBLE_DEFAULT
Definition: QDiana.hh:24
#define Q_END_NAMESPACE
Definition: QDiana.hh:22
#define Q_BEGIN_NAMESPACE
Definition: QDiana.hh:20
@ QERR_UNKNOWN_ERR
Definition: QError.hh:108
@ QERR_OUT_OF_RANGE
Definition: QError.hh:28
@ QERR_SUCCESS
Definition: QError.hh:27
double min(const Diana::QVector &v)
Definition: QVector.cc:878
error class with error type and description
Definition: QError.hh:115
void FixParameter(unsigned int p, double val)
fix parameter
Definition: QFitter.cc:85
QVector fResiduals
Definition: QFitter.hh:90
void PrintResult()
print fitted parameters
Definition: QFitter.cc:54
double fChiSquare
Definition: QFitter.hh:92
bool * fIsFixed
Definition: QFitter.hh:88
void SetParameter(unsigned int p, double val, double min, double max)
set parameter and its range
Definition: QFitter.cc:68
void Print()
print parameters
Definition: QFitter.cc:40
static double RootRoutine(double *x, double *params)
function intercace used to fit with root
Definition: QFitter.cc:98
double * fParErr
Definition: QFitter.hh:87
QError Fit(const QVector &data, double minfit, double maxfit, double binsize)
fit QVector between minfit and max fits
Definition: QFitter.cc:103
static const QMathFunction * fFunctionP
pointer to this fitting function
Definition: QFitter.hh:83
~QFitter()
destructor
Definition: QFitter.cc:33
double * fParMin
Definition: QFitter.hh:85
double * fParMax
Definition: QFitter.hh:86
void SetTF1(TF1 &f1)
set parameters and ranges from TF1
Definition: QFitter.cc:179
QFitter(QRoutinePointer funcpointer, unsigned int NParameters, double LowBound, double UpBound)
constructor
Definition: QFitter.cc:12
generic C++ interface on static functions
size_t fNParameters
number of parameters
bool fVerbose
verbose
double fUpBound
high function bound
double Eval(double x) const
evaluate function
void SetParName(unsigned int p, const char *name)
set parameter name
std::vector< const char * > fParNames
parameters names
double fLowBound
low function bound
double * fParameters
array of parameters
virtual void SetTF1(TF1 &tf1)
set parameters from ROOT TF1
Interface for vectors in Diana analysis.
Definition: QVector.hh:30
UInt_t Size() const
size of QVector
Definition: QVector.hh:54
virtual void Clear()
clear the vector
Definition: QVector.hh:406
void Resize(const UInt_t newsize)
resize a QVector
Definition: QVector.cc:170
void Initialize(const double val=0)
initialize elements (default to 0)
Definition: QVector.cc:218