ATLAS Offline Software
Loading...
Searching...
No Matches
MergedElectronDetailsDecorator.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
11
16
17#include "GaudiKernel/EventContext.h"
18
19#include <vector>
20
21namespace DerivationFramework {
22
24
25 ATH_MSG_INFO("Initialize " );
26
27 if (m_emExtrapolationTool.retrieve().isFailure()) {
28 ATH_MSG_FATAL("Failed to retrieve tool: " << m_emExtrapolationTool);
29 return StatusCode::FAILURE;
30 }
31 ATH_MSG_INFO("Retrieved tool: " << m_emExtrapolationTool);
32
33 if (m_VertexFitter.retrieve().isFailure()) {
34 ATH_MSG_FATAL("Failed to retrieve tool: " << m_VertexFitter);
35 return StatusCode::FAILURE;
36 }
37 ATH_MSG_INFO("Retrieved tool: " << m_VertexFitter);
38
39 if (m_V0Tools.retrieve().isFailure()) {
40 ATH_MSG_FATAL("Failed to retrieve tool: " << m_V0Tools);
41 return StatusCode::FAILURE;
42 }
43 ATH_MSG_INFO("Retrieved tool: " << m_V0Tools);
44
45 ATH_CHECK(m_eventInfoKey.initialize());
46
47 ATH_CHECK(m_electronKey.initialize());
48 ATH_CHECK(m_caloMgrKey.initialize());
49 return StatusCode::SUCCESS;
50 }
51
52
53 StatusCode MergedElectronDetailsDecorator::addBranches(const EventContext& ctx) const{
54
55
56 // Retrieve the xAOD event info
58
60
61 bool isMC = false;
62 if( eventInfo->eventType(xAOD::EventInfo::IS_SIMULATION) )
63 isMC = true;
64
65
66 for( const auto *const el : *electrons ){
67 fillTrackDetails(ctx, el,isMC);
68 fillVertexDetails(ctx, el);
70 }
71
72 return StatusCode::SUCCESS;
73
74 } // addBranches
75
77 std::vector<float>& trkMatchTrk,
78 const xAOD::TrackParticle* tp,
79 const xAOD::CaloCluster* cluster) const{
80
81 trkMatchTrk.clear();
83
84 if( !truthPart || !truthPart->hasProdVtx() )
85 return;
86
87 const auto *prodVtx = truthPart->prodVtx();
88
89 Amg::Vector3D pos( prodVtx->x(), prodVtx->y(), prodVtx->z() );
90 Amg::Vector3D mom( truthPart->px(), truthPart->py(), truthPart->pz() );
91
92 Trk::CurvilinearParameters truthTP( pos, mom, truthPart->charge() );
93
94 float etaAtCalo, phiAtCalo;
95 if( m_emExtrapolationTool->getEtaPhiAtCalo ( ctx,
96 &truthTP,
97 &etaAtCalo,
98 &phiAtCalo) ){
99 trkMatchTrk.push_back( cluster->etaBE(2) - etaAtCalo );
100 trkMatchTrk.push_back( P4Helpers::deltaPhi(cluster->phiBE(2), phiAtCalo) );
101 }
102
103 return;
104
105 }
106
108 std::vector<float>& trkMatchTrk,
109 const xAOD::TrackParticle* tp,
110 const xAOD::CaloCluster* cluster) const {
111
113 const CaloDetDescrManager* caloDDMgr = *caloMgrHandle;
114
115 //Reset values
116 for(unsigned int i(0); i<trkMatchTrk.size(); ++i ){
117 trkMatchTrk[i] = -999;
118 }
119
120 std::array<double,4> eta = { -999.0, -999.0, -999.0, -999.0 };
121 std::array<double,4> phi = { -999.0, -999.0, -999.0, -999.0 };
122 std::array<double,4> deltaEta = { -999.0, -999.0, -999.0, -999.0 };
123 std::array<double,4> deltaPhi = { -999.0, -999.0, -999.0, -999.0 };
124
125 std::pair<std::vector<CaloSampling::CaloSample>,
126 std::vector<std::unique_ptr<Trk::Surface>>>
127 layersAndSurfaces =
128 m_emExtrapolationTool->getClusterLayerSurfaces(*cluster, *caloDDMgr);
129
131 ->getMatchAtCalo(ctx,
132 *cluster,
133 *tp,
134 layersAndSurfaces.first,
135 layersAndSurfaces.second,
136 eta,
137 phi,
138 deltaEta,
139 deltaPhi,
141 .isSuccess()) // Perigee
142 {
143 trkMatchTrk[0] = deltaEta[1];
144 trkMatchTrk[1] = deltaEta[2];
145 trkMatchTrk[2] = deltaPhi[1];
146 trkMatchTrk[3] = deltaPhi[2];
147 }
148
150 ->getMatchAtCalo(ctx,
151 *cluster,
152 *tp,
153 layersAndSurfaces.first,
154 layersAndSurfaces.second,
155 eta,
156 phi,
157 deltaEta,
158 deltaPhi,
160 .isSuccess()) // Last Measurement
161 {
162 trkMatchTrk[4] = deltaEta[1];
163 trkMatchTrk[5] = deltaEta[2];
164 trkMatchTrk[6] = deltaPhi[1];
165 trkMatchTrk[7] = deltaPhi[2];
166 }
167
168 if(m_emExtrapolationTool->getMatchAtCalo ( ctx,
169 *cluster,
170 *tp,
171 layersAndSurfaces.first,
172 layersAndSurfaces.second,
173 eta,
174 phi,
175 deltaEta,
176 deltaPhi,
177 IEMExtrapolationTools::fromPerigeeRescaled).isSuccess()) //Last Measurement
178 {
179 trkMatchTrk[8] = deltaPhi[2];
180 }
181 }
182
183
185 {
186 uint8_t dummy(-1);
187 int nPix = tp->summaryValue( dummy, xAOD::numberOfPixelHits )? dummy : 0;
188 int nPix_DS = tp->summaryValue( dummy, xAOD::numberOfPixelDeadSensors )? dummy : 0;
189 int nSCT = tp->summaryValue( dummy, xAOD::numberOfSCTHits )? dummy : 0;
190 int nSCT_DS = tp->summaryValue( dummy, xAOD::numberOfSCTDeadSensors )? dummy : 0;
191 return nPix + nPix_DS + nSCT + nSCT_DS;
192 }
193
194
195 void DerivationFramework::MergedElectronDetailsDecorator::fillTrackDetails(const EventContext& ctx, const xAOD::Electron* el,bool isMC) const
196 {
197 std::vector<float> trkMatchTrkP_dEta1(el->nTrackParticles(),-999);
198 std::vector<float> trkMatchTrkP_dEta2(el->nTrackParticles(),-999);
199 std::vector<float> trkMatchTrkP_dPhi1(el->nTrackParticles(),-999);
200 std::vector<float> trkMatchTrkP_dPhi2(el->nTrackParticles(),-999);
201 std::vector<float> trkMatchTrkLM_dEta1(el->nTrackParticles(),-999);
202 std::vector<float> trkMatchTrkLM_dEta2(el->nTrackParticles(),-999);
203 std::vector<float> trkMatchTrkLM_dPhi1(el->nTrackParticles(),-999);
204 std::vector<float> trkMatchTrkLM_dPhi2(el->nTrackParticles(),-999);
205 std::vector<float> trkMatchTrkR_dPhi2(el->nTrackParticles(),-999);
206
207 std::vector<float> trueMatch_dEta2(el->nTrackParticles(),-999);
208 std::vector<float> trueMatch_dPhi2(el->nTrackParticles(),-999);
209
210 const auto *caloCluster = el->caloCluster();
211 if( caloCluster && caloCluster->pt() > m_minET ){
212 std::vector<float> trkMatch(9,-999);
213 for( unsigned int i(0); i < el->nTrackParticles(); ++i ){
214 const auto *trackParticle = el->trackParticle( i );
215 if(trackParticle){
216 fillMatchDetails( ctx, trkMatch, trackParticle, caloCluster);
217 trkMatchTrkP_dEta1[i] = trkMatch[0];
218 trkMatchTrkP_dEta2[i] = trkMatch[1];
219 trkMatchTrkP_dPhi1[i] = trkMatch[2];
220 trkMatchTrkP_dPhi2[i] = trkMatch[3];
221 trkMatchTrkLM_dEta1[i] = trkMatch[4];
222 trkMatchTrkLM_dEta2[i] = trkMatch[5];
223 trkMatchTrkLM_dPhi1[i] = trkMatch[6];
224 trkMatchTrkLM_dPhi2[i] = trkMatch[7];
225 trkMatchTrkR_dPhi2[i] = trkMatch[8];
226
227 if(isMC){
228 fillTruthDetails( ctx, trkMatch, trackParticle, caloCluster );
229 if( trkMatch.size() == 2 ){
230 trueMatch_dEta2[i] = trkMatch[0];
231 trueMatch_dPhi2[i] = trkMatch[1];
232 }
233 }
234 }
235 }
236 }
237
238 static const SG::Decorator<std::vector<float> > TrackMatchingP_dEta1Dec("TrackMatchingP_dEta1");
239 static const SG::Decorator<std::vector<float> > TrackMatchingP_dEta2Dec("TrackMatchingP_dEta2");
240 static const SG::Decorator<std::vector<float> > TrackMatchingP_dPhi1Dec("TrackMatchingP_dPhi1");
241 static const SG::Decorator<std::vector<float> > TrackMatchingP_dPhi2Dec("TrackMatchingP_dPhi2");
242 static const SG::Decorator<std::vector<float> > TrackMatchingLM_dEta1Dec("TrackMatchingLM_dEta1");
243 static const SG::Decorator<std::vector<float> > TrackMatchingLM_dEta2Dec("TrackMatchingLM_dEta2");
244 static const SG::Decorator<std::vector<float> > TrackMatchingLM_dPhi1Dec("TrackMatchingLM_dPhi1");
245 static const SG::Decorator<std::vector<float> > TrackMatchingLM_dPhi2Dec("TrackMatchingLM_dPhi2");
246 static const SG::Decorator<std::vector<float> > TrackMatchingR_dPhi2Dec("TrackMatchingR_dPhi2");
247 static const SG::Decorator<std::vector<float> > TrackMatchingTrue_dEta2Dec("TrackMatchingTrue_dEta2");
248 static const SG::Decorator<std::vector<float> > TrackMatchingTrue_dPhi2Dec("TrackMatchingTrue_dPhi2");
249 TrackMatchingP_dEta1Dec(*el) = trkMatchTrkP_dEta1;
250 TrackMatchingP_dEta2Dec(*el) = trkMatchTrkP_dEta2;
251 TrackMatchingP_dPhi1Dec(*el) = trkMatchTrkP_dPhi1;
252 TrackMatchingP_dPhi2Dec(*el) = trkMatchTrkP_dPhi2;
253 TrackMatchingLM_dEta1Dec(*el) = trkMatchTrkLM_dEta1;
254 TrackMatchingLM_dEta2Dec(*el) = trkMatchTrkLM_dEta2;
255 TrackMatchingLM_dPhi1Dec(*el) = trkMatchTrkLM_dPhi1;
256 TrackMatchingLM_dPhi2Dec(*el) = trkMatchTrkLM_dPhi2;
257 TrackMatchingR_dPhi2Dec(*el) = trkMatchTrkR_dPhi2;
258 TrackMatchingTrue_dEta2Dec(*el) = trueMatch_dEta2;
259 TrackMatchingTrue_dPhi2Dec(*el) = trueMatch_dPhi2;
260 }
261
263 {
264 const auto *caloCluster = el->caloCluster();
265
266 std::vector<float> subCluster_E;
267 std::vector<float> subCluster_dEta;
268 std::vector<float> subCluster_dPhi;
269
270 static const SG::Accessor<std::vector<ElementLink<xAOD::CaloClusterContainer> > > clusterLinksAcc("constituentClusterLinks");
271 if(caloCluster && clusterLinksAcc.isAvailable(*caloCluster) ){
272 std::vector<ElementLink<xAOD::CaloClusterContainer> > clusterLinks = clusterLinksAcc(*caloCluster);
273 for( const auto& link : clusterLinks){
274 if( link.isValid() ){
275 subCluster_E.push_back( (*link)->e() );
276 subCluster_dEta.push_back( caloCluster->eta() - (*link)->eta() );
277 float dphi = P4Helpers::deltaPhi( caloCluster->phi(), (*link)->phi() );
278 subCluster_dPhi.push_back(dphi);
279 }
280 }
281 }
282 static const SG::Decorator<std::vector<float> > SubCluster_EDec("SubCluster_E");
283 static const SG::Decorator<std::vector<float> > SubCluster_dEtaDec("SubCluster_dEta");
284 static const SG::Decorator<std::vector<float> > SubCluster_dPhiDec("SubCluster_dPhi");
285 SubCluster_EDec(*el) = subCluster_E;
286 SubCluster_dEtaDec(*el) = subCluster_dEta;
287 SubCluster_dPhiDec(*el) = subCluster_dPhi;
288 }
289
290
292 {
293 const auto *caloCluster = el->caloCluster();
294
295 float vtxR = -999;
296 float vtxZ = -999;
297 float vtxM = -999;
298 float vtxP = -999;
299 int vtxTrkParticleIndex1 = -999;
300 int vtxTrkParticleIndex2 = -999;
301 float vtxTrkParticle1_dEta2 = -999;
302 float vtxTrkParticle1_dPhi2 = -999;
303 float vtxTrkParticle2_dEta2 = -999;
304 float vtxTrkParticle2_dPhi2 = -999;
305 float vtxRerr = -999;
306 float vtxZerr = -999;
307 float vtxMerr = -999;
308 float vtxPerr = -999;
309 float vtxChi2 = -999;
310 int vtxNdof = -999;
311 float vtxdEta = -999;
312 float vtxdPhi = -999;
313 float vtxE = -999;
314 float vtxPhi = -999;
315 float vtxEta = -999;
316
317 if( caloCluster && caloCluster->pt() > m_minET ){
318 const xAOD::TrackParticle* trk1 = nullptr;
319 const xAOD::TrackParticle* trk2 = nullptr;
320 int trkIndex1 = -999;
321 int trkIndex2 = -999;
322 for( unsigned int i(0); i < el->nTrackParticles(); ++i ){
323 const auto *trackParticle = el->trackParticle( i );
324 if( nSiHits(trackParticle) >= 7 && ElectronSelectorHelpers::passBLayerRequirement(*trackParticle) ) {
325 if ( trk1 == nullptr ){
326 trk1 = trackParticle;
327 trkIndex1 = i;
328 } else if( trk2 == nullptr ){
329 if( trk1->charge() == trackParticle->charge() )
330 continue;
331 trk2 = trackParticle;
332 trkIndex2 = i;
333 break;
334 }
335 }
336 }
337 if( trk2 != nullptr){
338 // fit vertex
339
340 // Take the initial guess as the first tracks global position
342 Amg::Vector3D startingPoint = perigeeParameters.position();
343
344 std::vector<const xAOD::TrackParticle*> trksToFit;
345 trksToFit.push_back( trk1 );
346 trksToFit.push_back( trk2 );
347 vtxTrkParticleIndex1 = trkIndex1;
348 vtxTrkParticleIndex2 = trkIndex2;
349
350 std::unique_ptr<xAOD::Vertex> myVertex( m_VertexFitter->fit( ctx, trksToFit, startingPoint ) );
351
352 if(myVertex){
353
354 vtxR = m_V0Tools->rxy( myVertex.get() );
355 vtxRerr = m_V0Tools->rxyError( myVertex.get() );
356 vtxZ = myVertex->z();
357 vtxZerr = myVertex->covariancePosition()(2,2) > 0 ? sqrt( myVertex->covariancePosition()(2,2) ): myVertex->covariancePosition()(2,2);
358
359 std::vector<double> masses = { 0.511e-3, 0.511e-3 };
360 vtxM = m_V0Tools->invariantMass( myVertex.get(), masses);
361 vtxMerr = m_V0Tools->invariantMassError( myVertex.get(), masses);
362
363 vtxP = m_V0Tools->pT( myVertex.get() );
364 vtxPerr = m_V0Tools->pTError( myVertex.get() );
365
366 vtxChi2 = myVertex->chiSquared();
367 vtxNdof = myVertex->numberDoF();
368
369 m_emExtrapolationTool->getEtaPhiAtCalo( ctx, myVertex.get(), &vtxdEta, &vtxdPhi);
370
371 vtxdPhi = P4Helpers::deltaPhi( vtxdPhi, caloCluster->phiBE(2) );
372 vtxdEta -= caloCluster->etaBE(2);
373
375 vtxE = vertex4P.E();
376 vtxPhi = vertex4P.Phi();
377 vtxEta = vertex4P.Eta();
378 double momentumScaleFactor = caloCluster->e() / vtxE;
379
380 const auto& perigeeParameters = trk1->perigeeParameters();
381 Amg::Vector3D pos = perigeeParameters.position();
382 Amg::Vector3D mom = perigeeParameters.momentum();
383 mom *= momentumScaleFactor;
384 Trk::CurvilinearParameters scaledTrk( pos, mom, trk1->charge() );
385
386 float etaAtCalo, phiAtCalo;
387 if( m_emExtrapolationTool->getEtaPhiAtCalo (ctx,
388 &scaledTrk,
389 &etaAtCalo,
390 &phiAtCalo) ){
391 vtxTrkParticle1_dEta2 = caloCluster->etaBE(2) - etaAtCalo;
392 vtxTrkParticle1_dPhi2 = P4Helpers::deltaPhi(caloCluster->phiBE(2), phiAtCalo) ;
393 }
394
395 const auto& perigeeParameters2 = trk2->perigeeParameters();
396 pos = perigeeParameters2.position();
397 mom = perigeeParameters2.momentum();
398 mom *= momentumScaleFactor;
399 scaledTrk = Trk::CurvilinearParameters( pos, mom, trk2->charge() );
400
401 if( m_emExtrapolationTool->getEtaPhiAtCalo (ctx,
402 &scaledTrk,
403 &etaAtCalo,
404 &phiAtCalo) ){
405 vtxTrkParticle2_dEta2 = caloCluster->etaBE(2) - etaAtCalo;
406 vtxTrkParticle2_dPhi2 = P4Helpers::deltaPhi(caloCluster->phiBE(2), phiAtCalo) ;
407 }
408
409 } else {
410 vtxChi2 = 0;
411 vtxNdof = 0;
412 }
413 }
414 }
415
416 static const SG::Decorator<float> vtxRDec("vtxR");
417 static const SG::Decorator<float> vtxRerrDec("vtxRerr");
418 static const SG::Decorator<float> vtxZDec("vtxZ");
419 static const SG::Decorator<float> vtxZerrDec("vtxZerr");
420 static const SG::Decorator<float> vtxMDec("vtxM");
421 static const SG::Decorator<float> vtxMerrDec("vtxMerr");
422 static const SG::Decorator<float> vtxPtDec("vtxPt");
423 static const SG::Decorator<float> vtxPterrDec("vtxPterr");
424 static const SG::Decorator<float> vtxEDec("vtxE");
425 static const SG::Decorator<float> vtxEtaDec("vtxEta");
426 static const SG::Decorator<float> vtxPhiDec("vtxPhi");
427 static const SG::Decorator<int> vtxTrkParticleIndex1Dec("vtxTrkParticleIndex1");
428 static const SG::Decorator<int> vtxTrkParticleIndex2Dec("vtxTrkParticleIndex2");
429 static const SG::Decorator<float> vtxTrkParticle1_dPhi2Dec("vtxTrkParticle1_dPhi2");
430 static const SG::Decorator<float> vtxTrkParticle1_dEta2Dec("vtxTrkParticle1_dEta2");
431 static const SG::Decorator<float> vtxTrkParticle2_dPhi2Dec("vtxTrkParticle2_dPhi2");
432 static const SG::Decorator<float> vtxTrkParticle2_dEta2Dec("vtxTrkParticle2_dEta2");
433 static const SG::Decorator<float> vtxChi2Dec("vtxChi2");
434 static const SG::Decorator<int> vtxNdofDec("vtxNdof");
435 static const SG::Decorator<float> vtxdEtaDec("vtxdEta");
436 static const SG::Decorator<float> vtxdPhiDec("vtxdPhi");
437
438 vtxRDec(*el) = vtxR;
439 vtxRerrDec(*el) = vtxRerr;
440 vtxZDec(*el) = vtxZ;
441 vtxZerrDec(*el) = vtxZerr;
442 vtxMDec(*el) = vtxM;
443 vtxMerrDec(*el) = vtxMerr;
444 vtxPtDec(*el) = vtxP;
445 vtxPterrDec(*el)= vtxPerr;
446 vtxEDec(*el) = vtxE;
447 vtxEtaDec(*el) = vtxEta;
448 vtxPhiDec(*el) = vtxPhi;
449 vtxTrkParticleIndex1Dec(*el) = vtxTrkParticleIndex1;
450 vtxTrkParticleIndex2Dec(*el) = vtxTrkParticleIndex2;
451 vtxTrkParticle1_dPhi2Dec(*el) = vtxTrkParticle1_dPhi2;
452 vtxTrkParticle1_dEta2Dec(*el) = vtxTrkParticle1_dEta2;
453 vtxTrkParticle2_dPhi2Dec(*el) = vtxTrkParticle2_dPhi2;
454 vtxTrkParticle2_dEta2Dec(*el) = vtxTrkParticle2_dEta2;
455 vtxChi2Dec(*el) = vtxChi2;
456 vtxNdofDec(*el) = vtxNdof;
457 vtxdEtaDec(*el) = vtxdEta;
458 vtxdPhiDec(*el) = vtxdPhi;
459 }
460
461
462
463
464} // namespace
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_FATAL(x)
#define ATH_MSG_INFO(x)
Helper class to provide type-safe access to aux data.
This class provides the client interface for accessing the detector description information common to...
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
void fillTrackDetails(const EventContext &ctx, const xAOD::Electron *el, bool isMC) const
PublicToolHandle< IEMExtrapolationTools > m_emExtrapolationTool
void fillTruthDetails(const EventContext &ctx, std::vector< float > &trkMatchTrk, const xAOD::TrackParticle *tp, const xAOD::CaloCluster *cluster) const
virtual StatusCode addBranches(const EventContext &ctx) const override final
SG::ReadHandleKey< xAOD::ElectronContainer > m_electronKey
void fillMatchDetails(const EventContext &ctx, std::vector< float > &trkMatchTrk, const xAOD::TrackParticle *tp, const xAOD::CaloCluster *cluster) const
void fillVertexDetails(const EventContext &ctx, const xAOD::Electron *el) const
@ fromPerigee
from the perigee of TrackParticle
@ fromLastMeasurement
from the last measurement of TrackParticle
@ fromPerigeeRescaled
from the perigee of TrackParticle recaled by Ecluster
Helper class to provide type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
float phiBE(const unsigned layer) const
Get the phi in one layer of the EM Calo.
float etaBE(const unsigned layer) const
Get the eta in one layer of the EM Calo.
@ IS_SIMULATION
true: simulation, false: data
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
IParticle::FourMom_t FourMom_t
Definition of the 4-momentum type.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
float charge() const
Returns the charge.
bool hasProdVtx() const
Check for a production vertex on this particle.
float px() const
The x component of the particle's momentum.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
float py() const
The y component of the particle's momentum.
double charge() const
Physical charge.
float pz() const
The z component of the particle's momentum.
Eigen::Matrix< double, 3, 1 > Vector3D
THE reconstruction tool.
bool passBLayerRequirement(const xAOD::TrackParticle &tp)
return true if effective number of BL hits + outliers is at least one
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition P4Helpers.h:34
constexpr double electronMassInMeV
the mass of the electron (in MeV)
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
Definition AuxElement.h:576
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
CurvilinearParametersT< TrackParametersDim, Charged, PlaneSurface > CurvilinearParameters
const xAOD::TruthParticle * getTruthParticle(const xAOD::IParticle &p)
Return the truthParticle associated to the given IParticle (if any).
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.
@ numberOfSCTDeadSensors
number of dead SCT sensors crossed [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
Electron_v1 Electron
Definition of the current "egamma version".