47 typedef typename PeakConstIterator::value_type PeakT;
51 return SpectrumSettings::SpectrumType::UNKNOWN;
54 const int max_peaks = 5;
55 int profile_evidence = 0;
56 int centroid_evidence = 0;
59 std::vector<PeakT> data(begin, end);
61 double total_int = std::accumulate(begin, end, 0.0, [](
double int_,
const PeakT& p) {
return int_ + p.getIntensity(); } );
62 double explained_int = 0;
64 for (
int i = 0; i < max_peaks; ++i)
68 if (explained_int > 0.5 * total_int)
break;
71 Size idx = std::numeric_limits<Size>::max();
73 for (
Size i = 0; i < data.size(); ++i)
75 if (data[i].getIntensity() > int_max)
77 int_max = data[i].getIntensity();
82 if (idx == std::numeric_limits<Size>::max())
break;
85 typedef typename std::vector<PeakT>::iterator PeakIterator;
86 PeakIterator it_max = data.begin() + idx;
87 PeakIterator it = it_max;
88 double int_last = int_max;
89 while (it != data.begin()
90 && it->getIntensity() <= int_last
91 && it->getIntensity() > 0
92 && (it->getIntensity() / int_last) > 0.1
93 && it->getMZ() + 1 > it_max->getMZ())
95 int_last = it->getIntensity();
96 explained_int += int_last;
103 if (it->getIntensity() > int_last) (it+1)->setIntensity(int_last);
106 bool break_left =
false;
107 if (it_max - it < 2+1)
113 it_max->setIntensity(int_max);
114 explained_int -= int_max;
117 while (it != data.end()
118 && it->getIntensity() <= int_last
119 && it->getIntensity() > 0
120 && (it->getIntensity() / int_last) > 0.1
121 && it->getMZ() - 1 < it_max->getMZ())
123 int_last = it->getIntensity();
124 explained_int += int_last;
132 if (it != data.end() && it->getIntensity() > int_last) (it-1)->setIntensity(int_last);
134 if (break_left || it - it_max < 2+1)
146 float evidence_ratio = profile_evidence / float(profile_evidence + centroid_evidence);
149 if (evidence_ratio > 0.75)
152 return SpectrumSettings::SpectrumType::PROFILE;
157 return SpectrumSettings::SpectrumType::CENTROID;