acts-project / acts-project/acts

FLTUND in KF in physmon at `PointwiseMaterialInteraction::covarianceContributions`

Aperta
#3,890 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
Component - Core fpe Impact - Minor Stale
Lingua principale
C++
Stelle
131
Fork
276
Merge medio
3g 13h
PR unite (30g)
112

Descrizione

# Problem
I tried to run the KF with the current physmon settings but with 100k events. This leads on the gitlab CI to an FPE of type `FLTUND`. This happend in the call
```
Traceback (most recent call last):
File "/builds/acts/ci-bridge/src/CI/physmon/workflows/physmon_trackfitting_gx2f_vs_kf.py", line 38, in
s.run()
RuntimeError: Sequencer terminated abnormally
::error::🟥 Dataset generation failed: CI/physmon/workflows/physmon_trackfitting_gx2f_vs_kf.py -> ec=1
```

https://gitlab.cern.ch/acts/ci-bridge/-/jobs/46363712

# Stack trace
```
11:24:40 Sequencer INFO 52900 / 100000 events processed
11:24:40 Sequencer INFO 53000 / 100000 events processed
11:24:41 Sequencer INFO FPE of type FLTUND exceeded configured per-event threshold of 0 (mask: NONE) (seen: 1 FPEs)
0# Acts::detail::PointwiseMaterialInteraction::covarianceContributions(bool, bool) at /builds/acts/ci-bridge/src/Core/src/Propagator/detail/PointwiseMaterialInteraction.cpp:43
1# void Acts::KalmanFitter, Acts::VectorMultiTrajectory>::Actor >::materialInteractor, Acts::VectorMultiTrajectory>::Actor >, Acts::PathLimitReached> >, Acts::SympyStepper::State, Acts::Navigator::State, Acts::KalmanFitterResult >, Acts::SympyStepper, Acts::Navigator>(Acts::Surface const*, Acts::PropagatorState, Acts::VectorMultiTrajectory>::Actor >, Acts::PathLimitReached> >, Acts::SympyStepper::State, Acts::Navigator::State, Acts::KalmanFitterResult >&, Acts::SympyStepper const&, Acts::Navigator const&, Acts::MaterialUpdateStage const&) const [clone .isra.0] at /builds/acts/ci-bridge/src/Core/include/Acts/TrackFitting/KalmanFitter.hpp:876
2# void Acts::KalmanFitter, Acts::VectorMultiTrajectory>::Actor >::act, Acts::VectorMultiTrajectory>::Actor >, Acts::PathLimitReached> >, Acts::SympyStepper::State, Acts::Navigator::State, Acts::KalmanFitterResult >, Acts::SympyStepper, Acts::Navigator>(Acts::PropagatorState, Acts::VectorMultiTrajectory>::Actor >, Acts::PathLimitReached> >, Acts::SympyStepper::State, Acts::Navigator::State, Acts::KalmanFitterResult >&, Acts::SympyStepper const&, Acts::Navigator const&, Acts::KalmanFitterResult&, Acts::Logger const&) const [clone .isra.0] at /builds/acts/ci-bridge/src/Core/include/Acts/TrackFitting/KalmanFitter.hpp:383
3# Acts::Result Acts::Propagator::propagate, Acts::VectorMultiTrajectory>::Actor >, Acts::PathLimitReached> >, Acts::SympyStepper::State, Acts::Navigator::State, Acts::KalmanFitterResult > >(Acts::PropagatorState, Acts::VectorMultiTrajectory>::Actor >, Acts::PathLimitReached> >, Acts::SympyStepper::State, Acts::Navigator::State, Acts::KalmanFitterResult >&) const at /builds/acts/ci-bridge/src/Core/include/Acts/Propagator/Propagator.ipp:77
4# Acts::Result::TrackProxy, std::error_code> Acts::KalmanFitter, Acts::VectorMultiTrajectory>::fit_impl, Acts::PropagatorOptions, Acts::VectorMultiTrajectory>::Actor > > >, Acts::KalmanFitterResult, Acts::TrackContainer >(Acts::GenericBoundTrackParameters const&, Acts::PropagatorOptions, Acts::VectorMultiTrajectory>::Actor > > > const&, Acts::TrackContainer&) const at /builds/acts/ci-bridge/src/Core/include/Acts/TrackFitting/KalmanFitter.hpp:1245
5# Acts::Result::TrackProxy, std::error_code> Acts::KalmanFitter, Acts::VectorMultiTrajectory>::fit<__gnu_cxx::__normal_iterator > >, Acts::GenericBoundTrackParameters, Acts::GenericBoundTrackParameters, Acts::TrackContainer >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, Acts::GenericBoundTrackParameters const&, Acts::KalmanFitterOptions const&, Acts::TrackContainer&) const at /builds/acts/ci-bridge/src/Core/include/Acts/TrackFitting/KalmanFitter.hpp:1134
6# (anonymous namespace)::KalmanFitterFunctionImpl::operator()(std::vector > const&, Acts::GenericBoundTrackParameters const&, ActsExamples::TrackFitterFunction::GeneralFitterOptions const&, ActsExamples::MeasurementCalibratorAdapter const&, Acts::TrackContainer&) const at /builds/acts/ci-bridge/src/Examples/Algorithms/TrackFitting/src/KalmanFitterFunction.cpp:137
7# ActsExamples::TrackFittingAlgorithm::execute(ActsExamples::AlgorithmContext const&) const at /builds/acts/ci-bridge/src/Examples/Algorithms/TrackFitting/src/TrackFittingAlgorithm.cpp:141
```

# Analysis
We end up here with a multiplication of small floats.
`Core/src/Propagator/detail/PointwiseMaterialInteraction.cpp:43`:
```
const float sigmaQoverP =
computeEnergyLossLandauSigmaQOverP(slab, mass, qOverP, absQ);
varianceQoverP = sigmaQoverP * sigmaQoverP;
```

These small floats are coming from the multiplication of many other small floats in
`Core/src/Material/Interactions.cpp:310`:
```
float Acts::computeEnergyLossLandauSigmaQOverP(const MaterialSlab& slab,
float m, float qOverP,
float absQ) {
const RelativisticQuantities rq{m, qOverP, absQ};
const float fwhm = detail::computeEnergyLossLandauFwhm(slab, rq);
const float sigmaE = convertLandauFwhmToGaussianSigma(fwhm);
// var(q/p) = (d(q/p)/dE)² * var(E)
// d(q/p)/dE = d/dE (q/sqrt(E²-m²))
// = q * -(1/2) * 1/p³ * 2E
// = -q/p² E/p = -(q/p)² * 1/(q*beta) = -(q/p)² * (q/beta) / q²
// var(q/p) = (q/p)^4 * (q/beta)² * (1/q)^4 * var(E)
// = (1/p)^4 * (q/beta)² * var(E)
// do not need to care about the sign since it is only used squared
const float pInv = qOverP / absQ;
const float qOverBeta = std::sqrt(rq.q2OverBeta2);
return qOverBeta * pInv * pInv * sigmaE;
}
```

# Next steps
As discussed with @andiwand we should wait, until we switch the material from `float` to `double` and see, if the problem persists.

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.