54 defaults_.setValue(
"rt_tolerance", 10.0,
"Maximal RT distance (in [s]) for two spectra's precursors.");
55 defaults_.setValue(
"mz_tolerance", 1.0,
"Maximal m/z distance (in Da) for two spectra's precursors.");
61 rt_max_ = (double) param_.getValue(
"rt_tolerance");
62 mz_max_ = (double) param_.getValue(
"mz_tolerance");
68 return 1 - ((d_rt / rt_max_ + d_mz / mz_max_) / 2);
75 double d_rt = fabs(first.
getRT() - second.
getRT());
76 double d_mz = fabs(first.
getMZ() - second.
getMZ());
78 if (d_rt > rt_max_ || d_mz > mz_max_)
84 double sim = getSimilarity(d_rt, d_mz);
101 typedef std::map<Size, std::vector<std::pair<Size, double> > >
AverageBlocks;
132 template <
typename MapType>
135 IntList ms_levels = param_.getValue(
"block_method:ms_levels");
137 if ((
Int)param_.getValue(
"block_method:rt_block_size") < 1)
139 throw Exception::InvalidParameter(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
"The parameter 'block_method:rt_block_size' must be greater than 0.");
142 UInt rt_block_size(param_.getValue(
"block_method:rt_block_size"));
143 double rt_max_length = (param_.getValue(
"block_method:rt_max_length"));
145 if (rt_max_length == 0)
147 rt_max_length = (std::numeric_limits<double>::max)();
150 for (IntList::iterator it_mslevel = ms_levels.begin(); it_mslevel < ms_levels.end(); ++it_mslevel)
154 UInt block_size_count(rt_block_size + 1);
155 Size idx_spectrum(0);
158 if (
Int(it1->getMSLevel()) == *it_mslevel)
161 if (++block_size_count >= rt_block_size ||
162 exp[idx_spectrum].getRT() - exp[idx_block].getRT() > rt_max_length)
164 block_size_count = 0;
165 idx_block = idx_spectrum;
169 spectra_to_merge[idx_block].push_back(idx_spectrum);
176 if (block_size_count == 0)
178 spectra_to_merge[idx_block] = std::vector<Size>();
182 mergeSpectra_(exp, spectra_to_merge, *it_mslevel);
189 template <
typename MapType>
195 std::vector<BinaryTreeNode> tree;
196 std::map<Size, Size> index_mapping;
199 std::vector<BaseFeature> data;
201 for (
Size i = 0; i < exp.
size(); ++i)
203 if (exp[i].getMSLevel() != 2)
209 index_mapping[data.size()] = i;
213 bf.
setRT(exp[i].getRT());
214 const auto& pcs = exp[i].getPrecursors();
222 OPENMS_LOG_WARN <<
"More than one precursor found. Using first one!" << std::endl;
224 bf.
setMZ(pcs[0].getMZ());
227 data_size = data.size();
241 std::vector<std::vector<Size> > clusters;
244 for (
Size ii = 0; ii < tree.size(); ++ii)
246 if (tree[ii].distance >= 1)
248 tree[ii].distance = -1;
250 if (tree[ii].distance != -1)
255 ca.
cut(data_size - node_count, tree, clusters);
260 for (
Size i_outer = 0; i_outer < clusters.size(); ++i_outer)
262 if (clusters[i_outer].size() <= 1)
267 Size cl_index0 = clusters[i_outer][0];
268 spectra_to_merge[index_mapping[cl_index0]] = std::vector<Size>();
270 for (
Size i_inner = 1; i_inner < clusters[i_outer].size(); ++i_inner)
272 spectra_to_merge[index_mapping[cl_index0]].push_back(index_mapping[clusters[i_outer][i_inner]]);
277 mergeSpectra_(exp, spectra_to_merge, 2);
292 if (mz1 == mz2 || tol_ppm <= 0)
298 const int max_iso_diff = 5;
299 const double max_charge_diff_ratio = 3.0;
301 for (
int c1 = min_c; c1 <= max_c; ++c1)
305 for (
int c2 = min_c; c2 <= max_c; ++c2)
307 if (c1 / c2 > max_charge_diff_ratio)
311 if (c2 / c1 > max_charge_diff_ratio)
318 if (fabs(mass1 - mass2) > max_iso_diff)
322 for (
int i = -max_iso_diff; i <= max_iso_diff; ++i)
341 template <
typename MapType>
347 ms_level = param_.getValue(
"average_gaussian:ms_level");
348 if (average_type ==
"tophat")
350 ms_level = param_.getValue(
"average_tophat:ms_level");
355 std::string spectrum_type = param_.getValue(
"average_gaussian:spectrum_type");
356 if (average_type ==
"tophat")
358 spectrum_type = std::string(param_.getValue(
"average_tophat:spectrum_type"));
362 double fwhm(param_.getValue(
"average_gaussian:rt_FWHM"));
363 double factor = -4 * log(2.0) / (fwhm * fwhm);
364 double cutoff(param_.getValue(
"average_gaussian:cutoff"));
365 double precursor_mass_ppm = param_.getValue(
"average_gaussian:precursor_mass_tol");
366 int precursor_max_charge = param_.getValue(
"average_gaussian:precursor_max_charge");
369 bool unit(param_.getValue(
"average_tophat:rt_unit") ==
"scans");
370 double range(param_.getValue(
"average_tophat:rt_range"));
371 double range_seconds = range / 2;
372 int range_scans =
static_cast<int>(range);
373 if ((range_scans % 2) == 0)
377 range_scans = (range_scans - 1) / 2;
386 if (
Int(it_rt->getMSLevel()) == ms_level)
397 terminate_now =
false;
398 while (it_rt_2 != exp.
end() && !terminate_now)
400 if (
Int(it_rt_2->getMSLevel()) == ms_level)
404 if (precursor_mass_ppm >= 0 && ms_level >= 2 && it_rt->getPrecursors().size() > 0 &&
405 it_rt_2->getPrecursors().size() > 0)
407 double mz1 = it_rt->getPrecursors()[0].getMZ();
408 double mz2 = it_rt_2->getPrecursors()[0].getMZ();
409 add = areMassesMatched(mz1, mz2, precursor_mass_ppm, precursor_max_charge);
415 if (average_type ==
"gaussian")
418 double base = it_rt_2->getRT() - it_rt->getRT();
419 weight = std::exp(factor * base * base);
421 std::pair<Size, double> p(m, weight);
422 spectra_to_average_over[n].push_back(p);
426 if (average_type ==
"gaussian")
429 double base = it_rt_2->getRT() - it_rt->getRT();
430 terminate_now = std::exp(factor * base * base) < cutoff;
435 terminate_now = (steps > range_scans);
440 terminate_now = (std::abs(it_rt_2->getRT() - it_rt->getRT()) > range_seconds);
450 terminate_now =
false;
451 while (it_rt_2 != exp.
begin() && !terminate_now)
453 if (
Int(it_rt_2->getMSLevel()) == ms_level)
457 if (precursor_mass_ppm >= 0 && ms_level >= 2 && it_rt->getPrecursors().size() > 0 &&
458 it_rt_2->getPrecursors().size() > 0)
460 double mz1 = it_rt->getPrecursors()[0].getMZ();
461 double mz2 = it_rt_2->getPrecursors()[0].getMZ();
462 add = areMassesMatched(mz1, mz2, precursor_mass_ppm, precursor_max_charge);
467 if (average_type ==
"gaussian")
469 double base = it_rt_2->getRT() - it_rt->getRT();
470 weight = std::exp(factor * base * base);
472 std::pair<Size, double> p(m, weight);
473 spectra_to_average_over[n].push_back(p);
477 if (average_type ==
"gaussian")
480 double base = it_rt_2->getRT() - it_rt->getRT();
481 terminate_now = std::exp(factor * base * base) < cutoff;
486 terminate_now = (steps > range_scans);
491 terminate_now = (std::abs(it_rt_2->getRT() - it_rt->getRT()) > range_seconds);
506 OPENMS_PRETTY_FUNCTION,
507 "Input mzML does not have any spectra of MS level specified by ms_level.");
511 for (AverageBlocks::iterator it = spectra_to_average_over.begin(); it != spectra_to_average_over.end(); ++it)
514 for (
const auto& weight: it->second)
516 sum += weight.second;
519 for (
auto& weight: it->second)
521 weight.second /=
sum;
527 if (spectrum_type ==
"automatic")
529 Size idx = spectra_to_average_over.begin()->first;
530 type = exp[idx].getType(
true);
532 else if (spectrum_type ==
"profile")
536 else if (spectrum_type ==
"centroid")
542 throw Exception::InvalidParameter(__FILE__,__LINE__,OPENMS_PRETTY_FUNCTION,
"Spectrum type has to be one of automatic, profile or centroid.");
548 averageCentroidSpectra_(exp, spectra_to_average_over, ms_level);
552 averageProfileSpectra_(exp, spectra_to_average_over, ms_level);
572 template <
typename MapType>
575 double mz_binning_width(param_.getValue(
"mz_binning_width"));
576 std::string mz_binning_unit(param_.getValue(
"mz_binning_width_unit"));
581 std::map<Size, Size> cluster_sizes;
582 std::set<Size> merged_indices;
587 p.
setValue(
"tolerance", mz_binning_width);
588 if (!(mz_binning_unit ==
"Da" || mz_binning_unit ==
"ppm"))
593 p.
setValue(
"is_relative_tolerance", mz_binning_unit ==
"Da" ?
"false" :
"true");
595 std::vector<std::pair<Size, Size> > alignment;
597 Size count_peaks_aligned(0);
598 Size count_peaks_overall(0);
601 for (
auto it = spectra_to_merge.begin(); it != spectra_to_merge.end(); ++it)
603 ++cluster_sizes[it->second.size() + 1];
608 merged_indices.insert(it->first);
610 double rt_average = consensus_spec.
getRT();
611 double precursor_mz_average = 0.0;
612 Size precursor_count(0);
615 precursor_mz_average = consensus_spec.
getPrecursors()[0].getMZ();
619 count_peaks_overall += consensus_spec.size();
624 for (
auto sit = it->second.begin(); sit != it->second.end(); ++sit)
626 consensus_spec.
unify(exp[*sit]);
627 merged_indices.insert(*sit);
629 rt_average += exp[*sit].getRT();
630 if (ms_level >= 2 && exp[*sit].getPrecursors().size() > 0)
632 precursor_mz_average += exp[*sit].getPrecursors()[0].getMZ();
637 consensus_native_id +=
",";
638 consensus_native_id += exp[*sit].getNativeID();
642 count_peaks_aligned += alignment.size();
643 count_peaks_overall += exp[*sit].
size();
646 Size spec_b_index(0);
649 Size spec_a = consensus_spec.size(), spec_b = exp[*sit].
size(), align_size = alignment.size();
650 for (
auto pit = exp[*sit].begin(); pit != exp[*sit].
end(); ++pit)
652 if (alignment.empty() || alignment[align_index].second != spec_b_index)
655 consensus_spec.push_back(*pit);
661 Size copy_of_align_index(align_index);
663 while (!alignment.empty() &&
664 copy_of_align_index < alignment.size() &&
665 alignment[copy_of_align_index].second == spec_b_index)
667 ++copy_of_align_index;
671 while (!alignment.empty() &&
672 align_index < alignment.size() &&
673 alignment[align_index].second == spec_b_index)
675 consensus_spec[alignment[align_index].first].setIntensity(consensus_spec[alignment[align_index].first].getIntensity() +
676 (pit->getIntensity() / (
double)counter));
678 if (align_index == alignment.size())
683 align_size = align_size + 1 - counter;
688 if (spec_a + spec_b - align_size != consensus_spec.size())
690 OPENMS_LOG_WARN <<
"wrong number of features after merge. Expected: " << spec_a + spec_b - align_size <<
" got: " << consensus_spec.size() <<
"\n";
693 rt_average /= it->second.size() + 1;
694 consensus_spec.
setRT(rt_average);
703 precursor_mz_average /= precursor_count;
707 pcs[0].setMZ(precursor_mz_average);
711 if (consensus_spec.empty())
717 merged_spectra.
addSpectrum(std::move(consensus_spec));
722 for (
const auto& cl_size : cluster_sizes)
724 OPENMS_LOG_INFO <<
" size " << cl_size.first <<
": " << cl_size.second <<
"x\n";
728 sprintf(buffer,
"%d/%d (%.2f %%) of blocked spectra", (
int)count_peaks_aligned,
729 (
int)count_peaks_overall,
float(count_peaks_aligned) /
float(count_peaks_overall) * 100.);
735 for (
Size i = 0; i < exp.
size(); ++i)
737 if (merged_indices.count(i) == 0)
747 std::make_move_iterator(exp_tmp.
end()));
751 std::make_move_iterator(merged_spectra.
end()));
775 template <
typename MapType>
780 double mz_binning_width(param_.getValue(
"mz_binning_width"));
781 std::string mz_binning_unit(param_.getValue(
"mz_binning_width_unit"));
783 unsigned progress = 0;
784 std::stringstream progress_message;
785 progress_message <<
"averaging profile spectra of MS level " << ms_level;
786 startProgress(0, spectra_to_average_over.size(), progress_message.str());
789 for (AverageBlocks::const_iterator it = spectra_to_average_over.begin(); it != spectra_to_average_over.end(); ++it)
791 setProgress(++progress);
794 std::vector<double> mz_positions_all;
795 for (
const auto& spec : it->second)
800 mz_positions_all.push_back(it_mz->getMZ());
804 sort(mz_positions_all.begin(), mz_positions_all.end());
806 std::vector<double> mz_positions;
807 std::vector<double> intensities;
808 double last_mz = std::numeric_limits<double>::min();
809 double delta_mz(mz_binning_width);
810 for (
const auto mz_pos : mz_positions_all)
812 if (mz_binning_unit ==
"ppm")
814 delta_mz = mz_binning_width * mz_pos / 1000000;
817 if ((mz_pos - last_mz) > delta_mz)
819 mz_positions.push_back(mz_pos);
820 intensities.push_back(0.0);
826 for (
const auto& spec : it->second)
832 for (
Size i = spline.
getPosMin(); i < mz_positions.size(); ++i)
836 intensities[i] += nav.
eval(mz_positions[i]) * (spec.second);
843 average_spec.
clear(
false);
846 for (
Size i = 0; i < mz_positions.size(); ++i)
849 peak.
setMZ(mz_positions[i]);
851 average_spec.push_back(peak);
862 for (AverageBlocks::const_iterator it = spectra_to_average_over.begin(); it != spectra_to_average_over.end(); ++it)
864 exp[it->first] = exp_tmp[n];
884 template <
typename MapType>
889 double mz_binning_width(param_.getValue(
"mz_binning_width"));
890 std::string mz_binning_unit(param_.getValue(
"mz_binning_width_unit"));
892 unsigned progress = 0;
894 std::stringstream progress_message;
895 progress_message <<
"averaging centroid spectra of MS level " << ms_level;
896 logger.
startProgress(0, spectra_to_average_over.size(), progress_message.str());
899 for (AverageBlocks::const_iterator it = spectra_to_average_over.begin(); it != spectra_to_average_over.end(); ++it)
905 std::vector<std::pair<double, double> > mz_intensity_all;
906 for (
const auto& weightedMZ: it->second)
911 std::pair<double, double> mz_intensity(it_mz->getMZ(), (it_mz->getIntensity() * weightedMZ.second));
912 mz_intensity_all.push_back(mz_intensity);
916 sort(mz_intensity_all.begin(), mz_intensity_all.end());
919 std::vector<double> mz_new;
920 std::vector<double> intensity_new;
921 double last_mz = std::numeric_limits<double>::min();
922 double delta_mz = mz_binning_width;
924 double sum_intensity(0);
926 for (
const auto& mz_pos : mz_intensity_all)
928 if (mz_binning_unit ==
"ppm")
930 delta_mz = mz_binning_width * (mz_pos.first) / 1000000;
933 if (((mz_pos.first - last_mz) > delta_mz) && (count > 0))
935 mz_new.push_back(sum_mz / count);
936 intensity_new.push_back(sum_intensity);
941 last_mz = mz_pos.first;
945 sum_mz += mz_pos.first;
946 sum_intensity += mz_pos.second;
951 mz_new.push_back(sum_mz / count);
952 intensity_new.push_back(sum_intensity);
957 average_spec.
clear(
false);
960 for (
Size i = 0; i < mz_new.size(); ++i)
963 peak.
setMZ(mz_new[i]);
965 average_spec.push_back(peak);
976 for (
const auto& spectral_index : spectra_to_average_over)
978 exp[spectral_index.first] = std::move(exp_tmp[n]);
#define OPENMS_LOG_WARN
Macro if a warning, a piece of information which should be read by the user, should be logged.
Definition: LogStream.h:444
#define OPENMS_LOG_INFO
Macro if a information, e.g. a status should be reported.
Definition: LogStream.h:449
A basic LC-MS feature.
Definition: BaseFeature.h:33
Bundles analyzing tools for a clustering (given as sequence of BinaryTreeNode's)
Definition: ClusterAnalyzer.h:26
void cut(const Size cluster_quantity, const std::vector< BinaryTreeNode > &tree, std::vector< std::vector< Size > > &clusters)
Hierarchical clustering with generic clustering functions.
Definition: ClusterHierarchical.h:37
void cluster(std::vector< Data > &data, const SimilarityComparator &comparator, const ClusterFunctor &clusterer, std::vector< BinaryTreeNode > &cluster_tree, DistanceMatrix< float > &original_distance)
Clustering function.
Definition: ClusterHierarchical.h:84
A base class for all classes handling default parameters.
Definition: DefaultParamHandler.h:66
void setParameters(const Param ¶m)
Sets the parameters.
A two-dimensional distance matrix, similar to OpenMS::Matrix.
Definition: DistanceMatrix.h:42
Illegal self operation exception.
Definition: Exception.h:345
Exception indicating that an invalid parameter was handed over to an algorithm.
Definition: Exception.h:316
In-Memory representation of a mass spectrometry run.
Definition: MSExperiment.h:45
void addSpectrum(const MSSpectrum &spectrum)
adds a spectrum to the list
Iterator begin() noexcept
Definition: MSExperiment.h:155
Size size() const noexcept
The number of spectra.
Definition: MSExperiment.h:120
const std::vector< MSSpectrum > & getSpectra() const
returns the spectrum list
Iterator end()
Definition: MSExperiment.h:170
void sortSpectra(bool sort_mz=true)
Sorts the data points by retention time.
Base::const_iterator const_iterator
Definition: MSExperiment.h:90
std::vector< SpectrumType >::const_iterator ConstIterator
Non-mutable iterator.
Definition: MSExperiment.h:78
void clear(bool clear_meta_data)
Clears all data and meta data.
The representation of a 1D spectrum.
Definition: MSSpectrum.h:44
void setMSLevel(UInt ms_level)
Sets the MS level.
void sortByPosition()
Lexicographically sorts the peaks by their position.
void clear(bool clear_meta_data)
Clears all data and meta data.
void setRT(double rt)
Sets the absolute retention time (in seconds)
Management and storage of parameters / INI files.
Definition: Param.h:44
void setValue(const std::string &key, const ParamValue &value, const std::string &description="", const std::vector< std::string > &tags=std::vector< std::string >())
Sets a value.
A 1-dimensional raw data point or peak.
Definition: Peak1D.h:28
void setIntensity(IntensityType intensity)
Mutable access to the data point intensity (height)
Definition: Peak1D.h:84
void setMZ(CoordinateType mz)
Mutable access to m/z.
Definition: Peak1D.h:93
CoordinateType getMZ() const
Returns the m/z coordinate (index 1)
Definition: Peak2D.h:172
void setMZ(CoordinateType coordinate)
Mutable access to the m/z coordinate (index 1)
Definition: Peak2D.h:178
void setRT(CoordinateType coordinate)
Mutable access to the RT coordinate (index 0)
Definition: Peak2D.h:190
CoordinateType getRT() const
Returns the RT coordinate (index 0)
Definition: Peak2D.h:184
Base class for all classes that want to report their progress.
Definition: ProgressLogger.h:27
void setProgress(SignedSize value) const
Sets the current progress.
void startProgress(SignedSize begin, SignedSize end, const String &label) const
Initializes the progress display.
void endProgress(UInt64 bytes_processed=0) const
SingleLinkage ClusterMethod.
Definition: SingleLinkage.h:31
Definition: SpectraMerger.h:49
double getSimilarity(const double d_rt, const double d_mz) const
Definition: SpectraMerger.h:65
SpectraDistance_()
Definition: SpectraMerger.h:51
double operator()(const BaseFeature &first, const BaseFeature &second) const
Definition: SpectraMerger.h:72
double mz_max_
Definition: SpectraMerger.h:91
void updateMembers_() override
This method is used to update extra member variables at the end of the setParameters() method.
Definition: SpectraMerger.h:59
double rt_max_
Definition: SpectraMerger.h:90
Merges blocks of MS or MS2 spectra.
Definition: SpectraMerger.h:36
void average(MapType &exp, const String &average_type, int ms_level=-1)
average over neighbouring spectra
Definition: SpectraMerger.h:342
static bool areMassesMatched(double mz1, double mz2, double tol_ppm, int max_c)
check if the first and second mzs might be from the same mass
Definition: SpectraMerger.h:290
void averageCentroidSpectra_(MapType &exp, const AverageBlocks &spectra_to_average_over, const UInt ms_level)
average spectra (centroid mode)
Definition: SpectraMerger.h:885
SpectraMerger(const SpectraMerger &source)
copy constructor
SpectraMerger()
default constructor
std::map< Size, std::vector< std::pair< Size, double > > > AverageBlocks
blocks of spectra (master-spectrum index to update to spectra to average over)
Definition: SpectraMerger.h:101
~SpectraMerger() override
destructor
void mergeSpectraPrecursors(MapType &exp)
merges spectra with similar precursors (must have MS2 level)
Definition: SpectraMerger.h:190
SpectraMerger & operator=(SpectraMerger &&source)=default
move-assignment operator
void averageProfileSpectra_(MapType &exp, const AverageBlocks &spectra_to_average_over, const UInt ms_level)
average spectra (profile mode)
Definition: SpectraMerger.h:776
SpectraMerger & operator=(const SpectraMerger &source)
assignment operator
void mergeSpectra_(MapType &exp, const MergeBlocks &spectra_to_merge, const UInt ms_level)
merges blocks of spectra of a certain level
Definition: SpectraMerger.h:573
std::map< Size, std::vector< Size > > MergeBlocks
blocks of spectra (master-spectrum index to sacrifice-spectra(the ones being merged into the master-s...
Definition: SpectraMerger.h:98
SpectraMerger(SpectraMerger &&source)=default
move constructor
void mergeSpectraBlockWise(MapType &exp)
Definition: SpectraMerger.h:133
Aligns the peaks of two sorted spectra Method 1: Using a banded (width via 'tolerance' parameter) ali...
Definition: SpectrumAlignment.h:43
void getSpectrumAlignment(std::vector< std::pair< Size, Size > > &alignment, const SpectrumType1 &s1, const SpectrumType2 &s2) const
Definition: SpectrumAlignment.h:62
void unify(const SpectrumSettings &rhs)
merge another spectrum setting into this one (data is usually appended, except for spectrum type whic...
SpectrumType
Spectrum peak type.
Definition: SpectrumSettings.h:45
@ PROFILE
profile data
Definition: SpectrumSettings.h:48
@ CENTROID
centroid data or stick data
Definition: SpectrumSettings.h:47
const std::vector< Precursor > & getPrecursors() const
returns a const reference to the precursors
void setPrecursors(const std::vector< Precursor > &precursors)
sets the precursors
const String & getNativeID() const
returns the native identifier for the spectrum, used by the acquisition software.
void setNativeID(const String &native_id)
sets the native identifier for the spectrum, used by the acquisition software.
iterator class for access of spline packages
Definition: SplineInterpolatedPeaks.h:84
double eval(double pos)
returns spline interpolated intensity at this position (fast access since we can start search from la...
Data structure for spline interpolation of MS1 spectra and chromatograms.
Definition: SplineInterpolatedPeaks.h:34
SplineInterpolatedPeaks::Navigator getNavigator(double scaling=0.7)
returns an iterator for access of spline packages
double getPosMax() const
returns the maximum m/z (or RT) of the spectrum
double getPosMin() const
returns the minimum m/z (or RT) of the spectrum
A more convenient string class.
Definition: String.h:34
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
std::vector< Int > IntList
Vector of signed integers.
Definition: ListUtils.h:29
static double sum(IteratorType begin, IteratorType end)
Calculates the sum of a range of values.
Definition: StatisticFunctions.h:81
const double ISOTOPE_MASSDIFF_55K_U
Definition: Constants.h:100
const double PROTON_MASS_U
Definition: Constants.h:90
Main OpenMS namespace.
Definition: openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19