mirror of
https://github.com/slsdetectorgroup/aare.git
synced 2025-06-07 13:10:42 +02:00
able to get headers from multiple modules as well
This commit is contained in:
parent
5681e18403
commit
d9cbf0f481
@ -82,7 +82,7 @@ if(AARE_VERBOSE)
|
|||||||
add_compile_definitions(AARE_VERBOSE)
|
add_compile_definitions(AARE_VERBOSE)
|
||||||
add_compile_definitions(AARE_LOG_LEVEL=aare::logDEBUG5)
|
add_compile_definitions(AARE_LOG_LEVEL=aare::logDEBUG5)
|
||||||
else()
|
else()
|
||||||
add_compile_definitions(AARE_LOG_LEVEL=aare::logERROR)
|
add_compile_definitions(AARE_LOG_LEVEL=aare::logINFOBLUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(AARE_CUSTOM_ASSERT)
|
if(AARE_CUSTOM_ASSERT)
|
||||||
|
@ -43,9 +43,8 @@ struct H5Handles {
|
|||||||
}
|
}
|
||||||
// header virtual datasets
|
// header virtual datasets
|
||||||
else if (rank == 2) {
|
else if (rank == 2) {
|
||||||
hsize_t dimsm[1] = {dims[1]};
|
memspace = std::make_unique<H5::DataSpace>(H5S_SCALAR);
|
||||||
memspace = std::make_unique<H5::DataSpace>(1, dimsm);
|
count.push_back(1);
|
||||||
count.push_back(dims[1]);
|
|
||||||
offset.push_back(0);
|
offset.push_back(0);
|
||||||
}
|
}
|
||||||
// data dataset
|
// data dataset
|
||||||
@ -67,11 +66,19 @@ struct H5Handles {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void get_frame_into(size_t frame_index, std::byte *frame_buffer) {
|
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());
|
dataspace.selectHyperslab(H5S_SELECT_SET, count.data(), offset.data());
|
||||||
dataset.read(frame_buffer, datatype, *memspace, dataspace);
|
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 cols() const override;
|
||||||
size_t bitdepth() const override;
|
size_t bitdepth() const override;
|
||||||
xy geometry();
|
xy geometry();
|
||||||
size_t n_mod() const;
|
size_t n_modules() const;
|
||||||
|
|
||||||
Hdf5MasterFile master() const;
|
Hdf5MasterFile master() const;
|
||||||
|
|
||||||
DetectorType detector_type() const override;
|
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
|
* @brief read the header at the given frame index into the header buffer
|
||||||
* @param frame_index frame number to read
|
* @param frame_index frame number to read
|
||||||
|
* @param part_index part index to read (for virtual datasets)
|
||||||
* @param header buffer to store the header
|
* @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
|
* @brief get the frame at the given frame index
|
||||||
|
@ -143,6 +143,7 @@ class Hdf5MasterFile {
|
|||||||
|
|
||||||
size_t total_frames_expected() const;
|
size_t total_frames_expected() const;
|
||||||
xy geometry() const;
|
xy geometry() const;
|
||||||
|
size_t n_modules() const;
|
||||||
|
|
||||||
std::optional<size_t> analog_samples() const;
|
std::optional<size_t> analog_samples() const;
|
||||||
std::optional<size_t> digital_samples() const;
|
std::optional<size_t> digital_samples() const;
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -267,4 +268,17 @@ template <> std::string ToString(FrameDiscardPolicy arg);
|
|||||||
|
|
||||||
using DataTypeVariants = std::variant<uint16_t, uint32_t>;
|
using DataTypeVariants = std::variant<uint16_t, uint32_t>;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
std::ostream &operator<<(std::ostream &os, const std::vector<T> &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
|
} // namespace aare
|
@ -1,6 +1,7 @@
|
|||||||
#include "aare/Hdf5File.hpp"
|
#include "aare/Hdf5File.hpp"
|
||||||
#include "aare/PixelMap.hpp"
|
#include "aare/PixelMap.hpp"
|
||||||
#include "aare/defs.hpp"
|
#include "aare/defs.hpp"
|
||||||
|
#include "aare/logger.hpp"
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
@ -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);
|
this->get_frame_into(m_current_frame++, image_buf, header);
|
||||||
image_buf += bytes_per_frame();
|
image_buf += bytes_per_frame();
|
||||||
if (header)
|
if (header)
|
||||||
header += n_mod();
|
header += n_modules();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Hdf5File::n_mod() const { return 1; }
|
|
||||||
|
|
||||||
size_t Hdf5File::bytes_per_frame() {
|
size_t Hdf5File::bytes_per_frame() {
|
||||||
return m_rows * m_cols * m_master.bitdepth() / 8;
|
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::cols() const { return m_cols; }
|
||||||
size_t Hdf5File::bitdepth() const { return m_master.bitdepth(); }
|
size_t Hdf5File::bitdepth() const { return m_master.bitdepth(); }
|
||||||
xy Hdf5File::geometry() { return m_master.geometry(); }
|
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 Hdf5File::read_header(const std::filesystem::path &fname) {
|
||||||
DetectorHeader h{};
|
DetectorHeader h{};
|
||||||
@ -103,8 +104,7 @@ DetectorHeader Hdf5File::read_header(const std::filesystem::path &fname) {
|
|||||||
handles[11]->get_frame_into(0, reinterpret_cast<std::byte *>(&(h.detType)));
|
handles[11]->get_frame_into(0, reinterpret_cast<std::byte *>(&(h.detType)));
|
||||||
handles[12]->get_frame_into(0, reinterpret_cast<std::byte *>(&(h.version)));
|
handles[12]->get_frame_into(0, reinterpret_cast<std::byte *>(&(h.version)));
|
||||||
handles[13]->get_frame_into(0, reinterpret_cast<std::byte *>(&(h.packetMask)));
|
handles[13]->get_frame_into(0, reinterpret_cast<std::byte *>(&(h.packetMask)));
|
||||||
|
LOG(logDEBUG5) << "Read 1D header for frame 0";
|
||||||
fmt::print("Read 1D header for frame {}\n", 0);
|
|
||||||
} catch (const H5::Exception &e) {
|
} catch (const H5::Exception &e) {
|
||||||
handles.clear();
|
handles.clear();
|
||||||
fmt::print("Exception type: {}\n", typeid(e).name());
|
fmt::print("Exception type: {}\n", typeid(e).name());
|
||||||
@ -130,7 +130,6 @@ DetectorHeader Hdf5File::read_header(const std::filesystem::path &fname) {
|
|||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
Hdf5MasterFile Hdf5File::master() const { return m_master; }
|
|
||||||
|
|
||||||
Frame Hdf5File::get_frame(size_t frame_index) {
|
Frame Hdf5File::get_frame(size_t frame_index) {
|
||||||
auto f = Frame(m_rows, m_cols, Dtype::from_bitdepth(m_master.bitdepth()));
|
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,
|
void Hdf5File::get_frame_into(size_t frame_index, std::byte *frame_buffer,
|
||||||
DetectorHeader *header) {
|
DetectorHeader *header) {
|
||||||
|
|
||||||
get_data_into(frame_index, frame_buffer);
|
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) {
|
void Hdf5File::get_data_into(size_t frame_index, std::byte *frame_buffer) {
|
||||||
m_data_file->get_frame_into(frame_index, 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) {
|
void Hdf5File::get_header_into(size_t frame_index, int part_index, DetectorHeader *header) {
|
||||||
if (header) {
|
try {
|
||||||
m_header_files[0]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->frameNumber)));
|
m_header_files[0]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->frameNumber)));
|
||||||
m_header_files[1]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->expLength)));
|
m_header_files[1]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->expLength)));
|
||||||
m_header_files[2]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->packetNumber)));
|
m_header_files[2]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->packetNumber)));
|
||||||
m_header_files[3]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->bunchId)));
|
m_header_files[3]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->bunchId)));
|
||||||
m_header_files[4]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->timestamp)));
|
m_header_files[4]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->timestamp)));
|
||||||
m_header_files[5]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->modId)));
|
m_header_files[5]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->modId)));
|
||||||
m_header_files[6]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->row)));
|
m_header_files[6]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->row)));
|
||||||
m_header_files[7]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->column)));
|
m_header_files[7]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->column)));
|
||||||
m_header_files[8]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->reserved)));
|
m_header_files[8]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->reserved)));
|
||||||
m_header_files[9]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->debug)));
|
m_header_files[9]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->debug)));
|
||||||
m_header_files[10]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->roundRNumber)));
|
m_header_files[10]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->roundRNumber)));
|
||||||
m_header_files[11]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->detType)));
|
m_header_files[11]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->detType)));
|
||||||
m_header_files[12]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->version)));
|
m_header_files[12]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->version)));
|
||||||
m_header_files[13]->get_frame_into(frame_index, reinterpret_cast<std::byte *>(&(header->packetMask)));
|
m_header_files[13]->get_header_into(frame_index, part_index, reinterpret_cast<std::byte *>(&(header->packetMask)));
|
||||||
fmt::print("Read 1D header for frame {}\n", frame_index);
|
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.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,6 +137,10 @@ std::optional<size_t> Hdf5MasterFile::number_of_rows() const {
|
|||||||
|
|
||||||
xy Hdf5MasterFile::geometry() const { return m_geometry; }
|
xy Hdf5MasterFile::geometry() const { return m_geometry; }
|
||||||
|
|
||||||
|
size_t Hdf5MasterFile::n_modules() const {
|
||||||
|
return m_geometry.row * m_geometry.col;
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<uint8_t> Hdf5MasterFile::quad() const { return m_quad; }
|
std::optional<uint8_t> Hdf5MasterFile::quad() const { return m_quad; }
|
||||||
|
|
||||||
// optional values, these may or may not be present in the master file
|
// optional values, these may or may not be present in the master file
|
||||||
|
Loading…
x
Reference in New Issue
Block a user