Improve plotting

This commit is contained in:
2024-03-31 23:08:19 +02:00
parent 8cad89d649
commit 30e775d8a2
122 changed files with 4640 additions and 1149 deletions

View File

@@ -1,13 +1,29 @@
// Copyright (2019-2023) Paul Scherrer Institute
#include "ImageMetadata.h"
#include <cmath>
inline uint64_t convert_pulse_id(double pulse_id) {
if (!std::isfinite(pulse_id))
return UINT64_MAX;
double integer_part;
double fractional_part = std::modf(pulse_id, &integer_part);
if (fractional_part != 0.0)
return UINT64_MAX;
return static_cast<uint64_t>(integer_part);
}
ImageMetadata::ImageMetadata(const DiffractionExperiment &experiment)
: pulsed_source(experiment.IsPulsedSource()) {}
: pulsed_source(experiment.IsPulsedSource()) {
roi_map_name = experiment.ROI().GetROINameMap();
for (const auto &[x,y]: roi_map_name)
rois[x] = ROIMessage{.max_count = INT64_MIN};
}
void ImageMetadata::Process(const DeviceOutput *output) {
uint64_t module_pulse_id = convert_pulse_id(output->module_statistics.pulse_id);
if (!first_module_loaded) {
xfel_pulse_id = output->module_statistics.pulse_id;
xfel_pulse_id = module_pulse_id;
jf_info = output->module_statistics.debug;
storage_cell = (jf_info >> 8) & 0xF;
xfel_event_code = (jf_info >> 16) & UINT8_MAX;
@@ -15,13 +31,23 @@ void ImageMetadata::Process(const DeviceOutput *output) {
exptime = output->module_statistics.exptime;
first_module_loaded = true;
} else {
if (pulsed_source && (output->module_statistics.pulse_id != xfel_pulse_id))
if (pulsed_source && (module_pulse_id != xfel_pulse_id)) {
metadata_consistent = false;
xfel_pulse_id = UINT64_MAX; // mark clearly inconsistent frames
}
}
saturated_pixels += output->module_statistics.saturated_pixels;
error_pixels += output->module_statistics.err_pixels;
strong_pixels += output->spot_finding_result.strong_pixel_count;
packets_collected += output->module_statistics.packet_count;
for (const auto &[key, val]: roi_map_name) {
rois[key].sum += output->roi_counts[val].sum;
rois[key].sum_square += output->roi_counts[val].sum2;
rois[key].pixels += output->roi_counts[val].good_pixels;
if (output->roi_counts[val].max_value > rois[key].max_count)
rois[key].max_count = output->roi_counts[val].max_value;
}
}
bool ImageMetadata::IsBunchIDConsistent() const {
@@ -30,7 +56,7 @@ bool ImageMetadata::IsBunchIDConsistent() const {
void ImageMetadata::Export(DataMessage &message, uint64_t packets_expected_per_image) const {
if (pulsed_source) {
message.xfel_pulse_id = static_cast<uint64_t>(xfel_pulse_id);
message.xfel_pulse_id = xfel_pulse_id;
message.xfel_event_code = xfel_event_code;
}
message.jf_info = jf_info;
@@ -47,4 +73,6 @@ void ImageMetadata::Export(DataMessage &message, uint64_t packets_expected_per_i
/ static_cast<double>(packets_expected_per_image);
else
message.image_collection_efficiency = 0.0f;
message.roi = rois;
}