Files
Jungfraujoch/tests/CrystFELGeometryTest.cpp
T

106 lines
3.2 KiB
C++

// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include <catch2/catch_all.hpp>
#include <filesystem>
#include <fstream>
#include "../reader/CrystFELGeometry.h"
namespace {
std::string WriteGeom(const std::string &name, const std::string &text) {
const auto path = (std::filesystem::temp_directory_path() / name).string();
std::ofstream(path) << text;
return path;
}
} // namespace
TEST_CASE("CrystFELGeometry_OldSyntax", "[CrystFELGeometry][portable]") {
// One panel and whole-frame bad strips, global keys only: the old syntax.
const auto geom = crystfel::Read("../../tests/crystfel/jf4m.geom");
REQUIRE(geom.panels.size() == 1);
CHECK(geom.panels[0].res == Catch::Approx(13333.3));
CHECK(geom.panels[0].clen == "0.075");
CHECK(geom.panels[0].adu_per_photon.value() == Catch::Approx(1.0));
CHECK(geom.photon_energy == "12400");
CHECK(geom.data == "/entry/data/data");
REQUIRE(!geom.bad.empty());
CHECK(geom.bad[0].panel.empty());
CHECK(!geom.bad[0].in_lab);
CHECK(geom.bad[0].min_fs == 1030);
CHECK(geom.bad[0].max_fs == 1037);
CHECK(geom.bad[0].max_ss == 2163);
}
TEST_CASE("CrystFELGeometry_Panels", "[CrystFELGeometry][portable]") {
const auto path = WriteGeom("jfjoch_crystfel_geometry_test.geom", R"(
clen = /LCLS/detector_1/EncoderValue ; read from the file
res = 20000
adu_per_eV = 0.001 ; per eV
data = /%/data
photon_energy = /%/photon_energy_ev
mask = /data/data
mask_file = mask.h5
mask_good = 0x0
mask_bad = 0x1
q1/min_fs = 0
q1/max_fs = 511
q1/min_ss = 0
q1/max_ss = 1023
q1/fs = +0.000390x -1.000000y
q1/ss = +1.000000x +0.000390y
q1/corner_x = 32.9283
q1/corner_y = 1033.68
q1/coffset = 0.000067
q2/min_ss = 1024
q2/max_ss = 2047
q2/max_fs = 511
q2/fs = -x
q2/ss = y
q2/adu_per_photon = 9.5
badq1/min_fs = 0
badq1/max_fs = 4
badq1/min_ss = 0
badq1/max_ss = 1023
badq1/panel = q1
badbox/min_x = -10
badbox/max_x = 10
badbox/min_y = -5
badbox/max_y = 5
)");
const auto geom = crystfel::Read(path);
REQUIRE(geom.panels.size() == 2);
const auto &q1 = geom.panels[0];
CHECK(q1.name == "q1");
CHECK(q1.clen == "/LCLS/detector_1/EncoderValue");
CHECK(q1.coffset == Catch::Approx(0.000067));
CHECK(q1.adu_per_eV.value() == Catch::Approx(0.001));
CHECK(q1.fs_x == Catch::Approx(0.00039));
CHECK(q1.fs_y == Catch::Approx(-1.0));
CHECK(q1.ss_x == Catch::Approx(1.0));
CHECK(q1.ss_y == Catch::Approx(0.00039));
CHECK(q1.corner_y == Catch::Approx(1033.68));
CHECK(q1.max_ss == 1023);
const auto &q2 = geom.panels[1];
CHECK(q2.fs_x == Catch::Approx(-1.0));
CHECK(q2.fs_y == Catch::Approx(0.0));
CHECK(q2.ss_y == Catch::Approx(1.0));
CHECK(q2.min_ss == 1024);
CHECK(q2.adu_per_photon.value() == Catch::Approx(9.5));
CHECK(q2.res == Catch::Approx(20000));
CHECK(geom.data == "/%/data");
CHECK(geom.mask_file == "mask.h5");
CHECK(geom.mask_bad == 1);
REQUIRE(geom.bad.size() == 2);
CHECK(geom.bad[0].panel == "q1");
CHECK(geom.bad[0].max_fs == 4);
CHECK(geom.bad[1].in_lab);
CHECK(geom.bad[1].min_x == Catch::Approx(-10));
CHECK(geom.bad[1].max_y == Catch::Approx(5));
std::filesystem::remove(path);
}