From 8f831e2636c251ffbed79787db18a4d893f39d7f Mon Sep 17 00:00:00 2001
From: Atlas-Software Librarian <Atlas-Software.Librarian@cern.ch>
Date: Fri, 8 Apr 2016 17:18:55 +0200
Subject: [PATCH] 'CMakeLists.txt' (ISF_FatrasEvent-00-00-02)

        * Tagging ISF_FatrasEvent-00-00-02.
	* Fix clang warnings: a null reference is not valid C++.

        * Tagging ISF_FatrasEvent-00-00-01.
	* ISF_FatrasEvent/PlanarCluster.h, src/PlanarCluster.cxx: Fix
	assignment op (wasn't copying base class).  Ctor with move args,
	move operator.
---
 .../ISF_Fatras/ISF_FatrasEvent/CMakeLists.txt | 31 +++++++++++++++++++
 .../ISF_FatrasEvent/PlanarCluster.h           | 20 ++++++++++--
 .../ISF_FatrasEvent/PlanarClusterOnTrack.h    | 11 +++++--
 .../ISF_FatrasEvent/src/PlanarCluster.cxx     | 30 ++++++++++++++++--
 .../src/PlanarClusterOnTrack.cxx              |  4 +--
 5 files changed, 88 insertions(+), 8 deletions(-)
 create mode 100644 Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/CMakeLists.txt

diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/CMakeLists.txt b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/CMakeLists.txt
new file mode 100644
index 00000000000..5cb2fd8c030
--- /dev/null
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/CMakeLists.txt
@@ -0,0 +1,31 @@
+################################################################################
+# Package: ISF_FatrasEvent
+################################################################################
+
+# Declare the package name:
+atlas_subdir( ISF_FatrasEvent )
+
+# Declare the package's dependencies:
+atlas_depends_on_subdirs( PUBLIC
+                          Control/AthLinks
+                          Control/DataModel
+                          Control/SGTools
+                          DetectorDescription/Identifier
+                          InnerDetector/InDetRecEvent/InDetPrepRawData
+                          Simulation/ISF/ISF_Fatras/ISF_FatrasDetDescrModel
+                          Tracking/TrkEvent/TrkPrepRawData
+                          Tracking/TrkEvent/TrkRIO_OnTrack
+                          PRIVATE
+                          GaudiKernel )
+
+# External dependencies:
+find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
+
+# Component(s) in the package:
+atlas_add_library( ISF_FatrasEvent
+                   src/*.cxx
+                   PUBLIC_HEADERS ISF_FatrasEvent
+                   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+                   LINK_LIBRARIES ${ROOT_LIBRARIES} AthLinks DataModel SGTools Identifier InDetPrepRawData ISF_FatrasDetDescrModel TrkPrepRawData TrkRIO_OnTrack
+                   PRIVATE_LINK_LIBRARIES GaudiKernel )
+
diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/ISF_FatrasEvent/PlanarCluster.h b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/ISF_FatrasEvent/PlanarCluster.h
index b67099fb463..109269279d3 100644
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/ISF_FatrasEvent/PlanarCluster.h
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/ISF_FatrasEvent/PlanarCluster.h
@@ -43,6 +43,7 @@ namespace iFatras {
     PlanarCluster( const PlanarCluster &);
 
     PlanarCluster  &operator=(const PlanarCluster &);
+    PlanarCluster  &operator=(      PlanarCluster &&);
     
     PlanarCluster( const Identifier& RDOId,
 		   const Amg::Vector2D& locpos, 
@@ -51,12 +52,22 @@ namespace iFatras {
 		   const iFatras::PlanarDetElement* detEl,
 		   const Amg::MatrixX* locErrMat );
     
+    PlanarCluster( const Identifier& RDOId,
+		   const Amg::Vector2D& locpos, 
+		   std::vector<Identifier>&& rdoList,
+		   const InDet::SiWidth& width,
+		   const iFatras::PlanarDetElement* detEl,
+		   std::unique_ptr<const Amg::MatrixX> locErrMat );
+    
     // Deconstructor:
     virtual ~PlanarCluster();
     
     /** return width class reference */
     const InDet::SiWidth&  width()  const;
     
+    /** return global position as a pointer. */
+    const Amg::Vector3D* globalPositionPtr() const;
+    
     /** return global position reference */
     const Amg::Vector3D& globalPosition() const;
     
@@ -87,9 +98,14 @@ namespace iFatras {
   }
   
   // return globalPosition:
-  inline const Amg::Vector3D& PlanarCluster::globalPosition() const {
+  inline const Amg::Vector3D* PlanarCluster::globalPositionPtr() const {
     if (m_globalPosition==0) m_globalPosition = m_detEl->surface(identify()).localToGlobal(localPosition());
-    return *m_globalPosition;
+    return m_globalPosition;
+  }
+  
+  // return globalPosition:
+  inline const Amg::Vector3D& PlanarCluster::globalPosition() const {
+    return *globalPositionPtr();
   }
   
   inline const iFatras::PlanarDetElement* PlanarCluster::detectorElement() const {
diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/ISF_FatrasEvent/PlanarClusterOnTrack.h b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/ISF_FatrasEvent/PlanarClusterOnTrack.h
index 2036bb893c8..98768385442 100644
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/ISF_FatrasEvent/PlanarClusterOnTrack.h
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/ISF_FatrasEvent/PlanarClusterOnTrack.h
@@ -85,6 +85,10 @@ namespace iFatras {
 	- fullfills Trk::MeasurementBase interface */
     const Amg::Vector3D& globalPosition() const;
 
+    /** returns global position (gathered through Surface constraint)
+	- fullfills Trk::MeasurementBase interface */
+    const Amg::Vector3D* globalPositionPtr() const;
+
     /** returns the DE hashID* 
 	- fullfills Trk::RIO_OnTrack interface */
     IdentifierHash idDE() const;
@@ -119,9 +123,12 @@ namespace iFatras {
   inline const Trk::Surface& PlanarClusterOnTrack::associatedSurface() const
   { return ( detectorElement()->surface()); }
 
-  inline const Amg::Vector3D& PlanarClusterOnTrack::globalPosition() const {
+  inline const Amg::Vector3D* PlanarClusterOnTrack::globalPositionPtr() const {
     if (!m_globalPosition) m_globalPosition = associatedSurface().localToGlobal(localParameters());
-    return (*m_globalPosition); }
+    return m_globalPosition; }
+  
+  inline const Amg::Vector3D& PlanarClusterOnTrack::globalPosition() const {
+    return *globalPositionPtr(); }
   
   inline PlanarClusterOnTrack* PlanarClusterOnTrack::clone() const {
     return new PlanarClusterOnTrack(*this); }
diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/src/PlanarCluster.cxx b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/src/PlanarCluster.cxx
index 6610fbf2848..524f8f8f4e7 100644
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/src/PlanarCluster.cxx
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/src/PlanarCluster.cxx
@@ -28,6 +28,17 @@ namespace iFatras {
     m_globalPosition(0),
     m_detEl(detEl) {}
   
+  PlanarCluster::PlanarCluster( const Identifier& RDOId,
+				const Amg::Vector2D& locpos, 
+				std::vector<Identifier>&& rdoList,
+				const InDet::SiWidth& width,
+				const iFatras::PlanarDetElement* detEl,
+				std::unique_ptr<const Amg::MatrixX> locErrMat ) :
+    PrepRawData(RDOId, locpos, std::move(rdoList), std::move(locErrMat)), //call base class constructor
+    m_width(width),
+    m_globalPosition(0),
+    m_detEl(detEl) {}
+  
   // Destructor:
   PlanarCluster::~PlanarCluster()
   {
@@ -56,6 +67,7 @@ namespace iFatras {
   //assignment operator
   PlanarCluster& PlanarCluster::operator=(const PlanarCluster& RIO){
     if (&RIO !=this) {
+      static_cast<Trk::PrepRawData&>(*this) = RIO;
       delete m_globalPosition;
       m_width = RIO.m_width;
       m_globalPosition = (RIO.m_globalPosition) ? new Amg::Vector3D(*RIO.m_globalPosition) : 0;
@@ -64,11 +76,24 @@ namespace iFatras {
     return *this;
   }
 
+  //move operator
+  PlanarCluster& PlanarCluster::operator=(PlanarCluster&& RIO){
+    if (&RIO !=this) {
+      static_cast<Trk::PrepRawData&>(*this) = std::move(RIO);
+      delete m_globalPosition;
+      m_globalPosition = RIO.m_globalPosition;
+      RIO.m_globalPosition = nullptr;
+      m_width = RIO.m_width;
+      m_detEl =  RIO.m_detEl ;
+      }
+    return *this;
+  }
+
   MsgStream& PlanarCluster::dump( MsgStream&    stream) const {
     
     stream << "PlanarCluster object"<<std::endl;
     // have to do a lot of annoying checking to make sure that PRD is valid.
-    if ( &(this->globalPosition() )!=0 )
+    if ( this->globalPositionPtr() )
       {
 	stream << "at global coordinates (x,y,z) = ("<<this->globalPosition().x()<<", "
 	       <<this->globalPosition().y()<<", "
@@ -86,7 +111,8 @@ namespace iFatras {
 
     stream << "PlanarCluster object"<<std::endl;
     // have to do a lot of annoying checking to make sure that PRD is valid.
-    if ( &(this->globalPosition() )!=0 )
+    this->globalPosition();
+    if ( this->globalPositionPtr() )
       {
 	stream << "at global coordinates (x,y,z) = ("<<this->globalPosition().x()<<", "
 	       <<this->globalPosition().y()<<", "
diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/src/PlanarClusterOnTrack.cxx b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/src/PlanarClusterOnTrack.cxx
index 118ad62819e..e017e85dd39 100644
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/src/PlanarClusterOnTrack.cxx
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasEvent/src/PlanarClusterOnTrack.cxx
@@ -91,7 +91,7 @@ namespace iFatras {
     Trk::RIO_OnTrack::dump(sl); 
     
     sl << "Global position (x,y,z) = (";
-    if ( &(this->globalPosition() )!=0 )
+    if ( this->globalPositionPtr() )
       {
         sl  <<this->globalPosition().x()<<", "
 	    <<this->globalPosition().y()<<", "
@@ -110,7 +110,7 @@ namespace iFatras {
     Trk::RIO_OnTrack::dump(sl); 
     
     sl << "Global position (x,y,z) = (";
-    if ( &(this->globalPosition() )!=0 )
+    if ( this->globalPositionPtr() )
       {
 	sl  <<this->globalPosition().x()<<", "
 	    <<this->globalPosition().y()<<", "
-- 
GitLab