RadialIntegration: Remove pixel split

This commit is contained in:
2023-10-21 16:18:41 +02:00
parent 19644a1f5f
commit a7706546b7
6 changed files with 19 additions and 91 deletions
+15 -38
View File
@@ -3,19 +3,10 @@
#include "RadialIntegration.h"
#include "../common/JFJochException.h"
RadialIntegration::RadialIntegration(const std::vector<uint16_t>& in_mapping, uint32_t in_nbins, uint32_t in_pixel_split) :
pixel_to_bin(in_mapping), nbins(in_nbins), sum(in_nbins, 0), count(in_nbins, 0),
pixel_split(in_pixel_split)
RadialIntegration::RadialIntegration(const std::vector<uint16_t>& in_mapping, uint32_t in_nbins) :
pixel_to_bin(in_mapping), nbins(in_nbins), sum(in_nbins, 0), count(in_nbins, 0)
{
if (pixel_split == 4) {
if (pixel_to_bin.size() % 4 != 0)
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"With pixel split of 4 input array must be of size multiple of 4");
} else if (pixel_split != 1)
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"Only pixel split of 1 and 4 allowed at the moment for radial integration");
coeff = (float *) std::aligned_alloc(64, in_mapping.size() * sizeof(float));
if (coeff == nullptr)
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
@@ -25,8 +16,8 @@ RadialIntegration::RadialIntegration(const std::vector<uint16_t>& in_mapping, ui
coeff[i] = 1.0f;
}
RadialIntegration::RadialIntegration(const RadialIntegrationMapping &mapping, uint32_t in_pixel_split) :
RadialIntegration(mapping.GetPixelToBinMapping(), mapping.GetBinNumber(), in_pixel_split)
RadialIntegration::RadialIntegration(const RadialIntegrationMapping &mapping) :
RadialIntegration(mapping.GetPixelToBinMapping(), mapping.GetBinNumber())
{}
RadialIntegration::~RadialIntegration() {
@@ -34,10 +25,10 @@ RadialIntegration::~RadialIntegration() {
}
void RadialIntegration::LoadRadialIntegrationCorr(const std::vector<float> &v) {
if (v.size() != pixel_to_bin.size() * pixel_split)
if (v.size() != pixel_to_bin.size())
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"Mismatch in size of pixel-to-bin mapping and correction");
memcpy(coeff, v.data(), pixel_to_bin.size() * pixel_split * sizeof(float));
memcpy(coeff, v.data(), pixel_to_bin.size() * sizeof(float));
}
void RadialIntegration::Clear() {
@@ -49,37 +40,23 @@ void RadialIntegration::Clear() {
}
void RadialIntegration::Process(const int16_t *__restrict data, size_t npixel) {
if (npixel != pixel_to_bin.size() / pixel_split)
if (npixel != pixel_to_bin.size())
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"Mismatch in size of pixel-to-bin mapping and image");
const auto coeff_aligned = std::assume_aligned<64>(coeff);
if (pixel_split == 1) {
for (int i = 0; i < npixel; i++) {
auto value = data[i];
if ((value > INT16_MIN + 4) && (value < INT16_MAX - 4)) {
auto bin = pixel_to_bin[i];
if (bin < nbins) {
sum[bin] += coeff_aligned[i] * value;
count[bin] += 1.0f;
}
}
}
} else if (pixel_split == 4) {
for (int i = 0; i < npixel; i++) {
auto value = data[i];
if ((value > INT16_MIN + 4) && (value < INT16_MAX - 4)) {
for (int p = 0; p < 4; p++) {
auto bin = pixel_to_bin[i * pixel_split + p];
if (bin < nbins) {
sum[bin] += coeff_aligned[i * pixel_split + p] * value * 0.25f;
count[bin] += 0.25f;
}
}
for (int i = 0; i < npixel; i++) {
auto value = data[i];
if ((value > INT16_MIN + 4) && (value < INT16_MAX - 4)) {
auto bin = pixel_to_bin[i];
if (bin < nbins) {
sum[bin] += coeff_aligned[i] * value;
count[bin] += 1.0f;
}
}
}
}
void RadialIntegration::ProcessOneImage(const int16_t *data, size_t npixel) {
+2 -3
View File
@@ -14,12 +14,11 @@ class RadialIntegration {
const std::vector<uint16_t> pixel_to_bin;
float *coeff;
const uint32_t nbins;
const uint32_t pixel_split;
std::vector<float> sum;
std::vector<float> count;
public:
RadialIntegration(const RadialIntegrationMapping& mapping, uint32_t pixel_split = 1);
RadialIntegration(const std::vector<uint16_t>& mapping, uint32_t nbins, uint32_t pixel_split = 1);
RadialIntegration(const RadialIntegrationMapping& mapping);
RadialIntegration(const std::vector<uint16_t>& mapping, uint32_t nbins);
~RadialIntegration();
void Clear();
void Process(const int16_t *data, size_t npixel);
@@ -79,12 +79,3 @@ const std::vector<float> &RadialIntegrationMapping::GetSolidAngleCorr() const {
double RadialIntegrationMapping::QToBin(double q) const {
return std::min(static_cast<double>(max_bin_number), std::max(0.0, (q - low_q) / q_spacing));
}
std::vector<uint16_t> RadialIntegrationMapping::GetPixelToBinMappingSplitTo4() const {
std::vector<uint16_t> ret(pixel_to_bin.size() * 4);
for (int i = 0; i < pixel_to_bin.size(); i++) {
for (int j = 0; j < 4; j++)
ret[i * 4 + j] = pixel_to_bin[i];
}
return ret;
}
@@ -16,7 +16,6 @@ public:
RadialIntegrationMapping(const DiffractionExperiment& experiment, const uint8_t *one_byte_mask = nullptr);
[[nodiscard]] uint16_t GetBinNumber() const;
[[nodiscard]] const std::vector<uint16_t> &GetPixelToBinMapping() const;
[[nodiscard]] std::vector<uint16_t> GetPixelToBinMappingSplitTo4() const;
[[nodiscard]] const std::vector<float> &GetBinToQ() const;
[[nodiscard]] const std::vector<float> &GetSolidAngleCorr() const;
[[nodiscard]] double QToBin(double q) const;
-28
View File
@@ -185,34 +185,6 @@ TEST_CASE("RadialIntegration_Process","[RadialIntegration]") {
REQUIRE(radial.GetSum()[1] == 6+2);
}
TEST_CASE("RadialIntegration_Process_PxlSplit4","[RadialIntegration]") {
std::vector<uint16_t> pixel_to_bin = {0, 1, 2, 3, 2, 2, 1, 4, 0, 0, 0, 0, 5, 5, 5, 5};
std::vector<int16_t> test_image = {5, 7, INT16_MIN, 123};
std::vector<float> result;
RadialIntegration radial(pixel_to_bin, 5, 4);
radial.ProcessOneImage(test_image.data(), 4);
REQUIRE(radial.GetCount().size() == 5);
REQUIRE(radial.GetSum().size() == 5);
float count = 0;
for (const auto &i: radial.GetCount())
count += i;
REQUIRE(count == Approx(2.0f));
REQUIRE(radial.GetCount()[0] == Approx(0.25f));
REQUIRE(radial.GetCount()[1] == Approx(0.5f));
REQUIRE(radial.GetCount()[2] == Approx(0.75f));
REQUIRE(radial.GetCount()[3] == Approx(0.25f));
REQUIRE(radial.GetCount()[4] == Approx(0.25f));
REQUIRE(radial.GetSum()[0] == Approx(5 * 0.25f));
REQUIRE(radial.GetSum()[1] == Approx(5 * 0.25f + 7 * 0.25f));
REQUIRE(radial.GetSum()[2] == Approx(5 * 0.25f + 7 * 0.5f));
REQUIRE(radial.GetSum()[4] == Approx(7 * 0.25f));
}
TEST_CASE("RadialIntegration_GetResult","[RadialIntegration]") {
std::vector<uint16_t> pixel_to_bin = {0,1,2,4,3,1,2,3};
std::vector<int16_t> test_image = {7,6,5,4,3,2,1,0};
+2 -12
View File
@@ -238,20 +238,13 @@ auto TestRadialIntegrationGPUWithoutCopyToDevice(const DiffractionExperiment &x,
auto TestRadialIntegration(const DiffractionExperiment &experiment,
const JFJochProtoBuf::DataProcessingSettings &settings,
int16_t* image, size_t nimages,
uint32_t pixel_split = 1) {
int16_t* image, size_t nimages) {
uint32_t nredo = 20;
RadialIntegrationMapping mapping(experiment);
std::unique_ptr<RadialIntegration> integration;
if (pixel_split == 1) {
integration = std::make_unique<RadialIntegration>(mapping);
} else {
integration = std::make_unique<RadialIntegration>(mapping.GetPixelToBinMappingSplitTo4(),
mapping.GetBinNumber(),
4);
}
integration = std::make_unique<RadialIntegration>(mapping);
std::vector<float> result;
@@ -350,9 +343,6 @@ int main(int argc, char **argv) {
logger.Info("{:30s} {:8.1f} ms/image", "Radial int. (CPU)", TestRadialIntegration(x, settings,
image_conv.data(), nimages));
logger.Info("{:30s} {:8.1f} ms/image", "Radial int. pxlspl 2 (CPU)", TestRadialIntegration(x, settings,
image_conv.data(), nimages, 4));
TestIndexing();
logger.Info("Full package");