From a7706546b71860e0a40d352d93c8a0422499f581 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Sat, 21 Oct 2023 16:18:41 +0200 Subject: [PATCH] RadialIntegration: Remove pixel split --- image_analysis/RadialIntegration.cpp | 53 ++++++--------------- image_analysis/RadialIntegration.h | 5 +- image_analysis/RadialIntegrationMapping.cpp | 9 ---- image_analysis/RadialIntegrationMapping.h | 1 - tests/RadialIntegrationTest.cpp | 28 ----------- tools/DataAnalysisPerfTest.cpp | 14 +----- 6 files changed, 19 insertions(+), 91 deletions(-) diff --git a/image_analysis/RadialIntegration.cpp b/image_analysis/RadialIntegration.cpp index 7b92b2b2..27b56b0a 100644 --- a/image_analysis/RadialIntegration.cpp +++ b/image_analysis/RadialIntegration.cpp @@ -3,19 +3,10 @@ #include "RadialIntegration.h" #include "../common/JFJochException.h" -RadialIntegration::RadialIntegration(const std::vector& 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& 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& 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 &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) { diff --git a/image_analysis/RadialIntegration.h b/image_analysis/RadialIntegration.h index 6843559f..91d15eaf 100644 --- a/image_analysis/RadialIntegration.h +++ b/image_analysis/RadialIntegration.h @@ -14,12 +14,11 @@ class RadialIntegration { const std::vector pixel_to_bin; float *coeff; const uint32_t nbins; - const uint32_t pixel_split; std::vector sum; std::vector count; public: - RadialIntegration(const RadialIntegrationMapping& mapping, uint32_t pixel_split = 1); - RadialIntegration(const std::vector& mapping, uint32_t nbins, uint32_t pixel_split = 1); + RadialIntegration(const RadialIntegrationMapping& mapping); + RadialIntegration(const std::vector& mapping, uint32_t nbins); ~RadialIntegration(); void Clear(); void Process(const int16_t *data, size_t npixel); diff --git a/image_analysis/RadialIntegrationMapping.cpp b/image_analysis/RadialIntegrationMapping.cpp index ac98f06d..3f0833dc 100644 --- a/image_analysis/RadialIntegrationMapping.cpp +++ b/image_analysis/RadialIntegrationMapping.cpp @@ -79,12 +79,3 @@ const std::vector &RadialIntegrationMapping::GetSolidAngleCorr() const { double RadialIntegrationMapping::QToBin(double q) const { return std::min(static_cast(max_bin_number), std::max(0.0, (q - low_q) / q_spacing)); } - -std::vector RadialIntegrationMapping::GetPixelToBinMappingSplitTo4() const { - std::vector 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; -} diff --git a/image_analysis/RadialIntegrationMapping.h b/image_analysis/RadialIntegrationMapping.h index 12076f68..b2ef16f5 100644 --- a/image_analysis/RadialIntegrationMapping.h +++ b/image_analysis/RadialIntegrationMapping.h @@ -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 &GetPixelToBinMapping() const; - [[nodiscard]] std::vector GetPixelToBinMappingSplitTo4() const; [[nodiscard]] const std::vector &GetBinToQ() const; [[nodiscard]] const std::vector &GetSolidAngleCorr() const; [[nodiscard]] double QToBin(double q) const; diff --git a/tests/RadialIntegrationTest.cpp b/tests/RadialIntegrationTest.cpp index e7b861a5..e8453deb 100644 --- a/tests/RadialIntegrationTest.cpp +++ b/tests/RadialIntegrationTest.cpp @@ -185,34 +185,6 @@ TEST_CASE("RadialIntegration_Process","[RadialIntegration]") { REQUIRE(radial.GetSum()[1] == 6+2); } -TEST_CASE("RadialIntegration_Process_PxlSplit4","[RadialIntegration]") { - std::vector pixel_to_bin = {0, 1, 2, 3, 2, 2, 1, 4, 0, 0, 0, 0, 5, 5, 5, 5}; - std::vector test_image = {5, 7, INT16_MIN, 123}; - std::vector 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 pixel_to_bin = {0,1,2,4,3,1,2,3}; std::vector test_image = {7,6,5,4,3,2,1,0}; diff --git a/tools/DataAnalysisPerfTest.cpp b/tools/DataAnalysisPerfTest.cpp index 8f9852b6..6b6d50c3 100644 --- a/tools/DataAnalysisPerfTest.cpp +++ b/tools/DataAnalysisPerfTest.cpp @@ -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 integration; - if (pixel_split == 1) { - integration = std::make_unique(mapping); - } else { - integration = std::make_unique(mapping.GetPixelToBinMappingSplitTo4(), - mapping.GetBinNumber(), - 4); - } + integration = std::make_unique(mapping); std::vector 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");