diff --git a/jungfrau/JFConversionFloatingPoint.cpp b/jungfrau/JFConversionFloatingPoint.cpp index 5cb677bb..e5263523 100644 --- a/jungfrau/JFConversionFloatingPoint.cpp +++ b/jungfrau/JFConversionFloatingPoint.cpp @@ -1,13 +1,12 @@ // Copyright (2019-2023) Paul Scherrer Institute #include "JFConversionFloatingPoint.h" -#include "../common/RawToConvertedGeometry.h" JFConversionFloatingPoint::JFConversionFloatingPoint() : gain_g0(RAW_MODULE_SIZE), gain_g1(RAW_MODULE_SIZE), gain_g2(RAW_MODULE_SIZE), pedestal_g0(RAW_MODULE_SIZE), pedestal_g1(RAW_MODULE_SIZE), pedestal_g2(RAW_MODULE_SIZE) {} -inline float one_over_gain_energy(double gain_factor, double energy) { +inline double one_over_gain_energy(double gain_factor, double energy) { double tmp = gain_factor * energy; if (!std::isfinite(tmp) || (tmp == 0.0)) return 0.0; @@ -38,40 +37,40 @@ void JFConversionFloatingPoint::ConvertModule(int16_t *dest, const uint16_t *sou uint16_t adc = source[i] & 0x3fff; int16_t pedestal_subtracted_adu; - float expected = PIXEL_OUT_LOST; + double expected = PIXEL_OUT_LOST; switch (gainbits) { case 0: [[likely]] pedestal_subtracted_adu = adc - pedestal_g0[i]; - expected = static_cast(pedestal_subtracted_adu) * gain_g0[i]; + expected = static_cast(pedestal_subtracted_adu) * gain_g0[i]; if (gain_g0[i] == 0.0) - expected = INT16_MIN; + expected = err_pixel; break; case 0x4000: pedestal_subtracted_adu = adc - pedestal_g1[i]; - expected = static_cast(pedestal_subtracted_adu) * gain_g1[i]; - if (adc == 0) [[unlikely]] expected = PIXEL_OUT_G1_SATURATION; + expected = static_cast(pedestal_subtracted_adu) * gain_g1[i]; + if (adc == 0) [[unlikely]] expected = err_pixel; if (gain_g1[i] == 0.0) - expected = INT16_MIN; + expected = err_pixel; break; case 0xc000: pedestal_subtracted_adu = adc - pedestal_g2[i]; - expected = static_cast(pedestal_subtracted_adu) * gain_g2[i]; - if (adc == 0) [[unlikely]] expected = PIXEL_OUT_SATURATION; - else if (adc == 0x3fff) [[unlikely]] expected = PIXEL_OUT_0xFFFF; + expected = static_cast(pedestal_subtracted_adu) * gain_g2[i]; + if (adc == 0) [[unlikely]] expected = overload_pixel; + else if (adc == 0x3fff) [[unlikely]] expected = err_pixel; if (gain_g0[i] == 0.0) - expected = INT16_MIN; + expected = err_pixel; break; default: - expected = PIXEL_OUT_GAINBIT_2; + expected = err_pixel; break; } - if (expected == INT16_MIN) - dest[i] = PIXEL_OUT_LOST; - else if (expected > INT16_MAX) - dest[i] = INT16_MAX; + if (expected == err_pixel) + dest[i] = err_pixel; + else if (expected > overload_pixel) + dest[i] = overload_pixel; else if (expected >= 0.0) [[likely]] dest[i] = static_cast(expected + 0.5f); @@ -80,44 +79,44 @@ void JFConversionFloatingPoint::ConvertModule(int16_t *dest, const uint16_t *sou } } -void JFConversionFloatingPoint::ConvertFP(float *dest, const uint16_t *source) { +void JFConversionFloatingPoint::ConvertFP(double *dest, const uint16_t *source) { for (size_t i = 0; i < RAW_MODULE_SIZE; i++) { uint16_t gainbits = source[i] & 0xc000; uint16_t adc = source[i] & 0x3fff; int16_t pedestal_subtracted_adu; - float expected = PIXEL_OUT_LOST; - + double expected = err_pixel; bool special_val = false; + switch (gainbits) { case 0: pedestal_subtracted_adu = adc - pedestal_g0[i]; - expected = static_cast(pedestal_subtracted_adu) * gain_g0[i]; + expected = static_cast(pedestal_subtracted_adu) * gain_g0[i]; if (gain_g0[i] == 0.0) - expected = INT16_MIN, special_val = true; + expected = err_pixel, special_val = true; break; case 0x4000: pedestal_subtracted_adu = adc - pedestal_g1[i]; - expected = static_cast(pedestal_subtracted_adu) * gain_g1[i]; - if (adc == 0) expected = PIXEL_OUT_G1_SATURATION, special_val = true; + expected = static_cast(pedestal_subtracted_adu) * gain_g1[i]; + if (adc == 0) expected = err_pixel, special_val = true; if (gain_g1[i] == 0.0) - expected = INT16_MIN, special_val = true; + expected = err_pixel, special_val = true; break; case 0xc000: pedestal_subtracted_adu = adc - pedestal_g2[i]; - expected = static_cast(pedestal_subtracted_adu) * gain_g2[i]; - if (adc == 0) expected = PIXEL_OUT_SATURATION, special_val = true; - else if (adc == 0x3fff) expected = PIXEL_OUT_0xFFFF, special_val = true; + expected = static_cast(pedestal_subtracted_adu) * gain_g2[i]; + if (adc == 0) expected = overload_pixel, special_val = true; + else if (adc == 0x3fff) expected = err_pixel, special_val = true; if (gain_g2[i] == 0.0) - expected = INT16_MIN, special_val = true; + expected = err_pixel, special_val = true; break; default: - expected = PIXEL_OUT_GAINBIT_2, special_val = true;; + expected = err_pixel, special_val = true;; break; } - if ((expected > PIXEL_OUT_SATURATION) && !special_val) - expected = PIXEL_OUT_SATURATION; + if ((expected > overload_pixel) && !special_val) + expected = overload_pixel; dest[i] = expected; } } diff --git a/jungfrau/JFConversionFloatingPoint.h b/jungfrau/JFConversionFloatingPoint.h index 8396b9cb..7c8e07a3 100644 --- a/jungfrau/JFConversionFloatingPoint.h +++ b/jungfrau/JFConversionFloatingPoint.h @@ -10,9 +10,12 @@ class JFConversionFloatingPoint { std::vector pedestal_g0; std::vector pedestal_g1; std::vector pedestal_g2; - std::vector gain_g0; - std::vector gain_g1; - std::vector gain_g2; + std::vector gain_g0; + std::vector gain_g1; + std::vector gain_g2; + + double err_pixel = INT16_MIN; + double overload_pixel = INT16_MAX; public: JFConversionFloatingPoint(); @@ -22,7 +25,7 @@ public: const JFModulePedestal &pedestal_g2, double energy); void ConvertModule(int16_t *dest, const uint16_t *source); - void ConvertFP(float *dest, const uint16_t *source); + void ConvertFP(double *dest, const uint16_t *source); }; diff --git a/tests/FPGAUnitTest.h b/tests/FPGAUnitTest.h index 4b2262ea..9f18fe53 100644 --- a/tests/FPGAUnitTest.h +++ b/tests/FPGAUnitTest.h @@ -20,7 +20,7 @@ template void LoadBinaryFile(const std::string &filename, T* output, s throw JFJochException(JFJochExceptionCategory::GainFileOpenError, "Gain file cannot be opened"); } -template double Compare(T *source, std::vector &reference, int32_t npixel) { +template double Compare(T *source, std::vector &reference, int32_t npixel) { double result = 0; for (size_t i = 0; i < npixel; i++) { @@ -31,7 +31,7 @@ template double Compare(T *source, std::vector &reference, int3 return sqrt(result / npixel); } -template double MaxErrorOnConversion(T *source, std::vector &reference, int32_t npixel) { +template double MaxErrorOnConversion(T *source, std::vector &reference, int32_t npixel) { double ret = 0; for (size_t i = 0; i < npixel; i++) { @@ -48,7 +48,7 @@ template double CheckConversion(const DiffractionExperiment &experimen const uint16_t *raw, T *converted, size_t storage_cell = 0) { - std::vector conversion_ref(RAW_MODULE_SIZE); + std::vector conversion_ref(RAW_MODULE_SIZE); JFConversionFloatingPoint conversion; conversion.Setup(calib.GainCalibration(0), @@ -68,8 +68,8 @@ template double CheckConversionWithGeomTransform(const DiffractionExpe T fill_value = INT16_MIN; if (experiment.GetPixelDepth() == 4) fill_value = INT32_MIN; - std::vector conversion_ref(experiment.GetModulesNum() * RAW_MODULE_SIZE); - std::vector conversion_ref_transformed(experiment.GetPixelsNum(), fill_value); + std::vector conversion_ref(experiment.GetModulesNum() * RAW_MODULE_SIZE); + std::vector conversion_ref_transformed(experiment.GetPixelsNum(), fill_value); JFConversionFloatingPoint conversion; diff --git a/tests/JFConversionTest.cpp b/tests/JFConversionTest.cpp index 0315b5a7..040be7fd 100644 --- a/tests/JFConversionTest.cpp +++ b/tests/JFConversionTest.cpp @@ -32,7 +32,7 @@ TEST_CASE("JFConversionFloatingPoint_G0","[JFConversion]") { conv.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, 12.4); std::vector input(RAW_MODULE_SIZE); - std::vector output_fp(RAW_MODULE_SIZE); + std::vector output_fp(RAW_MODULE_SIZE); std::vector output_16bit(RAW_MODULE_SIZE); for (int i = 0; i < RAW_MODULE_SIZE; i++) @@ -64,7 +64,7 @@ TEST_CASE("JFConversionFloatingPoint_G1","[JFConversion]") { conv.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, 12.4); std::vector input(RAW_MODULE_SIZE); - std::vector output_fp(RAW_MODULE_SIZE); + std::vector output_fp(RAW_MODULE_SIZE); std::vector output_16bit(RAW_MODULE_SIZE); for (int i = 0; i < RAW_MODULE_SIZE; i++) @@ -95,7 +95,7 @@ TEST_CASE("JFConversionFloatingPoint_G2","[JFConversion]") { conv.Setup(gain, pedestal_g0, pedestal_g1, pedestal_g2, 12.4); std::vector input(RAW_MODULE_SIZE); - std::vector output_fp(RAW_MODULE_SIZE); + std::vector output_fp(RAW_MODULE_SIZE); std::vector output_16bit(RAW_MODULE_SIZE); for (int i = 0; i < RAW_MODULE_SIZE; i++)