11#include <fairlogger/Logger.h>
21 auto CheckMatchValidity(
const std::vector<AbstractPaddle::ChannelSignalPair>& matchedPairs,
25 auto it_existed = find_if(matchedPairs.begin(),
27 [&signal](
const auto& pair) ->
bool { return &(pair.right.get()) == &(signal); });
28 if (it_existed != matchedPairs.end())
30 R3BLOG(debug,
"one signal is matched again to another signal! The signal is discarded.");
36 template <u
int8_t iterations = DEFAULT_ITERATION>
37 auto FastExp(
const Float_t val) -> Float_t
39 auto exp = 1.F + (val / (iterations >> 1U));
40 for (
auto i = 0; i < iterations; ++i)
62 auto firstE =
static_cast<float>(firstSignal.qdcUnSat);
63 auto secondE =
static_cast<float>(secondSignal.qdcUnSat);
64 auto firstT = firstSignal.tdc;
65 auto secondT = secondSignal.tdc;
71 res = std::abs(((firstE / secondE) *
78 static_cast<float>(secondT - firstT)))) -
92 attenuation_ = 1. / module_par.light_attenuation_length.value;
114 if (leftSignal.side == rightSignal.side)
116 R3BLOG(fatal,
"cannot compute position with signals from same side!");
129 auto rightChannelHit =
130 GenerateChannelSignal(signal.time, signal.energy_dep, signal.distance_to_center, channel_side_right);
131 auto leftChannelHit =
132 GenerateChannelSignal(signal.time, signal.energy_dep, -1 * signal.distance_to_center, channel_side_left);
133 return { leftChannelHit, rightChannelHit };
137 const double mcLight,
142 const auto site_sign = (channel_side ==
Side::right) ? 1 : -1;
147 return { time, light };
155 decltype(
auto) smallerSizeSignals = (firstSignals.size() < secondSignals.size()) ? firstSignals : secondSignals;
156 decltype(
auto) largerSizeSignals = (firstSignals.size() >= secondSignals.size()) ? firstSignals : secondSignals;
159 auto channelPairs = std::vector<ChannelSignalPair>{};
160 channelPairs.reserve(smallerSizeSignals.size());
163 for (
const auto& it : smallerSizeSignals)
166 auto it_min = std::min_element(largerSizeSignals.begin(),
167 largerSizeSignals.end(),
168 [&it = std::as_const(it), &self](
const auto&
left,
const auto&
right) ->
bool
169 { return (self.match_hits(it, left) < self.match_hits(it, right)); });
170 if (it_min == largerSizeSignals.end())
172 LOG(warn) <<
"DigitizingPaddleNeuland.cxx::SignalCouplingNeuland(): failed to find minimum value!";
176 if (CheckMatchValidity(channelPairs, *it_min))
178 channelPairs.emplace_back(it, *it_min);
#define R3BLOG(severity, x)
auto GetPaddleID() const -> int
AbstractPaddle(int paddleID, SignalCouplingStrategy strategy=SignalCouplingByTime)
auto compute_channel_signals(const Signal &signal) const -> Pair< AbstractChannel::Signal > override
auto match_hits(const AbstractChannel::Hit &firstSignal, const AbstractChannel::Hit &secondSignal) const -> float override
auto compute_energy(const AbstractChannel::Hit &firstSignal, const AbstractChannel::Hit &secondSignal) const -> double override
double reverse_atten_fac_
auto compute_position(const AbstractChannel::Hit &leftSignal, const AbstractChannel::Hit &rightSignal) const -> double override
auto GenerateChannelSignal(double mcTime, double mcLight, double dist, enum Side channel_side) const -> AbstractChannel::Signal
static constexpr double HALF_BAR_LENGTH
auto compute_time(const AbstractChannel::Hit &firstSignal, const AbstractChannel::Hit &secondSignal) const -> double override
static auto HitCouplingNeuland(const AbstractPaddle &self, const AbstractChannel::Hits &firstSignals, const AbstractChannel::Hits &secondSignals) -> std::vector< ChannelSignalPair >
R3B::Neuland::Cal2HitPar * cal_to_hit_par_
void pre_construct() override
Simulation of Mock Bar/Paddle.
static const uint8_t DEFAULT_ITERATION
auto FastExp(const float val) -> float