16#include "gtest/gtest.h"
32 using ::testing::Return;
33 template <
typename Type>
36 class testNeulandPaddle :
public ::testing::Test
39 testNeulandPaddle() =
default;
43 auto leftChannel = std::make_unique<GMockChannel>(ChannelSide::left);
44 auto rightChannel = std::make_unique<GMockChannel>(ChannelSide::right);
45 channels_.left = leftChannel.get();
46 channels_.right = rightChannel.get();
47 EXPECT_CALL(*channels_.left, AttachToPaddle).Times(1);
48 EXPECT_CALL(*channels_.right, AttachToPaddle).Times(1);
49 paddle_->SetChannel(std::move(leftChannel));
50 paddle_->SetChannel(std::move(rightChannel));
62 template <ChannelS
ide s
ide>
63 void AddChannelSignal(
const double& time,
const double& energy)
65 auto signal = Channel::Signal{};
68 signal.qdcUnSat = energy;
70 if constexpr (side == ChannelSide::right)
72 channelSignals_.right.push_back(signal);
76 channelSignals_.left.push_back(signal);
80 template <ChannelS
ide s
ide>
81 auto ExtractChannelSignals()
83 if constexpr (side == ChannelSide::right)
85 return std::move(channelSignals_.right);
89 return std::move(channelSignals_.left);
92 [[nodiscard]]
const auto& GetChannels()
const {
return channels_; }
93 [[nodiscard]]
auto* GetPaddle()
const {
return paddle_.get(); }
96 std::unique_ptr<NeulandPaddle> paddle_ = std::make_unique<NeulandPaddle>(0);
97 Pair<std::vector<Channel::Signal>> channelSignals_;
98 Pair<GMockChannel*> channels_ = {
nullptr,
nullptr };
101 TEST_F(testNeulandPaddle, check_inputN_to_channel)
103 auto* paddle = GetPaddle();
104 paddle->DepositLight(PaddleHit{ 10., 20., 0. });
105 paddle->DepositLight(PaddleHit{ 10., 20., 0. });
106 paddle->DepositLight(PaddleHit{ 20., 0., 0. });
107 const auto& leftHits = GetChannels().left->hits_;
108 const auto& rightHits = GetChannels().right->hits_;
109 ASSERT_EQ(leftHits.size(), rightHits.size()) <<
"Numbers of hits of both PMT channels don't match!";
110 ASSERT_EQ(leftHits.size(), 3) <<
"Number of hits for a PMT channel doesn't match with paddle inputs";
113 TEST_F(testNeulandPaddle, check_light_attenuation)
115 auto* paddle = GetPaddle();
116 auto const inputE = 20.;
117 auto paddleHit = PaddleHit{ 10., inputE, 0 };
118 paddle->DepositLight(paddleHit);
119 const auto& leftHits = GetChannels().left->hits_;
120 const auto& rightHits = GetChannels().right->hits_;
121 ASSERT_LT(leftHits[0].light, inputE) <<
"No light attenuation for the left channel!";
122 ASSERT_LT(rightHits[0].light, inputE) <<
"No light attenuation for the right channel!";
125 TEST_F(testNeulandPaddle, check_positive_direction)
127 auto* paddle = GetPaddle();
128 auto const inputE = 20.;
130 auto paddleHit = PaddleHit{ 10., inputE, initPos };
131 paddle->DepositLight(paddleHit);
132 const auto& leftHits = GetChannels().left->hits_;
133 const auto& rightHits = GetChannels().right->hits_;
134 ASSERT_LT(leftHits[0].light, rightHits[0].light) <<
"left channel has larger light input with longer distance!";
135 ASSERT_GT(leftHits[0].time, rightHits[0].time) <<
"light hit left channel ealier with longer distance!";
138 TEST_F(testNeulandPaddle, check_coupling_counts)
140 auto* paddle = GetPaddle();
143 const auto& leftHits = GetChannels().left->hits_;
144 const auto& rightHits = GetChannels().right->hits_;
145 AddChannelSignal<ChannelSide::left>(leftHits[0].time, leftHits[0].light);
146 AddChannelSignal<ChannelSide::left>(leftHits[1].time, leftHits[1].light);
147 AddChannelSignal<ChannelSide::right>(rightHits[1].time, rightHits[1].light);
148 AddChannelSignal<ChannelSide::right>(rightHits[0].time, rightHits[0].light);
149 EXPECT_CALL(*GetChannels().left, ConstructSignals())
151 .WillOnce(Return(ExtractChannelSignals<ChannelSide::left>()));
152 EXPECT_CALL(*GetChannels().right, ConstructSignals())
154 .WillOnce(Return(ExtractChannelSignals<ChannelSide::right>()));
155 const auto& signals = paddle->GetSignals();
156 ASSERT_EQ(signals.size(), 2) <<
"Fail to reconstruct the same number of signals!";
159 TEST_F(testNeulandPaddle, check_output_singal)
161 auto* paddle = GetPaddle();
163 const auto& leftHits = GetChannels().left->hits_;
164 const auto& rightHits = GetChannels().right->hits_;
165 AddChannelSignal<ChannelSide::left>(leftHits[0].time, leftHits[0].light);
166 AddChannelSignal<ChannelSide::right>(rightHits[0].time, rightHits[0].light);
167 EXPECT_CALL(*GetChannels().left, ConstructSignals())
169 .WillOnce(Return(ExtractChannelSignals<ChannelSide::left>()));
170 EXPECT_CALL(*GetChannels().right, ConstructSignals())
172 .WillOnce(Return(ExtractChannelSignals<ChannelSide::right>()));
173 auto const& signals = paddle->GetSignals();
174 ASSERT_EQ(signals.size(), 1) <<
"Fail to reconstruct the same number of signals!";
177 <<
"reconstructed position is way different to predefined position!";
static constexpr double gHalfLength