diff --git a/Trigger/TrigFTK/FTK_RecTools/FTK_RecTools/FTK_DuplicateTrackRemovalTool.h b/Trigger/TrigFTK/FTK_RecTools/FTK_RecTools/FTK_DuplicateTrackRemovalTool.h index 4f8c5994152d6df061abd6d46d396743aad61cfc..2ee164d169c26b795e3e6a330b02907082e654d6 100644 --- a/Trigger/TrigFTK/FTK_RecTools/FTK_RecTools/FTK_DuplicateTrackRemovalTool.h +++ b/Trigger/TrigFTK/FTK_RecTools/FTK_RecTools/FTK_DuplicateTrackRemovalTool.h @@ -5,118 +5,33 @@ //////////////////////////////////////////////////////////////////////////////// // FTK_DuplicateTrackRemovalTool tool // ------------------------------- -// ATLAS Collaboration -// // Remove duplicate (overlapping) tracks -// // June 2017: Tool created -// // Author: Andy Haas, NYU // e-mail: ahaas@cern.ch -// //////////////////////////////////////////////////////////////////////////////// - #ifndef __TRIG_FTK_DUPLICATETRACKREMOVAL_TOOL_H__ #define __TRIG_FTK_DUPLICATETRACKREMOVAL_TOOL_H__ #include "GaudiKernel/ToolHandle.h" - #include "AthenaBaseComps/AthAlgTool.h" - #include "FTK_RecToolInterfaces/IFTK_DuplicateTrackRemovalTool.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 "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/VertexAuxContainer.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_DuplicateTrackRemovalTool : public AthAlgTool, virtual public IFTK_DuplicateTrackRemovalTool { - //struct to hold track parameters - struct MyTrack{ - MyTrack(int idx,float pt,float theta,float phi,float d0,float z0,float pterr,float thetaerr,float phierr,float d0err,float z0err){ - m_idx=idx; - m_pt=pt; - m_theta=theta; - m_phi=phi; - m_d0=d0; - m_z0=z0; - - m_pterr=pterr; - // m_qoverperr=qoverperr; - m_thetaerr=thetaerr; - m_phierr=phierr; - m_d0err=d0err; - m_z0err=z0err; - } - int m_idx; - double m_pt; - double m_theta; - double m_phi; - double m_d0; - double m_z0; - - double m_pterr; - //double m_qoverperr=qoverperr; - double m_thetaerr; - double m_phierr; - double m_d0err; - double m_z0err; - - //Track pT sort - bool operator<(const MyTrack &a)const{ - return fabs(m_pt) > fabs(a.m_pt); - } - }; - public: - FTK_DuplicateTrackRemovalTool( const std::string&, const std::string&, const IInterface* ); virtual ~FTK_DuplicateTrackRemovalTool(){}; - virtual StatusCode initialize(); virtual StatusCode finalize (); - FTK_RawTrackContainer* removeDuplicates(const FTK_RawTrackContainer* trks); - private: - - bool m_barrelOnly; - bool m_hasIBL; - double m_cluster_size; - double m_chi2cut; - double m_constTrkPt; - double m_constTrkEta; - double m_z0errfactor; - FTK_RawTrackContainer* m_trks_nodups; - - std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> findVertex(vector<MyTrack> trks); - double ctheta2eta(double cot); - vector<MyTrack> getTracks(const FTK_RawTrackContainer* trks); - vector<MyTrack> getTracks(const TrackCollection* trks); - ToolHandle<IFTK_UncertaintyTool> m_uncertaintyTool; + bool match(const FTK_RawTrack* track, const FTK_RawTrack* oldtrack) const; }; - #endif - diff --git a/Trigger/TrigFTK/FTK_RecTools/src/FTK_DuplicateTrackRemovalTool.cxx b/Trigger/TrigFTK/FTK_RecTools/src/FTK_DuplicateTrackRemovalTool.cxx index a6e6163215a10026d700605cb549e2d911c8035f..1756f748ccd295d2b6230baae75c417e717c0323 100644 --- a/Trigger/TrigFTK/FTK_RecTools/src/FTK_DuplicateTrackRemovalTool.cxx +++ b/Trigger/TrigFTK/FTK_RecTools/src/FTK_DuplicateTrackRemovalTool.cxx @@ -2,63 +2,20 @@ Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration */ -#include <cmath> -#include <iostream> -#include <vector> -#include "TVector3.h" -#include "GaudiKernel/MsgStream.h" - #include "FTK_RecTools/FTK_DuplicateTrackRemovalTool.h" -#include "FTK_DataProviderInterfaces/IFTK_UncertaintyTool.h" -#include "TrigFTK_RawData/FTK_RawTrack.h" -#include "TrkTrack/TrackCollection.h" -#include "VxVertex/VxContainer.h" -#include "VxVertex/ExtendedVxCandidate.h" -#include "VxVertex/RecVertex.h" -#include "VxVertex/Vertex.h" -#include "VxVertex/VxTrackAtVertex.h" -#include "TrigFTK_RawData/FTK_RawTrackContainer.h" -#include "TrkParameters/TrackParameters.h" -#include "TrkTrack/Track.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> -//#include "TrkSurfaces/PlaneSurface.h" - -using std::map; using std::string; -using std::cout; using std::endl; -using std::vector; using std::iterator; -using Trk::RecVertex;using Trk::VxTrackAtVertex; FTK_DuplicateTrackRemovalTool::FTK_DuplicateTrackRemovalTool(const std::string& t, const std::string& n, const IInterface* p ): AthAlgTool(t,n,p), - m_barrelOnly(false), - m_hasIBL(false), - m_cluster_size(1.87), - m_chi2cut(5.), - m_constTrkPt(1.), - m_constTrkEta(1.1), - m_z0errfactor(1.0), + m_trks_nodups(NULL), m_uncertaintyTool("FTK_UncertaintyTool",this) { declareInterface< IFTK_DuplicateTrackRemovalTool >( this ); - declareProperty( "HasIBL", m_hasIBL); - declareProperty( "BarrelOnly", m_barrelOnly); - declareProperty( "Cluster_size", m_cluster_size); - declareProperty( "Chi2cut", m_chi2cut); - declareProperty( "ConstTrkPt", m_constTrkPt); - declareProperty( "ConstTrkEta", m_constTrkEta); declareProperty( "UncertaintyTool", m_uncertaintyTool); - declareProperty( "z0ErrFactor", m_z0errfactor); } StatusCode FTK_DuplicateTrackRemovalTool::initialize() { @@ -66,8 +23,7 @@ StatusCode FTK_DuplicateTrackRemovalTool::initialize() { StatusCode sc = AlgTool::initialize(); MsgStream athenaLog(msgSvc(), name()); - m_trks_nodups = new FTK_RawTrackContainer; //we DO own the tracks - //(SG::VIEW_ELEMENTS);//we don't own the tracks, we're just going to hold them + m_trks_nodups = new FTK_RawTrackContainer(SG::VIEW_ELEMENTS);//we don't own the tracks, we're just going to hold them athenaLog << MSG::INFO << "FTK_DuplicateTrackRemovalTool initialized "<< endmsg; return sc; @@ -75,345 +31,37 @@ StatusCode FTK_DuplicateTrackRemovalTool::initialize() { StatusCode FTK_DuplicateTrackRemovalTool::finalize() { StatusCode sc = AlgTool::finalize(); + m_trks_nodups->clear(); + delete m_trks_nodups; return sc; } +bool FTK_DuplicateTrackRemovalTool::match(const FTK_RawTrack* track, const FTK_RawTrack* oldtrack) const { + return true; // TODO +} + FTK_RawTrackContainer* FTK_DuplicateTrackRemovalTool::removeDuplicates(const FTK_RawTrackContainer* trks){ ATH_MSG_INFO("ACH99 - I'm in removeDuplicates!"); m_trks_nodups->clear(); m_trks_nodups->reserve(trks->size()); - for (unsigned int i = 0; i!=trks->size(); i++) m_trks_nodups->push_back(new FTK_RawTrack(*(trks->at(i)))); - return m_trks_nodups; -} - -std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> FTK_DuplicateTrackRemovalTool::findVertex(vector<MyTrack> mytrk) -{ - - MsgStream athenaLog(msgSvc(), name()); - double mGkx=0.0001; - double mGky=0.0001; - double mGkz=16.; - athenaLog << MSG::DEBUG << "FTK_DuplicateTrackRemovalTool:: barrel " << m_barrelOnly<< endmsg; - xAOD::VertexContainer* theVertexContainer = new xAOD::VertexContainer; - xAOD::VertexAuxContainer* theVertexAuxContainer = new xAOD::VertexAuxContainer; - theVertexContainer->setStore( theVertexAuxContainer ); - vector<MyTrack>::iterator trkbegin; - vector<MyTrack>::iterator trkend; - vector<MyTrack> trkatvtx; - - athenaLog << MSG::DEBUG << "FTK_DuplicateTrackRemovalTool:: total " << mytrk.size()<< " tracks "<< endmsg; - sort(mytrk.begin(),mytrk.end());//sorting mytrk by pt(Track7.h) - - int numdo=0; - do{ - athenaLog << MSG::DEBUG << "findVertex: finding vertex "<< endmsg; - ////////////////////// - //clustering - ////////////////////// - numdo++; - vector<MyTrack> vxtrk; - //high pt track selecting - trkbegin=mytrk.begin(); - trkend=mytrk.end(); - float seed_z=(*trkbegin).m_z0; - - //selecting tracks near high pt track - for(vector<MyTrack>::iterator i=trkbegin ; i<trkend;){ - if(fabs((*i).m_z0 - seed_z) < m_cluster_size){ - vxtrk.push_back(*i); - i=mytrk.erase(i); - } - else{ - i++; - } - trkbegin=mytrk.begin(); - trkend=mytrk.end(); - } - - //calculating seed z position(z average weighted by z error) - double oldz=0; - double z_weight=0; - trkbegin=vxtrk.begin(); - trkend=vxtrk.end(); - for(vector<MyTrack>::iterator i=trkbegin ; i<trkend;i++){ - oldz += (*i).m_z0*(*i).m_z0err; - z_weight += (*i).m_z0err; - } - oldz /= z_weight; - - double oldx=0; - double oldy=0; - double m_Gk[3][3]={{mGkx,0.,0.},{0.,mGky,0.},{0.,0.,mGkz}};//error - Amg::MatrixX C22_mat(3,3); - double chi2=0; - - trkbegin=vxtrk.begin(); - trkend=vxtrk.end(); - int trknumber=0; - athenaLog << MSG::DEBUG << "FTK_DuplicateTrackRemovalTool:: fit VTX, using "<<vxtrk.size()<<" trks."<< endmsg; - 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<< endmsg; - //track parameter reading - double xv,yv,zv,P0,phi0,theta0; - TVector3 trk; - xv=oldx; - yv=oldy; - zv=oldz; - P0=(*i).m_pt; - phi0=(*i).m_phi; - theta0=(*i).m_theta; - - //parameter of angle - - double cosPhi0,sinPhi0,sinPsi,cosPsi; - double psi,ctt,sint; - double alpha=0.02997*20.84;///1000.0; - - cosPhi0=cos(phi0);sinPhi0=sin(phi0); - sinPsi=-alpha*(xv*cosPhi0+yv*sinPhi0)/P0; - cosPsi=sqrt(1.0-sinPsi*sinPsi); - psi=asin(sinPsi); - sint=sin(theta0); - ctt=cos(theta0)/sint; - - //difference of values expected and observed - - double m_A[2][3],m_B[2][3],m_u[2],m_h[2],m_resid[2]; - - m_A[0][0]=-sin(phi0+psi)/cosPsi; - m_A[0][1]= cos(phi0+psi)/cosPsi; - m_A[0][2]=0.0; - - m_A[1][0]=-ctt*cosPhi0/cosPsi; - m_A[1][1]=-ctt*sinPhi0/cosPsi; - m_A[1][2]=1.0; - - m_B[0][0]=-xv*m_A[0][1]+yv*m_A[0][0]; - m_B[0][1]=0.0; - m_B[0][2]=(1.0-1.0/cosPsi)/alpha; - - m_B[1][0]=-xv*m_A[1][1]+yv*m_A[1][0]; - m_B[1][1]=-P0*psi/(alpha*sint*sint); - m_B[1][2]=ctt*(psi-sinPsi/cosPsi)/alpha; - - m_u[0]=(*i).m_d0; - m_u[1]=(*i).m_z0; - - m_h[0]=yv*cosPhi0-xv*sinPhi0+P0*(1-cosPsi)/alpha; - m_h[1]=zv+P0*ctt*psi/alpha; + for (unsigned int i = 0; i!=trks->size(); i++) { + const FTK_RawTrack *track = trks->at(i); - m_resid[0]=m_u[0]-m_h[0]; - m_resid[1]=m_u[1]-m_h[1]; + //now we should see whether this track overlaps with one (or more?) tracks already in the nodups container + std::vector<int> matching_oldtracks; + for (unsigned int e = 0; e!=m_trks_nodups->size(); e++) { + const FTK_RawTrack *oldtrack = m_trks_nodups->at(e); + if (match(track,oldtrack)) { + matching_oldtracks.push_back(e); + } + } - //error of difference + //if it does, either replace the (worst?) matching track with this new track, or ignore this new track, depending on which track we like better - double m_Vqq[3][3]={{(*i).m_phierr*(*i).m_phierr,0.,0.},{0.,(*i).m_thetaerr*(*i).m_thetaerr,0.},{0.,0.,(*i).m_pterr*(*i).m_pterr}}; - double m_Vuu[2][2]={{(*i).m_d0err*(*i).m_d0err,0.},{0.,(*i).m_z0err*(*i).m_z0err}}; - double AC[2][3],BV[2][3],Sk[2][2]; - - for(int i1=0;i1<2;i1++) for(int j=0;j<2;j++) Sk[i1][j]=m_Vuu[i1][j]; - for(int i1=0;i1<2;i1++) for(int j=0;j<3;j++) - { - AC[i1][j]=0.0; - for(int k=0;k<3;k++) AC[i1][j]+=m_A[i1][k]*m_Gk[j][k]; - } - for(int i1=0;i1<2;i1++) for(int j=0;j<2;j++) - { - for(int k=0;k<3;k++) Sk[i1][j]+=AC[i1][k]*m_A[j][k]; - } - for(int i1=0;i1<2;i1++) - for(int j=0;j<3;j++) - { - BV[i1][j]=0.0; - for(int k=0;k<3;k++) BV[i1][j]+=m_B[i1][k]*m_Vqq[k][j]; - } - for(int i1=0;i1<2;i1++) - for(int j=0;j<2;j++) - { - for(int k=0;k<3;k++) Sk[i1][j]+=BV[i1][k]*m_B[j][k]; - } - - //error determinant - double detr,m_V[2][2]; - - detr=1.0/(Sk[0][0]*Sk[1][1]-Sk[0][1]*Sk[1][0]); - m_V[0][0]=Sk[1][1]*detr; - m_V[1][1]=Sk[0][0]*detr; - m_V[0][1]=m_V[1][0]=-Sk[0][1]*detr; - - //chi2 - 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); - i++; - } - trkbegin=vxtrk.begin(); - trkend=vxtrk.end(); - //vertex position & covariance update - double K[2][3],dV[3]; - - for(int i2=0;i2<2;i2++){ - for(int j=0;j<3;j++){ - for(int k=0;k<2;k++)K[i2][j]=AC[k][j]*m_V[k][i2]; - } - } - - for(int i2=0;i2<3;i2++){ - dV[i2]=K[0][i2]*m_resid[0]+K[1][i2]*m_resid[1]; - for(int j2=i2;j2<3;j2++){ - m_Gk[i2][j2]-=K[0][i2]*AC[0][j2]+K[1][i2]*AC[1][j2]; - m_Gk[j2][i2]=m_Gk[i2][j2]; - } - } - oldx+=dV[0]; - oldy+=dV[1]; - oldz+=dV[2]; - C22_mat(0,0)=m_Gk[0][0];C22_mat(0,1)=m_Gk[0][1];C22_mat(0,2)=m_Gk[0][0]; - C22_mat(1,0)=m_Gk[1][0];C22_mat(1,1)=m_Gk[1][1];C22_mat(1,2)=m_Gk[1][2]; - C22_mat(2,0)=m_Gk[2][0];C22_mat(2,1)=m_Gk[2][1];C22_mat(2,2)=m_Gk[2][2]; - }//track loop end - if (vxtrk.size()==0)continue; - athenaLog << MSG::DEBUG << "findVertex: find vertex at "<< oldx<<";"<<oldy<<";"<<oldz<< endmsg; - Amg::Vector3D frameOrigin(oldx,oldy,oldz); - int ndf = 2*vxtrk.size()-3; - xAOD::Vertex* vx = new xAOD::Vertex; - vx->makePrivateStore(); - vx->setPosition (frameOrigin); - vx->setCovariancePosition (C22_mat); - vx->setFitQuality(chi2,static_cast<float>(ndf)); - vx->setVertexType(xAOD::VxType::PriVtx); - - std::vector<VxTrackAtVertex> & tracksAtVertex = vx->vxTrackAtVertex(); tracksAtVertex.clear(); - // Store the tracks at vertex - Amg::Vector3D Vertex(frameOrigin[0],frameOrigin[1],frameOrigin[2]); - const Trk::PerigeeSurface Surface(Vertex); - Trk::Perigee * refittedPerigee(0); - vector<MyTrack>::iterator i; - for (i = trkatvtx.begin(); i != trkatvtx.end() ; ++i) - { - AmgSymMatrix(5) * CovMtxP = new AmgSymMatrix(5); - double eta = ctheta2eta((*i).m_theta); - double etaerr=(*i).m_thetaerr*cosh(eta); - double qoverperr=cosh(eta)? 2./cosh(eta) * sqrt(4*(*i).m_pterr*(*i).m_pterr + 1/4/(*i).m_pt/(*i).m_pt*tanh(eta)*tanh(eta)*etaerr*etaerr) : 10; - (*CovMtxP)(0,0)=(*i).m_d0err*(*i).m_d0err; - (*CovMtxP)(0,0)=(*i).m_z0err*(*i).m_z0err; - (*CovMtxP)(0,0)=(*i).m_phierr*(*i).m_phierr; - (*CovMtxP)(0,0)=(*i).m_thetaerr*(*i).m_thetaerr; - (*CovMtxP)(0,0)=qoverperr*qoverperr; - double qoverp = 2/(*i).m_pt/cosh(eta); - refittedPerigee = new Trk::Perigee ((*i).m_d0,(*i).m_z0,(*i).m_phi,(*i).m_theta,qoverp, Surface, CovMtxP); - tracksAtVertex.emplace_back(-1, refittedPerigee); - } - - theVertexContainer->push_back(vx); - - trkatvtx.clear(); - //delete vx; - }while(mytrk.size()>0);//vertex loop end - - for (auto pv = theVertexContainer->begin(); pv != theVertexContainer->end(); ++pv) { - athenaLog << MSG::DEBUG << "vertex x = " <<(*pv)->position().x()<< endmsg; + m_trks_nodups->push_back((FTK_RawTrack*)track); } - return std::make_pair(theVertexContainer, theVertexAuxContainer); - //return theVertexContainer; - -} + //maybe at the end we should do a check that no further matches exist? -vector<FTK_DuplicateTrackRemovalTool::MyTrack> FTK_DuplicateTrackRemovalTool::getTracks(const FTK_RawTrackContainer* trks){ - - MsgStream athenaLog(msgSvc(), name()); - vector<MyTrack> mytrk; - athenaLog << MSG::DEBUG << "getRawTracks: find "<< trks->size()<< " tracks "<< endmsg; - for (unsigned int ftk_track_index = 0; ftk_track_index != trks->size(); ++ftk_track_index){ - const FTK_RawTrack* ftk_track= trks->at(ftk_track_index); - float trk_theta = std::atan2(1.0,ftk_track->getCotTh()); - double invpt= ftk_track->getInvPt(); - float trk_eta = -std::log(std::tan(trk_theta/2)); - float trk_phi = ftk_track->getPhi(); - float trk_d0 = ftk_track->getD0(); - float trk_z0 = ftk_track->getZ0(); - 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; - double trk_d0err=sqrt(1.662e-3+6.947e4*invpt*invpt); - 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))*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)); - - if(fabs(trk_pt)<m_constTrkPt)continue; - if(m_barrelOnly&&fabs(trk_eta)>m_constTrkEta)continue; - if(ftk_track_index<10)athenaLog << MSG::DEBUG << "getRawTracks: get pt "<< trk_pt<<"+/-"<<trk_pterr << ", eta "<<trk_eta<<"+/-"<<trk_thetaerr<<", phi"<<trk_phi<<"+/-"<<trk_phierr<<", d0"<<trk_d0<<"+/-"<<trk_d0err<<", z0"<<trk_z0<<"+/-"<<trk_z0err <<endmsg; - MyTrack Trk(ftk_track_index,trk_pt,trk_theta,trk_phi,trk_d0,trk_z0,trk_pterr,trk_thetaerr,trk_phierr,trk_d0err,trk_z0err); - mytrk.push_back(Trk); - } - athenaLog << MSG::DEBUG << "getRawTracks: total "<< mytrk.size() << " track "<< endmsg; - return mytrk; -} - -vector<FTK_DuplicateTrackRemovalTool::MyTrack> FTK_DuplicateTrackRemovalTool::getTracks(const TrackCollection* trks){ - MsgStream athenaLog(msgSvc(), name()); - vector<MyTrack> mytrk; - athenaLog << MSG::DEBUG << "getRefitTracks: find "<< trks->size()<< " tracks "<< endmsg; - TrackCollection::const_iterator track_it = trks->begin(); - TrackCollection::const_iterator last_track = trks->end(); - for (int iTrack = 0 ; track_it!= last_track; track_it++, iTrack++) { -// double invpt= sin(trk_Theta)*ftk_track->getCurv()/2.; - double trk_qOverp= (*track_it)->perigeeParameters()->parameters()[Trk::qOverP]; - float trk_theta = (*track_it)->perigeeParameters()->parameters()[Trk::theta]; - float trk_eta = (*track_it)->perigeeParameters()->eta();//ctheta2eta(trk_theta); - float trk_phi = (*track_it)->perigeeParameters()->parameters()[Trk::phi0]; - float trk_d0 = (*track_it)->perigeeParameters()->parameters()[Trk::d0]; - float trk_z0 = (*track_it)->perigeeParameters()->parameters()[Trk::z0]; - float trk_pt = 1/(trk_qOverp/sin(trk_theta)); -/* - float invpt = 1/(trk_pt); - 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)*m_z0errfactor; -*/ - const AmgSymMatrix(5) *cov=(*track_it)->perigeeParameters()->covariance(); - double trk_d0err=sqrt((*cov)(0,0)); - double trk_z0err=sqrt((*cov)(1,1)); - double trk_phierr=sqrt((*cov)(2,2)); - double trk_thetaerr=sqrt((*cov)(3,3)); - double trk_qOverperr=sqrt((*cov)(4,4)); -/* double trk_d0err=(*track_it)->measurementsOnTrack()->localCovariance().error(Trk::d0); - double trk_z0err=(*track_it)->measurementsOnTrack()->localErrorMatrix().error(Trk::z0); - double trk_phi0err=(*track_it)->measurementsOnTrack()->localErrorMatrix().error(Trk::phi0); - double trk_thetaerr=(*track_it)->measurementsOnTrack()->localErrorMatrix().error(Trk::theta); - double trk_qOverperr=(*track_it)->measurementsOnTrack()->localErrorMatrix().error(Trk::qOverP); -*/ double trk_pterr=-sin(trk_theta)*trk_qOverperr/trk_qOverp/trk_qOverp+cos(trk_theta)*trk_thetaerr/trk_qOverp; - if(fabs(trk_pt)<m_constTrkPt)continue; - if(m_barrelOnly&&fabs(trk_eta)>m_constTrkEta)continue; - if(iTrack<10)athenaLog << MSG::DEBUG << "getRefitTracks: get pt "<< trk_pt<<"+/-"<<trk_qOverperr << ", eta "<<trk_eta<<"+/-"<<trk_thetaerr<<", phi"<<trk_phi<<"+/-"<<trk_phierr<<", d0"<<trk_d0<<"+/-"<<trk_d0err<<", z0"<<trk_z0<<"+/-"<<trk_z0err <<endmsg; - mytrk.push_back(MyTrack(iTrack,trk_pt,trk_theta,trk_phi,trk_d0,trk_z0,trk_pterr,trk_thetaerr,trk_phierr,trk_d0err,trk_z0err)); - } - return mytrk; -} - -double FTK_DuplicateTrackRemovalTool::ctheta2eta(double cot){ - double eta=0.0; - double tempX=0.0; - - if(atan(1.0/cot) >= 0) tempX = atan(1.0/cot); - if(atan(1.0/cot) < 0) tempX = atan(1.0/cot)+M_PI; - - eta = -log(tan(tempX/2.0)); - - return eta; + return m_trks_nodups; } -