15 CLHEP::HepRandomEngine* rndmEngine)
const {
16 const double injectionAngle = std::atan2(std::abs(localDir.z()), std::abs(localDir.x())) / Gaudi::Units::deg;
18 const size_t ithAngle = std::min(
static_cast<size_t>(injectionAngle /
m_angleInterval),
m_bins.size() - 1);
19 const size_t jthAngle = std::min(ithAngle + 1,
m_bins.size() -1);
21 <<
", bin i: "<<ithAngle<<
", bin j: "<<jthAngle);
24 double jitter{0.}, prob{1.}, probRef{0.};
25 const std::vector<double>& ith_probs{
m_bins[ithAngle].timeProbs};
26 const std::vector<double>& jth_probs{
m_bins[jthAngle].timeProbs};
27 unsigned int trials{0};
28 while (prob > probRef) {
29 prob = CLHEP::RandFlat::shoot(rndmEngine, 0.0, 1.0);
30 jitter = CLHEP::RandFlat::shoot(rndmEngine, 0.0, 1.0) *
m_timeInterval;
31 size_t ithJitter =
static_cast<size_t>(jitter);
34 probRef = (1. - wAngle) * (ithJitter < ith_probs.size() ? ith_probs[ithJitter] : 0.) +
35 wAngle * (ithJitter < jth_probs.size() ? jth_probs[ithJitter] : 0.);
36 ATH_MSG_VERBOSE(
"Trial: "<<(++trials)<<
" jitter: "<<jitter<<
", prob: "<<prob
37 <<
", probRef: "<<probRef);