From d9cbf0f48197c99b196c53873d5aa05033c1c8ec Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 4 Jun 2025 15:59:27 +0200 Subject: [PATCH] able to get headers from multiple modules as well --- CMakeLists.txt | 2 +- include/aare/Hdf5File.hpp | 21 ++++++++---- include/aare/Hdf5MasterFile.hpp | 1 + include/aare/defs.hpp | 14 ++++++++ src/Hdf5File.cpp | 60 +++++++++++++++++++-------------- src/Hdf5MasterFile.cpp | 4 +++ 6 files changed, 69 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 09d7620..3f0c9cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ if(AARE_VERBOSE) add_compile_definitions(AARE_VERBOSE) add_compile_definitions(AARE_LOG_LEVEL=aare::logDEBUG5) else() - add_compile_definitions(AARE_LOG_LEVEL=aare::logERROR) + add_compile_definitions(AARE_LOG_LEVEL=aare::logINFOBLUE) endif() if(AARE_CUSTOM_ASSERT) diff --git a/include/aare/Hdf5File.hpp b/include/aare/Hdf5File.hpp index 4f16c79..d429529 100644 --- a/include/aare/Hdf5File.hpp +++ b/include/aare/Hdf5File.hpp @@ -43,9 +43,8 @@ struct H5Handles { } // header virtual datasets else if (rank == 2) { - hsize_t dimsm[1] = {dims[1]}; - memspace = std::make_unique(1, dimsm); - count.push_back(dims[1]); + memspace = std::make_unique(H5S_SCALAR); + count.push_back(1); offset.push_back(0); } // data dataset @@ -67,11 +66,19 @@ struct H5Handles { }; void get_frame_into(size_t frame_index, std::byte *frame_buffer) { - seek(frame_index); + offset[0] = frame_index; + LOG(logDEBUG) << "data offset:" << offset << " count:" << count; dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data()); dataset.read(frame_buffer, datatype, *memspace, dataspace); }; + void get_header_into(size_t frame_index, int part_index, std::byte *header_buffer) { + offset[0] = frame_index; + offset[1] = part_index; + LOG(logDEBUG) << "header offset:" << offset << " count:" << count; + dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data()); + dataset.read(header_buffer, datatype, *memspace, dataspace); + }; }; /** @@ -120,8 +127,7 @@ class Hdf5File : public FileInterface { size_t cols() const override; size_t bitdepth() const override; xy geometry(); - size_t n_mod() const; - + size_t n_modules() const; Hdf5MasterFile master() const; DetectorType detector_type() const override; @@ -145,9 +151,10 @@ class Hdf5File : public FileInterface { /** * @brief read the header at the given frame index into the header buffer * @param frame_index frame number to read + * @param part_index part index to read (for virtual datasets) * @param header buffer to store the header */ - void get_header_into(size_t frame_index, DetectorHeader *header); + void get_header_into(size_t frame_index, int part_index, DetectorHeader *header); /** * @brief get the frame at the given frame index diff --git a/include/aare/Hdf5MasterFile.hpp b/include/aare/Hdf5MasterFile.hpp index 7790749..1894c0e 100644 --- a/include/aare/Hdf5MasterFile.hpp +++ b/include/aare/Hdf5MasterFile.hpp @@ -143,6 +143,7 @@ class Hdf5MasterFile { size_t total_frames_expected() const; xy geometry() const; + size_t n_modules() const; std::optional analog_samples() const; std::optional digital_samples() const; diff --git a/include/aare/defs.hpp b/include/aare/defs.hpp index 8b048d8..127e2e1 100644 --- a/include/aare/defs.hpp +++ b/include/aare/defs.hpp @@ -11,6 +11,7 @@ #include #include #include +#include /** @@ -267,4 +268,17 @@ template <> std::string ToString(FrameDiscardPolicy arg); using DataTypeVariants = std::variant; +template +std::ostream &operator<<(std::ostream &os, const std::vector &vec) { + os << "["; + for (size_t i = 0; i < vec.size(); ++i) { + os << vec[i]; + if (i != vec.size() - 1) + os << ", "; + } + os << "]"; + return os; +} + + } // namespace aare \ No newline at end of file diff --git a/src/Hdf5File.cpp b/src/Hdf5File.cpp index 2eaa360..27d188a 100644 --- a/src/Hdf5File.cpp +++ b/src/Hdf5File.cpp @@ -1,6 +1,7 @@ #include "aare/Hdf5File.hpp" #include "aare/PixelMap.hpp" #include "aare/defs.hpp" +#include "aare/logger.hpp" #include @@ -51,12 +52,10 @@ void Hdf5File::read_into(std::byte *image_buf, size_t n_frames, this->get_frame_into(m_current_frame++, image_buf, header); image_buf += bytes_per_frame(); if (header) - header += n_mod(); + header += n_modules(); } } -size_t Hdf5File::n_mod() const { return 1; } - size_t Hdf5File::bytes_per_frame() { return m_rows * m_cols * m_master.bitdepth() / 8; } @@ -81,6 +80,8 @@ size_t Hdf5File::rows() const { return m_rows; } size_t Hdf5File::cols() const { return m_cols; } size_t Hdf5File::bitdepth() const { return m_master.bitdepth(); } xy Hdf5File::geometry() { return m_master.geometry(); } +size_t Hdf5File::n_modules() const { return m_master.n_modules(); } +Hdf5MasterFile Hdf5File::master() const { return m_master; } DetectorHeader Hdf5File::read_header(const std::filesystem::path &fname) { DetectorHeader h{}; @@ -103,8 +104,7 @@ DetectorHeader Hdf5File::read_header(const std::filesystem::path &fname) { handles[11]->get_frame_into(0, reinterpret_cast(&(h.detType))); handles[12]->get_frame_into(0, reinterpret_cast(&(h.version))); handles[13]->get_frame_into(0, reinterpret_cast(&(h.packetMask))); - - fmt::print("Read 1D header for frame {}\n", 0); + LOG(logDEBUG5) << "Read 1D header for frame 0"; } catch (const H5::Exception &e) { handles.clear(); fmt::print("Exception type: {}\n", typeid(e).name()); @@ -130,7 +130,6 @@ DetectorHeader Hdf5File::read_header(const std::filesystem::path &fname) { return h; } -Hdf5MasterFile Hdf5File::master() const { return m_master; } Frame Hdf5File::get_frame(size_t frame_index) { auto f = Frame(m_rows, m_cols, Dtype::from_bitdepth(m_master.bitdepth())); @@ -143,32 +142,43 @@ size_t Hdf5File::bytes_per_pixel() const { return m_master.bitdepth() / 8; } void Hdf5File::get_frame_into(size_t frame_index, std::byte *frame_buffer, DetectorHeader *header) { + get_data_into(frame_index, frame_buffer); - get_header_into(frame_index, header); + if (header) { + for (size_t part_idx = 0; part_idx != m_master.n_modules(); ++part_idx) { + // fmt::print("Reading header for module {}\n", part_idx); + get_header_into(frame_index, part_idx, header); + header++; + } + } } void Hdf5File::get_data_into(size_t frame_index, std::byte *frame_buffer) { m_data_file->get_frame_into(frame_index, frame_buffer); - //fmt::print("Read 2D data for frame {}\n", frame_index); } -void Hdf5File::get_header_into(size_t frame_index, DetectorHeader *header) { - if (header) { - m_header_files[0]->get_frame_into(frame_index, reinterpret_cast(&(header->frameNumber))); - m_header_files[1]->get_frame_into(frame_index, reinterpret_cast(&(header->expLength))); - m_header_files[2]->get_frame_into(frame_index, reinterpret_cast(&(header->packetNumber))); - m_header_files[3]->get_frame_into(frame_index, reinterpret_cast(&(header->bunchId))); - m_header_files[4]->get_frame_into(frame_index, reinterpret_cast(&(header->timestamp))); - m_header_files[5]->get_frame_into(frame_index, reinterpret_cast(&(header->modId))); - m_header_files[6]->get_frame_into(frame_index, reinterpret_cast(&(header->row))); - m_header_files[7]->get_frame_into(frame_index, reinterpret_cast(&(header->column))); - m_header_files[8]->get_frame_into(frame_index, reinterpret_cast(&(header->reserved))); - m_header_files[9]->get_frame_into(frame_index, reinterpret_cast(&(header->debug))); - m_header_files[10]->get_frame_into(frame_index, reinterpret_cast(&(header->roundRNumber))); - m_header_files[11]->get_frame_into(frame_index, reinterpret_cast(&(header->detType))); - m_header_files[12]->get_frame_into(frame_index, reinterpret_cast(&(header->version))); - m_header_files[13]->get_frame_into(frame_index, reinterpret_cast(&(header->packetMask))); - fmt::print("Read 1D header for frame {}\n", frame_index); +void Hdf5File::get_header_into(size_t frame_index, int part_index, DetectorHeader *header) { + try { + m_header_files[0]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->frameNumber))); + m_header_files[1]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->expLength))); + m_header_files[2]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->packetNumber))); + m_header_files[3]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->bunchId))); + m_header_files[4]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->timestamp))); + m_header_files[5]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->modId))); + m_header_files[6]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->row))); + m_header_files[7]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->column))); + m_header_files[8]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->reserved))); + m_header_files[9]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->debug))); + m_header_files[10]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->roundRNumber))); + m_header_files[11]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->detType))); + m_header_files[12]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->version))); + m_header_files[13]->get_header_into(frame_index, part_index, reinterpret_cast(&(header->packetMask))); + LOG(logDEBUG5) << "Read 1D header for frame " << frame_index; + } catch (const H5::Exception &e) { + fmt::print("Exception type: {}\n", typeid(e).name()); + e.printErrorStack(); + throw std::runtime_error( + LOCATION + "\nCould not to access header datasets in given file."); } } diff --git a/src/Hdf5MasterFile.cpp b/src/Hdf5MasterFile.cpp index 5cf6692..c61fab3 100644 --- a/src/Hdf5MasterFile.cpp +++ b/src/Hdf5MasterFile.cpp @@ -137,6 +137,10 @@ std::optional Hdf5MasterFile::number_of_rows() const { xy Hdf5MasterFile::geometry() const { return m_geometry; } +size_t Hdf5MasterFile::n_modules() const { + return m_geometry.row * m_geometry.col; +} + std::optional Hdf5MasterFile::quad() const { return m_quad; } // optional values, these may or may not be present in the master file