19#include "gtest/gtest.h"
20#include <gmock/gmock-matchers.h>
21#include <gmock/gmock-spec-builders.h>
35 using Channel = Digitizing::AbstractChannel;
36 using Digitizing::PaddleSignal;
37 using NeulandPaddle = Digitizing::Neuland::Paddle;
41 template <
typename Type>
42 using Pair = Digitizing::LRPair<Type>;
44 class testNeulandPaddle :
public ::testing::Test
47 testNeulandPaddle() =
default;
51 auto leftChannel = std::make_unique<GMockChannel>(Side::left);
52 auto rightChannel = std::make_unique<GMockChannel>(Side::right);
53 leftChannel->DelegateToFake();
54 rightChannel->DelegateToFake();
55 channels_.left = leftChannel.get();
56 channels_.right = rightChannel.get();
57 paddle_->SetChannel(std::move(leftChannel));
58 paddle_->SetChannel(std::move(rightChannel));
71 void AddChannelSignal(
const double& time,
const double& energy)
73 auto signal = Channel::Hit{};
76 signal.qdcUnSat = energy;
78 if constexpr (side == Side::right)
80 channelSignals_.right.push_back(signal);
84 channelSignals_.left.push_back(signal);
89 auto ExtractChannelSignals()
91 if constexpr (side == Side::right)
93 return std::move(channelSignals_.right);
97 return std::move(channelSignals_.left);
100 [[nodiscard]]
auto GetChannels() const -> const auto& {
return channels_; }
101 [[nodiscard]]
auto GetPaddle() const -> auto* {
return paddle_.get(); }
104 std::unique_ptr<NeulandPaddle> paddle_ = std::make_unique<NeulandPaddle>(0);
105 Pair<std::vector<Channel::Hit>> channelSignals_;
106 Pair<GMockChannel*> channels_ = {
nullptr,
nullptr };
109 TEST_F(testNeulandPaddle, check_inputN_to_channel)
111 auto* paddle = GetPaddle();
112 paddle->DepositLight(PaddleSignal{ 10., 20., 0. });
113 paddle->DepositLight(PaddleSignal{ 10., 20., 0. });
114 paddle->DepositLight(PaddleSignal{ 20., 0., 0. });
115 EXPECT_CALL(*GetChannels().left, construct_hits(testing::_)).Times(1);
116 EXPECT_CALL(*GetChannels().right, construct_hits(testing::_)).Times(1);
118 const auto& leftHits = GetChannels().left->hits_;
119 const auto& rightHits = GetChannels().right->hits_;
120 ASSERT_EQ(leftHits.size(), rightHits.size()) <<
"Numbers of hits of both PMT channels don't match!";
121 ASSERT_EQ(leftHits.size(), 3) <<
"Number of hits for a PMT channel doesn't match with paddle inputs";
124 TEST_F(testNeulandPaddle, check_light_attenuation)
126 auto* paddle = GetPaddle();
127 auto const inputE = 20.;
128 auto paddle_signal = PaddleSignal{ 10., inputE, 0 };
129 paddle->DepositLight(paddle_signal);
130 EXPECT_CALL(*GetChannels().left, construct_hits(testing::_)).Times(1);
131 EXPECT_CALL(*GetChannels().right, construct_hits(testing::_)).Times(1);
133 const auto& leftHits = GetChannels().left->hits_;
134 const auto& rightHits = GetChannels().right->hits_;
135 ASSERT_LT(leftHits[0].intensity, inputE) <<
"No light attenuation for the left channel!";
136 ASSERT_LT(rightHits[0].intensity, inputE) <<
"No light attenuation for the right channel!";
139 TEST_F(testNeulandPaddle, check_positive_direction)
141 auto* paddle = GetPaddle();
142 auto const inputE = 20.;
143 auto const initPos = 0.8 * NeulandPaddle::HALF_BAR_LENGTH;
144 auto paddle_signal = PaddleSignal{ 10., inputE, initPos };
145 paddle->DepositLight(paddle_signal);
146 EXPECT_CALL(*GetChannels().left, construct_hits(testing::_)).Times(1);
147 EXPECT_CALL(*GetChannels().right, construct_hits(testing::_)).Times(1);
149 const auto& leftHits = GetChannels().left->hits_;
150 const auto& rightHits = GetChannels().right->hits_;
151 ASSERT_LT(leftHits[0].intensity, rightHits[0].intensity)
152 <<
"left channel has larger light input with longer distance!";
153 ASSERT_GT(leftHits[0].time, rightHits[0].time) <<
"light hit left channel ealier with longer distance!";
156 TEST_F(testNeulandPaddle, check_coupling_counts)
158 auto* paddle = GetPaddle();
159 paddle->DepositLight(PaddleSignal{ 10., 20., 0.5 * NeulandPaddle::HALF_BAR_LENGTH });
160 paddle->DepositLight(PaddleSignal{ 60., 10., -0.3 * NeulandPaddle::HALF_BAR_LENGTH });
161 EXPECT_CALL(*GetChannels().left, construct_hits(testing::_)).Times(1);
162 EXPECT_CALL(*GetChannels().right, construct_hits(testing::_)).Times(1);
170 const auto& signals = paddle->GetHits();
171 ASSERT_EQ(signals.size(), 2) <<
"Fail to reconstruct the same number of signals!";
174 TEST_F(testNeulandPaddle, check_output_singal)
176 auto* paddle = GetPaddle();
177 paddle->DepositLight(PaddleSignal{ 10., 20., 0.5 * NeulandPaddle::HALF_BAR_LENGTH });
178 EXPECT_CALL(*GetChannels().left, construct_hits(testing::_)).Times(1);
179 EXPECT_CALL(*GetChannels().right, construct_hits(testing::_)).Times(1);
185 auto const& signals = paddle->GetHits();
186 ASSERT_EQ(signals.size(), 1) <<
"Fail to reconstruct the same number of signals!";
187 const double err = 0.1 * 0.5 * NeulandPaddle::HALF_BAR_LENGTH;
188 ASSERT_NEAR(0.5 * NeulandPaddle::HALF_BAR_LENGTH, signals.front().position, err)
189 <<
"reconstructed position is way different to predefined position!";
192 TEST_F(testNeulandPaddle, check_reset)
194 auto* paddle = GetPaddle();
195 paddle->DepositLight(PaddleSignal{ 10., 20., 0.5 * NeulandPaddle::HALF_BAR_LENGTH });
196 EXPECT_CALL(*GetChannels().left, construct_hits(testing::_)).Times(2);
197 EXPECT_CALL(*GetChannels().right, construct_hits(testing::_)).Times(2);
199 EXPECT_EQ(paddle->GetHits().size(), 1);
202 EXPECT_EQ(paddle->GetHits().size(), 0);