From 6b1b7718b4132e4d03fa7c5bababfc7a70cdf6f3 Mon Sep 17 00:00:00 2001
From: Scott Snyder <scott.snyder@cern.ch>
Date: Mon, 27 Sep 2021 18:30:56 +0200
Subject: [PATCH] TrkTrack+TRT_SegmentToTrackTool+TrkMaterialProvider: Remove
 non-const trackStateOnSurfaces.

---
 .../src/TRT_SegmentToTrackTool.cxx            | 20 ++++------
 Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h   | 10 +----
 Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc |  8 +---
 .../src/TrkMaterialProviderTool.cxx           | 40 ++++++++++++-------
 4 files changed, 35 insertions(+), 43 deletions(-)

diff --git a/InnerDetector/InDetRecTools/TRT_SegmentToTrackTool/src/TRT_SegmentToTrackTool.cxx b/InnerDetector/InDetRecTools/TRT_SegmentToTrackTool/src/TRT_SegmentToTrackTool.cxx
index 2ee58344e1ae..b7db18ec9129 100644
--- a/InnerDetector/InDetRecTools/TRT_SegmentToTrackTool/src/TRT_SegmentToTrackTool.cxx
+++ b/InnerDetector/InDetRecTools/TRT_SegmentToTrackTool/src/TRT_SegmentToTrackTool.cxx
@@ -335,11 +335,8 @@ namespace InDet {
     info.setPatternRecognitionInfo(Trk::TrackInfo::TRTStandalone);
 
     // create new track candidate
-    Trk::Track* newTrack = new Trk::Track(info, std::move(ntsos), fq);
-    // We need to keep the tsos added. As later on we modify them
-    auto newTrackTSOS = newTrack->trackStateOnSurfaces();
     if (!m_doRefit) {
-      return newTrack;
+      return new Trk::Track(info, std::move(ntsos), fq);
     } else {
       //
       // ----------------------------- this is a horrible hack to make the
@@ -369,8 +366,6 @@ namespace InDet {
           m_extrapolator->extrapolateDirectly(*segPar, perigeeSurface));
         if (!tempper) {
           ATH_MSG_DEBUG("Could not produce perigee");
-          delete newTrack;
-          newTrack = nullptr;
           delete segPar;
           segPar = nullptr;
           return nullptr;
@@ -481,7 +476,7 @@ namespace InDet {
 
           // ME: wow this is hacking the vector ...
           const Trk::MeasurementBase* firstmeas =
-            (**newTrackTSOS->begin()).measurementOnTrack();
+            (**ntsos.begin()).measurementOnTrack();
           Amg::MatrixX newcov(2, 2);
           newcov.setZero();
           newcov(0, 0) = (firstmeas->localCovariance())(0, 0);
@@ -492,8 +487,8 @@ namespace InDet {
             new Trk::PseudoMeasurementOnTrack(
               newpar, newcov, firstmeas->associatedSurface());
           // hack replace first measurement with pseudomeasurement
-          newTrackTSOS->erase(newTrackTSOS->begin());
-          newTrackTSOS->insert(newTrackTSOS->begin(),
+          ntsos.erase(ntsos.begin());
+          ntsos.insert(ntsos.begin(),
                         new Trk::TrackStateOnSurface(newpseudo, nullptr));
         }
 
@@ -596,7 +591,7 @@ namespace InDet {
       typePattern.set(Trk::TrackStateOnSurface::Perigee);
       Trk::TrackStateOnSurface* seg_tsos = new Trk::TrackStateOnSurface(
         nullptr, per, nullptr, nullptr, typePattern);
-      newTrackTSOS->insert(newTrackTSOS->begin(), seg_tsos);
+      ntsos.insert(ntsos.begin(), seg_tsos);
 
       ATH_MSG_VERBOSE("Constructed perigee at input to fit : " << (*per));
 
@@ -605,12 +600,11 @@ namespace InDet {
       // track
       //
 
+      Trk::Track newTrack (info, std::move(ntsos), fq);
       Trk::Track* fitTrack =
-        m_fitterTool->fit(*newTrack, true, Trk::nonInteracting);
+        m_fitterTool->fit(newTrack, true, Trk::nonInteracting);
 
       // cleanup
-      delete newTrack;
-      newTrack = nullptr;
       if (segPar) {
         delete segPar;
         segPar = nullptr;
diff --git a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h
index 686762aaa7f5..4f1c8aad8f36 100755
--- a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h
+++ b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRKTRACK_H
@@ -206,14 +206,6 @@ namespace Trk
         */									            
        const DataVector<const TrackStateOnSurface>* trackStateOnSurfaces() const;
 
-       /** 
-        * return a pointer to the non-const DataVector of const TrackStateOnSurfaces
-        * owned by a non-const track 
-        * The pointer will be nullptr if the track was created without   
-        * TrackStateOnSurfaces.			            
-        */				            
-       DataVector<const TrackStateOnSurface>* trackStateOnSurfaces();
-       
         /** 
         * Set the TrackStateOnSurfaces. The Trk::Track takes ownership 		            
         */				            
diff --git a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc
index d527689048b6..8d938091a4ab 100644
--- a/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc
+++ b/Tracking/TrkEvent/TrkTrack/TrkTrack/Track.icc
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
 namespace Trk {
@@ -22,12 +22,6 @@ Track::trackStateOnSurfaces() const
   return &m_trackStateVector;
 }
 
-inline DataVector<const TrackStateOnSurface>*
-Track::trackStateOnSurfaces()
-{
-  return &m_trackStateVector;
-}
-
 inline const TrackInfo&
 Track::info() const
 {
diff --git a/Tracking/TrkTools/TrkMaterialProvider/src/TrkMaterialProviderTool.cxx b/Tracking/TrkTools/TrkMaterialProvider/src/TrkMaterialProviderTool.cxx
index 67e61f2b7577..3f64b20b4983 100644
--- a/Tracking/TrkTools/TrkMaterialProvider/src/TrkMaterialProviderTool.cxx
+++ b/Tracking/TrkTools/TrkMaterialProvider/src/TrkMaterialProviderTool.cxx
@@ -156,7 +156,12 @@ void Trk::TrkMaterialProviderTool::updateCaloTSOS(Trk::Track& track, const Trk::
 
   // back extrapolate to perigee, get pAtCaloEntry from list of TSOSs
   // and update/add calo+ID material to mstrack to be refitted.
-  Trk::TrackStates* inputTSOS = track.trackStateOnSurfaces();
+  const Trk::TrackStates* inputTSOS_orig = track.trackStateOnSurfaces();
+
+  auto inputTSOS = std::make_unique<Trk::TrackStates>();
+  for (const Trk::TrackStateOnSurface* tsos : *inputTSOS_orig) {
+    inputTSOS->push_back (tsos->clone());
+  }
 
   // Iterators
   Trk::TrackStates::iterator lastIDwP  = inputTSOS->end();
@@ -248,9 +253,10 @@ void Trk::TrkMaterialProviderTool::updateCaloTSOS(Trk::Track& track, const Trk::
 #endif
 
   // apply X0 and Eloss scale to MuonSpectrometer
-  this->updateVectorMS(inputTSOS,firstMS,X0ScaleMS,ElossScaleMS);
+  this->updateVectorMS(inputTSOS.get(),firstMS,X0ScaleMS,ElossScaleMS);
   // update the original vector
-  Trk::TrkMaterialProviderTool::updateVector(inputTSOS, firstCALO, firstMS, caloTSOS);
+  Trk::TrkMaterialProviderTool::updateVector(inputTSOS.get(), firstCALO, firstMS, caloTSOS);
+  track.setTrackStateOnSurfaces (std::move (*inputTSOS));
   myLocal_resetTrack(track);
 }
 
@@ -261,7 +267,12 @@ void Trk::TrkMaterialProviderTool::updateCaloTSOS(const Trk::Track& idTrack, Trk
   ATH_MSG_VERBOSE("updateCaloTSOS(Trk::Track& idTrack, Trk::Track& extrapolatedTrack)");
 
   const Trk::TrackStates* inputTSOS_ID = idTrack.trackStateOnSurfaces();
-  Trk::TrackStates* inputTSOS_MS = extrapolatedTrack.trackStateOnSurfaces();
+  const Trk::TrackStates* inputTSOS_MS_orig = extrapolatedTrack.trackStateOnSurfaces();
+
+  auto inputTSOS_MS = std::make_unique<Trk::TrackStates>();
+  for (const Trk::TrackStateOnSurface* tsos : *inputTSOS_MS_orig) {
+    inputTSOS_MS->push_back (tsos->clone());
+  }
 
 
   // find last ID TSOS
@@ -338,14 +349,14 @@ void Trk::TrkMaterialProviderTool::updateCaloTSOS(const Trk::Track& idTrack, Trk
   double ElossScaleMS = 0.;
   // get calorimeter TSOS from TG
   Trk::TrackStates* caloTSOS = this->getCaloTSOS (*(*lastIDwP)->trackParameters(),
-									    extrapolatedTrack,
-									    (*firstMSnotPerigee)->surface(),
-									    Trk::alongMomentum,
-									    Trk::muon,
-                                                                            Eloss, X0ScaleMS, ElossScaleMS,
-									    (firstMSwP == inputTSOS_MS->end()) ? nullptr : (*firstMSwP)->trackParameters(),
-									    false,
-									    true);
+                                                  extrapolatedTrack,
+                                                  (*firstMSnotPerigee)->surface(),
+                                                  Trk::alongMomentum,
+                                                  Trk::muon,
+                                                  Eloss, X0ScaleMS, ElossScaleMS,
+                                                  (firstMSwP == inputTSOS_MS->end()) ? nullptr : (*firstMSwP)->trackParameters(),
+                                                  false,
+                                                  true);
 
 
   if(!caloTSOS || caloTSOS->size()!=3) {
@@ -362,10 +373,11 @@ void Trk::TrkMaterialProviderTool::updateCaloTSOS(const Trk::Track& idTrack, Trk
 #endif
 
   // apply X0 and Eloss scale to MuonSpectrometer
-  this->updateVectorMS(inputTSOS_MS,firstMS,X0ScaleMS,ElossScaleMS);
+  this->updateVectorMS(inputTSOS_MS.get(),firstMS,X0ScaleMS,ElossScaleMS);
   // update the original vector
-  Trk::TrkMaterialProviderTool::updateVector(inputTSOS_MS, firstCALO, firstMS, caloTSOS);
+  Trk::TrkMaterialProviderTool::updateVector(inputTSOS_MS.get(), firstCALO, firstMS, caloTSOS);
 
+  extrapolatedTrack.setTrackStateOnSurfaces (std::move (*inputTSOS_MS));
   myLocal_resetTrack(extrapolatedTrack);
 }
 
-- 
GitLab