Files
Jungfraujoch/receiver/host/AcquisitionOfflineCounters.cpp

73 lines
2.8 KiB
C++

// Copyright (2019-2022) Paul Scherrer Institute
// SPDX-License-Identifier: GPL-3.0-or-later
#include "AcquisitionOfflineCounters.h"
#include <bitset>
void AcquisitionOfflineCounters::Reset(const DiffractionExperiment &x, uint16_t data_stream) {
std::unique_lock<std::mutex> ul(m);
auto max_entries = x.GetFrameNum() * x.GetModulesNum(data_stream);
completion.clear();
completion.reserve(max_entries);
}
void AcquisitionOfflineCounters::Add(Completion c) {
std::unique_lock<std::mutex> ul(m);
completion.push_back(c);
}
void AcquisitionOfflineCounters::FillStatistics(const DiffractionExperiment &x, uint16_t data_stream,
JFJochProtoBuf::AcquisitionDeviceStatistics& statistics) const {
std::unique_lock<std::mutex> ul(m);
if (x.GetFrameNum() == 0)
return;
auto nmodules = x.GetModulesNum(data_stream);
auto max_entries = x.GetFrameNum() * x.GetModulesNum(data_stream);
const int masks_per_module = 2;
const int64_t expected_packets_per_module = 128;
std::vector<uint32_t> timestamp(max_entries, UINT32_MAX);
std::vector<uint32_t> debug(max_entries, UINT32_MAX);
std::vector<uint64_t> bunchid(max_entries, UINT64_MAX);
std::vector<uint64_t> packet_mask(masks_per_module * max_entries, 0);
std::vector<uint64_t> packet_count(max_entries, 0);
std::vector<uint64_t> packets_received_per_module(x.GetModulesNum(data_stream));
uint64_t total_packets = 0;
for (const auto &c: completion) {
size_t i = c.frame_number * nmodules + c.module;
timestamp[i] = c.timestamp;
debug[i] = c.debug;
bunchid[i] = c.bunchid;
packet_count[i] = c.packet_count;
total_packets += packet_count[i];
packets_received_per_module[c.module] += packet_count[i];
for (int j = 0; j < masks_per_module; j++)
packet_mask[i * masks_per_module + j] = c.packet_mask[j];
}
size_t expected_images = x.GetImageNum();
if ((x.GetDetectorMode() == DetectorMode::PedestalG0) ||
(x.GetDetectorMode() == DetectorMode::PedestalG1) ||
(x.GetDetectorMode() == DetectorMode::PedestalG2))
expected_images = x.GetFrameNum();
uint32_t expected_packets = max_entries * expected_packets_per_module;
statistics.set_nmodules(x.GetModulesNum(data_stream));
statistics.set_packets_expected(expected_packets);
if ((expected_images == 0) || (total_packets == expected_packets))
statistics.set_efficiency(1.0);
else
statistics.set_efficiency(static_cast<double>(total_packets) / static_cast<double>(expected_packets));
*statistics.mutable_packets_received_per_module() = {packets_received_per_module.begin(),
packets_received_per_module.end()};
statistics.set_good_packets(total_packets);
}