12 auto CheckMatchValidity(
const std::vector<Paddle::ChannelSignalPair>& matchedPairs,
16 auto it_existed = find_if(matchedPairs.begin(),
18 [&signal](
const auto& pair) ->
bool { return &(pair.right.get()) == &(signal); });
19 if (it_existed != matchedPairs.end())
22 <<
"DigitizingPaddleNeuland.cxx::CheckMatchValidity(): one signal is matched again to another "
23 "signal! The signal is discarded.";
29 template <u
int8_t iterations = DEFAULT_ITERATION>
30 auto FastExp(
const Float_t val) -> Float_t
32 auto exp = 1.F + (val / (iterations >> 1U));
33 for (
auto i = 0; i < iterations; ++i)
49 if (cal_to_hit_par ==
nullptr)
53 const auto& module_par = cal_to_hit_par->
GetModulePars().at(paddleID);
54 effective_speed_ = module_par.effective_speed.value;
55 attenuation_ = 1. / module_par.light_attenuation_length.value;
56 time_offset_ = module_par.t_diff.value;
57 time_sync_ = module_par.t_sync.value;
65 auto firstE =
static_cast<Float_t
>(firstSignal.qdcUnSat);
66 auto secondE =
static_cast<Float_t
>(secondSignal.qdcUnSat);
67 auto firstT = firstSignal.tdc;
68 auto secondT = secondSignal.tdc;
74 res = std::abs(((firstE / secondE) *
75 FastExp<4>(
static_cast<Float_t
>(attenuation_ * effective_speed_ * (firstT - secondT)))) -
81 ((secondE / firstE) *
FastExp<4>(
static_cast<Float_t
>(attenuation_ * effective_speed_ *
82 static_cast<Float_t
>(secondT - firstT)))) -
91 return std::sqrt(firstSignal.qdcUnSat * secondSignal.qdcUnSat) * ReverseAttenFac_;
98 return ((firstSignal.tdc + secondSignal.tdc) / 2) - (gHalfLength_ / effective_speed_) - time_sync_;
104 if (leftSignal.side == rightSignal.side)
106 R3BLOG(fatal,
"cannot compute position with signals from same side!");
111 ? (leftSignal.tdc - rightSignal.tdc + time_offset_) / 2 * effective_speed_
112 : (rightSignal.tdc - leftSignal.tdc + time_offset_) / 2 * effective_speed_;
119 auto rightChannelHit =
GenerateChannelHit(hit.time, hit.LightDep, hit.DistToPaddleCenter, channel_side_right);
120 auto leftChannelHit =
121 GenerateChannelHit(hit.time, hit.LightDep, -1 * hit.DistToPaddleCenter, channel_side_left);
122 return { leftChannelHit, rightChannelHit };
126 const double mcLight,
130 auto light =
double{ mcLight * std::exp(-NeulandPaddle::attenuation_ * (NeulandPaddle::gHalfLength_ - dist)) };
133 auto time =
double{ mcTime + ((NeulandPaddle::gHalfLength_ - dist) / effective_speed_) +
134 (site_sign * time_offset_ * 0.5) + time_sync_ };
136 return { time, light };
144 decltype(
auto) smallerSizeSignals = (firstSignals.size() < secondSignals.size()) ? firstSignals : secondSignals;
145 decltype(
auto) largerSizeSignals = (firstSignals.size() >= secondSignals.size()) ? firstSignals : secondSignals;
148 auto channelPairs = std::vector<ChannelSignalPair>{};
149 channelPairs.reserve(smallerSizeSignals.size());
152 for (
const auto& it : smallerSizeSignals)
155 auto it_min = std::min_element(largerSizeSignals.begin(),
156 largerSizeSignals.end(),
157 [&it = std::as_const(it), &self](
const auto&
left,
const auto&
right) ->
bool
158 { return (self.MatchSignals(it, left) < self.MatchSignals(it, right)); });
159 if (it_min == largerSizeSignals.end())
161 LOG(warn) <<
"DigitizingPaddleNeuland.cxx::SignalCouplingNeuland(): failed to find minimum value!";
165 if (CheckMatchValidity(channelPairs, *it_min))
167 channelPairs.emplace_back(it, *it_min);
#define R3BLOG(severity, x)
std::vector< Signal > Signals
NeulandPaddle(uint16_t paddleID)
auto ComputeTime(const Channel::Signal &firstSignal, const Channel::Signal &secondSignal) const -> double override
auto ComputeChannelHits(const Hit &hit) const -> Pair< Channel::Hit > override
auto ComputeEnergy(const Channel::Signal &firstSignal, const Channel::Signal &secondSignal) const -> double override
auto GenerateChannelHit(double mcTime, double mcLight, double dist, enum ChannelSide channel_side) const -> Channel::Hit
static auto SignalCouplingNeuland(const Paddle &self, const Channel::Signals &firstSignals, const Channel::Signals &secondSignals) -> std::vector< ChannelSignalPair >
static constexpr double gHalfLength
auto ComputePosition(const Channel::Signal &leftSignal, const Channel::Signal &rightSignal) const -> double override
auto MatchSignals(const Channel::Signal &firstSignal, const Channel::Signal &secondSignal) const -> float override
Paddle(int paddleID, SignalCouplingStrategy strategy=SignalCouplingByTime)
auto GetModulePars() const -> const std::unordered_map< unsigned int, ::R3B::Neuland::HitModulePar > &
Simulation of Mock Bar/Paddle.
static const uint8_t DEFAULT_ITERATION
auto FastExp(const float val) -> float