Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-16 08:02:15

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 #include "Acts/Propagator/StandardAborters.hpp"
0012 #include "Acts/Surfaces/Surface.hpp"
0013 #include "Acts/Utilities/Intersection.hpp"
0014 
0015 namespace Acts {
0016 
0017 struct MultiStepperSurfaceReached : public ForcedSurfaceReached {
0018   /// If this is set, we are also happy if the mean of the components is on the
0019   /// surface. How the averaging is performed depends on the stepper
0020   /// implementation
0021   bool averageOnSurface = true;
0022 
0023   /// A configurable tolerance within which distance to the intersection we
0024   /// consider the surface as reached. Has no effect if averageOnSurface is
0025   /// false
0026   double averageOnSurfaceTolerance = 0.2;
0027 
0028   MultiStepperSurfaceReached() = default;
0029 
0030   /// boolean operator for abort condition without using the result
0031   ///
0032   /// @tparam propagator_state_t Type of the propagator state
0033   /// @tparam stepper_t Type of the stepper
0034   /// @tparam navigator_t Type of the navigator
0035   ///
0036   /// @param [in,out] state The propagation state object
0037   /// @param [in] stepper Stepper used for propagation
0038   /// @param [in] navigator Navigator used for the propagation
0039   /// @param logger a logger instance
0040   template <typename propagator_state_t, typename stepper_t,
0041             typename navigator_t>
0042   bool checkAbort(propagator_state_t& state, const stepper_t& stepper,
0043                   const navigator_t& navigator, const Logger& logger) const {
0044     if (surface == nullptr) {
0045       ACTS_VERBOSE(
0046           "MultiStepperSurfaceReached aborter | "
0047           "No target surface set.");
0048       return false;
0049     }
0050 
0051     // However, if mean of all is on surface, we are happy as well
0052     if (averageOnSurface) {
0053       const Intersection3D intersection =
0054           surface
0055               ->intersect(
0056                   state.geoContext, stepper.position(state.stepping),
0057                   state.options.direction * stepper.direction(state.stepping),
0058                   BoundaryTolerance(boundaryTolerance),
0059                   averageOnSurfaceTolerance)
0060               .closest();
0061 
0062       if (intersection.status() == IntersectionStatus::onSurface) {
0063         ACTS_VERBOSE(
0064             "MultiStepperSurfaceReached aborter | "
0065             "Reached target in average mode");
0066         for (auto cmp : stepper.componentIterable(state.stepping)) {
0067           cmp.status() = IntersectionStatus::onSurface;
0068         }
0069 
0070         return true;
0071       }
0072 
0073       ACTS_VERBOSE(
0074           "MultiStepperSurfaceReached aborter | Average distance to target: "
0075           << intersection.pathLength());
0076     }
0077 
0078     bool reached = true;
0079 
0080     for (auto cmp : stepper.componentIterable(state.stepping)) {
0081       // note that this is not copying anything heavy
0082       auto singleState = cmp.singleState(state);
0083       const auto& singleStepper = cmp.singleStepper(stepper);
0084 
0085       if (!ForcedSurfaceReached::checkAbort(singleState, singleStepper,
0086                                             navigator, logger)) {
0087         reached = false;
0088       } else {
0089         cmp.status() = Acts::IntersectionStatus::onSurface;
0090       }
0091     }
0092 
0093     if (reached) {
0094       ACTS_VERBOSE(
0095           "MultiStepperSurfaceReached aborter | "
0096           "Reached target in single component mode");
0097     }
0098 
0099     return reached;
0100   }
0101 };
0102 
0103 }  // namespace Acts