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!";
 
NeuLAND digitizing finder task.