ATLAS Offline Software
RecoToTruthAssociationAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
11 #include "TrkTrack/Track.h"
16 #include "xAODTruth/TruthVertex.h"
18 using namespace xAOD::P4Helpers;
19 namespace {
20  constexpr unsigned int dummy_unsigned = 999;
21  constexpr int com_bit = (1<<xAOD::Muon::Author::Commissioning);
22  void increment_unsigned(unsigned& val) {
23  if (val == dummy_unsigned)
24  val = 1;
25  else
26  ++val;
27  }
29  const SG::ConstAccessor<int> acc_origin("truthOrigin");
30  const SG::ConstAccessor<int> acc_type("truthType");
31  const SG::ConstAccessor<TruthLink_t> acc_link("truthParticleLink");
32  //
33  const SG::Decorator<int> dec_origin("truthOrigin");
34  const SG::Decorator<int> dec_type ("truthType");
35  const SG::Decorator<TruthLink_t> dec_link("truthParticleLink");
36 
37  static const SG::ConstAccessor<std::vector<unsigned long long>> truthMdtHitsAcc("truthMdtHits");
38  static const SG::ConstAccessor<std::vector<unsigned long long>> truthCscHitsAcc("truthCscHits");
39  static const SG::ConstAccessor<std::vector<unsigned long long>> truthRpcHitsAcc("truthRpcHits");
40  static const SG::ConstAccessor<std::vector<unsigned long long>> truthTgcHitsAcc("truthTgcHits");
41 
42 } // namespace
43 
44 namespace Muon {
45 using namespace MuonStationIndex;
46 // Initialize method:
48  ATH_CHECK(m_idHelperSvc.retrieve());
49  ATH_CHECK(m_truthMuKey.initialize());
50  ATH_CHECK(m_recoMuKey.initialize());
51 
52  if (m_recoLink.empty()){
53  m_muonTruthRecoLink = "" ;
54  } else {
55  m_muonTruthRecoLink = m_recoLink;
56  }
57 
58  ATH_CHECK(m_muonTruthRecoLink.initialize(!m_recoLink.empty()));
59  ATH_CHECK(m_muonTruthParticleLink.initialize());
60  ATH_CHECK(m_muonTruthParticleOrigin.initialize());
61  ATH_CHECK(m_muonTruthParticleType.initialize());
62  ATH_CHECK(m_muonTruthParticleNPrecMatched.initialize());
63  ATH_CHECK(m_muonTruthParticleNPhiMatched.initialize());
64  ATH_CHECK(m_muonTruthParticleNTrigEtaMatched.initialize());
65  for (const std::string& trk_coll : m_assocTrkContainers.value()){
66  m_inputDecorKey.emplace_back(trk_coll + ".truthParticleLink");
67  }
68 
69  m_inputDecorKey.emplace_back(m_truthMuKey, SG::AuxTypeRegistry::instance().getName(acc_origin.auxid()));
70  m_inputDecorKey.emplace_back(m_truthMuKey, SG::AuxTypeRegistry::instance().getName(acc_type.auxid()));
71  m_inputDecorKey.emplace_back(m_truthMuKey, SG::AuxTypeRegistry::instance().getName(truthMdtHitsAcc.auxid()));
72 
73  ATH_CHECK(m_inputDecorKey.initialize());
74  return StatusCode::SUCCESS;
75 }
76 
77 // Execute method:
78 StatusCode RecoToTruthAssociationAlg::execute(const EventContext& ctx) const {
79  const xAOD::TruthParticleContainer* muonTruthContainer{nullptr};
80  ATH_CHECK(SG::get(muonTruthContainer, m_truthMuKey , ctx));
81  std::unique_ptr<SG::WriteDecorHandle<xAOD::TruthParticleContainer, ElementLink<xAOD::MuonContainer>>> muonTruthParticleRecoLink{};
82  if (!m_muonTruthRecoLink.empty()) {
83  muonTruthParticleRecoLink = std::make_unique<SG::WriteDecorHandle<xAOD::TruthParticleContainer, ElementLink<xAOD::MuonContainer>>>(m_muonTruthRecoLink, ctx);
84  }
85 
87  ctx);
88  if (!muonTruthParticleLink.isValid()) {
89  ATH_MSG_WARNING("muon particle container not valid");
90  return StatusCode::FAILURE;
91  }
92  SG::WriteDecorHandle<xAOD::MuonContainer, int> muonTruthParticleType(m_muonTruthParticleType, ctx);
93  SG::WriteDecorHandle<xAOD::MuonContainer, int> muonTruthParticleOrigin(m_muonTruthParticleOrigin, ctx);
94  SG::WriteDecorHandle<xAOD::MuonContainer, std::vector<unsigned int> > muonTruthParticleNPrecMatched(m_muonTruthParticleNPrecMatched,
95  ctx);
96  SG::WriteDecorHandle<xAOD::MuonContainer, std::vector<unsigned int> > muonTruthParticleNPhiMatched(m_muonTruthParticleNPhiMatched, ctx);
97  SG::WriteDecorHandle<xAOD::MuonContainer, std::vector<unsigned int> > muonTruthParticleNTrigEtaMatched(m_muonTruthParticleNTrigEtaMatched, ctx);
98 
99  // add link to reco muons and viceversa
100  bool saw_staco = false;
101  bool decor_staco = false;
102 
103  // loop over muons
104  for (const xAOD::Muon* muon : *muonTruthParticleLink) {
105  // use primary track particle to get the truth link (except for the case of STACO, where we must use the ID track particle, as the
106  // combined is not truth-matched)
107  ATH_MSG_DEBUG("muon with pT " << muon->pt() << " MeV, eta: " << muon->eta() << ", phi " << muon->phi() << " and author "
108  << muon->author());
109  const xAOD::TrackParticle* tp = nullptr;
110  if (m_associateWithInDetTP || muon->author() == xAOD::Muon::STACO || muon->author() == xAOD::Muon::MuGirl) {
111  tp = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
112  } else {
113  tp = muon->primaryTrackParticle();
114  }
115 
116  bool foundTruth{false}, setOrigin{false};
117  if (tp) {
118  // Associate reco with truth muon. Loop over reconstructed muons, get track particle for each one.
119  // Each track particle should carry a link to the corresponding truth particle. Then compare this truth particle link with the
120  // given truth muon particle
121  if (acc_origin.isAvailable(*tp) && acc_origin(*tp) != 0) {
122  muonTruthParticleOrigin(*muon) = acc_origin(*tp);
123  muonTruthParticleType(*muon) = acc_type(*tp);
124  setOrigin = true;
125  }
126 
128  if (acc_link.isAvailable(*tp)) {
129  truthLink = acc_link(*tp);
130  } else {
131  ATH_MSG_DEBUG("Could not find any truth link associated with track having pt:"<<tp->pt()<<" MeV, eta: "<<tp->eta()<<", phi: "<<tp->phi()<<", charge: "<<tp->charge()<<". d0:"<<tp->d0()<<", z0: "<<tp->z0());
132  }
133 
134  if (truthLink.isValid()) {
135  ATH_MSG_VERBOSE(" Got valid truth link for muon author " << muon->author() << " uniqueID " << HepMC::uniqueID(*truthLink));
136  // loop over truth particles
137  for (const xAOD::TruthParticle* truthParticle : *muonTruthContainer) {
138  if (!MC::isStable(truthParticle)) continue;
139  ATH_MSG_DEBUG("Got truth muon with uniqueID " << HepMC::uniqueID(truthParticle) << " pt " << truthParticle->pt());
140  if ( !HepMC::is_sim_descendant(*truthLink, truthParticle)) {
141  ATH_MSG_VERBOSE("UniqueID truth link: " << HepMC::uniqueID(*truthLink)
142  << " is not decendant of " << HepMC::uniqueID(truthParticle));
143  continue;
144  }
145  ATH_MSG_VERBOSE("Truth muon uniqueID matches -> creating link with truth particle " << HepMC::uniqueID(*truthLink));
146  foundTruth = true;
148  ElementLink<xAOD::TruthParticleContainer> muonTruthLink{*muonTruthContainer,
149  truthParticle->index(),
150  ctx};
151  muonTruthLink.toPersistent();
152  muonTruthParticleLink(*muon) = muonTruthLink;
153  if (!setOrigin) {
154  muonTruthParticleOrigin(*muon) = acc_origin(*tp);
155  muonTruthParticleType(*muon) = acc_type(*tp);
156  setOrigin = true;
157  }
159  if (muonTruthParticleRecoLink && muonTruthParticleRecoLink->operator()(*truthParticle).isValid()){
160  const xAOD::Muon* decor_muon = *muonTruthParticleRecoLink->operator()(*truthParticle);
161  ATH_MSG_VERBOSE("Truth particle is already decorated with reco muon "<<decor_muon->pt()*1.e-3
162  <<" eta: "<<decor_muon->eta()<<" phi: "<<decor_muon->phi()<<" charge: "<<
163  decor_muon->charge()<<" author: "<<decor_muon->author()<<" all authors: "<<
164  decor_muon->allAuthors());
165 
166  // Check first if the exiting muon has a better author
167  if (MuonCombined::authorRank(decor_muon->author()) < MuonCombined::authorRank(muon->author())){
168  ATH_MSG_DEBUG("Author of the decorated muon is better than the one of the new candidate");
169  continue;
170  }
172  const int com_score = (muon->allAuthors() & com_bit) - (decor_muon->allAuthors() &com_bit);
173  if (com_score > 0){
174  ATH_MSG_DEBUG("Found two muons reconstructed by an equivalent author. But this one is from the commissioning chain");
175  continue;
176  }
178  if (deltaR2(muon,truthParticle) >= deltaR2(muon, decor_muon)) continue;
179  }
180 
181 
182  ElementLink<xAOD::MuonContainer> muonLink{muon, *muonTruthParticleLink, ctx};
183 
185  std::vector<unsigned int> nprecHitsPerChamberLayer(toInt(ChIndex::ChIndexMax), dummy_unsigned);
186  std::vector<unsigned int> nphiHitsPerChamberLayer(toInt(PhiIndex::PhiIndexMax), dummy_unsigned);
187  std::vector<unsigned int> ntrigEtaHitsPerChamberLayer(toInt(PhiIndex::PhiIndexMax), dummy_unsigned);
188 
189  constexpr int author_sel = (1<<xAOD::Muon::MuidCo) | (1<<xAOD::Muon::MuidSA) | (1<<xAOD::Muon::MuGirl);
190  count_chamber_layers(muon->allAuthors() & author_sel
191  ? truthParticle
192  : nullptr,
193  tp->track(), nprecHitsPerChamberLayer, nphiHitsPerChamberLayer, ntrigEtaHitsPerChamberLayer);
195  muonTruthParticleNPrecMatched(*muon) = nprecHitsPerChamberLayer;
196  muonTruthParticleNPhiMatched(*muon) = nphiHitsPerChamberLayer;
197  muonTruthParticleNTrigEtaMatched(*muon) = ntrigEtaHitsPerChamberLayer;
198 
199  if (muonTruthParticleRecoLink) (*muonTruthParticleRecoLink)(*truthParticle) = muonLink;
200  break;
201  }
202  } else {
203  ATH_MSG_DEBUG("Invalid truth link");
204  }
205  } else {
206  ATH_MSG_WARNING("Could not find the appropiate track particle for muon with pT: " << muon->pt() * 1.e-3 << " GeV, eta: "
207  << muon->eta() << ", phi: " << muon->phi()
208  << " author: " << muon->author());
209  }
210 
211  if (!setOrigin) {
212  muonTruthParticleOrigin(*muon) = 0;
213  muonTruthParticleType(*muon) = 0;
214  }
215  if (!foundTruth) {
216  muonTruthParticleLink(*muon) = ElementLink<xAOD::TruthParticleContainer>();
217  // add these empty vectors
218  muonTruthParticleNPrecMatched(*muon) = std::vector<unsigned int>{};
219  muonTruthParticleNPhiMatched(*muon) = std::vector<unsigned int>{};
220  muonTruthParticleNTrigEtaMatched(*muon) = std::vector<unsigned int>{};
221  }
224  if (muon->author() == xAOD::Muon::STACO) {
225  const xAOD::TrackParticle* cmb_trk = muon->trackParticle(xAOD::Muon::CombinedTrackParticle);
226  if (!cmb_trk){
227  ATH_MSG_WARNING("Even a STACO muon should have a combined track");
228  continue;
229  } else {
230  if (!saw_staco) {
231  saw_staco = true;
232  decor_staco = !dec_origin.isAvailable (*cmb_trk);
233  }
234  if (decor_staco) {
235  dec_origin(*cmb_trk) = acc_origin(*muon);
236  dec_type(*cmb_trk) = acc_type(*muon);
237  dec_link(*cmb_trk) = acc_link(*muon);
238  }
239  }
240  }
241  }
243  if (muonTruthParticleRecoLink && !muonTruthParticleRecoLink->isAvailable()) {
244  for (const xAOD::TruthParticle* truthParticle : **muonTruthParticleRecoLink) {
245  ATH_MSG_DEBUG("no reco muon link set, add an empty one");
246  (*muonTruthParticleRecoLink)(*truthParticle) = ElementLink<xAOD::MuonContainer>();
247  }
248  }
249 
250  return StatusCode::SUCCESS;
251 }
252 
253 void RecoToTruthAssociationAlg::count_chamber_layers(const xAOD::IParticle* truthParticle, const Trk::Track* ptrk,
254  std::vector<unsigned int>& nprecHitsPerChamberLayer,
255  std::vector<unsigned int>& nphiHitsPerChamberLayer,
256  std::vector<unsigned int>& ntrigEtaHitsPerChamberLayer) const {
257 
258  if (!truthParticle || !truthMdtHitsAcc.isAvailable(*truthParticle)) {
259  ATH_MSG_DEBUG("muon has no truth hits vector in the truth association alg");
260  nprecHitsPerChamberLayer.clear();
261  nphiHitsPerChamberLayer.clear();
262  ntrigEtaHitsPerChamberLayer.clear();
263  return;
264  }
265  const std::vector<unsigned long long>& mdtTruth = truthMdtHitsAcc(*truthParticle);
266  std::vector<unsigned long long> cscTruth;
267 
268  if (m_idHelperSvc->hasCSC()) cscTruth = truthCscHitsAcc(*truthParticle);
269  const std::vector<unsigned long long>& rpcTruth = truthRpcHitsAcc(*truthParticle);
270  const std::vector<unsigned long long>& tgcTruth = truthTgcHitsAcc(*truthParticle);
271 
272  for (const Trk::TrackStateOnSurface* tsit : *ptrk->trackStateOnSurfaces()) {
273  if (!tsit || !tsit->trackParameters() || !tsit->measurementOnTrack()) continue;
274  const Trk::MeasurementBase* meas = tsit->measurementOnTrack();
275  Identifier id;
276  const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(meas);
277  if (rot)
278  id = rot->identify();
279  else {
280  const Muon::CompetingMuonClustersOnTrack* crot = dynamic_cast<const Muon::CompetingMuonClustersOnTrack*>(meas);
281  if (crot && !crot->containedROTs().empty() && crot->containedROTs().front()) id = crot->containedROTs().front()->identify();
282  }
283  if (!m_idHelperSvc->isMuon(id)) continue;
284 
285  bool measPhi = m_idHelperSvc->measuresPhi(id);
286  bool isTgc = m_idHelperSvc->isTgc(id);
287  ChIndex chIndex = !isTgc ? m_idHelperSvc->chamberIndex(id) : ChIndex::ChUnknown;
288  if (m_idHelperSvc->isMdt(id)) {
289  for (unsigned int i = 0; i < mdtTruth.size(); ++i) {
290  if (id == mdtTruth[i]) {
291  if (chIndex != ChIndex::ChUnknown) {
292  increment_unsigned(nprecHitsPerChamberLayer.at(toInt(chIndex)));
293  }
294  break;
295  }
296  }
297  } else if (m_idHelperSvc->hasCSC() && m_idHelperSvc->isCsc(id)) {
298  for (unsigned int i = 0; i < cscTruth.size(); ++i) {
299  if (id != cscTruth[i]) continue;
300  if (measPhi) {
301  PhiIndex index = m_idHelperSvc->phiIndex(id);
302  if (index != PhiIndex::PhiUnknown) {
303  increment_unsigned(nphiHitsPerChamberLayer.at(toInt(index)));
304  }
305  } else {
306  if (chIndex != ChIndex::ChUnknown) {
307  increment_unsigned(nprecHitsPerChamberLayer.at(toInt(chIndex)));
308  }
309  }
310  break;
311  }
312  } else if (m_idHelperSvc->isRpc(id)) {
313  for (unsigned int i = 0; i < rpcTruth.size(); ++i) {
314  if (id != rpcTruth[i]) { continue; }
315  PhiIndex index = m_idHelperSvc->phiIndex(id);
316  if (index != PhiIndex::PhiUnknown) {
317  if (measPhi) {
318  increment_unsigned(nphiHitsPerChamberLayer.at(toInt(index)));
319  } else {
320  increment_unsigned(ntrigEtaHitsPerChamberLayer.at(toInt(index)));
321  }
322  }
323  break;
324  }
325  } else if (m_idHelperSvc->isTgc(id)) {
326  for (unsigned int i = 0; i < tgcTruth.size(); ++i) {
327  if (id != tgcTruth[i]) { continue; }
328  PhiIndex index = m_idHelperSvc->phiIndex(id);
329  if (index != PhiIndex::PhiUnknown) {
330  if (measPhi) {
331  increment_unsigned(nphiHitsPerChamberLayer.at(toInt(index)));
332  } else {
333  increment_unsigned(ntrigEtaHitsPerChamberLayer.at(toInt(index)));
334  }
335  }
336  break;
337  }
338  }
339  } // end loop over TSOS
340  ATH_MSG_DEBUG("finished loop over TSOS");
341 
342  // now, have to check if there are non-zero truth hits in indices without reco hits
343  clear_dummys(mdtTruth, nprecHitsPerChamberLayer);
344  clear_dummys(cscTruth, nprecHitsPerChamberLayer);
345 
346  clear_dummys(cscTruth, nphiHitsPerChamberLayer);
347  clear_dummys(rpcTruth, nphiHitsPerChamberLayer);
348  clear_dummys(tgcTruth, nphiHitsPerChamberLayer);
349 
350  clear_dummys(rpcTruth, ntrigEtaHitsPerChamberLayer);
351  clear_dummys(tgcTruth, ntrigEtaHitsPerChamberLayer);
352 }
353 void RecoToTruthAssociationAlg::clear_dummys(const std::vector<unsigned long long>& identifiers, std::vector<unsigned int>& vec) const {
356  if (identifiers.empty()) { return; }
357  for (unsigned int i = 0; i < vec.size(); ++i) {
358  if (vec[i] != dummy_unsigned) continue;
359  for (unsigned j = 0; j < identifiers.size(); ++j) {
360  const Identifier id{identifiers[j]};
361  if (m_idHelperSvc->measuresPhi(id)) {
362  const auto phiIdx = static_cast<PhiIndex>(i);
363  if (m_idHelperSvc->phiIndex(id) == phiIdx) {
364  vec[i] = 0;
365  break;
366  }
367  } else {
368  const auto chIdx = static_cast<ChIndex>(i);
369  if (m_idHelperSvc->chamberIndex(id) == chIdx) {
370  vec[i] = 0;
371  break;
372  }
373  }
374  }
375  }
376 }
377 }
xAOD::muon
@ muon
Definition: TrackingPrimitives.h:196
xAOD::Muon_v1::allAuthors
uint16_t allAuthors() const
Get all the authors of this Muon.
xAOD::MuGirl
@ MuGirl
MuGirl.
Definition: TrackingPrimitives.h:142
MeasurementBase.h
xAOD::IParticle::isAvailable
XAOD_AUXDATA_DEPRECATED bool isAvailable(const std::string &name, const std::string &clsname="") const
Check if a user property is available for reading or not.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:135
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
SG::AuxTypeRegistry::instance
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Definition: AuxTypeRegistry.cxx:640
index
Definition: index.py:1
xAODP4Helpers.h
Trk::Track::trackStateOnSurfaces
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
xAOD::Muon_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
initialize
void initialize()
Definition: run_EoverP.cxx:894
xAOD::Muon_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
CompetingMuonClustersOnTrack.h
ParticleTest.tp
tp
Definition: ParticleTest.py:25
RecoToTruthAssociationAlg.h
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:9
xAOD::Muon_v1::author
Author author() const
SG::ConstAccessor< int >
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
Muon::CompetingMuonClustersOnTrack
Definition: CompetingMuonClustersOnTrack.h:54
xAOD::P4Helpers::deltaR2
double deltaR2(double rapidity1, double phi1, double rapidity2, double phi2)
from bare rapidity,phi
Definition: xAODP4Helpers.h:111
Muon
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
Definition: TrackSystemController.h:45
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:41
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
dumpTruth.getName
getName
Definition: dumpTruth.py:34
MuonCombined::authorRank
int authorRank(const xAOD::Muon::Author &a)
Definition: TagBase.h:23
Track.h
LArG4FSStartPointFilterLegacy.execute
execute
Definition: LArG4FSStartPointFilterLegacy.py:20
xAOD::Muon_v1::charge
float charge() const
SG::Decorator< int >
lumiFormat.i
int i
Definition: lumiFormat.py:85
SG::get
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Definition: ReadCondHandle.h:287
Muon::MuonStationIndex::chIndex
ChIndex chIndex(const std::string &index)
convert ChIndex name string to enum
Definition: MuonStationIndex.cxx:11
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::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:37
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:100
WriteDecorHandle.h
Handle class for adding a decoration to an object.
HepMC::uniqueID
int uniqueID(const T &p)
Definition: MagicNumbers.h:116
xAOD::Muon_v1::pt
virtual double pt() const
The transverse momentum ( ) of the particle.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
DataVector
Derived DataVector<T>.
Definition: DataVector.h:795
TruthVertex.h
Trk::MeasurementBase
Definition: MeasurementBase.h:58
Trk::TrackStateOnSurface
represents the track state (measurement, material, fit parameters and quality) at a surface.
Definition: TrackStateOnSurface.h:71
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:239
RIO_OnTrack.h
MuonParameters::MuidSA
@ MuidSA
Definition: MuonParamDefs.h:59
Muon::CompetingMuonClustersOnTrack::containedROTs
const std::vector< const MuonClusterOnTrack * > & containedROTs() const
returns the vector of SCT_ClusterOnTrack objects .
Definition: CompetingMuonClustersOnTrack.h:184
Muon::MuonStationIndex::PhiIndex
PhiIndex
enum to classify the different phi layers in the muon spectrometer
Definition: MuonStationIndex.h:31
MuonParameters::MuidCo
@ MuidCo
Definition: MuonParamDefs.h:60
MC::isStable
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
Definition: HepMCHelpers.h:45
InDetSimDataHelpers::identifiers
std::vector< Identifier > identifiers(const InDetSimDataCollection &coll)
Definition: InDetSimDataDict.h:15
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::P4Helpers
Definition: xAODP4Helpers.h:36
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
TagBase.h
Trk::RIO_OnTrack::identify
Identifier identify() const
return the identifier -extends MeasurementBase
Definition: RIO_OnTrack.h:152
xAOD::STACO
@ STACO
Tracks produced by STACO.
Definition: TrackingPrimitives.h:100
Muon::MuonStationIndex::ChIndex
ChIndex
enum to classify the different chamber layers in the muon spectrometer
Definition: MuonStationIndex.h:15
HepMC::is_sim_descendant
bool is_sim_descendant(const T1 &p1, const T2 &p2)
Method to check if the first particle is a descendant of the second in the simulation,...
Definition: MagicNumbers.h:372
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:44
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
TrackStateOnSurface.h
HepMCHelpers.h
Muon::MuonStationIndex::toInt
constexpr int toInt(const EnumType enumVal)
Definition: MuonStationIndex.h:61
Identifier
Definition: IdentifierFieldParser.cxx:14