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_)
218 OPENMS_PRETTY_FUNCTION,
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];
268 OPENMS_PRETTY_FUNCTION,
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
Param param_
Container for current parameters.
Definition: DefaultParamHandler.h:150
void endProgress() const
Ends the progress display.
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
bool toBool() const
Conversion to bool.
#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.
GaussianEstimate estimate_(const PeakIterator &scan_first_, const PeakIterator &scan_last_) const
calculate mean & stdev of intensities of a spectrum
Definition: SignalToNoiseEstimator.h:175
protected struct to store parameters my, sigma for a Gaussian distribution
Definition: SignalToNoiseEstimator.h:167
const DataValue & getValue(const String &key) const
Returns a value of a parameter.
void setProgress(SignedSize value) const
Sets the current progress.
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.
void startProgress(SignedSize begin, SignedSize end, const String &label) const
Initializes the progress display.
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 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.