Files
Jungfraujoch/tests/MockAcquisitionDeviceTest.cpp

103 lines
3.7 KiB
C++

// Copyright (2019-2023) Paul Scherrer Institute
#include <catch2/catch.hpp>
#include "../acquisition_device/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();
REQUIRE(memcmp(device.GetDeviceOutput(0,0)->pixels, module_data.data(),
RAW_MODULE_SIZE * sizeof(uint16_t)) == 0);
REQUIRE(memcmp(device.GetDeviceOutput(0,1)->pixels, module_data.data(),
RAW_MODULE_SIZE * sizeof(uint16_t)) == 0);
REQUIRE(memcmp(device.GetDeviceOutput(3,0)->pixels, module_data.data(),
RAW_MODULE_SIZE * sizeof(uint16_t)) == 0);
REQUIRE(memcmp(device.GetDeviceOutput(4,1)->pixels, 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(CompressionAlgorithm::NO_COMPRESSION);
AcquisitionDeviceGroup aq_devices;
for (int i = 0; i < x.GetDataStreamsNum(); i++) {
for (auto &j: test_frame)
j = dist(g1);
auto test = std::make_unique<MockAcquisitionDevice>(i, 64);
test->EnableLogging(&logger);
test->SetCustomInternalGeneratorFrame(test_frame);
aq_devices.Add(std::move(test));
}
JFJochReceiverOutput 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(CompressionAlgorithm::BSHUF_ZSTD);
AcquisitionDeviceGroup aq_devices;
for (int i = 0; i < x.GetDataStreamsNum(); i++) {
auto test = std::make_unique<MockAcquisitionDevice>(i, 64);
test->EnableLogging(&logger);
aq_devices.Add(std::move(test));
}
JFJochReceiverOutput 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);
}