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

FeatureFinderAlgorithmSimplest.h (Maintainer: Marcel Grunert)

Go to the documentation of this file.
00001 // -*- Mode: C++; tab-width: 2; -*-
00002 // vi: set ts=2:
00003 //
00004 // --------------------------------------------------------------------------
00005 //                   OpenMS Mass Spectrometry Framework
00006 // --------------------------------------------------------------------------
00007 //  Copyright (C) 2003-2008 -- Oliver Kohlbacher, Knut Reinert
00008 //
00009 //  This library is free software; you can redistribute it and/or
00010 //  modify it under the terms of the GNU Lesser General Public
00011 //  License as published by the Free Software Foundation; either
00012 //  version 2.1 of the License, or (at your option) any later version.
00013 //
00014 //  This library is distributed in the hope that it will be useful,
00015 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017 //  Lesser General Public License for more details.
00018 //
00019 //  You should have received a copy of the GNU Lesser General Public
00020 //  License along with this library; if not, write to the Free Software
00021 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 //
00023 // --------------------------------------------------------------------------
00024 // $Maintainer: Marcel Grunert $
00025 // --------------------------------------------------------------------------
00026 
00027 #ifndef OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDERALGORITHMSIMPLEST_H
00028 #define OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDERALGORITHMSIMPLEST_H
00029 
00030 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/FeatureFinderAlgorithm.h>
00031 
00032 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/SimpleSeeder.h>
00033 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/SimpleExtender.h>
00034 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/ModelFitter.h>
00035 
00036 namespace OpenMS
00037 {
00047   template<class PeakType, class FeatureType> class FeatureFinderAlgorithmSimplest :
00048     public FeatureFinderAlgorithm<PeakType, FeatureType>,
00049     public FeatureFinderDefs
00050   {
00051 
00052     public:     
00054       FeatureFinderAlgorithmSimplest() :
00055         FeatureFinderAlgorithm<PeakType,FeatureType>()
00056       {
00057         this->defaults_ = getDefaultParameters();
00058         this->check_defaults_ =  false;
00059       }
00060 
00061       virtual Param getDefaultParameters() const
00062       {
00063         Param tmp;
00064 
00065         SimpleSeeder<PeakType,FeatureType> seeder(this->map_, this->features_, this->ff_);
00066         tmp.insert("seeder:", seeder.getParameters());
00067         tmp.setSectionDescription("seeder", "Settings for the seeder (Determines potential feature regions)");
00068 
00069         SimpleExtender<PeakType,FeatureType> extender(this->map_, this->features_, this->ff_);
00070         tmp.insert("extender:", extender.getParameters());
00071         tmp.setSectionDescription("extender", "Settings for the extender (Collects all peaks belonging to a feature)");
00072 
00073         ModelFitter<PeakType,FeatureType> fitter(this->map_, this->features_, this->ff_);
00074         tmp.insert("fitter:", fitter.getParameters());
00075         tmp.setSectionDescription("fitter", "Settings for the modefitter (Fits a model to the data determinging the probapility that they represent a feature.)");
00076         
00077         return tmp;
00078       }
00079 
00080       virtual void run()
00081       {
00082         UInt seed_nr=1;
00083 
00084         SimpleSeeder<PeakType,FeatureType> seeder(this->map_, this->features_, this->ff_);
00085         seeder.setParameters(this->getParameters().copy("seeder:",true));
00086 
00087         SimpleExtender<PeakType,FeatureType> extender(this->map_, this->features_, this->ff_);
00088         extender.setParameters(this->getParameters().copy("extender:",true));
00089 
00090         ModelFitter<PeakType,FeatureType> fitter(this->map_, this->features_, this->ff_);
00091         Param params;
00092         params.setDefaults(this->getParameters().copy("fitter:",true));
00093         params.setValue("fit_algorithm", "simplest");
00094         fitter.setParameters(params);
00095     
00097         struct Summary
00098         {
00099           std::map<String,UInt> exception; //count exceptions
00100           UInt no_exceptions;
00101           std::map<String,UInt> mz_model; //count used mz models
00102           std::map<float,UInt> mz_stdev; //count used mz standard deviations
00103           std::vector<UInt> charge; //count used charges
00104           DoubleReal corr_mean, corr_max, corr_min;   //boxplot for correlation
00105           
00107           Summary() :
00108             no_exceptions(0),
00109             corr_mean(0),
00110             corr_max(0),
00111             corr_min(1)
00112           {}
00113         
00114         } summary;
00115 
00116         try
00117         {
00118           for(;;)
00119           {
00120 
00121             std::cout << "===============================" << std::endl;
00122 
00123             std::cout << "### Seeder (seed # " << ++seed_nr << ")..." << std::endl;
00124             IndexPair seed = seeder.nextSeed();
00125 
00126             std::cout << "### Extender..." << std::endl;
00127             ChargedIndexSet index_set;
00128             index_set.insert(seed);
00129             ChargedIndexSet region;
00130             extender.extend(index_set, region);
00131 
00132             std::cout << "### ModelFitter..." << std::endl;
00133             try
00134             {
00135               this->features_->push_back(fitter.fit(region));
00136 
00137               // gather information for fitting summary
00138               {
00139                 const Feature& f = this->features_->back();
00140 
00141                 // quality, correlation
00142                 DoubleReal corr = f.getOverallQuality();
00143                 summary.corr_mean += corr;
00144                 if (corr<summary.corr_min) summary.corr_min = corr;
00145                 if (corr>summary.corr_max) summary.corr_max = corr;
00146 
00147                 // charge
00148                 UInt ch = f.getCharge();
00149                 if (ch>= summary.charge.size())
00150                 {
00151                   summary.charge.resize(ch+1);
00152                 }
00153                 summary.charge[ch]++;
00154 
00155                 // MZ model type
00156                 const Param& p = f.getModelDescription().getParam();
00157                 ++summary.mz_model[ p.getValue("MZ") ];
00158 
00159                 // standard deviation of isotopic peaks
00160                 if (p.exists("MZ:isotope:stdev") && p.getValue("MZ:isotope:stdev")!=DataValue::EMPTY)
00161                 {
00162                   ++summary.mz_stdev[p.getValue("MZ:isotope:stdev")];
00163                 }
00164               }
00165             }
00166             catch( UnableToFit ex)
00167             {
00168               std::cout << "UnableToFit: " << ex.what() << std::endl;
00169 
00170               // set unused flag for all data points
00171               for (IndexSet::const_iterator it=region.begin(); it!=region.end(); ++it)
00172               {
00173                 this->ff_->getPeakFlag(*it) = UNUSED;
00174               }
00175               
00176               // gather information for fitting summary
00177               {
00178                 ++summary.no_exceptions;
00179                 ++summary.exception[ex.getName()];
00180               }
00181             }
00182           } // for
00183         } // try
00184         catch(NoSuccessor ex)
00185         {
00186         }
00187         // print fitting summary
00188         {
00189           UInt size = this->features_->size();
00190           std::cout << size << " features were found. " << std::endl;
00191 
00192           // compute corr_mean
00193           summary.corr_mean /= size;
00194 
00195           std::cout << "FeatureFinder summary:\n"
00196             << "Correlation:\n\tminimum: " << summary.corr_min << "\n\tmean: " << summary.corr_mean
00197             << "\n\tmaximum: " << summary.corr_max << std::endl;
00198 
00199           std::cout << "Exceptions:\n";
00200           for (std::map<String,UInt>::const_iterator it=summary.exception.begin(); it!=summary.exception.end(); ++it)
00201           {
00202             std::cout << "\t" << it->first << ": " << it->second*100/summary.no_exceptions << "% (" << it->second << ")\n";
00203           }
00204 
00205           std::cout << "Chosen mz models:\n";
00206           for (std::map<String,UInt>::const_iterator it=summary.mz_model.begin(); it!=summary.mz_model.end(); ++it)
00207           {
00208             std::cout << "\t" << it->first << ": " << it->second*100/size << "% (" << it->second << ")\n";
00209           }
00210 
00211           std::cout << "Chosen mz stdevs:\n";
00212           for (std::map<float,UInt>::const_iterator it=summary.mz_stdev.begin(); it!=summary.mz_stdev.end(); ++it)
00213           {
00214             std::cout << "\t" << it->first << ": " << it->second*100/(size-summary.charge[0]) << "% (" << it->second << ")\n";
00215           }
00216 
00217           std::cout << "Charges:\n";
00218           for (UInt i=1; i<summary.charge.size(); ++i)
00219           {
00220             if (summary.charge[i]!=0)
00221             {
00222               std::cout << "\t+" << i << ": " << summary.charge[i]*100/(size-summary.charge[0]) << "% (" << summary.charge[i] << ")\n";
00223             }
00224           }
00225         }
00226         return;
00227       } // run
00228 
00229       static FeatureFinderAlgorithm<PeakType,FeatureType>* create()
00230       {
00231         return new FeatureFinderAlgorithmSimplest();
00232       }
00233 
00234       static const String getProductName()
00235       {
00236         return "simplest";
00237       }
00238     private:
00240       FeatureFinderAlgorithmSimplest& operator=(const FeatureFinderAlgorithmSimplest&);
00242       FeatureFinderAlgorithmSimplest(const FeatureFinderAlgorithmSimplest&);
00243 
00244   }; // FeatureFinderAlgorithmSimplest 
00245 
00246 } // namespace OpenMS
00247 
00248 #endif // OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDERALGORITHMSIMPLEST_H

Generated Tue Apr 1 15:36:34 2008 -- using doxygen 1.5.4 OpenMS / TOPP 1.1