40 explicit LinearResampling(
double spacing,
bool ppm =
false): spacing_(spacing), ppm_(ppm)
48 template<
class PeakContainerT>
49 void raster(PeakContainerT& container)
52 if (container.empty())
return;
54 auto first = container.begin();
55 auto last = container.end();
57 double end_pos = (last - 1)->getPos();
58 double start_pos =
first->getPos();
59 int number_resampled_points = (int)(ceil((end_pos - start_pos) / spacing_ + 1));
61 std::vector<typename PeakContainerT::PeakType> resampled_peak_container;
62 populateRaster(resampled_peak_container, start_pos, end_pos, number_resampled_points);
64 raster(container.begin(), container.end(), resampled_peak_container.begin(), resampled_peak_container.end());
66 container.swap(resampled_peak_container);
79 template<
typename PeakTypeIterator,
typename ConstPeakTypeIterator>
80 void raster(ConstPeakTypeIterator raw_it, ConstPeakTypeIterator raw_end, PeakTypeIterator resampled_begin, PeakTypeIterator resampled_end)
82 OPENMS_PRECONDITION(resampled_begin != resampled_end,
"Output iterators cannot be identical")
85 verifySpacing(raw_it, raw_end, [](
auto x) {
return x->getPos(); });
87 PeakTypeIterator resample_start = resampled_begin;
90 while (raw_it != raw_end && raw_it->getPos() < resampled_begin->getPos())
92 resampled_begin->setIntensity(resampled_begin->getIntensity() + raw_it->getIntensity());
96 while (raw_it != raw_end)
99 while (resampled_begin != resampled_end && resampled_begin->getPos() < raw_it->getPos())
103 if (resampled_begin != resample_start) { resampled_begin--; }
106 if ((resampled_begin + 1) == resampled_end) {
break; }
108 double dist_left = fabs(raw_it->getPos() - resampled_begin->getPos());
109 double dist_right = fabs(raw_it->getPos() - (resampled_begin + 1)->getPos());
112 resampled_begin->setIntensity(resampled_begin->getIntensity() + raw_it->getIntensity() * dist_right / (dist_left + dist_right));
113 (resampled_begin + 1)->setIntensity((resampled_begin + 1)->getIntensity() + raw_it->getIntensity() * dist_left / (dist_left + dist_right));
119 while (raw_it != raw_end)
121 resampled_begin->setIntensity(resampled_begin->getIntensity() + raw_it->getIntensity());
133 template<
typename PeakType>
134 void populateRaster(std::vector<PeakType>& resampled_peak_container,
double start_pos,
double end_pos,
int number_resampled_points)
139 resampled_peak_container.resize(number_resampled_points);
140 typename std::vector<PeakType>::iterator it = resampled_peak_container.begin();
141 for (
int i = 0; i < number_resampled_points; ++i)
143 it->setPos(start_pos + i * spacing_);
150 double current_mz = start_pos;
151 while (current_mz < end_pos)
155 p.setPos(current_mz);
156 resampled_peak_container.push_back(p);
159 current_mz += current_mz * (spacing_ / 1e6);
170 template<
typename PeakTypeIterator>
176 if (it == end || std::next(it) == end)
return;
177 double min_dist = std::numeric_limits<double>::infinity();
178 double current_dist {};
180 while (std::next(it) != end)
182 current_dist = (access(std::next(it)) - access(it));
183 if (min_dist > current_dist) min_dist = current_dist;
189 OPENMS_LOG_WARN <<
"Resampling spacing (" << spacing_ <<
") is smaller than the smallest distance between data points (" << min_dist
190 <<
"). This approximates the detector dead time and may produce spurious peaks.\n";
#define OPENMS_LOG_WARN
Macro for warnings.
Definition LogStream.h:608
Shared linear resampling implementation without parameter or progress handling.
Definition LinearResampling.h:33
void verifySpacing(PeakTypeIterator it, PeakTypeIterator end, auto access)
Emit the existing spacing warning for absolute grids when enabled.
Definition LinearResampling.h:171
void populateRaster(std::vector< PeakType > &resampled_peak_container, double start_pos, double end_pos, int number_resampled_points)
Populate an absolute or ppm grid using the existing endpoint convention.
Definition LinearResampling.h:134
void raster(ConstPeakTypeIterator raw_it, ConstPeakTypeIterator raw_end, PeakTypeIterator resampled_begin, PeakTypeIterator resampled_end)
Distribute input intensities onto an existing output grid.
Definition LinearResampling.h:80
double spacing_
Definition LinearResampling.h:195
void raster(PeakContainerT &container)
Resample a peak container onto a grid spanning its first and last points.
Definition LinearResampling.h:49
bool ppm_
Definition LinearResampling.h:196
LinearResampling(double spacing, bool ppm=false)
Construct a resampler with explicit spacing and units.
Definition LinearResampling.h:40
A 2-dimensional raw data point or peak.
Definition Peak2D.h:30
void setIntensity(IntensityType intensity)
Sets data point intensity (height)
Definition Peak2D.h:149
OpenMS looks in the< code > OPENMS_THERMO_MANAGED_DIR</code > environment variable first
Definition common-cmake-parameters.doxygen:179
#define OPENMS_PRECONDITION(condition, message)
Precondition macro.
Definition openms/include/OpenMS/CONCEPT/Macros.h:91
Main OpenMS namespace.
Definition openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19
std::atomic< bool > suppress_resampling_spacing_warning
Shared process-wide flag controlling resampling-spacing warnings.