From b6fbf1a3fddae809f203d053550bb50ec4f0e6f0 Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Sun, 19 Apr 2020 12:36:00 +0200 Subject: [PATCH] Fast H5Writer prototype --- core-buffer/include/FastH5Writer.hpp | 25 ++++++++ sf-buffer/src/sf_buffer.cpp | 90 ++++++++++++++-------------- 2 files changed, 69 insertions(+), 46 deletions(-) create mode 100644 core-buffer/include/FastH5Writer.hpp diff --git a/core-buffer/include/FastH5Writer.hpp b/core-buffer/include/FastH5Writer.hpp new file mode 100644 index 0000000..7b572fb --- /dev/null +++ b/core-buffer/include/FastH5Writer.hpp @@ -0,0 +1,25 @@ +#ifndef FASTH5WRITER_HPP +#define FASTH5WRITER_HPP + +#include + +template +class FastH5Writer { +public: + FastH5Writer( + const uint16_t n_frames_per_file, + const std::vector& frame_size + ); + + template void add_metadata(const std::string& metadata_name); + + void set_pulse_id(const uint64_t pulse_id); + + void write_data(const char* buffer); + template void write_metadata( + const std::string& name, const T& value); + +}; + + +#endif //FASTH5WRITER_HPP diff --git a/sf-buffer/src/sf_buffer.cpp b/sf-buffer/src/sf_buffer.cpp index e27dd02..11be596 100644 --- a/sf-buffer/src/sf_buffer.cpp +++ b/sf-buffer/src/sf_buffer.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "MetadataBuffer.hpp" #include "BufferedWriter.hpp" @@ -47,15 +48,15 @@ int main (int argc, char *argv[]) { const string str_latest_filename ( root_folder + "/" + device_name + "/LATEST"); - unordered_map header_values { - {"pulse_id", HeaderDataType("uint64")}, - {"frame_id", HeaderDataType("uint64")}, - {"daq_rec", HeaderDataType("uint32")}, - {"received_packets", HeaderDataType("uint16")}, - }; + FastH5Writer writer( + BufferUtils::FILE_MOD, + {512,1024} + ); - MetadataBuffer metadata_buffer(BufferUtils::FILE_MOD, header_values); - BufferedWriter writer("", BufferUtils::FILE_MOD, metadata_buffer); + writer.add_metadata("pulse_id"); + writer.add_metadata("frame_id"); + writer.add_metadata("daq_rec"); + writer.add_metadata("received_packets"); while (true) { auto data = ring_buffer.read(); @@ -67,47 +68,44 @@ int main (int argc, char *argv[]) { auto pulse_id = data.first->pulse_id; - auto frame_file = BufferUtils::get_filename( - root_folder, - device_name, - pulse_id); - - if (current_file != frame_file) { - // TODO: This executes only in first loop. Fix it. - if (writer.is_file_open()) { - - writer.write_metadata_to_file(); - - BufferUtils::update_latest_file( - str_latest_filename, current_file); - - writer.close_file(); - } - - current_file = frame_file; - - WriterUtils::create_destination_folder(current_file); - writer.create_file(current_file); - } - - auto file_frame_index = BufferUtils::get_file_frame_index(pulse_id); - - writer.write_data( - "image", file_frame_index, - data.second, {512,1024}, - JUNGFRAU_DATA_BYTES_PER_FRAME, "uint16", "little"); - - writer.cache_metadata("pulse_id", file_frame_index, - (char*) &(data.first->pulse_id)); - writer.cache_metadata("frame_id", file_frame_index, - (char*) &(data.first->frame_index)); - writer.cache_metadata("daq_rec", file_frame_index, - (char*) &(data.first->daq_rec)); - writer.cache_metadata("received_packets", file_frame_index, - (char*) &(data.first->n_recv_packets)); + writer.set_pulse_id(pulse_id); + writer.write_data(data.second); + writer.write_metadata("pulse_id", data.first->pulse_id); + writer.write_metadata("frame_id", data.first->frame_index); + writer.write_metadata("daq_rec", data.first->daq_rec); + writer.write_metadata( + "received_packets", data.first->n_recv_packets); ring_buffer.release(data.first->buffer_slot_index); + + // TODO: This is my writer problem. +// { +// auto frame_file = BufferUtils::get_filename( +// root_folder, +// device_name, +// pulse_id); +// +// if (current_file != frame_file) { +// // TODO: This executes only in first loop. Fix it. +// if (writer.is_file_open()) { +// +// writer.write_metadata_to_file(); +// +// BufferUtils::update_latest_file( +// str_latest_filename, current_file); +// +// writer.close_file(); +// } +// +// current_file = frame_file; +// +// WriterUtils::create_destination_folder(current_file); +// writer.create_file(current_file); +// } +// auto file_frame_index = BufferUtils::get_file_frame_index(pulse_id); +// } + // TODO: Make real statistics, please. n_stat_out++;