// Copyright (2019-2022) Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-or-later #include #include "../jungfrau/ProcessJFPacket.h" #include "../jungfrau/jf_packet.h" #include "../common/DiffractionExperiment.h" TEST_CASE("ProcessRawPacketTest_Empty") { ThreadSafeFIFO c_fifo; ThreadSafeFIFO wr_fifo; { ProcessJFPacket process(c_fifo, wr_fifo, 2); REQUIRE(process.GetCounter() == 0); } REQUIRE(c_fifo.Size() == 0); } TEST_CASE("ProcessRawPacketTest") { ThreadSafeFIFO c_fifo; ThreadSafeFIFO wr_fifo; std::vector array_0(RAW_MODULE_SIZE), array_1(RAW_MODULE_SIZE), array_2(RAW_MODULE_SIZE); wr_fifo.Put(WorkRequest{.ptr = array_0.data(), .handle = 0}); wr_fifo.Put(WorkRequest{.ptr = array_1.data(), .handle = 1}); wr_fifo.Put(WorkRequest{.ptr = array_2.data(), .handle = 2}); DiffractionExperiment experiment(DetectorGeometry(8)); experiment.DataStreams(2); { ProcessJFPacket process(c_fifo, wr_fifo, 4); jf_udp_payload datagram; datagram.packetnum = 36; datagram.framenum = 1; datagram.bunchid = 84; datagram.data[0] = 6789; datagram.xCoord = 4; process.ProcessPacket(&datagram); datagram.packetnum = 36; datagram.framenum = 2; datagram.bunchid = 84; datagram.data[0] = 6345; datagram.xCoord = 5; process.ProcessPacket(&datagram); datagram.packetnum = 16; datagram.framenum = 3; datagram.bunchid = 84; datagram.data[0] = 6346; datagram.xCoord = 7; process.ProcessPacket(&datagram); REQUIRE(process.GetCounter() == 3); } REQUIRE(c_fifo.Size() == 3); Completion c; REQUIRE(c_fifo.Get(c)); CHECK(c.module_number == 2); CHECK(c.bunchid == 84); CHECK(c.frame_number == 0); CHECK(c.packet_count == 1); CHECK(c.packet_mask[0] == (1LU << 36)); CHECK(c.packet_mask[1] == 0); REQUIRE(c_fifo.Get(c)); CHECK(c.module_number == 2); CHECK(c.bunchid == 84); CHECK(c.frame_number == 1); CHECK(c.packet_count == 1); CHECK(c.packet_mask[0] == 0); CHECK(c.packet_mask[1] == (1LU << 36)); REQUIRE(c_fifo.Get(c)); CHECK(c.module_number == 3); CHECK(c.bunchid == 84); CHECK(c.frame_number == 2); CHECK(c.packet_count == 1); CHECK(c.packet_mask[0] == 0); CHECK(c.packet_mask[1] == (1LU << 16)); CHECK(array_0[4096*36] == 6789); CHECK(array_1[4096*(36+64)] == 6345); CHECK(array_2[4096*(16+64)] == 6346); } TEST_CASE("ProcessRawPacketTest_Conversion") { ThreadSafeFIFO c_fifo; ThreadSafeFIFO wr_fifo; std::vector array_0(RAW_MODULE_SIZE); wr_fifo.Put(WorkRequest{.ptr = array_0.data(), .handle = 0}); DiffractionExperiment experiment(DetectorGeometry(8)); experiment.DataStreams(2).PhotonEnergy_keV(2); JFCalibration calibration(experiment); calibration.Pedestal(6, 0, 0).GetPedestal()[4096*36] = 300; calibration.Pedestal(6, 1, 0).GetPedestal()[4096*36+1] = 15000; calibration.Pedestal(6, 2, 0).GetPedestal()[4096*36+2] = 14000; { ProcessJFPacket process(c_fifo, wr_fifo, 4); REQUIRE_NOTHROW(process.RegisterConversion(experiment, calibration, 1)); jf_udp_payload datagram; datagram.packetnum = 36; datagram.framenum = 2; datagram.bunchid = 84; datagram.data[0] = 600; datagram.data[1] = 16384 | 4000; datagram.data[2] = 32768 | 16384 | 9000; datagram.xCoord = 4; process.ProcessPacket(&datagram); REQUIRE(process.GetCounter() == 1); } CHECK(array_0[4096*36] == std::round((600 - 300) / (DEFAULT_G0_FACTOR*2))); CHECK(array_0[4096*36+1] == std::round((4000 - 15000) / (DEFAULT_G1_FACTOR*2))); CHECK(array_0[4096*36+2] == std::round((9000 - 14000) / (DEFAULT_G2_FACTOR*2))); }