From 57cb8a6683f87f20ec44c8730350b600c5e90e64 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Fri, 5 Dec 2025 16:25:58 +0100 Subject: [PATCH] JFJochHDF5Reader: Fix reading ROI data --- reader/JFJochHDF5Reader.cpp | 70 ++++++++++++++++++++++++++++-------- reader/JFJochReaderDataset.h | 2 ++ 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/reader/JFJochHDF5Reader.cpp b/reader/JFJochHDF5Reader.cpp index f3c39509..bf46d17b 100644 --- a/reader/JFJochHDF5Reader.cpp +++ b/reader/JFJochHDF5Reader.cpp @@ -115,6 +115,7 @@ void JFJochHDF5Reader::ReadFile(const std::string& filename) { size_t image_size_x = 0; size_t image_size_y = 0; + if (master_file->Exists("/entry/data/data")) { legacy_format = false; auto dim = GetDimension(*master_file, "/entry/data/data"); @@ -127,6 +128,17 @@ void JFJochHDF5Reader::ReadFile(const std::string& filename) { dataset->efficiency = master_file->ReadVector( "/entry/instrument/detector/detectorSpecific/data_collection_efficiency_image"); + if (master_file->Exists("/entry/roi")) + dataset->roi = master_file->FindLeafs("/entry/roi"); + + for (const auto &s: dataset->roi) { + dataset->roi_max.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/max")); + dataset->roi_sum.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/sum")); + dataset->roi_sum_sq.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/sum_sq")); + dataset->roi_npixel.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/npixel")); + dataset->roi_x.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/x")); + dataset->roi_y.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/y")); + } if (master_file->Exists("/entry/MX")) { if (master_file->Exists("/entry/MX/peakCountUnfiltered")) @@ -173,7 +185,7 @@ void JFJochHDF5Reader::ReadFile(const std::string& filename) { auto fname = master_file->GetLinkedFileName(dname); if (!directory.empty()) - fname = fmt::format("{}/{}", directory.string(),fname); + fname = fmt::format("{}/{}", directory.string(), fname); HDF5ReadOnlyFile data_file(fname); @@ -181,6 +193,42 @@ void JFJochHDF5Reader::ReadFile(const std::string& filename) { legacy_format_files.push_back(fname); + if (nfiles == 0 && data_file.Exists("/entry/roi")) + dataset->roi = data_file.FindLeafs("/entry/roi"); + + dataset->roi_max.resize(dataset->roi.size()); + dataset->roi_npixel.resize(dataset->roi.size()); + dataset->roi_sum.resize(dataset->roi.size()); + dataset->roi_sum_sq.resize(dataset->roi.size()); + dataset->roi_x.resize(dataset->roi.size()); + dataset->roi_y.resize(dataset->roi.size()); + + for (int i = 0; i < dataset->roi.size(); i++) { + auto roi_name = dataset->roi[i]; + ReadVector(dataset->roi_max.at(i), + data_file, "/entry/roi/" + roi_name + "/max", + number_of_images, fimages); + ReadVector(dataset->roi_npixel.at(i), + data_file, "/entry/roi/" + roi_name + "/npixel", + number_of_images, fimages); + + ReadVector(dataset->roi_sum.at(i), + data_file, "/entry/roi/" + roi_name + "/sum", + number_of_images, fimages); + + ReadVector(dataset->roi_sum_sq.at(i), + data_file, "/entry/roi/" + roi_name + "/sum_sq", + number_of_images, fimages); + + ReadVector(dataset->roi_x.at(i), + data_file, "/entry/roi/" + roi_name + "/x", + number_of_images, fimages); + + ReadVector(dataset->roi_y.at(i), + data_file, "/entry/roi/" + roi_name + "/y", + number_of_images, fimages); + } + if (data_file.Exists("/entry/detector")) { ReadVector(dataset->efficiency, data_file, "/entry/detector/data_collection_efficiency_image", @@ -198,16 +246,16 @@ void JFJochHDF5Reader::ReadFile(const std::string& filename) { number_of_images, fimages); ReadVector(dataset->spot_count_ice_rings, - data_file, "/entry/MX/peakCountIceRingRes", - number_of_images, fimages); + data_file, "/entry/MX/peakCountIceRingRes", + number_of_images, fimages); ReadVector(dataset->spot_count_low_res, - data_file, "/entry/MX/peakCountLowRes", - number_of_images, fimages); + data_file, "/entry/MX/peakCountLowRes", + number_of_images, fimages); ReadVector(dataset->spot_count_indexed, - data_file, "/entry/MX/peakCountIndexed", - number_of_images, fimages); + data_file, "/entry/MX/peakCountIndexed", + number_of_images, fimages); ReadVector(dataset->indexing_result, data_file, "/entry/MX/imageIndexed", @@ -316,14 +364,6 @@ void JFJochHDF5Reader::ReadFile(const std::string& filename) { dataset->experiment.SampleName(master_file->GetString("/entry/sample/name")); - if (master_file->Exists("/entry/roi")) - dataset->roi = master_file->FindLeafs("/entry/roi"); - for (const auto &s: dataset->roi) { - dataset->roi_max.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/max")); - dataset->roi_sum.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/sum")); - dataset->roi_sum_sq.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/sum_sq")); - dataset->roi_npixel.emplace_back(master_file->ReadVector("/entry/roi/" + s + "/npixel")); - } if (master_file->Exists("/entry/instrument/attenuator")) dataset->experiment.AttenuatorTransmission(master_file->GetOptFloat("/entry/instrument/attenuator/attenuator_transmission")); dataset->experiment.TotalFlux(master_file->GetOptFloat("/entry/instrument/beam/total_flux")); diff --git a/reader/JFJochReaderDataset.h b/reader/JFJochReaderDataset.h index d02161cb..dd1c703e 100644 --- a/reader/JFJochReaderDataset.h +++ b/reader/JFJochReaderDataset.h @@ -47,6 +47,8 @@ struct JFJochReaderDataset { std::vector> roi_sum_sq; std::vector> roi_max; std::vector> roi_npixel; + std::vector> roi_x; + std::vector> roi_y; std::vector calibration_data;