diff --git a/CI/physmon/reference/performance_ivf_truth_estimated_hist.root b/CI/physmon/reference/performance_ivf_truth_estimated_hist.root index 379d5bddde4..1d2048cf09e 100644 Binary files a/CI/physmon/reference/performance_ivf_truth_estimated_hist.root and b/CI/physmon/reference/performance_ivf_truth_estimated_hist.root differ diff --git a/Core/include/Acts/Vertexing/GaussianTrackDensity.hpp b/Core/include/Acts/Vertexing/GaussianTrackDensity.hpp index 932219c6b50..7654468b161 100644 --- a/Core/include/Acts/Vertexing/GaussianTrackDensity.hpp +++ b/Core/include/Acts/Vertexing/GaussianTrackDensity.hpp @@ -117,7 +117,7 @@ class GaussianTrackDensity { /// InputTrack /// /// @return Pair of position of global maximum and Gaussian width - std::pair globalMaximumWithWidth( + Result>> globalMaximumWithWidth( State& state, const std::vector& trackList) const; /// @brief Calculates the z position of the global maximum @@ -128,8 +128,8 @@ class GaussianTrackDensity { /// InputTrack /// /// @return z position of the global maximum - double globalMaximum(State& state, - const std::vector& trackList) const; + Result> globalMaximum( + State& state, const std::vector& trackList) const; private: /// The configuration diff --git a/Core/src/Vertexing/GaussianTrackDensity.cpp b/Core/src/Vertexing/GaussianTrackDensity.cpp index 63093300e3e..b2e489a04ba 100644 --- a/Core/src/Vertexing/GaussianTrackDensity.cpp +++ b/Core/src/Vertexing/GaussianTrackDensity.cpp @@ -14,11 +14,12 @@ namespace Acts { -std::pair Acts::GaussianTrackDensity::globalMaximumWithWidth( +Result>> +Acts::GaussianTrackDensity::globalMaximumWithWidth( State& state, const std::vector& trackList) const { auto result = addTracks(state, trackList); if (!result.ok()) { - return std::make_pair(0., 0.); + return result.error(); } double maxPosition = 0.; @@ -58,15 +59,24 @@ std::pair Acts::GaussianTrackDensity::globalMaximumWithWidth( maxDensity, maxSecondDerivative); } - return (maxSecondDerivative == 0.) - ? std::make_pair(0., 0.) - : std::make_pair(maxPosition, - std::sqrt(-(maxDensity / maxSecondDerivative))); + if (maxSecondDerivative == 0.) { + return std::nullopt; + } + + return std::pair{maxPosition, std::sqrt(-(maxDensity / maxSecondDerivative))}; } -double Acts::GaussianTrackDensity::globalMaximum( +Result> Acts::GaussianTrackDensity::globalMaximum( State& state, const std::vector& trackList) const { - return globalMaximumWithWidth(state, trackList).first; + auto maxRes = globalMaximumWithWidth(state, trackList); + if (!maxRes.ok()) { + return maxRes.error(); + } + const auto& maxOpt = *maxRes; + if (!maxOpt.has_value()) { + return std::nullopt; + } + return maxOpt->first; } Result Acts::GaussianTrackDensity::addTracks( diff --git a/Core/src/Vertexing/TrackDensityVertexFinder.cpp b/Core/src/Vertexing/TrackDensityVertexFinder.cpp index fda66cec8cc..32c2b227678 100644 --- a/Core/src/Vertexing/TrackDensityVertexFinder.cpp +++ b/Core/src/Vertexing/TrackDensityVertexFinder.cpp @@ -15,9 +15,16 @@ Acts::Result> Acts::TrackDensityVertexFinder::find( GaussianTrackDensity::State densityState(trackVector.size()); // Calculate z seed position - std::pair zAndWidth = - m_cfg.trackDensityEstimator.globalMaximumWithWidth(densityState, - trackVector); + auto zAndWidthRes = m_cfg.trackDensityEstimator.globalMaximumWithWidth( + densityState, trackVector); + if (!zAndWidthRes.ok()) { + return zAndWidthRes.error(); + } + const auto& zAndWidthOpt = *zAndWidthRes; + if (!zAndWidthOpt) { + return std::vector(); + } + const auto& zAndWidth = *zAndWidthOpt; double z = zAndWidth.first;