ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrackStateOnSurfaceDecoratorAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
11
12namespace ActsTrk {
13
15 ISvcLocator *pSvcLocator)
16 : AthReentrantAlgorithm(name, pSvcLocator)
17 {}
18
20 {
21 ATH_MSG_DEBUG("Initializing " << name() << " ...");
22
23 ATH_CHECK(m_trackParticlesKey.initialize());
25 ATH_CHECK(m_trackMsosLink.initialize());
26
27 ATH_CHECK(m_pixelMsosKey.initialize());
28 ATH_CHECK(m_stripMsosKey.initialize());
29
30 return StatusCode::SUCCESS;
31 }
32
33 StatusCode ActsTrackStateOnSurfaceDecoratorAlg::execute(const EventContext& ctx) const
34 {
35 ATH_MSG_DEBUG("Executing " << name() << " ...");
36
38 ATH_CHECK(trackParticleHandle.isValid());
39 const xAOD::TrackParticleContainer* trackParticles = trackParticleHandle.cptr();
40
42 ATH_CHECK( pixelMsosHandle.record(std::make_unique<xAOD::TrackStateValidationContainer>(),
43 std::make_unique<xAOD::TrackStateValidationAuxContainer>()) );
44 xAOD::TrackStateValidationContainer* pixelMsos = pixelMsosHandle.ptr();
45
47 ATH_CHECK( stripMsosHandle.record(std::make_unique<xAOD::TrackStateValidationContainer>(),
48 std::make_unique<xAOD::TrackStateValidationAuxContainer>()) );
49 xAOD::TrackStateValidationContainer* stripMsos = stripMsosHandle.ptr();
50
52 std::vector< ElementLink< xAOD::TrackStateValidationContainer > > > decorator_msos_link( m_trackMsosLink, ctx );
53 ATH_CHECK(decorator_msos_link.isValid());
54
55
56
57 for (const xAOD::TrackParticle* trackParticle : *trackParticles) {
58
59 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = getActsTrack(*trackParticle);
60 if ( not optional_track.has_value() ) {
61 ATH_MSG_ERROR("Invalid track link for particle " << trackParticle->index());
62 return StatusCode::FAILURE;
63 }
64 ActsTrk::TrackContainer::ConstTrackProxy track = optional_track.value();
65
66 std::vector< typename ActsTrk::TrackContainer::ConstTrackStateProxy > tsos {};
67 tsos.reserve( track.nTrackStates() );
68
69
70 // loop on track states
71 track.container().trackStateContainer()
72 .visitBackwards(track.tipIndex(),
73 [&tsos]
74 (const typename ActsTrk::TrackContainer::ConstTrackStateProxy& state)
75 {
76 auto flags = state.typeFlags();
77 if (not flags.isMeasurement() and
78 not flags.isOutlier() and
79 not flags.isHole()) return;
80 tsos.push_back( state );
81 });
82
83 std::vector< ElementLink< xAOD::TrackStateValidationContainer > > msos {};
84 msos.reserve( tsos.size() );
85
86 for (const typename ActsTrk::TrackContainer::ConstTrackStateProxy& state : tsos) {
87 const Acts::Surface& surface = state.referenceSurface();
88 xAOD::UncalibMeasType detectorTypeFromId = getDetectorType( surface.geometryId().volume() );
89
90 if ( detectorTypeFromId == xAOD::UncalibMeasType::PixelClusterType ) {
92 msos,
93 *pixelMsos) );
94 pixelMsos->back()->setDetType( Trk::TrackState::Pixel );
95 }
96 else if ( detectorTypeFromId == xAOD::UncalibMeasType::StripClusterType ) {
98 msos,
99 *stripMsos) );
100 stripMsos->back()->setDetType( Trk::TrackState::SCT );
101 }
102 else {
103 ATH_MSG_DEBUG("Skipping unsupported Acts volume id "
104 << surface.geometryId().volume()
105 << " in " << name()
106 << "; state is not written to the standard Pixel/Strip MSOS containers");
107 continue;
108 }
109
110 } // loop on states
111
112 decorator_msos_link(*trackParticle) = std::move(msos);
113 } // loop on track particles
114
115 return StatusCode::SUCCESS;
116 }
117
118 StatusCode ActsTrackStateOnSurfaceDecoratorAlg::storeTrackState(const typename ActsTrk::TrackContainer::ConstTrackStateProxy& state,
120 xAOD::TrackStateValidationContainer& msosContainer) const
121 {
122 msosContainer.push_back( new xAOD::TrackStateValidation() );
123
124 ElementLink< xAOD::TrackStateValidationContainer > elink( &msosContainer, msosContainer.back()->index() );
125 ATH_CHECK( elink.isValid() );
126 msosLinks.push_back( std::move(elink) );
127
128 static const SG::ConstAccessor< ElementLink< xAOD::TrackMeasurementValidationContainer > > decorator_measurement_link("validationMeasurementLink");
129
130 auto flags = state.typeFlags();
131 if (not flags.isHole() ) {
132 auto sl = state.getUncalibratedSourceLink().template get<ATLASUncalibSourceLink>();
133 ATH_CHECK( sl != nullptr );
135
136 if (not decorator_measurement_link.isAvailable(cluster)) {
137 ATH_MSG_ERROR("xAOD Cluster does not have a link to TrackMeasurementValidation element");
138 return StatusCode::FAILURE;
139 }
140 const auto& el = decorator_measurement_link(cluster);
141 ATH_CHECK( el.isValid() );
142 const xAOD::TrackMeasurementValidation *measurement = *el;
143
145 measurement->index() );
146 msosContainer.back()->setTrackMeasurementValidationLink( std::move(tmvc_el) );
147 }
148
149 if (flags.isHole()) {
150 msosContainer.back()->setType( Trk::TrackStateOnSurface::Hole );
151 } else if (flags.isOutlier()) {
153 } else {
155 }
156
157 return StatusCode::SUCCESS;
158 }
159
161 {
162 if (m_isITk) {
163 switch (volumeId) {
164 case 2:
165 case 25:
167 case 22:
168 case 23:
169 case 24:
171 case 8:
172 case 9:
173 case 10:
174 case 13:
175 case 14:
176 case 15:
177 case 16:
178 case 18:
179 case 19:
180 case 20:
182 default:
184 }
185 } else {
186 switch (volumeId) {
187 case 9:
188 case 10:
189 case 11:
191 case 5:
192 case 6:
193 case 7:
195 default:
197 }
198 }
199 }
200}
#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
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
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:132
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
const xAOD::UncalibratedMeasurement & getUncalibratedMeasurement(const ATLASUncalibSourceLink &source_link)
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".
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.