|
ACTS
Experiment-independent tracking
|
Reference stepper with a configurable Runge-Kutta tableau. More...
#include <Acts/Propagator/GenericRungeKuttaStepper.hpp>
Classes | |
| struct | Config |
| Configuration for the Runge-Kutta stepper. More... | |
| struct | Options |
| Runtime options for Runge-Kutta propagation. More... | |
| struct | State |
| State for track parameter propagation. More... | |
Public Types | |
| using | BoundParameters = BoundTrackParameters |
| Type alias for bound track parameters. | |
| using | Covariance = BoundMatrix |
| Type alias for covariance matrix. | |
| enum class | ErrorEstimation { None , Embedded , StepDoubling } |
| Error estimate for the adaptive step size. More... | |
| using | FieldAndGradient = MagneticFieldProvider::FieldAndGradient |
| Type alias for the magnetic field and its gradient. | |
| using | Jacobian = BoundMatrix |
| Type alias for jacobian matrix. | |
Public Member Functions | |
| GenericRungeKuttaStepper (const Config &config) | |
| Constructor with configuration. | |
| GenericRungeKuttaStepper (std::shared_ptr< const MagneticFieldProvider > bField) | |
| Constructor requires knowledge of the detector's magnetic field. | |
| double | absoluteMomentum (const State &state) const |
| Absolute momentum accessor. | |
| Result< BoundParameters > | boundParameters (const State &state, const Surface &surface) const |
| Get the bound parameters at the current position. | |
| double | charge (const State &state) const |
| Charge access. | |
| const std::optional< Covariance > & | covariance (const State &state) const |
| Get the covariance at the anchor. | |
| Result< Vector3 > | curvature (State &state) const |
| Current global geometric curvature d(direction)/ds in inverse length. | |
| BoundParameters | curvilinearParameters (const State &state) const |
| Get the curvilinear parameters at the current position. | |
| Vector3 | direction (const State &state) const |
| Momentum direction accessor. | |
| Result< Vector3 > | getField (State &state, const Vector3 &pos) const |
| Get the field for the stepping, it checks first if the access is still within the Cell, and updates the cell if necessary. | |
| Result< FieldAndGradient > | getFieldAndGradient (State &state, const Vector3 &pos, bool withGradient) const |
| Get the field and optionally its gradient at a position. | |
| double | getStepSize (const State &state, ConstrainedStep::Type stype) const |
| Get the step size. | |
| bool | hasCovariance (const State &state) const |
| Check if the state carries a covariance. | |
| void | initialize (State &state, const BoundParameters &par) const |
| Initialize the state from bound track parameters. | |
| void | initialize (State &state, const BoundVector &boundParams, const std::optional< BoundMatrix > &cov, ParticleHypothesis particleHypothesis, const Surface &surface) const |
| Initialize the state from bound parameters. | |
| State | makeState (const Options &options) const |
| Create a state object. | |
| Vector3 | momentum (const State &state) const |
| Momentum accessor. | |
| std::string | outputStepSize (const State &state) const |
| Output the Step Size - single component. | |
| const ParticleHypothesis & | particleHypothesis (const State &state) const |
| Particle hypothesis. | |
| double | pathLength (const State &state) const |
| Get the path length. | |
| Vector3 | position (const State &state) const |
| Global particle position accessor. | |
| bool | prepareCurvilinearState (State &state) const |
| If necessary fill additional members needed for transportToCurvilinear. | |
| double | qOverP (const State &state) const |
| QoP direction accessor. | |
| void | releaseStepSize (State &state, ConstrainedStep::Type stype) const |
| Release the Step size. | |
| void | setCovariance (State &state, const Covariance &covariance) const |
| Set the covariance at the anchor. | |
| const StepperStatistics & | statistics (const State &state) const |
| Get the stepper statistics. | |
| Result< double > | step (State &state, Direction propDir, const IVolumeMaterial *material) const |
| Perform a Runge-Kutta track parameter propagation step. | |
| const ConstrainedStep & | stepSize (const State &state) const |
| Get the step size constraints. | |
| double | time (const State &state) const |
| Time access. | |
| Result< Jacobian > | transportToBound (State &state, const Surface &surface, const FreeToBoundCorrection &freeToBoundCorrection=FreeToBoundCorrection(false)) const |
| Transport the covariance to a surface at the current position. | |
| Jacobian | transportToCurvilinear (State &state) const |
| Transport the covariance to the curvilinear frame at the current position. | |
| void | update (State &state, const FreeVector &freeParams, const BoundVector &boundParams, const Covariance &covariance, const Surface &surface) const |
| Method to update a stepper state to the some parameters. | |
| void | update (State &state, const Vector3 &uposition, const Vector3 &udirection, double qop, double time) const |
| Method to update the stepper state. | |
| void | updateStepSize (State &state, const NavigationTarget &target, Direction direction, ConstrainedStep::Type stype) const |
| Update step size. | |
| void | updateStepSize (State &state, double stepSize, ConstrainedStep::Type stype) const |
| Update step size - explicitly with a double. | |
| IntersectionStatus | updateSurfaceStatus (State &state, const Surface &surface, std::uint8_t index, Direction navDir, const BoundaryTolerance &boundaryTolerance, double surfaceTolerance, ConstrainedStep::Type stype, const Logger &logger=getDummyLogger(), const Vector3 &curvature=Vector3::Zero()) const |
| Update surface status. | |
Reference stepper with a configurable Runge-Kutta tableau.
The stepper integrates the equation of motion in vacuum for the free parameters y = (r, t, T, q/p),
dy/ds = f(y) = (T, 1/beta, (q/p) T x B(r), 0),
with any explicit ButcherTableau. It is not optimised. It is meant as a reference to compare other steppers against.
The transport jacobian is the exact derivative of the discrete step. The stepper differentiates each stage with the chain rule,
dY_i = I + h sum_j a_ij dK_j, dK_i = J_f(Y_i) dY_i, D = I + h sum_i b_i dK_i,
so it works for every tableau. Here dY_i, dK_i and D are the derivatives of the stage, of the stage slope and of the step by the free parameters at the start of the step. J_f = df/dy has the non-zero blocks
d(r)/dT = I, d(t)/d(q/p) = d(1/beta)/d(q/p), d(T)/dr = (q/p) [T x] dB/dr, d(T)/dT = -(q/p) [B x], d(T)/d(q/p) = T x B.
The stepper takes dB/dr from the field provider. If the provider does not implement the gradient, the stepper computes it with central finite differences of the field, so the jacobian is exact up to the O(epsilon^2) error of the gradient, see Options::fieldGradientEpsilon. Without the gradient term (Options::includeFieldGradient) the jacobian is not exact.
After the step, the stepper normalises the direction to unit length. This is part of the discrete step, so the stepper also applies its derivative (I - T T^T / |T|^2) / |T| to the direction rows of D.
The stepper adapts the step size to StepperPlainOptions::stepTolerance with one of two error estimates, see ErrorEstimation. The error estimate is the maximum norm of the position (mm), the time (mm) and the dimensionless direction components, with the same absolute tolerance. In vacuum q/p does not change, so it does not contribute. The step size control follows Hairer, Nørsett, Wanner, Solving Ordinary Differential Equations I, 2nd ed., Section II.4.
As for HelixStepper, a step to the straight-line distance of a surface can pass it, and the next step goes back. A target aborter must accept an intersection that far behind the track.
|
strong |
Error estimate for the adaptive step size.
Both use the same tolerance. The embedded estimate is for the lower-order solution, so the propagated solution is usually 100 to 1000 times more accurate than the tolerance. Step doubling estimates the propagated solution itself, so its local error is about the tolerance.
|
explicit |
Constructor requires knowledge of the detector's magnetic field.
| bField | The magnetic field provider |
|
explicit |
Constructor with configuration.
| config | The configuration of the stepper |
| double Acts::GenericRungeKuttaStepper::absoluteMomentum | ( | const State & | state | ) | const |
Absolute momentum accessor.
| state | [in] The stepping state (thread-local cache) |
| Result< BoundParameters > Acts::GenericRungeKuttaStepper::boundParameters | ( | const State & | state, |
| const Surface & | surface ) const |
Get the bound parameters at the current position.
The parameters carry the covariance at the anchor if the state has one.
surface or anchored on it| [in] | state | The stepping state (thread-local cache) |
| [in] | surface | The surface of the parameters |
surface | double Acts::GenericRungeKuttaStepper::charge | ( | const State & | state | ) | const |
Charge access.
| state | [in] The stepping state (thread-local cache) |
| const std::optional< Covariance > & Acts::GenericRungeKuttaStepper::covariance | ( | const State & | state | ) | const |
Get the covariance at the anchor.
The anchor is the frame of the last initialization, transport or update.
| state | [in] The stepping state (thread-local cache) |
Current global geometric curvature d(direction)/ds in inverse length.
Unchanged under propagation reversal; reflects current momentum and field.
| state | Stepping state; the field cache may be updated |
| BoundParameters Acts::GenericRungeKuttaStepper::curvilinearParameters | ( | const State & | state | ) | const |
Get the curvilinear parameters at the current position.
The parameters carry the covariance at the anchor if the state has one.
| [in] | state | The stepping state (thread-local cache) |
Momentum direction accessor.
| state | [in] The stepping state (thread-local cache) |
| Result< Vector3 > Acts::GenericRungeKuttaStepper::getField | ( | State & | state, |
| const Vector3 & | pos ) const |
Get the field for the stepping, it checks first if the access is still within the Cell, and updates the cell if necessary.
| [in,out] | state | is the propagation state associated with the track the magnetic field cell is used (and potentially updated) |
| [in] | pos | is the field position |
| Result< FieldAndGradient > Acts::GenericRungeKuttaStepper::getFieldAndGradient | ( | State & | state, |
| const Vector3 & | pos, | ||
| bool | withGradient ) const |
Get the field and optionally its gradient at a position.
| [in,out] | state | The stepper state with the field cache |
| [in] | pos | The position of the lookup |
| [in] | withGradient | Whether the gradient is needed |
withGradient | double Acts::GenericRungeKuttaStepper::getStepSize | ( | const State & | state, |
| ConstrainedStep::Type | stype ) const |
Get the step size.
| state | [in] The stepping state (thread-local cache) |
| stype | [in] The step size type to be returned |
| bool Acts::GenericRungeKuttaStepper::hasCovariance | ( | const State & | state | ) | const |
Check if the state carries a covariance.
| state | [in] The stepping state (thread-local cache) |
| void Acts::GenericRungeKuttaStepper::initialize | ( | State & | state, |
| const BoundParameters & | par ) const |
Initialize the state from bound track parameters.
| state | The state to initialize |
| par | The bound track parameters |
| void Acts::GenericRungeKuttaStepper::initialize | ( | State & | state, |
| const BoundVector & | boundParams, | ||
| const std::optional< BoundMatrix > & | cov, | ||
| ParticleHypothesis | particleHypothesis, | ||
| const Surface & | surface ) const |
Initialize the state from bound parameters.
| state | The state to initialize |
| boundParams | Bound track parameters vector |
| cov | Covariance matrix |
| particleHypothesis | Particle hypothesis |
| surface | Reference surface |
Create a state object.
| options | Stepper options |
| std::invalid_argument | for an embedded error estimate without embedded weights |
Momentum accessor.
| state | [in] The stepping state (thread-local cache) |
| std::string Acts::GenericRungeKuttaStepper::outputStepSize | ( | const State & | state | ) | const |
Output the Step Size - single component.
| state | [in,out] The stepping state (thread-local cache) |
| const ParticleHypothesis & Acts::GenericRungeKuttaStepper::particleHypothesis | ( | const State & | state | ) | const |
Particle hypothesis.
| state | [in] The stepping state (thread-local cache) |
| double Acts::GenericRungeKuttaStepper::pathLength | ( | const State & | state | ) | const |
Get the path length.
| state | [in] The stepping state (thread-local cache) |
Global particle position accessor.
| state | [in] The stepping state (thread-local cache) |
| bool Acts::GenericRungeKuttaStepper::prepareCurvilinearState | ( | State & | state | ) | const |
If necessary fill additional members needed for transportToCurvilinear.
Compute path length derivatives in case they have not been computed yet, which is the case if no step has been executed yet.
| [in,out] | state | State of the stepper |
| double Acts::GenericRungeKuttaStepper::qOverP | ( | const State & | state | ) | const |
QoP direction accessor.
| state | [in] The stepping state (thread-local cache) |
| void Acts::GenericRungeKuttaStepper::releaseStepSize | ( | State & | state, |
| ConstrainedStep::Type | stype ) const |
Release the Step size.
| state | [in,out] The stepping state (thread-local cache) | |
| [in] | stype | The step size type to be released |
| void Acts::GenericRungeKuttaStepper::setCovariance | ( | State & | state, |
| const Covariance & | covariance ) const |
Set the covariance at the anchor.
The state must already carry a covariance, because the stepper only transports the Jacobian while it has one.
| [in,out] | state | The stepping state (thread-local cache) |
| [in] | covariance | The new covariance at the anchor |
| std::logic_error | if the state does not carry a covariance |
| const StepperStatistics & Acts::GenericRungeKuttaStepper::statistics | ( | const State & | state | ) | const |
Get the stepper statistics.
| state | [in] The stepping state (thread-local cache) |
| Result< double > Acts::GenericRungeKuttaStepper::step | ( | State & | state, |
| Direction | propDir, | ||
| const IVolumeMaterial * | material ) const |
Perform a Runge-Kutta track parameter propagation step.
| [in,out] | state | State of the stepper |
| propDir | is the direction of propagation | |
| material | is ignored, the stepper propagates in vacuum only |
| std::invalid_argument | for an embedded error estimate without embedded weights |
| const ConstrainedStep & Acts::GenericRungeKuttaStepper::stepSize | ( | const State & | state | ) | const |
Get the step size constraints.
| state | [in] The stepping state (thread-local cache) |
| double Acts::GenericRungeKuttaStepper::time | ( | const State & | state | ) | const |
Time access.
| state | [in] The stepping state (thread-local cache) |
| Result< Jacobian > Acts::GenericRungeKuttaStepper::transportToBound | ( | State & | state, |
| const Surface & | surface, | ||
| const FreeToBoundCorrection & | freeToBoundCorrection = FreeToBoundCorrection(false) ) const |
Transport the covariance to a surface at the current position.
This anchors the state on surface. Without a covariance the state does not change. The state must be on surface, and it stays unchanged if it is not.
| [in,out] | state | State of the stepper |
| [in] | surface | The surface to transport the covariance to |
| [in] | freeToBoundCorrection | Correction for non-linearity effect during transform from free to bound |
surface, or a failure if the state is not on surface Transport the covariance to the curvilinear frame at the current position.
This anchors the state on the curvilinear frame. Without a covariance the state does not change.
| [in,out] | state | State of the stepper |
| void Acts::GenericRungeKuttaStepper::update | ( | State & | state, |
| const FreeVector & | freeParams, | ||
| const BoundVector & | boundParams, | ||
| const Covariance & | covariance, | ||
| const Surface & | surface ) const |
Method to update a stepper state to the some parameters.
This anchors the state on surface.
| [in,out] | state | State object that will be updated |
| [in] | freeParams | Free parameters that will be written into state |
| [in] | boundParams | Corresponding bound parameters used to update jacToGlobal in state |
| [in] | covariance | The covariance that will be written into state if the state carries a covariance |
| [in] | surface | The surface used to update the jacToGlobal |
| void Acts::GenericRungeKuttaStepper::update | ( | State & | state, |
| const Vector3 & | uposition, | ||
| const Vector3 & | udirection, | ||
| double | qop, | ||
| double | time ) const |
Method to update the stepper state.
| [in,out] | state | State object that will be updated |
| [in] | uposition | the updated position |
| [in] | udirection | the updated direction |
| [in] | qop | the updated qop value |
| [in] | time | the updated time value |
| void Acts::GenericRungeKuttaStepper::updateStepSize | ( | State & | state, |
| const NavigationTarget & | target, | ||
| Direction | direction, | ||
| ConstrainedStep::Type | stype ) const |
Update step size.
This method intersects the provided surface and update the navigation step estimation accordingly (hence it changes the state). It also returns the status of the intersection to trigger onSurface in case the surface is reached.
| state | [in,out] The stepping state (thread-local cache) |
| target | [in] The NavigationTarget |
| direction | [in] The propagation direction |
| stype | [in] The step size type to be set |
| void Acts::GenericRungeKuttaStepper::updateStepSize | ( | State & | state, |
| double | stepSize, | ||
| ConstrainedStep::Type | stype ) const |
Update step size - explicitly with a double.
| state | [in,out] The stepping state (thread-local cache) |
| stepSize | [in] The step size value |
| stype | [in] The step size type to be set |
| IntersectionStatus Acts::GenericRungeKuttaStepper::updateSurfaceStatus | ( | State & | state, |
| const Surface & | surface, | ||
| std::uint8_t | index, | ||
| Direction | navDir, | ||
| const BoundaryTolerance & | boundaryTolerance, | ||
| double | surfaceTolerance, | ||
| ConstrainedStep::Type | stype, | ||
| const Logger & | logger = getDummyLogger(), | ||
| const Vector3 & | curvature = Vector3::Zero() ) const |
Update surface status.
It checks the status to the reference surface & updates the step size accordingly
| [in,out] | state | The stepping state (thread-local cache) |
| [in] | surface | The surface provided |
| [in] | index | The surface intersection index |
| [in] | navDir | The navigation direction |
| [in] | boundaryTolerance | The boundary check for this status update |
| [in] | surfaceTolerance | Surface tolerance used for intersection |
| [in] | stype | The step size type to be set |
| [in] | logger | A Logger instance |
| curvature | Global geometric curvature for the crossing estimate |