ATLAS Offline Software
MuonDetectorNavTest.cxx
Go to the documentation of this file.
1 /*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "MuonDetectorNavTest.h"
6 
9 
10 #include "Acts/Definitions/Units.hpp"
11 #include "Acts/Propagator/ActorList.hpp"
12 #include "Acts/Propagator/Propagator.hpp"
13 #include "Acts/Propagator/MaterialInteractor.hpp"
14 #include "Acts/Propagator/EigenStepper.hpp"
15 #include "Acts/Propagator/AtlasStepper.hpp"
16 #include "Acts/Utilities/VectorHelpers.hpp"
17 #include "Acts/Visualization/ObjVisualization3D.hpp"
18 #include "Acts/Visualization/GeometryView3D.hpp"
19 #include "Acts/EventData/ParticleHypothesis.hpp"
20 #include "Acts/Propagator/detail/SteppingLogger.hpp"
21 
23 #include "xAODTruth/TruthVertex.h"
29 #include <fstream>
30 #include <format>
31 #include <cmath>
32 
33 using namespace Acts::UnitLiterals;
34 using namespace Muon::MuonStationIndex;
35 
36 namespace {
37 
38 using SegLink_t = std::vector<ElementLink<xAOD::MuonSegmentContainer>>;
39 static const SG::ConstAccessor<SegLink_t> segAcc{"truthSegmentLinks"};
40 static const Amg::Vector3D dummyPos{100.*Gaudi::Units::m, 100.*Gaudi::Units::m, 100.*Gaudi::Units::m};
41 struct PropagatorRecorder{
43  Amg::Vector3D actsPropPos{dummyPos};
45  Amg::Vector3D actsGlobalPos{dummyPos};
47  Amg::Vector3D actsPropDir{Amg::Vector3D::Zero()};
49  Amg::Vector3D atlasPropPos{dummyPos};
51  Amg::Vector3D atlasGlobalPos{dummyPos};
53  Amg::Vector3D atlasPropDir{Amg::Vector3D::Zero()};
55  Identifier id{};
57  double atlasPropabsMomentum{0.};
59  double actsPropabsMomentum{0.};
61  double actsStepSize{0.};
62 };
63 }
64 
65 
66 namespace ActsTrk {
67 
68 Amg::Transform3D MuonDetectorNavTest::toGlobalTrf(const ActsGeometryContext& gctx, const Identifier& hitId) const {
69  const MuonGMR4::MuonReadoutElement* reElement = m_r4DetMgr->getReadoutElement(hitId);
70  const IdentifierHash trfHash = reElement->detectorType() == ActsTrk::DetectorType::Mdt ?
71  reElement->measurementHash(hitId) : reElement->layerHash(hitId);
72  return reElement->localToGlobalTrans(gctx, trfHash);
73 }
74 //get the transformation to the readout element's local frame - first measurement plane
75 Amg::Transform3D MuonDetectorNavTest::toLocalTrf(const ActsGeometryContext& gctx, const Identifier& hitId) const {
76  const MuonGMR4::MuonReadoutElement* reElement = m_r4DetMgr->getReadoutElement(hitId);
77  return reElement->globalToLocalTrans(gctx, reElement->layerHash(hitId));
78 }
79 
80 
81 IdentifierHash MuonDetectorNavTest::layerHash(const Identifier& id) const {
82  return m_r4DetMgr->getReadoutElement(id)->layerHash(id);
83 }
84 
86  ATH_CHECK(m_idHelperSvc.retrieve());
87  ATH_CHECK(m_geoCtxKey.initialize());
88  ATH_CHECK(m_fieldCacheCondObjInputKey.initialize());
89  ATH_CHECK(m_truthParticleKey.initialize());
90  ATH_CHECK(m_truthSegLinkKey.initialize());
91  ATH_CHECK(m_detVolSvc.retrieve());
92  ATH_CHECK(m_extrapolator.retrieve());
93  ATH_CHECK(m_detMgrKey.initialize());
94  ATH_CHECK(m_truthSegLinkKey.initialize());
95  ATH_CHECK(detStore()->retrieve(m_r4DetMgr));
96  ATH_CHECK(m_tree.init(this));
97 
98  ATH_MSG_VERBOSE("Successfully initialized MuonDetectorNavTest");
99  return StatusCode::SUCCESS;
100 }
101 
103  ATH_MSG_VERBOSE("Finalizing MuonDetectorNavTest");
104  ATH_CHECK(m_tree.write());
105  return StatusCode::SUCCESS;
106 }
107 
109  const EventContext& ctx{Gaudi::Hive::currentContext()};
110  ATH_MSG_DEBUG("Execute in event "<<ctx.eventID().event_number());
111  const ActsGeometryContext* gctx{nullptr};
112  const xAOD::TruthParticleContainer* truthParticles{nullptr};
113  const AtlasFieldCacheCondObj* fieldCondObj{nullptr};
114  const MuonGM::MuonDetectorManager* detMgr{nullptr};
115 
116  ATH_CHECK(SG::get(gctx, m_geoCtxKey, ctx));
117  ATH_CHECK(SG::get(truthParticles, m_truthParticleKey, ctx));
118  ATH_CHECK(SG::get(fieldCondObj, m_fieldCacheCondObjInputKey, ctx));
119  ATH_CHECK(SG::get(detMgr, m_detMgrKey, ctx));
120 
121 
122  const Acts::GeometryContext geoContext = gctx->context();
123  const Acts::MagneticFieldContext mfContext = Acts::MagneticFieldContext(fieldCondObj);
124 
125 
126  using Stepper = Acts::EigenStepper<>;
127  //using Stepper = Acts::AtlasStepper;
128  using Navigator = Acts::Experimental::DetectorNavigator;
129  using Propagator = Acts::Propagator<Stepper,Navigator>;
130  using ActorList = Acts::ActorList<Acts::detail::SteppingLogger, Acts::MaterialInteractor, Acts::EndOfWorldReached>;
131  using PropagatorOptions = Propagator::Options<ActorList>;
132 
133 
134  PropagatorOptions options(geoContext, mfContext);
135 
136  options.pathLimit = m_pathLimit;
137  options.stepping.maxStepSize = m_maxStepSize;
138  options.stepping.stepTolerance = m_stepTolerance;
139  options.maxSteps = m_maxSteps;
140  options.maxTargetSkipping = m_maxTargetSkipping;
141 
142  //Configure the material collector
143  auto& materialInteractor = options.actorList.get<Acts::MaterialInteractor>();
144  materialInteractor.energyLoss = false;
145  materialInteractor.multipleScattering = false;
146  materialInteractor.recordInteractions = false;
147 
148  const Acts::Experimental::Detector* detector = m_detVolSvc->detector().get();
149 
150  Acts::Experimental::DetectorNavigator::Config navCfg;
151  navCfg.detector = detector;
152  navCfg.resolvePassive = true;
153 
154  auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
155  auto bfieldCache = bField->makeCache(mfContext);
156  auto stepper = Stepper(bField);
157 
158 
159  Acts::Experimental::DetectorNavigator navigator(navCfg, Acts::getDefaultLogger("DetectorNavigator", ActsTrk::actsLevelVector(msgLevel())));
160  Acts::Propagator<Stepper, Acts::Experimental::DetectorNavigator> propagator(
161  std::move(stepper), std::move(navigator),
162  Acts::getDefaultLogger("Propagator", ActsTrk::actsLevelVector(msgLevel())));
163 
164 
165  for(const xAOD::TruthParticle* truthParticle : *truthParticles){
166 
167  ATH_MSG_DEBUG("Consider truth particle "<<truthParticle->pt()<<", "<<truthParticle->p4().P()<<", "<<truthParticle->eta()<<", "<<truthParticle->phi()
168  <<", pdgId: "<<truthParticle->pdgId()<<", status: "<< HepMC::status(truthParticle)
169  <<", unique id:"<< HepMC::uniqueID(truthParticle));
170 
171  //propagated and truth hits expressed in the local frame of the measurement layer
172  std::vector<PropagatorRecorder> propagatedHits;
173  std::vector<std::pair<Identifier, Amg::Vector3D>> truthHits;
174 
175  //the particle hypothesis
176  Acts::ParticleHypothesis particleHypothesis(static_cast<Acts::PdgParticle>(truthParticle->absPdgId()),
177  truthParticle->m(),
178  Acts::AnyCharge(std::abs(truthParticle->charge())));
179 
180 
181  std::vector<std::pair<const xAOD::MuonSegment*, std::vector<const xAOD::MuonSimHit*>>> muonSegmentWithSimHits;
182  for (const auto& truthSegLink : segAcc(*truthParticle)){
183  const xAOD::MuonSegment* seg{*truthSegLink};
184  auto unordedHits = MuonR4::getMatchingSimHits(*seg);
185  std::vector<const xAOD::MuonSimHit*> muonSimHits{unordedHits.begin(), unordedHits.end()};
186  ATH_MSG_VERBOSE("Segment at : "<<Amg::toString(seg->position())<<" with Sim Hits: "<<unordedHits.size());
187  muonSegmentWithSimHits.emplace_back(seg,muonSimHits);
188  }
189  const auto& particle = truthParticle->p4();
190  m_truthPt = particle.Pt();
191  m_truthP = particle.P();
192 
193  const xAOD::TruthVertex* prodVertex = truthParticle->prodVtx();
194  Amg::Vector3D prodPos = prodVertex ? Amg::Vector3D(prodVertex->x(), prodVertex->y(), prodVertex->z())
196  Amg::Vector3D prodDir{Amg::dirFromAngles(particle.Phi(), particle.Theta())};
197 
198  //position, direction and momentum at the start of the propagation
199  Amg::Vector3D startPropPos{prodPos};
200  Amg::Vector3D startPropDir{prodDir};
201  double startPropP{particle.P()};
202  ATH_MSG_VERBOSE("Magnetic field at the production vertex: "<<Amg::toString(bField->getField(prodPos, bfieldCache).value())<<"at position "<<Amg::toString(prodPos));
203  for (double r =0; r<=2.*Gaudi::Units::m; r+=10.*Gaudi::Units::cm) {
204  Amg::Vector3D magFieldPos{startPropPos.x()+r, startPropPos.y()+r, startPropPos.z()};
205  ATH_MSG_VERBOSE("Magnetic Field in the ID is: "<<Amg::toString(bField->getField(magFieldPos, bfieldCache).value()));
206 
207  }
208 
209 
210 
211 
212  ATH_MSG_VERBOSE("Production vertex at "<<Amg::toString(prodPos)<<" with direction "<<Amg::toString(prodDir)<<" and momentum "<<startPropP);
213 
214 
215  if(m_startFromFirstHit){
216  if (muonSegmentWithSimHits.empty()) {
217  continue;
218  }
219  //sort the segments by the radial distance
220  std::ranges::sort(muonSegmentWithSimHits,
221  [](const auto& a, const auto& b) {
222  return a.first->position().perp() < b.first->position().perp();
223  });
224 
225  //get the simHits from the first segment - from sorted segments
226  std::vector<const xAOD::MuonSimHit*>& muonSimHits = muonSegmentWithSimHits.front().second;
227  if (msgLvl(MSG::VERBOSE)){
228  for(const auto& simHit: muonSimHits){
229  ATH_MSG_VERBOSE("Sim Hit of first segment at global position: "<<Amg::toString(toGlobalTrf(*gctx, simHit->identify())*xAOD::toEigen(simHit->localPosition())));
230  }
231  }
232 
233  //sort the simhits to define starting propagation position
234  std::ranges::sort(muonSimHits,
235  [this, &gctx](const xAOD::MuonSimHit* hit1, const xAOD::MuonSimHit* hit2){
236  const Amg::Vector3D globalPos1 = toGlobalTrf(*gctx,hit1->identify())*xAOD::toEigen(hit1->localPosition());
237  const Amg::Vector3D globalPos2 = toGlobalTrf(*gctx,hit2->identify())*xAOD::toEigen(hit2->localPosition());
238  return globalPos1.norm()<globalPos2.norm();
239  });
240  if (msgLvl(MSG::VERBOSE)){
241  ATH_MSG_VERBOSE("After sorting..");
242  for(const auto& simHit: muonSimHits){
243  ATH_MSG_VERBOSE("Sim Hit of first segment at position: "<<Amg::toString(toGlobalTrf(*gctx, simHit->identify())*xAOD::toEigen(simHit->localPosition())));
244 
245  }
246  }
247 
248  startPropPos = toGlobalTrf(*gctx, muonSimHits.front()->identify())*xAOD::toEigen(muonSimHits.front()->localPosition());
249  startPropDir = toGlobalTrf(*gctx, muonSimHits.front()->identify()).linear()*xAOD::toEigen(muonSimHits.front()->localDirection());
250  startPropP = muonSimHits.front()->kineticEnergy();
251  ATH_MSG_VERBOSE("Kinetic Energy from the simHit: "<<muonSimHits.front()->kineticEnergy() / Gaudi::Units::GeV<<" and mass: "<<muonSimHits.front()->mass()<<" and energy deposit: "<<muonSimHits.front()->energyDeposit() / Gaudi::Units::eV);
252  }
253 
254  ATH_MSG_VERBOSE("Starting propagation from"<<Amg::toString(startPropPos)<<" with direction"
255  <<Amg::toString(startPropDir)<<" and momentum "<<startPropP);
256 
257 
258  Acts::BoundTrackParameters start = Acts::BoundTrackParameters::createCurvilinear(
259  Acts::VectorHelpers::makeVector4(startPropPos, 0.), startPropDir,
260  truthParticle->charge() / startPropP,
261  std::nullopt,
262  particleHypothesis);
263 
264 
265  Trk::CurvilinearParameters atlasStart(startPropPos, startPropP*startPropDir, truthParticle->charge());
266 
267  ATH_MSG_DEBUG("start propagating here");
268  auto result = propagator.propagate(start, options);
269  const Acts::detail::SteppingLogger::result_type state = result.value().get<Acts::detail::SteppingLogger::result_type>();
270  const Acts::MaterialInteractor::result_type material = result.value().get<Acts::MaterialInteractor::result_type>();
271  ATH_MSG_DEBUG("Material interactions: " << material.materialInteractions.size());
272  ATH_MSG_DEBUG("material in x0: " << material.materialInX0);
273  ATH_MSG_DEBUG("material in L0: " << material.materialInL0);
274  std::vector<Acts::MaterialInteraction> interactions = material.materialInteractions;
275  for(const Acts::MaterialInteraction& interaction : interactions){
276  ATH_MSG_DEBUG("Path Correction: " << interaction.pathCorrection);
277  ATH_MSG_DEBUG("Momentum change: " << interaction.deltaP);
278  }
279  // loop through the states drawing each surface or portal
280  if(m_drawEvent){
281  Acts::ObjVisualization3D helper{};
282  for (const auto& s : state.steps) {
283  if(s.surface) Acts::GeometryView3D::drawSurface(helper, *s.surface, geoContext);
284  }
285  helper.write(std::format("event_{:}_{:}_Hits.obj", ctx.eventID().event_number(), truthParticle->index()));
286  }
287 
288  ATH_MSG_VERBOSE("Number of propagated steps : " << state.steps.size());
289  m_propSteps = state.steps.size();
290  m_propLength = result.value().pathLength;
291  for(const auto& state: state.steps){
292  if(!state.surface){
293  continue;
294  }
295  const SurfaceCache* sCache = dynamic_cast<const SurfaceCache *>(state.surface->associatedDetectorElement());
296  if(!sCache){
297  ATH_MSG_VERBOSE("Surface found but it's a portal, continuing..");
298  continue;
299  }
300  const Identifier ID = sCache->identify();
301  const Amg::Transform3D toGap{toLocalTrf(*gctx, ID)};
302  ATH_MSG_VERBOSE("Identify propagated hit " << m_idHelperSvc->toString(ID) << " with hit at local position " << Amg::toString(toGap*state.position)<<" and global direction "<<Amg::toString(state.momentum.unit()));
303  ATH_MSG_VERBOSE("Magnetic field "<<Amg::toString(bField->getField(state.position, bfieldCache).value())<<"at position "<<Amg::toString(state.position));
304  PropagatorRecorder newRecord{};
305  newRecord.id = ID;
306  newRecord.actsPropPos = toGap*state.position;
307  newRecord.actsGlobalPos = state.position;
308  newRecord.actsPropDir = toGap.linear()*state.momentum.unit();
309  newRecord.actsPropabsMomentum = state.momentum.norm();
310  newRecord.actsStepSize = state.stepSize.value();
311 
312  //define the surface to propagate
313  const Trk::Surface& surface = detMgr->getReadoutElement(ID)->surface(ID);
314 
316  if(truthParticle->isMuon()){
318  }
319 
320 
321  std::unique_ptr<Trk::TrackParameters> atlasPars{m_extrapolator->extrapolate(ctx, atlasStart,
322  surface, Trk::alongMomentum,false,
324 
325 
326  if (atlasPars) {
327  newRecord.atlasPropPos = toGap* atlasPars->position();
328  newRecord.atlasPropDir = toGap.linear()*atlasPars->momentum().unit();
329  newRecord.atlasPropabsMomentum = atlasPars->momentum().mag();
330  newRecord.atlasGlobalPos = atlasPars->position();
331  }
332  propagatedHits.emplace_back(newRecord);
333  }
334 
335  std::size_t propHitsSize = propagatedHits.size();
336 
337  //fill with the truthHits- id and local position on the measurement layer's frame and look in the propagated hits
338  unsigned int nMatchedTruth = 0, nMatchedProp = 0, nTruth{0};
339  for (const auto&[segment, simHits] : muonSegmentWithSimHits) {
340  for(const xAOD::MuonSimHit* simHit : simHits){
341  const Identifier ID = simHit->identify();
342  ++nTruth;
343  //express the truth hits in the 1st measurement of readout element's local frame - same as the propagated hits
344  const Amg::Transform3D localTrf{toLocalTrf(*gctx, simHit->identify())*
345  toGlobalTrf(*gctx,simHit->identify())};
346  const Amg::Vector3D localPos = localTrf*xAOD::toEigen(simHit->localPosition());
347  const Amg::Vector3D globalPos = toGlobalTrf(*gctx, simHit->identify())*xAOD::toEigen(simHit->localPosition());
348  const Amg::Vector3D localDir = localTrf.linear()*xAOD::toEigen(simHit->localDirection());
349  m_detId.push_back(ID);
350  m_techIdx.push_back(toInt(m_idHelperSvc->technologyIndex(ID)));
351  m_gasGapId.push_back(layerHash(ID));
352 
353  m_truthLoc.push_back(localPos);
354  m_truthDir.push_back(localDir);
355  m_truthGlob.push_back(globalPos);
356  m_startGlob.push_back(startPropPos);
357  ATH_MSG_VERBOSE("Identify truth hit at local position in 1st measurement plane" << Amg::toString(localPos));
358 
359  auto it_begin = std::ranges::find_if(propagatedHits,
360  [this, ID](const auto& propagatedHit) {
361  return m_idHelperSvc->detElId(ID) == m_idHelperSvc->detElId(propagatedHit.id) &&
362  layerHash(ID) == layerHash(propagatedHit.id);
363  });
364  m_isPropagated.push_back(it_begin != propagatedHits.end());
365 
366  if (it_begin == propagatedHits.end()) {
367  m_actsPropLoc.push_back(dummyPos);
368  m_actsPropDir.push_back(dummyPos);
369  m_atlasPropLoc.push_back(dummyPos);
370  m_atlasPropDir.push_back(dummyPos);
371  m_actsPropGlob.push_back(dummyPos);
372  m_atlasPropGlob.push_back(dummyPos);
373  m_actsPropMomentum.push_back(0.);
374  m_atlasPropMomentum.push_back(0.);
375  m_actsStepSize.push_back(0.);
376  continue;
377  }
378  auto it_end = std::find_if(it_begin, propagatedHits.end(),
379  [this, ID](const auto& propagatedHit) {
380  return m_idHelperSvc->detElId(ID) != m_idHelperSvc->detElId(propagatedHit.id) ||
381  layerHash(ID) != layerHash(propagatedHit.id);
382  });
384  auto it = std::min_element(it_begin, it_end,
385  [&localPos](const PropagatorRecorder& a,
386  const PropagatorRecorder& b){
387  return (localPos - a.actsPropPos).mag() < (localPos - b.actsPropPos).mag();
388  });
389 
390 
391  ATH_MSG_DEBUG("Truth hit found in propagated hits: " << m_idHelperSvc->toString(ID));
392  m_actsPropLoc.push_back(it->actsPropPos);
393  m_actsPropDir.push_back(it->actsPropDir);
394  m_actsPropGlob.push_back(it->actsGlobalPos);
395  m_atlasPropLoc.push_back(it->atlasPropPos);
396  m_atlasPropDir.push_back(it->atlasPropDir);
397  m_atlasPropGlob.push_back(it->atlasGlobalPos);
398  m_actsPropMomentum.push_back(it->actsPropabsMomentum);
399  m_atlasPropMomentum.push_back(it->atlasPropabsMomentum);
400  m_actsStepSize.push_back(it->actsStepSize);
401  ++nMatchedTruth;
402  }
403  }
404  m_matchedTruthFraction = 1.f*nMatchedTruth / nTruth;
405  m_matchedPropFraction = 1.f*nMatchedProp / propHitsSize;
406  m_event = ctx.eventID().event_number();
407  m_tree.fill(ctx);
408  }
409 
410  return StatusCode::SUCCESS;
411 }
412 } // namespace ActsTrk`
413 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
beamspotman.r
def r
Definition: beamspotman.py:674
MuonDetectorNavTest.h
MuonSimHitHelpers.h
xAOD::MuonSimHit_v1
Definition: MuonSimHit_v1.h:18
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:50
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:18
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:79
get_generator_info.result
result
Definition: get_generator_info.py:21
ActsTrk::SurfaceCache::identify
Identifier identify() const override final
Returns the identifier of the Surface.
Definition: SurfaceCache.cxx:31
xAOD::MuonSimHit_v1::identify
Identifier identify() const
Returns the global ATLAS identifier of the SimHit.
Definition: xAODMuonSimHit_V1.cxx:42
vtune_athena.format
format
Definition: vtune_athena.py:14
ID
std::vector< Identifier > ID
Definition: CalibHitIDCheck.h:24
AtlasFieldCacheCondObj
Definition: AtlasFieldCacheCondObj.h:19
SurfaceCache.h
perp
Scalar perp() const
perp method - perpenticular length
Definition: AmgMatrixBasePlugin.h:44
Muon::MuonStationIndex
Definition: MuonStationIndex.h:13
ActsTrk::detail::Navigator
Acts::Navigator Navigator
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:31
TRTCalib_cfilter.detector
detector
Definition: TRTCalib_cfilter.py:241
initialize
void initialize()
Definition: run_EoverP.cxx:894
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:13
skel.it
it
Definition: skel.GENtoEVGEN.py:407
MuonGMR4::MuonReadoutElement
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonReadoutElement.h:38
xAOD::MuonSegment_v1
Class describing a MuonSegment.
Definition: MuonSegment_v1.h:33
ActsTrk::SurfaceCache
: Helper class to connect the aligned transformations of each active sensor(layer) with the Acts::Sur...
Definition: Tracking/Acts/ActsGeoUtils/ActsGeoUtils/SurfaceCache.h:23
ActsTrk::actsLevelVector
Acts::Logging::Level actsLevelVector(MSG::Level lvl)
Definition: LoggerUtils.cxx:9
Trk::alongMomentum
@ alongMomentum
Definition: PropDirection.h:20
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:55
ActsTrk::IDetectorElementBase::detectorType
virtual DetectorType detectorType() const =0
Returns the detector element type.
MuonGMR4::MuonReadoutElement::globalToLocalTrans
Amg::Transform3D globalToLocalTrans(const ActsGeometryContext &ctx) const
Transformations to translate between local <-> global coordinates.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:78
MuonGMR4::MuonReadoutElement::layerHash
virtual IdentifierHash layerHash(const Identifier &measId) const =0
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
particleType
Definition: particleType.h:29
xAOD::TruthVertex_v1::y
float y() const
Vertex y displacement.
ReadCondHandle.h
MuonSegmentContainer.h
runBeamSpotCalibration.helper
helper
Definition: runBeamSpotCalibration.py:115
LArG4FSStartPointFilterLegacy.execute
execute
Definition: LArG4FSStartPointFilterLegacy.py:20
Trk::ParticleHypothesis
ParticleHypothesis
Definition: ParticleHypothesis.h:28
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
python.SystemOfUnits.eV
float eV
Definition: SystemOfUnits.py:173
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
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
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
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
Trk::geantino
@ geantino
Definition: ParticleHypothesis.h:29
HepMC::uniqueID
int uniqueID(const T &p)
Definition: MagicNumbers.h:116
jet::CompCategory::Detector
@ Detector
Definition: UncertaintyEnum.h:19
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
python.AtlRunQueryLib.options
options
Definition: AtlRunQueryLib.py:378
Trk::CurvilinearParametersT
Definition: CurvilinearParametersT.h:48
MuonReadoutElement.h
MuonR4::SegLink_t
ElementLink< MuonR4::SegmentContainer > SegLink_t
Definition: xAODSegmentCnvAlg.cxx:18
Trk::muon
@ muon
Definition: ParticleHypothesis.h:31
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
TruthVertex.h
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
xAOD::TruthVertex_v1
Class describing a truth vertex in the MC record.
Definition: TruthVertex_v1.h:37
ActsTrk::DetectorType::Mdt
@ Mdt
MuonSpectrometer.
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
MuonR4::SegmentFit::toInt
constexpr int toInt(const ParamDefs p)
Definition: MuonHoughDefs.h:42
xAOD::ParticleHypothesis
ParticleHypothesis
Definition: TrackingPrimitives.h:193
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
ActsTrk::detail::Stepper
Acts::SympyStepper Stepper
Adapted from Acts Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithmFunction....
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:30
Amg::dirFromAngles
Amg::Vector3D dirFromAngles(const double phi, const double theta)
Constructs a direction vector from the azimuthal & polar angles.
Definition: GeoPrimitivesHelpers.h:299
xAOD::TruthVertex_v1::x
float x() const
Vertex x displacement.
a
TList * a
Definition: liststreamerinfos.cxx:10
ActsTrk::detail::Propagator
Acts::Propagator< Stepper, Navigator > Propagator
Definition: Tracking/Acts/ActsTrackReconstruction/src/detail/Definitions.h:32
MuonGM::MuonDetectorManager
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:51
xAOD::TruthVertex_v1::z
float z() const
Vertex longitudinal distance along the beam line form the origin.
MuonGMR4::MuonReadoutElement::measurementHash
virtual IdentifierHash measurementHash(const Identifier &measId) const =0
Constructs the identifier hash from the full measurement Identifier.
xAOD::MuonSimHit_v1::localPosition
ConstVectorMap< 3 > localPosition() const
Returns the local postion of the traversing particle.
Definition: xAODMuonSimHit_V1.cxx:60
python.SystemOfUnits.s
float s
Definition: SystemOfUnits.py:147
MuonGMR4::MuonReadoutElement::localToGlobalTrans
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:81
LoggerUtils.h
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MSTrackingVolumeBuilder.cxx:24
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:13
HepMC::status
int status(const T &p)
Definition: MagicNumbers.h:143
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:79
Trk::removeNoise
@ removeNoise
Definition: MaterialUpdateMode.h:20
MuonR4::getMatchingSimHits
std::unordered_set< const xAOD::MuonSimHit * > getMatchingSimHits(const xAOD::MuonSegment &segment)
: Returns all sim hits matched to a xAOD::MuonSegment
Definition: MuonSimHitHelpers.cxx:27
HepMCHelpers.h
python.SystemOfUnits.m
float m
Definition: SystemOfUnits.py:106
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
NSWL1::PadTriggerAdapter::segment
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)
Definition: PadTriggerAdapter.cxx:5
Identifier
Definition: IdentifierFieldParser.cxx:14