36 #ifndef OPENMS_FILTERING_NOISEESTIMATION_SIGNALTONOISEESTIMATORMEDIAN_H
37 #define OPENMS_FILTERING_NOISEESTIMATION_SIGNALTONOISEESTIMATORMEDIAN_H
80 template <
typename Container = MSSpectrum<> >
106 this->
setName(
"SignalToNoiseEstimatorMedian");
108 defaults_.
setValue(
"max_intensity", -1,
"maximal intensity considered for histogram construction. By default, it will be calculated automatically (see auto_mode)." \
109 " Only provide this parameter if you know what you are doing (and change 'auto_mode' to '-1')!" \
110 " All intensities EQUAL/ABOVE 'max_intensity' will be added to the LAST histogram bin." \
111 " If you choose 'max_intensity' too small, the noise estimate might be too small as well. " \
112 " If chosen too big, the bins become quite large (which you could counter by increasing 'bin_count', which increases runtime)." \
113 " In general, the Median-S/N estimator is more robust to a manual max_intensity than the MeanIterative-S/N.", ListUtils::create<String>(
"advanced"));
116 defaults_.
setValue(
"auto_max_stdev_factor", 3.0,
"parameter for 'max_intensity' estimation (if 'auto_mode' == 0): mean + 'auto_max_stdev_factor' * stdev", ListUtils::create<String>(
"advanced"));
120 defaults_.
setValue(
"auto_max_percentile", 95,
"parameter for 'max_intensity' estimation (if 'auto_mode' == 1): auto_max_percentile th percentile", ListUtils::create<String>(
"advanced"));
124 defaults_.
setValue(
"auto_mode", 0,
"method to use to determine maximal intensity: -1 --> use 'max_intensity'; 0 --> 'auto_max_stdev_factor' method (default); 1 --> 'auto_max_percentile' method", ListUtils::create<String>(
"advanced"));
134 defaults_.
setValue(
"min_required_elements", 10,
"minimum number of elements required in a window (otherwise it is considered sparse)");
137 defaults_.
setValue(
"noise_for_empty_window", std::pow(10.0, 20),
"noise value used for sparse windows", ListUtils::create<String>(
"advanced"));
139 defaults_.
setValue(
"write_log_messages",
"true",
"Write out log messages in case of sparse windows or median in rightmost histogram bin");
158 if (&source ==
this)
return *
this;
192 void computeSTN_(
const PeakIterator & scan_first_,
const PeakIterator & scan_last_)
219 "auto_mode is on AUTOMAXBYPERCENT! auto_max_percentile is not in [0,100]. Use setAutoMaxPercentile(<value>) to change it!",
223 std::vector<int> histogram_auto(100, 0);
228 PeakIterator run = scan_first_;
229 while (run != scan_last_)
231 maxInt = std::max(maxInt, (*run).getIntensity());
236 double bin_size = maxInt / 100;
240 while (run != scan_last_)
242 ++histogram_auto[(int) (((*run).getIntensity() - 1) / bin_size)];
248 int elements_seen = 0;
252 while (run != scan_last_ && elements_seen < elements_below_percentile)
255 elements_seen += histogram_auto[i];
269 "auto_mode is on MANUAL! max_intensity is <=0. Needs to be positive! Use setMaxIntensity(<value>) or enable auto_mode!",
276 std::cerr <<
"TODO SignalToNoiseEstimatorMedian: the max_intensity_ value should be positive! " <<
max_intensity_ << std::endl;
280 PeakIterator window_pos_center = scan_first_;
281 PeakIterator window_pos_borderleft = scan_first_;
282 PeakIterator window_pos_borderright = scan_first_;
284 double window_half_size =
win_len_ / 2;
294 bin_value[bin] = (bin + 0.5) * bin_size;
302 int element_inc_count = 0;
305 int elements_in_window = 0;
307 int window_count = 0;
310 int element_in_window_half = 0;
315 int windows_overall = 0;
316 PeakIterator run = scan_first_;
317 while (run != scan_last_)
325 while (window_pos_center != scan_last_)
329 while ((*window_pos_borderleft).getMZ() < (*window_pos_center).getMZ() - window_half_size)
331 to_bin = std::max(std::min<int>((
int)((*window_pos_borderleft).getIntensity() / bin_size), bin_count_minus_1), 0);
333 --elements_in_window;
334 ++window_pos_borderleft;
338 while ((window_pos_borderright != scan_last_)
339 && ((*window_pos_borderright).getMZ() <= (*window_pos_center).getMZ() + window_half_size))
342 to_bin = std::max(std::min<int>((
int)((*window_pos_borderright).getIntensity() / bin_size), bin_count_minus_1), 0);
344 ++elements_in_window;
345 ++window_pos_borderright;
357 element_inc_count = 0;
358 element_in_window_half = (elements_in_window + 1) / 2;
359 while (median_bin < bin_count_minus_1 && element_inc_count < element_in_window_half)
362 element_inc_count += histogram[median_bin];
369 noise = std::max(1.0, bin_value[median_bin]);
373 stn_estimates_[*window_pos_center] = (*window_pos_center).getIntensity() / noise;
392 LOG_WARN <<
"WARNING in SignalToNoiseEstimatorMedian: "
394 <<
"% of all windows were sparse. You should consider increasing 'win_len' or decreasing 'min_required_elements'"
401 LOG_WARN <<
"WARNING in SignalToNoiseEstimatorMedian: "
403 <<
"% of all Signal-to-Noise estimates are too high, because the median was found in the rightmost histogram-bin. "
404 <<
"You should consider increasing 'max_intensity' (and maybe 'bin_count' with it, to keep bin width reasonable)"
456 #endif //OPENMS_FILTERING_NOISEESTIMATION_DSIGNALTONOISEESTIMATORMEDIAN_H
Param defaults_
Container for default parameters. This member should be filled in the constructor of derived classes!...
Definition: DefaultParamHandler.h:157
void setValue(const String &key, const DataValue &value, const String &description="", const StringList &tags=StringList())
Sets a value.
A more convenient string class.
Definition: String.h:57
Definition: SignalToNoiseEstimatorMedian.h:88
Param param_
Container for current parameters.
Definition: DefaultParamHandler.h:150
Definition: SignalToNoiseEstimatorMedian.h:88
SignalToNoiseEstimator & operator=(const SignalToNoiseEstimator &source)
Assignment operator.
Definition: SignalToNoiseEstimator.h:92
Container::const_iterator PeakIterator
Definition: SignalToNoiseEstimator.h:65
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:47
GaussianEstimate estimate_(const PeakIterator &scan_first_, const PeakIterator &scan_last_) const
calculate mean & stdev of intensities of a spectrum
Definition: SignalToNoiseEstimator.h:175
#define LOG_WARN
Macro if a warning, a piece of information which should be read by the user, should be logged...
Definition: LogStream.h:451
bool is_result_valid_
flag: set to true if SignalToNoise estimates are calculated and none of the params were changed...
Definition: SignalToNoiseEstimator.h:215
void setMaxInt(const String &key, Int max)
Sets the maximum value for the integer or integer list parameter key.
protected struct to store parameters my, sigma for a Gaussian distribution
Definition: SignalToNoiseEstimator.h:167
void endProgress() const
Ends the progress display.
const DataValue & getValue(const String &key) const
Returns a value of a parameter.
void setMaxFloat(const String &key, double max)
Sets the maximum value for the floating point or floating point list parameter key.
PeakIterator::value_type PeakType
Definition: SignalToNoiseEstimator.h:66
void setValidStrings(const String &key, const std::vector< String > &strings)
Sets the valid strings for the parameter key.
Invalid value exception.
Definition: Exception.h:336
void setMinInt(const String &key, Int min)
Sets the minimum value for the integer or integer list parameter key.
Definition: SignalToNoiseEstimatorMedian.h:88
This class represents the abstract base class of a signal to noise estimator.
Definition: SignalToNoiseEstimator.h:57
std::map< PeakType, double, typename PeakType::PositionLess > stn_estimates_
stores the noise estimate for each peak
Definition: SignalToNoiseEstimator.h:208
void startProgress(SignedSize begin, SignedSize end, const String &label) const
Initializes the progress display.
bool toBool() const
Conversion to bool.
void setProgress(SignedSize value) const
Sets the current progress.
IntensityThresholdCalculation
method to use for estimating the maximal intensity that is used for histogram calculation ...
Definition: SignalToNoiseEstimatorMedian.h:88
void setName(const String &name)
Mutable access to the name.
void setMinFloat(const String &key, double min)
Sets the minimum value for the floating point or floating point list parameter key.
void defaultsToParam_()
Updates the parameters after the defaults have been set in the constructor.