Files
Jungfraujoch/tests/MockAcquisitionDeviceTest.cpp

108 lines
3.9 KiB
C++

// Copyright (2019-2022) Paul Scherrer Institute
// SPDX-License-Identifier: GPL-3.0-or-later
#include <catch2/catch.hpp>
#include "../receiver/MockAcquisitionDevice.h"
#include "../receiver/JFJochReceiverTest.h"
TEST_CASE("MockAcquisitionDevice") {
std::vector<uint16_t> module_data(RAW_MODULE_SIZE, 765);
DiffractionExperiment experiment(DetectorGeometry(8, 2));
experiment.DataStreams(2);
experiment.NumTriggers(1).ImagesPerTrigger(5);
MockAcquisitionDevice device(0, 128);
device.StartAction(experiment);
device.AddModule(1,0,module_data.data());
device.AddModule(1,1,module_data.data());
device.AddModule(4,0,module_data.data());
device.AddModule(5,1,module_data.data());
device.Terminate();
device.WaitForActionComplete();
JFJochProtoBuf::AcquisitionDeviceStatistics device_statistics;
REQUIRE_NOTHROW(device.SaveStatistics(experiment, device_statistics));
REQUIRE(memcmp(device.GetFrameBuffer(0,0), module_data.data(),
RAW_MODULE_SIZE * sizeof(uint16_t)) == 0);
REQUIRE(memcmp(device.GetFrameBuffer(0,1), module_data.data(),
RAW_MODULE_SIZE * sizeof(uint16_t)) == 0);
REQUIRE(memcmp(device.GetFrameBuffer(3,0), module_data.data(),
RAW_MODULE_SIZE * sizeof(uint16_t)) == 0);
REQUIRE(memcmp(device.GetFrameBuffer(4,1), module_data.data(),
RAW_MODULE_SIZE * sizeof(uint16_t)) == 0);
}
TEST_CASE("JFJochReceiverTest_Raw_MockAcquisitionDevice", "[JFJochReceiver]") {
Logger logger("JFJochReceiverTest_Raw_MockAcquisitionDevice");
logger.Verbose(true);
std::mt19937 g1(1387);
std::uniform_int_distribution<uint16_t> dist(0, 65535);
DiffractionExperiment x(DetectorGeometry(4));
const uint16_t nthreads = 4;
std::vector<uint16_t> test_frame(RAW_MODULE_SIZE);
x.Mode(DetectorMode::Raw);
x.PedestalG0Frames(0).NumTriggers(1).UseInternalPacketGenerator(true)
.ImagesPerTrigger(100).DataFileCount(16).PhotonEnergy_keV(12.4).Compression(JFJochProtoBuf::NO_COMPRESSION);
std::vector<std::unique_ptr<AcquisitionDevice>> aq_devices;
for (int i = 0; i < x.GetDataStreamsNum(); i++) {
for (auto &j: test_frame)
j = dist(g1);
auto *test = new MockAcquisitionDevice(i, 64);
test->EnableLogging(&logger);
test->SetCustomInternalGeneratorFrame(test_frame);
aq_devices.emplace_back(test);
}
JFJochProtoBuf::ReceiverOutput output;
bool ret;
REQUIRE_NOTHROW(ret = JFJochReceiverTest(output, logger, aq_devices, x, nthreads, false));
REQUIRE(ret);
REQUIRE(output.efficiency() == 1.0);
REQUIRE(output.images_sent() == x.GetImageNum());
REQUIRE(output.compressed_ratio() == 1.0);
REQUIRE(output.compressed_size() == x.GetImageNum() * x.GetPixelDepth() * x.GetPixelsNum());
REQUIRE(output.max_image_number_sent() == x.GetImageNum() - 1);
REQUIRE(!output.cancelled());
}
TEST_CASE("JFJochReceiverTest_Conversion_MockAcquisitionDevice", "[JFJochReceiver]") {
Logger logger("JFJochReceiverTest_Conversion");
DiffractionExperiment x(DetectorGeometry(8));
const uint16_t nthreads = 4;
x.Mode(DetectorMode::Conversion);
x.PedestalG0Frames(0).NumTriggers(1).UseInternalPacketGenerator(true).DataStreams(x.GetModulesNum())
.ImagesPerTrigger(32).DataFileCount(16).PhotonEnergy_keV(12.4).Compression(JFJochProtoBuf::BSHUF_ZSTD);
std::vector<std::unique_ptr<AcquisitionDevice>> aq_devices;
for (int i = 0; i < x.GetDataStreamsNum(); i++) {
AcquisitionDevice *test;
test = new MockAcquisitionDevice(i, 64);
test->EnableLogging(&logger);
aq_devices.emplace_back(test);
}
JFJochProtoBuf::ReceiverOutput output;
bool ret;
REQUIRE_NOTHROW(ret = JFJochReceiverTest(output, logger, aq_devices, x, nthreads, false));
REQUIRE(ret);
REQUIRE(output.efficiency() == 1.0);
REQUIRE(output.images_sent() == x.GetImageNum());
REQUIRE(!output.cancelled());
}