// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include #include "../receiver/ImageMetadata.h" TEST_CASE("ImageMetadata_ROI") { DetectorGeometryModular geom(8,2,8,36, true); DiffractionExperiment experiment(DetJF(geom)); experiment.ROI().SetROI(ROIDefinition{.boxes = {ROIBox("roi1",1,5,2,8)}}); int64_t sum = 100; ImageMetadata metadata(experiment); DeviceOutput output{}; output.module_statistics.module_number = 5; output.module_statistics.frame_number = 0; output.roi_counts[0].sum = sum; output.roi_counts[0].sum_x_weighted = 50 * sum; output.roi_counts[0].sum_y_weighted = 23 * sum; metadata.Process(&output); DataMessage message; REQUIRE_NOTHROW(metadata.Export(message, 123)); REQUIRE(message.roi.size() == 1); REQUIRE(message.roi.contains("roi1")); REQUIRE(message.roi["roi1"].sum == sum); REQUIRE(message.roi["roi1"].x_weighted == sum * (geom.GetX0(5) + 50)); REQUIRE(message.roi["roi1"].y_weighted == sum * (geom.GetY0(5) - 23)); } TEST_CASE("ImageMetadata_ROI_flipped_module") { DetectorGeometryModular geom({DetectorModuleGeometry(45,1811, DetectorModuleGeometry::Direction::Yneg, DetectorModuleGeometry::Direction::Xpos)}); DiffractionExperiment experiment(DetJF(geom)); experiment.ROI().SetROI(ROIDefinition{.boxes = {ROIBox("roi1",1,5,2,8)}}); int64_t sum = 100; ImageMetadata metadata(experiment); DeviceOutput output{}; output.module_statistics.module_number = 0; output.module_statistics.frame_number = 0; output.roi_counts[0].sum = sum; output.roi_counts[0].sum_x_weighted = 50 * sum; output.roi_counts[0].sum_y_weighted = 23 * sum; metadata.Process(&output); DataMessage message; REQUIRE_NOTHROW(metadata.Export(message, 123)); REQUIRE(message.roi.size() == 1); REQUIRE(message.roi.contains("roi1")); REQUIRE(message.roi["roi1"].sum == sum); REQUIRE(message.roi["roi1"].x_weighted == sum * (23 + 45) ); REQUIRE(message.roi["roi1"].y_weighted == sum * (1811 - 50)); } TEST_CASE("ImageMetadata_PulseID_mismatch") { DiffractionExperiment experiment(DetJF4M()); experiment.PulsedSource(true); ImageMetadata metadata(experiment); DeviceOutput output{}; output.module_statistics.module_number = 0; output.module_statistics.frame_number = 0; output.module_statistics.pulse_id = 123.0; metadata.Process(&output); output.module_statistics.module_number = 1; output.module_statistics.frame_number = 0; output.module_statistics.pulse_id = 124.0; metadata.Process(&output); DataMessage message; REQUIRE_NOTHROW(metadata.Export(message, 123)); REQUIRE(message.xfel_pulse_id == UINT64_MAX); }