00001
00002
00004
00005 #if !defined(AFX_FITTINGFUNCTION_H__149D497B_E840_4939_B085_53F191C2ACA6__INCLUDED_)
00006 #define AFX_FITTINGFUNCTION_H__149D497B_E840_4939_B085_53F191C2ACA6__INCLUDED_
00007
00008 #if _MSC_VER > 1000
00009 #pragma once
00010 #endif // _MSC_VER > 1000
00011
00012 #include <gsl/gsl_linalg.h>
00013 #include <gsl/gsl_blas.h>
00014 #include <gsl/gsl_multifit.h>
00015 #include <gsl/gsl_multifit_nlin.h>
00016
00017 #include <string>
00018 #include <map>
00019
00020 #include <iostream>
00021
00022 #define DEBUG_FIT
00023 #define FIT(i) gsl_vector_get(s->x, i)
00024 #define ERR(i) sqrt(gsl_matrix_get(covar,i,i))
00025
00026
00027 typedef enum {GAUSSIAN,LORENTZIAN} FittingFunctionType;
00028
00029 typedef enum {LMDER,LMSDER} FittingFunctionAlgorithm;
00030
00031 typedef enum {POSITION,WIDTH,HEIGHT} FittingFunctionParameter;
00032
00033 using namespace std;
00034
00035 typedef map <string, int, less <string>, allocator <int> > STRING2INT;
00036
00037
00038 struct FittingData
00039 {
00040
00041 size_t n;
00042
00043 double *x;
00044
00045 double *y;
00046
00047 double *sigma;
00048 };
00049
00050
00051 typedef int (*PtrFunction) (const gsl_vector*, void *, gsl_vector *);
00052
00053 typedef int (*PtrFunctionDerivate) (const gsl_vector*, void *, gsl_matrix *);
00054
00055 typedef int (*PtrFunctionAndDerivate) (const gsl_vector*, void *, gsl_vector *, gsl_matrix *);
00056
00057
00058 class FittingFunction
00059 {
00060 public:
00061
00062
00063 FittingFunction();
00064
00065 virtual ~FittingFunction();
00066
00067
00068 virtual PtrFunction getFunction(void) const=0;
00069
00070 virtual PtrFunctionDerivate getFunctionDerivate(void) const=0;
00071
00072 virtual PtrFunctionAndDerivate getFunctionAndDerivate(void) const=0;
00073
00074 virtual int doFit(long points, gsl_vector *x,gsl_vector *y, gsl_vector *sigma,gsl_vector *guess, bool bEstimateGuess, int iSearchStoppingMethod, bool bUseScaled)=0;
00075
00076 virtual int generateFunctionFit(double dValMinX,double dResolutionX,long lNbPoints,gsl_vector* funcX,gsl_vector* funcY)=0;
00077
00078 virtual int generateFunctionFit(long lNbPoints, gsl_vector *x, gsl_vector* funcX,gsl_vector* funcY)=0;
00079
00080
00081
00082
00083 double getParameter(std::string sParameterName) const;
00084
00085 double getParameter(int iIndiceParameter) const;
00086
00087 double* getAllParameters() const;
00088
00089
00090 double getParameterError(std::string sParameterName) const;
00091
00092 double getParameterError(int iIndiceParameter) const;
00093
00094 double* getAllParametersErrors() const;
00095
00096
00097 inline int getNumberOfParameters() const {return _iNbParameters;}
00098
00099 inline double getQualityFactor() const {return _dQualityFactor;}
00100
00101 inline double getSigma() const {return _dSigma;}
00102
00103 inline double getFHWM() const {return _dFHWM;}
00104 inline double getHWHM() const {return _dHWHM;}
00105
00106 inline double getSearchLimit() const {return _dSearchLimit;}
00107
00108 inline long getNbMaxIteration() const {return _lNbMaxIteration;}
00109
00110 inline int getNbParameters() const {return _iNbParameters;}
00111 inline long getNbIterations() const {return _lNbIterations;}
00112
00113 inline void setNumberOfParameters(int iNbParameters) {_iNbParameters = iNbParameters;}
00114
00115 inline void setSearchLimit(double dSearchValue) {_dSearchLimit = dSearchValue;}
00116
00117 inline void setNbMaxIteration(long lNbMaxIterationValue) {_lNbMaxIteration = lNbMaxIterationValue;}
00118
00119 double computeStandardDeviation();
00120 double getStandardDeviation();
00121 virtual double computeValue(double dX,double dPosition, double dWidth, double dHeight, double dBackground)=0;
00122 virtual double computeDerivateValue(double dX,double dPosition, double dWidth, double dHeight)=0;
00123
00124 virtual void initializeInitialsParameters(gsl_vector* vExperimentalDataX,gsl_vector* vExperimentalDataY,gsl_vector* vInitialGuess,bool bEstimate)=0;
00125
00126 virtual void estimateInitialGuess(gsl_vector* vExperimentalDataX,gsl_vector* vExperimentalDataY)=0;
00127
00128
00129
00130 double getInitialGuess(int iParameterIndex) {return gsl_vector_get(_vInitialGuess,iParameterIndex);};
00131
00132
00133 double computeMean(gsl_vector* vVector);
00134 double computeVariance(gsl_vector* vVector);
00135 double computeResidual(gsl_vector* vVectorExp,gsl_vector* vVectorPred);
00136 double computeDeterminationCoefficient(gsl_vector* vExperimentalDataY,gsl_vector* vFittedDataY);
00137 double computeObservedFStatistic(gsl_vector* vExperimentalDataY,gsl_vector* vFittedDataY);
00138 int getIndexValue(double dWantedValue,gsl_vector* vVector);
00139
00140
00141
00142
00143
00144
00145
00146 virtual std::string getEquation() const=0;
00147
00148 protected :
00149
00150
00151 STRING2INT _mFunctionMap;
00152
00153 int _iNbParameters;
00154
00155 double* _pParameters;
00156
00157 double* _pParametersErrors;
00158
00159
00160 double _dQualityFactor;
00161
00162 double _dSigma;
00163
00164 double _dHWHM;
00165 double _dFHWM;
00166
00167
00168 double _dSearchLimit;
00169
00170 long _lNbMaxIteration;
00171
00172 double _dStandardDeviation;
00173
00174 long _lNbIterations;
00175
00176
00177 FittingData* _cData;
00178
00179 FittingData* _cDataFitted;
00180
00181 gsl_vector* _vInitialGuess;
00182
00183 gsl_vector* _vExperimentalDataX;
00184 gsl_vector* _vExperimentalDataY;
00185
00186
00187
00188
00189 };
00190
00191 #endif // !defined(AFX_FITTINGFUNCTION_H__149D497B_E840_4939_B085_53F191C2ACA6__INCLUDED_)