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

FeatureFinder_impl.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: Clemens Groepl $
00032 // $Authors: $
00033 // --------------------------------------------------------------------------
00034 
00035 #ifndef OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDER_IMPL_H
00036 #define OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDER_IMPL_H
00037 
00038 #include <OpenMS/CONCEPT/Factory.h>
00039 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/FeatureFinder.h>
00040 
00041 #include <OpenMS/TRANSFORMATIONS/FEATUREFINDER/FeatureFinderAlgorithm_impl.h>
00042 
00043 namespace OpenMS
00044 {
00045   // This is documented in the declaration, see FeatureFinder.h
00046   template <class PeakType, class FeatureType>
00047   void FeatureFinder::run(const String & algorithm_name, MSExperiment<PeakType> & input_map, FeatureMap<FeatureType> & features, const Param & param, const FeatureMap<FeatureType> & seeds)
00048   {
00049     // Nothing to do if there is no data
00050     if ((algorithm_name != "mrm" && input_map.empty()) || (algorithm_name == "mrm" && input_map.getChromatograms().empty()))
00051     {
00052       features.clear(true);
00053       return;
00054     }
00055 
00056     // check input
00057     {
00058       // We need updated ranges => check number of peaks
00059       if (algorithm_name != "mrm" && input_map.getSize() == 0)
00060       {
00061         throw Exception::IllegalArgument(__FILE__, __LINE__, __PRETTY_FUNCTION__, "FeatureFinder needs updated ranges on input map. Aborting.");
00062       }
00063 
00064       // We need MS1 data only => check levels
00065       if (algorithm_name != "mrm" && (input_map.getMSLevels().size() != 1 || input_map.getMSLevels()[0] != 1))
00066       {
00067         throw Exception::IllegalArgument(__FILE__, __LINE__, __PRETTY_FUNCTION__, "FeatureFinder can only operate on MS level 1 data. Please do not use MS/MS data. Aborting.");
00068       }
00069 
00070       //Check if the peaks are sorted according to m/z
00071       if (!input_map.isSorted(true))
00072       {
00073         LOG_WARN << "Input map is not sorted by RT and m/z! This is done now, before applying the algorithm!" << std::endl;
00074         input_map.sortSpectra(true);
00075         input_map.sortChromatograms(true);
00076       }
00077       for (Size s = 0; s < input_map.size(); ++s)
00078       {
00079         if (input_map[s].empty())
00080           continue;
00081         if (input_map[s][0].getMZ() < 0)
00082         {
00083           throw Exception::IllegalArgument(__FILE__, __LINE__, __PRETTY_FUNCTION__, "FeatureFinder can only operate on spectra that contain peaks with positive m/z values. Filter the data accordingly beforehand! Aborting.");
00084         }
00085       }
00086     }
00087 
00088     // initialize
00089     if (algorithm_name != "mrm" && algorithm_name != "centroided")
00090     {
00091       // Resize peak flag vector
00092       flags_.resize(input_map.size());
00093       for (Size i = 0; i < input_map.size(); ++i)
00094       {
00095         flags_[i].assign(input_map[i].size(), UNUSED);
00096       }
00097     }
00098 
00099     // do the work
00100     if (algorithm_name != "none")
00101     {
00102       FeatureFinderAlgorithm<PeakType, FeatureType> * algorithm = Factory<FeatureFinderAlgorithm<PeakType, FeatureType> >::create(algorithm_name);
00103       algorithm->setParameters(param);
00104       algorithm->setData(input_map, features, *this);
00105       algorithm->setSeeds(seeds);
00106       algorithm->run();
00107       delete(algorithm);
00108     }
00109 
00110     if (algorithm_name != "mrm")   // mrm  works on chromatograms; the next section is only for conventional data
00111     {
00112       //report RT apex spectrum index and native ID for each feature
00113       for (Size i = 0; i < features.size(); ++i)
00114       {
00115         //index
00116         Size spectrum_index = input_map.RTBegin(features[i].getRT()) - input_map.begin();
00117         features[i].setMetaValue("spectrum_index", spectrum_index);
00118         //native id
00119         if (spectrum_index < input_map.size())
00120         {
00121           String native_id = input_map[spectrum_index].getNativeID();
00122           features[i].setMetaValue("spectrum_native_id", native_id);
00123         }
00124         else
00125         {
00127           std::cerr << "FeatureFinderAlgorithm_impl, line=" << __LINE__ << "; FixMe this cannot be, but happens" << std::endl;
00128         }
00129       }
00130     }
00131   }
00132 
00133 } // namespace OpenMS
00134 
00135 #endif // OPENMS_TRANSFORMATIONS_FEATUREFINDER_FEATUREFINDER_IMPL_H

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