52 lines
2.0 KiB
C++
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);
|
|
}
|