36{
37 picked_peaks.clear();
38
39 qsizetype trace_size = trace.size();
40
41 if(trace_size < 5)
42 return;
43
44
45 LocalSignalToNoiseEstimator::Parameters signal_to_noise_estimator_parameters;
46 LocalSignalToNoiseEstimator local_signal_estimator(signal_to_noise_estimator_parameters);
47
49 {
50 local_signal_estimator.initialize(trace);
51 }
52
53
54
55 for(qsizetype iter = 2; iter < trace_size - 2; ++iter)
56 {
57 double center_data_point_mz = trace.at(iter).x;
58 double center_data_point_int = trace.at(iter).y;
59 double left_data_point_mz = trace.at(iter - 1).x;
60 double left_data_point_int = trace.at(iter - 1).y;
61 double right_data_point_mz = trace.at(iter + 1).x;
62 double right_data_point_int = trace.at(iter + 1).y;
63
64
65 if(std::fabs(left_data_point_int) <
66 std::numeric_limits<double>::epsilon())
67 {
68 continue;
69 }
70 if(std::fabs(right_data_point_int) <
71 std::numeric_limits<double>::epsilon())
72 {
73 continue;
74 }
75
76 double current_snt_estimate = 0.0;
77 double current_snt_estimate_left_1 = 0.0;
78 double current_snt_estimate_right_1 = 0.0;
79
81 {
82 current_snt_estimate =
83 local_signal_estimator.getSignalToNoiseRatio(iter);
84
85
86
87
88
89
90 current_snt_estimate_left_1 =
91 local_signal_estimator.getSignalToNoiseRatio(iter - 1);
92 current_snt_estimate_right_1 =
93 local_signal_estimator.getSignalToNoiseRatio(iter + 1);
94 }
95
96
97 if((center_data_point_int > left_data_point_int) &&
98 (center_data_point_int > right_data_point_int) &&
100 (current_snt_estimate_left_1 >=
m_parameters.signalToNoise) &&
101 (current_snt_estimate_right_1 >=
m_parameters.signalToNoise))
102 {
103
104
105
106
107
108
109 double current_snt_estimate_left_2 = 0.0;
110 double current_snt_estimate_right_2 = 0.0;
111
113 {
114 current_snt_estimate_left_2 =
115 local_signal_estimator.getSignalToNoiseRatio(iter - 2);
116 current_snt_estimate_right_2 =
117 local_signal_estimator.getSignalToNoiseRatio(iter + 2);
118 }
119
120
121 if((iter > 1) && (iter + 2 < static_cast<qsizetype>(trace.size())) &&
122 (left_data_point_int < trace.at(iter - 2).y) &&
123 (right_data_point_int < trace.at(iter + 2).y) &&
124 (current_snt_estimate_left_2 >=
m_parameters.signalToNoise) &&
125 (current_snt_estimate_right_2 >=
m_parameters.signalToNoise))
126 {
127
128
129
130
131
132
133
134 ++iter;
135 continue;
136 }
137
138 QMap<double, double> peak_raw_data;
139
140 peak_raw_data[center_data_point_mz] = center_data_point_int;
141 peak_raw_data[left_data_point_mz] = left_data_point_int;
142 peak_raw_data[right_data_point_mz] = right_data_point_int;
143
144
145
146 qsizetype k = 2;
147
148
149 bool previous_zero_left = false;
150 qsizetype missing_left_count = 0;
151
152 qsizetype left_boundary = iter - 1;
153
154 while((k <= iter) &&
155 (iter - k + 1 > 0) && !previous_zero_left &&
156 (trace.at(iter - k).y <= peak_raw_data.begin().value()))
157 {
158 double current_snt_estimate_left_k = 0.0;
159
161 {
162 current_snt_estimate_left_k =
163 local_signal_estimator.getSignalToNoiseRatio(iter - k);
164 }
165
166 if(current_snt_estimate_left_k >=
m_parameters.signalToNoise)
167 {
168 peak_raw_data[trace.at(iter - k).x] = trace.at(iter - k).y;
169 }
170 {
171 ++missing_left_count;
173 {
174 peak_raw_data[trace.at(iter - k).x] = trace.at(iter - k).y;
175 }
176 }
177
178 previous_zero_left = (trace.at(iter - k).
y == 0);
179 left_boundary = iter - k;
180 ++k;
181 }
182
183
184 k = 2;
185
186
187 bool previous_zero_right = false;
188 qsizetype missing_right_count = 0;
189
190 qsizetype right_boundary(iter + 1);
191
192 while((iter + k < static_cast<qsizetype>(trace.size())) &&
193 !previous_zero_right &&
194 (trace.at(iter + k).y <= peak_raw_data.last()))
195 {
196 double current_snt_estimate_right_k = 0.0;
197
199 {
200 current_snt_estimate_right_k =
201 local_signal_estimator.getSignalToNoiseRatio(iter + k);
202 }
203
204 if(current_snt_estimate_right_k >=
m_parameters.signalToNoise)
205 {
206 peak_raw_data[trace.at(iter + k).x] = trace.at(iter + k).y;
207 }
208 else
209 {
210 ++missing_right_count;
211 if(missing_right_count <=
m_parameters.missingPeakCount)
212 {
213 peak_raw_data[trace.at(iter + k).x] =
214 trace.at(iter + k).y;
215 }
216 }
217
218 previous_zero_right = (trace.at(iter + k).
y == 0);
219 right_boundary = iter + k;
220 ++k;
221 }
222
223
224 if(peak_raw_data.size() < 3)
225 {
226 continue;
227 }
228
229
230
231 CubicSplineModel cubic_spline_model(peak_raw_data);
232
233
234
235
236
237
238
239
240 double max_peak_mz = center_data_point_mz;
241 double max_peak_int = center_data_point_int;
242 double threshold = 1e-6;
244 left_data_point_mz,
245 right_data_point_mz,
246 max_peak_mz,
247 max_peak_int,
248 threshold);
249
250
251 DataPoint data_point;
252
254
255 data_point.x = max_peak_mz;
256 data_point.y = max_peak_int;
257 peak_range.
mz_start = trace.at(left_boundary).x;
258 peak_range.mz_stop = trace.at(right_boundary).x;
259
260
261
262
263 picked_peaks.append(data_point);
264
265 peak_ranges.push_back(peak_range);
266
267
268 iter += k - 1;
269 }
270 }
271
272
273
274}
void spline_bisection(const CubicSplineModel &spline_model, double const mz_at_left, double const mz_at_right, double ¢er_peak_mz, double ¢er_peak_intensity, double const threshold)