Files
Jungfraujoch/tests/DetectorSetupTest.cpp
2025-05-05 19:32:22 +02:00

178 lines
7.8 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() == std::chrono::microseconds(MIN_FRAME_TIME_JUNGFRAU_HALF_SPEED_IN_US));
s1.UDPInterfaceCount(2);
REQUIRE(s1.GetMinFrameTime() == std::chrono::microseconds(MIN_FRAME_TIME_JUNGFRAU_FULL_SPEED_IN_US));
DetectorSetup s2(DetectorGeometryModular(8), DetectorType::EIGER);
REQUIRE(s2.GetMinFrameTime() == std::chrono::microseconds(MIN_FRAME_TIME_EIGER_IN_US));
}