From 8dd37812ec766a242216d14b8e0d535ec859b6ff Mon Sep 17 00:00:00 2001 From: leonarski_f Date: Sat, 7 Mar 2026 08:39:26 +0100 Subject: [PATCH] jfjoch_test: HDF5Writer add calibration writing test --- tests/HDF5WritingTest.cpp | 97 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/tests/HDF5WritingTest.cpp b/tests/HDF5WritingTest.cpp index 6062e0cf..6576e78c 100644 --- a/tests/HDF5WritingTest.cpp +++ b/tests/HDF5WritingTest.cpp @@ -799,6 +799,103 @@ TEST_CASE("HDF5Writer_NoMasterFile", "[HDF5][Full]") { REQUIRE (H5Fget_obj_count(H5F_OBJ_ALL, H5F_OBJ_ALL) == 0); } +TEST_CASE("HDF5Writer_Calibration", "[HDF5][Full]") { + DiffractionExperiment x(DetJF(2)); + + std::vector calib_1(x.GetModulesNum() * RAW_MODULE_SIZE); + std::vector calib_2(x.GetModulesNum() * RAW_MODULE_SIZE); + for (int i = 0; i < x.GetModulesNum(); i++) { + calib_1[i] = i * 3 - 1024; + calib_2[i] = static_cast(i) / 16.0 + 123.25f; + } + + JFJochBitShuffleCompressor compressor(CompressionAlgorithm::BSHUF_LZ4); + std::vector calib_3 = compressor.Compress(calib_1); + + x.ImagesPerTrigger(7).ImagesPerFile(2).Compression(CompressionAlgorithm::NO_COMPRESSION).FilePrefix("calib"); + x.OverwriteExistingFiles(true); + { + RegisterHDF5Filter(); + + StartMessage start_message; + x.FillMessage(start_message); + + EndMessage end_message; + end_message.max_image_number = x.GetImageNum() - 2; + + FileWriter writer(start_message); + + CompressedImage image_1(calib_1, RAW_MODULE_COLS, x.GetModulesNum() * RAW_MODULE_LINES); + CompressedImage image_2(calib_2, RAW_MODULE_COLS, x.GetModulesNum() * RAW_MODULE_LINES); + CompressedImage image_3(calib_3, RAW_MODULE_COLS, x.GetModulesNum() * RAW_MODULE_LINES, + CompressedImageMode::Int16, CompressionAlgorithm::BSHUF_LZ4); + image_1.Channel("calib1"); + image_2.Channel("calib2"); + image_3.Channel("calib3"); + + writer.WriteHDF5(image_1); + writer.WriteHDF5(image_2); + writer.WriteHDF5(image_3); + + writer.WriteHDF5(end_message); + writer.Finalize(); + } + REQUIRE(std::filesystem::exists("calib_master.h5")); + { + HDF5ReadOnlyFile file("calib_master.h5"); + { + std::unique_ptr dataset; + REQUIRE_NOTHROW(dataset = std::make_unique(file,"/entry/instrument/detector/calibration/calib1")); + HDF5DataSpace file_space(*dataset); + REQUIRE(file_space.GetNumOfDimensions() == 2); + HDF5DataType type(*dataset); + REQUIRE(type.GetElemSize() == 2); + REQUIRE(type.IsSigned()); + REQUIRE(type.IsInteger()); + + REQUIRE(file_space.GetDimensions()[0] == RAW_MODULE_COLS); + REQUIRE(file_space.GetDimensions()[1] == RAW_MODULE_LINES * x.GetModulesNum()); + std::vector output(file_space.GetDimensions()[0] * file_space.GetDimensions()[1]); + dataset->ReadVector(output, {0,0}, file_space.GetDimensions()); + CHECK(memcmp(output.data(), calib_1.data(), output.size() * type.GetElemSize()) == 0); + } + { + std::unique_ptr dataset; + REQUIRE_NOTHROW(dataset = std::make_unique(file,"/entry/instrument/detector/calibration/calib2")); + HDF5DataSpace file_space(*dataset); + REQUIRE(file_space.GetNumOfDimensions() == 2); + HDF5DataType type(*dataset); + REQUIRE(type.GetElemSize() == 4); + REQUIRE(type.IsSigned()); + REQUIRE(!type.IsInteger()); + + REQUIRE(file_space.GetDimensions()[0] == RAW_MODULE_COLS); + REQUIRE(file_space.GetDimensions()[1] == RAW_MODULE_LINES * x.GetModulesNum()); + std::vector output(file_space.GetDimensions()[0] * file_space.GetDimensions()[1]); + dataset->ReadVector(output, {0,0}, file_space.GetDimensions()); + CHECK(memcmp(output.data(), calib_2.data(), output.size() * type.GetElemSize()) == 0); + } + { + std::unique_ptr dataset; + REQUIRE_NOTHROW(dataset = std::make_unique(file,"/entry/instrument/detector/calibration/calib3")); + HDF5DataSpace file_space(*dataset); + REQUIRE(file_space.GetNumOfDimensions() == 2); + HDF5DataType type(*dataset); + REQUIRE(type.GetElemSize() == 2); + REQUIRE(type.IsSigned()); + REQUIRE(type.IsInteger()); + + REQUIRE(file_space.GetDimensions()[0] == RAW_MODULE_COLS); + REQUIRE(file_space.GetDimensions()[1] == RAW_MODULE_LINES * x.GetModulesNum()); + std::vector output(file_space.GetDimensions()[0] * file_space.GetDimensions()[1]); + dataset->ReadVector(output, {0,0}, file_space.GetDimensions()); + CHECK(memcmp(output.data(), calib_1.data(), output.size() * type.GetElemSize()) == 0); + } + } + // No leftover HDF5 objects + REQUIRE (H5Fget_obj_count(H5F_OBJ_ALL, H5F_OBJ_ALL) == 0); +} + TEST_CASE("HDF5Writer_Link_zero_images", "[HDF5][Full]") { DiffractionExperiment x(DetJF(1));