ATLAS Offline Software
Loading...
Searching...
No Matches
EMTrackMatchBuilder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3 */
4
5
7
10
15
19
20#include "GaudiKernel/EventContext.h"
23
24
26
28 const std::string& name,
29 const IInterface* parent)
30 : AthAlgTool(type, name, parent)
31{
32 // declare interface
33 declareInterface<IEMTrackMatchBuilder>(this);
34}
35
36StatusCode
38{
39 ATH_CHECK(m_TrackParticlesKey.initialize());
40 ATH_CHECK(m_caloDetDescrMgrKey.initialize());
41 // the extrapolation tool
43
44 // set things up for the sorting
49
50 return StatusCode::SUCCESS;
51}
52
53StatusCode
54EMTrackMatchBuilder::executeRec(const EventContext& ctx,
55 EgammaRecContainer* egammas) const
56{
57 // protection against bad pointers
58 if (egammas == nullptr) {
59 return StatusCode::SUCCESS;
60 }
61 // retrieve the trackparticle container
63 ctx);
64
65 SG::ReadCondHandle<CaloDetDescrManager> caloDetDescrMgrHandle{
67 };
68 ATH_CHECK(caloDetDescrMgrHandle.isValid());
69
70 const CaloDetDescrManager* caloDD = *caloDetDescrMgrHandle;
71
72 // check is only used for serial running; remove when MT scheduler used
73 ATH_CHECK(trackPC.isValid());
74 // Loop over calling the trackExecute method
75 for (egammaRec* eg : *egammas) {
76 // retrieve the cluster
77 ATH_CHECK(trackExecute(ctx, eg, trackPC.cptr(), *caloDD));
78 }
79 return StatusCode::SUCCESS;
80}
81
82StatusCode
83EMTrackMatchBuilder::trackExecute(const EventContext& ctx,
84 egammaRec* eg,
85 const xAOD::TrackParticleContainer* trackPC,
86 const CaloDetDescrManager& caloDD) const
87{
88 if (!eg || !trackPC) {
90 "trackExecute: NULL pointer to egammaRec or TrackParticleContainer");
91 return StatusCode::SUCCESS;
92 }
93 // retrieve corresponding cluster
94 const xAOD::CaloCluster* cluster = eg->caloCluster();
95 // check if the cluster is sane
96 if (!cluster){
97 ATH_MSG_WARNING("trackExecute: cluster ptr is null! Ignoring cluster.");
98 return StatusCode::SUCCESS;
99 }
100 if (cluster->e() == 0.0) {
101 ATH_MSG_WARNING("trackExecute: cluster energy is 0.0! Ignoring cluster.");
102 return StatusCode::SUCCESS;
103 }
104
105 // Loop over tracks and fill TrackMatch vector
106 std::vector<TrackMatch> trkMatches;
108 for (unsigned int trackNumber = 0; trkIt != trackPC->end();
109 ++trkIt, ++trackNumber) {
110 // Avoid TRT alone
111 if (xAOD::EgammaHelpers::numberOfSiHits(*trkIt) < 4) {
112 continue;
113 }
114 /*
115 * Try with normal directions.
116 * For cosmics allow a retry with inverted direction.
117 */
118 if (isCandidateMatch(cluster, (*trkIt), false)) {
119 inBroadWindow(ctx, trkMatches, *cluster, trackNumber, (**trkIt), caloDD);
120 }
121 }
122
123 if (!trkMatches.empty()) {
124 // sort the track matches
125 std::sort(trkMatches.begin(), trkMatches.end(), m_sorter);
126 // set the matching values
127 TrackMatch bestTrkMatch = trkMatches.at(0);
128 eg->setDeltaEta(bestTrkMatch.deltaEta);
129 eg->setDeltaPhi(bestTrkMatch.deltaPhi);
130 eg->setDeltaPhiRescaled(bestTrkMatch.deltaPhiRescaled);
131 eg->setDeltaPhiLast(bestTrkMatch.deltaPhiLast);
132
133 // set the element Links
135 std::vector<EL> trackParticleLinks;
136 trackParticleLinks.reserve(trkMatches.size());
137 const std::string key = EL(*trackPC, 0, ctx).dataID();
138 for (const TrackMatch& m : trkMatches) {
139 ATH_MSG_DEBUG("Match dR: " << m.dR << " second dR: " << m.seconddR
140 << " hasPix: " << m.hasPix
141 << " hitsScore: " << m.hitsScore);
142 if (key.empty()) {
143 trackParticleLinks.emplace_back(*trackPC, m.trackNumber, ctx);
144 } else {
145 trackParticleLinks.emplace_back(key, m.trackNumber, ctx);
146 }
147 }
148 eg->setTrackParticles(trackParticleLinks);
149 }
150 return StatusCode::SUCCESS;
151}
152
153bool
155 std::vector<TrackMatch>& trackMatches,
156 const xAOD::CaloCluster& cluster,
157 int trackNumber,
158 const xAOD::TrackParticle& trkPB,
159 const CaloDetDescrManager& caloDD) const
160{
161
164
165 // Now get the delta eta/phi and eta correction at the calorimeter
166 // final arrays that we will write
167 // Save the value of deltaPhiRescale. If we do not use rescaled
168 // perigee, we recalculate deltaPhi using rescaled momentum. This
169 // will be saved in EMTrackMatch
170 std::array<double, 4> eta = { -999.0, -999.0, -999.0, -999.0 };
171 std::array<double, 4> phi = { -999.0, -999.0, -999.0, -999.0 };
172 std::array<double, 4> deltaEta = { -999.0, -999.0, -999.0, -999.0 };
173 std::array<double, 4> deltaPhi = { -999.0, -999.0, -999.0, -999.0 };
174
175 /*
176 * Try both from perigee
177 * and from perigee Rescale.
178 *
179 * We need anyhow both to be there at the end.
180 */
181 std::pair<std::vector<CaloSampling::CaloSample>,
182 std::vector<std::unique_ptr<Trk::Surface>>>
183 layersAndSurfaces =
184 m_extrapolationTool->getClusterLayerSurfaces(cluster, caloDD);
186 ->getMatchAtCalo(ctx,
187 cluster,
188 trkPB,
189 layersAndSurfaces.first,
190 layersAndSurfaces.second,
191 eta,
192 phi,
193 deltaEta,
194 deltaPhi,
195 extrapFrom)
196 .isFailure()) {
197 return false;
198 }
199
202 std::array<double, 4> etaRes = { -999.0, -999.0, -999.0, -999.0 };
203 std::array<double, 4> phiRes = { -999.0, -999.0, -999.0, -999.0 };
204 std::array<double, 4> deltaEtaRes = { -999.0, -999.0, -999.0, -999.0 };
205 std::array<double, 4> deltaPhiRes = { -999.0, -999.0, -999.0, -999.0 };
206
208 ->getMatchAtCalo(ctx,
209 cluster,
210 trkPB,
211 layersAndSurfaces.first,
212 layersAndSurfaces.second,
213 etaRes,
214 phiRes,
215 deltaEtaRes,
216 deltaPhiRes,
217 extrapFromRes)
218 .isFailure()) {
219 return false;
220 }
221
222 double deltaPhiRescale = deltaPhiRes[2];
223 /*
224 * Sanity check for very far away matches
225 * The assumption is when we rescale we should be in the
226 * correct neighborhood for a valid track-cluster pair.
227 */
228 if (std::abs(deltaPhiRes[2]) > m_MaxDeltaPhiRescale) {
229 ATH_MSG_DEBUG("DeltaPhiRescaled above maximum: "
230 << deltaPhiRes[2] << " (max: " << m_MaxDeltaPhiRescale
231 << ")");
232 return false;
233 }
234 /*
235 * Try to match : First standard way.
236 * If this fails and the cluster Et is larger than the track Pt
237 * it might get matched only under the rescaled assumption that
238 * should be less sensitive to radiative losses.
239 */
240 if (std::abs(deltaEta[2]) < m_narrowDeltaEta && deltaPhi[2] < m_narrowDeltaPhi &&
242 ATH_MSG_DEBUG("Matched with Perigee");
243 } else if (m_SecondPassRescale && cluster.et() > trkPB.pt() &&
244 std::abs(deltaEtaRes[2]) < m_narrowDeltaEta &&
245 deltaPhiRes[2] < m_narrowDeltaPhiRescale &&
246 deltaPhiRes[2] > -m_narrowDeltaPhiRescaleBrem) {
247 ATH_MSG_DEBUG("Not Perigee but matched with Rescale");
248 } else {
249 ATH_MSG_DEBUG("Normal matched Failed deltaPhi/deltaEta "
250 << deltaPhi[2] << " / " << deltaEta[2]);
251 ATH_MSG_DEBUG("Rescaled matched Failed deltaPhi/deltaEta "
252 << deltaPhiRes[2] << " / " << deltaEtaRes[2]);
253 return false;
254 }
255
256 // Always the deltaPhiLast will be from the last measurement
259 std::array<double, 4> eta1 = { -999.0, -999.0, -999.0, -999.0 };
260 std::array<double, 4> phi1 = { -999.0, -999.0, -999.0, -999.0 };
261 std::array<double, 4> deltaEta1 = { -999.0, -999.0, -999.0, -999.0 };
262 std::array<double, 4> deltaPhi1 = { -999.0, -999.0, -999.0, -999.0 };
263
265 ->getMatchAtCalo(ctx,
266 cluster,
267 trkPB,
268 layersAndSurfaces.first,
269 layersAndSurfaces.second,
270 eta1,
271 phi1,
272 deltaEta1,
273 deltaPhi1,
274 extrapFrom1)
275 .isFailure()) {
276 ATH_MSG_DEBUG("Extrapolation from last measurement failed");
277 return false;
278 }
279 double deltaPhiLast = deltaPhi1[2];
280 ATH_MSG_DEBUG("Rescale dPhi " << deltaPhiRescale);
281 ATH_MSG_DEBUG("dPhi Last measurement " << deltaPhiLast);
282 /*
283 * Done with extrapolation
284 * Lets do the matching logic
285 */
286 TrackMatch trkmatch{};
287 // Add the matching variable to the TrackMAtch
288 trkmatch.deltaEta = deltaEta;
289 trkmatch.deltaPhi = deltaPhi;
290 trkmatch.deltaPhiRescaled = deltaPhiRes;
291 trkmatch.deltaPhiLast = deltaPhiLast;
292
293 // Variables used for the sorting. Note both dPhi's will be used.
294 trkmatch.trackNumber = trackNumber;
295 if (m_useRescaleMetric) {
296 trkmatch.dR = sqrt(std::pow(m_deltaEtaWeight * deltaEta[2], 2) +
297 std::pow(m_deltaPhiRescaleWeight * deltaPhiRescale, 2));
298 trkmatch.seconddR = sqrt(std::pow(m_deltaEtaWeight * deltaEta[2], 2) +
299 std::pow(m_deltaPhiWeight * deltaPhi[2], 2));
300 } else {
301 trkmatch.dR = sqrt(std::pow(m_deltaEtaWeight * deltaEta[2], 2) +
302 std::pow(m_deltaPhiWeight * deltaPhi[2], 2));
303 trkmatch.seconddR =
304 sqrt(std::pow(m_deltaEtaWeight * deltaEta[2], 2) +
305 std::pow(m_deltaPhiRescaleWeight * deltaPhiRescale, 2));
306 }
307 ATH_MSG_DEBUG(" DR " << trkmatch.dR << " deltaPhi " << deltaPhi[2]
308 << " deltaEta " << deltaEta[2]);
309 /*
310 * The first thing is
311 * Prefer pixel over SCT only
312 */
313 // Check number of pixel hits
314 int nPixel = summaryValueInt(trkPB, xAOD::numberOfPixelDeadSensors, 0);
315 nPixel += summaryValueInt(trkPB, xAOD::numberOfPixelHits, 0);
316 trkmatch.hasPix = (nPixel > 0);
317
318 /*
319 * Seconday hitsScore score based on hits to be used
320 * for track that are very close
321 * to each other at the calo i.e similar dR with cluster,
322 * pick the longest possible one
323 */
324 trkmatch.hitsScore = 0;
325 if (m_useScoring) {
326 // Check the 2 innermost layers
327 int nInnerMost = summaryValueInt(trkPB, xAOD::numberOfInnermostPixelLayerHits, 0);
328 int expectInnermostPixelLayerHit = summaryValueInt(trkPB, xAOD::expectInnermostPixelLayerHit, 0);
329 int nNextToInnerMost = summaryValueInt(trkPB, xAOD::numberOfNextToInnermostPixelLayerHits, 0);
330 int expectNextToInnermostPixelLayerHit = summaryValueInt(trkPB, xAOD::expectNextToInnermostPixelLayerHit, 0);
331
332 // Secondary score , find the longest track possible,
333 // i.e the one with the most inner hists in the pixel
334 // npixel*5
335 trkmatch.hitsScore += (nPixel * 5);
336 // Extra points for NextToInnermost
337 if (!expectNextToInnermostPixelLayerHit || nNextToInnerMost > 0) {
338 trkmatch.hitsScore += 5;
339 }
340 // Extra points for Innermost
341 if (!expectInnermostPixelLayerHit || nInnerMost > 0) {
342 trkmatch.hitsScore += 10;
343 }
344 }
345 ATH_MSG_DEBUG("hasPix : " << trkmatch.hasPix
346 << " hitsScore : " << trkmatch.hitsScore);
347
348 trackMatches.push_back(trkmatch);
349 return true;
350}
351
352bool
354 const xAOD::TrackParticle* track,
355 bool flip) const
356{
357 // loose cluster-track matching
358 if (!m_useCandidateMatch) {
359 return true;
360 }
361
362 // Tracking
363 const Trk::Perigee& candidatePerigee = track->perigeeParameters();
364 // Decide whether to try the opposite direction (cosmics)
365 const double trkPhi = (!flip) ? candidatePerigee.parameters()[Trk::phi]
366 : -candidatePerigee.parameters()[Trk::phi];
367 const double trkEta =
368 (!flip) ? candidatePerigee.eta() : -candidatePerigee.eta();
369 const double z_perigee = candidatePerigee.position().z();
370 const double r_perigee = candidatePerigee.position().perp();
371 const Amg::Vector3D PerigeeXYZPosition(candidatePerigee.position().x(),
372 candidatePerigee.position().y(),
373 z_perigee);
374 // Cluster variables
375 const double clusterEta = cluster->eta();
376 const bool isEndCap = !xAOD::EgammaHelpers::isBarrel(cluster);
377 const double Et = cluster->e() / cosh(trkEta);
378 const double clusterPhi = cluster->phi();
379
380 // Avoid clusters with |eta| > 10 or Et less than 10 MeV
381 if (std::abs(clusterEta) > 10.0 || Et < 10) {
382 return false;
383 }
384 // Calculate the eta/phi of the cluster as would be seen from the perigee
385 // position of the Track
386 const Amg::Vector3D XYZClusterWrtTrackPerigee =
388 *cluster, PerigeeXYZPosition, isEndCap);
389
390 const double clusterEtaCorrected = XYZClusterWrtTrackPerigee.eta();
391 // check eta match . Both metrics need to fail in order to disgard the track
392 if ((std::abs(clusterEta - trkEta) > 2. * m_broadDeltaEta) &&
393 (std::abs(clusterEtaCorrected - trkEta) > 2. * m_broadDeltaEta)) {
394 ATH_MSG_DEBUG(" Fails broad window eta match (track eta, cluster eta, "
395 "cluster eta corrected): ( "
396 << trkEta << ", " << clusterEta << ", " << clusterEtaCorrected
397 << ")");
398 return false;
399 }
400 // Calculate the possible rotation of the track
401 // Once assuming the cluster Et being the better estimate (e.g big brem)
402 const double phiRotRescaled = CandidateMatchHelpers::PhiROT(
403 Et, trkEta, track->charge(), r_perigee, isEndCap);
404 // And also assuming the track Pt being correct
405 const double phiRotTrack = CandidateMatchHelpers::PhiROT(
406 track->pt(), trkEta, track->charge(), r_perigee, isEndCap);
407 //
408 const double clusterPhiCorrected = XYZClusterWrtTrackPerigee.phi();
409 // deltaPhi between the track and the cluster
410 const double deltaPhiStd = P4Helpers::deltaPhi(clusterPhiCorrected, trkPhi);
411 // deltaPhi between the track and the cluster accounting for rotation assuming
412 // cluster Et is a better estimator
413 const double trkPhiRescaled = P4Helpers::deltaPhi(trkPhi, phiRotRescaled);
414 const double deltaPhiRescaled =
415 P4Helpers::deltaPhi(clusterPhiCorrected, trkPhiRescaled);
416 // deltaPhi between the track and the cluster accounting for rotation
417 const double trkPhiCorrTrack = P4Helpers::deltaPhi(trkPhi, phiRotTrack);
418 const double deltaPhiTrack =
419 P4Helpers::deltaPhi(clusterPhiCorrected, trkPhiCorrTrack);
420
421 // It has to fail all phi metrics in order to be disgarded
422 if ((std::abs(deltaPhiRescaled) > 2. * m_broadDeltaPhi) &&
423 (std::abs(deltaPhiTrack) > 2. * m_broadDeltaPhi) &&
424 (std::abs(deltaPhiStd) > 2. * m_broadDeltaPhi)) {
425
427 "FAILS broad window phi match (track phi, phirotCluster , phiRotTrack , "
428 << "cluster phi corrected, cluster phi): ( " << trkPhi << ", "
429 << phiRotRescaled << ", " << phiRotTrack << ", " << clusterPhiCorrected
430 << ", " << clusterPhi << ")");
431
432 return false;
433 }
434 // if not false returned we end up here
435 return true;
436}
437
438bool
441 const EMTrackMatchBuilder::TrackMatch& match2) const
442{
443 if (match1.hasPix != match2.hasPix) { // prefer pixels first
444 return match1.hasPix;
445 }
446 // sqrt(0.025**2)*sqrt(2)/sqrt(12) ~ 0.01
447 if (std::abs(match1.dR - match2.dR) < m_distance) {
448
449 if (std::abs(match1.seconddR - match2.seconddR) >
450 m_distance) { // Can the second distance separate them?
451 return match1.seconddR < match2.seconddR;
452 }
453 if ((match1.hitsScore != match2.hitsScore)) { // use the one with more pixel
454 return match1.hitsScore > match2.hitsScore;
455 }
456 }
457 // closest DR
458 return match1.dR < match2.dR;
459}
int summaryValueInt(const xAOD::TrackParticle &tp, const xAOD::SummaryType &info, int deflt=-999)
return the summary value for a TrackParticle or default value (-999) (to be used mostly in python whe...
Scalar eta() const
pseudorapidity method
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Hold a pointer to the current event store.
Handle class for reading from StoreGate.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
This class provides the client interface for accessing the detector description information common to...
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
function object to sort track matches based on quality
bool operator()(const TrackMatch &match1, const TrackMatch &match2) const
EMTrackMatchBuilder(const std::string &type, const std::string &name, const IInterface *parent)
Default constructor.
Gaudi::Property< bool > m_useScoring
Boolean to apply heuristic when tracks have close deltaR.
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloDetDescrMgrKey
StatusCode initialize() override final
Gaudi algorithm hooks.
Gaudi::Property< double > m_narrowDeltaPhi
narrow cut on deltaPhiRescale
virtual StatusCode executeRec(const EventContext &ctx, EgammaRecContainer *egammas) const override final
execute method
Gaudi::Property< float > m_distanceForScore
The distance from which one goes from using better deltaR to using score.
ToolHandle< IEMExtrapolationTools > m_extrapolationTool
Gaudi::Property< double > m_MaxDeltaPhiRescale
@Maximum deltaPhi (Res) allowed for a match
bool isCandidateMatch(const xAOD::CaloCluster *cluster, const xAOD::TrackParticle *track, bool flip) const
Loose track-cluster matching.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_TrackParticlesKey
name of TrackParticle container in TDS
Gaudi::Property< double > m_narrowDeltaPhiRescale
narrow cut on deltaPhiRescale
Gaudi::Property< bool > m_useCandidateMatch
flag to turn on/off use of isCandidateMatch
bool inBroadWindow(const EventContext &ctx, std::vector< TrackMatch > &trackMatches, const xAOD::CaloCluster &cluster, int trackNumber, const xAOD::TrackParticle &trkPB, const CaloDetDescrManager &caloDD) const
Compute for tracks passing the loose matching the distance between track extrapolated to 2nd sampling...
Gaudi::Property< double > m_narrowDeltaPhiRescaleBrem
narrow cut on deltaPhiRescale for electrons
Gaudi::Property< float > m_deltaPhiRescaleResolution
Gaudi::Property< float > m_deltaPhiResolution
Gaudi::Property< bool > m_useRescaleMetric
Boolean to use Rescale in the metric.
StatusCode trackExecute(const EventContext &ctx, egammaRec *eg, const xAOD::TrackParticleContainer *trackPC, const CaloDetDescrManager &caloDD) const
execute method
Gaudi::Property< double > m_narrowDeltaEta
narrow cut on deltaEta
Gaudi::Property< bool > m_SecondPassRescale
Boolean to do second pass with Rescale.
Gaudi::Property< double > m_broadDeltaEta
broad cut on deltaEta
Gaudi::Property< double > m_broadDeltaPhi
broad cut on deltaPhi
Gaudi::Property< float > m_deltaEtaResolution
The resolutions: might be good to split in barrel/end-cap in the future.
Gaudi::Property< double > m_narrowDeltaPhiBrem
narrow cut on deltaPhi for electrons
TrackMatchSorter m_sorter
TrkExtrapDef
Enum for track extrapolation to calo.
@ fromPerigee
from the perigee of TrackParticle
@ fromLastMeasurement
from the last measurement of TrackParticle
@ fromPerigeeRescaled
from the perigee of TrackParticle recaled by Ecluster
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
double eta() const
Access method for pseudorapidity - from momentum.
const Amg::Vector3D & position() const
Access method for the position.
Represent an egamma object for internal egamma usage during reconstruction.
Definition egammaRec.h:31
void setDeltaEta(const std::array< double, 4 > &deltaEtas)
set deltaEta at pre sampler(0) -> 3rd sampling(3)
void setDeltaPhiLast(double value)
set deltaPhi at sampling 2 from Last track Measurement
void setDeltaPhiRescaled(std::array< double, 4 > &deltaPhis)
set deltaPhi at sampling for rescaled momentum extrapolation from the perigee.
void setTrackParticles(const std::vector< ElementLink< xAOD::TrackParticleContainer > > &links)
Set the ElementLinks to the xAOD::TrackParticle/s that match the electron candidate.
void setDeltaPhi(const std::array< double, 4 > &deltaPhis)
set Phi of track extrapolated at pre sampler(0) -> 3rd sampling(3)
const xAOD::CaloCluster * caloCluster(size_t index=0) const
Pointer to the xAOD::CaloCluster/s that define the electron candidate.
Definition egammaRec.cxx:8
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double e() const
The total energy of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
DataVector< egammaRec > EgammaRecContainer
The container is a simple typedef for now.
Eigen::Matrix< double, 3, 1 > Vector3D
double PhiROT(const double pt, const double eta, const int charge, const double r_start, const bool isEndCap)
Function to calculate the approximate rotation in phi/bending of a track until it reaches the calo.
Amg::Vector3D approxXYZwrtPoint(const xAOD::CaloCluster &cluster, const Amg::Vector3D &point, const bool isEndCap)
Function to get the (x,y,z) of the cluster wrt to a point (x0,y0,z0).
This module defines the arguments passed from the BATCH driver to the BATCH worker.
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition P4Helpers.h:34
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi
Definition ParamDefs.h:75
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
bool isBarrel(const xAOD::Egamma *eg)
return true if the cluster is in the barrel
int summaryValueInt(const xAOD::TrackParticle &tp, const xAOD::SummaryType &info, int deflt=-999)
return the summary value for a TrackParticle or default value (-999) (to be used mostly in python whe...
std::size_t numberOfSiHits(const xAOD::TrackParticle *tp)
return the number of Si hits in the track particle
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
@ expectNextToInnermostPixelLayerHit
Do we expect a 1st-layer barrel hit for this track?
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
A structure for keeping track match information.
std::array< double, 4 > deltaPhiRescaled