00001
00002
00004
00005 #if !defined(AFX_FITTINGFUNCTIONGAUSSIAN_H__D5D48CC1_0CF7_4D31_93F4_43A21F7659E6__INCLUDED_)
00006 #define AFX_FITTINGFUNCTIONGAUSSIAN_H__D5D48CC1_0CF7_4D31_93F4_43A21F7659E6__INCLUDED_
00007
00008 #if _MSC_VER > 1000
00009 #pragma once
00010 #endif // _MSC_VER > 1000
00011
00012 #include "FittingFunction.h"
00013
00014 #define SEARCH_LIMIT 1.0E-4
00015 #define NB_ITERATION_MAX 100
00016
00017
00018 class FittingFunctionGaussian : public FittingFunction
00019 {
00020 public:
00021
00022
00023 FittingFunctionGaussian();
00024
00025 FittingFunctionGaussian(long lNbIteration,double dLimitSearch);
00026
00027 virtual ~FittingFunctionGaussian();
00028
00029
00030 virtual PtrFunction getFunction() const;
00031
00032 virtual PtrFunctionDerivate getFunctionDerivate() const;
00033
00034 virtual PtrFunctionAndDerivate getFunctionAndDerivate() const;
00035
00036
00037 static int Function (const gsl_vector *peak_params, void *calc_data, gsl_vector *func);
00038
00039 static int FunctionDerivate (const gsl_vector *peak_params, void *calc_data, gsl_matrix *Jacobian);
00040
00041 static int FunctionAndDerivate (const gsl_vector *peak_params, void *calc_data ,gsl_vector *func, gsl_matrix *Jacobian);
00042
00043
00044 virtual int doFit(long points, gsl_vector *x,gsl_vector *y,gsl_vector *sigma, gsl_vector* guess, bool bEstimateGuess, int iSearchStoppingMethod=1, bool bUseScaled=true);
00045
00046 virtual int generateFunctionFit(double dValMinX,double dResolutionX,long lNbPoints,gsl_vector* funcX,gsl_vector* funcY);
00047
00048 virtual int generateFunctionFit(long lNbPoints, gsl_vector *x, gsl_vector* funcX,gsl_vector* funcY);
00049
00050
00051 void printState (size_t iter, gsl_multifit_fdfsolver * s);
00052
00053 void printResults();
00054 double computeValue(double dX,double dPosition, double dWidth, double dHeight, double dBackground=0.0);
00055 double computeDerivateValue(double dX,double dPosition, double dWidth, double dHeight);
00056
00057
00058 void initializeInitialsParameters(gsl_vector* vExperimentalDataX,gsl_vector* vExperimentalDataY,gsl_vector* vInitialGuess,bool bEstimate);
00059
00060 void estimateInitialGuess(gsl_vector* vExperimentalDataX,gsl_vector* vExperimentalDataY);
00061
00062
00063
00064 double estimateInitialPosition(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00065 double estimateInitialSigma(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00066 double estimateInitialHeight(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00067 double estimateInitialBackground(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00068
00069 std::string getEquation() const;
00070 };
00071
00072 #endif // !defined(AFX_FITTINGFUNCTIONGAUSSIAN_H__D5D48CC1_0CF7_4D31_93F4_43A21F7659E6__INCLUDED_)