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 #ifndef OPENMS_FILTERING_TRANSFORMERS_COMPLEMENTFILTER_H
00028 #define OPENMS_FILTERING_TRANSFORMERS_COMPLEMENTFILTER_H
00029
00030 #include <OpenMS/FILTERING/TRANSFORMERS/FilterFunctor.h>
00031
00032 #include <map>
00033 #include <cmath>
00034
00035 namespace OpenMS
00036 {
00044 class ComplementFilter : public FilterFunctor
00045 {
00046 public:
00047
00048
00050
00051 ComplementFilter();
00052
00054 ComplementFilter(const ComplementFilter& source);
00055
00057 virtual ~ComplementFilter();
00059
00060
00062
00063 ComplementFilter& operator = (const ComplementFilter& source);
00065
00066
00068 static FilterFunctor* create() { return new ComplementFilter(); }
00069
00071 template <typename SpectrumType> double apply(SpectrumType& spectrum)
00072 {
00073 if (spectrum.size() < 2)
00074 {
00075 return 0;
00076 }
00077 double tolerance = (double)param_.getValue("tolerance");
00078 double parentmass = spectrum.getPrecursorPeak().getPosition()[0];
00079 double result(0);
00080
00081 spectrum.getContainer().sortByPosition();
00082
00084 uint j = spectrum.size() - 1;
00085 for (uint i = 0; i < spectrum.size() && i <= j; )
00086 {
00087 double sum = spectrum.getContainer()[i].getPosition()[0] + spectrum.getContainer()[j].getPosition()[0];
00088
00089 if (std::fabs(sum - parentmass) < tolerance)
00090 {
00091 result += spectrum.getContainer()[i].getIntensity() + spectrum.getContainer()[j].getIntensity();
00092 }
00093
00094 if (sum < parentmass)
00095 {
00096 ++i;
00097 }
00098 else
00099 {
00100 if (sum > parentmass)
00101 {
00102 --j;
00103 }
00104 }
00105 }
00106
00107 return result;
00108 }
00109
00111 static const String getProductName()
00112 {
00113 return "ComplementFilter";
00114 }
00116
00117 };
00118 }
00119 #endif // OPENMS_FILTERING_TRANSFORMERS_COMPLEMENTFILTER_H