00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef OPENMS_TRANSFORMATIONS_FEATUREFINDER_TRACEFITTER_H
00036 #define OPENMS_TRANSFORMATIONS_FEATUREFINDER_TRACEFITTER_H
00037
00038 #include <OpenMS/CONCEPT/LogStream.h>
00039
00040 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/FeatureFinderAlgorithmPickedHelperStructs.h>
00041
00042 #include <OpenMS/DATASTRUCTURES/DefaultParamHandler.h>
00043
00044 #include <gsl/gsl_rng.h>
00045 #include <gsl/gsl_vector.h>
00046 #include <gsl/gsl_multifit_nlin.h>
00047 #include <gsl/gsl_blas.h>
00048
00049 namespace OpenMS
00050 {
00051
00061 template <class PeakType>
00062 class TraceFitter :
00063 public DefaultParamHandler
00064 {
00065
00066 public:
00068 TraceFitter() :
00069 DefaultParamHandler("TraceFitter")
00070 {
00071 this->defaults_.setValue("max_iteration", 500, "Maximum number of iterations using by Levenberg-Marquardt algorithm.", StringList::create("advanced"));
00072 this->defaults_.setValue("epsilon_abs", 0.0001, "Absolute error used by the Levenberg-Marquardt algorithm.", StringList::create("advanced"));
00073 this->defaults_.setValue("epsilon_rel", 0.0001, "Relative error used by the Levenberg-Marquardt algorithm.", StringList::create("advanced"));
00074 }
00075
00077 TraceFitter(const TraceFitter & source) :
00078 DefaultParamHandler(source),
00079 epsilon_abs_(source.epsilon_abs_),
00080 epsilon_rel_(source.epsilon_rel_),
00081 max_iterations_(source.max_iterations_)
00082 {
00083 }
00084
00086 virtual TraceFitter & operator=(const TraceFitter & source)
00087 {
00088 DefaultParamHandler::operator=(source);
00089 max_iterations_ = source.max_iterations_;
00090 epsilon_abs_ = source.epsilon_abs_;
00091 epsilon_rel_ = source.epsilon_rel_;
00092 updateMembers_();
00093
00094 return *this;
00095 }
00096
00098 virtual ~TraceFitter()
00099 {
00100 }
00101
00105 virtual void fit(FeatureFinderAlgorithmPickedHelperStructs::MassTraces<PeakType> & traces) = 0;
00106
00110 virtual DoubleReal getLowerRTBound() const = 0;
00111
00115 virtual DoubleReal getUpperRTBound() const = 0;
00116
00120 virtual DoubleReal getHeight() const = 0;
00121
00125 virtual DoubleReal getCenter() const = 0;
00126
00130 virtual DoubleReal getFWHM() const = 0;
00131
00138 virtual DoubleReal computeTheoretical(const FeatureFinderAlgorithmPickedHelperStructs::MassTrace<PeakType> & trace, Size k) = 0;
00139
00146 virtual bool checkMinimalRTSpan(const std::pair<DoubleReal, DoubleReal> & rt_bounds, const DoubleReal min_rt_span) = 0;
00147
00153 virtual bool checkMaximalRTSpan(const DoubleReal max_rt_span) = 0;
00154
00159 virtual DoubleReal getFeatureIntensityContribution() = 0;
00160
00170 virtual String getGnuplotFormula(FeatureFinderAlgorithmPickedHelperStructs::MassTrace<PeakType> const & trace, const char function_name, const DoubleReal baseline, const DoubleReal rt_shift) = 0;
00171
00172 protected:
00173
00180 virtual void printState_(SignedSize iter, gsl_multifit_fdfsolver * s) = 0;
00181
00182 virtual void updateMembers_()
00183 {
00184 max_iterations_ = this->param_.getValue("max_iteration");
00185 epsilon_abs_ = this->param_.getValue("epsilon_abs");
00186 epsilon_rel_ = this->param_.getValue("epsilon_rel");
00187 }
00188
00194 virtual void getOptimizedParameters_(gsl_multifit_fdfsolver * s) = 0;
00195
00199 void optimize_(FeatureFinderAlgorithmPickedHelperStructs::MassTraces<PeakType> & traces, const Size num_params, double x_init[],
00200 Int (* residual)(const gsl_vector * x, void * params, gsl_vector * f),
00201 Int (* jacobian)(const gsl_vector * x, void * params, gsl_matrix * J),
00202 Int (* evaluate)(const gsl_vector * x, void * params, gsl_vector * f, gsl_matrix * J))
00203 {
00204 const gsl_multifit_fdfsolver_type * T;
00205 gsl_multifit_fdfsolver * s;
00206
00207 const size_t data_count = traces.getPeakCount();
00208
00209
00210
00211 if (data_count < num_params) throw Exception::UnableToFit(__FILE__, __LINE__, __PRETTY_FUNCTION__, "UnableToFit-FinalSet", "Skipping feature, gsl always expects N>=p");
00212
00213 gsl_multifit_function_fdf func;
00214 gsl_vector_view x = gsl_vector_view_array(x_init, num_params);
00215 gsl_rng_env_setup();
00216 func.f = (residual);
00217 func.df = (jacobian);
00218 func.fdf = (evaluate);
00219 func.n = data_count;
00220 func.p = num_params;
00221 func.params = &traces;
00222 T = gsl_multifit_fdfsolver_lmsder;
00223 s = gsl_multifit_fdfsolver_alloc(T, data_count, num_params);
00224 gsl_multifit_fdfsolver_set(s, &func, &x.vector);
00225 SignedSize iter = 0;
00226 Int gsl_status_;
00227 do
00228 {
00229 iter++;
00230 gsl_status_ = gsl_multifit_fdfsolver_iterate(s);
00231 printState_(iter, s);
00232 if (gsl_status_) break;
00233 gsl_status_ = gsl_multifit_test_delta(s->dx, s->x, epsilon_abs_, epsilon_rel_);
00234 }
00235 while (gsl_status_ == GSL_CONTINUE && iter < max_iterations_);
00236
00237
00238 getOptimizedParameters_(s);
00239
00240 gsl_multifit_fdfsolver_free(s);
00241 }
00242
00244
00245 DoubleReal epsilon_abs_;
00247 DoubleReal epsilon_rel_;
00249 SignedSize max_iterations_;
00250
00251 };
00252
00253 }
00254
00255 #endif // #ifndef OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDERALGORITHMPICKED_RTFITTING_H