From 16f3b0270efccb1d608dba3c26957d0e029f62ee Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Sun, 8 Nov 2026 09:51:04 +0100 Subject: [PATCH] Stream receivers: efficiency counts a partial image as its fraction in every child Lite summed the per-image image_collection_efficiency that FPGAImagePuller sets, the rugnux rotation and stills receivers counted images, so with live rugnux on the puller and lost packets they reported 100%. The sum moves into JFJochReceiver::CountImage and JFJochReceiverStream::GetEfficiency; Lite's own override goes. A DECTRIS stream carries no such key and counts each image as whole, as before. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01HVeDQsU5a8AJUdJPgWevAK --- receiver/JFJochReceiver.cpp | 1 + receiver/JFJochReceiver.h | 1 + receiver/JFJochReceiverLite.cpp | 6 ------ receiver/JFJochReceiverLite.h | 5 ----- receiver/JFJochReceiverStream.cpp | 2 +- 5 files changed, 3 insertions(+), 12 deletions(-) diff --git a/receiver/JFJochReceiver.cpp b/receiver/JFJochReceiver.cpp index 49fef0b6f..6546168a0 100644 --- a/receiver/JFJochReceiver.cpp +++ b/receiver/JFJochReceiver.cpp @@ -188,6 +188,7 @@ bool JFJochReceiver::SerializeImageOrDrop(CBORStream2Serializer &serializer, Dat void JFJochReceiver::CountImage(const DataMessage &message) { ++images_collected; + collection_efficiency_sum += message.image_collection_efficiency.value_or(1.0f); compressed_size += message.image.GetCompressedSize(); uncompressed_size += message.image.GetUncompressedSize(); UpdateMaxImageReceived(message.number); diff --git a/receiver/JFJochReceiver.h b/receiver/JFJochReceiver.h index b97b371d3..fa6570a1e 100644 --- a/receiver/JFJochReceiver.h +++ b/receiver/JFJochReceiver.h @@ -41,6 +41,7 @@ protected: std::atomic uncompressed_size{0}; std::atomic images_sent{0}; std::atomic images_collected{0}; + std::atomic collection_efficiency_sum{0.0}; // a partial image counts as its fraction; a stream without the key counts each as whole std::atomic images_skipped{0}; std::chrono::time_point start_time; diff --git a/receiver/JFJochReceiverLite.cpp b/receiver/JFJochReceiverLite.cpp index edd7ad8bf..3594b3927 100644 --- a/receiver/JFJochReceiverLite.cpp +++ b/receiver/JFJochReceiverLite.cpp @@ -70,7 +70,6 @@ void JFJochReceiverLite::OnImage(uint32_t id, DataMessage &data_msg, std::chrono auto start = std::chrono::high_resolution_clock::now(); CountImage(data_msg); - collection_efficiency_sum += data_msg.image_collection_efficiency.value_or(1.0f); auto image_start_time = std::chrono::high_resolution_clock::now(); @@ -103,8 +102,3 @@ void JFJochReceiverLite::OnImage(uint32_t id, DataMessage &data_msg, std::chrono id, data_msg.number, duration_total.count(), image_duration.count()); } -float JFJochReceiverLite::GetEfficiency() const { - if (ExpectedImages() == 0) - return 0; - return static_cast(collection_efficiency_sum / static_cast(ExpectedImages())); -} diff --git a/receiver/JFJochReceiverLite.h b/receiver/JFJochReceiverLite.h index ea477ffe7..df2c8fa93 100644 --- a/receiver/JFJochReceiverLite.h +++ b/receiver/JFJochReceiverLite.h @@ -12,9 +12,6 @@ class JFJochReceiverLite : public JFJochReceiverStream { std::vector> analysis; // per image thread - // Over the images received, as a detector stream without it counts each as whole - std::atomic collection_efficiency_sum{0.0}; - void ImageThread(uint32_t id) override; void OnImage(uint32_t id, DataMessage &message, std::chrono::steady_clock::time_point received) override; public: @@ -31,6 +28,4 @@ public: ZMQMetadataSocket *zmq_metadata_socket = nullptr, IndexerThreadPool *indexing_thread_pool = nullptr); ~JFJochReceiverLite() override; - - float GetEfficiency() const override; }; diff --git a/receiver/JFJochReceiverStream.cpp b/receiver/JFJochReceiverStream.cpp index c2687af6e..7e843b6b0 100644 --- a/receiver/JFJochReceiverStream.cpp +++ b/receiver/JFJochReceiverStream.cpp @@ -264,7 +264,7 @@ int64_t JFJochReceiverStream::ExpectedImages() const { float JFJochReceiverStream::GetEfficiency() const { if (ExpectedImages() == 0) return 0; - return static_cast(images_collected) / static_cast(ExpectedImages()); + return static_cast(collection_efficiency_sum / static_cast(ExpectedImages())); } float JFJochReceiverStream::GetProgress() const {