From 0a4328da7a80642f0cb8c2436020f8dc55472fd6 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Wed, 18 Nov 2020 23:15:27 +0100
Subject: [PATCH] ParametersBase . Add direct setters , fix 
 TrackParticleAthenaPool test

---
 .../TrkParametersBase/ParametersBase.h        | 18 +++++++++----
 .../TrkParametersBase/ParametersBase.icc      | 27 ++++++++++++++++---
 .../TrkParameters/mungeZeroQOverP.h           |  2 +-
 3 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.h b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.h
index e722c952b5b..2988e0fce85 100644
--- a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.h
+++ b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.h
@@ -10,11 +10,11 @@
 #define TRKPARAMETERSBASE_PARAMETERSBASE_H
 
 // Amg
+#include "CxxUtils/checker_macros.h"
 #include "EventPrimitives/EventPrimitives.h"
 #include "GeoPrimitives/GeoPrimitives.h"
 #include "TrkParametersBase/Charged.h"
 #include "TrkParametersBase/Neutral.h"
-#include "CxxUtils/checker_macros.h"
 #include <memory>
 #include <type_traits>
 
@@ -84,8 +84,7 @@ public:
   /** Access method for the covariance matrix - returns nullptr if no covariance
    * matrix is given */
   const AmgSymMatrix(DIM) * covariance() const;
-  AmgSymMatrix(DIM)* covariance();
-
+  AmgSymMatrix(DIM) * covariance();
 
   /** Access method for transverse momentum */
   double pT() const;
@@ -100,10 +99,17 @@ public:
       local parameter definitions differ for each surface type. */
   Amg::Vector2D localPosition() const;
 
+  /** set parameters*/
+  void setParameters(const AmgVector(DIM) & param);
+
+  /** set covariance */
+  void setCovariance(const AmgSymMatrix(DIM) & cov);
+
   /** Update parameters and covariance.
-   *
    * Derived classes override the
    * implementation via updateParametersHelper
+   * as this could possibly lead to updating
+   * other data members
    */
   void updateParameters(const AmgVector(DIM) &, AmgSymMatrix(DIM) * = nullptr);
 
@@ -113,9 +119,11 @@ public:
    *
    * Derived classes override the
    * implementation via updateParametersHelper
+   * as this could possibly lead to updating
+   * other data members
    */
   void updateParameters(const AmgVector(DIM) &, const AmgSymMatrix(DIM) &);
- 
+
   /** Returns the charge */
   virtual double charge() const = 0;
 
diff --git a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.icc b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.icc
index 468cc9f00c8..a6817ce5c89 100644
--- a/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.icc
+++ b/Tracking/TrkEvent/TrkParametersBase/TrkParametersBase/ParametersBase.icc
@@ -52,25 +52,25 @@ Trk::ParametersBase<DIM, T>::ParametersBase(const AmgVector(DIM) & parameters,
 {}
 
 template<int DIM, class T>
-const AmgVector(DIM)& ParametersBase<DIM, T>::parameters() const
+  const AmgVector(DIM) & ParametersBase<DIM, T>::parameters() const
 {
   return m_parameters;
 }
 
 template<int DIM, class T>
-AmgVector(DIM)& ParametersBase<DIM, T>::parameters()
+  AmgVector(DIM) & ParametersBase<DIM, T>::parameters()
 {
   return m_parameters;
 }
 
 template<int DIM, class T>
-const AmgSymMatrix(DIM)* ParametersBase<DIM, T>::covariance() const
+  const AmgSymMatrix(DIM) * ParametersBase<DIM, T>::covariance() const
 {
   return m_covariance.get();
 }
 
 template<int DIM, class T>
-AmgSymMatrix(DIM)* ParametersBase<DIM, T>::covariance()
+  AmgSymMatrix(DIM) * ParametersBase<DIM, T>::covariance()
 {
   return m_covariance.get();
 }
@@ -107,6 +107,25 @@ ParametersBase<DIM, T>::localPosition() const
   return Amg::Vector2D(parameters()[Trk::loc1], parameters()[Trk::loc2]);
 }
 
+template<int DIM, class T>
+void
+ParametersBase<DIM, T>::setParameters(const AmgVector(DIM) & param)
+{
+  m_parameters = param;
+}
+
+template<int DIM, class T>
+void
+ParametersBase<DIM, T>::setCovariance(const AmgSymMatrix(DIM) & cov)
+{
+  // if the covariance is there update in place
+  if (m_covariance) {
+    (*m_covariance) = cov;
+  } else { // otherwise create one
+    m_covariance = std::make_unique<AmgSymMatrix(DIM)>(cov);
+  }
+}
+
 template<int DIM, class T>
 void
 ParametersBase<DIM, T>::updateParameters(const AmgVector(DIM) &
diff --git a/Tracking/TrkEventCnv/TrkEventTPCnv/TrkEventTPCnv/TrkParameters/mungeZeroQOverP.h b/Tracking/TrkEventCnv/TrkEventTPCnv/TrkEventTPCnv/TrkParameters/mungeZeroQOverP.h
index 720c85b6a3b..d6756f66a23 100644
--- a/Tracking/TrkEventCnv/TrkEventTPCnv/TrkEventTPCnv/TrkParameters/mungeZeroQOverP.h
+++ b/Tracking/TrkEventCnv/TrkEventTPCnv/TrkEventTPCnv/TrkParameters/mungeZeroQOverP.h
@@ -29,7 +29,7 @@ NO_SANITIZE_UNDEFINED(Trk::ParametersT<DIM, T, S>& p)
 {
   AmgVector(DIM) newParam = p.parameters();
   newParam[Trk::qOverP] = 0;
-  p.updateParameters(newParam);
+  p.setParameters(newParam);
 }
 }
 
-- 
GitLab