Files
Jungfraujoch/image_analysis/AzimuthalIntegrationCPU.cpp
2025-03-24 12:16:33 +01:00

52 lines
2.0 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include "AzimuthalIntegrationCPU.h"
namespace {
template<class T>
void AzimuthalIntegrationCPU(const AzimuthalIntegration &azint,
AzimuthalIntegrationProfile &ret,
const T *data,
T special_value_1,
T special_value_2) {
auto &pixel_to_bin = azint.GetPixelToBin();
auto &corrections = azint.Corrections();
auto nbins = azint.GetBinNumber();
std::vector<float> sum(nbins);
std::vector<float> sum2(nbins);
std::vector<uint32_t> count(nbins);
for (int i = 0; i < pixel_to_bin.size(); i++) {
auto bin = pixel_to_bin[i];
auto value = data[i] * corrections[i];
if ((data[i] != special_value_1)
&& (data[i] != special_value_2)
&& (bin < nbins)) {
sum[bin] += value;
// sum2[bin] += value * value;
count[bin] += 1;
}
}
ret.Add(sum, count);
}
}
void AzimuthalIntegrationCPU(const AzimuthalIntegration &azint, AzimuthalIntegrationProfile& result, const int32_t *data) {
return AzimuthalIntegrationCPU<int32_t>(azint, result, data, INT32_MIN, INT32_MAX);
}
void AzimuthalIntegrationCPU(const AzimuthalIntegration &azint, AzimuthalIntegrationProfile& result, const uint32_t *data) {
return AzimuthalIntegrationCPU<uint32_t>(azint, result, data, UINT32_MAX, UINT32_MAX);
}
void AzimuthalIntegrationCPU(const AzimuthalIntegration &azint, AzimuthalIntegrationProfile& result, const uint16_t *data) {
return AzimuthalIntegrationCPU<uint16_t>(azint,result, data, UINT16_MAX, UINT16_MAX);
}
void AzimuthalIntegrationCPU(const AzimuthalIntegration &azint, AzimuthalIntegrationProfile& result, const int16_t *data) {
return AzimuthalIntegrationCPU<int16_t>(azint,result, data, INT16_MIN, INT16_MAX);
}