112 lines
3.6 KiB
C++
112 lines
3.6 KiB
C++
// Copyright (2019-2023) Paul Scherrer Institute
|
|
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
#include "../writer/HDF5Objects.h"
|
|
#include "../common/Logger.h"
|
|
#include "../receiver/FrameTransformation.h"
|
|
#include "../common/RawToConvertedGeometry.h"
|
|
#include "../image_pusher/ZMQStream2Pusher.h"
|
|
|
|
#define BASE_TCP_PORT 8000
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
Logger logger("jfjoch_writer_test");
|
|
|
|
RegisterHDF5Filter();
|
|
|
|
if (argc != 4) {
|
|
std::cout << "Usage: ./jfjoch_writer_test <JF4M hdf5 file> <#images> <# of sockets>" << std::endl;
|
|
std::cout << std::endl;
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int64_t nimages_out = atoi(argv[2]);
|
|
int64_t nsockets = atoi(argv[3]);
|
|
|
|
DiffractionExperiment x(DetectorGeometry(8, 2, 8, 36));
|
|
x.Summation(1).ImagesPerTrigger(nimages_out).Mode(DetectorMode::Conversion);
|
|
|
|
HDF5ReadOnlyFile data(argv[1]);
|
|
HDF5DataSet dataset(data, "/entry/data/data");
|
|
HDF5DataSpace file_space(dataset);
|
|
|
|
if (file_space.GetNumOfDimensions() != 3) {
|
|
logger.Error("/entry/data/data must be 3D");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
if ((file_space.GetDimensions()[1] == 2164) && (file_space.GetDimensions()[2] == 2068)) {
|
|
logger.Info("JF4M with gaps detected (2068 x 2164)");
|
|
} else {
|
|
logger.Error( "Unknown geometry - exiting");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
uint64_t nimages_in_file = file_space.GetDimensions()[0];
|
|
logger.Info("Number of images in the original dataset: " + std::to_string(nimages_in_file));
|
|
|
|
ZMQContext context;
|
|
context.NumThreads(4);
|
|
|
|
std::vector<std::string> zmq_addr;
|
|
for (int i = 0; i < nsockets; i++)
|
|
zmq_addr.emplace_back("tcp://0.0.0.0:" + std::to_string(BASE_TCP_PORT + i));
|
|
|
|
ZMQStream2Pusher pusher(zmq_addr);
|
|
|
|
FrameTransformation transformation(x);
|
|
|
|
std::vector<std::vector<char> > output(nimages_in_file);
|
|
std::vector<int64_t> output_size(nimages_in_file);
|
|
for (auto &i: output) i.resize(x.GetMaxCompressedSize());
|
|
|
|
std::vector<int16_t> image_tmp_conv( file_space.GetDimensions()[1] * file_space.GetDimensions()[2]);
|
|
std::vector<int16_t> image_tmp_raw(x.GetModulesNum() * RAW_MODULE_SIZE);
|
|
|
|
for (int i = 0; i < nimages_in_file; i++) {
|
|
std::vector<hsize_t> start = {(hsize_t)i,0,0};
|
|
std::vector<hsize_t> dim = {1,file_space.GetDimensions()[1], file_space.GetDimensions()[2]};
|
|
dataset.ReadVector(image_tmp_conv, start, dim);
|
|
|
|
ConvertedToRawGeometry(x,
|
|
image_tmp_raw.data(),
|
|
image_tmp_conv.data());
|
|
|
|
for (int j = 0; j < x.GetModulesNum(); j++)
|
|
transformation.ProcessModule(image_tmp_raw.data() + j * RAW_MODULE_SIZE, j, 0);
|
|
|
|
auto image = transformation.GetCompressedImage();
|
|
|
|
output_size[i] = image.size;
|
|
output[i].resize(image.size);
|
|
memcpy(output[i].data(), image.data, image.size);
|
|
}
|
|
|
|
logger.Info("Sending {} images", nimages_out);
|
|
|
|
std::vector<DiffractionSpot> empty_spot_vector;
|
|
|
|
StartMessage start_message;
|
|
x.FillMessage(start_message);
|
|
|
|
pusher.StartDataCollection(start_message);
|
|
|
|
std::vector<uint8_t> v(x.GetMaxCompressedSize() + 1024*1024);
|
|
|
|
for (int i = 0; i < nimages_out; i++) {
|
|
DataMessage data_message;
|
|
data_message.number = i;
|
|
PrepareCBORImage(data_message, x, output[i % nimages_in_file].data(), output_size[i % nimages_in_file]);
|
|
CBORStream2Serializer serializer(v.data(), v.size());
|
|
serializer.SerializeImage(data_message);
|
|
pusher.SendImage(v.data(), v.size(), i);
|
|
}
|
|
|
|
EndMessage end_message{};
|
|
pusher.EndDataCollection(end_message);
|
|
|
|
logger.Info("Sending done");
|
|
}
|