18#include "GaudiKernel/SystemOfUnits.h"
30 declareInterface<IMuidTrackIsolation>(
this);
42 double radius = 2.0 * Gaudi::Units::meter;
43 double halfLength = 4.0 * Gaudi::Units::meter;
45 transform.setIdentity();
46 m_caloCylinder = std::make_unique<Trk::CylinderSurface>(transform, radius, halfLength);
53 discRotation.setIdentity();
55 auto transform1 = std::make_unique<Amg::Transform3D>(discRotation * forwardDiscPosition);
58 auto transform2 = std::make_unique<Amg::Transform3D>(discRotation * backwardDiscPosition);
63 return StatusCode::SUCCESS;
67 ATH_MSG_DEBUG(
" MuidTrackIsolation:: " << std::setiosflags(std::ios::fixed)
69 <<
" for muon at calo with eta,phi " << std::setw(8) << std::setprecision(3) <<
eta
70 << std::setw(8) << std::setprecision(3) <<
phi);
73 std::pair<int, double> isolation{0, 0.};
95 ATH_MSG_DEBUG(
"Found " << isolation.first << std::setiosflags(std::ios::fixed) <<
" InDet tracks with total momentum "
96 << std::setw(8) << std::setprecision(1) << isolation.second / Gaudi::Units::GeV <<
" GeV");
104 int numberTracks = 0;
111 double inDetPhi = perigee.parameters()[
Trk::phi];
112 double inDetEta = perigee.
eta();
114 double diffEta = std::abs(
eta - inDetEta);
118 << std::setiosflags(std::ios::fixed) <<
" Id track: momentum " << std::setw(8) << std::setprecision(1)
119 << perigee.
momentum().mag() / Gaudi::Units::GeV <<
" with perigee eta and difference " << std::setw(8)
120 << std::setprecision(3) << perigee.
eta() << std::setw(8) << std::setprecision(3) << diffEta
121 <<
" and same for phi " << std::setw(8) << std::setprecision(3) << perigee.parameters()[
Trk::phi] << std::setw(8)
122 << std::setprecision(3) << diffPhi);
124 if ((diffPhi * diffPhi + diffEta * diffEta) >
m_trackCone2)
continue;
126 const double p = perigee.
momentum().mag();
129 ATH_MSG_VERBOSE(
"inside cone, track#" << std::setw(3) << numberTracks);
132 return std::make_pair(numberTracks, sumP);
138 int numberTracks = 0;
145 double inDetEta = perigee.
eta();
152 double cotTheta = std::tan(M_PI_2 - perigee.parameters()[
Trk::theta]);
154 direction /= direction.mag();
163 std::optional<Trk::TrackSurfaceIntersection> caloIntersection(
164 m_intersector->intersectSurface(*surface, idIntersection, qOverP));
167 if (!caloIntersection) {
169 << std::setiosflags(std::ios::fixed) <<
" Id track: momentum " << std::setw(8) << std::setprecision(1)
170 << perigee.
momentum().mag() / Gaudi::Units::GeV <<
" with initial eta " << std::setw(8)
171 << std::setprecision(3) << perigee.
eta() <<
" and phi " << std::setw(8) << std::setprecision(3)
177 double diffEta =
eta - caloIntersection->position().eta();
180 << std::setiosflags(std::ios::fixed) <<
" Id track: momentum " << std::setw(8) << std::setprecision(1)
181 << perigee.
momentum().mag() / Gaudi::Units::GeV <<
" with initial,extrapolated and calo difference for eta "
182 << std::setw(8) << std::setprecision(3) << perigee.
eta() << std::setw(8) << std::setprecision(3)
183 << caloIntersection->position().eta() << std::setw(8) << std::setprecision(3) << diffEta <<
" and phi "
184 << std::setw(8) << std::setprecision(3) << perigee.parameters()[
Trk::phi] << std::setw(8)
185 << std::setprecision(3) << caloIntersection->
position().phi() << std::setw(8) << std::setprecision(3)
189 if ((diffPhi * diffPhi + diffEta * diffEta) <
m_trackCone2) {
191 const double p = perigee.
momentum().mag();
194 ATH_MSG_VERBOSE(
" inside cone, track#" << std::setw(3) << numberTracks);
198 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)
#define ATH_MSG_WARNING(x)
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
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
MuidTrackIsolation(const std::string &type, const std::string &name, const IInterface *parent)
std::unique_ptr< const Trk::Surface > m_caloCylinder
SG::ReadHandleKey< TrackCollection > m_inDetTracksLocation
StatusCode initialize() override
std::pair< int, double > trackExtrapolated(const TrackCollection *indetTracks, double eta, double phi) const
std::pair< int, double > trackVertex(const TrackCollection *indetTracks, double eta, double phi) const
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
bool isPresent() const
Is the referenced object present in SG?
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.
An intersection with a Surface is given by.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[