Diana Software
QMathFunction.cc
Go to the documentation of this file.
1 #include "QMathFunction.hh"
2 #include "QMinimizer.hh"
3 #include "QVector.hh"
4 #include "TF1.h"
5 
7 
9 {
10  gsl_function F;
11  F.function = (double (*)(double, void*))fRoutine;
12  F.params = (void*) fParameters;
13  return F;
14 }
15 
16 QMathFunction::QMathFunction(QRoutinePointer funcpointer, unsigned int NParameters, double LowBound, double UpBound)
17 {
18  fRoutine = funcpointer;
19  fNParameters = NParameters;
20  fParameters = new double[NParameters];
21  fParNames.resize(fNParameters);
22  for(size_t p = 0; p < fNParameters; p++) {
23  fParameters[p] = 0.0;
24  fParNames[p] = "";
25  }
26  fLowBound = LowBound;
27  fUpBound = UpBound;
28  fVerbose = false;
29 }
30 
32 {
33  fNParameters = 0;
34  fParameters = NULL;
35  *this = func;
36 }
37 
39 {
40  if(fParameters) delete [] fParameters;
41 }
42 
44 {
45  fRoutine = func.fRoutine;
46  if(fNParameters!=func.fNParameters) {
47  if(fParameters) delete [] fParameters;
49  fParameters = new double[fNParameters];
50  fParNames.resize(fNParameters);
51  }
52  for(unsigned int p = 0; p < fNParameters; p++) {
53  fParameters[p] = func.fParameters[p];
54  fParNames[p] = func.fParNames[p];
55  }
56  fLowBound = func.fLowBound;
57  fUpBound = func.fUpBound;
58  fVerbose = false;
59  return *this;
60 
61 }
62 
64 {
65  for(size_t p = 0; p < fNParameters; p++) {
66  if(std::string(fParNames[p]) != "")
67  printf("%s ",fParNames[p]);
68  else
69  printf("%u ",(unsigned int)p);
70  printf("%f\n", fParameters[p]);
71  }
72 
73 }
74 
75 void QMathFunction::SetParameter(unsigned int p, double val)
76 {
77  if(p < fNParameters) {
78  fParameters[p] = val;
79  }
80 }
81 
82 void QMathFunction::SetParameter(unsigned int p, const char* name, double val)
83 {
84  SetParameter(p,val);
85  SetParName(p,name);
86 }
87 
88 
89 QError QMathFunction::GetMinimum(double& min, double& minpos, double epsabs,double epsrel)
90 {
91  QError err;
92  QMinimizer* minimizer = new QMinimizer();
93  if(fVerbose) minimizer->SetVerbose();
94  minpos = minimizer->GetMinimum(*this, fLowBound, fUpBound,epsabs,epsrel);
95  if(minpos == Q_DOUBLE_DEFAULT) {
98  } else {
99  min = (*fRoutine)(minpos,fParameters);
100  err = QERR_SUCCESS;
101  }
102  delete minimizer;
103  return err;
104 }
105 
106 QError QMathFunction::GetMaximum(double& max, double& maxpos, double epsabs,double epsrel)
107 {
108  QError err;
109  QMinimizer* minimizer = new QMinimizer();
110  if(fVerbose) minimizer->SetVerbose();
111  maxpos = minimizer->GetMaximum(*this, fLowBound, fUpBound,epsabs,epsrel);
112  if(maxpos == Q_DOUBLE_DEFAULT) {
115  } else {
116  max = (*fRoutine)(maxpos,fParameters);
117  err = QERR_SUCCESS;
118  }
119  delete minimizer;
120  return err;
121 }
122 
123 void QMathFunction::SetTF1(TF1& tf1)
124 {
125  for(size_t p = 0; p < fNParameters; p++) {
126  tf1.SetParameter(p,fParameters[p]);
127  tf1.SetParName(p,fParNames[p]);
128  }
129 }
130 
int maxpos
Definition: CheckOFShape.C:59
double max
Definition: CheckOF.C:53
err
Definition: CheckOF.C:114
#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_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
generic C++ interface on static functions
size_t fNParameters
number of parameters
virtual void Print()
print parameters and names if set
QMathFunction(QRoutinePointer funcpointer, unsigned int NParameters, double LowBound, double UpBound)
constructor
friend class QMinimizer
gsl_function GetGSLFunction()
return a gsl function
Definition: QMathFunction.cc:8
bool fVerbose
verbose
const QMathFunction & operator=(const QMathFunction &func)
operator=
QError GetMinimum(double &min, double &minpos, double epsabs=0.001, double epsrel=0.0)
get function minimum
double fUpBound
high function bound
void SetParameter(unsigned int p, double val)
set parameter value
QError GetMaximum(double &max, double &maxpos, double epsabs=0.001, double epsrel=0.0)
get function maximum
virtual ~QMathFunction()
destructor
void SetParName(unsigned int p, const char *name)
set parameter name
std::vector< const char * > fParNames
parameters names
QRoutinePointer fRoutine
pointer to the underlying static function
double fLowBound
low function bound
double * fParameters
array of parameters
virtual void SetTF1(TF1 &tf1)
set parameters from ROOT TF1
find maximum and minimum of a QMathFunction, the minimum search stops when |a - b| < epsabs + epsrel ...
Definition: QMinimizer.hh:20
double GetMaximum(QMathFunction func, double minx, double maxx, double epsabs=0.001, double epsrel=0.0)
get function maximum
Definition: QMinimizer.cc:70
void SetVerbose()
verbose (print iteration steps)
Definition: QMinimizer.hh:27
double GetMinimum(QMathFunction func, double minx, double maxx, double epsabs=0.001, double epsrel=0.0)
get function minimum
Definition: QMinimizer.cc:22