Warning, /acts/docs/core/propagation.md is written in an unsupported language. File is not indexed.
0001 (propagation_impl)=
0002 # Propagation and extrapolation
0003
0004 The track propagation is an essential part of track reconstruction. This section describes the high-level classes and concepts used for this task in ACTS.
0005
0006 ## Overview: Steppers, Navigators and Actors
0007
0008 The propagation through a geometry is based on the interaction of two different components:
0009
0010 * The **Stepper** provides the implementation of the solution of the equation of motion (either by analytical means or through numerical integration).
0011 * The **Navigator** keeps track of the current position in the geometry and adjusts the step size so that the stepper does not step through a surface.
0012
0013 Following the general ACTS design, these classes do not manage their internal state via member variables, but provide an internal `State` struct which contains all relevant data and is managed by the propagator.
0014
0015 The interaction of these two components is handled by the {class}`Acts::Propagator` class template that takes the stepper and the navigator as template parameters:
0016
0017 ```cpp
0018 Propagator<Navigator, Stepper>
0019 ```
0020
0021 Additional to these mandatory components, the propagator can be equipped with **Actors** and **Aborters** to allow for custom behaviour. These are function objects that are hooked in the propagation loop. Actors just perform some action on the propagator state (e.g. the {class}`Acts::KalmanFitter` is an actor), aborts can abort propagation (e.g., the {struct}`Acts::PathLimitReached`).
0022
0023 The propagator exposes its state to the actors and aborters as arguments to `operator()`. Actors must define a default-constructable `result_type`, which can be modified in each call:
0024
0025 ```cpp
0026 template<typename propagator_state_t, typename stepper_t>
0027 auto operator(propagator_state_t &state, const stepper_t &stepper, result_type &result) const {
0028 const auto &navigatorState = state.navigation;
0029 const auto &stepperState = state.stepping;
0030 const auto &options = state.options;
0031 }
0032 ```
0033
0034 The result of a propagation consists of the track parameters at the endpoint of the propagation as well as the results of all actors.
0035
0036 ## Initialization and running
0037
0038 The {class}`Acts::Propagator` is initialized with the helper class
0039 {struct}`Acts::PropagatorOptions`, which is templated on the list of actors and
0040 aborters. This is done with the classes {struct}`Acts::ActionList` and
0041 {struct}`Acts::AbortList` (which are in fact small wrappers around
0042 `std::tuple`):
0043
0044 ```cpp
0045 using MyOptions = Acts::PropagatorOptions<
0046 Acts::ActionList<MyActor1, MyActor2>,
0047 Acts::AbortList<MyAborter1, MyAborter2>
0048 >;
0049 ```
0050
0051 The actors and aborters are instantiated with the options and can be accessed with the `get`-method that expects the corresponding actor type as template parameter. Besides this, the {struct}`Acts::PropagatorOptions` also contains a lot of general options like the `maxStepSize`:
0052
0053 ```cpp
0054 auto options = MyOptions();
0055 options.actionList.get<MyActor1>().foo = bar;
0056 options.maxStepSize = 100;
0057 ```
0058
0059 All available options can be found in the {struct}`Acts::PropagatorPlainOptions`, from which {struct}`Acts::PropagatorOptions` inherits.
0060
0061 :::{tip}
0062 The propagator also contains a loop-protection mechanism. It estimates a circle perimeter from the momentum and the magnetic field, and aborts the propagation when a certain fraction (default: 0.5) of the circle has been propagated. This behaviour can be changed in the {struct}`Acts::PropagatorOptions` via the boolean `loopProtection` and the float `loopFraction`.
0063 :::
0064
0065 To run the propagation, we must call the member function `propagate(...)` with the initial track parameters and the propagator options. There are several overloads to the `propagate(...)` function, which allow further customization:
0066 * With/without a target surface: The overload with a target surface automatically adds an aborter for the passed `Surface` to the `AbortList`.
0067 * With/without a prepared result object: Without a result object, a suitable result object is default-constructed internally.
0068
0069 The result is an instance of {class}`Acts::Result`. It contains the actual result, or an error code in case something went wrong. In the actual result, the results of the different actors can again be accessed via a `get` method:
0070
0071 ```cpp
0072 auto res = propagator.propagate(myParams, options);
0073
0074 if( res.ok() ) {
0075 res.value().get<MyActor1::result_type>();
0076 }
0077 ```
0078
0079 ## Navigators
0080
0081 ACTS comes with two navigators: The standard navigator {class}`Acts::Navigator` that performs the full navigation in the volume/layer/surface hierarchy, and the {class}`Acts::DirectNavigator` that takes a sequence of surfaces and just navigates to one after the other. This sequence must be initialized with a special actor, the {struct}`Acts::DirectNavigator::Initializer`.
0082
0083 The navigators provide information about the current position inside the geometry in their state variable ({struct}`Acts::Navigator::State` and {struct}`Acts::DirectNavigator::State`), e.g. pointers to the `currentSurface` and the `currentVolume`.
0084
0085 :::{tip}
0086 The {class}`Acts::Navigator` by default does a straight-line extrapolation to resolve layer candidates. In certain geometries (e.g., telescope) this can lead to the effect that bent tracks miss some layers. This can be mitigated by disabling the bound-check for layer resolution with the `boundaryCheckLayerResolving` option in {struct}`Acts::Navigator::Config`.
0087 :::
0088
0089 ## Steppers
0090
0091 ACTS also provides a variety of stepper implementations. Since these in general can work very differently internally, the state itself is not the main interface to the steppers. Instead, all steppers provide a common API, to that we can pass instances of the stepper state. This allows a generic and template-based design even for very different steppers:
0092
0093 ```cpp
0094 template<typename propagator_state_t, typename stepper_t>
0095 auto operator(propagator_state_t &state, const stepper_t &stepper) const {
0096 stepper.foo(state.stepping);
0097 }
0098 ```
0099
0100 ### AtlasStepper
0101
0102 The {class}`Acts::AtlasStepper` is a pure transcript from the ATLAS `RungeKuttaPropagator` and `RungeKuttaUtils`.
0103
0104 ### StraightLineStepper
0105
0106 The {class}`Acts::StraightLineStepper` is a very stripped down stepper that just performs a linear propagation without magnetic field. It can be used for debugging, validation or other simple tasks.
0107
0108 ### EigenStepper
0109
0110 The {class}`Acts::EigenStepper` implements the same functionality as the ATLAS stepper, however, the stepping code is rewritten by using `Eigen` primitives. Thus, it also uses a 4th-order Runge-Kutta algorithm for the integration of the EOM. Additionally, the {class}`Acts::EigenStepper` allows to customize the concrete integration step via **extensions**.
0111
0112 The extensions encapsulate the relevant equations for different environments. There exists a {struct}`Acts::DefaultExtension` that is suited for propagation in a vacuum, and the {struct}`Acts::DenseEnvironmentExtension`, that contains additional code to handle the propagation inside materials. Which extension is used is selected by a bidding-system.
0113
0114 The extension can be configured via the {struct}`Acts::StepperExtensionList`:
0115
0116 ```cpp
0117 using Stepper = Acts::EigenStepper<
0118 Acts::StepperExtensionList<
0119 Acts::DefaultExtension,
0120 Acts::DenseEnvironmentExtension
0121 >
0122 >;
0123 ```
0124
0125 By default, the {class}`Acts::EigenStepper` only uses the {struct}`Acts::DefaultExtension`.
0126
0127 ### MultiEigenStepperLoop
0128
0129 The {class}`Acts::MultiEigenStepperLoop` is an extension of the {class}`Acts::EigenStepper` and is designed to internally handle a multi-component state, while interfacing as a single component to the navigator. It is mainly used for the {struct}`Acts::GaussianSumFitter`.