diff --git a/Reconstruction/egamma/egammaTrackTools/src/EMExtrapolationTools.cxx b/Reconstruction/egamma/egammaTrackTools/src/EMExtrapolationTools.cxx index e6e9104626700b3d6b05884d8c5b8e377cadcdce..f699ee3397712bf997145482573906fd590503f1 100644 --- a/Reconstruction/egamma/egammaTrackTools/src/EMExtrapolationTools.cxx +++ b/Reconstruction/egamma/egammaTrackTools/src/EMExtrapolationTools.cxx @@ -257,6 +257,7 @@ EMExtrapolationTools::getMatchAtCalo (const xAOD::CaloCluster* cluster, bool flipSign = false; if(trkPB->charge() > 0) flipSign = true; + //Layers to calculate intersections CaloExtensionHelpers::LayersToSelect layersToSelect; if ( xAOD::EgammaHelpers::isBarrel( cluster ) ) { // Barrel @@ -271,20 +272,25 @@ EMExtrapolationTools::getMatchAtCalo (const xAOD::CaloCluster* cluster, layersToSelect.insert(CaloSampling::EME2 ); layersToSelect.insert(CaloSampling::EME3 ); } - - const Trk::CaloExtension* extension = 0; - + //------------------- Extrapolate -----------------------------// + const Trk::CaloExtension* extension = 0; double atPerigeePhi(-999); double PerigeeTrkParPhi(-999); + + //TRT only track. Could be in the standard or GSF container. - //Extrapolate from last measurement and use caching (std cache container) + //Use the std tool/cache if (isTRT){ - m_defaultParticleCaloExtensionTool->caloExtension(*trkPB,extension,m_useCaching); + if(!m_defaultParticleCaloExtensionTool->caloExtension(*trkPB,extension,m_useCaching)){ + ATH_MSG_WARNING("Could not create an extension for "<< " Track Pt " + <<trkPB->pt()<< " Track Eta " << trkPB->eta()<<" Track Fitter " + << trkPB->trackFitter() << " isTRT " << isTRT<<" Extrapolate From " << extrapFrom); + return StatusCode::SUCCESS; + } } - //Perigee Rescaled + //Perigee Rescaled , not caching possible for trk parameters else if (fromPerigeeRescaled == extrapFrom) { - const Trk::TrackParameters* trkPar = getRescaledPerigee(trkPB, cluster); if(!trkPar){ ATH_MSG_ERROR("getMatchAtCalo: Cannot access track parameters"); @@ -296,15 +302,26 @@ EMExtrapolationTools::getMatchAtCalo (const xAOD::CaloCluster* cluster, PerigeeTrkParPhi=trkPar->momentum().phi(); delete trkPar; } - //GSF track Particles, from perigee , using the egamma cache + //GSF track Particles, from perigee , using the egamma tool/cache else if( trkPB->trackFitter() == xAOD::GaussianSumFilter){ - m_perigeeParticleCaloExtensionTool->caloExtension(*trkPB,extension,m_useCaching); + if(!m_perigeeParticleCaloExtensionTool->caloExtension(*trkPB,extension,m_useCaching)){ + ATH_MSG_WARNING("Could not create an extension for "<< " Track Pt " + <<trkPB->pt()<< " Track Eta " << trkPB->eta()<<" Track Fitter " + << trkPB->trackFitter() << " isTRT " << isTRT<<" Extrapolate From " << extrapFrom); + return StatusCode::SUCCESS; + } } - //Else track Particles beofre GSF or if failed GSF + //Else track Particles before GSF or if they failed GSF, use the std tool/cache else { - m_defaultParticleCaloExtensionTool->caloExtension(*trkPB,extension,m_useCaching); + if(!m_defaultParticleCaloExtensionTool->caloExtension(*trkPB,extension,m_useCaching)){ + ATH_MSG_WARNING("Could not create an extension for "<< " Track Pt " + <<trkPB->pt()<< " Track Eta " << trkPB->eta()<<" Track Fitter " + << trkPB->trackFitter() << " isTRT " << isTRT<<" Extrapolate From " << extrapFrom); + return StatusCode::SUCCESS; + } } + //------------------------------------------------// if(!extension){ ATH_MSG_WARNING("Could not create an extension for "<< " Track Pt " <<trkPB->pt()<< " Track Eta " << trkPB->eta()<<" Track Fitter " @@ -485,8 +502,6 @@ bool EMExtrapolationTools::getEtaPhiAtCalo (const xAOD::Vertex* vertex, return success; } -////////////////////////////////////////////////////////////////////// - // ================================================================= bool EMExtrapolationTools::getHackEtaPhiAtCalo (const Trk::TrackParameters* trkPar, @@ -526,12 +541,61 @@ bool EMExtrapolationTools::getHackEtaPhiAtCalo (const Trk::TrackParameters* trkP return hitEM2; } +// ================================================================= +Amg::Vector3D EMExtrapolationTools::getMomentumAtVertex(const xAOD::Vertex& vertex, unsigned int index) const +{ + Amg::Vector3D momentum(0., 0., 0.); + if (vertex.nTrackParticles() <= index) + { + ATH_MSG_WARNING("Invalid track index"); + } + else if (vertex.vxTrackAtVertexAvailable() && vertex.vxTrackAtVertex().size()){ + // Use the parameters at the vertex + // (the tracks should be parallel but we will do the sum anyway) + ATH_MSG_DEBUG("getMomentumAtVertex : getting from vxTrackAtVertex"); + const auto& trkAtVertex = vertex.vxTrackAtVertex()[index]; + const Trk::TrackParameters* paramAtVertex = trkAtVertex.perigeeAtVertex(); + if (!paramAtVertex) + ATH_MSG_WARNING("VxTrackAtVertex does not have perigee at vertex"); + else + return paramAtVertex->momentum(); + } + else if (vertex.nTrackParticles() == 1){ + // Use the first measurement + ATH_MSG_DEBUG("getMomentumAtVertex : 1 track only, getting from first measurement"); + const xAOD::TrackParticle *tp = vertex.trackParticle(0); + unsigned int index(0); + if (!tp || !tp->indexOfParameterAtPosition(index, xAOD::FirstMeasurement)){ + ATH_MSG_WARNING("No TrackParticle or no have first measurement"); + } + else + momentum += tp->curvilinearParameters(index).momentum(); + // OR last 3 values of trackParameters(index) + } + else{ + // Extrapolate track particle to vertex + ATH_MSG_DEBUG("getMomentumAtVertex : extrapolating to perigee surface"); + const xAOD::TrackParticle* tp = vertex.trackParticle( index ); + if (!tp) ATH_MSG_WARNING("NULL pointer to TrackParticle in vertex"); + else + { + const Trk::PerigeeSurface *surface = new Trk::PerigeeSurface(vertex.position()); + const Trk::TrackParameters* params = m_extrapolator->extrapolate(*tp, *surface, Trk::alongMomentum); + delete surface; + if (!params) ATH_MSG_DEBUG("Extrapolation to vertex (perigee) failed"); + else momentum += params->momentum(); + delete params; + } + } + return momentum; +} + // ================================================================= Amg::Vector3D EMExtrapolationTools::getMomentumAtVertex(const xAOD::Vertex& vertex, bool reuse /* = true */) const { - Amg::Vector3D momentum(0., 0., 0.); - + Amg::Vector3D momentum(0., 0., 0.); + static SG::AuxElement::Accessor<float> accPx("px"); static SG::AuxElement::Accessor<float> accPy("py"); static SG::AuxElement::Accessor<float> accPz("pz"); @@ -552,57 +616,16 @@ Amg::Vector3D EMExtrapolationTools::getMomentumAtVertex(const xAOD::Vertex& vert accPy(vertex), accPz(vertex)); } - else if (vertex.vxTrackAtVertexAvailable() && vertex.vxTrackAtVertex().size()){ - // Use the parameters at the vertex - // (the tracks should be parallel but we will do the sum anyway) - ATH_MSG_DEBUG("getMomentumAtVertex : getting from vxTrackAtVertex"); - for (const auto& trkAtVertex : vertex.vxTrackAtVertex()){ - const Trk::TrackParameters* paramAtVertex = trkAtVertex.perigeeAtVertex(); - if (!paramAtVertex) - ATH_MSG_WARNING("VxTrackAtVertex does not have perigee at vertex"); - else - momentum += paramAtVertex->momentum(); - } - } - else if (vertex.nTrackParticles() == 1){ - // Use the first measurement - ATH_MSG_DEBUG("getMomentumAtVertex : 1 track only, getting from first measurement"); - const xAOD::TrackParticle *tp = vertex.trackParticle(0); - unsigned int index(0); - if (!tp || !tp->indexOfParameterAtPosition(index, xAOD::FirstMeasurement)){ - ATH_MSG_WARNING("No TrackParticle or no have first measurement"); - } - else - momentum += tp->curvilinearParameters(index).momentum(); - // OR last 3 values of trackParameters(index) - } - else{ - // Extrapolate track particles to vertex - // (the tracks should be parallel but we will do the sum anyway) - ATH_MSG_DEBUG("getMomentumAtVertex : extrapolating to perigee surface"); - const Trk::PerigeeSurface *surface = new Trk::PerigeeSurface(vertex.position()); - for (unsigned int i = 0; i < vertex.nTrackParticles(); ++i){ - const xAOD::TrackParticle* tp = vertex.trackParticle( i ); - if (!tp){ - ATH_MSG_WARNING("NULL pointer to TrackParticle in vertex"); - continue; - } - const Trk::TrackParameters* params = m_extrapolator->extrapolate(*tp, *surface, Trk::alongMomentum); - if (!params) - ATH_MSG_DEBUG("Extrapolation to vertex (perigee) failed"); - else{ - momentum += params->momentum(); - delete params; - } - } - delete surface; + else + { + for (unsigned int i = 0; i < vertex.nTrackParticles(); ++i) + momentum += getMomentumAtVertex(vertex, i); } - return momentum; } -// ======================================================================================================================== +// ================================================================= -// ======================= HELPERS +// ======================= HELPERS============================================== const Trk::TrackParameters* EMExtrapolationTools::getRescaledPerigee(const xAOD::TrackParticle* trkPB, const xAOD::CaloCluster* cluster) const { const Trk::TrackParameters* oldPerigee = &trkPB->perigeeParameters(); @@ -634,7 +657,7 @@ EMExtrapolationTools::getRescaledPerigee(const xAOD::TrackParticle* trkPB, const covariance); return (result); } - +// ================================================================= Trk::CurvilinearParameters EMExtrapolationTools::getLastMeasurement(const xAOD::TrackParticle* trkPB) const{ // Get last measurement for TRT check Trk::CurvilinearParameters temp; diff --git a/Reconstruction/egamma/egammaTrackTools/src/EMExtrapolationTools.h b/Reconstruction/egamma/egammaTrackTools/src/EMExtrapolationTools.h index 1488d6e002fe1de5f36ed6d56fb78d321d802918..bd5556a5f0a4d5c9e622933cd3abc4c54e5b1166 100644 --- a/Reconstruction/egamma/egammaTrackTools/src/EMExtrapolationTools.h +++ b/Reconstruction/egamma/egammaTrackTools/src/EMExtrapolationTools.h @@ -7,7 +7,7 @@ /** @class EMExtrapolationTools Tools for track extrapolation to the calorimeter - @author Thomas Koffas + @author Thomas Koffas, Christos Anastopoulos */ /******************************************************************** @@ -15,13 +15,11 @@ NAME: EMExtrapolationTools.h PACKAGE: offline/Reconstruction/egammaTrackTools -AUTHORS: T. Koffas -CREATED: Mar , 2009 +AUTHORS: T. Koffas, C.Anastopoulos PURPOSE: Tool which propagate track to - calorimeter - cluster -UPDATED: ********************************************************************/ #include "AthenaBaseComps/AthAlgTool.h" @@ -70,8 +68,8 @@ class EMExtrapolationTools : virtual public IEMExtrapolationTools, public AthAlg /** test for cluster/extrapolated track match, from xAOD::TrackParticle, - * returns true for good match, and - * the values for eta/phi, deltaEta/deltaPhi for sampling 2 + * returns true for good match using sampling 2, and + * the values for eta/phi, deltaEta/deltaPhi */ virtual bool matchesAtCalo(const xAOD::CaloCluster* cluster, const xAOD::TrackParticle* trkPB, @@ -119,6 +117,9 @@ class EMExtrapolationTools : virtual public IEMExtrapolationTools, public AthAlg virtual bool getEtaPhiAtCalo (const xAOD::Vertex* vertex, float *etaAtCalo, float *phiAtCalo) const; + + /** get the momentum of the i-th at the vertex (designed for conversions) **/ + Amg::Vector3D getMomentumAtVertex(const xAOD::Vertex&, unsigned int) const; /** get sum of the momenta at the vertex (designed for conversions). Retrieve from auxdata if available and <reuse> is true **/ Amg::Vector3D getMomentumAtVertex(const xAOD::Vertex&, bool reuse = true) const; @@ -126,6 +127,12 @@ class EMExtrapolationTools : virtual public IEMExtrapolationTools, public AthAlg private: + /** @Perform the Rescaling of the perigee parameters with the cluster energy **/ + const Trk::TrackParameters* getRescaledPerigee(const xAOD::TrackParticle* trkPB, const xAOD::CaloCluster* cluster) const; + + /** @Get Last measurement **/ + Trk::CurvilinearParameters getLastMeasurement(const xAOD::TrackParticle* trkPB) const; + /** @brief Return +/- 1 (2) if track is in positive/negative TRT barrel (endcap) **/ int getTRTsection(const xAOD::TrackParticle* trkPB) const; @@ -137,10 +144,6 @@ class EMExtrapolationTools : virtual public IEMExtrapolationTools, public AthAlg CaloExtensionHelpers::LayersToSelect& layersToSelect ) const; - const Trk::TrackParameters* getRescaledPerigee(const xAOD::TrackParticle* trkPB, const xAOD::CaloCluster* cluster) const; - - - Trk::CurvilinearParameters getLastMeasurement(const xAOD::TrackParticle* trkPB) const; ToolHandle<Trk::IParticleCaloExtensionTool> m_defaultParticleCaloExtensionTool; ToolHandle<Trk::IParticleCaloExtensionTool> m_perigeeParticleCaloExtensionTool; @@ -149,8 +152,6 @@ class EMExtrapolationTools : virtual public IEMExtrapolationTools, public AthAlg /** @brief */ CaloPhiRange m_phiHelper; - - // Track-to-cluster match cuts double m_broadDeltaEta; double m_broadDeltaPhi;