ATLAS Offline Software
Loading...
Searching...
No Matches
TrackTimeExtensionAlg.cxx
Go to the documentation of this file.
1
10
12
16
17namespace {
18static constexpr unsigned short n_hgtd_layers = 4;
19}
20
21namespace HGTD {
22
24 ISvcLocator* pSvcLocator)
25 : AthReentrantAlgorithm(name, pSvcLocator) {}
26
28
29 ATH_CHECK(m_extension_tool.retrieve());
30
31 ATH_CHECK(m_truth_tool.retrieve());
32
33 ATH_CHECK(m_clustercont_rh_key.initialize());
34 ATH_CHECK(m_sdo_coll_rh_key.initialize());
35 ATH_CHECK(m_mc_coll_rh_key.initialize());
36 ATH_CHECK(m_trk_ptkl_rh_key.initialize());
40 ATH_CHECK(m_layerClusterTimeKey.initialize());
45 ATH_CHECK(m_extrapXKey.initialize());
46 ATH_CHECK(m_extrapYKey.initialize());
47
48
49 return StatusCode::SUCCESS;
50}
51
54StatusCode TrackTimeExtensionAlg::execute(const EventContext& ctx) const {
55
56 ATH_MSG_DEBUG("Start event");
57
58 SG::ReadHandle<HGTD_ClusterContainer> cluster_container_handle(
60 const HGTD_ClusterContainer* cluster_container =
61 cluster_container_handle.cptr();
62 if (not cluster_container) {
63 ATH_MSG_ERROR("[TrackTimeExtensionAlg] HGTD_ClusterContainer not found, "
64 "aborting execute!");
65 return StatusCode::FAILURE;
66 }
67
68 SG::ReadHandle<InDetSimDataCollection> sdo_collection_handle(
70 const InDetSimDataCollection* sdo_collection = sdo_collection_handle.cptr();
71 if (not sdo_collection) {
72 ATH_MSG_WARNING("[TrackTimeExtensionAlg] SDO Collection not found, no "
73 "truth info available!");
74 }
75
76 SG::ReadHandle<McEventCollection> mc_collection_handle(m_mc_coll_rh_key, ctx);
77 const McEventCollection* mc_coll = mc_collection_handle.cptr();
78 if (not mc_coll) {
79 ATH_MSG_ERROR("[TrackTimeExtensionAlg] McEventCollection not found, "
80 "aborting execute!");
81 return StatusCode::FAILURE;
82 }
83
84 const HepMC::GenEvent* hs_event = nullptr;
85 if (mc_coll->size() > 0) {
86 hs_event = mc_coll->at(0);
87 } else {
88 hs_event = nullptr;
89 }
90
91 // for each track, run the extension if the track is in HGTD acceptance
92 SG::ReadHandle<xAOD::TrackParticleContainer> trk_ptkl_container_handle(
94 const xAOD::TrackParticleContainer* track_particles =
95 trk_ptkl_container_handle.cptr();
96 if (not track_particles) {
97 ATH_MSG_ERROR("[TrackTimeExtensionAlg] TrackParticleContainer not found, "
98 "aborting execute!");
99 return StatusCode::FAILURE;
100 }
101
102 DecorHandles dh (*this, ctx);
103
104 for (const auto* track_ptkl : *track_particles) {
105
106 ATH_MSG_DEBUG("Track eta: " << track_ptkl->eta()
107 << " pt: " << track_ptkl->pt());
108
109 HGTD::ExtensionObject extension;
110
111 if (std::abs(track_ptkl->eta()) < m_eta_cut) {
112 ATH_MSG_DEBUG("Track out of acceptance");
113 // decorate all track particle objects to avoid issues with the
114 // decorations
115 ATH_CHECK(decorateTrackParticle(dh, track_ptkl, extension, sdo_collection,
116 hs_event, true));
117 continue;
118 }
119
120 // this should not happen?
121 if (track_ptkl->track() == nullptr) {
122 ATH_MSG_DEBUG("There is no Trk::Track");
123 ATH_CHECK(decorateTrackParticle(dh, track_ptkl, extension, sdo_collection,
124 hs_event, true));
125 continue;
126 }
127
128 // return 4 track states on surface objects as a result of the extension
129 extension = m_extension_tool->extendTrackToHGTD(ctx,
130 *track_ptkl,
131 cluster_container,
132 hs_event,
133 sdo_collection);
134
135 // TODO here:
136 // retrieve truth info for associated and non-associated HGTD hits, merging
137 // or shadowing info
138
139 // decorate the track
140 ATH_CHECK(decorateTrackParticle(dh, track_ptkl, extension, sdo_collection,
141 hs_event, false));
142
143 } // END LOOP over tracks
144
145 return StatusCode::SUCCESS;
146}
147
150
165
167 DecorHandles& dh,
168 const xAOD::TrackParticle* track_ptkl, const HGTD::ExtensionObject& extension,
169 const InDetSimDataCollection* sdo_collection,
170 const HepMC::GenEvent* hs_event, bool skip_deco) const {
171
172 std::vector<bool> has_cluster_vec;
173 has_cluster_vec.reserve(n_hgtd_layers);
174 std::vector<float> chi2_vec;
175 chi2_vec.reserve(n_hgtd_layers);
176 std::vector<float> raw_time_vec;
177 raw_time_vec.reserve(n_hgtd_layers);
178 std::vector<float> time_vec;
179 time_vec.reserve(n_hgtd_layers);
180 std::vector<int> truth_vec;
181 truth_vec.reserve(n_hgtd_layers);
182 std::vector<bool> is_shadowed_vec;
183 is_shadowed_vec.reserve(n_hgtd_layers);
184 std::vector<bool> is_merged_vec;
185 is_merged_vec.reserve(n_hgtd_layers);
186 std::vector<bool> primary_exists_vec;
187 primary_exists_vec.reserve(n_hgtd_layers);
188
189 for (unsigned short i = 0; i < n_hgtd_layers; i++) {
190
191 const std::unique_ptr<const Trk::TrackStateOnSurface>& trk_state =
192 extension.m_hits.at(i);
193 const HGTD_Cluster* primary_cluster = extension.m_truth_primary_hits.at(i);
194
195 primary_exists_vec.push_back(primary_cluster != nullptr);
196
197 if (trk_state) {
198 ATH_MSG_DEBUG("[decorateTrackParticle] extension found");
199 has_cluster_vec.emplace_back(true);
200
201 chi2_vec.emplace_back(
202 trk_state->fitQualityOnSurface().chiSquared() /
203 trk_state->fitQualityOnSurface().doubleNumberDoF());
204
205 const HGTD_ClusterOnTrack* cot =
206 dynamic_cast<const HGTD_ClusterOnTrack*>(trk_state->measurementOnTrack());
207
208 time_vec.emplace_back(cot->time());
209
210 // get the cluster
211 const HGTD_Cluster* cluster = cot->prepRawData();
212
213 raw_time_vec.emplace_back(cluster->time());
214
215 // get the truth particle
217 acc_tpl("truthParticleLink");
218 const xAOD::TruthParticle* truth_particle = nullptr;
219 if (acc_tpl.isAvailable(*track_ptkl)) {
220 const auto& truth_match_link = acc_tpl(*track_ptkl);
221 if (truth_match_link.isValid()) {
222 truth_particle = *truth_match_link;
223 }
224 }
225
227 bool is_shadowed = false;
228 bool is_merged = false;
229
230 if (truth_particle) {
231 auto truth_info = m_truth_tool->classifyCluster(
232 cluster, truth_particle, sdo_collection, hs_event);
233 truth_origin = truth_info.origin;
234 is_shadowed = truth_info.is_shadowed;
235 is_merged = truth_info.is_merged;
236 }
237
238 ATH_MSG_DEBUG("Truth origin: " << (int)truth_origin);
239
240 truth_vec.emplace_back((int)truth_origin);
241 is_shadowed_vec.emplace_back(is_shadowed);
242 is_merged_vec.emplace_back(is_merged);
243 } else {
244 ATH_MSG_DEBUG("[decorateTrackParticle] NO extension found");
245 has_cluster_vec.emplace_back(false);
246 if (not skip_deco) {
247 chi2_vec.emplace_back(-1.);
248 raw_time_vec.emplace_back(-1.);
249 time_vec.emplace_back(-1.);
250 truth_vec.emplace_back(-1);
251 is_shadowed_vec.emplace_back(false);
252 is_merged_vec.emplace_back(false);
253 }
254 }
255
256 } // END LOOP over TrackStateOnSurface
257
258 dh.layerHasExtensionHandle(*track_ptkl) = has_cluster_vec;
259 dh.layerExtensionChi2Handle(*track_ptkl) = chi2_vec;
260 dh.layerClusterRawTimeHandle(*track_ptkl) = raw_time_vec;
261 dh.layerClusterTimeHandle(*track_ptkl) = time_vec;
262 dh.layerClusterTruthClassHandle(*track_ptkl) = truth_vec;
263 dh.layerClusterShadowedHandle(*track_ptkl) = is_shadowed_vec;
264 dh.layerClusterMergedHandle(*track_ptkl) = is_merged_vec;
265 dh.layerPrimaryExpectedHandle(*track_ptkl) = primary_exists_vec;
266 dh.extrapXHandle(*track_ptkl) = extension.m_extrap_x;
267 dh.extrapYHandle(*track_ptkl) = extension.m_extrap_y;
268
269 return StatusCode::SUCCESS;
270}
271
272} // namespace HGTD
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Trk::PrepRawDataContainer< HGTD_ClusterCollection > HGTD_ClusterContainer
Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration.
Handle class for adding a decoration to an object.
An algorithm that can be simultaneously executed in multiple threads.
const T * at(size_type n) const
Access an element, as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterTruthClassKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerExtensionChi2Key
ToolHandle< IHGTD_TrackTimeExtensionTool > m_extension_tool
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_extrapXKey
ToolHandle< IHGTD_ClusterTruthTool > m_truth_tool
virtual StatusCode initialize() override final
TrackTimeExtensionAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trk_ptkl_rh_key
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterRawTimeKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerHasExtensionKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterTimeKey
SG::ReadHandleKey< InDetSimDataCollection > m_sdo_coll_rh_key
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterShadowedKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_extrapYKey
SG::ReadHandleKey< McEventCollection > m_mc_coll_rh_key
SG::ReadHandleKey< HGTD_ClusterContainer > m_clustercont_rh_key
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerPrimaryExpectedKey
StatusCode decorateTrackParticle(DecorHandles &dh, const xAOD::TrackParticle *track_ptkl, const HGTD::ExtensionObject &extension, const InDetSimDataCollection *sdo_collection, const HepMC::GenEvent *hs_event, bool skip_deco=false) const
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterMergedKey
virtual StatusCode execute(const EventContext &ctx) const override final
virtual const HGTD_Cluster * prepRawData() const override final
returns the PrepRawData - is a SiCluster in this scope
virtual float time() const
virtual float time() const
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
const_pointer_type cptr()
Dereference the pointer.
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
std::array< std::unique_ptr< const Trk::TrackStateOnSurface >, 4 > m_hits
std::array< const HGTD_Cluster *, 4 > m_truth_primary_hits
SG::WriteDecorHandle< xAOD::TrackParticleContainer, std::vector< bool > > layerPrimaryExpectedHandle
SG::WriteDecorHandle< xAOD::TrackParticleContainer, std::vector< bool > > layerClusterMergedHandle
SG::WriteDecorHandle< xAOD::TrackParticleContainer, std::vector< bool > > layerClusterShadowedHandle
SG::WriteDecorHandle< xAOD::TrackParticleContainer, float > extrapXHandle
SG::WriteDecorHandle< xAOD::TrackParticleContainer, std::vector< float > > layerClusterTimeHandle
SG::WriteDecorHandle< xAOD::TrackParticleContainer, std::vector< float > > layerClusterRawTimeHandle
DecorHandles(const TrackTimeExtensionAlg &tool, const EventContext &ctx)
SG::WriteDecorHandle< xAOD::TrackParticleContainer, std::vector< int > > layerClusterTruthClassHandle
SG::WriteDecorHandle< xAOD::TrackParticleContainer, std::vector< bool > > layerHasExtensionHandle
SG::WriteDecorHandle< xAOD::TrackParticleContainer, std::vector< float > > layerExtensionChi2Handle
SG::WriteDecorHandle< xAOD::TrackParticleContainer, float > extrapYHandle