ATLAS Offline Software
Loading...
Searching...
No Matches
ActsEMBremCollectionBuilder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
14#include "Acts/Surfaces/PerigeeSurface.hpp"
16
18
20
22 const std::string &name, ISvcLocator *pSvcLocator)
23 : AthReentrantAlgorithm(name, pSvcLocator) {}
24
27
30 ATH_CHECK(m_actsTrackLinkKey.initialize());
31 ATH_CHECK(m_beamSpotKey.initialize());
32
33 ATH_CHECK(m_refittedTracksKey.initialize());
36
38 ATH_CHECK(m_actsTrackOutLinkKey.initialize());
39
40 ATH_CHECK(m_actsFitter.retrieve());
41 ATH_CHECK(m_cnvTool.retrieve());
43
44 std::string backendname{};
45 try {
47 }
48 catch (const std::runtime_error &ee){
49 backendname = m_refittedTracksKey.key() + "_int";
50 }
51 ATH_CHECK(m_refittedTracksBackendHandles.initialize(backendname));
52
53 return StatusCode::SUCCESS;
54}
55
57 ATH_MSG_INFO("====> GSF fitting Statistics ============");
58 ATH_MSG_INFO("Input Tracks: " << m_nInputTracks);
59 ATH_MSG_INFO("Output Tracks " << m_nRefittedTracks);
60 ATH_MSG_INFO("<========================================");
61 return StatusCode::SUCCESS;
62}
63
64StatusCode ActsEMBremCollectionBuilder::execute(const EventContext &ctx) const {
67 ATH_CHECK(selectedTrackParticles.isValid());
68 m_nInputTracks.fetch_add(selectedTrackParticles->size(), std::memory_order_relaxed);
69
72 ATH_CHECK(originalTPs.isValid());
73
75 ATH_CHECK(beamSpotHandle.isValid());
76 const InDet::BeamSpotData* beamSpotData = beamSpotHandle.cptr();
77
78 Acts::VectorTrackContainer trackBackend;
79 Acts::VectorMultiTrajectory trackStateBackend;
80 ActsTrk::MutableTrackContainer trackContainer( std::move(trackBackend),
81 std::move(trackStateBackend) );
82
83 std::vector<const xAOD::TrackParticle *> originals;
84 originals.reserve(selectedTrackParticles->size());
85 ATH_CHECK(refitActsTracks(ctx, *selectedTrackParticles, trackContainer, originals, beamSpotData));
86
87 // make const
88 Acts::ConstVectorTrackContainer ctrackBackend( std::move(trackContainer.container()) );
89 Acts::ConstVectorMultiTrajectory ctrackStateBackend( std::move(trackContainer.trackStateContainer()) );
90 std::unique_ptr<ActsTrk::TrackContainer> outputActsTracks = std::make_unique<ActsTrk::TrackContainer>( std::move(ctrackBackend),
91 std::move(ctrackStateBackend) );
92
93 m_nRefittedTracks.fetch_add(outputActsTracks->size(), std::memory_order_relaxed);
94
95 // Record Acts container first so ElementLinks into it resolve correctly
97 if (refittedTrackHandle.record(std::move(outputActsTracks)).isFailure()) {
98 ATH_MSG_ERROR("Failed to record refitted ACTS tracks with key "
99 << m_refittedTracksKey.key());
100 return StatusCode::FAILURE;
101 }
102 const ActsTrk::TrackContainer* actsContainer = refittedTrackHandle.ptr();
103
104 // Create output xAOD::TrackParticleContainer
106 if (outTrackParticleHandle.record(std::make_unique<xAOD::TrackParticleContainer>(),
107 std::make_unique<xAOD::TrackParticleAuxContainer>()).isFailure()) {
108 ATH_MSG_ERROR("Failed to record GSF TrackParticles with key "
110 return StatusCode::FAILURE;
111 }
112 xAOD::TrackParticleContainer* trackParticles = outTrackParticleHandle.ptr();
113
114 ATH_CHECK(convertTracks(ctx, *actsContainer, originals, *originalTPs, *trackParticles, beamSpotData));
115
116 return StatusCode::SUCCESS;
117}
118
120 const EventContext &ctx,
121 const xAOD::TrackParticleContainer &input,
122 ActsTrk::MutableTrackContainer &trackContainer,
123 std::vector<const xAOD::TrackParticle*>& originals,
124 const InDet::BeamSpotData* beamSpotData) const {
125 // Beam Spot Position
126 Acts::Vector3 beamPos( beamSpotData->beamPos().x() * Acts::UnitConstants::mm,
127 beamSpotData->beamPos().y() * Acts::UnitConstants::mm,
128 0 );
129
130 // Construct a perigee surface as the target surface
131 std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(beamPos);
132
135 decoHandleActsTrackLink(m_actsTrackLinkKey, ctx);
136
137 for (const xAOD::TrackParticle *in : input) {
138 int nSiliconHits = summaryValueInt(*in, xAOD::numberOfSCTHits, 0);
139 nSiliconHits += summaryValueInt(*in, xAOD::numberOfPixelHits, 0);
140 if (nSiliconHits < m_MinNoSiHits) {
141 continue;
142 }
143
144 const ElementLink<ActsTrk::TrackContainer> &actsTrackLink =
145 decoHandleActsTrackLink(*in);
146
147 if (!actsTrackLink.isValid()) {
148 ATH_MSG_WARNING("Invalid ElementLink to ACTS track for track particle ");
149 continue;
150 }
151
152 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track =
153 *actsTrackLink;
154 if (!optional_track.has_value()) {
156 "Could not retrieve track from valid ElementLink for track particle");
157 continue;
158 }
159
160 ActsTrk::TrackContainer::ConstTrackProxy actstrack = optional_track.value();
161
162 ATH_CHECK(m_actsFitter->fit(ctx, actstrack, trackContainer, *pSurface));
163 originals.push_back(in);
164 }
165 return StatusCode::SUCCESS;
166}
167
169 const EventContext &ctx,
170 const ActsTrk::TrackContainer &actsContainer,
171 const std::vector<const xAOD::TrackParticle*>& originals,
172 const xAOD::TrackParticleContainer& originalTPs,
174 const InDet::BeamSpotData* beamSpotData) const {
176 actsTrackLink(m_actsTrackOutLinkKey, ctx);
177
178 static const SG::AuxElement::Accessor<ElementLink<xAOD::TrackParticleContainer>>
179 originalTPLink("originalTrackParticle");
180
181 for (const auto [track, originalTP] : Acts::zip(actsContainer, originals)) {
182 xAOD::TrackParticle* tp = outputTPs.push_back(std::make_unique<xAOD::TrackParticle>());
183
184 ATH_CHECK(m_cnvTool->convert(*tp, ctx, track, track.referenceSurface(), beamSpotData));
185
186 actsTrackLink(*tp) = ElementLink<ActsTrk::TrackContainer>(&actsContainer, track.index());
187
188 originalTPLink(*tp) = ElementLink<xAOD::TrackParticleContainer>(
189 originalTPs, originalTP->index(), ctx);
190
191 // Add qoverP from the last measurement
192 float QoverPLast(0);
193 for (const auto ts : track.trackStatesReversed()) {
194 if (ts.typeFlags().isMeasurement()) {
195 QoverPLast = ts.parameters()[Acts::eBoundQOverP];
196 break;
197 }
198 }
199 static const SG::AuxElement::Accessor<float> QoverPLM("QoverPLM");
200 QoverPLM(*tp) = QoverPLast;
201
202 // isRefitted option should check the actual refit status
203 egammaCopyTrackParticleInfo::ToCopy toCopy{.isRefitted = true,
204 .doTruth = m_doTruth,
205 .doPix = m_doPix,
206 .doSCT = m_doStrip,
207 .doHGTD = m_doHGTD};
208 egammaCopyTrackParticleInfo::copy(*tp, *originalTP, toCopy);
209
210 }
211 return StatusCode::SUCCESS;
212}
int summaryValueInt(const xAOD::TrackParticle &tp, const xAOD::SummaryType &info, int deflt=-999)
return the summary value for a TrackParticle or default value (-999) (to be used mostly in python whe...
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
Handle class for reading from StoreGate.
Handle class for adding a decoration to an object.
Handle class for recording to StoreGate.
ToolHandle< ActsTrk::ITrackToTrackParticleCnvTool > m_cnvTool
Gaudi::Property< int > m_MinNoSiHits
@Cut on minimum silicon hits
ActsEMBremCollectionBuilder(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode execute(const EventContext &ctx) const override final
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_actsTrackOutLinkKey
SG::WriteHandleKey< ActsTrk::TrackContainer > m_refittedTracksKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerKey
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_outputTrackParticlesKey
StatusCode refitActsTracks(const EventContext &ctx, const xAOD::TrackParticleContainer &input, ActsTrk::MutableTrackContainer &trackContainer, std::vector< const xAOD::TrackParticle * > &originals, const InDet::BeamSpotData *beamSpotData) const
ActsTrk::MutableTrackContainerHandlesHelper m_refittedTracksBackendHandles
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
StatusCode convertTracks(const EventContext &ctx, const ActsTrk::TrackContainer &actsContainer, const std::vector< const xAOD::TrackParticle * > &originals, const xAOD::TrackParticleContainer &originalTPs, xAOD::TrackParticleContainer &outputTPs, const InDet::BeamSpotData *beamSpotData) const
virtual StatusCode initialize() override final
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_actsTrackLinkKey
virtual StatusCode finalize() override final
ToolHandle< ActsTrk::IFitterTool > m_actsFitter
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_selectedTrackParticleContainerKey
Names of input output collections.
An algorithm that can be simultaneously executed in multiple threads.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const Amg::Vector3D & beamPos() const noexcept
const_pointer_type cptr()
Handle class for reading a decoration on an object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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.
int ts
Definition globals.cxx:24
std::string prefixFromTrackContainerName(const std::string &tracks)
Parse TrackContainer name to get the prefix for backends The name has to contain XYZTracks,...
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
void copy(xAOD::TrackParticle &created, const xAOD::TrackParticle &original, const egammaCopyTrackParticleInfo::ToCopy &toCopy)
int summaryValueInt(const xAOD::TrackParticle &tp, const xAOD::SummaryType &info, int deflt=-999)
return the summary value for a TrackParticle or default value (-999) (to be used mostly in python whe...
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].