Propagation and extrapolation
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.
Initialization and running
The Acts::Propagator
is initialized with the helper class
Acts::PropagatorOptions
, which is templated on the list of actors.
This is done with the class Acts::ActorList
(which are in fact small wrappers around std::tuple
):
using MyOptions = Acts::PropagatorOptions<
Acts::ActorList<MyActor1, MyActor2>
>;
The actors 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 Acts::PropagatorOptions
also contains a lot of general options like the maxStepSize
:
auto options = MyOptions();
options.actorList.get<MyActor1>().foo = bar;
options.maxStepSize = 100;
All available options can be found in the Acts::PropagatorPlainOptions
, from which Acts::PropagatorOptions
inherits.
Tip
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 Acts::PropagatorOptions
via the boolean loopProtection
and the float loopFraction
.
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:
With/without a target surface: The overload with a target surface automatically adds an aborter for the passed
Surface
to theActorList
.With/without a prepared result object: Without a result object, a suitable result object is default-constructed internally.
The result is an instance of 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:
auto res = propagator.propagate(myParams, options);
if( res.ok() ) {
res.value().get<MyActor1::result_type>();
}
Steppers
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:
template<typename propagator_state_t, typename stepper_t>
auto operator(propagator_state_t &state, const stepper_t &stepper) const {
stepper.foo(state.stepping);
}
AtlasStepper
The Acts::AtlasStepper
is a pure transcript from the ATLAS RungeKuttaPropagator
and RungeKuttaUtils
.
StraightLineStepper
The 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.
EigenStepper
The 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 Acts::EigenStepper
allows to customize the concrete integration step via extension.
The extension encapsulate the relevant equations for different environments. There exists a Acts::EigenStepperDefaultExtension
that is suited for propagation in a vacuum, and the Acts::EigenStepperDenseExtension
, that contains additional code to handle the propagation inside materials. Which extension is used is decided by the user.
The extension can be configured via the Acts::EigenStepper
:
using Stepper = Acts::EigenStepper<Acts::EigenStepperDenseExtension>;
By default, the Acts::EigenStepper
only uses the Acts::EigenStepperDenseExtension
.
MultiEigenStepperLoop
The Acts::MultiEigenStepperLoop
is an extension of the 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 Acts::GaussianSumFitter
.