File indexing completed on 2025-01-19 09:23:27
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/BoundaryCheck.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 BoundaryCheck& bcheck, 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 = surface.intersect(
0044 state.geoContext, stepper.position(state),
0045 navDir * stepper.direction(state), bcheck, surfaceTolerance)[index];
0046
0047
0048 if (sIntersection.status() == Intersection3D::Status::onSurface) {
0049
0050 state.stepSize.release(ConstrainedStep::actor);
0051 ACTS_VERBOSE("Intersection: state is ON SURFACE");
0052 return Intersection3D::Status::onSurface;
0053 }
0054
0055 const double nearLimit = std::numeric_limits<double>::lowest();
0056 const double farLimit = state.stepSize.value(ConstrainedStep::aborter);
0057
0058 if (sIntersection && detail::checkIntersection(sIntersection.intersection(),
0059 nearLimit, farLimit, logger)) {
0060 ACTS_VERBOSE("Surface is reachable");
0061 stepper.updateStepSize(state, sIntersection.pathLength(),
0062 ConstrainedStep::actor);
0063 return Intersection3D::Status::reachable;
0064 }
0065
0066 ACTS_VERBOSE("Surface is NOT reachable");
0067 return Intersection3D::Status::unreachable;
0068 }
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 template <typename stepper_t, typename object_intersection_t>
0079 void updateSingleStepSize(typename stepper_t::State& state,
0080 const object_intersection_t& oIntersection,
0081 bool release = true) {
0082 double stepSize = oIntersection.pathLength();
0083 state.stepSize.update(stepSize, ConstrainedStep::actor, release);
0084 }
0085
0086 }