18#include <fairlogger/Logger.h>
34 channel->SetPaddle(
this);
35 channel->AttachToPaddle(
this);
46 LOG(error) <<
"Channel side is invalid!";
70 LOG(fatal) <<
"channels failed to be constructed when checking fire! ";
88 auto paddleSignals = std::vector<Hit>();
89 paddleSignals.reserve(channelSignalPairs.size());
91 for (
auto& it : channelSignalPairs)
94 if (it.left.get().side == it.right.get().side)
96 LOG(warn) <<
"DigitizingEngine: ConstructPaddleSignals(): cannot construct the paddle signal from the "
97 "channels on the same side!";
103 std::swap(it.left, it.right);
105 auto paddleSignal =
Hit{
LRPair{ &(it.left.get()), &(it.right.get()) } };
110 paddle_signals.push_back(paddleSignal);
137 -> std::vector<ChannelSignalPair>
139 auto firstSignalRefs =
140 std::vector<std::reference_wrapper<const AbstractChannel::Hit>>(firstSignals.begin(), firstSignals.end());
141 auto secondSignalRefs =
142 std::vector<std::reference_wrapper<const AbstractChannel::Hit>>(secondSignals.begin(), secondSignals.end());
143 auto channelSignalPairs = std::vector<ChannelSignalPair>{};
144 channelSignalPairs.reserve(std::min(firstSignals.size(), secondSignals.size()));
146 auto sortSignalByTime = [](
auto signals)
148 std::sort(signals.begin(),
150 [](
auto& first,
auto& second) { return first.get().tdc < second.get().tdc; });
152 sortSignalByTime(firstSignalRefs);
153 sortSignalByTime(secondSignalRefs);
155 for (
auto first_it = firstSignalRefs.begin(), second_it = secondSignalRefs.begin();
156 first_it < firstSignalRefs.end() && second_it < secondSignalRefs.end();
157 ++first_it, ++second_it)
159 channelSignalPairs.emplace_back(*first_it, *second_it);
161 return channelSignalPairs;
virtual auto compute_energy(const AbstractChannel::Hit &firstSignal, const AbstractChannel::Hit &secondSignal) const -> double=0
virtual void pre_construct()
auto HasFired() const -> bool
virtual auto compute_position(const AbstractChannel::Hit &rightSignal, const AbstractChannel::Hit &leftSignal) const -> double=0
virtual auto compute_channel_signals(const Signal &hit) const -> Pair< AbstractChannel::Signal >=0
std::unique_ptr< AbstractChannel > left_channel_
void construct_paddle_signals(Hits &paddle_signals, const AbstractChannel::Hits &firstSignals, const AbstractChannel::Hits &secondSignals) const
std::unique_ptr< AbstractChannel > right_channel_
auto GetTrigTime() const -> double
std::function< std::vector< ChannelSignalPair >(const AbstractPaddle &, const AbstractChannel::Hits &, const AbstractChannel::Hits &)> SignalCouplingStrategy
void DepositLight(const Signal &signal)
auto HasHalfFired() const -> bool
virtual auto compute_time(const AbstractChannel::Hit &firstSignal, const AbstractChannel::Hit &secondSignal) const -> double=0
void SetChannel(std::unique_ptr< AbstractChannel > channel)
static auto SignalCouplingByTime(const AbstractPaddle &self, const AbstractChannel::Hits &firstSignals, const AbstractChannel::Hits &secondSignals) -> std::vector< ChannelSignalPair >
auto GetChannel(R3B::Side side) const -> const Digitizing::AbstractChannel &
SignalCouplingStrategy signal_coupling_strategy_
AbstractPaddle(int paddleID, SignalCouplingStrategy strategy=SignalCouplingByTime)