19 : fPaddleID{ paddleID }
20 , fSignalCouplingStrategy{ std::move(strategy) }
26 channel->SetPaddle(
this);
27 channel->AttachToPaddle(
this);
30 fLeftChannel = std::move(channel);
34 fRightChannel = std::move(channel);
38 LOG(error) <<
"Channel side is invalid!";
45 fLeftChannel->AddHit(channelHits.left);
46 fRightChannel->AddHit(channelHits.right);
51 if (!fLeftChannel || !fRightChannel)
53 LOG(fatal) <<
"channels failed to be constructed when checking fire! ";
56 return (fLeftChannel->HasFired() && fRightChannel->HasFired());
61 return (fLeftChannel->HasFired() && !fRightChannel->HasFired()) ||
62 (!fLeftChannel->HasFired() && fRightChannel->HasFired());
68 auto channelSignalPairs = fSignalCouplingStrategy(*
this, firstSignals, secondSignals);
70 auto paddleSignals = std::vector<Signal>();
71 paddleSignals.reserve(channelSignalPairs.size());
73 for (
auto& it : channelSignalPairs)
76 if (it.left.get().side == it.right.get().side)
78 LOG(warn) <<
"DigitizingEngine: ConstructPaddleSignals(): cannot construct the paddle signal from the "
79 "channels on the same side!";
85 std::swap(it.left, it.right);
87 auto paddleSignal =
Signal{
LRPair{ it.left, it.right } };
92 paddleSignals.push_back(paddleSignal);
99 if (!fSignals.valid())
104 fSignals.set(std::move(signals));
112 return fSignals.getRef();
119 auto firstSignalRefs =
120 std::vector<std::reference_wrapper<const Channel::Signal>>(firstSignals.begin(), firstSignals.end());
121 auto secondSignalRefs =
122 std::vector<std::reference_wrapper<const Channel::Signal>>(secondSignals.begin(), secondSignals.end());
123 auto channelSignalPairs = std::vector<ChannelSignalPair>{};
124 channelSignalPairs.reserve(std::min(firstSignals.size(), secondSignals.size()));
126 auto sortSignalByTime = [](
auto signals)
128 std::sort(signals.begin(),
130 [](
auto& first,
auto& second) { return first.get().tdc < second.get().tdc; });
132 sortSignalByTime(firstSignalRefs);
133 sortSignalByTime(secondSignalRefs);
135 for (
auto first_it = firstSignalRefs.begin(), second_it = secondSignalRefs.begin();
136 first_it < firstSignalRefs.end() && second_it < secondSignalRefs.end();
137 ++first_it, ++second_it)
139 channelSignalPairs.emplace_back(*first_it, *second_it);
141 return channelSignalPairs;
146 return std::min(fRightChannel->GetTrigTime(), fLeftChannel->GetTrigTime());
std::vector< Signal > Signals
void SetChannel(std::unique_ptr< Channel > channel)
std::function< std::vector< ChannelSignalPair >(const Paddle &, const Channel::Signals &, const Channel::Signals &)> SignalCouplingStrategy
virtual auto ComputePosition(const Channel::Signal &rightSignal, const Channel::Signal &leftSignal) const -> double=0
std::vector< Signal > Signals
static auto SignalCouplingByTime(const Paddle &self, const Channel::Signals &firstSignals, const Channel::Signals &secondSignals) -> std::vector< ChannelSignalPair >
auto HasHalfFired() const -> bool
virtual auto ComputeChannelHits(const Hit &hit) const -> Pair< Channel::Hit >=0
Paddle(int paddleID, SignalCouplingStrategy strategy=SignalCouplingByTime)
void DepositLight(const Hit &hit)
auto GetSignals() const -> const std::vector< Signal > &
virtual auto ComputeEnergy(const Channel::Signal &firstSignal, const Channel::Signal &secondSignal) const -> double=0
auto GetTrigTime() const -> double
virtual auto ConstructPaddelSignals(const Channel::Signals &firstSignals, const Channel::Signals &secondSignals) const -> Signals
virtual auto ComputeTime(const Channel::Signal &firstSignal, const Channel::Signal &secondSignal) const -> double=0
auto HasFired() const -> bool