diff --git a/common/DiffractionExperiment.cpp b/common/DiffractionExperiment.cpp index afe299b0..21dbb004 100644 --- a/common/DiffractionExperiment.cpp +++ b/common/DiffractionExperiment.cpp @@ -540,7 +540,7 @@ int64_t DiffractionExperiment::GetPixelDepth() const { } bool DiffractionExperiment::IsPixelSigned() const { - return (GetDetectorMode() == DetectorMode::Conversion) && (GetDetectorType() == JFJochProtoBuf::JUNGFRAU); + return GetFPGAOutputSigned(); } int64_t DiffractionExperiment::GetDataStreamsNum() const { diff --git a/common/FrameTransformation.cpp b/common/FrameTransformation.cpp index 14977603..ba58b7fa 100644 --- a/common/FrameTransformation.cpp +++ b/common/FrameTransformation.cpp @@ -21,19 +21,16 @@ FrameTransformation::FrameTransformation(const DiffractionExperiment &in_experim precompression_buffer.resize(experiment.GetPixelsNum() * pixel_depth); - if (experiment.GetApplyPixelMaskInFPGA()) { - // Mask gaps - if (pixel_depth == 2) { - if (pixel_signed) - FillVector(precompression_buffer, INT16_MIN); - else - FillVector(precompression_buffer, UINT16_MAX); - } else if (pixel_depth == 4) { - if (pixel_signed) - FillVector(precompression_buffer, INT32_MIN); - else - FillVector(precompression_buffer, UINT32_MAX); - } + if (pixel_depth == 2) { + if (pixel_signed) + FillVector(precompression_buffer, INT16_MIN); + else + FillVector(precompression_buffer, UINT16_MAX); + } else if (pixel_depth == 4) { + if (pixel_signed) + FillVector(precompression_buffer, INT32_MIN); + else + FillVector(precompression_buffer, UINT32_MAX); } } @@ -42,7 +39,7 @@ size_t FrameTransformation::SaveCompressedImage(void *output) { experiment.GetPixelsNum(), pixel_depth); } -void FrameTransformation::ProcessModule(const int16_t *input, uint16_t module_number, int data_stream) { +void FrameTransformation::ProcessModule(const void *input, uint16_t module_number, int data_stream) { size_t module_number_abs = experiment.GetFirstModuleOfDataStream(data_stream) + module_number; if (experiment.GetDetectorMode() != DetectorMode::Conversion) { diff --git a/common/FrameTransformation.h b/common/FrameTransformation.h index 7f9ab58c..a1c8f2b2 100644 --- a/common/FrameTransformation.h +++ b/common/FrameTransformation.h @@ -16,7 +16,7 @@ class FrameTransformation { const size_t pixel_depth; public: explicit FrameTransformation(const DiffractionExperiment &experiment); - void ProcessModule(const int16_t *input, uint16_t module_number, int data_stream); + void ProcessModule(const void *input, uint16_t module_number, int data_stream); size_t SaveCompressedImage(void *output); const void *GetPreviewImage() const; }; diff --git a/tests/FrameTransformationTest.cpp b/tests/FrameTransformationTest.cpp index 22e2921d..d72740d0 100644 --- a/tests/FrameTransformationTest.cpp +++ b/tests/FrameTransformationTest.cpp @@ -282,3 +282,133 @@ TEST_CASE("FrameTransformation_Converted_bshuf_zstd_rle" ,"") { REQUIRE(input_1[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030]); REQUIRE(input_1[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030 + 800 + 6]); } + +TEST_CASE("FrameTransformation_Converted_bshuf_zstd_32bit" ,"") { + const uint16_t nmodules = 4; + const uint16_t ndatastreams = 2; + DiffractionExperiment experiment(DetectorGeometry(ndatastreams * nmodules, 2)); + experiment.DataStreams(ndatastreams); + + experiment.Mode(DetectorMode::Conversion).Compression(JFJochProtoBuf::BSHUF_ZSTD).FPGAOutputMode(JFJochProtoBuf::INT32); + + FrameTransformation transformation(experiment); + + std::mt19937 g1(1987); + std::uniform_int_distribution dist; + + std::vector input_0(nmodules*RAW_MODULE_SIZE); + for (int i = 0; i < nmodules*RAW_MODULE_SIZE; i++) + input_0[i] = dist(g1); + + input_0[311*1024+256] = INT32_MAX-1; + input_0[311*1024+255] = INT32_MIN; + + std::vector input_1(nmodules*RAW_MODULE_SIZE); + for (int i = 0; i < nmodules*RAW_MODULE_SIZE; i++) + input_1[i] = dist(g1); + + std::vector output_compressed(experiment.GetMaxCompressedSize()); + + for (int i = 0; i < nmodules; i++) { + REQUIRE_NOTHROW(transformation.ProcessModule(input_0.data() + i * RAW_MODULE_SIZE, i, 0)); + REQUIRE_NOTHROW(transformation.ProcessModule(input_1.data() + i * RAW_MODULE_SIZE, i, 1)); + } + + size_t compressed_size; + REQUIRE_NOTHROW(compressed_size = transformation.SaveCompressedImage(output_compressed.data())); + + REQUIRE(bshuf_read_uint64_BE(output_compressed.data()) == experiment.GetPixelsNum() * experiment.GetPixelDepth()); + REQUIRE(bshuf_read_uint32_BE(output_compressed.data()+8) == JFJochBitShuffleCompressor::DefaultBlockSize * experiment.GetPixelDepth()); + + output_compressed.resize(compressed_size); + std::vector output; + REQUIRE_NOTHROW(JFJochDecompress(output, experiment.GetCompressionAlgorithmEnum(), output_compressed, + experiment.GetPixelsNum())); + + REQUIRE(input_0[511*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 0]); + REQUIRE(input_0[511*1024+256]/2 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 258]); + REQUIRE(input_0[256*1024+256]/4 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 2 * 1030 * 255 + 257]); + + REQUIRE(input_0[311*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 0]); + REQUIRE(input_0[311*1024+255] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 255]); + REQUIRE(input_0[311*1024+256] / 2 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 258]); + + REQUIRE(input_0[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 1030]); + REQUIRE(input_0[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 1030 + 800 + 6]); + + REQUIRE(input_1[511*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 0]); + REQUIRE(input_1[511*1024+256] /2 == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 258]); + + REQUIRE(input_1[(311+2*512)*1024] == output[200 * 1030 * 2 + 0]); + REQUIRE(input_1[(311+2*512)*1024+512] / 2 == output[200 * 1030 * 2 + 256*2+3]); + + REQUIRE(input_1[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030]); + REQUIRE(input_1[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030 + 800 + 6]); +} + + +TEST_CASE("FrameTransformation_Converted_bshuf_zstd_unsigned_16bit" ,"") { + const uint16_t nmodules = 4; + const uint16_t ndatastreams = 2; + DiffractionExperiment experiment(DetectorGeometry(ndatastreams * nmodules, 2)); + experiment.DataStreams(ndatastreams); + + experiment.Mode(DetectorMode::Conversion).Compression(JFJochProtoBuf::BSHUF_ZSTD).FPGAOutputMode(JFJochProtoBuf::UINT16); + + REQUIRE(!experiment.IsPixelSigned()); + REQUIRE(experiment.GetPixelDepth() == 2); + + FrameTransformation transformation(experiment); + + std::mt19937 g1(1987); + std::uniform_int_distribution dist(0, UINT16_MAX - 2); + + std::vector input_0(nmodules*RAW_MODULE_SIZE); + for (int i = 0; i < nmodules*RAW_MODULE_SIZE; i++) + input_0[i] = dist(g1); + + input_0[311*1024+256] = UINT16_MAX - 2; + input_0[311*1024+255] = UINT16_MAX - 1; + + std::vector input_1(nmodules*RAW_MODULE_SIZE); + for (int i = 0; i < nmodules*RAW_MODULE_SIZE; i++) + input_1[i] = dist(g1); + + std::vector output_compressed(experiment.GetMaxCompressedSize()); + + for (int i = 0; i < nmodules; i++) { + REQUIRE_NOTHROW(transformation.ProcessModule(input_0.data() + i * RAW_MODULE_SIZE, i, 0)); + REQUIRE_NOTHROW(transformation.ProcessModule(input_1.data() + i * RAW_MODULE_SIZE, i, 1)); + } + + size_t compressed_size; + REQUIRE_NOTHROW(compressed_size = transformation.SaveCompressedImage(output_compressed.data())); + + REQUIRE(bshuf_read_uint64_BE(output_compressed.data()) == experiment.GetPixelsNum() * experiment.GetPixelDepth()); + REQUIRE(bshuf_read_uint32_BE(output_compressed.data()+8) == JFJochBitShuffleCompressor::DefaultBlockSize * experiment.GetPixelDepth()); + + output_compressed.resize(compressed_size); + std::vector output; + REQUIRE_NOTHROW(JFJochDecompress(output, experiment.GetCompressionAlgorithmEnum(), output_compressed, + experiment.GetPixelsNum())); + + REQUIRE(input_0[511*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 0]); + REQUIRE(input_0[511*1024+256]/2 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 258]); + REQUIRE(input_0[256*1024+256]/4 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 2 * 1030 * 255 + 257]); + + REQUIRE(input_0[311*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 0]); + REQUIRE(input_0[311*1024+255] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 255]); + REQUIRE(input_0[311*1024+256] / 2 == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 200 * 1030 * 2 + 258]); + + REQUIRE(input_0[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 1030]); + REQUIRE(input_0[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (2 * nmodules - 2) + 1030 + 800 + 6]); + + REQUIRE(input_1[511*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 0]); + REQUIRE(input_1[511*1024+256] /2 == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 258]); + + REQUIRE(input_1[(311+2*512)*1024] == output[200 * 1030 * 2 + 0]); + REQUIRE(input_1[(311+2*512)*1024+512] / 2 == output[200 * 1030 * 2 + 256*2+3]); + + REQUIRE(input_1[(511+512)*1024] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030]); + REQUIRE(input_1[(511+512)*1024 + 800] == output[CONVERTED_MODULE_SIZE * (nmodules - 2) + 1030 + 800 + 6]); +} \ No newline at end of file