ATLAS Offline Software
Loading...
Searching...
No Matches
ActsEMBremCollectionBuilder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
13#include "Acts/Surfaces/PerigeeSurface.hpp"
14
16
18
20 const std::string &name, ISvcLocator *pSvcLocator)
21 : AthReentrantAlgorithm(name, pSvcLocator) {}
22
25
28 ATH_CHECK(m_actsTrackLinkKey.initialize());
29 ATH_CHECK(m_beamSpotKey.initialize());
30
31 ATH_CHECK(m_refittedTracksKey.initialize());
32 ATH_CHECK(m_actsFitter.retrieve());
34
35 std::string backendname{};
36 try {
38 }
39 catch (const std::runtime_error &ee){
40 backendname = m_refittedTracksKey.key() + "_int";
41 }
42 ATH_CHECK(m_refittedTracksBackendHandles.initialize(backendname));
43
44 return StatusCode::SUCCESS;
45}
46
48 ATH_MSG_INFO("====> GSF fitting Statistics ============");
49 ATH_MSG_INFO("Input Tracks: " << m_nInputTracks);
50 ATH_MSG_INFO("Output Tracks " << m_nRefittedTracks);
51 ATH_MSG_INFO("<========================================");
52 return StatusCode::SUCCESS;
53}
54
55StatusCode ActsEMBremCollectionBuilder::execute(const EventContext &ctx) const {
58 ATH_CHECK(selectedTrackParticles.isValid());
59
60 Acts::VectorTrackContainer trackBackend;
61 Acts::VectorMultiTrajectory trackStateBackend;
62 ActsTrk::MutableTrackContainer trackContainer( std::move(trackBackend),
63 std::move(trackStateBackend) );
64
65 std::vector<const xAOD::TrackParticle *> siliconTrackParticles;
66 siliconTrackParticles.reserve(16);
67
68 for (const xAOD::TrackParticle *trackParticle : *selectedTrackParticles) {
69 int nSiliconHits_trk =
70 summaryValueInt(*trackParticle, xAOD::numberOfSCTHits, 0);
71 nSiliconHits_trk +=
72 summaryValueInt(*trackParticle, xAOD::numberOfPixelHits, 0);
73 if (nSiliconHits_trk >= m_MinNoSiHits) {
74 siliconTrackParticles.push_back(trackParticle);
75 }
76 }
77
78 ATH_CHECK(refitActsTracks(ctx, siliconTrackParticles, trackContainer));
79
80 // make const
81 Acts::ConstVectorTrackContainer ctrackBackend( std::move(trackContainer.container()) );
82 Acts::ConstVectorMultiTrajectory ctrackStateBackend( std::move(trackContainer.trackStateContainer()) );
83 std::unique_ptr<ActsTrk::TrackContainer> outputTracks = std::make_unique<ActsTrk::TrackContainer>( std::move(ctrackBackend),
84 std::move(ctrackStateBackend) );
85
86 m_nInputTracks.fetch_add(selectedTrackParticles->size(), std::memory_order_relaxed);
87 m_nRefittedTracks.fetch_add(outputTracks->size(), std::memory_order_relaxed);
88
90
91 if (refittedTrackHandle.record(std::move(outputTracks)).isFailure()) {
92 ATH_MSG_ERROR("Failed to record refitted ACTS tracks with key "
93 << m_refittedTracksKey.key());
94 return StatusCode::FAILURE;
95 }
96
97 return StatusCode::SUCCESS;
98}
99
101 const EventContext &ctx,
102 const std::vector<const xAOD::TrackParticle *> &input,
103 ActsTrk::MutableTrackContainer &trackContainer) const {
104 // Get Beam pos and make pSurface
106 ATH_CHECK( beamSpotHandle.isValid() );
107 const InDet::BeamSpotData* beamSpotData = beamSpotHandle.cptr();
108
109 // Beam Spot Position
110 Acts::Vector3 beamPos( beamSpotData->beamPos().x() * Acts::UnitConstants::mm,
111 beamSpotData->beamPos().y() * Acts::UnitConstants::mm,
112 0 );
113
114 // Construct a perigee surface as the target surface
115 std::shared_ptr<Acts::PerigeeSurface> pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(beamPos);
116
117
118 for (const xAOD::TrackParticle *in : input) {
121 decoHandleActsTrackLink(m_actsTrackLinkKey, ctx);
122 const ElementLink<ActsTrk::TrackContainer> &actsTrackLink =
123 decoHandleActsTrackLink(*in);
124
125 if (!actsTrackLink.isValid()) {
126 ATH_MSG_WARNING("Invalid ElementLink to ACTS track for track particle ");
127 continue;
128 }
129
130 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track =
131 *actsTrackLink;
132 if (!optional_track.has_value()) {
134 "Could not retrieve track from valid ElementLink for track particle");
135 continue;
136 }
137
138 ActsTrk::TrackContainer::ConstTrackProxy actstrack = optional_track.value();
139
140 ATH_CHECK(m_actsFitter->fit(ctx, actstrack, trackContainer, *pSurface.get()));
141 }
142 return StatusCode::SUCCESS;
143}
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 recording to StoreGate.
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::WriteHandleKey< ActsTrk::TrackContainer > m_refittedTracksKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
StatusCode refitActsTracks(const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &input, ActsTrk::MutableTrackContainer &trackContainer) const
ActsTrk::MutableTrackContainerHandlesHelper m_refittedTracksBackendHandles
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
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.
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?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
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())
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].