ATLAS Offline Software
EGElectronAmbiguityTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // EGElectronAmbiguityTool.cxx, (c) ATLAS Detector software
8 //
9 //
10 
12 
15 
17 #include "xAODTruth/TruthVertex.h"
18 
20 
21 #include "TMath.h"
22 
23 namespace {
24 void
25 helix(const xAOD::TrackParticle* trkP,
26  const xAOD::Vertex* pvtx,
27  std::vector<double>& he)
28 {
29  constexpr double PTTOCURVATURE = -0.301;
30 
31  he[0] = 1. / tan(trkP->theta());
32  he[1] = PTTOCURVATURE * trkP->charge() / trkP->pt();
33 
34  if (trkP->phi0() > 0.)
35  he[4] = trkP->phi0();
36  else
37  he[4] = TMath::TwoPi() + trkP->phi0();
38 
39  double c1 = cos(trkP->phi0());
40  double s1 = sin(trkP->phi0());
41  he[3] = trkP->d0() + c1 * pvtx->y() - s1 * pvtx->x();
42 
43  c1 *= he[0];
44  s1 *= he[0];
45  he[2] = trkP->z0() - c1 * pvtx->x() - s1 * pvtx->y() + pvtx->z();
46 }
47 }//end anonymous
48 
49 
50 namespace DerivationFramework {
51 
53  const std::string& n,
54  const IInterface* p)
55  : AthAlgTool(t, n, p)
56 {
57  declareInterface<DerivationFramework::IAugmentationTool>(this);
58 
59  declareProperty("isMC", m_isMC);
60 
62  "pTCut", m_elepTCut = 9e3, "minimum pT for an electron to be studied");
63  declareProperty("idCut",
64  m_idCut = "DFCommonElectronsLHLoose",
65  "minimal quality for an electron to be studied");
66 
68  "nSiCut", m_nSiCut = 7, "minimum number of Si hits in the other track");
70  "dzsinTCut", m_dzCut = 0.5, "max dz sinTheta between ele and other tracks");
71  declareProperty("SeparationCut", m_sepCut = 1., "first separation cut");
72  declareProperty("DCTCut", m_dctCut = 0.02, "second separation cut");
73 
74  declareProperty("radiusCut",
75  m_rvECCut = 20,
76  "minimum radius to be classified as external conversion");
78  "meeAtVtxCut",
79  m_meeAtVtxECCut = 100,
80  "maximal mass at vertex to be classified as external conversion");
81  declareProperty("meeCut",
82  m_meeICCut = 100,
83  "maximal mass at primary vertex to be classified as gamma*");
84 }
85 
88 {
89 
91  ATH_CHECK(m_VtxContainerName.initialize());
94 
95  const std::string baseName = m_containerName.key();
96  m_drv = baseName + ".DFCommonSimpleConvRadius";
97  m_dphiv = baseName + ".DFCommonSimpleConvPhi";
98  m_dmee = baseName + ".DFCommonSimpleMee";
99  m_dmeeVtx = baseName + ".DFCommonSimpleMeeAtVtx";
100  m_dsep = baseName + ".DFCommonSimpleSeparation";
101  m_dambi = baseName + ".DFCommonAddAmbiguity";
102  m_dtrv = baseName + ".DFCommonProdTrueRadius";
103  m_dtpv = baseName + ".DFCommonProdTruePhi";
104  m_dtzv = baseName + ".DFCommonProdTrueZ";
105 
115 
116  return StatusCode::SUCCESS;
117 }
118 
120  (const EGElectronAmbiguityTool& tool, const EventContext& ctx)
121  : drv (tool.m_drv, ctx),
122  dphiv (tool.m_dphiv, ctx),
123  dmee (tool.m_dmee, ctx),
124  dmeeVtx (tool.m_dmeeVtx, ctx),
125  dsep (tool.m_dsep, ctx),
126  dambi (tool.m_dambi, ctx),
127  dtrv (tool.m_dtrv, ctx),
128  dtpv (tool.m_dtpv, ctx),
129  dtzv (tool.m_dtzv, ctx)
130 {
131 }
132 
135 {
136  const EventContext& ctx = Gaudi::Hive::currentContext();
137 
138  DecorHandles dh (*this, ctx);
139 
140  static const SG::AuxElement::ConstAccessor<char> aidCut(m_idCut);
141 
142  // retrieve primary vertex
143  const xAOD::Vertex* pvtx(nullptr);
145  if (inputVtx.ptr()){
146  const xAOD::VertexContainer* vtxC = inputVtx.ptr();
147  for (const auto* vertex : *vtxC) {
148  if (vertex->vertexType() == xAOD::VxType::VertexType::PriVtx) {
149  pvtx = vertex;
150  break;
151  }
152  }
153  }
154 
155  // retrieve electron container
157  ctx };
158  const xAOD::ElectronContainer* eleC = inputElectrons.ptr();
159 
160  if (!eleC) {
162  "Couldn't retrieve Electron container with key: " << m_containerName);
163  return StatusCode::FAILURE;
164  }
165  if (!pvtx) {
166  ATH_MSG_DEBUG("No primary vertex found. Setting default values.");
167  for (const xAOD::Electron* iele : *eleC) {
168  dh.drv(*iele) = -1;
169  dh.dphiv(*iele) = -1;
170  dh.dmee(*iele) = -1;
171  dh.dmeeVtx(*iele) = -1;
172  dh.dsep(*iele) = -1;
173  dh.dambi(*iele) = -1;
174  dh.dtrv(*iele) = -1;
175  dh.dtpv(*iele) = -1;
176  dh.dtzv(*iele) = -1;
177  }
178  return StatusCode::SUCCESS;
179  }
180  ATH_MSG_DEBUG("Pvx z = " << pvtx->z() << ", number of electrons "
181  << eleC->size());
182 
183  // Make a container of selected tracks : with Si hits, close to electron track
185  m_tpContainerName, ctx
186  };
187  const xAOD::TrackParticleContainer* idtpC = inputTrackParticles.ptr();
188 
189  std::set<const xAOD::TrackParticle*> alreadyStored;
190  std::set<const xAOD::TrackParticle*> eleIDtpStored, eleGSFtpStored;
191  auto closeByTracks =
192  std::make_unique<ConstDataVector<xAOD::TrackParticleContainer>>(
194 
195  for (const auto* ele : *eleC) {
196 
197  dh.dambi(*ele) = -1;
198 
199  // Electron preselection
200  if (ele->pt() < m_elepTCut ||
201  m_idCut.empty() || !aidCut.isAvailable(*ele) || !aidCut(*ele))
202  continue;
203 
204  // Just for debug
205  const xAOD::TrackParticle* eleGSFtp = ele->trackParticle();
206  eleGSFtpStored.insert(eleGSFtp);
207 
208  const xAOD::TrackParticle* eleIDtp =
210  eleIDtpStored.insert(eleIDtp);
211 
212  // The loop on track
213  for (const auto* tp : *idtpC) {
214 
215  // Keep the electron track (I build a container to run vertexing on it...)
216  if (tp == eleIDtp) {
217  closeByTracks->push_back(tp);
218  alreadyStored.insert(tp);
219  continue;
220  }
221 
222  // potential candidate to store if not already there
223  if (alreadyStored.find(tp) != alreadyStored.end())
224  continue;
225 
227  // if (tp->charge() * ele->charge() > 0)
228  // continue;
229 
230  // Close-by
231  double dR = eleIDtp->p4().DeltaR(tp->p4());
232  double dz = std::abs(eleIDtp->z0() - tp->z0()) * sin(eleIDtp->theta());
233  if (dR >= 0.3 || dz >= m_dzCut)
234  continue;
235 
236  // With minimum number of Si hits
238  continue;
239 
240  alreadyStored.insert(tp);
241 
242  closeByTracks->push_back(tp);
243  }
244  }
245 
246  if (closeByTracks->empty())
247  return StatusCode::SUCCESS;
248 
249  if (msgLvl(MSG::DEBUG)) {
251  ctx };
252  const xAOD::TrackParticleContainer* tpC = tpCReadHandle.ptr();
253 
254  ATH_MSG_DEBUG("Number of input tracks "
255  << idtpC->size() << " , number of selected close-by tracks "
256  << closeByTracks->size() << " , number of GSF tracks "
257  << tpC->size());
258  for (const auto* trk : eleIDtpStored)
259  ATH_MSG_DEBUG("ele ID trk "
260  << trk << " pt = " << trk->pt() * 1e-3
261  << " eta = " << trk->eta() << " phi = " << trk->phi()
262  << " nSi = " << xAOD::EgammaHelpers::numberOfSiHits(trk));
263  for (const auto* trk : eleGSFtpStored)
264  ATH_MSG_DEBUG("ele GSF trk "
265  << trk << " pt = " << trk->pt() * 1e-3
266  << " eta = " << trk->eta() << " phi = " << trk->phi()
267  << " nSi = " << xAOD::EgammaHelpers::numberOfSiHits(trk));
268  for (const xAOD::TrackParticle* trk : *closeByTracks)
269  ATH_MSG_DEBUG("closeby trk "
270  << trk << " pt = " << trk->pt() * 1e-3
271  << " eta = " << trk->eta() << " phi = " << trk->phi()
272  << " nSi = " << xAOD::EgammaHelpers::numberOfSiHits(trk));
273  }
274 
275  for (const auto* ele : *eleC) {
276 
277  // Electron preselection
278  if (ele->pt() < m_elepTCut ||
279  m_idCut.empty() || !aidCut.isAvailable(*ele) || !aidCut(*ele))
280  continue;
281 
282  // Henri's circles
283  if (decorateSimple(dh, closeByTracks, ele, pvtx).isFailure()) {
284  ATH_MSG_ERROR("Cannot decorate the electron with the simple info");
285  return StatusCode::FAILURE;
286  }
287 
288  } // loop on electrons to decorate
289 
290  return StatusCode::SUCCESS;
291 }
292 }
293 
296  DecorHandles& dh,
297  std::unique_ptr<ConstDataVector<xAOD::TrackParticleContainer>>& tpC,
298  const xAOD::Electron* ele,
299  const xAOD::Vertex* pvtx) const
300 {
301  // This is the GSF electron track
302  const xAOD::TrackParticle* eleGSFtrkP = ele->trackParticle();
303 
304  // And the ID one
305  const xAOD::TrackParticle* eleIDtrkP =
307 
308  // For the time being, use the ID one, to be consistent when we only find a
309  // good ID to make a conversion and no GSF
310  bool useGSF = false; // hardcoded because it seems we will not use true. Kept
311  // for the time being, as not 100% sure
312  const xAOD::TrackParticle* eletrkP = useGSF ? eleGSFtrkP : eleIDtrkP;
313 
314  ATH_MSG_DEBUG("Electron pt = " << ele->pt() * 1e-3 << " eta = " << ele->eta()
315  << " phi = " << ele->phi() << " GSF trk ptr = "
316  << eleGSFtrkP << " ID trk ptr " << eleIDtrkP);
317 
318  if (m_isMC) {
319  const xAOD::TruthParticle* truthEl =
321  double tpvr = -1, tpvp = 9e9, tpvz = 9e9;
322  if (truthEl && MC::isElectron(truthEl) &&
323  truthEl->prodVtx() != nullptr) {
324  tpvr = truthEl->prodVtx()->perp();
325  tpvp = truthEl->prodVtx()->phi();
326  tpvz = truthEl->prodVtx()->z();
327  }
328  dh.dtrv(*ele) = tpvr;
329  dh.dtpv(*ele) = tpvp;
330  dh.dtzv(*ele) = tpvz;
331  }
332 
333  // Find the closest track particle with opposite charge and a minimum nb of Si
334  // hits
335  const xAOD::TrackParticle* otrkP(nullptr);
336  double detaMin = 9e9;
337  for (const xAOD::TrackParticle* tp : *tpC) {
338  // Keep only opposite charge
339  if (tp->charge() * eletrkP->charge() > 0)
340  continue;
341 
342  // Close-by
343  double dR = eletrkP->p4().DeltaR(tp->p4());
344  double dz = std::abs(eletrkP->z0() - tp->z0()) * sin(eletrkP->theta());
345  if (dR >= 0.3 || dz >= m_dzCut)
346  continue;
347 
348  double deta = std::abs(eletrkP->eta() - tp->eta());
349  if (deta < detaMin) {
350  otrkP = tp;
351  detaMin = deta;
352  }
353  }
354 
355  double rv = -9e9;
356  double pv = -9e9;
357  double mee = -1.;
358  double meeAtVtx = -1.;
359  double sep = -9e9;
360  bool goodConv = false;
361 
362  if (otrkP) {
363 
364  // To be consistent with the other, use the ID track.
365  TLorentzVector ep4;
366  ep4.SetPtEtaPhiM(eletrkP->pt(), eletrkP->eta(), eletrkP->phi(), 0.511);
367 
368  // Maybe could see if a GSF tp exists for this ID tp and use it if yes ?
369  TLorentzVector op4;
370  op4.SetPtEtaPhiM(otrkP->pt(), otrkP->eta(), otrkP->phi(), 0.511);
371 
372  // Simple masses
373  mee = (ep4 + op4).M();
374  op4.SetPhi(eletrkP->phi());
375  meeAtVtx = (ep4 + op4).M();
376 
377  // And the conversion point
378  std::vector<double> helix1, helix2;
379  helix1.resize(5);
380  helix2.resize(5);
381  helix(eletrkP, pvtx, helix1);
382  helix(otrkP, pvtx, helix2);
383 
384  double beta(0.);
385  if (helix1[4] < helix2[4])
386  beta = TMath::PiOver2() - helix1[4];
387  else
388  beta = TMath::PiOver2() - helix2[4];
389 
390  double phi1(helix1[4] + beta);
391  if (phi1 > TMath::TwoPi())
392  phi1 -= TMath::TwoPi();
393  if (phi1 < 0.)
394  phi1 += TMath::TwoPi();
395 
396  double phi2(helix2[4] + beta);
397  if (phi2 > TMath::TwoPi())
398  phi2 -= TMath::TwoPi();
399  if (phi2 < 0.)
400  phi2 += TMath::TwoPi();
401 
403  double r1 = 1 / (2. * std::abs(helix1[1]));
404 
405  double charge1(1.);
406  if (helix1[1] < 0.)
407  charge1 = -1.;
408  double rcenter1(helix1[3] / charge1 + r1);
409  double phicenter1(phi1 + TMath::PiOver2() * charge1);
410 
411  double x1 = rcenter1 * cos(phicenter1);
412  double y1 = rcenter1 * sin(phicenter1);
413 
415  double r2 = 1 / (2. * std::abs(helix2[1]));
416 
417  double charge2(1.);
418  if (helix2[1] < 0.)
419  charge2 = -1.;
420  double rcenter2(helix2[3] / charge2 + r2);
421  double phicenter2(phi2 + TMath::PiOver2() * charge2);
422 
423  double x2 = rcenter2 * cos(phicenter2);
424  double y2 = rcenter2 * sin(phicenter2);
426 
427  double dx(x1 - x2);
428  if (dx < 1e-9 && dx > 0.)
429  dx = 1e-9;
430  if (dx > -1e-9 && dx < 0.)
431  dx = -1e-9;
432  double slope((y1 - y2) / dx);
433  double b(y1 - slope * x1);
434  double alpha(atan(slope));
435  double d(sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
436  // only keeping opposite sign option
437  double separation = d - r1 - r2;
438  double cpx1, cpx2;
439  if (x1 > x2) {
440  cpx1 = x1 - r1 * cos(alpha);
441  cpx2 = x2 + r2 * cos(alpha);
442  } else {
443  cpx1 = x1 + r1 * cos(alpha);
444  cpx2 = x2 - r2 * cos(alpha);
445  }
446 
447  double temp1 = (cpx1 + cpx2) / 2;
448  double temp2 = slope * temp1 + b;
449  double convX = cos(beta) * temp1 + sin(beta) * temp2;
450  double convY = -sin(beta) * temp1 + cos(beta) * temp2;
451 
452  double dct(helix1[0] - helix2[0]);
453 
455  if (std::abs(separation) < m_sepCut && std::abs(dct) < m_dctCut) {
456  goodConv = true;
457  sep = separation;
458  pv = std::atan2(convY, convX);
459  rv = sqrt(convX * convX + convY * convY);
460  if (convX * cos(eletrkP->phi()) + convY * sin(eletrkP->phi()) < 0)
461  rv *= -1.;
462  }
463  } else {
464  dh.dambi(*ele) = -1;
465  }
466  dh.drv(*ele) = rv;
467  dh.dphiv(*ele) = pv;
468  dh.dmee(*ele) = mee;
469  dh.dmeeVtx(*ele) = meeAtVtx;
470  dh.dsep(*ele) = sep;
471  if (goodConv && rv > m_rvECCut && meeAtVtx < m_meeAtVtxECCut)
472  dh.dambi(*ele) = 2;
473  else if (otrkP) {
474  if (mee < m_meeICCut)
475  dh.dambi(*ele) = 1;
476  else
477  dh.dambi(*ele) = 0;
478  }
479  return StatusCode::SUCCESS;
480 }
481 
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
xAOD::Vertex_v1::x
float x() const
Returns the x position.
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
ReadCellNoiseFromCoolCompare.s1
s1
Definition: ReadCellNoiseFromCoolCompare.py:378
add-xsec-uncert-quadrature-N.alpha
alpha
Definition: add-xsec-uncert-quadrature-N.py:110
DerivationFramework::EGElectronAmbiguityTool::m_dtrv
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_dtrv
Definition: EGElectronAmbiguityTool.h:93
xAOD::TruthVertex_v1::phi
float phi() const
Vertex azimuthal angle.
Definition: TruthVertex_v1.cxx:176
DerivationFramework::EGElectronAmbiguityTool::m_dmee
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_dmee
Definition: EGElectronAmbiguityTool.h:81
DerivationFramework::EGElectronAmbiguityTool::initialize
virtual StatusCode initialize() override final
Definition: EGElectronAmbiguityTool.cxx:87
DerivationFramework::EGElectronAmbiguityTool::addBranches
virtual StatusCode addBranches() const override final
Pass the thinning service
Definition: EGElectronAmbiguityTool.cxx:134
DerivationFramework::EGElectronAmbiguityTool::m_dambi
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_dambi
Definition: EGElectronAmbiguityTool.h:90
DerivationFramework::EGElectronAmbiguityTool::m_isMC
bool m_isMC
Definition: EGElectronAmbiguityTool.h:121
DerivationFramework::EGElectronAmbiguityTool::m_tpContainerName
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_tpContainerName
Definition: EGElectronAmbiguityTool.h:59
SG::VIEW_ELEMENTS
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition: OwnershipPolicy.h:18
xAOD::TrackParticle_v1::charge
float charge() const
Returns the charge.
Definition: TrackParticle_v1.cxx:150
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
hist_file_dump.d
d
Definition: hist_file_dump.py:137
xAOD::TrackParticle_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: TrackParticle_v1.cxx:77
plotBeamSpotCompare.x2
x2
Definition: plotBeamSpotCompare.py:218
DerivationFramework::EGElectronAmbiguityTool::m_drv
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_drv
Definition: EGElectronAmbiguityTool.h:75
extractSporadic.c1
c1
Definition: extractSporadic.py:134
DerivationFramework::EGElectronAmbiguityTool::m_dctCut
double m_dctCut
Definition: EGElectronAmbiguityTool.h:129
xAOD::TrackParticle_v1::z0
float z0() const
Returns the parameter.
ElectronxAODHelpers.h
DerivationFramework::EGElectronAmbiguityTool::m_rvECCut
double m_rvECCut
Definition: EGElectronAmbiguityTool.h:134
ParticleTest.tp
tp
Definition: ParticleTest.py:25
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
DerivationFramework::EGElectronAmbiguityTool::m_tpCName
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_tpCName
Definition: EGElectronAmbiguityTool.h:66
xAOD::Electron_v1::trackParticle
const xAOD::TrackParticle * trackParticle(size_t index=0) const
Pointer to the xAOD::TrackParticle/s that match the electron candidate.
Definition: Electron_v1.cxx:55
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:55
PyPoolBrowser.dh
dh
Definition: PyPoolBrowser.py:102
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
DerivationFramework::EGElectronAmbiguityTool::m_sepCut
double m_sepCut
Definition: EGElectronAmbiguityTool.h:129
xAODTruthHelpers.h
DerivationFramework::EGElectronAmbiguityTool::m_elepTCut
double m_elepTCut
Definition: EGElectronAmbiguityTool.h:124
xAOD::TrackParticle_v1::d0
float d0() const
Returns the parameter.
makeTRTBarrelCans.y1
tuple y1
Definition: makeTRTBarrelCans.py:15
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
xAOD::TrackParticle_v1::p4
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
Definition: TrackParticle_v1.cxx:129
DerivationFramework::EGElectronAmbiguityTool::m_dsep
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_dsep
Definition: EGElectronAmbiguityTool.h:87
DerivationFramework::EGElectronAmbiguityTool::m_VtxContainerName
SG::ReadHandleKey< xAOD::VertexContainer > m_VtxContainerName
Definition: EGElectronAmbiguityTool.h:53
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CheckAppliedSFs.e3
e3
Definition: CheckAppliedSFs.py:264
DerivationFramework::EGElectronAmbiguityTool::m_nSiCut
unsigned int m_nSiCut
Definition: EGElectronAmbiguityTool.h:128
DerivationFramework::EGElectronAmbiguityTool::m_dzCut
double m_dzCut
Definition: EGElectronAmbiguityTool.h:129
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
xAOD::EgammaHelpers::isElectron
bool isElectron(const xAOD::Egamma *eg)
is the object an electron (not Fwd)
Definition: EgammaxAODHelpers.cxx:12
makeTRTBarrelCans.y2
tuple y2
Definition: makeTRTBarrelCans.py:18
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:37
xAOD::TruthVertex_v1::perp
float perp() const
Vertex transverse distance from the beam line.
Definition: TruthVertex_v1.cxx:163
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:571
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
DerivationFramework::EGElectronAmbiguityTool::m_idCut
std::string m_idCut
Definition: EGElectronAmbiguityTool.h:125
xAOD::Egamma_v1::phi
virtual double phi() const override final
The azimuthal angle ( ) of the particle.
Definition: Egamma_v1.cxx:75
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
xAOD::Vertex_v1::z
float z() const
Returns the z position.
DerivationFramework
THE reconstruction tool.
Definition: ParticleSortingAlg.h:24
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
DerivationFramework::EGElectronAmbiguityTool::DecorHandles
Definition: EGElectronAmbiguityTool.h:101
TruthVertex.h
xAOD::TruthParticle_v1::prodVtx
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
Definition: TruthParticle_v1.cxx:80
DerivationFramework::EGElectronAmbiguityTool::m_dmeeVtx
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_dmeeVtx
Definition: EGElectronAmbiguityTool.h:84
DerivationFramework::EGElectronAmbiguityTool::m_dphiv
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_dphiv
Definition: EGElectronAmbiguityTool.h:78
grepfile.sep
sep
Definition: grepfile.py:38
xAOD::TrackParticle_v1::phi0
float phi0() const
Returns the parameter, which has range to .
Definition: TrackParticle_v1.cxx:158
DerivationFramework::EGElectronAmbiguityTool::EGElectronAmbiguityTool
EGElectronAmbiguityTool(const std::string &t, const std::string &n, const IInterface *p)
Definition: EGElectronAmbiguityTool.cxx:52
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
xAOD::TruthHelpers::getTruthParticle
const xAOD::TruthParticle * getTruthParticle(const xAOD::IParticle &p)
Return the truthParticle associated to the given IParticle (if any)
Definition: xAODTruthHelpers.cxx:25
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:453
xAOD::EgammaHelpers::numberOfSiHits
std::size_t numberOfSiHits(const xAOD::TrackParticle *tp)
return the number of Si hits in the track particle
Definition: ElectronxAODHelpers.cxx:66
xAOD::Electron_v1
Definition: Electron_v1.h:34
dq_make_web_display.rv
def rv
Definition: dq_make_web_display.py:219
TRT_PAI_physicsConstants::he
const double he
same in ev
Definition: TRT_PAI_physicsConstants.h:22
DerivationFramework::EGElectronAmbiguityTool::m_dtpv
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_dtpv
Definition: EGElectronAmbiguityTool.h:96
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
SG::WriteDecorHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
DerivationFramework::EGElectronAmbiguityTool::DecorHandles::DecorHandles
DecorHandles(const EGElectronAmbiguityTool &tool, const EventContext &ctx)
Definition: EGElectronAmbiguityTool.cxx:120
ConstDataVector
DataVector adapter that acts like it holds const pointers.
Definition: ConstDataVector.h:76
xAOD::TruthVertex_v1::z
float z() const
Vertex longitudinal distance along the beam line form the origin.
DerivationFramework::EGElectronAmbiguityTool
Definition: EGElectronAmbiguityTool.h:36
DEBUG
#define DEBUG
Definition: page_access.h:11
makeTRTBarrelCans.dx
tuple dx
Definition: makeTRTBarrelCans.py:20
xAOD::Vertex_v1::y
float y() const
Returns the y position.
python.changerun.pv
pv
Definition: changerun.py:81
xAOD::Egamma_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: Egamma_v1.cxx:65
DerivationFramework::EGElectronAmbiguityTool::m_containerName
SG::ReadHandleKey< xAOD::ElectronContainer > m_containerName
Definition: EGElectronAmbiguityTool.h:47
xAOD::EgammaHelpers::getOriginalTrackParticle
const xAOD::TrackParticle * getOriginalTrackParticle(const xAOD::Electron *el)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the electron.
Definition: ElectronxAODHelpers.cxx:11
SG::ConstAccessor::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
xAOD::Egamma_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: Egamma_v1.cxx:70
DerivationFramework::EGElectronAmbiguityTool::decorateSimple
StatusCode decorateSimple(DecorHandles &dh, std::unique_ptr< ConstDataVector< xAOD::TrackParticleContainer >> &tpC, const xAOD::Electron *ele, const xAOD::Vertex *pvtx) const
Definition: EGElectronAmbiguityTool.cxx:295
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
DerivationFramework::EGElectronAmbiguityTool::m_dtzv
SG::WriteDecorHandleKey< xAOD::ElectronContainer > m_dtzv
Definition: EGElectronAmbiguityTool.h:99
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
AthAlgTool
Definition: AthAlgTool.h:26
MuonParameters::beta
@ beta
Definition: MuonParamDefs.h:144
TruthParticle.h
xAOD::TrackParticle_v1::theta
float theta() const
Returns the parameter, which has range 0 to .
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
DerivationFramework::EGElectronAmbiguityTool::m_meeAtVtxECCut
double m_meeAtVtxECCut
Definition: EGElectronAmbiguityTool.h:134
DerivationFramework::EGElectronAmbiguityTool::m_meeICCut
double m_meeICCut
Definition: EGElectronAmbiguityTool.h:134
HepMCHelpers.h
xAOD::TrackParticle_v1::phi
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
EGElectronAmbiguityTool.h