16#include "gtest/gtest.h"
27 class testNeulandTamexChannel :
public ::testing::Test
30 testNeulandTamexChannel()
31 : fChannel{ std::make_unique<TmxChannel>(Digitizing::
ChannelSide::
left) }
33 SetChannelPar(fChannel->GetPar());
36 void SetUp()
override {}
38 [[nodiscard]]
auto GetChannel() const -> TmxChannel* {
return fChannel.get(); }
40 [[nodiscard]]
auto GetPar() const -> TmxPar& {
return fChannel->GetPar(); }
42 static void SetChannelPar(TmxPar& par)
45 par.fSaturationCoefficient = 0.012;
46 par.fExperimentalDataIsCorrectedForSaturation =
true;
47 par.fEnergyGain = 15.0;
54 void AddHit(
double time,
double light) { fChannel->AddHit({ time, light }); }
56 [[nodiscard]]
auto GetSignals() const -> const Channel::Signals& {
return fChannel->GetSignals(); }
57 [[nodiscard]]
auto GetPMTPeaks() const -> const std::vector<PMTPeak>& {
return fChannel->GetPMTPeaks(); }
58 [[nodiscard]]
auto GetPeaks() const -> const std::vector<FQTPeak>& {
return fChannel->GetFQTPeaks(); }
61 std::unique_ptr<TmxChannel> fChannel =
nullptr;
64 TEST_F(testNeulandTamexChannel, basic_hit_processing)
67 auto signals = GetSignals();
68 auto peaks = GetPeaks();
71 ASSERT_EQ(peaks.size(), 1) <<
"no peak is generated!";
72 ASSERT_EQ(signals.size(), 1) <<
"No channel signal is outputted!";
75 ASSERT_LT(peaks[0].GetQDC(), 20.) <<
"PMT saturation is not implemented!";
76 ASSERT_NE(signals[0].tdc, 20.) <<
"tdc value is not smeared!";
79 TEST_F(testNeulandTamexChannel, pmt_threshold_check)
82 auto signals = GetSignals();
83 auto peaks = GetPeaks();
84 ASSERT_EQ(signals.size(), 0) <<
"PMT threshold doesn't filter out low energy signals!";
87 TEST_F(testNeulandTamexChannel, pmt_threshold_overlap)
93 auto signals = GetSignals();
94 auto peaks = GetPeaks();
95 ASSERT_EQ(signals.size(), 1) <<
"overlapped signals cannot pass PMT threshold!";
98 TEST_F(testNeulandTamexChannel, ifno_timeRes_check)
100 decltype(
auto) par = GetPar();
104 const auto& signals = GetSignals();
105 ASSERT_DOUBLE_EQ(signals[0].tdc, 20.) <<
"tdc value is not correctly passed on!";
108 TEST_F(testNeulandTamexChannel, signal_pileup_check)
112 ASSERT_EQ(GetSignals().size(), 1) <<
"overlapping failed!";
114 auto width = GetPeaks().back().GetWidth();
115 AddHit(width + 21., 1.5);
116 ASSERT_EQ(GetSignals().size(), 2) <<
"should not be overlapped!";
121 TEST_F(testNeulandTamexChannel, signal_multiPileup_check)
124 ASSERT_EQ(GetSignals().size(), 1);
125 AddHit(GetPeaks().back().GetTETime() + 5., 5.);
126 ASSERT_EQ(GetSignals().size(), 2);
127 AddHit(GetPeaks().back().GetTETime() + 5., 5.);
128 ASSERT_EQ(GetSignals().size(), 3);
129 AddHit(GetPeaks().back().GetTETime() + 5., 5.);
130 ASSERT_EQ(GetSignals().size(), 4);
131 AddHit(GetPeaks().back().GetTETime() + 5., 5.);
132 ASSERT_EQ(GetSignals().size(), 5);
133 auto minTime = GetPeaks().front().GetLETime();
134 auto maxTime = GetPeaks().back().GetTETime();
135 auto qdc_test = FQTPeak::WidthToQdc(maxTime - minTime + 10., GetPar());
136 AddHit(minTime - 5., qdc_test);
137 ASSERT_EQ(GetSignals().size(), 1);
140 constexpr auto AssessReduction(
double inE,
double outE) {
return (inE - outE) / inE; }
142 TEST_F(testNeulandTamexChannel, PMT_saturation_check)
144 const auto lowE = 10.;
145 const auto highE = 40.;
149 const auto& pmtSignals = GetPMTPeaks();
150 ASSERT_EQ(pmtSignals.size(), 2);
151 const auto lowE_out = pmtSignals[0].GetQDC();
152 const auto highE_out = pmtSignals[1].GetQDC();
153 ASSERT_LT(AssessReduction(lowE, lowE_out), AssessReduction(highE, highE_out)) <<
"PMT saturation not applied!";