Back to home page

EIC code displayed by LXR

 
 

    


Warning, /acts/docs/groups/kf_material_effects.md is written in an unsupported language. File is not indexed.

0001 @defgroup kf_material_effects Material effects in the Kalman filters
0002 @ingroup track_fitting
0003 @brief Pointwise material formalism shared by the KF and CKF
0004 
0005 > [!tip]
0006 > This page documents the concrete formalism used to apply material effects
0007 > during Kalman filtering. For the high-level conceptual picture see
0008 > @ref material-eff, and for the material description itself see @ref material.
0009 
0010 Both the @ref Acts::KalmanFitter "Kalman Filter" (KF) and the
0011 @ref Acts::CombinatorialKalmanFilter "Combinatorial Kalman Filter" (CKF) share
0012 the exact same material-update machinery. Rather than integrating material
0013 continuously along the trajectory, they use a **pointwise ("thin scatterer")
0014 model**: all material assigned to a surface is collapsed onto a single point,
0015 where it is applied as a deterministic correction to the momentum plus an
0016 additive Gaussian process noise on the diagonal of the covariance matrix. This
0017 matches the @f$\vec w_{k-1}@f$ process-noise term @f$\mathbf Q_{k-1}@f$ of the
0018 @ref kalman-formalism "Kalman formalism" @cite Fruhwirth:1987fm. The
0019 parametrizations used follow the ATLAS treatment of energy loss and multiple
0020 scattering @cite Lund:2008ad.
0021 
0022 The same code is used by the standalone @ref Acts::MaterialInteractor
0023 propagator actor (used e.g. by plain propagation and the
0024 @ref Acts::GaussianSumFitter "GSF"); the KF and CKF, however, do not install
0025 that actor. Instead they call the underlying routine directly from their Kalman
0026 actors so the material noise can be interleaved with the Kalman update at
0027 precisely the right point on each surface.
0028 
0029 ## Where the update is applied
0030 
0031 On every surface the fitters apply the pointwise material update, using a
0032 @ref Acts::MaterialUpdateMode that avoids double counting:
0033 
0034 - On a **measurement surface** the interaction is split into a `PreUpdate`
0035   (applied *before* the Kalman filter update, after the covariance has been
0036   transported to the surface) and a `PostUpdate` (applied *after* the update),
0037   so that noise is added on both approach and exit.
0038 - On a **passive / material-only surface** (including holes) a single
0039   `FullUpdate` is applied.
0040 - At the start and target surface the mode is automatically restricted to
0041   `PostUpdate` / `PreUpdate` respectively.
0042 
0043 Whether scattering and/or energy loss are applied is controlled by the
0044 `multipleScattering` and `energyLoss` flags on the fitter options
0045 (`Acts::KalmanFitterOptions`, `Acts::CombinatorialKalmanFilterOptions`), both
0046 enabled by default.
0047 
0048 Before the material is evaluated, the slab thickness is scaled by the surface
0049 path correction @f$1/\cos\alpha@f$ to account for the incidence angle @f$\alpha@f$
0050 of the trajectory.
0051 
0052 ## Multiple Coulomb scattering {#kf-material-scattering}
0053 
0054 Scattering does not change the momentum magnitude but widens the direction
0055 uncertainty. A single scattering standard deviation @f$\theta_0@f$ is computed
0056 per surface. For all particles except electrons the **Highland formula**
0057 @cite Highland:1975pq, in the parametrization of the Particle Data Group
0058 @cite ParticleDataGroup:2018ovx (eq. 33.15), is used:
0059 
0060 @f[
0061   \theta_0 = \frac{13.6\,\mathrm{MeV}}{\beta c\, p}\, q\,
0062              \sqrt{\frac{x}{X_0}}
0063              \left( 1 + 0.038\, \ln\!\left(\frac{x}{X_0}\frac{q^2}{\beta^2}\right) \right),
0064 @f]
0065 
0066 with the path length in radiation lengths @f$x/X_0@f$, the momentum @f$p@f$, the
0067 velocity @f$\beta c@f$ and the charge @f$q@f$. For **electrons and positrons** the
0068 Rossi–Greisen form (with a @f$17.5\,\mathrm{MeV}@f$ prefactor) is used instead.
0069 The Highland term is evaluated as:
0070 
0071 @snippet{trimleft} Interactions.cpp Highland theta0
0072 
0073 The single angle @f$\theta_0@f$ is projected onto the two bound angular
0074 parameters, giving the process-noise variances that are added to the covariance:
0075 
0076 @f[
0077   \sigma^2(\theta) = \theta_0^2,
0078   \qquad
0079   \sigma^2(\phi) = \left(\frac{\theta_0}{\sin\theta}\right)^2 .
0080 @f]
0081 
0082 The @f$1/\sin\theta@f$ factor on @f$\phi@f$ accounts for the metric of the polar
0083 parametrization. Note that only the diagonal @f$\sigma^2(\phi)@f$ and
0084 @f$\sigma^2(\theta)@f$ entries are modified; no @f$\phi@f$–@f$\theta@f$ correlation
0085 is introduced:
0086 
0087 @snippet{trimleft} PointwiseMaterialInteraction.cpp scattering variance
0088 
0089 ## Energy loss {#kf-material-eloss}
0090 
0091 Energy loss enters in two ways: a deterministic shift of the mean @f$q/p@f$ and an
0092 additional variance on @f$q/p@f$.
0093 
0094 **Mean energy loss (state update).** The mean ionization loss is computed from
0095 the **Bethe formula** @cite ParticleDataGroup:2018ovx (eq. 33.5), including the
0096 density-effect correction (eq. 33.6) and the maximum single-collision energy
0097 transfer @f$W_\text{max}@f$ (eq. 33.4). The resulting energy loss @f$\Delta E@f$ is
0098 applied to the particle energy,
0099 
0100 @f[
0101   E' = \sqrt{m^2 + p^2} - \Delta E \cdot s,
0102   \qquad
0103   p' = \sqrt{E'^2 - m^2},
0104 @f]
0105 
0106 where @f$s = \pm 1@f$ is the propagation direction (energy decreases in the
0107 forward direction, increases in the backward/smoothing direction). The updated
0108 @f$q/p'@f$ is written back to the track state. A floor of @f$p' \geq 10\,\mathrm{MeV}@f$
0109 is applied so that a too-large loss does not push the particle to negative
0110 momentum:
0111 
0112 @snippet{trimleft} PointwiseMaterialInteraction.hpp energy loss update
0113 
0114 > [!note]
0115 > The mean correction inside the KF/CKF uses the **ionization (Bethe) term
0116 > only**. Radiative (bremsstrahlung / Bethe–Heitler) losses
0117 > are *not* added to the mean here. Because bremsstrahlung is strongly
0118 > non-Gaussian, it cannot be modelled adequately by this pointwise Gaussian
0119 > update; electron fitting should therefore use the
0120 > @ref Acts::GaussianSumFitter "GSF", which models the Bethe–Heitler
0121 > distribution as a Gaussian mixture.
0122 
0123 **Energy-loss straggling (variance).** The fluctuation of the ionization loss is
0124 described by the **Landau–Vavilov** distribution. Its full width at half maximum
0125 (@f$4\varepsilon@f$, @cite ParticleDataGroup:2018ovx fig. 33.7) is converted to an equivalent Gaussian
0126 standard deviation @f$\sigma_E@f$ via
0127 @f$\sigma_E = \mathrm{fwhm}/(2\sqrt{2\ln 2})@f$, which is then propagated to a
0128 variance on @f$q/p@f$ through the Jacobian @f$\mathrm{d}(q/p)/\mathrm{d}E@f$:
0129 
0130 @f[
0131   \sigma^2(q/p) = \left(\frac{\mathrm{d}(q/p)}{\mathrm{d}E}\right)^2 \sigma_E^2 .
0132 @f]
0133 
0134 This variance is added to the diagonal @f$\sigma^2(q/p)@f$ covariance entry:
0135 
0136 @snippet{trimleft} PointwiseMaterialInteraction.cpp energy loss variance
0137 
0138 ## Covariance update {#kf-material-covariance}
0139 
0140 The three variances computed above are added onto the corresponding **diagonal**
0141 entries of the bound covariance, @f$\sigma^2(\phi)@f$, @f$\sigma^2(\theta)@f$ and
0142 @f$\sigma^2(q/p)@f$. The sign is set by the
0143 @ref Acts::NoiseUpdateMode -- noise is
0144 *added* during the forward filtering pass. Each variance is floored at zero to
0145 protect against numerical underflow. No off-diagonal correlations are created,
0146 and the local position and time entries are untouched:
0147 
0148 @snippet{trimleft} PointwiseMaterialInteraction.hpp covariance update
0149 
0150 ## Summary {#kf-material-summary}
0151 
0152 | Effect | Formalism | Applied to |
0153 | --- | --- | --- |
0154 | Multiple scattering | Highland (Rossi–Greisen for @f$e^\pm@f$) | @f$\sigma^2(\phi)@f$, @f$\sigma^2(\theta)@f$ |
0155 | Mean energy loss | Bethe (ionization) | mean @f$q/p@f$ |
0156 | Energy-loss straggling | Landau width @f$\to@f$ Gaussian @f$\sigma@f$ | @f$\sigma^2(q/p)@f$ |
0157 | Bremsstrahlung mean | — (use @ref Acts::GaussianSumFitter "GSF") | — |
0158 | Correlations | none (diagonal noise only) | — |
0159 
0160 ## Implementation pointers {#kf-material-implementation}
0161 
0162 - Physics formulas: @ref Acts::computeMultipleScatteringTheta0 (Highland /
0163   Rossi–Greisen), @ref Acts::computeEnergyLossBethe (mean ionization),
0164   @ref Acts::computeEnergyLossLandauSigmaQOverP (straggling) and
0165   @ref Acts::computeEnergyLossRadiative (radiative).
0166 - Track fitters: @ref Acts::KalmanFitter, @ref Acts::CombinatorialKalmanFilter.
0167 - Standalone propagator actor: @ref Acts::MaterialInteractor.
0168 - Bethe–Heitler (GSF only): @ref Acts::AtlasBetheHeitlerApprox.
0169 
0170 The pointwise application and covariance update themselves live in internal
0171 (non-public) `detail` code; the snippets shown in the sections above are
0172 extracted directly from it.