From 38aa188f20ed8a0f1ae84cb8cbe9463bc58453a7 Mon Sep 17 00:00:00 2001
From: Stewart Martin-Haugh <Stewart.Martin-Haugh@cern.ch>
Date: Wed, 13 Jul 2016 14:32:27 +0200
Subject: [PATCH] 'Fix CMakeLists.txt, clean-up requirements file'
 (FTK_RecTools-00-00-09)

	* Fix CMakeLists.txt, clean-up requirements file
	* FTK_RecTools-00-00-09


Former-commit-id: aeafcd87f8de75b753b2eb2f157de5f0d10a6ff6
---
 Trigger/TrigFTK/FTK_RecTools/CMakeLists.txt   |  8 +--
 .../FTK_RecTools/FTK_VertexFinderTool.h       | 27 ++++++++--
 Trigger/TrigFTK/FTK_RecTools/cmt/requirements | 13 ++---
 .../FTK_RecTools/src/FTK_VertexFinderTool.cxx | 52 ++++++++++++-------
 4 files changed, 66 insertions(+), 34 deletions(-)

diff --git a/Trigger/TrigFTK/FTK_RecTools/CMakeLists.txt b/Trigger/TrigFTK/FTK_RecTools/CMakeLists.txt
index 05aa3e31775..65db7b7b8ac 100644
--- a/Trigger/TrigFTK/FTK_RecTools/CMakeLists.txt
+++ b/Trigger/TrigFTK/FTK_RecTools/CMakeLists.txt
@@ -14,7 +14,9 @@ atlas_depends_on_subdirs( PUBLIC
                           Tracking/TrkEvent/VxVertex
                           Trigger/TrigFTK/FTK_DataProviderInterfaces
                           Trigger/TrigFTK/FTK_RecToolInterfaces
-                          Trigger/TrigFTK/TrigFTK_RawData )
+                          Trigger/TrigFTK/TrigFTK_RawData
+                          Event/xAOD/xAODTracking
+                          Tracking/TrkVertexFitter/TrkVxEdmCnv )
 
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
@@ -24,10 +26,10 @@ atlas_add_library( FTK_RecToolsLib
                    src/*.cxx
                    PUBLIC_HEADERS FTK_RecTools
                    INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                   LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps GaudiKernel TrkTrack VxVertex FTK_DataProviderInterfaces TrigFTK_RawData )
+                   LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps GaudiKernel TrkTrack VxVertex FTK_DataProviderInterfaces TrigFTK_RawData xAODTracking TrkVxEdmCnvLib)
 
 atlas_add_component( FTK_RecTools
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps GaudiKernel TrkTrack VxVertex FTK_DataProviderInterfaces TrigFTK_RawData FTK_RecToolsLib )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps GaudiKernel TrkTrack VxVertex FTK_DataProviderInterfaces TrigFTK_RawData xAODTracking TrkVxEdmCnvLib FTK_RecToolsLib )
 
diff --git a/Trigger/TrigFTK/FTK_RecTools/FTK_RecTools/FTK_VertexFinderTool.h b/Trigger/TrigFTK/FTK_RecTools/FTK_RecTools/FTK_VertexFinderTool.h
index ec9179ec86d..22292907d63 100644
--- a/Trigger/TrigFTK/FTK_RecTools/FTK_RecTools/FTK_VertexFinderTool.h
+++ b/Trigger/TrigFTK/FTK_RecTools/FTK_RecTools/FTK_VertexFinderTool.h
@@ -27,13 +27,27 @@
 
 #include "FTK_RecToolInterfaces/IFTK_VertexFinderTool.h"
 #include "FTK_DataProviderInterfaces/IFTK_UncertaintyTool.h"
+#include "TrkVxEdmCnv/IVxCandidateXAODVertex.h"
 
 #include "TrigFTK_RawData/FTK_RawTrack.h"
 #include "TrigFTK_RawData/FTK_RawTrackContainer.h"
 #include "TrkTrack/TrackCollection.h"
-#include "VxVertex/VxContainer.h"
+#include "VxVertex/VxContainer.h"	
+//#include "xAODTracking/Vertex.h"
+//#include "xAODTracking/TrackParticle.h"
+//#include "xAODTracking/VertexContainer.h"
+//#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/VertexFwd.h"
+//#include "xAODTracking/TrackParticleFwd.h"
+#include "xAODTracking/VertexContainerFwd.h"
+//#include "xAODTracking/TrackParticleContainerFwd.h"
+//#include "Tracking/TrkVertexFitter/TrkVxEdmCnv/TrkVxEdmCnv/IVxCandidateXAODVertex.h"
 class VxContainer;
 using std::vector;
+namespace Trk {
+  class Track;
+//  class Trk::IVxCandidateXAODVertex;
+}
 class FTK_VertexFinderTool : public AthAlgTool, virtual public IFTK_VertexFinderTool
 {
   //struct to hold track parameters
@@ -84,9 +98,10 @@ class FTK_VertexFinderTool : public AthAlgTool, virtual public IFTK_VertexFinder
   //
   //  Get the element of the covariance matrix for id0th and id1th track parameter
   //
-   VxContainer* findVertex(const FTK_RawTrackContainer* trks);
-   VxContainer* findVertex(const TrackCollection* trks);
-
+//   VxContainer* findVertex(const FTK_RawTrackContainer* trks);
+//   VxContainer* findVertex(const TrackCollection* trks);
+   xAOD::VertexContainer* findVertex(const FTK_RawTrackContainer* trks);
+   xAOD::VertexContainer* findVertex(const TrackCollection* trks);
  private:
 
     bool m_barrelOnly;
@@ -95,15 +110,17 @@ class FTK_VertexFinderTool : public AthAlgTool, virtual public IFTK_VertexFinder
     double m_chi2cut;
     double m_constTrkPt;
     double m_constTrkEta;
+    double m_z0errfactor;
   //
   //  Helper functions with the uncerianties
   //
-  VxContainer* findVertex(vector<MyTrack> trks);
+  xAOD::VertexContainer* findVertex(vector<MyTrack> trks);
   double ctheta2eta(double cot);
   vector<MyTrack> getTracks(const FTK_RawTrackContainer* trks);
   vector<MyTrack> getTracks(const TrackCollection* trks);
   //tool handel
   ToolHandle<IFTK_UncertaintyTool> m_uncertaintyTool;
+  ToolHandle<Trk::IVxCandidateXAODVertex> m_VertexEdmFactory;
 };
 
 
diff --git a/Trigger/TrigFTK/FTK_RecTools/cmt/requirements b/Trigger/TrigFTK/FTK_RecTools/cmt/requirements
index 45495e383f4..5ea66ffdaa1 100644
--- a/Trigger/TrigFTK/FTK_RecTools/cmt/requirements
+++ b/Trigger/TrigFTK/FTK_RecTools/cmt/requirements
@@ -10,20 +10,21 @@ use AtlasROOT		AtlasROOT-*		External
 use AthenaBaseComps     AthenaBaseComps-*       Control
 use PyJobTransforms 	PyJobTransforms-* 	Tools
 use FTK_RecToolInterfaces FTK_RecToolInterfaces-* Trigger/TrigFTK
-use AtlasReconstructionRunTime AtlasReconstructionRunTime-*
-use AtlasPolicy                AtlasPolicy-*
+#use AtlasReconstructionRunTime AtlasReconstructionRunTime-*
+#use AtlasPolicy                AtlasPolicy-*
 use GaudiInterface             GaudiInterface-*           External
-use TrigFTK_RawData	       TrigFTK_RawData-*          Trigger/TrigFTK
+use TrigFTK_RawData	           TrigFTK_RawData-*          Trigger/TrigFTK
 use FTK_DataProviderInterfaces FTK_DataProviderInterfaces-* Trigger/TrigFTK
 ########use FTK_DataProviderSvc FTK_DataProviderSvc-* Trigger/TrigFTK
 
 #TrkTrack and VxVertec need to be public for Collection typedef 
-use TrkTrack		       TrkTrack-*		  Tracking/TrkEvent
-use VxVertex            VxVertex-*       Tracking/TrkEvent
+use TrkTrack		               TrkTrack-*		  Tracking/TrkEvent
+use VxVertex                   VxVertex-*       Tracking/TrkEvent
+use xAODTracking               xAODTracking-*             Event/xAOD 
+use TrkVxEdmCnv                TrkVxEdmCnv-*              Tracking/TrkVertexFitter
 
 private
 
-
 # Add transform
 apply_pattern declare_job_transforms tfs='*_tf.py' jo='skeleton.*.py'
 #end_private
diff --git a/Trigger/TrigFTK/FTK_RecTools/src/FTK_VertexFinderTool.cxx b/Trigger/TrigFTK/FTK_RecTools/src/FTK_VertexFinderTool.cxx
index 3cae2180d97..43aa3230f37 100644
--- a/Trigger/TrigFTK/FTK_RecTools/src/FTK_VertexFinderTool.cxx
+++ b/Trigger/TrigFTK/FTK_RecTools/src/FTK_VertexFinderTool.cxx
@@ -33,15 +33,12 @@
 #include "VxVertex/VxTrackAtVertex.h"
 #include "TrigFTK_RawData/FTK_RawTrackContainer.h"
 
-//#include "CLHEP/Matrix/SymMatrix.h"
-//#include "CLHEP/Matrix/Vector.h"
-//#include "TrkTrack/Track.h"
-//#include "TrkEventPrimitives/FitQuality.h"
-//#include "TrkTrackSummary/TrackSummary.h"
-//#include "TrkParameters/TrackParameters.h"
-//#include "TrkParticleBase/TrackParticleBase.h"
-//#include "TrkEventPrimitives/ParamDefs.h"
+#include "xAODTracking/TrackParticleAuxContainer.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include "xAODTracking/VertexContainer.h"
+#include "xAODTracking/VertexAuxContainer.h"
 #include "VxVertex/VxCandidate.h"
+#include "TrkVxEdmCnv/IVxCandidateXAODVertex.h"
 #include <map>
 #include <vector>
 #include <utility>
@@ -52,7 +49,6 @@ using std::cout; using std::endl;
 using std::vector; using std::iterator;
 using Trk::RecVertex;using Trk::VxTrackAtVertex;
 
-
 FTK_VertexFinderTool::FTK_VertexFinderTool(const std::string& t,
                                                const std::string& n,
                                                const IInterface*  p ):
@@ -63,7 +59,9 @@ FTK_VertexFinderTool::FTK_VertexFinderTool(const std::string& t,
   m_chi2cut(5.),
   m_constTrkPt(1.),
   m_constTrkEta(1.1),
-  m_uncertaintyTool("FTK_UncertaintyTool",this)
+  m_z0errfactor(1.0),
+  m_uncertaintyTool("FTK_UncertaintyTool",this),
+  m_VertexEdmFactory("VertexInternalEdmFactory",this)
 {
   declareInterface< IFTK_VertexFinderTool >( this );
   declareProperty( "HasIBL",  m_hasIBL);
@@ -73,6 +71,8 @@ FTK_VertexFinderTool::FTK_VertexFinderTool(const std::string& t,
   declareProperty( "ConstTrkPt",  m_constTrkPt);
   declareProperty( "ConstTrkEta",  m_constTrkEta);
   declareProperty("UncertaintyTool",m_uncertaintyTool);
+  declareProperty("VertexInternalEdmFactory",m_VertexEdmFactory);
+  declareProperty( "z0ErrFactor", m_z0errfactor);
 }
 
 StatusCode FTK_VertexFinderTool::initialize() {
@@ -80,6 +80,11 @@ StatusCode FTK_VertexFinderTool::initialize() {
   StatusCode sc = AlgTool::initialize();
   MsgStream athenaLog(msgSvc(), name());
 
+  if ( m_VertexEdmFactory.retrieve().isFailure() ) {
+    ATH_MSG_ERROR("Failed to retrievel tool " << m_VertexEdmFactory);
+    return StatusCode::FAILURE;
+  }
+
   athenaLog << MSG::DEBUG << "FTK_VertexFinderTool initialized "<< endreq;
   return sc;
 }
@@ -89,14 +94,14 @@ StatusCode FTK_VertexFinderTool::finalize() {
   return sc;
 }
 
-VxContainer* FTK_VertexFinderTool::findVertex(const FTK_RawTrackContainer* trks)
+xAOD::VertexContainer* FTK_VertexFinderTool::findVertex(const FTK_RawTrackContainer* trks)
 {
   vector<MyTrack> mytrk;
   mytrk=getTracks(trks);
   return findVertex(mytrk);
 }
 
-VxContainer* FTK_VertexFinderTool::findVertex(const TrackCollection* trks)
+xAOD::VertexContainer* FTK_VertexFinderTool::findVertex(const TrackCollection* trks)
 {
   vector<MyTrack> mytrk;
   mytrk=getTracks(trks);
@@ -105,7 +110,7 @@ VxContainer* FTK_VertexFinderTool::findVertex(const TrackCollection* trks)
 //
 // Covariance Matrix if there is a BLayer Hit
 //
-VxContainer* FTK_VertexFinderTool::findVertex(vector<MyTrack> mytrk)
+xAOD::VertexContainer* FTK_VertexFinderTool::findVertex(vector<MyTrack> mytrk)
 {
 
   MsgStream athenaLog(msgSvc(), name());
@@ -170,7 +175,7 @@ VxContainer* FTK_VertexFinderTool::findVertex(vector<MyTrack> mytrk)
     athenaLog << MSG::DEBUG << "FTK_VertexFinderTool:: fit VTX, using "<<vxtrk.size()<<" trks."<< endreq;
     for(  vector<MyTrack>::iterator i=trkbegin ; i<trkend ;){
             trknumber++;
-            
+            double tmpchi2 = chi2;
             athenaLog << MSG::VERBOSE << "getTracks: "<<trknumber<<", pt "<<(*i).m_pt<<", eta "<<(*i).m_theta<<", phi "<<(*i).m_phi<<", d0 "<<(*i).m_d0<<", z0 "<<(*i).m_z0<<", pt err "<<(*i).m_pterr<<", theta err "<<(*i).m_thetaerr<<", phi err "<< (*i).m_phierr<<", d0 err"<< (*i).m_d0err<<", z0 err "<<(*i).m_z0err<< endreq;
             //track parameter reading
             double xv,yv,zv,P0,phi0,theta0;
@@ -186,7 +191,7 @@ VxContainer* FTK_VertexFinderTool::findVertex(vector<MyTrack> mytrk)
 
             double cosPhi0,sinPhi0,sinPsi,cosPsi;
             double psi,ctt,sint;
-            double alpha=0.02997*20.84/1000.0;
+            double alpha=0.02997*20.84;///1000.0;
 
             cosPhi0=cos(phi0);sinPhi0=sin(phi0);
             sinPsi=-alpha*(xv*cosPhi0+yv*sinPhi0)/P0;
@@ -264,6 +269,7 @@ VxContainer* FTK_VertexFinderTool::findVertex(vector<MyTrack> mytrk)
             chi2=m_V[0][0]*m_resid[0]*m_resid[0]+m_V[1][1]*m_resid[1]*m_resid[1]+2.0*m_V[0][1]*m_resid[1]*m_resid[0];
             if(chi2>m_chi2cut || chi2<0){
               i=vxtrk.erase(i);
+              chi2 = tmpchi2;
             }
             else{
               trkatvtx.push_back(*i);
@@ -333,7 +339,13 @@ VxContainer* FTK_VertexFinderTool::findVertex(vector<MyTrack> mytrk)
     delete tracksAtVertex;
   }while(mytrk.size()>0);//vertex loop end
   athenaLog << MSG::VERBOSE << "debug line _326_ "<< myVtx->size()<< endreq;
-  return myVtx;
+  xAOD::VertexContainer *xAODContainer(0);
+  xAOD::VertexAuxContainer *xAODAuxContainer(0);
+  if (m_VertexEdmFactory->createXAODVertexContainer(*myVtx, xAODContainer, xAODAuxContainer) != StatusCode::SUCCESS) {
+    ATH_MSG_WARNING("Cannot convert output vertex container to xAOD. Returning null pointer.");
+  }
+  delete myVtx;
+  return xAODContainer;
 
 }
 
@@ -351,7 +363,7 @@ vector<FTK_VertexFinderTool::MyTrack> FTK_VertexFinderTool::getTracks(const FTK_
     float trk_phi = ftk_track->getPhi();
     float trk_d0 = ftk_track->getD0();
     float trk_z0 = ftk_track->getZ0();
-    float trk_pt = fabs(1/invpt/1000);
+    float trk_pt = 1/invpt;
 /*    double trk_phierr=sqrt(3.446e-7+29.24*invpt*invpt);
     double trk_thetaerr=sqrt(7.093e-6+38.4*invpt*invpt);
     double trk_pterr=1;
@@ -359,7 +371,7 @@ vector<FTK_VertexFinderTool::MyTrack> FTK_VertexFinderTool::getTracks(const FTK_
     double trk_z0err=sqrt(6.472e-2+1.587e5*invpt*invpt);
 */
     double trk_d0err= sqrt(m_uncertaintyTool->getParamCovMtx(*ftk_track,  m_hasIBL,  FTKTrackParam::d0,     FTKTrackParam::d0));
-    double trk_z0err= sqrt(m_uncertaintyTool->getParamCovMtx(*ftk_track,  m_hasIBL,    FTKTrackParam::z0,     FTKTrackParam::z0));
+    double trk_z0err= sqrt(m_uncertaintyTool->getParamCovMtx(*ftk_track,  m_hasIBL,    FTKTrackParam::z0,     FTKTrackParam::z0))*m_z0errfactor;
     double trk_phierr= sqrt(m_uncertaintyTool->getParamCovMtx(*ftk_track,  m_hasIBL,    FTKTrackParam::phi,    FTKTrackParam::phi));
     double trk_thetaerr= sqrt(m_uncertaintyTool->getParamCovMtx(*ftk_track,  m_hasIBL,    FTKTrackParam::theta,  FTKTrackParam::theta));
     double trk_pterr= sqrt(m_uncertaintyTool->getParamCovMtx(*ftk_track,  m_hasIBL,    FTKTrackParam::pt,    FTKTrackParam::pt));
@@ -388,12 +400,12 @@ vector<FTK_VertexFinderTool::MyTrack> FTK_VertexFinderTool::getTracks(const Trac
     float trk_d0 = (*track_it)->perigeeParameters()->parameters()[Trk::d0];
     float trk_z0 = (*track_it)->perigeeParameters()->parameters()[Trk::z0];
     float trk_pt = fabs(1/qOverp/1000/sin(trk_theta));
-    float invpt = 1/2/(trk_pt*1000);
+    float invpt = 1/(trk_pt*1000);
     double trk_phierr=sqrt(3.446e-7+29.24*invpt*invpt);
     double trk_thetaerr=sqrt(7.093e-6+38.4*invpt*invpt);
     double trk_pterr=1;
     double trk_d0err=sqrt(1.662e-3+6.947e4*invpt*invpt);
-    double trk_z0err=sqrt(6.472e-2+1.587e5*invpt*invpt);
+    double trk_z0err=sqrt(6.472e-2+1.587e5*invpt*invpt)*m_z0errfactor;
 
 /*    double trk_d0err=(*track_it)->measuredPerigee()->localErrorMatrix().error(Trk::d0);
     double trk_z0err=(*track_it)->measuredPerigee()->localErrorMatrix().error(Trk::z0);
-- 
GitLab