From d5dbc121752225153da7d207eb5ea0dc60b0a68a Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Thu, 5 Feb 2026 13:29:27 +0100 Subject: [PATCH] NeXus HDF4/HDF5 IDF V1: read 'frames_good' --- src/external/nexus/PNeXus.cpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/external/nexus/PNeXus.cpp b/src/external/nexus/PNeXus.cpp index 7ac89f2f..14b705a3 100644 --- a/src/external/nexus/PNeXus.cpp +++ b/src/external/nexus/PNeXus.cpp @@ -504,6 +504,7 @@ void nxH4::PNeXus::HandleIdfV1(int32 sd_id) "/run/number", "/run/switching_states", "/run/instrument/detector/number", + "/run/instrument/beam/frames_good", "/run/histogram_data_1/counts", "/run/histogram_data_1/resolution", "/run/histogram_data_1/grouping" @@ -1183,6 +1184,17 @@ void nxH4::PNeXus::Dump() } } std::cout << std::endl << "----"; + std::cout << std::endl << " beam"; + std::cout << std::endl << "----"; + if (fDataMap.find("/run/instrument/beam/frames_good") != fDataMap.end()) { + try { + auto fg = std::any_cast>(fDataMap["/run/instrument/beam/frames_good"]); + std::cout << std::endl << " good_frames : " << fg.GetData()[0]; + } catch (const std::bad_any_cast& e) { + std::cerr << std::endl << "**ERROR**: Failed to cast good_frames data" << std::endl; + } + } + std::cout << std::endl << "----"; std::cout << std::endl << " collimator"; std::cout << std::endl << "----"; if (fDataMap.find("/run/instrument/collimator/type") != fDataMap.end()) { @@ -3125,7 +3137,7 @@ void nxH5::PNeXus::HandleIdfV1(H5::H5File &file) ReadStringDataset(file, "/run/lab"); ReadStringDataset(file, "/run/beamline"); ReadStringDataset(file, "/run/start_time"); - ReadStringDataset(file, "/run/end_time"); + ReadStringDataset(file, "/run/stop_time"); ReadIntDataset(file, "/run/switching_states"); ReadStringDataset(file, "/run/user/name"); ReadStringDataset(file, "/run/user/experiment_number"); @@ -3137,8 +3149,10 @@ void nxH5::PNeXus::HandleIdfV1(H5::H5File &file) ReadStringDataset(file, "/run/sample/environment"); ReadStringDataset(file, "/run/instrument/name"); ReadIntDataset(file, "/run/instrument/detector/number"); + ReadFloatDataset(file, "/run/instrument/detector/deadtimes"); ReadStringDataset(file, "/run/instrument/collimator/type"); ReadStringDataset(file, "/run/instrument/beam/beamline"); + ReadIntDataset(file, "/run/instrument/beam/frames_good"); ReadIntDataset(file, "/run/histogram_data_1/counts"); ReadIntDataset(file, "/run/histogram_data_1/resolution"); ReadIntDataset(file, "/run/histogram_data_1/time_zero"); @@ -3450,6 +3464,17 @@ void nxH5::PNeXus::Dump() std::cerr << std::endl << "Error: Failed to cast number data" << std::endl; } } + if (fDataMap.find("/run/instrument/detector/deadtimes") != fDataMap.end()) { + try { + const auto& dead_times = std::any_cast>("/run/instrument/detector/deadtimes").GetData(); + std::cout << std::endl << " deadtimes: "; + for (unsigned int i=0; i<10; i++) + std::cout << dead_times[i] << ", "; + std::cout << "..."; + } catch (const std::bad_any_cast& e) { + std::cerr << std::endl << "Error: Failed to cast dead time data" << std::endl; + } + } std::cout << std::endl << " collimator"; std::cout << std::endl << "----"; if (fDataMap.find("/run/instrument/collimator/type") != fDataMap.end()) { @@ -3470,6 +3495,14 @@ void nxH5::PNeXus::Dump() std::cerr << std::endl << "Error: Failed to cast beamline data" << std::endl; } } + if (fDataMap.find("/run/instrument/beam/frames_good") != fDataMap.end()) { + try { + auto str_data = std::any_cast>(fDataMap["/run/instrument/beam/frames_good"]); + std::cout << std::endl << " frames_good : " << str_data.GetData()[0]; + } catch (const std::bad_any_cast& e) { + std::cerr << std::endl << "Error: Failed to cast frames_good data" << std::endl; + } + } std::cout << std::endl << " histogram_data_1"; std::cout << std::endl << "----"; std::cout << std::endl << " counts:";