diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp index e8ad766a47a69d47cee3639a4e8f5a30483725f5..ae9923fffc697061ed6c24c797de791e3930c989 100644 --- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp +++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp @@ -16,6 +16,7 @@ #include "Acts/Vertexing/AMVFInfo.hpp" #include "Acts/Vertexing/TrackToVertexIPEstimator.hpp" #include "Acts/Vertexing/VertexFinderOptions.hpp" +#include "Acts/Vertexing/VertexFitterOptions.hpp" namespace Acts { /// @class AdaptiveMultiVertexFinder @@ -339,6 +340,22 @@ class AdaptiveMultiVertexFinder { const Vertex<InputTrack_t>* vtx, const std::vector<Vertex<InputTrack_t>*>& allVertices) const; + /// @brief Method that deletes last vertex from list of all vertices + /// and either refits all vertices afterwards (if refitAfterBadVertex) + /// of reverts to the old state of the vertex fitter before the bad + /// vertex was added to the fit (if not refitAfterBadVertex). + /// + /// @param allVertices Vector containing the unique_ptr to vertices + /// @param allVerticesPtr Vector containing the actual addresses + /// @param fitterState The current vertex fitter state + /// @param oldFitterState The old vertex fitter state + /// @param vFitterOptions The vertex fitter options + Result<void> deleteLastVertex( + std::vector<std::unique_ptr<Vertex<InputTrack_t>>>& allVertices, + std::vector<Vertex<InputTrack_t>*>& allVerticesPtr, + FitterState_t& fitterState, FitterState_t& oldFitterState, + const VertexFitterOptions<InputTrack_t>& vFitterOptions) const; + /// @brief Prepares the output vector of vertices /// /// @param allVerticesPtr Vector of pointers to vertices diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp index 785cb1fce1e1aceb1d7881e883565616b85f2f83..f41e1e8b381209cf953e42308e16b3d119e78025 100644 --- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp +++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp @@ -6,7 +6,6 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -#include "Acts/Vertexing/VertexFitterOptions.hpp" #include "Acts/Vertexing/VertexingError.hpp" template <typename vfitter_t, typename sfinder_t> @@ -91,7 +90,6 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find( } ACTS_DEBUG("New position of current vertex candidate after fit: " << vtxCandidate->fullPosition()); - // Check if vertex is good vertex bool isGoodVertex = false; int nCompatibleTracks = 0; @@ -106,7 +104,6 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find( bool removedNonCompatibleTrack = canRemoveNonCompatibleTrackFromSeedTracks(vtxCandidate, seedTracks, fitterState); - if (!removedNonCompatibleTrack) { ACTS_DEBUG( "Could not remove any further track from seed tracks. Break."); @@ -121,34 +118,11 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find( // Delete vertex from allVertices list again if it's not kept if (not keepVertex) { - allVertices.pop_back(); - allVerticesPtr.pop_back(); - - if (!m_cfg.refitAfterBadVertex) { - fitterState.vertexCollection = oldFitterState.vertexCollection; - fitterState.annealingState = oldFitterState.annealingState; - fitterState.vtxInfoMap.clear(); - for (const auto& vtx : allVerticesPtr) { - fitterState.vtxInfoMap.insert( - std::make_pair(vtx, oldFitterState.vtxInfoMap[vtx])); - } - fitterState.trackToVerticesMultiMap = - oldFitterState.trackToVerticesMultiMap; - fitterState.tracksAtVerticesMap = oldFitterState.tracksAtVerticesMap; - - } else { - // Update fitter state with removed vertex candidate - fitterState.updateTrkToVerticesMultiMap(allVerticesPtr); - - // TODO: clean tracksAtVerticesMap maybe here? i.e. remove all entries - // with old vertex? - - // Do the fit with removed vertex - auto fitResult = m_cfg.vertexFitter.fit( - fitterState, allVerticesPtr, m_cfg.linearizer, vFitterOptions); - if (!fitResult.ok()) { - return fitResult.error(); - } + auto deleteVertexResult = + deleteLastVertex(allVertices, allVerticesPtr, fitterState, + oldFitterState, vFitterOptions); + if (not deleteVertexResult.ok()) { + return deleteVertexResult.error(); } } iteration++; @@ -543,6 +517,45 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::isMergedVertex( return false; } +template <typename vfitter_t, typename sfinder_t> +auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::deleteLastVertex( + std::vector<std::unique_ptr<Vertex<InputTrack_t>>>& allVertices, + std::vector<Vertex<InputTrack_t>*>& allVerticesPtr, + FitterState_t& fitterState, FitterState_t& oldFitterState, + const VertexFitterOptions<InputTrack_t>& vFitterOptions) const + -> Result<void> { + allVertices.pop_back(); + allVerticesPtr.pop_back(); + + if (!m_cfg.refitAfterBadVertex) { + fitterState.vertexCollection = oldFitterState.vertexCollection; + fitterState.annealingState = oldFitterState.annealingState; + fitterState.vtxInfoMap.clear(); + for (const auto& vtx : allVerticesPtr) { + fitterState.vtxInfoMap.insert( + std::make_pair(vtx, oldFitterState.vtxInfoMap[vtx])); + } + fitterState.trackToVerticesMultiMap = + oldFitterState.trackToVerticesMultiMap; + fitterState.tracksAtVerticesMap = oldFitterState.tracksAtVerticesMap; + + } else { + // Update fitter state with removed vertex candidate + fitterState.updateTrkToVerticesMultiMap(allVerticesPtr); + + // TODO: clean tracksAtVerticesMap maybe here? i.e. remove all entries + // with old vertex? + + // Do the fit with removed vertex + auto fitResult = m_cfg.vertexFitter.fit(fitterState, allVerticesPtr, + m_cfg.linearizer, vFitterOptions); + if (!fitResult.ok()) { + return fitResult.error(); + } + } + return {}; +} + template <typename vfitter_t, typename sfinder_t> auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::getVertexOutputList( const std::vector<Vertex<InputTrack_t>*>& allVerticesPtr,