Files
Jungfraujoch/tests/DetectorSetupTest.cpp
T
leonarski_f 4878318c27
Build Packages / Unit tests (push) Successful in 1h17m4s
Build Packages / Generate python client (push) Successful in 1m24s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 12m34s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 12m37s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 11m11s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 12m4s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m59s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 13m4s
Build Packages / build:rpm (rocky8) (push) Successful in 13m12s
Build Packages / XDS test (durin plugin) (push) Successful in 9m57s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m52s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m30s
Build Packages / build:rpm (rocky9) (push) Successful in 13m59s
Build Packages / Build documentation (push) Successful in 1m7s
Build Packages / XDS test (neggia plugin) (push) Successful in 9m24s
Build Packages / Create release (push) Has been skipped
Build Packages / XDS test (JFJoch plugin) (push) Successful in 9m54s
Build Packages / DIALS test (push) Successful in 13m14s
v1.0.0-rc.139 (#49)
This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

* jfjoch_broker: Further reduce startup time for DECTRIS detectors by selectively modifying SIMPLON parameters on `/start`
* jfjoch_broker: Further reduce startup time for DECTRIS detectors by not setting beam center and detector distance via SIMPLON API on '/start'
* jfjoch_broker: Add an extra message to ZeroMQ puller ready to monitor Lite worklow preparation time
* jfjoch_broker: Image buffer configuration is postponed for Lite receiver flow till start message is received
* jfjoch_broker: Use nanoseconds internally for frame/image/readout time
* jfjoch_broker: Extra messages added for receiver operation (to be removed after debugging finished)
* jfojch_broker: Improve profiling of different data analysis steps
* jfjoch_broker: Record integration reflection count
* jfjoch_broker: Fix bug where ZeroMQ preview frequency was confusing time units (micro vs. milliseconds)
* jfjoch_broker: Fix bug where '/wait_till_done' got deadlocked
* jfjoch_writer: Fix confusion between NaN and zero in floating-point datasets

**Breaking changes**: detector definition is now using nanoseconds to define minimum frame time, minimum count time and readout time.

Reviewed-on: #49
2026-04-29 09:50:50 +02:00

178 lines
7.7 KiB
C++

// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include <catch2/catch_all.hpp>
#include "../common/DetectorSetup.h"
#include "../common/NetworkAddressConvert.h"
TEST_CASE("DetectorSetup_MismatchInSize") {
REQUIRE_THROWS(
DetectorSetup(DetectorGeometryModular(8), DetectorType::JUNGFRAU, "JF", {"mx1", "mx2", "mx3", "mx4"}));
REQUIRE_THROWS(
DetectorSetup(DetectorGeometryModular(2), DetectorType::JUNGFRAU, "JF", {"mx1", "mx2", "mx3", "mx4"}));
REQUIRE_NOTHROW(
DetectorSetup(DetectorGeometryModular(4), DetectorType::JUNGFRAU, "JF", {"mx1", "mx2", "mx3", "mx4"}));
}
TEST_CASE("DetectorSetup_MismatchInSize_EIGER") {
REQUIRE_THROWS(DetectorSetup(DetectorGeometryModular(4), DetectorType::EIGER, "JF", {"mx1", "mx2", "mx3", "mx4"}));
REQUIRE_NOTHROW(DetectorSetup(DetectorGeometryModular(2), DetectorType::EIGER, "JF", {"mx1", "mx2", "mx3", "mx4"}));
}
TEST_CASE("DetectorSetup_MismatchInSize_DECTRIS") {
REQUIRE_NOTHROW(DetectorSetup(DetectorGeometryFixed(123, 112), DetectorType::DECTRIS, "JF", {"mx1"}));
REQUIRE_NOTHROW(DetectorSetup(DetectorGeometryFixed(123, 112), DetectorType::DECTRIS, "JF", {}));
REQUIRE_THROWS(DetectorSetup(DetectorGeometryFixed(123, 112), DetectorType::DECTRIS, "JF", {"mx1", "mx2"}));
}
TEST_CASE("DetectorSetup_MismatchInGeometry") {
REQUIRE_THROWS(DetectorSetup(DetectorGeometryFixed(123, 112), DetectorType::EIGER, "JF"));
REQUIRE_THROWS(DetectorSetup(DetectorGeometryFixed(123, 112), DetectorType::JUNGFRAU, "JF"));
REQUIRE_THROWS(DetectorSetup(DetectorGeometryModular(2), DetectorType::DECTRIS, "JF"));
}
TEST_CASE("DetectorSetup_ReadoutDepth") {
auto setup = DetDECTRIS(123,123, "zzz", "a");
REQUIRE_NOTHROW(setup.BitDepthReadout(16));
REQUIRE(setup.GetBitDepthReadout() == 16);
REQUIRE_NOTHROW(setup.BitDepthReadout(12));
REQUIRE(setup.GetBitDepthReadout() == 12);
REQUIRE_NOTHROW(setup.BitDepthReadout(32));
REQUIRE(setup.GetBitDepthReadout() == 32);
REQUIRE_NOTHROW(setup.BitDepthReadout(8));
REQUIRE(setup.GetBitDepthReadout() == 8);
REQUIRE_THROWS(setup.BitDepthReadout(0));
REQUIRE_THROWS(setup.BitDepthReadout(15));
REQUIRE_THROWS(setup.BitDepthReadout(-1));
auto setup2 = DetJF(1);
REQUIRE(setup2.GetBitDepthReadout() == 16);
REQUIRE_THROWS(setup2.BitDepthReadout(32));
auto setup3 = DetEIGER(1);
REQUIRE(!setup3.GetBitDepthReadout());
REQUIRE_THROWS(setup3.BitDepthReadout(32));
}
TEST_CASE("DetectorSetup_ImageDepth") {
auto setup = DetDECTRIS(123,123, "zzz", "a");
REQUIRE_NOTHROW(setup.BitDepthImage(16));
REQUIRE(setup.GetBitDepthImage() == 16);
REQUIRE_THROWS(setup.BitDepthImage(12));
REQUIRE_NOTHROW(setup.BitDepthImage(32));
REQUIRE(setup.GetBitDepthImage() == 32);
REQUIRE_NOTHROW(setup.BitDepthImage(8));
REQUIRE(setup.GetBitDepthImage() == 8);
REQUIRE_THROWS(setup.BitDepthImage(0));
REQUIRE_THROWS(setup.BitDepthImage(15));
REQUIRE_THROWS(setup.BitDepthImage(-1));
auto setup2 = DetJF(1);
REQUIRE(!setup2.GetBitDepthImage());
REQUIRE_THROWS(setup2.BitDepthImage(32));
auto setup3 = DetEIGER(1);
REQUIRE(!setup3.GetBitDepthImage());
REQUIRE_THROWS(setup3.BitDepthImage(32));
}
TEST_CASE("DetectorSetup_ProtoBuf") {
DetectorSetup setup = DetJF(DetectorGeometryModular(4), "JF", {"mx1","mx2","mx3","mx4"});
REQUIRE(setup.GetDescription() == "JF");
REQUIRE(setup.GetDetectorModuleHostname().size() == 4);
REQUIRE(setup.GetDetectorModuleHostname()[3] == "mx4");
REQUIRE(setup.GetPixelSize_mm() == Catch::Approx(0.075));
REQUIRE(setup.GetModulesNum() == 4);
REQUIRE(setup.GetGeometry().GetModulesNum() == 4);
}
TEST_CASE("DetectorSetup_ProtoBuf_FullSpeed") {
DetectorSetup setup = DetJF(DetectorGeometryModular(4), "JF", {"mx1","mx2","mx3","mx4"});
REQUIRE(setup.GetUDPInterfaceCount() == 2);
REQUIRE_NOTHROW(setup.UDPInterfaceCount(1));
REQUIRE_THROWS(setup.UDPInterfaceCount(0));
REQUIRE_THROWS(setup.UDPInterfaceCount(5));
REQUIRE_THROWS(setup.UDPInterfaceCount(-56));
REQUIRE(setup.GetUDPInterfaceCount() == 1);
}
TEST_CASE("DetectorSetup_IPv4Base_2Interfaces") {
DetectorSetup detector = DetJF(DetectorGeometryModular(2));
detector.UDPInterfaceCount(2);
REQUIRE_NOTHROW(detector.BaseIPv4Addr("64.1.124.1"));
REQUIRE(detector.GetSrcIPv4Addr(0) == IPv4AddressFromStr("64.1.124.1"));
REQUIRE(detector.GetSrcIPv4Addr(1) == IPv4AddressFromStr("64.1.124.2"));
REQUIRE(detector.GetSrcIPv4Addr(3) == IPv4AddressFromStr("64.1.124.4"));
REQUIRE_THROWS(detector.GetSrcIPv4Addr(4));
}
TEST_CASE("DetectorSetup_IPv4Base_1Interface") {
DetectorSetup detector = DetJF(DetectorGeometryModular(4));
detector.UDPInterfaceCount(1);
REQUIRE_NOTHROW(detector.BaseIPv4Addr("64.1.124.1"));
REQUIRE(detector.GetSrcIPv4Addr(0) == IPv4AddressFromStr("64.1.124.1"));
REQUIRE(detector.GetSrcIPv4Addr(1) == IPv4AddressFromStr("64.1.124.2"));
REQUIRE(detector.GetSrcIPv4Addr(3) == IPv4AddressFromStr("64.1.124.4"));
REQUIRE_THROWS(detector.GetSrcIPv4Addr(4));
}
TEST_CASE("DetectorSetup_LoadTrimFile") {
DetectorSetup setup(DetectorGeometryModular(4), DetectorType::EIGER, "E", {"mx1","mx2","mx3","mx4","mx5","mx6","mx7","mx8"});
REQUIRE_NOTHROW(setup.SetTrimFiles({"a", "b", "c", "d", "e", "f", "g", "h"}));
REQUIRE(setup.GetTrimFileDirectory().empty());
REQUIRE(setup.GetTrimFileNames().size() == 8);
REQUIRE_NOTHROW(setup.SetTrimFiles({"../../tests"})); // must be directory
REQUIRE(setup.GetTrimFileDirectory() == "../../tests");
REQUIRE(setup.GetTrimFileNames().empty());
REQUIRE_THROWS(setup.SetTrimFiles({"Ridiculous_file_name"}));
}
TEST_CASE("DetectorSetup_LoadGainFile") {
DetectorSetup setup(DetectorGeometryModular(4), DetectorType::JUNGFRAU, "JF", {"mx1","mx2","mx3","mx4"});
REQUIRE_THROWS(setup.LoadGain({}));
REQUIRE(setup.GetGainCalibration().empty());
REQUIRE_THROWS(setup.LoadGain({
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin"
}));
REQUIRE_THROWS(setup.LoadGain({
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin"
}));
REQUIRE_NOTHROW(setup.LoadGain({
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin",
"../../tests/test_data/gainMaps_M049.bin"
}));
REQUIRE(setup.GetGainCalibration().size() == 4);
}
TEST_CASE("DetectorSetup_MaxFrameTime") {
DetectorSetup s1(DetectorGeometryModular(8), DetectorType::JUNGFRAU);
s1.UDPInterfaceCount(1);
REQUIRE(s1.GetMinFrameTime() == MIN_FRAME_TIME_JUNGFRAU_HALF_SPEED);
s1.UDPInterfaceCount(2);
REQUIRE(s1.GetMinFrameTime() == MIN_FRAME_TIME_JUNGFRAU_FULL_SPEED);
DetectorSetup s2(DetectorGeometryModular(8), DetectorType::EIGER);
REQUIRE(s2.GetMinFrameTime() == MIN_FRAME_TIME_EIGER);
}