18#include "GaudiKernel/SystemOfUnits.h"
35 double radius = 2.0 * Gaudi::Units::meter;
36 double halfLength = 4.0 * Gaudi::Units::meter;
38 m_caloCylinder = std::make_unique<Trk::CylinderSurface>(transform, radius, halfLength);
46 auto transform1 = std::make_unique<Amg::Transform3D>(discRotation * forwardDiscPosition);
49 auto transform2 = std::make_unique<Amg::Transform3D>(discRotation * backwardDiscPosition);
54 return StatusCode::SUCCESS;
58 ATH_MSG_DEBUG(
" MuidTrackIsolation:: " << std::setiosflags(std::ios::fixed)
60 <<
" for muon at calo with eta,phi " << std::setw(8) << std::setprecision(3) <<
eta
61 << std::setw(8) << std::setprecision(3) <<
phi);
64 std::pair<int, double> isolation{0, 0.};
69 return std::make_pair(0, 0.);
80 ATH_MSG_DEBUG(
"Found " << isolation.first << std::setiosflags(std::ios::fixed) <<
" InDet tracks with total momentum "
81 << std::setw(8) << std::setprecision(1) << isolation.second / Gaudi::Units::GeV <<
" GeV");
97 double inDetPhi = perigee.parameters()[
Trk::phi];
98 double inDetEta = perigee.
eta();
100 double diffEta = std::abs(
eta - inDetEta);
104 << std::setiosflags(std::ios::fixed) <<
" Id track: momentum " << std::setw(8) << std::setprecision(1)
105 << perigee.
momentum().mag() / Gaudi::Units::GeV <<
" with perigee eta and difference " << std::setw(8)
106 << std::setprecision(3) << perigee.
eta() << std::setw(8) << std::setprecision(3) << diffEta
107 <<
" and same for phi " << std::setw(8) << std::setprecision(3) << perigee.parameters()[
Trk::phi] << std::setw(8)
108 << std::setprecision(3) << diffPhi);
110 if ((diffPhi * diffPhi + diffEta * diffEta) >
m_trackCone2)
continue;
112 const double p = perigee.
momentum().mag();
115 ATH_MSG_VERBOSE(
"inside cone, track#" << std::setw(3) << numberTracks);
118 return std::make_pair(numberTracks, sumP);
124 int numberTracks = 0;
133 double inDetEta = perigee.
eta();
140 double cotTheta = std::tan(M_PI_2 - perigee.parameters()[
Trk::theta]);
142 direction /= direction.mag();
151 std::optional<Trk::TrackSurfaceIntersection> caloIntersection(
152 m_intersector->intersectSurface(*surface, idIntersection, qOverP));
155 if (!caloIntersection) {
157 << std::setiosflags(std::ios::fixed) <<
" Id track: momentum " << std::setw(8) << std::setprecision(1)
158 << perigee.
momentum().mag() / Gaudi::Units::GeV <<
" with initial eta " << std::setw(8)
159 << std::setprecision(3) << perigee.
eta() <<
" and phi " << std::setw(8) << std::setprecision(3)
165 double diffEta =
eta - caloIntersection->position().eta();
168 << std::setiosflags(std::ios::fixed) <<
" Id track: momentum " << std::setw(8) << std::setprecision(1)
169 << perigee.
momentum().mag() / Gaudi::Units::GeV <<
" with initial,extrapolated and calo difference for eta "
170 << std::setw(8) << std::setprecision(3) << perigee.
eta() << std::setw(8) << std::setprecision(3)
171 << caloIntersection->position().eta() << std::setw(8) << std::setprecision(3) << diffEta <<
" and phi "
172 << std::setw(8) << std::setprecision(3) << perigee.parameters()[
Trk::phi] << std::setw(8)
173 << std::setprecision(3) << caloIntersection->
position().phi() << std::setw(8) << std::setprecision(3)
177 if ((diffPhi * diffPhi + diffEta * diffEta) <
m_trackCone2) {
179 const double p = perigee.
momentum().mag();
182 ATH_MSG_VERBOSE(
" inside cone, track#" << std::setw(3) << numberTracks);
186 return std::make_pair(numberTracks, sumP);
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
std::pair< int, double > trackIsolation(const EventContext &ctx, double eta, double phi) const override
IMuidTrackIsolation interface: get the number of tracks and summed momentum in a cone at the producti...
Gaudi::Property< double > m_minPt
std::unique_ptr< const Trk::Surface > m_caloForwardDisc
std::unique_ptr< const Trk::Surface > m_caloBackwardDisc
Gaudi::Property< double > m_trackCone
ToolHandle< Trk::IIntersector > m_intersector
Gaudi::Property< bool > m_trackExtrapolation
std::pair< int, double > trackVertex(const xAOD::TrackParticleContainer *indetTracks, double eta, double phi) const
std::pair< int, double > trackExtrapolated(const xAOD::TrackParticleContainer *indetTracks, double eta, double phi) const
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_trackLinkKey
std::unique_ptr< const Trk::Surface > m_caloCylinder
StatusCode initialize() override
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_inDetTracksLocation
double eta() const
Access method for pseudorapidity - from momentum.
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & position() const
Access method for the position.
double pT() const
Access method for transverse momentum.
Abstract Base Class for tracking surfaces.
@ StraightTrack
A straight track.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
TrackSurfaceIntersection(const Amg::Vector3D &pos, const Amg::Vector3D &dir, double path)
Constructor.
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".