Some checks failed
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m11s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 9m9s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m18s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m14s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 10m3s
Build Packages / Generate python client (push) Successful in 15s
Build Packages / Build documentation (push) Successful in 50s
Build Packages / Create release (push) Has been skipped
Build Packages / build:rpm (rocky8) (push) Successful in 8m31s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 8m21s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 7m42s
Build Packages / build:rpm (rocky9) (push) Successful in 9m11s
Build Packages / Unit tests (push) Failing after 1h13m19s
This is an UNSTABLE release and not recommended for production use (please use rc.96 instead). * jfjoch_broker: For DECTRIS detectors add dark data collection during initialization for bad pixel mask * jfjoch_broker: Refactor of calibration logic for more clear code (likely to introduce problems) * jfjoch_viewer: Add option to handle user pixel mask (experimental) * jfjoch_viewer: More options for ROI * jfjoch_viewer: Add window to display calibration Reviewed-on: #2 Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch> Co-committed-by: Filip Leonarski <filip.leonarski@psi.ch>
189 lines
7.9 KiB
C++
189 lines
7.9 KiB
C++
// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#include <catch2/catch_all.hpp>
|
|
#include <filesystem>
|
|
|
|
#include "../writer/StreamWriter.h"
|
|
#include "../image_pusher/ZMQStream2Pusher.h"
|
|
#include "../receiver/JFJochReceiverService.h"
|
|
#include "../image_pusher/ZMQWriterNotificationPuller.h"
|
|
|
|
TEST_CASE("StreamWriterTest_ZMQ", "[StreamWriter]") {
|
|
RegisterHDF5Filter();
|
|
|
|
Logger logger("StreamWriterTest_ZMQ");
|
|
|
|
DiffractionExperiment x(DetJF(2));
|
|
x.FilePrefix("subdir/StreamWriterTest").NumTriggers(1).ImagesPerTrigger(5)
|
|
.UseInternalPacketGenerator(true).Raw().PedestalG0Frames(0).OverwriteExistingFiles(true);
|
|
|
|
PixelMask pixel_mask(x);
|
|
|
|
JFModuleGainCalibration gain;
|
|
AcquisitionDeviceGroup aq_devices;
|
|
for (int i = 0; i < x.GetDataStreamsNum(); i++)
|
|
aq_devices.AddHLSDevice(64);
|
|
|
|
ZMQStream2Pusher pusher({"ipc://*"});
|
|
JFJochReceiverService fpga_receiver_service(aq_devices, logger, pusher);
|
|
|
|
std::unique_ptr<StreamWriter> writer;
|
|
REQUIRE(x.GetImageNum() == 5);
|
|
auto pusher_addr = pusher.GetAddress();
|
|
REQUIRE(pusher_addr.size() == 1);
|
|
ZMQImagePuller puller(pusher_addr[0]);
|
|
REQUIRE_NOTHROW(writer = std::make_unique<StreamWriter>(logger, puller));
|
|
CHECK(writer->GetStatistics().state == StreamWriterState::Idle);
|
|
REQUIRE_NOTHROW(fpga_receiver_service.Start(x, pixel_mask, nullptr));
|
|
|
|
REQUIRE_NOTHROW(writer->Run());
|
|
|
|
REQUIRE_NOTHROW(fpga_receiver_service.Stop());
|
|
REQUIRE(fpga_receiver_service.GetStatus()->images_collected == 5);
|
|
REQUIRE(fpga_receiver_service.GetStatus()->images_sent == 5);
|
|
CHECK(writer->GetStatistics().state == StreamWriterState::Finalized);
|
|
CHECK(writer->GetStatistics().processed_images == 5);
|
|
CHECK(writer->GetStatistics().file_prefix == x.GetFilePrefix());
|
|
|
|
// HDF5 file can be opened
|
|
std::unique_ptr<HDF5ReadOnlyFile> file;
|
|
REQUIRE_NOTHROW(file = std::make_unique<HDF5ReadOnlyFile>("subdir/StreamWriterTest_data_000001.h5"));
|
|
std::unique_ptr<HDF5DataSet> dataset;
|
|
REQUIRE_NOTHROW(dataset = std::make_unique<HDF5DataSet>(*file, "/entry/data/data"));
|
|
std::unique_ptr<HDF5DataSpace> dataspace;
|
|
REQUIRE_NOTHROW(dataspace = std::make_unique<HDF5DataSpace>(*dataset));
|
|
|
|
REQUIRE(dataspace->GetNumOfDimensions() == 3);
|
|
REQUIRE(dataspace->GetDimensions()[0] == 5);
|
|
REQUIRE(dataspace->GetDimensions()[1] == RAW_MODULE_COLS);
|
|
REQUIRE(dataspace->GetDimensions()[2] == 2*RAW_MODULE_LINES);
|
|
|
|
REQUIRE(std::filesystem::remove("subdir/StreamWriterTest_master.h5"));
|
|
REQUIRE(std::filesystem::remove("subdir/StreamWriterTest_data_000001.h5"));
|
|
REQUIRE(std::filesystem::remove("subdir"));
|
|
}
|
|
|
|
TEST_CASE("StreamWriterTest_ZMQ_Update", "[StreamWriter]") {
|
|
RegisterHDF5Filter();
|
|
|
|
Logger logger("StreamWriterTest_ZMQ_Update");
|
|
|
|
DatasetSettings d;
|
|
d.FilePrefix("subdir/StreamWriterTest2").NumTriggers(1).ImagesPerTrigger(5).RunName("run1").RunNumber(256);
|
|
DiffractionExperiment x(DetJF(2));
|
|
x.UseInternalPacketGenerator(true).Raw().PedestalG0Frames(0)
|
|
.ImportDatasetSettings(d).OverwriteExistingFiles(true);
|
|
PixelMask pixel_mask(x);
|
|
|
|
JFModuleGainCalibration gain;
|
|
AcquisitionDeviceGroup aq_devices;
|
|
for (int i = 0; i < x.GetDataStreamsNum(); i++)
|
|
aq_devices.AddHLSDevice(64);
|
|
|
|
ZMQStream2Pusher pusher({"ipc://*"});
|
|
pusher.WriterNotificationSocket("ipc://*");
|
|
JFJochReceiverService fpga_receiver_service(aq_devices, logger, pusher);
|
|
|
|
std::unique_ptr<StreamWriter> writer;
|
|
REQUIRE(x.GetImageNum() == 5);
|
|
auto pusher_addr = pusher.GetAddress();
|
|
REQUIRE(pusher_addr.size() == 1);
|
|
|
|
ZMQImagePuller puller(pusher_addr[0]);
|
|
REQUIRE_NOTHROW(writer = std::make_unique<StreamWriter>(logger, puller));
|
|
CHECK(writer->GetStatistics().state == StreamWriterState::Idle);
|
|
REQUIRE_NOTHROW(fpga_receiver_service.Start(x, pixel_mask, nullptr));
|
|
|
|
REQUIRE_NOTHROW(writer->Run());
|
|
|
|
REQUIRE_NOTHROW(fpga_receiver_service.Stop());
|
|
REQUIRE(fpga_receiver_service.GetStatus()->images_collected == 5);
|
|
REQUIRE(fpga_receiver_service.GetStatus()->images_sent == 5);
|
|
CHECK(writer->GetStatistics().state == StreamWriterState::Finalized);
|
|
CHECK(writer->GetStatistics().processed_images == 5);
|
|
CHECK(writer->GetStatistics().file_prefix == x.GetFilePrefix());
|
|
|
|
// HDF5 file can be opened
|
|
std::unique_ptr<HDF5ReadOnlyFile> file;
|
|
REQUIRE_NOTHROW(file = std::make_unique<HDF5ReadOnlyFile>("subdir/StreamWriterTest2_data_000001.h5"));
|
|
std::unique_ptr<HDF5DataSet> dataset;
|
|
REQUIRE_NOTHROW(dataset = std::make_unique<HDF5DataSet>(*file, "/entry/data/data"));
|
|
std::unique_ptr<HDF5DataSpace> dataspace;
|
|
REQUIRE_NOTHROW(dataspace = std::make_unique<HDF5DataSpace>(*dataset));
|
|
|
|
REQUIRE(dataspace->GetNumOfDimensions() == 3);
|
|
REQUIRE(dataspace->GetDimensions()[0] == 5);
|
|
REQUIRE(dataspace->GetDimensions()[1] == RAW_MODULE_COLS);
|
|
REQUIRE(dataspace->GetDimensions()[2] == 2*RAW_MODULE_LINES);
|
|
|
|
REQUIRE(std::filesystem::remove("subdir/StreamWriterTest2_master.h5"));
|
|
REQUIRE(std::filesystem::remove("subdir/StreamWriterTest2_data_000001.h5"));
|
|
REQUIRE(std::filesystem::remove("subdir"));
|
|
}
|
|
|
|
TEST_CASE("StreamWriterTest_ZMQ_Update_NoNotification", "[StreamWriter]") {
|
|
// This tests simulates what happens if writer notification about writing end is missing
|
|
// Expected end result: receiver ends with an exception
|
|
|
|
RegisterHDF5Filter();
|
|
|
|
Logger logger("StreamWriterTest_ZMQ_Update_NoNotification");
|
|
|
|
DatasetSettings d;
|
|
d.FilePrefix("subdir/StreamWriterTest3").NumTriggers(1).ImagesPerTrigger(5).RunName("run1").RunNumber(256);
|
|
DiffractionExperiment x(DetJF(2));
|
|
x.UseInternalPacketGenerator(true).Raw().PedestalG0Frames(0)
|
|
.ImportDatasetSettings(d).OverwriteExistingFiles(true);
|
|
PixelMask pixel_mask(x);
|
|
|
|
JFModuleGainCalibration gain;
|
|
AcquisitionDeviceGroup aq_devices;
|
|
for (int i = 0; i < x.GetDataStreamsNum(); i++)
|
|
aq_devices.AddHLSDevice(64);
|
|
|
|
ZMQStream2Pusher pusher({"ipc://*"});
|
|
pusher.WriterNotificationSocket("ipc://*");
|
|
JFJochReceiverService fpga_receiver_service(aq_devices, logger, pusher);
|
|
|
|
std::unique_ptr<StreamWriter> writer;
|
|
REQUIRE(x.GetImageNum() == 5);
|
|
auto pusher_addr = pusher.GetAddress();
|
|
REQUIRE(pusher_addr.size() == 1);
|
|
|
|
ZMQImagePuller puller(pusher_addr[0]);
|
|
REQUIRE_NOTHROW(writer = std::make_unique<StreamWriter>(logger, puller));
|
|
writer->DebugSkipWriteNotification(true);
|
|
|
|
CHECK(writer->GetStatistics().state == StreamWriterState::Idle);
|
|
REQUIRE_NOTHROW(fpga_receiver_service.Start(x, pixel_mask, nullptr));
|
|
|
|
REQUIRE_NOTHROW(writer->Run());
|
|
|
|
JFJochReceiverOutput r;
|
|
REQUIRE_NOTHROW(r = fpga_receiver_service.Stop());
|
|
REQUIRE(!r.writer_err.empty());
|
|
REQUIRE(fpga_receiver_service.GetStatus()->images_collected == 5);
|
|
REQUIRE(fpga_receiver_service.GetStatus()->images_sent == 5);
|
|
CHECK(writer->GetStatistics().state == StreamWriterState::Finalized);
|
|
CHECK(writer->GetStatistics().processed_images == 5);
|
|
CHECK(writer->GetStatistics().file_prefix == x.GetFilePrefix());
|
|
|
|
// HDF5 file can be opened
|
|
std::unique_ptr<HDF5ReadOnlyFile> file;
|
|
REQUIRE_NOTHROW(file = std::make_unique<HDF5ReadOnlyFile>("subdir/StreamWriterTest3_data_000001.h5"));
|
|
std::unique_ptr<HDF5DataSet> dataset;
|
|
REQUIRE_NOTHROW(dataset = std::make_unique<HDF5DataSet>(*file, "/entry/data/data"));
|
|
std::unique_ptr<HDF5DataSpace> dataspace;
|
|
REQUIRE_NOTHROW(dataspace = std::make_unique<HDF5DataSpace>(*dataset));
|
|
|
|
REQUIRE(dataspace->GetNumOfDimensions() == 3);
|
|
REQUIRE(dataspace->GetDimensions()[0] == 5);
|
|
REQUIRE(dataspace->GetDimensions()[1] == RAW_MODULE_COLS);
|
|
REQUIRE(dataspace->GetDimensions()[2] == 2*RAW_MODULE_LINES);
|
|
|
|
REQUIRE(std::filesystem::remove("subdir/StreamWriterTest3_master.h5"));
|
|
REQUIRE(std::filesystem::remove("subdir/StreamWriterTest3_data_000001.h5"));
|
|
REQUIRE(std::filesystem::remove("subdir"));
|
|
}
|