From 0aa3d7fbfd3a4fe13c78588498069a8100f45901 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Wed, 14 Jun 2023 12:02:05 +0200 Subject: [PATCH] JFConversionFloatingPoint: Don't rely on infinity for FP math --- jungfrau/JFConversionFloatingPoint.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/jungfrau/JFConversionFloatingPoint.cpp b/jungfrau/JFConversionFloatingPoint.cpp index af68c1dd..0aca9882 100644 --- a/jungfrau/JFConversionFloatingPoint.cpp +++ b/jungfrau/JFConversionFloatingPoint.cpp @@ -11,7 +11,7 @@ pedestal_g0(RAW_MODULE_SIZE), pedestal_g1(RAW_MODULE_SIZE), pedestal_g2(RAW_MODU inline float one_over_gain_energy(double gain_factor, double energy) { double tmp = gain_factor * energy; if (!std::isfinite(tmp) || (tmp == 0.0)) - return std::numeric_limits::infinity(); + return 0.0; else return static_cast(1.0 / (gain_factor * energy)); } @@ -46,24 +46,30 @@ void JFConversionFloatingPoint::ConvertModule(int16_t *dest, const uint16_t *sou [[likely]] pedestal_subtracted_adu = adc - pedestal_g0[i]; expected = static_cast(pedestal_subtracted_adu) * gain_g0[i]; + if (gain_g0[i] == 0.0) + expected = INT16_MIN; 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; + if (gain_g1[i] == 0.0) + expected = INT16_MIN; 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; + if (gain_g0[i] == 0.0) + expected = INT16_MIN; break; default: expected = PIXEL_OUT_GAINBIT_2; break; } - if (std::isinf(expected) || (expected == INT16_MIN)) + if (expected == INT16_MIN) dest[i] = PIXEL_OUT_LOST; else if (expected > INT16_MAX) dest[i] = INT16_MAX; @@ -88,26 +94,30 @@ void JFConversionFloatingPoint::ConvertFP(float *dest, const uint16_t *source) { case 0: pedestal_subtracted_adu = adc - pedestal_g0[i]; expected = static_cast(pedestal_subtracted_adu) * gain_g0[i]; + if (gain_g0[i] == 0.0) + expected = INT16_MIN, 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; + if (gain_g1[i] == 0.0) + expected = INT16_MIN, 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; + if (gain_g2[i] == 0.0) + expected = INT16_MIN, special_val = true; break; default: expected = PIXEL_OUT_GAINBIT_2, special_val = true;; break; } - if (std::isinf(expected)) - expected = PIXEL_OUT_LOST; - else if ((expected > PIXEL_OUT_SATURATION) && !special_val) + if ((expected > PIXEL_OUT_SATURATION) && !special_val) expected = PIXEL_OUT_SATURATION; dest[i] = expected; }