DataMessage: use it in ZMQImagePuller, StreamWriter, HDF5DataFile, HDF5Writer

This commit is contained in:
2023-04-10 20:35:33 +02:00
parent b70382e05a
commit aefe95920c
15 changed files with 111 additions and 92 deletions
+32 -36
View File
@@ -1,8 +1,6 @@
// Copyright (2019-2022) Paul Scherrer Institute
// SPDX-License-Identifier: GPL-3.0-or-later
#include <cstdio>
#include "HDF5DataFile.h"
#include "../compression/JFJochCompressor.h"
@@ -36,6 +34,7 @@ HDF5DataFile::~HDF5DataFile() {
group.SaveVector("peakXPosRaw", spot_x, dims, CompressionAlgorithm::BSHUF_LZ4);
group.SaveVector("peakYPosRaw", spot_y, dims, CompressionAlgorithm::BSHUF_LZ4);
group.SaveVector("peakTotalIntensity", spot_intensity, dims, CompressionAlgorithm::BSHUF_LZ4);
group.SaveVector("indexingResult", indexing_result);
}
data_file.reset();
@@ -48,46 +47,43 @@ void HDF5DataFile::CreateFile() {
HDF5DataSpace data_space({1, ypixel, xpixel},{H5S_UNLIMITED, ypixel, xpixel});
data_set = std::make_unique<HDF5DataSet>(*data_file, "/entry/data/data", data_type, data_space, dcpl);
spot_count.resize(1);
spot_x.resize(max_spots);
spot_y.resize(max_spots);
spot_intensity.resize(max_spots);
indexing_result.resize(1);
}
void HDF5DataFile::WriteImage(const void *data, size_t data_size, uint64_t image_number) {
if (image_number > max_image_number) {
max_image_number = image_number;
data_set->SetExtent({max_image_number+1, ypixel, xpixel});
}
nimages++;
data_set->WriteDirectChunk(data, data_size, {image_number, 0, 0});
}
void HDF5DataFile::WriteSpots(const std::vector<SpotToSave> &spots, uint64_t image_number) {
std::unique_lock<std::mutex> ul(spot_mutex);
size_t cnt = std::min(spots.size(), max_spots);
if (spot_count.size() < image_number + 1) {
spot_count.resize(image_number + 1);
spot_x.resize(max_spots * (image_number + 1));
spot_y.resize(max_spots * (image_number + 1));
spot_intensity.resize(max_spots * (image_number + 1));
}
spot_count[image_number] = cnt;
for (int i = 0; i < cnt; i++) {
spot_x[max_spots * image_number + i] = spots[i].x;
spot_y[max_spots * image_number + i] = spots[i].y;
spot_intensity[max_spots * image_number + i] = spots[i].intensity;
}
}
void HDF5DataFile::Write(const void *data, size_t data_size, const std::vector<SpotToSave> &spots,
uint64_t image_number) {
void HDF5DataFile::Write(const DataMessage &msg, uint64_t image_number) {
std::lock_guard<std::mutex> lock(hdf5_mutex);
if (!data_file)
CreateFile();
WriteImage(data, data_size, image_number);
if (!spots.empty())
WriteSpots(spots, image_number);
if (image_number > max_image_number) {
max_image_number = image_number;
data_set->SetExtent({max_image_number+1, ypixel, xpixel});
spot_count.resize(max_image_number + 1);
spot_x.resize(max_spots * (max_image_number + 1));
spot_y.resize(max_spots * (max_image_number + 1));
spot_intensity.resize(max_spots * (max_image_number + 1));
indexing_result.resize(max_image_number + 1);
}
nimages++;
data_set->WriteDirectChunk(msg.image.data, msg.image.size, {image_number, 0, 0});
size_t cnt = std::min(msg.spots.size(), max_spots);
spot_count[image_number] = cnt;
for (int i = 0; i < cnt; i++) {
spot_x[max_spots * image_number + i] = msg.spots[i].x;
spot_y[max_spots * image_number + i] = msg.spots[i].y;
spot_intensity[max_spots * image_number + i] = msg.spots[i].intensity;
}
indexing_result[image_number] = msg.indexing_result;
}
size_t HDF5DataFile::GetMaxImageNumber() const {