Home  · Classes  · Annotated Classes  · Modules  · Members  · Namespaces  · Related Pages

TraceFitter.h

Go to the documentation of this file.
00001 // --------------------------------------------------------------------------
00002 //                   OpenMS -- Open-Source Mass Spectrometry
00003 // --------------------------------------------------------------------------
00004 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
00005 // ETH Zurich, and Freie Universitaet Berlin 2002-2012.
00006 //
00007 // This software is released under a three-clause BSD license:
00008 //  * Redistributions of source code must retain the above copyright
00009 //    notice, this list of conditions and the following disclaimer.
00010 //  * Redistributions in binary form must reproduce the above copyright
00011 //    notice, this list of conditions and the following disclaimer in the
00012 //    documentation and/or other materials provided with the distribution.
00013 //  * Neither the name of any author or any participating institution
00014 //    may be used to endorse or promote products derived from this software
00015 //    without specific prior written permission.
00016 // For a full list of authors, refer to the file AUTHORS.
00017 // --------------------------------------------------------------------------
00018 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00019 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
00022 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00023 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00024 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
00025 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
00026 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
00027 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
00028 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029 //
00030 // --------------------------------------------------------------------------
00031 // $Maintainer: Stephan Aiche$
00032 // $Authors: Stephan Aiche, Marc Sturm $
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       // gsl always expects N>=p or default gsl error handler invoked,
00210       // cause Jacobian be rectangular M x N with M>=N
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       // get the parameters out of the fdfsolver
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

OpenMS / TOPP release 1.10.0 Documentation generated on Thu Mar 7 2013 09:42:46 using doxygen 1.7.1