File indexing completed on 2025-07-11 08:04:13
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Definitions/Direction.hpp"
0013 #include "Acts/Definitions/Tolerance.hpp"
0014 #include "Acts/Propagator/ConstrainedStep.hpp"
0015 #include "Acts/Surfaces/BoundaryTolerance.hpp"
0016 #include "Acts/Surfaces/Surface.hpp"
0017 #include "Acts/Utilities/Intersection.hpp"
0018 #include "Acts/Utilities/Logger.hpp"
0019
0020 #include <limits>
0021
0022 namespace Acts::detail {
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 template <typename stepper_t>
0035 Acts::Intersection3D::Status updateSingleSurfaceStatus(
0036 const stepper_t& stepper, typename stepper_t::State& state,
0037 const Surface& surface, std::uint8_t index, Direction navDir,
0038 const BoundaryTolerance& boundaryTolerance, ActsScalar surfaceTolerance,
0039 const Logger& logger) {
0040 ACTS_VERBOSE("Update single surface status for surface: "
0041 << surface.geometryId() << " index " << static_cast<int>(index));
0042
0043 auto sIntersection =
0044 surface.intersect(state.geoContext, stepper.position(state),
0045 navDir * stepper.direction(state), boundaryTolerance,
0046 surfaceTolerance)[index];
0047
0048
0049 if (sIntersection.status() == Intersection3D::Status::onSurface) {
0050
0051 state.stepSize.release(ConstrainedStep::actor);
0052 ACTS_VERBOSE("Intersection: state is ON SURFACE");
0053 return Intersection3D::Status::onSurface;
0054 }
0055
0056 const double nearLimit = std::numeric_limits<double>::lowest();
0057 const double farLimit = state.stepSize.value(ConstrainedStep::aborter);
0058
0059 if (sIntersection.isValid() &&
0060 detail::checkPathLength(sIntersection.pathLength(), nearLimit, farLimit,
0061 logger)) {
0062 ACTS_VERBOSE("Surface is reachable");
0063 stepper.updateStepSize(state, sIntersection.pathLength(),
0064 ConstrainedStep::actor);
0065 return Intersection3D::Status::reachable;
0066 }
0067
0068 ACTS_VERBOSE("Surface is NOT reachable");
0069 return Intersection3D::Status::unreachable;
0070 }
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 template <typename stepper_t, typename object_intersection_t>
0081 void updateSingleStepSize(typename stepper_t::State& state,
0082 const object_intersection_t& oIntersection,
0083 bool release = true) {
0084 double stepSize = oIntersection.pathLength();
0085 state.stepSize.update(stepSize, ConstrainedStep::actor, release);
0086 }
0087
0088 }