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_GOODDIFFFILTER_H
00028 #define OPENMS_FILTERING_TRANSFORMERS_GOODDIFFFILTER_H
00029
00030 #include <OpenMS/FILTERING/TRANSFORMERS/FilterFunctor.h>
00031
00032 #include <map>
00033 #include <string>
00034 #include <cmath>
00035
00036 namespace OpenMS
00037 {
00045 class GoodDiffFilter : public FilterFunctor
00046 {
00047 public:
00048
00049
00050
00052 GoodDiffFilter();
00053
00055 GoodDiffFilter(const GoodDiffFilter& source);
00056
00058 virtual ~GoodDiffFilter();
00059
00060
00061
00062
00064 GoodDiffFilter& operator=(const GoodDiffFilter& source);
00065
00066
00067
00068
00070 static FilterFunctor* create() { return new GoodDiffFilter();}
00071
00073 template <typename SpectrumType> double apply(SpectrumType& spectrum)
00074 {
00075 double tolerance = (double)param_.getValue("tolerance");
00076 double gooddiff = 0;
00077
00078 double totaldiff = 0;
00079 for (uint i = 0; i < spectrum.size(); ++i)
00080 {
00081
00082 for (uint j = i; i+j < spectrum.size(); ++j)
00083 {
00084 double diff = spectrum.getContainer()[i+j].getPosition()[0] - spectrum.getContainer()[i].getPosition()[0];
00085 if (diff < 56)
00086 {
00087 continue;
00088 }
00089
00090 if (diff > 187)
00091 {
00092 j = spectrum.size();
00093 }
00094 else
00095 {
00096 totaldiff += spectrum.getContainer()[i+j].getIntensity() + spectrum.getContainer()[i].getIntensity();
00097 std::map<double, char>::const_iterator aait = aamass_.lower_bound(diff);
00098
00099 if (fabs(aait->first - diff ) <= tolerance)
00100 {
00101 gooddiff += spectrum.getContainer()[i+j].getIntensity() + spectrum.getContainer()[i].getIntensity();
00102 }
00103 else
00104 {
00105 ++aait;
00106 if ((aait) != aamass_.end() && fabs ((aait)->first - diff) <= tolerance)
00107 {
00108 gooddiff += spectrum.getContainer()[i+j].getIntensity() + spectrum.getContainer()[i].getIntensity();
00109 }
00110 }
00111 }
00112 }
00113 }
00114
00115 return gooddiff/totaldiff;
00116 }
00117
00119 static const String getProductName()
00120 {
00121 return "GoodDiffFilter";
00122 }
00123
00124
00125
00126 private:
00127
00129 std::map<double, char> aamass_;
00130 };
00131 }
00132 #endif // OPENMS_FILTERING_TRANSFORMERS_GOODDIFFFILTER_H