From b8374e59f50b78ef0eb2504a22370cff79380a10 Mon Sep 17 00:00:00 2001
From: Bastian Schlag <bastian.schlag@cern.ch>
Date: Thu, 27 Feb 2020 18:30:33 +0100
Subject: [PATCH] make vertex finders take vector of const BoundParameter
 pointer

---
 .../Vertexing/AdaptiveMultiVertexFinder.hpp   | 20 +++++------
 .../Vertexing/AdaptiveMultiVertexFinder.ipp   | 34 ++++++++-----------
 .../Acts/Vertexing/GaussianTrackDensity.hpp   |  6 ++--
 .../Vertexing/TrackDensityVertexFinder.hpp    |  2 +-
 .../Vertexing/TrackDensityVertexFinder.ipp    |  6 ++--
 Core/src/Vertexing/GaussianTrackDensity.cpp   |  6 ++--
 Tests/UnitTests/Core/Utilities/CMakeLists.txt |  1 +
 .../TrackDensityVertexFinderTests.cpp         | 16 ++++++---
 8 files changed, 47 insertions(+), 44 deletions(-)

diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
index 1acbc7a77..79d72929b 100644
--- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
+++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
@@ -181,7 +181,7 @@ class AdaptiveMultiVertexFinder {
   ///
   /// @return Vector of all reconstructed vertices
   Result<std::vector<Vertex<InputTrack_t>>> find(
-      const std::vector<InputTrack_t>& allTracks,
+      const std::vector<const InputTrack_t*>& allTracks,
       const VertexFinderOptions<InputTrack_t>& vFinderOptions) const;
 
  private:
@@ -210,7 +210,7 @@ class AdaptiveMultiVertexFinder {
   ///
   /// @return The seed vertex
   Result<Vertex<InputTrack_t>> doSeeding(
-      const std::vector<InputTrack_t>& trackVector,
+      const std::vector<const InputTrack_t*>& trackVector,
       Vertex<InputTrack_t>& currentConstraint,
       const VertexFinderOptions<InputTrack_t>& vFinderOptions) const;
 
@@ -237,7 +237,7 @@ class AdaptiveMultiVertexFinder {
   /// @param tracks The tracks
   /// @param[out] vtx The vertex candidate
   Result<void> addCompatibleTracksToVertex(
-      const std::vector<InputTrack_t>& tracks, Vertex<InputTrack_t>* vtx) const;
+      const std::vector<const InputTrack_t*>& tracks, Vertex<InputTrack_t>* vtx) const;
 
   /// @brief Method that tries to recover from cases where no tracks
   /// where added to the vertex candidate after seeding
@@ -251,8 +251,8 @@ class AdaptiveMultiVertexFinder {
   ///
   /// return True if recovery was successful, false otherwise
   Result<bool> canRecoverFromNoCompatibleTracks(
-      const std::vector<InputTrack_t>& myTracks,
-      const std::vector<InputTrack_t>& seedTracks, Vertex<InputTrack_t>* vtx,
+      const std::vector<const InputTrack_t*>& myTracks,
+      const std::vector<const InputTrack_t*>& seedTracks, Vertex<InputTrack_t>* vtx,
       const Vertex<InputTrack_t>& currentConstraint,
       FitterState_t& fitterState) const;
 
@@ -267,8 +267,8 @@ class AdaptiveMultiVertexFinder {
   ///
   /// @return True if preparation was successful, false otherwise
   Result<bool> canPrepareVertexForFit(
-      const std::vector<InputTrack_t>& myTracks,
-      const std::vector<InputTrack_t>& seedTracks, Vertex<InputTrack_t>* vtx,
+      const std::vector<const InputTrack_t*>& myTracks,
+      const std::vector<const InputTrack_t*>& seedTracks, Vertex<InputTrack_t>* vtx,
       const Vertex<InputTrack_t>& currentConstraint,
       FitterState_t& fitterState) const;
 
@@ -281,7 +281,7 @@ class AdaptiveMultiVertexFinder {
   /// @param[out] isGoodVertex Vertex is good vertex
   void checkVertexAndCompatibleTracks(
       const Vertex<InputTrack_t>* vtx,
-      const std::vector<InputTrack_t>& seedTracks, int& nCompatibleTracks,
+      const std::vector<const InputTrack_t*>& seedTracks, int& nCompatibleTracks,
       bool& isGoodVertex) const;
 
   /// @brief Method that removes all tracks that are compatible with
@@ -291,7 +291,7 @@ class AdaptiveMultiVertexFinder {
   /// @param[out] seedTracks The seed tracks
   void removeCompatibleTracksFromSeedTracks(
       const Vertex<InputTrack_t>* vtx,
-      std::vector<InputTrack_t>& seedTracks) const;
+      std::vector<const InputTrack_t*>& seedTracks) const;
 
   /// @brief Method that tries to remove a non-compatible track
   /// from seed tracks after removing a compatible track failed.
@@ -302,7 +302,7 @@ class AdaptiveMultiVertexFinder {
   /// @return Non-compatible track was removed
   bool canRemoveNonCompatibleTrackFromSeedTracks(
       const Vertex<InputTrack_t>* vtx,
-      std::vector<InputTrack_t>& seedTracks) const;
+      std::vector<const InputTrack_t*>& seedTracks) const;
 
   /// @brief Method that evaluates if the new vertex candidate should
   /// be kept, i.e. saved, or not
diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
index a742bd332..c578f3a77 100644
--- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
+++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
@@ -11,20 +11,17 @@
 
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
-    const std::vector<InputTrack_t>& allTracks,
+    const std::vector<const InputTrack_t*>& allTracks,
     const VertexFinderOptions<InputTrack_t>& vFinderOptions) const
     -> Result<std::vector<Vertex<InputTrack_t>>> {
   if (allTracks.empty()) {
     return VertexingError::EmptyInput;
   }
-
-  std::vector<const InputTrack_t*> seedTracks;
-  for(const auto& trk : allTracks){
-    seedTracks.push_back(&trk);
-  }
-
   // Original tracks
-  const std::vector<const InputTrack_t*> origTracks = seedTracks;
+  const std::vector<const InputTrack_t*>& origTracks = allTracks;
+
+  // Seed tracks
+  std::vector<const InputTrack_t*> seedTracks = allTracks;
 
   // Construct the vertex fitter options from vertex finder options
   VertexFitterOptions<InputTrack_t> vFitterOptions(
@@ -43,7 +40,6 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
          iteration < m_cfg.maxIterations) {
     // Tracks that are used for searching compatible tracks
     // near a vertex candidate
-    // TODO: This involves a lot of copying. Change the way of accessing tracks
     std::vector<const InputTrack_t*> myTracks;
     if (m_cfg.realMultiVertex == true) {
       myTracks = origTracks;
@@ -139,7 +135,7 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
 
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::doSeeding(
-    const std::vector<InputTrack_t>& trackVector,
+    const std::vector<const InputTrack_t*>& trackVector,
     Vertex<InputTrack_t>& currentConstraint,
     const VertexFinderOptions<InputTrack_t>& vFinderOptions) const
     -> Result<Vertex<InputTrack_t>> {
@@ -221,7 +217,7 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::getIPSignificance(
 
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
-    addCompatibleTracksToVertex(const std::vector<InputTrack_t>& tracks,
+    addCompatibleTracksToVertex(const std::vector<const InputTrack_t*>& tracks,
                                 Vertex<InputTrack_t>* vtx) const
     -> Result<void> {
   std::vector<TrackAtVertex<InputTrack_t>> tracksAtVtx;
@@ -248,8 +244,8 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
     canRecoverFromNoCompatibleTracks(
-        const std::vector<InputTrack_t>& myTracks,
-        const std::vector<InputTrack_t>& seedTracks, Vertex<InputTrack_t>* vtx,
+        const std::vector<const InputTrack_t*>& myTracks,
+        const std::vector<const InputTrack_t*>& seedTracks, Vertex<InputTrack_t>* vtx,
         const Vertex<InputTrack_t>& currentConstraint,
         FitterState_t& fitterState) const -> Result<bool> {
   // Recover from cases where no compatible tracks to vertex
@@ -304,8 +300,8 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
 
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
-    canPrepareVertexForFit(const std::vector<InputTrack_t>& myTracks,
-                           const std::vector<InputTrack_t>& seedTracks,
+    canPrepareVertexForFit(const std::vector<const InputTrack_t*>& myTracks,
+                           const std::vector<const InputTrack_t*>& seedTracks,
                            Vertex<InputTrack_t>* vtx,
                            const Vertex<InputTrack_t>& currentConstraint,
                            FitterState_t& fitterState) const -> Result<bool> {
@@ -331,7 +327,7 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
     checkVertexAndCompatibleTracks(const Vertex<InputTrack_t>* vtx,
-                                   const std::vector<InputTrack_t>& seedTracks,
+                                   const std::vector<const InputTrack_t*>& seedTracks,
                                    int& nCompatibleTracks,
                                    bool& isGoodVertex) const -> void {
   for (const auto& trk : vtx->tracks()) {
@@ -365,7 +361,7 @@ template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
     removeCompatibleTracksFromSeedTracks(
         const Vertex<InputTrack_t>* vtx,
-        std::vector<InputTrack_t>& seedTracks) const -> void {
+        std::vector<const InputTrack_t*>& seedTracks) const -> void {
   for (const auto& trk : vtx->tracks()) {
     if ((trk.vertexCompatibility < m_cfg.maxVertexChi2 &&
          m_cfg.useFastCompatibility) ||
@@ -390,10 +386,10 @@ template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
     canRemoveNonCompatibleTrackFromSeedTracks(
         const Vertex<InputTrack_t>* vtx,
-        std::vector<InputTrack_t>& seedTracks) const -> bool {
+        std::vector<const InputTrack_t*>& seedTracks) const -> bool {
   // Try to find the track with highest compatibility
   double maxCompatibility = 0;
-  typename std::vector<InputTrack_t>::iterator maxCompSeedIt;
+  typename std::vector<const InputTrack_t*>::iterator maxCompSeedIt;
   for (const auto& trk : vtx->tracks()) {
     double compatibility = trk.vertexCompatibility;
     if (compatibility > maxCompatibility) {
diff --git a/Core/include/Acts/Vertexing/GaussianTrackDensity.hpp b/Core/include/Acts/Vertexing/GaussianTrackDensity.hpp
index 6ac751d13..815694f31 100644
--- a/Core/include/Acts/Vertexing/GaussianTrackDensity.hpp
+++ b/Core/include/Acts/Vertexing/GaussianTrackDensity.hpp
@@ -50,7 +50,7 @@ class GaussianTrackDensity {
   /// @param state The GaussianTrackDensity state
   ///
   /// @return The z position of the maximum
-  double globalMaximum(const std::vector<Acts::BoundParameters>& trackList,
+  double globalMaximum(const std::vector<const Acts::BoundParameters>& trackList,
                        State& state) const;
 
   /// @brief Calculates the global maximum with width
@@ -60,7 +60,7 @@ class GaussianTrackDensity {
   ///
   /// @return The z position of the maximum and its width
   std::pair<double, double> globalMaximumWithWidth(
-      const std::vector<Acts::BoundParameters>& trackList, State& state) const;
+      const std::vector<const Acts::BoundParameters>& trackList, State& state) const;
 
  private:
   /// The configuration
@@ -70,7 +70,7 @@ class GaussianTrackDensity {
   ///
   /// @param trackList The list of tracks
   /// @param state The GaussianTrackDensity state
-  void addTracks(const std::vector<Acts::BoundParameters>& trackList,
+  void addTracks(const std::vector<const Acts::BoundParameters>& trackList,
                  State& state) const;
 };
 }  // namespace Acts
diff --git a/Core/include/Acts/Vertexing/TrackDensityVertexFinder.hpp b/Core/include/Acts/Vertexing/TrackDensityVertexFinder.hpp
index a5379e7c8..f85b29662 100644
--- a/Core/include/Acts/Vertexing/TrackDensityVertexFinder.hpp
+++ b/Core/include/Acts/Vertexing/TrackDensityVertexFinder.hpp
@@ -56,7 +56,7 @@ class TrackDensityVertexFinder {
   /// @return Vector of vertices, filled with a single
   ///         vertex (for consistent interfaces)
   Result<std::vector<Vertex<InputTrack_t>>> find(
-      const std::vector<InputTrack_t>& trackVector,
+      const std::vector<const InputTrack_t*>& trackVector,
       const VertexFinderOptions<InputTrack_t>& vFinderOptions) const;
 
   /// @brief Constructor used if InputTrack_t type == BoundParameters
diff --git a/Core/include/Acts/Vertexing/TrackDensityVertexFinder.ipp b/Core/include/Acts/Vertexing/TrackDensityVertexFinder.ipp
index cf0f02b5f..d2e957f29 100644
--- a/Core/include/Acts/Vertexing/TrackDensityVertexFinder.ipp
+++ b/Core/include/Acts/Vertexing/TrackDensityVertexFinder.ipp
@@ -8,16 +8,16 @@
 
 template <typename vfitter_t, typename track_density_t>
 auto Acts::TrackDensityVertexFinder<vfitter_t, track_density_t>::find(
-    const std::vector<InputTrack_t>& trackVector,
+    const std::vector<const InputTrack_t*>& trackVector,
     const VertexFinderOptions<InputTrack_t>& vFinderOptions) const
     -> Result<std::vector<Vertex<InputTrack_t>>> {
   typename track_density_t::State densityState;
 
-  std::vector<BoundParameters> trackList;
+  std::vector<const BoundParameters> trackList;
   trackList.reserve(trackVector.size());
 
   for (const auto& trk : trackVector) {
-    trackList.push_back(m_extractParameters(trk));
+    trackList.push_back(m_extractParameters(*trk));
   }
 
   // Calculate z seed position
diff --git a/Core/src/Vertexing/GaussianTrackDensity.cpp b/Core/src/Vertexing/GaussianTrackDensity.cpp
index 44a080f9c..7e701a089 100644
--- a/Core/src/Vertexing/GaussianTrackDensity.cpp
+++ b/Core/src/Vertexing/GaussianTrackDensity.cpp
@@ -9,19 +9,19 @@
 #include "Acts/Vertexing/GaussianTrackDensity.hpp"
 
 double Acts::GaussianTrackDensity::globalMaximum(
-    const std::vector<Acts::BoundParameters>& trackList, State& state) const {
+    const std::vector<const Acts::BoundParameters>& trackList, State& state) const {
   addTracks(trackList, state);
   return state.trackDensity.globalMaximum(state.trackDensityState);
 }
 
 std::pair<double, double> Acts::GaussianTrackDensity::globalMaximumWithWidth(
-    const std::vector<Acts::BoundParameters>& trackList, State& state) const {
+    const std::vector<const Acts::BoundParameters>& trackList, State& state) const {
   addTracks(trackList, state);
   return state.trackDensity.globalMaximumWithWidth(state.trackDensityState);
 }
 
 void Acts::GaussianTrackDensity::addTracks(
-    const std::vector<Acts::BoundParameters>& trackList, State& state) const {
+    const std::vector<const Acts::BoundParameters>& trackList, State& state) const {
   const double d0SignificanceCut =
       m_cfg.d0MaxSignificance * m_cfg.d0MaxSignificance;
   const double z0SignificanceCut =
diff --git a/Tests/UnitTests/Core/Utilities/CMakeLists.txt b/Tests/UnitTests/Core/Utilities/CMakeLists.txt
index 5462c9b65..82fe124a3 100644
--- a/Tests/UnitTests/Core/Utilities/CMakeLists.txt
+++ b/Tests/UnitTests/Core/Utilities/CMakeLists.txt
@@ -1,5 +1,6 @@
 add_unittest(AnnealingUtilityTests AnnealingUtilityTests.cpp)
 add_unittest(AxesTests AxesTests.cpp)
+add_unittest(BenchmarkTools BenchmarkTools.cpp)
 add_unittest(BFieldMapUtilsTests BFieldMapUtilsTests.cpp)
 add_unittest(BinningDataTests BinningDataTests.cpp)
 add_unittest(BinUtilityTests BinUtilityTests.cpp)
diff --git a/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp b/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp
index 1d586c08c..16cbf887a 100644
--- a/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp
@@ -65,8 +65,8 @@ BOOST_AUTO_TEST_CASE(track_density_finder_test) {
                            perigeeSurface);
 
   // Vectors of track parameters in different orders
-  std::vector<BoundParameters> vec1 = {params1a, params1b, params1c};
-  std::vector<BoundParameters> vec2 = {params1c, params1a, params1b};
+  std::vector<const BoundParameters*> vec1 = {&params1a, &params1b, &params1c};
+  std::vector<const BoundParameters*> vec2 = {&params1c, &params1a, &params1b};
 
   auto res1 = finder.find(vec1, vFinderOptions);
   auto res2 = finder.find(vec2, vFinderOptions);
@@ -133,7 +133,7 @@ BOOST_AUTO_TEST_CASE(track_density_finder_constr_test) {
                            perigeeSurface);
 
   // Vector of track parameters
-  std::vector<BoundParameters> vec1 = {params1a, params1b, params1c};
+  std::vector<const BoundParameters*> vec1 = {&params1a, &params1b, &params1c};
 
   auto res = finder.find(vec1, vFinderOptions);
 
@@ -213,7 +213,13 @@ BOOST_AUTO_TEST_CASE(track_density_finder_random_test) {
                                        perigeeSurface));
   }
 
-  auto res3 = finder.find(trackVec, vFinderOptions);
+  std::vector<const BoundParameters*> trackPtrVec;
+  for(const auto& trk : trackVec){
+    trackPtrVec.push_back(&trk);
+  }
+
+
+  auto res3 = finder.find(trackPtrVec, vFinderOptions);
   if (!res3.ok()) {
     std::cout << res3.error().message() << std::endl;
   }
@@ -286,7 +292,7 @@ BOOST_AUTO_TEST_CASE(track_density_finder_usertrack_test) {
       BoundParameters(tgContext, covMat, pos1c, mom1c, -1, 0, perigeeSurface));
 
   // Vector of track parameters
-  std::vector<InputTrack> vec1 = {params1a, params1b, params1c};
+  std::vector<const InputTrack*> vec1 = {&params1a, &params1b, &params1c};
 
   auto res = finder.find(vec1, vFinderOptions);
 
-- 
GitLab