Back to home page

sPhenix code displayed by LXR

 
 

    


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`.