jfjoch_test: HDF5Writer add calibration writing test
This commit is contained in:
@@ -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<int16_t> calib_1(x.GetModulesNum() * RAW_MODULE_SIZE);
|
||||
std::vector<float> 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<float>(i) / 16.0 + 123.25f;
|
||||
}
|
||||
|
||||
JFJochBitShuffleCompressor compressor(CompressionAlgorithm::BSHUF_LZ4);
|
||||
std::vector<uint8_t> 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<HDF5DataSet> dataset;
|
||||
REQUIRE_NOTHROW(dataset = std::make_unique<HDF5DataSet>(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<int16_t> 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<HDF5DataSet> dataset;
|
||||
REQUIRE_NOTHROW(dataset = std::make_unique<HDF5DataSet>(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<float> 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<HDF5DataSet> dataset;
|
||||
REQUIRE_NOTHROW(dataset = std::make_unique<HDF5DataSet>(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<int16_t> 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));
|
||||
|
||||
Reference in New Issue
Block a user