00001
00002
00004
00005 #if !defined(AFX_FITTINGFUNCTIONLORENTZIANWITHBACKGROUND_H__6F71713F_92F5_4D1F_8E75_E95C70E124FF__INCLUDED_)
00006 #define AFX_FITTINGFUNCTIONLORENTZIANWITHBACKGROUND_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 FittingFunctionLorentzianWithBackground : public FittingFunction
00019 {
00020 public:
00021
00022
00023 FittingFunctionLorentzianWithBackground();
00024
00025 FittingFunctionLorentzianWithBackground(long lNbIteration,double dLimitSearch);
00026
00027 virtual ~FittingFunctionLorentzianWithBackground();
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
00057 void initializeInitialsParameters(gsl_vector* vExperimentalDataX,gsl_vector* vExperimentalDataY,gsl_vector* vInitialGuess,bool bEstimate);
00058 void estimateInitialGuess(gsl_vector* vExperimentalDataX,gsl_vector* vExperimentalDataY);
00059
00060 double estimateInitialPosition(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00061 double estimateInitialSigma(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00062 double estimateInitialHeight(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00063 double estimateInitialBackground(gsl_vector *vExperimentalDataX, gsl_vector *vExperimentalDataY);
00064
00065 std::string getEquation() const;
00066 };
00067
00068 #endif // !defined(AFX_FITTINGFUNCTIONLORENTZIANWITHBACKGROUND_H__6F71713F_92F5_4D1F_8E75_E95C70E124FF__INCLUDED_)