Analysis Software
Documentation for sPHENIX simulation software
|
Stepper based on the EigenStepper, but handles Multi-Component Tracks (e.g., for the GSF). Internally, this only manages a vector of EigenStepper::States. This simplifies implementation, but has several drawbacks: More...
#include <acts/blob/sPHENIX/Core/include/Acts/Propagator/MultiEigenStepperLoop.hpp>
Classes | |
struct | ComponentProxy |
struct | ComponentProxyBase |
struct | SinglePropState |
struct | State |
Public Types | |
using | SingleStepper = EigenStepper< extensionlist_t, auctioneer_t > |
Typedef to the Single-Component Eigen Stepper. | |
using | SingleState = typename SingleStepper::State |
Typedef to the State of the single component Stepper. | |
using | BoundState = std::tuple< MultiComponentBoundTrackParameters, Jacobian, ActsScalar > |
Define an own bound state. | |
using | CurvilinearState = std::tuple< MultiComponentCurvilinearTrackParameters, Jacobian, ActsScalar > |
Define an own curvilinear state. | |
using | Reducer = component_reducer_t |
The reducer type. | |
using | ConstComponentProxy = ComponentProxyBase< const typename State::Component > |
using | Covariance = BoundSquareMatrix |
using | Jacobian = BoundMatrix |
Jacobian, Covariance and State definitions. | |
Public Types inherited from Acts::EigenStepper< extensionlist_t, auctioneer_t > | |
using | Jacobian = BoundMatrix |
Jacobian, Covariance and State definitions. | |
using | Covariance = BoundSquareMatrix |
using | BoundState = std::tuple< BoundTrackParameters, Jacobian, double > |
using | CurvilinearState = std::tuple< CurvilinearTrackParameters, Jacobian, double > |
Public Member Functions | |
MultiEigenStepperLoop (std::shared_ptr< const MagneticFieldProvider > bField, std::unique_ptr< const Logger > logger=getDefaultLogger("GSF", Logging::INFO)) | |
Constructor from a magnetic field and a optionally provided Logger. | |
State | makeState (std::reference_wrapper< const GeometryContext > gctx, std::reference_wrapper< const MagneticFieldContext > mctx, const MultiComponentBoundTrackParameters &par, double ssize=std::numeric_limits< double >::max()) const |
Construct and initialize a state. | |
void | resetState (State &state, const BoundVector &boundParams, const BoundSquareMatrix &cov, const Surface &surface, const double stepSize=std::numeric_limits< double >::max()) const |
Resets the state. | |
auto | componentIterable (State &state) const |
auto | constComponentIterable (const State &state) const |
std::size_t | numberComponents (const State &state) const |
void | removeMissedComponents (State &state) const |
void | reweightComponents (State &state) const |
void | clearComponents (State &state) const |
Result< ComponentProxy > | addComponent (State &state, const BoundTrackParameters &pars, double weight) const |
Result< Vector3 > | getField (State &state, const Vector3 &pos) const |
Vector3 | position (const State &state) const |
Vector3 | direction (const State &state) const |
double | qOverP (const State &state) const |
double | absoluteMomentum (const State &state) const |
Vector3 | momentum (const State &state) const |
double | charge (const State &state) const |
ParticleHypothesis | particleHypothesis (const State &state) const |
double | time (const State &state) const |
Intersection3D::Status | updateSurfaceStatus (State &state, const Surface &surface, Direction navDir, const BoundaryCheck &bcheck, ActsScalar surfaceTolerance=s_onSurfaceTolerance, const Logger &logger=getDummyLogger()) const |
template<typename object_intersection_t > | |
void | updateStepSize (State &state, const object_intersection_t &oIntersection, Direction direction, bool release=true) const |
void | setStepSize (State &state, double stepSize, ConstrainedStep::Type stype=ConstrainedStep::actor, bool release=true) const |
double | getStepSize (const State &state, ConstrainedStep::Type stype) const |
void | releaseStepSize (State &state) const |
std::string | outputStepSize (const State &state) const |
double | overstepLimit (const State &state) const |
Result< BoundState > | boundState (State &state, const Surface &surface, bool transportCov=true, const FreeToBoundCorrection &freeToBoundCorrection=FreeToBoundCorrection(false)) const |
This transports (if necessary) the covariance to the surface and creates a bound state. It does not check if the transported state is at the surface, this needs to be guaranteed by the propagator. | |
CurvilinearState | curvilinearState (State &state, bool transportCov=true) const |
This transports (if necessary) the covariance to the current position and creates a curvilinear state. | |
void | transportCovarianceToCurvilinear (State &state) const |
void | transportCovarianceToBound (State &state, const Surface &surface, const FreeToBoundCorrection &freeToBoundCorrection=FreeToBoundCorrection(false)) const |
template<typename propagator_state_t , typename navigator_t > | |
Result< double > | step (propagator_state_t &state, const navigator_t &navigator) const |
Public Member Functions inherited from Acts::EigenStepper< extensionlist_t, auctioneer_t > | |
EigenStepper (std::shared_ptr< const MagneticFieldProvider > bField, double overstepLimit=100 *UnitConstants::um) | |
Constructor requires knowledge of the detector's magnetic field. | |
State | makeState (std::reference_wrapper< const GeometryContext > gctx, std::reference_wrapper< const MagneticFieldContext > mctx, const BoundTrackParameters &par, double ssize=std::numeric_limits< double >::max()) const |
void | resetState (State &state, const BoundVector &boundParams, const BoundSquareMatrix &cov, const Surface &surface, const double stepSize=std::numeric_limits< double >::max()) const |
Resets the state. | |
Result< Vector3 > | getField (State &state, const Vector3 &pos) const |
Vector3 | position (const State &state) const |
Vector3 | direction (const State &state) const |
double | qOverP (const State &state) const |
double | absoluteMomentum (const State &state) const |
Vector3 | momentum (const State &state) const |
double | charge (const State &state) const |
const ParticleHypothesis & | particleHypothesis (const State &state) const |
double | time (const State &state) const |
Intersection3D::Status | updateSurfaceStatus (State &state, const Surface &surface, Direction navDir, const BoundaryCheck &bcheck, ActsScalar surfaceTolerance=s_onSurfaceTolerance, const Logger &logger=getDummyLogger()) const |
template<typename object_intersection_t > | |
void | updateStepSize (State &state, const object_intersection_t &oIntersection, Direction, bool release=true) const |
void | setStepSize (State &state, double stepSize, ConstrainedStep::Type stype=ConstrainedStep::actor, bool release=true) const |
double | getStepSize (const State &state, ConstrainedStep::Type stype) const |
void | releaseStepSize (State &state) const |
std::string | outputStepSize (const State &state) const |
double | overstepLimit (const State &state) const |
Result< BoundState > | boundState (State &state, const Surface &surface, bool transportCov=true, const FreeToBoundCorrection &freeToBoundCorrection=FreeToBoundCorrection(false)) const |
This transports (if necessary) the covariance to the surface and creates a bound state. It does not check if the transported state is at the surface, this needs to be guaranteed by the propagator. | |
CurvilinearState | curvilinearState (State &state, bool transportCov=true) const |
This transports (if necessary) the covariance to the current position and creates a curvilinear state. | |
void | update (State &state, const FreeVector &freeParams, const BoundVector &boundParams, const Covariance &covariance, const Surface &surface) const |
void | update (State &state, const Vector3 &uposition, const Vector3 &udirection, double qOverP, double time) const |
void | transportCovarianceToCurvilinear (State &state) const |
void | transportCovarianceToBound (State &state, const Surface &surface, const FreeToBoundCorrection &freeToBoundCorrection=FreeToBoundCorrection(false)) const |
template<typename propagator_state_t , typename navigator_t > | |
Result< double > | step (propagator_state_t &state, const navigator_t &navigator) const |
void | setIdentityJacobian (State &state) const |
Static Public Attributes | |
static constexpr int | maxComponents = std::numeric_limits<int>::max() |
How many components can this stepper manage? | |
Private Types | |
template<typename T > | |
using | SmallVector = boost::container::small_vector< T, 16 > |
Private Attributes | |
std::size_t | m_stepLimitAfterFirstComponentOnSurface = 50 |
std::unique_ptr< const Acts::Logger > | m_logger |
The logger (used if no logger is provided by caller of methods) | |
Additional Inherited Members | |
Protected Attributes inherited from Acts::EigenStepper< extensionlist_t, auctioneer_t > | |
std::shared_ptr< const MagneticFieldProvider > | m_bField |
Magnetic field inside of the detector. | |
double | m_overstepLimit |
Overstep limit. | |
Stepper based on the EigenStepper, but handles Multi-Component Tracks (e.g., for the GSF). Internally, this only manages a vector of EigenStepper::States. This simplifies implementation, but has several drawbacks:
extensionlist_t | See EigenStepper for details |
component_reducer_t | How to map the multi-component state to a single component |
auctioneer_t | See EigenStepper for details |
small_vector_size | A size-hint how much memory should be allocated by the small vector |
Definition at line 220 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 220 of file MultiEigenStepperLoop.hpp
using Acts::MultiEigenStepperLoop< extensionlist_t, component_reducer_t, auctioneer_t >::BoundState = std::tuple<MultiComponentBoundTrackParameters, Jacobian, ActsScalar> |
Define an own bound state.
Definition at line 247 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 247 of file MultiEigenStepperLoop.hpp
using Acts::MultiEigenStepperLoop< extensionlist_t, component_reducer_t, auctioneer_t >::ConstComponentProxy = ComponentProxyBase<const typename State::Component> |
A proxy struct which allows access to a single component of the multi-component state. It has the semantics of a const reference, i.e. it requires a const reference of the single-component state it represents
Definition at line 419 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 419 of file MultiEigenStepperLoop.hpp
using Acts::EigenStepper< extensionlist_t, auctioneer_t >::Covariance = BoundSquareMatrix |
Definition at line 53 of file EigenStepper.hpp.
View newest version in sPHENIX GitHub at line 53 of file EigenStepper.hpp
using Acts::MultiEigenStepperLoop< extensionlist_t, component_reducer_t, auctioneer_t >::CurvilinearState = std::tuple<MultiComponentCurvilinearTrackParameters, Jacobian, ActsScalar> |
Define an own curvilinear state.
Definition at line 251 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 251 of file MultiEigenStepperLoop.hpp
using Acts::EigenStepper< extensionlist_t, auctioneer_t >::Jacobian = BoundMatrix |
Jacobian, Covariance and State definitions.
Definition at line 52 of file EigenStepper.hpp.
View newest version in sPHENIX GitHub at line 52 of file EigenStepper.hpp
using Acts::MultiEigenStepperLoop< extensionlist_t, component_reducer_t, auctioneer_t >::Reducer = component_reducer_t |
The reducer type.
Definition at line 254 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 254 of file MultiEigenStepperLoop.hpp
using Acts::MultiEigenStepperLoop< extensionlist_t, component_reducer_t, auctioneer_t >::SingleState = typename SingleStepper::State |
Typedef to the State of the single component Stepper.
Definition at line 239 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 239 of file MultiEigenStepperLoop.hpp
using Acts::MultiEigenStepperLoop< extensionlist_t, component_reducer_t, auctioneer_t >::SingleStepper = EigenStepper<extensionlist_t, auctioneer_t> |
Typedef to the Single-Component Eigen Stepper.
Definition at line 236 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 236 of file MultiEigenStepperLoop.hpp
|
private |
Small vector type for speeding up some computations where we need to accumulate stuff of components. We think 16 is a reasonable amount here.
Definition at line 232 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 232 of file MultiEigenStepperLoop.hpp
|
inline |
Constructor from a magnetic field and a optionally provided Logger.
Definition at line 260 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 260 of file MultiEigenStepperLoop.hpp
|
inline |
Absolute momentum accessor
state | [in] The stepping state (thread-local cache) |
Definition at line 658 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 658 of file MultiEigenStepperLoop.hpp
|
inline |
Add a component to the Multistepper
[in,out] | state | The stepping state (thread-local cache) |
[in] | pars | Parameters of the component to add |
[in] | weight | Weight of the component to add |
Definition at line 612 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 612 of file MultiEigenStepperLoop.hpp
References Acts::EigenStepper< extensionlist_t, auctioneer_t >::State::geoContext, and pars.
auto Acts::MultiEigenStepperLoop< E, R, A >::boundState | ( | State & | state, |
const Surface & | surface, | ||
bool | transportCov = true , |
||
const FreeToBoundCorrection & | freeToBoundCorrection = FreeToBoundCorrection(false) |
||
) | const |
This transports (if necessary) the covariance to the surface and creates a bound state. It does not check if the transported state is at the surface, this needs to be guaranteed by the propagator.
Create and return the bound state at the current position
[in] | state | State that will be presented as BoundState |
[in] | surface | The surface to which we bind the state |
[in] | transportCov | Flag steering covariance transport |
[in] | freeToBoundCorrection | Flag steering non-linear correction during global to local correction |
Definition at line 14 of file MultiEigenStepperLoop.ipp.
View newest version in sPHENIX GitHub at line 14 of file MultiEigenStepperLoop.ipp
References assert, Acts::detail::boundState(), Acts::eFreeDir0, Acts::eFreePos0, i, Acts::PlanarHelper::intersect(), Acts::Intersection< DIM >::position(), filter::state, and writeMapConfig::surface.
|
inline |
Charge access
state | [in] The stepping state (thread-local cache) |
Definition at line 672 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 672 of file MultiEigenStepperLoop.hpp
References charge().
|
inline |
Reset the number of components
[in,out] | state | The stepping state (thread-local cache) |
Definition at line 598 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 598 of file MultiEigenStepperLoop.hpp
|
inline |
Creates an iterable which can be plugged into a range-based for-loop to iterate over components
Definition at line 494 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 494 of file MultiEigenStepperLoop.hpp
References parse_cmake_options::begin, end, it, Acts::operator!=(), Acts::operator*(), Acts::operator==(), and physmon_simulation::s.
|
inline |
Creates an constant iterable which can be plugged into a range-based for-loop to iterate over components
Definition at line 531 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 531 of file MultiEigenStepperLoop.hpp
References parse_cmake_options::begin, end, it, Acts::operator!=(), Acts::operator*(), Acts::operator==(), and physmon_simulation::s.
auto Acts::MultiEigenStepperLoop< E, R, A >::curvilinearState | ( | State & | state, |
bool | transportCov = true |
||
) | const |
This transports (if necessary) the covariance to the current position and creates a curvilinear state.
Create and return a curvilinear state at the current position
[in] | state | State that will be presented as CurvilinearState |
[in] | transportCov | Flag steering covariance transport |
Definition at line 64 of file MultiEigenStepperLoop.ipp.
View newest version in sPHENIX GitHub at line 64 of file MultiEigenStepperLoop.ipp
References assert, Acts::detail::curvilinearState(), i, and filter::state.
|
inline |
Momentum direction accessor
state | [in] The stepping state (thread-local cache) |
Definition at line 646 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 646 of file MultiEigenStepperLoop.hpp
|
inline |
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 |
Definition at line 632 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 632 of file MultiEigenStepperLoop.hpp
References Acts::Test::pos.
|
inline |
Get the step size
state | [in] The stepping state (thread-local cache) |
stype | [in] The step size type to be returned |
Definition at line 813 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 813 of file MultiEigenStepperLoop.hpp
References KFPMath::a, KFPMath::b, Acts::EigenStepper< extensionlist_t, auctioneer_t >::State::stepSize, and Acts::ConstrainedStep::value().
|
inline |
Construct and initialize a state.
Definition at line 336 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 336 of file MultiEigenStepperLoop.hpp
|
inline |
Momentum accessor
state | [in] The stepping state (thread-local cache) |
Definition at line 665 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 665 of file MultiEigenStepperLoop.hpp
References momentum.
|
inline |
Get the number of components
state | [in,out] The stepping state (thread-local cache) |
Definition at line 566 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 566 of file MultiEigenStepperLoop.hpp
|
inline |
Output the Step Size of all components into one std::string
state | [in,out] The stepping state (thread-local cache) |
Definition at line 834 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 834 of file MultiEigenStepperLoop.hpp
|
inline |
Overstep limit
state | [in] The stepping state (thread-local cache) |
Definition at line 846 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 846 of file MultiEigenStepperLoop.hpp
|
inline |
Particle hypothesis
state | [in] The stepping state (thread-local cache) |
Definition at line 677 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 677 of file MultiEigenStepperLoop.hpp
References Acts::EigenStepper< extensionlist_t, auctioneer_t >::State::particleHypothesis.
|
inline |
Global particle position accessor
state | [in] The stepping state (thread-local cache) |
Definition at line 639 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 639 of file MultiEigenStepperLoop.hpp
References position.
|
inline |
QoP access
state | [in] The stepping state (thread-local cache) |
Definition at line 653 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 653 of file MultiEigenStepperLoop.hpp
|
inline |
Release the step-size for all components
state | [in,out] The stepping state (thread-local cache) |
Definition at line 825 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 825 of file MultiEigenStepperLoop.hpp
|
inline |
Remove missed components from the component state
state | [in,out] The stepping state (thread-local cache) |
Definition at line 573 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 573 of file MultiEigenStepperLoop.hpp
References root_event_diff_np::cmp().
|
inline |
Resets the state.
[in,out] | state | State of the stepper |
[in] | boundParams | Parameters in bound parametrisation |
[in] | cov | Covariance matrix |
[in] | surface | The reference surface of the bound parameters |
[in] | stepSize | Step size |
Definition at line 350 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 350 of file MultiEigenStepperLoop.hpp
References Acts::Test::stepSize.
|
inline |
Reweight the components
[in,out] | state | The stepping state (thread-local cache) |
Definition at line 585 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 585 of file MultiEigenStepperLoop.hpp
References root_event_diff_np::cmp().
|
inline |
Set 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 |
release | [in] Do we release the step size? |
Definition at line 798 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 798 of file MultiEigenStepperLoop.hpp
Result< double > Acts::MultiEigenStepperLoop< E, R, A >::step | ( | propagator_state_t & | state, |
const navigator_t & | navigator | ||
) | const |
Perform a Runge-Kutta track parameter propagation step
[in,out] | state | is the propagation state associated with the track parameters that are being propagated. |
[in] | navigator | is the navigator of the propagation |
The state contains the desired step size. It can be negative during backwards track propagation, and since we're using an adaptive algorithm, it can be modified by the stepper class during propagation.
Definition at line 93 of file MultiEigenStepperLoop.ipp.
View newest version in sPHENIX GitHub at line 93 of file MultiEigenStepperLoop.ipp
References Acts::ACTS_VERBOSE(), ACTS_WARNING, dfs::begin(), root_event_diff_np::cmp(), dfs::end(), logger(), m_logger, Acts::EigenStepper< extensionlist_t, auctioneer_t >::State::pathAccumulated, TauVsDIS_MachineLearning_Differentiation::results, step, str, and summary::summary.
|
inline |
Time access
state | [in] The stepping state (thread-local cache) |
Definition at line 684 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 684 of file MultiEigenStepperLoop.hpp
References Acts::Test::time.
|
inline |
Method for on-demand transport of the covariance to a new curvilinear frame at current position, or direction of the state
surface_t | the Surface type |
[in,out] | state | State of the stepper |
[in] | surface | is the surface to which the covariance is forwarded |
[in] | freeToBoundCorrection | Flag steering non-linear correction during global to local correction to |
Definition at line 915 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 915 of file MultiEigenStepperLoop.hpp
References Acts::transportCovarianceToBound().
|
inline |
Method for on-demand transport of the covariance to a new curvilinear frame at current position, or direction of the state
[in,out] | state | State of the stepper |
Definition at line 898 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 898 of file MultiEigenStepperLoop.hpp
References Acts::transportCovarianceToCurvilinear().
|
inline |
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) |
oIntersection | [in] The ObjectIntersection to layer, boundary, etc |
direction | [in] The propagation direction |
release | [in] boolean to trigger step size release |
Definition at line 777 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 777 of file MultiEigenStepperLoop.hpp
References Acts::Surface::intersect(), and position.
|
inline |
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] | navDir | The navigation direction |
[in] | bcheck | The boundary check for this status update |
[in] | surfaceTolerance | Surface tolerance used for intersection |
[in] | logger | A Logger instance |
Definition at line 697 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 697 of file MultiEigenStepperLoop.hpp
References Acts::ACTS_VERBOSE(), Acts::Surface::center(), Acts::EigenStepper< extensionlist_t, auctioneer_t >::State::geoContext, Acts::GeometryObject::geometryId(), logger(), Acts::Test::navDir, and writeMapConfig::surface.
|
private |
The logger (used if no logger is provided by caller of methods)
Definition at line 227 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 227 of file MultiEigenStepperLoop.hpp
|
private |
Limits the number of steps after at least one component reached the surface
Definition at line 224 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 224 of file MultiEigenStepperLoop.hpp
|
static |
How many components can this stepper manage?
Definition at line 257 of file MultiEigenStepperLoop.hpp.
View newest version in sPHENIX GitHub at line 257 of file MultiEigenStepperLoop.hpp