ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrackStateOnSurfaceDecoratorAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
10
12
13namespace ActsTrk {
14
16 ISvcLocator *pSvcLocator)
17 : AthReentrantAlgorithm(name, pSvcLocator)
18 {}
19
21 {
22 ATH_MSG_DEBUG("Initializing " << name() << " ...");
23
24 ATH_CHECK(m_trackParticlesKey.initialize());
26 ATH_CHECK(m_trackMsosLink.initialize());
27
28 ATH_CHECK(m_pixelMsosKey.initialize());
29 ATH_CHECK(m_stripMsosKey.initialize());
30
31 return StatusCode::SUCCESS;
32 }
33
34 StatusCode ActsTrackStateOnSurfaceDecoratorAlg::execute(const EventContext& ctx) const
35 {
36 ATH_MSG_DEBUG("Executing " << name() << " ...");
37
39 ATH_CHECK(trackParticleHandle.isValid());
40 const xAOD::TrackParticleContainer* trackParticles = trackParticleHandle.cptr();
41
43 ATH_CHECK( pixelMsosHandle.record(std::make_unique<xAOD::TrackStateValidationContainer>(),
44 std::make_unique<xAOD::TrackStateValidationAuxContainer>()) );
45 xAOD::TrackStateValidationContainer* pixelMsos = pixelMsosHandle.ptr();
46
48 ATH_CHECK( stripMsosHandle.record(std::make_unique<xAOD::TrackStateValidationContainer>(),
49 std::make_unique<xAOD::TrackStateValidationAuxContainer>()) );
50 xAOD::TrackStateValidationContainer* stripMsos = stripMsosHandle.ptr();
51
53 std::vector< ElementLink< xAOD::TrackStateValidationContainer > > > decorator_msos_link( m_trackMsosLink, ctx );
54 ATH_CHECK(decorator_msos_link.isValid());
55
56
57
58 for (const xAOD::TrackParticle* trackParticle : *trackParticles) {
59
60 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = getActsTrack(*trackParticle);
61 if ( not optional_track.has_value() ) {
62 ATH_MSG_ERROR("Invalid track link for particle " << trackParticle->index());
63 return StatusCode::FAILURE;
64 }
65 ActsTrk::TrackContainer::ConstTrackProxy track = optional_track.value();
66
67 std::vector< typename ActsTrk::TrackContainer::ConstTrackStateProxy > tsos {};
68 tsos.reserve( track.nTrackStates() );
69
70
71 // loop on track states
72 track.container().trackStateContainer()
73 .visitBackwards(track.tipIndex(),
74 [&tsos]
75 (const typename ActsTrk::TrackContainer::ConstTrackStateProxy& state)
76 {
77 auto flags = state.typeFlags();
78 if (not flags.isMeasurement() and
79 not flags.isOutlier() and
80 not flags.isHole()) return;
81 tsos.push_back( state );
82 });
83
84 std::vector< ElementLink< xAOD::TrackStateValidationContainer > > msos {};
85 msos.reserve( tsos.size() );
86
87 for (const typename ActsTrk::TrackContainer::ConstTrackStateProxy& state : tsos) {
88 const Acts::Surface& surface = state.referenceSurface();
89 xAOD::UncalibMeasType detectorTypeFromId = getDetectorType( surface.geometryId().volume() );
90
91 if ( detectorTypeFromId == xAOD::UncalibMeasType::PixelClusterType ) {
93 msos,
94 *pixelMsos) );
95 pixelMsos->back()->setDetType( Trk::TrackState::Pixel );
96 }
97 else if ( detectorTypeFromId == xAOD::UncalibMeasType::StripClusterType ) {
99 msos,
100 *stripMsos) );
101 stripMsos->back()->setDetType( Trk::TrackState::SCT );
102 }
103 else {
104 ATH_MSG_DEBUG("Skipping unsupported Acts volume id "
105 << surface.geometryId().volume()
106 << " in " << name()
107 << "; state is not written to the standard Pixel/Strip MSOS containers");
108 continue;
109 }
110
111 } // loop on states
112
113 decorator_msos_link(*trackParticle) = std::move(msos);
114 } // loop on track particles
115
116 return StatusCode::SUCCESS;
117 }
118
119 StatusCode ActsTrackStateOnSurfaceDecoratorAlg::storeTrackState(const typename ActsTrk::TrackContainer::ConstTrackStateProxy& state,
121 xAOD::TrackStateValidationContainer& msosContainer) const
122 {
123 msosContainer.push_back( new xAOD::TrackStateValidation() );
124
125 ElementLink< xAOD::TrackStateValidationContainer > elink( &msosContainer, msosContainer.back()->index() );
126 ATH_CHECK( elink.isValid() );
127 msosLinks.push_back( std::move(elink) );
128
129 static const SG::ConstAccessor< ElementLink< xAOD::TrackMeasurementValidationContainer > > decorator_measurement_link("validationMeasurementLink");
130
131 auto flags = state.typeFlags();
132 if (not flags.isHole() ) {
133 auto cluster = detail::xAODUncalibMeasCalibrator::unpack(state.getUncalibratedSourceLink());
134 ATH_CHECK( cluster != nullptr );
135
136
137 if (not decorator_measurement_link.isAvailable(*cluster)) {
138 ATH_MSG_ERROR("xAOD Cluster does not have a link to TrackMeasurementValidation element");
139 return StatusCode::FAILURE;
140 }
141 const auto& el = decorator_measurement_link(*cluster);
142 ATH_CHECK( el.isValid() );
143 const xAOD::TrackMeasurementValidation *measurement = *el;
144
146 measurement->index() );
147 msosContainer.back()->setTrackMeasurementValidationLink( std::move(tmvc_el) );
148 }
149
150 if (flags.isHole()) {
151 msosContainer.back()->setType( Trk::TrackStateOnSurface::Hole );
152 } else if (flags.isOutlier()) {
154 } else {
156 }
157
158 return StatusCode::SUCCESS;
159 }
160
162 {
163 if (m_isITk) {
164 switch (volumeId) {
165 case 2:
166 case 25:
168 case 22:
169 case 23:
170 case 24:
172 case 8:
173 case 9:
174 case 10:
175 case 13:
176 case 14:
177 case 15:
178 case 16:
179 case 18:
180 case 19:
181 case 20:
183 default:
185 }
186 } else {
187 switch (volumeId) {
188 case 9:
189 case 10:
190 case 11:
192 case 5:
193 case 6:
194 case 7:
196 default:
198 }
199 }
200 }
201}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticlesKey
ActsTrackStateOnSurfaceDecoratorAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_decorator_actsTracks
xAOD::UncalibMeasType getDetectorType(std::uint64_t volumeId) const
SG::WriteHandleKey< xAOD::TrackStateValidationContainer > m_pixelMsosKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_trackMsosLink
virtual StatusCode execute(const EventContext &ctx) const override
SG::WriteHandleKey< xAOD::TrackStateValidationContainer > m_stripMsosKey
StatusCode storeTrackState(const typename ActsTrk::TrackContainer::ConstTrackStateProxy &state, std::vector< ElementLink< xAOD::TrackStateValidationContainer > > &msosLinks, xAOD::TrackStateValidationContainer &msosContainer) const
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
An algorithm that can be simultaneously executed in multiple threads.
const T * back() const
Access the last element in the collection as an rvalue.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
Handle class for adding a decoration to an object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
@ Hole
A hole on the track - this is defined in the following way.
void setDetType(char detType)
Sets the detector type.
void setType(int type)
Sets the type (measurement, outlier, hole).
void setTrackMeasurementValidationLink(ElementLink< xAOD::TrackMeasurementValidationContainer > trackMeasurementValidationLink)
sets the link to the TrackMeasurementValidationContainer
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
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
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
TrackStateValidationContainer_v1 TrackStateValidationContainer
Definition of the current "TrackStateValidation container version".
TrackStateValidation_v1 TrackStateValidation
Reference the current persistent version:
TrackParticle_v1 TrackParticle
Reference the current persistent version:
UncalibMeasType
Define the type of the uncalibrated measurement.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
TrackMeasurementValidationContainer_v1 TrackMeasurementValidationContainer
Definition of the current "TrackMeasurementValidation container version".