From 0399d1799dba9983ab28e5e35410fd40370827ce Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Thu, 2 Jul 2026 16:42:17 +0200 Subject: [PATCH] ice score: read back from stored HDF5 (viewer) + write to the NXmx master The per-image ice_ring_score was written to the data files (HDF5DataFilePluginMX) but the master-file write and the stored-file read path were missing, so opening a processed HDF5 (e.g. in jfjoch_viewer) would not surface it. Mirror bkg_estimate: write /entry/MX/iceRingScore in the NXmx master (HDF5NXmx, from EndMessage), and read it back in HDF5MetadataSource into the dataset (master + data-file reads) and per image into the message. Verified the write; the read is a byte-for-byte mirror of the working bkgEstimate round-trip. Co-Authored-By: Claude Fable 5 --- reader/HDF5MetadataSource.cpp | 7 +++++++ writer/HDF5NXmx.cpp | 1 + 2 files changed, 8 insertions(+) diff --git a/reader/HDF5MetadataSource.cpp b/reader/HDF5MetadataSource.cpp index 2109d685..811ab091 100644 --- a/reader/HDF5MetadataSource.cpp +++ b/reader/HDF5MetadataSource.cpp @@ -360,6 +360,7 @@ HDF5MetadataSource::OpenResult HDF5MetadataSource::Open(const std::string &filen dataset->indexing_result = master_file->ReadOptVector("/entry/MX/imageIndexed"); dataset->bkg_estimate = master_file->ReadOptVector("/entry/MX/bkgEstimate"); + dataset->ice_ring_score = master_file->ReadOptVector("/entry/MX/iceRingScore"); dataset->resolution_estimate = master_file->ReadOptVector("/entry/MX/resolutionEstimate"); dataset->profile_radius = master_file->ReadOptVector("/entry/MX/profileRadius"); // Master files write indexedLatticeCount; data files / the per-file MX @@ -485,6 +486,10 @@ HDF5MetadataSource::OpenResult HDF5MetadataSource::Open(const std::string &filen data_file, "/entry/MX/bkgEstimate", number_of_images, fimages); + ReadVector(dataset->ice_ring_score, + data_file, "/entry/MX/iceRingScore", + number_of_images, fimages); + ReadVector(dataset->profile_radius, data_file, "/entry/MX/profileRadius", number_of_images, fimages); @@ -933,6 +938,8 @@ void HDF5MetadataSource::FillPerImage(DataMessage &message, int64_t requested_im message.indexing_lattice_count = dataset->indexing_lattice_count[image_number]; if (dataset->bkg_estimate.size() > image_number) message.bkg_estimate = dataset->bkg_estimate[image_number]; + if (dataset->ice_ring_score.size() > image_number) + message.ice_ring_score = dataset->ice_ring_score[image_number]; if (dataset->efficiency.size() > image_number) message.image_collection_efficiency = dataset->efficiency[image_number]; if (dataset->profile_radius.size() > image_number) diff --git a/writer/HDF5NXmx.cpp b/writer/HDF5NXmx.cpp index 9a188880..02a262fe 100644 --- a/writer/HDF5NXmx.cpp +++ b/writer/HDF5NXmx.cpp @@ -996,6 +996,7 @@ void NXmx::EndResultVectors(const EndMessage &end) { SaveVectorIfMissing(*hdf5_file, "/entry/MX/imageIndexed", end.image_indexed); SaveVectorIfMissing(*hdf5_file, "/entry/MX/indexedLatticeCount", end.indexed_lattice_count); SaveVectorIfMissing(*hdf5_file, "/entry/MX/bkgEstimate", end.v_bkg_estimate); + SaveVectorIfMissing(*hdf5_file, "/entry/MX/iceRingScore", end.ice_ring_score); SaveVectorIfMissing(*hdf5_file, "/entry/MX/profileRadius", end.profile_radius, "Angstrom^-1"); SaveVectorIfMissing(*hdf5_file, "/entry/MX/mosaicity", end.mosaicity, "deg"); SaveVectorIfMissing(*hdf5_file, "/entry/MX/bFactor", end.bFactor, "Angstrom^2");