17#include "gtest/gtest.h"
25 using TmxChannel = Digitizing::Neuland::Tamex::Channel;
26 using FQTPeak = Digitizing::Neuland::Tamex::FQTPeak;
27 using PMTPeak = Digitizing::Neuland::Tamex::PMTPeak;
28 using Channel = Digitizing::AbstractChannel;
29 using TmxPar = Digitizing::Neuland::Tamex::Params;
31 class testNeulandTamexChannel :
public ::testing::Test
34 testNeulandTamexChannel()
35 : channel_{ std::make_unique<TmxChannel>(R3B::
Side::
left) }
37 auto par = channel_->GetPar();
39 channel_->SetPar(par);
42 void SetUp()
override {}
44 void SetPar(
const TmxPar& par) { channel_->SetPar(par); }
46 void Construct() { channel_->Construct(); }
48 [[nodiscard]]
auto GetChannel() const -> TmxChannel* {
return channel_.get(); }
50 [[nodiscard]]
auto GetPar() const -> const TmxPar& {
return channel_->GetPar(); }
52 static void SetChannelPar(TmxPar& par)
55 par.saturation_coefficient = 0.012;
56 par.experimental_data_is_corrected_for_saturation =
true;
57 par.energy_gain = 15.0;
61 par.min_energy = 0.67;
64 void AddSignal(
double time,
double light) { channel_->add_signal({ time, light }); }
66 [[nodiscard]]
auto GetSignals() const -> const Channel::Hits& {
return channel_->GetHits(); }
67 [[nodiscard]]
auto GetPMTPeaks() const -> const std::vector<PMTPeak>& {
return channel_->GetPMTPeaks(); }
68 [[nodiscard]]
auto GetPeaks() const -> const std::vector<FQTPeak>& {
return channel_->GetFQTPeaks(); }
71 std::unique_ptr<TmxChannel> channel_ =
nullptr;
74 TEST_F(testNeulandTamexChannel, basic_hit_processing)
79 auto signals = GetSignals();
80 auto peaks = GetPeaks();
83 ASSERT_EQ(peaks.size(), 1) <<
"no peak is generated!";
84 ASSERT_EQ(signals.size(), 1) <<
"No channel signal is outputted!";
87 ASSERT_LT(peaks[0].GetEnergy(), 20.) <<
"PMT saturation is not implemented!";
88 ASSERT_NE(signals[0].tdc, 20.) <<
"tdc value is not smeared!";
91 TEST_F(testNeulandTamexChannel, pmt_threshold_check)
95 auto signals = GetSignals();
96 auto peaks = GetPeaks();
97 ASSERT_EQ(signals.size(), 0) <<
"PMT threshold doesn't filter out low energy signals!";
100 TEST_F(testNeulandTamexChannel, pmt_threshold_overlap)
107 auto signals = GetSignals();
108 auto peaks = GetPeaks();
109 ASSERT_EQ(signals.size(), 1) <<
"overlapped signals cannot pass PMT threshold!";
112 TEST_F(testNeulandTamexChannel, ifno_timeRes_check)
120 const auto& signals = GetSignals();
121 ASSERT_DOUBLE_EQ(signals[0].tdc, 20.) <<
"tdc value is not correctly passed on!";
124 TEST_F(testNeulandTamexChannel, signal_pileup_check)
129 ASSERT_EQ(GetSignals().size(), 1) <<
"overlapping failed!";
131 auto width = GetPeaks().back().GetToT();
132 AddSignal(width + 21., 1.5);
134 ASSERT_EQ(GetSignals().size(), 2) <<
"should not be overlapped!";
139 TEST_F(testNeulandTamexChannel, signal_multiPileup_check)
143 ASSERT_EQ(GetSignals().size(), 1);
144 AddSignal(GetPeaks().back().GetTETime() + 5., 5.);
146 ASSERT_EQ(GetSignals().size(), 2);
147 AddSignal(GetPeaks().back().GetTETime() + 5., 5.);
149 ASSERT_EQ(GetSignals().size(), 3);
150 AddSignal(GetPeaks().back().GetTETime() + 5., 5.);
152 ASSERT_EQ(GetSignals().size(), 4);
153 AddSignal(GetPeaks().back().GetTETime() + 5., 5.);
155 ASSERT_EQ(GetSignals().size(), 5);
156 auto minTime = GetPeaks().front().GetLETime();
157 auto maxTime = GetPeaks().back().GetTETime();
158 auto qdc_test = FQTPeak::ToT2Energy(maxTime - minTime + 10., GetPar());
159 AddSignal(minTime - 5., qdc_test);
161 ASSERT_EQ(GetSignals().size(), 1);
164 constexpr auto AssessReduction(
double inE,
double outE) {
return (inE - outE) / inE; }
166 TEST_F(testNeulandTamexChannel, PMT_saturation_check)
168 const auto lowE = 10.;
169 const auto highE = 40.;
171 AddSignal(20., lowE);
172 AddSignal(200., highE);
174 const auto& pmtSignals = GetPMTPeaks();
175 ASSERT_EQ(pmtSignals.size(), 2);
176 const auto lowE_out = pmtSignals[0].GetHeight();
177 const auto highE_out = pmtSignals[1].GetHeight();
178 ASSERT_LT(AssessReduction(lowE, lowE_out), AssessReduction(highE, highE_out)) <<
"PMT saturation not applied!";