Class Acts::NumericalTrackLinearizer

template<typename propagator_t, typename propagator_options_t = PropagatorOptions<>>
class NumericalTrackLinearizer

Linearizes the track parameters at the PCA to a user-provided point (linPoint).

The track parameters are written as a function of the global 4D PCA position and the momentum of the particle at the PCA (i.e., (phi, theta, q/p)). The linearization then reads (see Eq. 5.7 in Ref(1)):

q = A (r - r_0) + B (p - p_0) + c,

where q are the Perigee parameters wrt linPoint, {r_0} r is the {initial} 4D PCA position, {p_0} p is the {initial} momentum at the PCA, and c is the constant term of the expansion. A and B are matrices of derivatives, denoted hereafter as “positionJacobian” and “momentumJacobian” respectively. Note that, unlike in Ref. (1), we add the time to the parametrization, which adds a row and a column to A and a row to B.

This class computes A and B by wiggling one of the 7 parameters at the PCA and computing the new PCA wrt linPoint. The derivatives wrt the k-th parameter pk are then calculated via

(q(p1, p2, …, pk+delta, … p7) - q(p1, p2, …, pk, … p7))/delta,

where q(p1, p2, …, pk+delta, … p7) are the new Perigee parameters (corresponding to the new PCA to linPoint). Note that p1 corresponds to the x-position of the PCA, p2 corresponds to the y-position of the PCA, etc.

Ref.(1) - CERN-THESIS-2010-027, Giacinto Piacquadio (Freiburg U.)


Connection to RiddersPropagator: The RiddersPropagator does a very similar thing to what this class does, but it wiggles BoundTrackParameters (FreeTrackParameters could also be used if Propagator.hpp and Propagator.ipp were adapted to accommodate them). Here, we wiggle neither BoundTrackParameters nor FreeTrackParameters, but rather the parameters described above.

Template Parameters
  • propagator_t – Propagator type

  • propagator_options_t – Propagator options type

Public Types

using Propagator_t = propagator_t

Public Functions

inline NumericalTrackLinearizer(const Config &config, std::unique_ptr<const Logger> _logger = getDefaultLogger("NumTrkLinProp", Logging::INFO))


  • config – Configuration object

  • _logger – Logger instance

Result<LinearizedTrack> linearizeTrack(const BoundTrackParameters &params, const Vector4 &linPoint, const Acts::GeometryContext &gctx, const Acts::MagneticFieldContext &mctx, State&) const

Function that linearizes BoundTrackParameters at the PCA to a given Perigee surface.


Transverse plane of the Perigee corresponding to linPoint is parallel to the global x-y plane

  • params – Parameters to linearize

  • linPoint – Point which defines the Perigee.

  • gctx – Geometry context

  • mctx – Magnetic field context


Linearized track

struct Config

Configuration struct.

Public Functions

inline Config(std::shared_ptr<const MagneticFieldProvider> bIn, std::shared_ptr<const Propagator_t> prop)

@ Config constructor if magnetic field is present

  • bIn – The magnetic field

  • prop – The propagator

inline Config(std::shared_ptr<const Propagator_t> prop)

Config constructor without B field -> uses NullBField.


prop – Propagator

Public Members

std::shared_ptr<const MagneticFieldProvider> bField
ActsScalar delta = 1e-8

Setting size of the perturbation delta for calculation of numerical derivatives (i.e., f’(x) ~ (f(x+delta) - f(x)) / delta)

std::shared_ptr<const Propagator_t> propagator
ActsScalar targetTolerance = 1e-12

Tolerance determining how close we need to get to a surface to reach it during propagation.

struct State

State struct.

Public Functions

inline State(MagneticFieldProvider::Cache fieldCacheIn)

State constructor.


fieldCacheIn – Magnetic field cache

Public Members

MagneticFieldProvider::Cache fieldCache