22 namespace ActsFatras {
37 template <
typename generator_t,
typename decay_t,
typename interactions_t,
38 typename hit_surface_selector_t>
48 template <
typename propagator_state_t,
typename stepper_t,
83 template <
typename propagator_state_t,
typename stepper_t,
96 if ((navigator.startSurface(state.navigation) !=
nullptr) &&
97 (navigator.startSurface(state.navigation) ==
98 navigator.currentSurface(state.navigation))) {
122 for (
auto &&descendant : descendants) {
135 const auto properTimeDiff =
139 const auto stepSize = properTimeDiff *
142 stepper.setStepSize(state.stepping,
stepSize,
152 if (navigator.targetReached(state.navigation)) {
156 if (not navigator.currentSurface(state.navigation)) {
179 auto normal = surface.
normal(state.geoContext, local);
182 auto cosIncidenceInv = normal.norm() / normal.dot(before.
direction());
194 result.
hits.emplace_back(
212 template <
typename propagator_state_t,
typename stepper_t,
213 typename navigator_t>
220 const auto deltaLabTime = stepper.
time(state.stepping) - previous.
time();
225 const auto gammaInv = previous.
mass() / previous.
energy();
226 const auto properTime = previous.
properTime() + gammaInv * deltaLabTime;
228 if (navigator.currentSurface(state.navigation) !=
nullptr) {
229 currentSurface = navigator.currentSurface(state.navigation);
234 stepper.time(state.stepping))
235 .setDirection(stepper.direction(state.stepping))
236 .setAbsoluteMomentum(stepper.absoluteMomentum(state.stepping))
237 .setProperTime(properTime)
245 result.
x0Limit = selection.x0Limit;
246 result.
l0Limit = selection.l0Limit;
258 auto runContinuousPartial = [&,
this](
float fraction) {
304 const float fracX0 = std::clamp(
float(x0Dist / slabX0), 0.0
f, 1.0
f);
305 const float fracL0 = std::clamp(
float(l0Dist / slabL0), 0.0
f, 1.0
f);
307 const float frac =
std::min(fracX0, fracL0);
312 if (runContinuousPartial(frac)) {
328 if (runContinuousPartial(1.0 - frac)) {