diff --git a/writer/FileWriter.cpp b/writer/FileWriter.cpp index f46c4a32..c57119a7 100644 --- a/writer/FileWriter.cpp +++ b/writer/FileWriter.cpp @@ -81,7 +81,7 @@ void FileWriter::WriteHDF5(const DataMessage& msg) { files.resize(file_number + 1); if (!files[file_number]) { - files[file_number] = std::make_unique(start_message, file_number); + files[file_number] = std::make_unique(start_message, file_number, true); if (format == FileWriterFormat::NXmxIntegrated && master_file) files[file_number]->CreateFile(msg, master_file->GetFile()); } diff --git a/writer/HDF5DataFile.cpp b/writer/HDF5DataFile.cpp index 49626a9f..811b4675 100644 --- a/writer/HDF5DataFile.cpp +++ b/writer/HDF5DataFile.cpp @@ -20,7 +20,8 @@ #include "HDF5NXmx.h" #include "../common/time_utc.h" -HDF5DataFile::HDF5DataFile(const StartMessage &msg, uint64_t in_file_number) { +HDF5DataFile::HDF5DataFile(const StartMessage &msg, uint64_t in_file_number, bool write_images) : +write_images(write_images){ file_number = in_file_number; if (msg.overwrite.has_value()) @@ -110,7 +111,6 @@ HDF5DataFile::~HDF5DataFile() { if (data_file) { try { data_set.reset(); - data_set_image_number.reset(); data_file.reset(); if (manage_file) { std::error_code ec; @@ -124,42 +124,44 @@ HDF5DataFile::~HDF5DataFile() { } } -void HDF5DataFile::CreateFile(const DataMessage& msg, std::shared_ptr in_data_file, bool integrated) { - HDF5Dcpl dcpl; - - HDF5DataType data_type(msg.image.GetMode()); - - xpixel = msg.image.GetWidth(); - ypixel = msg.image.GetHeight(); - - dcpl.SetCompression(msg.image.GetCompressionAlgorithm(), JFJochBitShuffleCompressor::DefaultBlockSize); - dcpl.SetChunking( {1, ypixel, xpixel}); - - H5Pset_fill_time(dcpl.GetID(), H5D_FILL_TIME_NEVER); - H5Pset_alloc_time(dcpl.GetID(), H5D_ALLOC_TIME_INCR); - - switch (msg.image.GetMode()) { - case CompressedImageMode::Int8: - dcpl.SetFillValue8(INT8_MIN); - break; - case CompressedImageMode::Int16: - dcpl.SetFillValue16(INT16_MIN); - break; - case CompressedImageMode::Int32: - dcpl.SetFillValue32(INT32_MIN); - break; - default: - break; - } - +void HDF5DataFile::CreateFile(const DataMessage& msg, std::shared_ptr in_data_file) { data_file = in_data_file; HDF5Group(*data_file, "/entry").NXClass("NXentry"); - HDF5Group(*data_file, "/entry/data").NXClass("NXdata"); + if (write_images) { + HDF5Dcpl dcpl; + + HDF5DataType data_type(msg.image.GetMode()); + + xpixel = msg.image.GetWidth(); + ypixel = msg.image.GetHeight(); + + dcpl.SetCompression(msg.image.GetCompressionAlgorithm(), JFJochBitShuffleCompressor::DefaultBlockSize); + dcpl.SetChunking( {1, ypixel, xpixel}); + + H5Pset_fill_time(dcpl.GetID(), H5D_FILL_TIME_NEVER); + H5Pset_alloc_time(dcpl.GetID(), H5D_ALLOC_TIME_INCR); + + switch (msg.image.GetMode()) { + case CompressedImageMode::Int8: + dcpl.SetFillValue8(INT8_MIN); + break; + case CompressedImageMode::Int16: + dcpl.SetFillValue16(INT16_MIN); + break; + case CompressedImageMode::Int32: + dcpl.SetFillValue32(INT32_MIN); + break; + default: + break; + } + + HDF5Group(*data_file, "/entry/data").NXClass("NXdata"); + HDF5DataSpace data_space({1, ypixel, xpixel}, {H5S_UNLIMITED, ypixel, xpixel}); + data_set = std::make_unique(*data_file, "/entry/data/data", data_type, data_space, dcpl); + data_set->SetExtent({images_per_file, ypixel, xpixel}); + } - HDF5DataSpace data_space({1, ypixel, xpixel}, {H5S_UNLIMITED, ypixel, xpixel}); - data_set = std::make_unique(*data_file, "/entry/data/data", data_type, data_space, dcpl); - data_set->SetExtent({images_per_file, ypixel, xpixel}); for (auto &p: plugins) p->OpenFile(*data_file, msg, images_per_file); } @@ -186,7 +188,8 @@ void HDF5DataFile::Write(const DataMessage &msg, uint64_t image_number) { } nimages++; - data_set->WriteDirectChunk(msg.image.GetCompressed(), msg.image.GetCompressedSize(), {image_number, 0, 0}); + if (data_set) + data_set->WriteDirectChunk(msg.image.GetCompressed(), msg.image.GetCompressedSize(), {image_number, 0, 0}); for (auto &p: plugins) p->Write(msg, image_number); diff --git a/writer/HDF5DataFile.h b/writer/HDF5DataFile.h index 1346a333..334208c2 100644 --- a/writer/HDF5DataFile.h +++ b/writer/HDF5DataFile.h @@ -27,7 +27,6 @@ class HDF5DataFile { std::shared_ptr data_file = nullptr; std::unique_ptr data_set = nullptr; - std::unique_ptr data_set_image_number = nullptr; std::vector> plugins; size_t images_per_file; size_t xpixel; @@ -49,14 +48,15 @@ class HDF5DataFile { int64_t file_number; bool new_file = true; bool manage_file = false; + const bool write_images; public: - HDF5DataFile(const StartMessage &msg, uint64_t file_number); + HDF5DataFile(const StartMessage &msg, uint64_t file_number, bool write_images); ~HDF5DataFile(); std::optional Close(); void Write(const DataMessage& msg, uint64_t image_number); size_t GetNumImages() const; - void CreateFile(const DataMessage& msg, std::shared_ptr data_file, bool integrated = false); + void CreateFile(const DataMessage& msg, std::shared_ptr data_file); }; #endif //HDF5DATAFILE_H