31 template<
typename IteratorT>
36 typedef typename IteratorT::value_type::IntensityType
value_type;
37 typedef typename IteratorT::value_type::IntensityType&
reference;
38 typedef typename IteratorT::value_type::IntensityType*
pointer;
47 return base->getIntensity();
50 template<
typename IndexT>
53 return base[index].getIntensity();
69 IteratorT tmp = *
this;
89 template<
typename IteratorT>
142 defaults_.setValue(
"struc_elem_length", 3.0,
"Length of the structuring element. This should be wider than the expected peak width.");
143 defaults_.setValue(
"struc_elem_unit",
"Thomson",
"The unit of the 'struct_elem_length'.");
144 defaults_.setValidStrings(
"struc_elem_unit", {
"Thomson",
"DataPoints"});
146 defaults_.setValue(
"method",
"tophat",
147 "Method to use, the default is 'tophat'. Do not change this unless you know what you are doing. The other methods may be useful for tuning the parameters, see the class "
148 "documentation of MorpthologicalFilter.");
149 defaults_.setValidStrings(
"method", {
"identity",
"erosion",
"dilation",
"opening",
"closing",
"gradient",
"tophat",
"bothat",
"erosion_simple",
"dilation_simple"});
170 template<
typename InputIterator,
typename OutputIterator>
171 void filterRange(InputIterator input_begin, InputIterator input_end, OutputIterator output_begin)
174 static thread_local std::vector<typename InputIterator::value_type> buffer;
175 const UInt size = input_end - input_begin;
178 if (struct_size_in_datapoints_ == 0)
180 struct_size_in_datapoints_ = (
UInt)(
double)param_.getValue(
"struc_elem_length");
184 std::string method = param_.getValue(
"method");
185 if (method ==
"identity")
187 std::copy(input_begin, input_end, output_begin);
189 else if (method ==
"erosion")
191 applyErosion_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
193 else if (method ==
"dilation")
195 applyDilation_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
197 else if (method ==
"opening")
199 if (buffer.size() < size)
201 applyErosion_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
202 applyDilation_(struct_size_in_datapoints_, buffer.begin(), buffer.begin() + size, output_begin);
204 else if (method ==
"closing")
206 if (buffer.size() < size)
208 applyDilation_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
209 applyErosion_(struct_size_in_datapoints_, buffer.begin(), buffer.begin() + size, output_begin);
211 else if (method ==
"gradient")
213 if (buffer.size() < size)
215 applyErosion_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
216 applyDilation_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
217 for (
UInt i = 0; i < size; ++i)
218 output_begin[i] -= buffer[i];
220 else if (method ==
"tophat")
222 if (buffer.size() < size)
224 applyErosion_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
225 applyDilation_(struct_size_in_datapoints_, buffer.begin(), buffer.begin() + size, output_begin);
226 for (
UInt i = 0; i < size; ++i)
227 output_begin[i] = input_begin[i] - output_begin[i];
229 else if (method ==
"bothat")
231 if (buffer.size() < size)
233 applyDilation_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
234 applyErosion_(struct_size_in_datapoints_, buffer.begin(), buffer.begin() + size, output_begin);
235 for (
UInt i = 0; i < size; ++i)
236 output_begin[i] = input_begin[i] - output_begin[i];
238 else if (method ==
"erosion_simple")
240 applyErosionSimple_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
242 else if (method ==
"dilation_simple")
244 applyDilationSimple_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
247 struct_size_in_datapoints_ = 0;
267 spectrum.
setType(SpectrumSettings::SpectrumType::PROFILE);
270 if (spectrum.size() <= 1)
276 if (param_.getValue(
"struc_elem_unit") ==
"Thomson")
278 const double struc_elem_length = (double)param_.getValue(
"struc_elem_length");
279 const double mz_diff = spectrum.back().getMZ() - spectrum.begin()->getMZ();
280 struct_size_in_datapoints_ = (
UInt)(ceil(struc_elem_length * (
double)(spectrum.size() - 1) / mz_diff));
284 struct_size_in_datapoints_ = (
UInt)(
double)param_.getValue(
"struc_elem_length");
287 if (!Math::isOdd(struct_size_in_datapoints_))
288 ++struct_size_in_datapoints_;
291 std::vector<Peak1D::IntensityType> output(spectrum.size());
292 filterRange(Internal::intensityIteratorWrapper(spectrum.begin()), Internal::intensityIteratorWrapper(spectrum.end()), output.begin());
295 for (
Size i = 0; i < spectrum.size(); ++i)
297 spectrum[i].setIntensity(output[i]);
309 startProgress(0, exp.
size(),
"filtering baseline");
310 for (
UInt i = 0; i < exp.
size(); ++i)
326 template<
typename InputIterator,
typename OutputIterator>
327 void applyErosion_(
Int struc_size, InputIterator input, InputIterator input_end, OutputIterator output)
329 typedef typename InputIterator::value_type ValueType;
330 const Int size = input_end - input;
331 const Int struc_size_half = struc_size / 2;
334 static thread_local std::vector<ValueType> buffer;
335 if (
Int(buffer.size()) < struc_size)
336 buffer.resize(struc_size);
345 if (size <= struc_size || size <= 5)
347 applyErosionSimple_(struc_size, input, input_end, output);
353 for (++ii; ii < struc_size_half; ++ii)
354 if (current > input[ii])
356 for (; ii < std::min(
Int(struc_size), size); ++ii, ++oi)
358 if (current > input[ii])
360 output[oi] = current;
365 for (anchor = struc_size; anchor <= size - struc_size; anchor += struc_size)
370 for (i = 1; i < struc_size; ++i, ++ii)
372 if (current > input[ii])
377 oi = ii + struc_size_half;
379 for (i = 1; i < struc_size; ++i, --ii, --oi)
381 if (current > input[ii])
383 output[oi] = std::min(buffer[struc_size - i], current);
385 if (current > input[ii])
387 output[oi] = current;
395 for (--ii; ii >= size - struc_size_half; --ii)
396 if (current > input[ii])
398 for (; ii >= std::max(size -
Int(struc_size), 0); --ii, --oi)
400 if (current > input[ii])
402 output[oi] = current;
404 anchor = size - struc_size;
408 for (i = 1; i < struc_size; ++i, ++ii)
410 if (current > input[ii])
415 oi = ii + struc_size_half;
417 for (i = 1; (ii >= 0) && (i < struc_size); ++i, --ii, --oi)
419 if (current > input[ii])
421 output[oi] = std::min(buffer[struc_size - i], current);
425 if (current > input[ii])
427 output[oi] = current;
437 template<
typename InputIterator,
typename OutputIterator>
438 void applyDilation_(
Int struc_size, InputIterator input, InputIterator input_end, OutputIterator output)
440 typedef typename InputIterator::value_type ValueType;
441 const Int size = input_end - input;
442 const Int struc_size_half = struc_size / 2;
445 static thread_local std::vector<ValueType> buffer;
446 if (
Int(buffer.size()) < struc_size)
447 buffer.resize(struc_size);
456 if (size <= struc_size || size <= 5)
458 applyDilationSimple_(struc_size, input, input_end, output);
464 for (++ii; ii < struc_size_half; ++ii)
465 if (current < input[ii])
467 for (; ii < std::min(
Int(struc_size), size); ++ii, ++oi)
469 if (current < input[ii])
471 output[oi] = current;
476 for (anchor = struc_size; anchor <= size - struc_size; anchor += struc_size)
481 for (i = 1; i < struc_size; ++i, ++ii)
483 if (current < input[ii])
488 oi = ii + struc_size_half;
490 for (i = 1; i < struc_size; ++i, --ii, --oi)
492 if (current < input[ii])
494 output[oi] = std::max(buffer[struc_size - i], current);
496 if (current < input[ii])
498 output[oi] = current;
506 for (--ii; ii >= size - struc_size_half; --ii)
507 if (current < input[ii])
509 for (; ii >= std::max(size -
Int(struc_size), 0); --ii, --oi)
511 if (current < input[ii])
513 output[oi] = current;
515 anchor = size - struc_size;
519 for (i = 1; i < struc_size; ++i, ++ii)
521 if (current < input[ii])
526 oi = ii + struc_size_half;
528 for (i = 1; (ii >= 0) && (i < struc_size); ++i, --ii, --oi)
530 if (current < input[ii])
532 output[oi] = std::max(buffer[struc_size - i], current);
536 if (current < input[ii])
538 output[oi] = current;
545 template<
typename InputIterator,
typename OutputIterator>
546 void applyErosionSimple_(
Int struc_size, InputIterator input_begin, InputIterator input_end, OutputIterator output_begin)
548 typedef typename InputIterator::value_type ValueType;
549 const int size = input_end - input_begin;
550 const Int struc_size_half = struc_size / 2;
551 for (
Int index = 0; index < size; ++index)
553 Int start = std::max(0, index - struc_size_half);
554 Int stop = std::min(size - 1, index + struc_size_half);
555 ValueType value = input_begin[start];
556 for (
Int i = start + 1; i <= stop; ++i)
557 if (value > input_begin[i])
558 value = input_begin[i];
559 output_begin[index] = value;
565 template<
typename InputIterator,
typename OutputIterator>
568 typedef typename InputIterator::value_type ValueType;
569 const int size = input_end - input_begin;
570 const Int struc_size_half = struc_size / 2;
571 for (
Int index = 0; index < size; ++index)
573 Int start = std::max(0, index - struc_size_half);
574 Int stop = std::min(size - 1, index + struc_size_half);
575 ValueType value = input_begin[start];
576 for (
Int i = start + 1; i <= stop; ++i)
577 if (value < input_begin[i])
578 value = input_begin[i];
579 output_begin[index] = value;
A base class for all classes handling default parameters.
Definition DefaultParamHandler.h:66
An iterator wrapper to access peak intensities instead of the peak itself.
Definition MorphologicalFilter.h:33
bool operator==(const IntensityIteratorWrapper &rhs) const
Definition MorphologicalFilter.h:74
IteratorT base
Definition MorphologicalFilter.h:85
std::forward_iterator_tag iterator_category
Definition MorphologicalFilter.h:35
bool operator!=(const IntensityIteratorWrapper &rhs) const
Definition MorphologicalFilter.h:79
IteratorT::difference_type difference_type
Definition MorphologicalFilter.h:39
IteratorT::value_type::IntensityType value_type
Definition MorphologicalFilter.h:36
IteratorT::value_type::IntensityType * pointer
Definition MorphologicalFilter.h:38
difference_type operator-(IntensityIteratorWrapper &rhs) const
Definition MorphologicalFilter.h:56
value_type operator*()
Definition MorphologicalFilter.h:45
IntensityIteratorWrapper & operator++()
Definition MorphologicalFilter.h:61
IntensityIteratorWrapper operator++(int)
Definition MorphologicalFilter.h:67
IteratorT::value_type::IntensityType & reference
Definition MorphologicalFilter.h:37
value_type operator[](const IndexT &index)
Definition MorphologicalFilter.h:51
IntensityIteratorWrapper(const IteratorT &rhs)
Definition MorphologicalFilter.h:41
In-Memory representation of a mass spectrometry run.
Definition MSExperiment.h:49
Size size() const noexcept
The number of spectra.
The representation of a 1D spectrum.
Definition MSSpectrum.h:45
This class implements baseline filtering operations using methods from mathematical morphology.
Definition MorphologicalFilter.h:136
void applyDilation_(Int struc_size, InputIterator input, InputIterator input_end, OutputIterator output)
Applies dilation. This implementation uses van Herk's method. Only 3 min/max comparisons are required...
Definition MorphologicalFilter.h:438
MorphologicalFilter(const MorphologicalFilter &source)
copy constructor not implemented
void filterRange(InputIterator input_begin, InputIterator input_end, OutputIterator output_begin)
Applies the morphological filtering operation to an iterator range.
Definition MorphologicalFilter.h:171
void filter(MSSpectrum &spectrum)
Applies the morphological filtering operation to an MSSpectrum.
Definition MorphologicalFilter.h:264
void filterExperiment(PeakMap &exp)
Applies the morphological filtering operation to an MSExperiment.
Definition MorphologicalFilter.h:307
UInt struct_size_in_datapoints_
Member for struct size in data points.
Definition MorphologicalFilter.h:320
MorphologicalFilter()
Constructor.
Definition MorphologicalFilter.h:139
void applyDilationSimple_(Int struc_size, InputIterator input_begin, InputIterator input_end, OutputIterator output_begin)
Applies dilation. Simple implementation, possibly faster if struc_size is very small,...
Definition MorphologicalFilter.h:566
void applyErosion_(Int struc_size, InputIterator input, InputIterator input_end, OutputIterator output)
Applies erosion. This implementation uses van Herk's method. Only 3 min/max comparisons are required ...
Definition MorphologicalFilter.h:327
void applyErosionSimple_(Int struc_size, InputIterator input_begin, InputIterator input_end, OutputIterator output_begin)
Applies erosion. Simple implementation, possibly faster if struc_size is very small,...
Definition MorphologicalFilter.h:546
~MorphologicalFilter() override
Destructor.
Definition MorphologicalFilter.h:155
Base class for all classes that want to report their progress.
Definition ProgressLogger.h:28
void setType(SpectrumType type)
sets the spectrum type
int Int
Signed integer type.
Definition Types.h:72
unsigned int UInt
Unsigned integer type.
Definition Types.h:64
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition Types.h:97
IntensityIteratorWrapper< IteratorT > intensityIteratorWrapper(const IteratorT &rhs)
make-function so that we need no write out all those type names to get the wrapped iterator.
Definition MorphologicalFilter.h:90
Main OpenMS namespace.
Definition openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19