From e6442f638488a309529454b0b528af4a567a1218 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Fri, 3 Nov 2023 17:38:23 +0100 Subject: [PATCH] ZMQPreviewPublisher: Support both 16-bit and 32-bit images in preview --- common/FrameTransformation.cpp | 24 +---------- common/FrameTransformation.h | 3 +- common/ZMQPreviewPublisher.cpp | 6 +-- common/ZMQPreviewPublisher.h | 2 +- receiver/JFJochReceiver.cpp | 4 +- tests/FrameTransformationTest.cpp | 67 ----------------------------- tests/JFJochFullIntegrationTest.cpp | 6 +-- 7 files changed, 11 insertions(+), 101 deletions(-) diff --git a/common/FrameTransformation.cpp b/common/FrameTransformation.cpp index 7f412eca..785ab055 100644 --- a/common/FrameTransformation.cpp +++ b/common/FrameTransformation.cpp @@ -70,20 +70,6 @@ void FrameTransformation::PackSummation() { } } -void FrameTransformation::Generate16BitPreview() { - // Generate 16-bit preview image - auto arr = (int32_t *) precompression_buffer.data(); - - for (int pxl = 0; pxl < experiment.GetPixelsNum(); pxl++) { - if (arr[pxl] >= INT16_MAX) - image16bit[pxl] = INT16_MAX; - else if (arr[pxl] <= INT16_MIN) - image16bit[pxl] = INT16_MIN; - else - image16bit[pxl] = static_cast(arr[pxl]); - } -} - void FrameTransformation::Pack() { if (summation > 1) { @@ -95,9 +81,6 @@ void FrameTransformation::Pack() { experiment.GetYPixelsNumFullImage(), static_cast(experiment.GetUnderflow()), static_cast(experiment.GetOverflow())); - - if (pixel_depth == 4) - Generate16BitPreview(); } else { if (binning_2x2) Bin2x2_sum((int16_t *) precompression_buffer.data(), @@ -149,11 +132,8 @@ void FrameTransformation::ApplyROI(const ROIFilter &filter) { filter.Apply((int32_t *) precompression_buffer.data(), static_cast(INT32_MIN)); } -int16_t *FrameTransformation::GetPreview16BitImage() { - if (pixel_depth == 2) - return (int16_t *) precompression_buffer.data(); - else - return image16bit.data(); +const void *FrameTransformation::GetPreviewImage() const { + return precompression_buffer.data(); } void FrameTransformation::ProcessModule(JFConversion &conv, const int16_t *input, uint16_t module_number, int data_stream) { diff --git a/common/FrameTransformation.h b/common/FrameTransformation.h index d212d9dd..b580f03b 100644 --- a/common/FrameTransformation.h +++ b/common/FrameTransformation.h @@ -23,7 +23,6 @@ class FrameTransformation { std::vector full_image_buffer; bool binning_2x2; void PackSummation(); // transfer summed image to converted coordinates, clear summation buffer, no compression - void Generate16BitPreview(); public: FrameTransformation(const DiffractionExperiment &experiment); void ProcessModule(const int16_t *input, uint16_t module_number, int data_stream); @@ -32,7 +31,7 @@ public: void Pack(); // transfer summed image to converted coordinates, clear summation buffer size_t SaveCompressedImage(void *output); void ApplyROI(const ROIFilter &filter); - int16_t *GetPreview16BitImage(); + const void *GetPreviewImage() const; }; #endif //JUNGFRAUJOCH_FRAMETRANSFORMATION_H diff --git a/common/ZMQPreviewPublisher.cpp b/common/ZMQPreviewPublisher.cpp index ae298f2f..ee80db0b 100644 --- a/common/ZMQPreviewPublisher.cpp +++ b/common/ZMQPreviewPublisher.cpp @@ -27,7 +27,7 @@ void ZMQPreviewPublisher::Start(const DiffractionExperiment &experiment, const J void ZMQPreviewPublisher::Stop(const DiffractionExperiment& experiment) {} -void ZMQPreviewPublisher::Publish(const DiffractionExperiment& experiment, const int16_t* image_data, const DataMessage &message) { +void ZMQPreviewPublisher::Publish(const DiffractionExperiment& experiment, const void* image_data, const DataMessage &message) { { std::unique_lock ul(m); int64_t part = message.number / stride; @@ -49,9 +49,9 @@ void ZMQPreviewPublisher::Publish(const DiffractionExperiment& experiment, const frame.set_detector_distance_mm(experiment.GetDetectorDistance_mm()); frame.set_width(experiment.GetXPixelsNum()); frame.set_height(experiment.GetYPixelsNum()); - frame.set_pixel_depth(2); + frame.set_pixel_depth(experiment.GetPixelDepth()); - frame.set_data(image_data, experiment.GetPixelsNum() * sizeof(int16_t)); + frame.set_data(image_data, experiment.GetPixelsNum() * experiment.GetPixelDepth()); for (const auto &s: message.spots) { auto fr = frame.add_spots(); diff --git a/common/ZMQPreviewPublisher.h b/common/ZMQPreviewPublisher.h index 004adf47..097bb4e4 100644 --- a/common/ZMQPreviewPublisher.h +++ b/common/ZMQPreviewPublisher.h @@ -23,7 +23,7 @@ class ZMQPreviewPublisher { public: ZMQPreviewPublisher(ZMQContext& context, const std::string& addr); void Start(const DiffractionExperiment& experiment, const JFCalibration &calibration); - void Publish(const DiffractionExperiment& experiment, const int16_t* image_data, const DataMessage &message); + void Publish(const DiffractionExperiment& experiment, const void* image_data, const DataMessage &message); void Stop(const DiffractionExperiment& experiment); JFJochProtoBuf::PreviewFrame GetPreviewImage() const; }; diff --git a/receiver/JFJochReceiver.cpp b/receiver/JFJochReceiver.cpp index 09484a07..5f6a8f1a 100644 --- a/receiver/JFJochReceiver.cpp +++ b/receiver/JFJochReceiver.cpp @@ -467,9 +467,7 @@ void JFJochReceiver::FrameTransformationThread() { } if (preview_publisher && (!local_data_processing_settings.preview_indexed_only() || indexed)) - preview_publisher->Publish(experiment, - transformation.GetPreview16BitImage(), - message); + preview_publisher->Publish(experiment, transformation.GetPreviewImage(), message); if (push_images_to_writer) { message.receiver_available_send_buffers = GetAvailableSendBuffers(); diff --git a/tests/FrameTransformationTest.cpp b/tests/FrameTransformationTest.cpp index 94c04fd4..4923a4cb 100644 --- a/tests/FrameTransformationTest.cpp +++ b/tests/FrameTransformationTest.cpp @@ -571,73 +571,6 @@ TEST_CASE("FrameTransformation_Converted_bshuf_zstd_summation_bin_2x2" ,"") { REQUIRE(output[(514/2)*(1030/2) * 2] == 4 * (1024 + 1025 + 1025 + 1026)); // line 1024 + 1025 } -TEST_CASE("FrameTransformation_Converted_16bit_preview_summation" ,"") { - const uint16_t nmodules = 1; - const uint16_t ndatastreams = 2; - DiffractionExperiment experiment(DetectorGeometry(ndatastreams * nmodules, 1, 0, 0, false)); - experiment.DataStreams(ndatastreams); - - experiment.Mode(DetectorMode::Conversion).Summation(4).Compression(JFJochProtoBuf::BSHUF_ZSTD); - - REQUIRE(experiment.GetSummation() == 4); - - FrameTransformation transformation(experiment); - - std::mt19937 g1(15097); - std::uniform_int_distribution dist; - - std::vector input_0(RAW_MODULE_SIZE, 55); - input_0[0] = 10000; - input_0[1] = 500; - input_0[2] = INT16_MIN; - input_0[3] = INT16_MAX; - input_0[4] = 345; - input_0[5] = 0; - input_0[256*1024] = 10000; - - std::vector output_compressed(experiment.GetMaxCompressedSize()); - - REQUIRE_NOTHROW(transformation.ProcessModule(input_0.data(), 0, 0)); - REQUIRE_NOTHROW(transformation.ProcessModule(input_0.data(), 0, 0)); - REQUIRE_NOTHROW(transformation.ProcessModule(input_0.data(), 0, 0)); - REQUIRE_NOTHROW(transformation.ProcessModule(input_0.data(), 0, 0)); - - size_t compressed_size; - transformation.Pack(); - 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())); - - auto output16 = transformation.GetPreview16BitImage(); - - REQUIRE(output16[0] == INT16_MAX); - REQUIRE(output[0] == 4 * 10000); - - REQUIRE(output16[1] == 4 * 500); - REQUIRE(output[1] == 4 * 500); - - REQUIRE(output16[2] == INT16_MIN); - REQUIRE(output[2] == experiment.GetUnderflow()); - - REQUIRE(output16[3] == INT16_MAX); - REQUIRE(output[3] == experiment.GetOverflow()); - - REQUIRE(output16[4] == 4*345); - REQUIRE(output[4] == 4*345); - - REQUIRE(output16[5] == 0); - REQUIRE(output[5] == 0); - - REQUIRE(output16[1030*257] == 4 * 5000); - REQUIRE(output[1030*257] == 4 * 5000); -} - TEST_CASE("FrameTransformation_Converted_bshuf_zstd_summation_2frames" ,"") { // Ensure that previous frame is properly cleaned with PackStandardOutput() const uint16_t nmodules = 4; diff --git a/tests/JFJochFullIntegrationTest.cpp b/tests/JFJochFullIntegrationTest.cpp index e4b2cbb5..18ae608e 100644 --- a/tests/JFJochFullIntegrationTest.cpp +++ b/tests/JFJochFullIntegrationTest.cpp @@ -403,9 +403,9 @@ TEST_CASE("JFJochIntegrationTest_ZMQ_2Devices_Summation100", "[JFJochReceiver]") REQUIRE(statistics.detector_pixel_depth() == 4); auto preview_image = services.GetPreviewFrame(); - REQUIRE(preview_image.pixel_depth() == 2); - REQUIRE(preview_image.data().size() == 514*1030*ndatastream*nmodules*2); - auto preview_image_content = (int16_t *) preview_image.data().data(); + REQUIRE(preview_image.pixel_depth() == sizeof(int32_t)); + REQUIRE(preview_image.data().size() == 514*1030*ndatastream*nmodules*sizeof(int32_t)); + auto preview_image_content = (int32_t *) preview_image.data().data(); REQUIRE(preview_image_content[0] == image[0] * summation); REQUIRE(preview_image_content[5] == image[5] * summation); REQUIRE(preview_image_content[36+302*1030] == image[36+300*1024] * summation);