Go to the documentation of this file.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_FEATUREFINDERALGORITHMSIMPLEST_H
00036 #define OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDERALGORITHMSIMPLEST_H
00037
00038 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/FeatureFinderAlgorithm.h>
00039
00040 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/SimpleSeeder.h>
00041 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/SimpleExtender.h>
00042 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/ModelFitter.h>
00043
00044 namespace OpenMS
00045 {
00057 template <class PeakType, class FeatureType>
00058 class FeatureFinderAlgorithmSimplest :
00059 public FeatureFinderAlgorithm<PeakType, FeatureType>,
00060 public FeatureFinderDefs
00061 {
00062
00063 public:
00065 FeatureFinderAlgorithmSimplest() :
00066 FeatureFinderAlgorithm<PeakType, FeatureType>()
00067 {
00068 this->defaults_ = getDefaultParameters();
00069 this->check_defaults_ = false;
00070 }
00071
00072 virtual Param getDefaultParameters() const
00073 {
00074 Param tmp;
00075
00076 SimpleSeeder<PeakType, FeatureType> seeder(this->map_, this->features_, this->ff_);
00077 tmp.insert("seeder:", seeder.getParameters());
00078 tmp.setSectionDescription("seeder", "Settings for the seeder (Determines potential feature regions)");
00079
00080 SimpleExtender<PeakType, FeatureType> extender(this->map_, this->features_, this->ff_);
00081 tmp.insert("extender:", extender.getParameters());
00082 tmp.setSectionDescription("extender", "Settings for the extender (Collects all peaks belonging to a feature)");
00083
00084 ModelFitter<PeakType, FeatureType> fitter(this->map_, this->features_, this->ff_);
00085 tmp.insert("fitter:", fitter.getParameters());
00086 tmp.setSectionDescription("fitter", "Settings for the modefitter (Fits a model to the data determinging the probapility that they represent a feature.)");
00087
00088 return tmp;
00089 }
00090
00091 virtual void run()
00092 {
00093 #ifdef DEBUG_FEATUREFINDER
00094 UInt seed_nr = 0;
00095 #endif
00096 SimpleSeeder<PeakType, FeatureType> seeder(this->map_, this->features_, this->ff_);
00097 seeder.setParameters(this->getParameters().copy("seeder:", true));
00098
00099 SimpleExtender<PeakType, FeatureType> extender(this->map_, this->features_, this->ff_);
00100 extender.setParameters(this->getParameters().copy("extender:", true));
00101
00102 ModelFitter<PeakType, FeatureType> fitter(this->map_, this->features_, this->ff_);
00103 Param params;
00104 params.setDefaults(this->getParameters().copy("fitter:", true));
00105 params.setValue("fit_algorithm", "simplest");
00106 fitter.setParameters(params);
00107
00109 Summary summary;
00110
00111 try
00112 {
00113 for (;; )
00114 {
00115 #ifdef DEBUG_FEATUREFINDER
00116 std::cout << "===============================" << std::endl;
00117 std::cout << "### Seeder (seed # " << ++seed_nr << ")..." << std::endl;
00118 #endif
00119 IndexPair seed = seeder.nextSeed();
00120
00121 #ifdef DEBUG_FEATUREFINDER
00122 std::cout << "seed ... " << seed.first << " - " << seed.second << std::endl;
00123 std::cout << "### Extender..." << std::endl;
00124 #endif
00125 ChargedIndexSet index_set;
00126 index_set.insert(seed);
00127 ChargedIndexSet region;
00128 extender.extend(index_set, region);
00129
00130 #ifdef DEBUG_FEATUREFINDER
00131 std::cout << "### ModelFitter..." << std::endl;
00132 #endif
00133 try
00134 {
00135 this->features_->push_back(fitter.fit(region));
00136
00137
00138 {
00139 const Feature & f = this->features_->back();
00140
00141
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
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
00156 const Param & p = f.getModelDescription().getParam();
00157 ++summary.mz_model[p.getValue("MZ")];
00158
00159
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 (Exception::UnableToFit ex)
00167 {
00168 std::cout << "UnableToFit: " << ex.what() << std::endl;
00169
00170
00171 for (IndexSet::const_iterator it = region.begin(); it != region.end(); ++it)
00172 {
00173 this->ff_->getPeakFlag(*it) = UNUSED;
00174 }
00175
00176
00177 {
00178 ++summary.no_exceptions;
00179 ++summary.exception[ex.getName()];
00180 }
00181 }
00182 }
00183 }
00184 catch (NoSuccessor ex)
00185 {
00186 }
00187
00188 this->ff_->endProgress();
00189
00190
00191 {
00192 Size size = this->features_->size();
00193 std::cout << size << " features were found. " << std::endl;
00194
00195
00196 summary.corr_mean /= size;
00197
00198 std::cout << "FeatureFinder summary:\n"
00199 << "Correlation:\n\tminimum: " << summary.corr_min << "\n\tmean: " << summary.corr_mean
00200 << "\n\tmaximum: " << summary.corr_max << std::endl;
00201
00202 std::cout << "Exceptions:\n";
00203 for (std::map<String, UInt>::const_iterator it = summary.exception.begin(); it != summary.exception.end(); ++it)
00204 {
00205 std::cout << "\t" << it->first << ": " << it->second * 100 / summary.no_exceptions << "% (" << it->second << ")\n";
00206 }
00207
00208 std::cout << "Chosen mz models:\n";
00209 for (std::map<String, UInt>::const_iterator it = summary.mz_model.begin(); it != summary.mz_model.end(); ++it)
00210 {
00211 std::cout << "\t" << it->first << ": " << it->second * 100 / size << "% (" << it->second << ")\n";
00212 }
00213
00214 std::cout << "Chosen mz stdevs:\n";
00215 for (std::map<float, UInt>::const_iterator it = summary.mz_stdev.begin(); it != summary.mz_stdev.end(); ++it)
00216 {
00217 std::cout << "\t" << it->first << ": " << it->second * 100 / (size - summary.charge[0]) << "% (" << it->second << ")\n";
00218 }
00219
00220 std::cout << "Charges:\n";
00221 for (Size i = 1; i < summary.charge.size(); ++i)
00222 {
00223 if (summary.charge[i] != 0)
00224 {
00225 std::cout << "\t+" << i << ": " << summary.charge[i] * 100 / (size - summary.charge[0]) << "% (" << summary.charge[i] << ")\n";
00226 }
00227 }
00228 }
00229 }
00230
00231 static FeatureFinderAlgorithm<PeakType, FeatureType> * create()
00232 {
00233 return new FeatureFinderAlgorithmSimplest();
00234 }
00235
00236 static const String getProductName()
00237 {
00238 return "simplest";
00239 }
00240
00241 private:
00243 FeatureFinderAlgorithmSimplest & operator=(const FeatureFinderAlgorithmSimplest &);
00245 FeatureFinderAlgorithmSimplest(const FeatureFinderAlgorithmSimplest &);
00246
00247 };
00248
00249 }
00250
00251 #endif // OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDERALGORITHMSIMPLEST_H