ATLAS Offline Software
Loading...
Searching...
No Matches
TrackContainerModule.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
5
9
10#include "xAODMuon/Muon.h"
11
12#include "Acts/Propagator/detail/PointwiseMaterialInteraction.hpp"
13
14
15namespace MuonValR4{
16
18 MuonVal::VectorBranch<std::uint16_t>{parent.tree(), std::format("{:}_nIter",parent.name())}{}
20 const xAOD::TrackParticle* trk = nullptr;
22 trk = static_cast<const xAOD::TrackParticle*>(p);
23 } else if (p->type() == xAOD::Type::ObjectType::Muon) {
24 trk = static_cast<const xAOD::Muon*>(p)->trackParticle(xAOD::Muon::TrackParticleType::Primary);
25 } else {
26 THROW_EXCEPTION("No track particle object has been given to " <<name());
27 }
28
29 auto actsTrk = ActsTrk::getActsTrack(*trk);
30 constexpr auto iterColumn = Acts::hashString("Gx2fnUpdateColumn");
31 if (!actsTrk || !actsTrk->hasColumn(iterColumn)) {
33 return;
34 }
35 VectorBranch<std::uint16_t>::push_back(actsTrk->component<std::uint32_t>(iterColumn));
36 }
40
41
43 MuonVal::VectorBranch<float>{parent.tree(), std::format("{:}_materialL0", parent.name())},
44 m_thickX0{std::make_unique<MuonVal::VectorBranch<float>>(parent.getTree(),
45 std::format("{:}_materialX0", parent.name()))},
46 m_nStates{std::make_unique<MuonVal::VectorBranch<std::uint8_t>>(parent.getTree(),
47 std::format("{:}_nMaterialStates", parent.name()))} {
48 parent.getTree().addBranch(m_thickX0);
49 parent.getTree().addBranch(m_nStates);
50 m_thickX0 = parent.getTree().getBranch<MuonVal::VectorBranch<float>>(m_thickX0->name());
51 m_nStates = parent.getTree().getBranch<MuonVal::VectorBranch<std::uint8_t>>(m_nStates->name());
52 }
57
58 const xAOD::TrackParticle* trk = nullptr;
60 trk = static_cast<const xAOD::TrackParticle*>(p);
61 } else if (p->type() == xAOD::Type::ObjectType::Muon) {
62 trk = static_cast<const xAOD::Muon*>(p)->trackParticle(xAOD::Muon::TrackParticleType::Primary);
63 } else {
64 THROW_EXCEPTION("No track particle object has been given to " <<name());
65 }
66
67 float L0{0.f}, X0{0.f};
68 std::uint8_t nStates{0};
69 auto actsTrk = ActsTrk::getActsTrack(*trk);
70 const ActsTrk::GeometryContext* geoCtx{nullptr};
71 SG::get(geoCtx, m_geoCtxKey, Gaudi::Hive::currentContext()).ignore();
72 for (auto state : actsTrk->trackStates()) {
73 if (!state.typeFlags().hasMaterial()) {
74 continue;
75 }
76
77 Acts::BoundTrackParameters trkPars = actsTrk->createParametersFromState(state);
78
79 auto res = Acts::detail::evaluateMaterialSlab(geoCtx->context(),
80 trkPars.referenceSurface(),
81 Acts::Direction::Forward(),
82 trkPars.position(geoCtx->context()),
83 trkPars.direction(),
84 Acts::MaterialUpdateMode::FullUpdate);
85
86 if (!res.ok()) {
87 continue;
88 }
89 const Acts::MaterialSlab& slab{*res};
90
91 if (slab.isVacuum()) {
92 ATH_MSG_DEBUG("Encountered vacuum at "<<trkPars);
93 continue;
94 }
95 ++nStates;
96 L0 += slab.thicknessInL0();
97 X0 += slab.thicknessInX0();
98 }
99 m_nStates->push_back(nStates);
100 m_thickX0->push_back(X0);
102 }
106
107
110
112 const xAOD::TrackParticle* trk = nullptr;
113 if (p->type() == xAOD::Type::ObjectType::TrackParticle) {
114 trk = static_cast<const xAOD::TrackParticle*>(p);
115 } else if (p->type() == xAOD::Type::ObjectType::Muon) {
116 trk = static_cast<const xAOD::Muon*>(p)->trackParticle(xAOD::Muon::TrackParticleType::Primary);
117 } else {
118 THROW_EXCEPTION("No track particle object has been given to " <<name());
119 }
120 auto actsTrk = ActsTrk::getActsTrack(*trk);
121 const Acts::BoundTrackParameters perigee = actsTrk->createParametersAtReference();
122 for (const auto state : actsTrk->trackStatesReversed()) {
123 const Acts::BoundTrackParameters statePars = actsTrk->createParametersFromState(state);
124 push_back(statePars.absoluteMomentum() - perigee.absoluteMomentum());
125 return;
126 }
127 }
131}
#define ATH_MSG_DEBUG(x)
std::pair< std::vector< unsigned int >, bool > res
Handle class for reading from StoreGate.
Acts::GeometryContext context() const
EnergyLossBranch(MuonVal::IParticleFourMomBranch &parent)
virtual void push_back(const xAOD::IParticle *p) override
Similar to the IAuxElementDecoration branch but only accepting IParticles.
virtual void operator+=(const xAOD::IParticle *p) override
virtual void operator+=(const xAOD::IParticle *p) override
ActsTrk::GeoContextReadKey_t m_geoCtxKey
std::shared_ptr< MuonVal::VectorBranch< float > > m_thickX0
virtual void push_back(const xAOD::IParticle *p) override
Similar to the IAuxElementDecoration branch but only accepting IParticles.
MaterialRecorderBranch(MuonVal::IParticleFourMomBranch &parent)
virtual bool init() override final
The init method checks whether the branch name has already registered to the MuonTree and tries then ...
std::shared_ptr< MuonVal::VectorBranch< std::uint8_t > > m_nStates
virtual void push_back(const xAOD::IParticle *p) override
Similar to the IAuxElementDecoration branch but only accepting IParticles.
TrackFitIterBranch(IParticleFourMomBranch &parent)
virtual void operator+=(const xAOD::IParticle *p) override
Helper class to easily to add xAOD::IParticles and associated decorator variables to the MuonTesterTr...
std::string name() const override final
void push_back(const T &value)
Adds a new element at the end of the vector.
VectorBranch(TTree *tree, const std::string &name)
bool init() override
Initialized the Branch.
Class providing the definition of the 4-vector interface.
std::optional< ActsTrk::TrackContainer::ConstTrackProxy > getActsTrack(const xAOD::TrackParticle &trkPart)
Return the proxy to the Acts track from which the track particle was made frome.
Definition Decoration.cxx:9
Lightweight algorithm to read xAOD MDT sim hits and (fast-digitised) drift circles from SG and fill a...
Class to store array like branches into the n-tuples.
Definition HitValAlg.cxx:19
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
STL namespace.
@ TrackParticle
The object is a charged track particle.
Definition ObjectType.h:43
@ Muon
The object is a muon.
Definition ObjectType.h:48
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Muon_v1 Muon
Reference the current persistent version:
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10