00001
00002
00004
00005 #if !defined(AFX_FITTINGFUNCTIONSIGMOID_H__6F71713F_92F5_4D1F_8E75_E95C70E124FF__INCLUDED_)
00006 #define AFX_FITTINGFUNCTIONSIGMOID_H__6F71713F_92F5_4D1F_8E75_E95C70E124FF__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 FittingFunctionSigmoid : public FittingFunction
00019 {
00020 public:
00021
00022
00023 FittingFunctionSigmoid();
00024
00025 FittingFunctionSigmoid(long lNbIteration,double dLimitSearch);
00026
00027 virtual ~FittingFunctionSigmoid();
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 virtual int generateFunctionFit(long lNbPoints, gsl_vector *x, gsl_vector* funcX,gsl_vector* funcY);
00048
00049 void printState (size_t iter, gsl_multifit_fdfsolver * s);
00050
00051 void printResults();
00052
00053 double computeValue(double dX,double dPosition, double dWidth, double dHeight, double dBackground);
00054 double computeDerivateValue(double dX,double dPosition, double dWidth, double dHeight);
00055
00056 void initializeInitialsParameters(gsl_vector* vExperimentalDataX,gsl_vector* vExperimentalDataY,gsl_vector* vInitialGuess,bool bEstimate);
00057 void estimateInitialGuess(gsl_vector* vExperimentalDataX,gsl_vector* vExperimentalDataY);
00058
00059 double estimateInitialPosition(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00060 double estimateInitialSigma(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00061 double estimateInitialHeight(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00062 double estimateInitialBackground(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00063
00064 void estimateSigmoidIntersections();
00065 inline double getXLow() const {return _dXLow;};
00066 inline double getXHigh() const {return _dXHigh;};
00067
00068
00069
00070 std::string getEquation() const;
00071
00072 private:
00073 double _dXLow;
00074 double _dXHigh;
00075 long _lPositionIndex;
00076
00077 };
00078
00079 #endif // !defined(AFX_FITTINGFUNCTIONSIGMOID_H__6F71713F_92F5_4D1F_8E75_E95C70E124FF__INCLUDED_)