35 #ifndef OPENMS_FILTERING_BASELINE_MORPHOLOGICALFILTER_H 36 #define OPENMS_FILTERING_BASELINE_MORPHOLOGICALFILTER_H 58 template <
typename IteratorT>
60 public std::iterator<std::forward_iterator_tag, typename IteratorT::value_type::IntensityType>
63 typedef typename IteratorT::value_type::IntensityType
value_type;
64 typedef typename IteratorT::value_type::IntensityType &
reference;
65 typedef typename IteratorT::value_type::IntensityType *
pointer;
75 return base->getIntensity();
78 template <
typename IndexT>
81 return base[index].getIntensity();
97 IteratorT tmp = *
this;
117 template <
typename IteratorT>
170 struct_size_in_datapoints_(0)
173 defaults_.setValue(
"struc_elem_length", 3.0,
"Length of the structuring element. This should be wider than the expected peak width.");
174 defaults_.setValue(
"struc_elem_unit",
"Thomson",
"The unit of the 'struct_elem_length'.");
175 defaults_.setValidStrings(
"struc_elem_unit", ListUtils::create<String>(
"Thomson,DataPoints"));
177 defaults_.setValue(
"method",
"tophat",
"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 documentation of MorpthologicalFilter.");
178 defaults_.setValidStrings(
"method", ListUtils::create<String>(
"identity,erosion,dilation,opening,closing,gradient,tophat,bothat,erosion_simple,dilation_simple"));
199 template <
typename InputIterator,
typename OutputIterator>
200 void filterRange(InputIterator input_begin, InputIterator input_end, OutputIterator output_begin)
203 static std::vector<typename InputIterator::value_type> buffer;
204 const UInt size = input_end - input_begin;
207 if (struct_size_in_datapoints_ == 0)
209 struct_size_in_datapoints_ = (
UInt)(
double)param_.getValue(
"struc_elem_length");
213 String method = param_.getValue(
"method");
214 if (method ==
"identity")
216 std::copy(input_begin, input_end, output_begin);
218 else if (method ==
"erosion")
220 applyErosion_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
222 else if (method ==
"dilation")
224 applyDilation_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
226 else if (method ==
"opening")
228 if (buffer.size() < size) buffer.resize(size);
229 applyErosion_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
230 applyDilation_(struct_size_in_datapoints_, buffer.begin(), buffer.begin() + size, output_begin);
232 else if (method ==
"closing")
234 if (buffer.size() < size) buffer.resize(size);
235 applyDilation_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
236 applyErosion_(struct_size_in_datapoints_, buffer.begin(), buffer.begin() + size, output_begin);
238 else if (method ==
"gradient")
240 if (buffer.size() < size) buffer.resize(size);
241 applyErosion_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
242 applyDilation_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
243 for (
UInt i = 0; i < size; ++i) output_begin[i] -= buffer[i];
245 else if (method ==
"tophat")
247 if (buffer.size() < size) buffer.resize(size);
248 applyErosion_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
249 applyDilation_(struct_size_in_datapoints_, buffer.begin(), buffer.begin() + size, output_begin);
250 for (
UInt i = 0; i < size; ++i) output_begin[i] = input_begin[i] - output_begin[i];
252 else if (method ==
"bothat")
254 if (buffer.size() < size) buffer.resize(size);
255 applyDilation_(struct_size_in_datapoints_, input_begin, input_end, buffer.begin());
256 applyErosion_(struct_size_in_datapoints_, buffer.begin(), buffer.begin() + size, output_begin);
257 for (
UInt i = 0; i < size; ++i) output_begin[i] = input_begin[i] - output_begin[i];
259 else if (method ==
"erosion_simple")
261 applyErosionSimple_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
263 else if (method ==
"dilation_simple")
265 applyDilationSimple_(struct_size_in_datapoints_, input_begin, input_end, output_begin);
268 struct_size_in_datapoints_ = 0;
285 template <
typename PeakType>
292 if (spectrum.size() <= 1)
return;
295 if ((
String)(param_.getValue(
"struc_elem_unit")) ==
"Thomson")
297 struct_size_in_datapoints_ =
300 (
double)(param_.getValue(
"struc_elem_length"))
302 double(spectrum.size() - 1)
304 (spectrum.back().getMZ() - spectrum.begin()->getMZ())
310 struct_size_in_datapoints_ = (
UInt)(
double)param_.getValue(
"struc_elem_length");
313 if (!
Math::isOdd(struct_size_in_datapoints_)) ++struct_size_in_datapoints_;
316 std::vector<typename PeakType::IntensityType> output(spectrum.size());
323 for (
Size i = 0; i < spectrum.size(); ++i)
325 spectrum[i].setIntensity(output[i]);
335 template <
typename PeakType>
338 startProgress(0, exp.
size(),
"filtering baseline");
339 for (
UInt i = 0; i < exp.
size(); ++i)
356 template <
typename InputIterator,
typename OutputIterator>
357 void applyErosion_(
Int struc_size, InputIterator input, InputIterator input_end, OutputIterator output)
359 typedef typename InputIterator::value_type ValueType;
360 const Int size = input_end - input;
361 const Int struc_size_half = struc_size / 2;
363 static std::vector<ValueType> buffer;
364 if (
Int(buffer.size()) < struc_size) buffer.resize(struc_size);
373 if (size <= struc_size || size <= 5)
375 applyErosionSimple_(struc_size, input, input_end, output);
381 for (++ii; ii < struc_size_half; ++ii) if (current > input[ii]) current = input[ii];
382 for (; ii < std::min(
Int(struc_size), size); ++ii, ++oi)
384 if (current > input[ii]) current = input[ii];
385 output[oi] = current;
390 for (anchor = struc_size;
391 anchor <= size - struc_size;
398 for (i = 1; i < struc_size; ++i, ++ii)
400 if (current > input[ii]) current = input[ii];
404 oi = ii + struc_size_half;
406 for (i = 1; i < struc_size; ++i, --ii, --oi)
408 if (current > input[ii]) current = input[ii];
409 output[oi] = std::min(buffer[struc_size - i], current);
411 if (current > input[ii]) current = input[ii];
412 output[oi] = current;
420 for (--ii; ii >= size - struc_size_half; --ii)
if (current > input[ii]) current = input[ii];
421 for (; ii >= std::max(size -
Int(struc_size), 0); --ii, --oi)
423 if (current > input[ii]) current = input[ii];
424 output[oi] = current;
426 anchor = size - struc_size;
430 for (i = 1; i < struc_size; ++i, ++ii)
432 if (current > input[ii]) current = input[ii];
436 oi = ii + struc_size_half;
438 for (i = 1; (ii >= 0) && (i < struc_size); ++i, --ii, --oi)
440 if (current > input[ii]) current = input[ii];
441 output[oi] = std::min(buffer[struc_size - i], current);
445 if (current > input[ii]) current = input[ii];
446 output[oi] = current;
456 template <
typename InputIterator,
typename OutputIterator>
457 void applyDilation_(
Int struc_size, InputIterator input, InputIterator input_end, OutputIterator output)
459 typedef typename InputIterator::value_type ValueType;
460 const Int size = input_end - input;
461 const Int struc_size_half = struc_size / 2;
463 static std::vector<ValueType> buffer;
464 if (
Int(buffer.size()) < struc_size) buffer.resize(struc_size);
473 if (size <= struc_size || size <= 5)
475 applyDilationSimple_(struc_size, input, input_end, output);
481 for (++ii; ii < struc_size_half; ++ii)
if (current < input[ii]) current = input[ii];
482 for (; ii < std::min(
Int(struc_size), size); ++ii, ++oi)
484 if (current < input[ii]) current = input[ii];
485 output[oi] = current;
490 for (anchor = struc_size;
491 anchor <= size - struc_size;
498 for (i = 1; i < struc_size; ++i, ++ii)
500 if (current < input[ii]) current = input[ii];
504 oi = ii + struc_size_half;
506 for (i = 1; i < struc_size; ++i, --ii, --oi)
508 if (current < input[ii]) current = input[ii];
509 output[oi] = std::max(buffer[struc_size - i], current);
511 if (current < input[ii]) current = input[ii];
512 output[oi] = current;
520 for (--ii; ii >= size - struc_size_half; --ii)
if (current < input[ii]) current = input[ii];
521 for (; ii >= std::max(size -
Int(struc_size), 0); --ii, --oi)
523 if (current < input[ii]) current = input[ii];
524 output[oi] = current;
526 anchor = size - struc_size;
530 for (i = 1; i < struc_size; ++i, ++ii)
532 if (current < input[ii]) current = input[ii];
536 oi = ii + struc_size_half;
538 for (i = 1; (ii >= 0) && (i < struc_size); ++i, --ii, --oi)
540 if (current < input[ii]) current = input[ii];
541 output[oi] = std::max(buffer[struc_size - i], current);
545 if (current < input[ii]) current = input[ii];
546 output[oi] = current;
553 template <
typename InputIterator,
typename OutputIterator>
554 void applyErosionSimple_(
Int struc_size, InputIterator input_begin, InputIterator input_end, OutputIterator output_begin)
556 typedef typename InputIterator::value_type ValueType;
557 const int size = input_end - input_begin;
558 const Int struc_size_half = struc_size / 2;
559 for (
Int index = 0; index < size; ++index)
561 Int start = std::max(0, index - struc_size_half);
562 Int stop = std::min(size - 1, index + struc_size_half);
563 ValueType value = input_begin[start];
564 for (
Int i = start + 1; i <= stop; ++i) if (value > input_begin[i]) value = input_begin[i];
565 output_begin[index] = value;
571 template <
typename InputIterator,
typename OutputIterator>
574 typedef typename InputIterator::value_type ValueType;
575 const int size = input_end - input_begin;
576 const Int struc_size_half = struc_size / 2;
577 for (
Int index = 0; index < size; ++index)
579 Int start = std::max(0, index - struc_size_half);
580 Int stop = std::min(size - 1, index + struc_size_half);
581 ValueType value = input_begin[start];
582 for (
Int i = start + 1; i <= stop; ++i)
if (value < input_begin[i]) value = input_begin[i];
583 output_begin[index] = value;
UInt struct_size_in_datapoints_
Member for struct size in data points.
Definition: MorphologicalFilter.h:350
This class implements baseline filtering operations using methods from mathematical morphology...
Definition: MorphologicalFilter.h:160
bool isOdd(UInt x)
Returns true if the given integer is odd.
Definition: MathFunctions.h:126
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:118
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:457
IntensityIteratorWrapper(const IteratorT &rhs)
Definition: MorphologicalFilter.h:68
An iterator wrapper to access peak intensities instead of the peak itself.
Definition: MorphologicalFilter.h:59
value_type operator[](const IndexT &index)
Definition: MorphologicalFilter.h:79
A more convenient string class.
Definition: String.h:57
IteratorT::difference_type difference_type
Definition: MorphologicalFilter.h:66
Size size() const
Definition: MSExperiment.h:117
bool operator==(const IntensityIteratorWrapper &rhs) const
Definition: MorphologicalFilter.h:102
MorphologicalFilter()
Constructor.
Definition: MorphologicalFilter.h:167
void filterRange(InputIterator input_begin, InputIterator input_end, OutputIterator output_begin)
Applies the morphological filtering operation to an iterator range.
Definition: MorphologicalFilter.h:200
IntensityIteratorWrapper & operator++()
Definition: MorphologicalFilter.h:89
IteratorT base
Definition: MorphologicalFilter.h:113
unsigned int UInt
Unsigned integer type.
Definition: Types.h:88
virtual ~MorphologicalFilter()
Destructor.
Definition: MorphologicalFilter.h:184
bool operator!=(const IntensityIteratorWrapper &rhs) const
Definition: MorphologicalFilter.h:107
Raw data (also called profile data)
Definition: SpectrumSettings.h:75
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:47
void filter(MSSpectrum< PeakType > &spectrum)
Applies the morphological filtering operation to an MSSpectrum.
Definition: MorphologicalFilter.h:286
void filterExperiment(MSExperiment< PeakType > &exp)
Applies the morphological filtering operation to an MSExperiment.
Definition: MorphologicalFilter.h:336
difference_type operator-(IntensityIteratorWrapper &rhs) const
Definition: MorphologicalFilter.h:84
In-Memory representation of a mass spectrometry experiment.
Definition: MSExperiment.h:69
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, and used in some special cases.
Definition: MorphologicalFilter.h:572
void setType(SpectrumType type)
sets the spectrum type
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:357
Base class for all classes that want to report their progress.
Definition: ProgressLogger.h:55
IteratorT::value_type::IntensityType & reference
Definition: MorphologicalFilter.h:64
A base class for all classes handling default parameters.
Definition: DefaultParamHandler.h:92
IteratorT::value_type::IntensityType * pointer
Definition: MorphologicalFilter.h:65
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, and used in some special cases.
Definition: MorphologicalFilter.h:554
int Int
Signed integer type.
Definition: Types.h:96
IteratorT::value_type::IntensityType value_type
Definition: MorphologicalFilter.h:63
IntensityIteratorWrapper operator++(int)
Definition: MorphologicalFilter.h:95
value_type operator*()
Definition: MorphologicalFilter.h:73