19 #include "Acts/Utilities/TrackHelpers.hpp"
27 ISvcLocator* pSvcLocator)
41 return StatusCode::SUCCESS;
53 trk_ptkl_container_handle.
cptr();
54 if (not track_particles) {
56 "[TrackTimeDefAndQualityAlg] TrackParticleContainer not found, "
58 return StatusCode::FAILURE;
72 ATH_CHECK(layerClusterTimeHandle.isValid());
76 ATH_CHECK(layerHasExtensionHandle.isValid());
80 ATH_CHECK(layerClusterTruthClassHandle.isValid());
83 for (
const auto* track_ptkl : *track_particles) {
86 const std::vector<float>&
times = layerClusterTimeHandle(*track_ptkl);
87 const std::vector<bool>& has_clusters = layerHasExtensionHandle(*track_ptkl);
88 const std::vector<int>& hit_classification = layerClusterTruthClassHandle(*track_ptkl);
102 short prime_pattern = 0x0;
103 for (
short i = 0;
i < s_hgtd_layers;
i++) {
104 if (
res.m_hits.at(
i).m_isprime) {
105 prime_pattern |= (1 <<
i);
111 time_handle(*track_ptkl) =
res.m_time;
112 timeres_handle(*track_ptkl) =
res.m_resolution;
113 hasValidTime_handle(*track_ptkl) =
res.m_hasValidTime;
114 summary_handle(*track_ptkl) =
res.m_field;
116 return StatusCode::SUCCESS;
124 const std::vector<bool>& has_clusters,
125 const std::vector<int>& hit_classification)
const {
132 result.m_hits = valid_hits;
136 result.m_hasValidTime = 0;
142 short nhits = std::count_if(valid_hits.begin(), valid_hits.end(),
143 [](
const Hit& hit) { return hit.m_isvalid; });
149 result.m_hasValidTime = recoed_pattern ? 1 : 0;
151 }
else if (nhits == 2) {
159 result.m_hasValidTime = 1;
177 nhits = std::count_if(valid_hits.begin(), valid_hits.end(),
178 [](
const Hit& hit) { return hit.m_isvalid; });
191 result.m_hasValidTime = 1;
204 result.m_hasValidTime = 1;
210 std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>
212 const std::vector<bool>& has_clusters,
213 const std::vector<int>& hit_classification)
const {
214 std::array<Hit, s_hgtd_layers> valid_hits {};
216 for (
size_t i = 0;
i < s_hgtd_layers;
i++) {
217 Hit& newhit = valid_hits[
i];
218 if (has_clusters.at(
i)) {
220 newhit.
m_isprime = hit_classification.at(
i) == 1;
230 const std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>&
hits)
233 for (
short i = 0;
i < s_hgtd_layers;
i++) {
234 if (
hits.at(
i).m_isvalid) {
242 const std::array<Hit, s_hgtd_layers>&
hits)
const {
247 for (
const auto& hit :
hits) {
250 (hit.m_resolution * hit.m_resolution);
257 const std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>&
hits)
260 short n_valid = std::count_if(
hits.begin(),
hits.end(),
261 [](
const Hit& hit) { return hit.m_isvalid; });
266 std::vector<float>
times;
267 std::vector<float>
res;
268 for (
const auto& hit :
hits) {
280 const std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>&
hits)
284 for (
const auto& hit :
hits) {
294 const std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>&
hits)
298 for (
const auto& hit :
hits) {
300 sum += 1. / (hit.m_resolution * hit.m_resolution);
304 :
static_cast<float>(std::sqrt(1. /
sum));
308 std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>
hits)
const {
309 short remove_layer = -1;
310 float local_min_chi2 = 999999;
311 for (
auto& hit :
hits) {
313 bool validbuff = hit.m_isvalid;
314 hit.m_isvalid =
false;
316 hit.m_isvalid = validbuff;
317 if (local_chi2 < local_min_chi2) {
318 local_min_chi2 = local_chi2;
319 remove_layer = hit.m_layer;
326 std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>&
hits,
328 for (
auto& hit :
hits) {
329 if (hit.m_layer ==
layer) {
330 hit.m_isvalid =
false;
339 track.trackStateOnSurfaces();
346 for (
auto i = tsos->rbegin();
i != tsos->rend(); ++
i) {
347 const auto* curr_last_tsos = *
i;
348 if (not curr_last_tsos) {
353 curr_last_tsos->trackParameters() and
354 curr_last_tsos->measurementOnTrack()) {
355 return curr_last_tsos->trackParameters();
369 if (not
track)
throw std::runtime_error(
"Cannot retrieve Trk track from Track Particle");
371 if (not last_hit_param)
throw std::runtime_error(
"Cannot retrieve Trk track parameters from Trk track");
373 radius = std::hypot(last_hit_param->position().x(),
374 last_hit_param->position().y());
375 abs_z = std::abs(last_hit_param->position().z());
379 if (not actsTrackLink.
isAvailable(track_particle))
throw std::runtime_error(
"Track particle does not have link to acts track");
382 if (not link_to_track.
isValid())
throw std::runtime_error(
"Element link to acts track is not valid");
384 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = *link_to_track;
385 if (not optional_track.has_value())
throw std::runtime_error(
"Link to acts track has no value");
387 const ActsTrk::TrackContainer::ConstTrackProxy&
track = optional_track.value();
388 const auto lastMeasurementState = Acts::findLastMeasurementState(
track);
389 const auto state = lastMeasurementState.value();
391 auto sl = state.getUncalibratedSourceLink().template get<ActsTrk::ATLASUncalibSourceLink>();
392 assert( sl !=
nullptr);
396 switch (clusterType) {
400 radius = std::sqrt( glob(0, 0) * glob(0, 0) + glob(1, 0) * glob(1, 0) );
401 abs_z = std::abs( glob(2, 0) );
407 radius = std::sqrt( glob(0, 0) * glob(0, 0) + glob(1, 0) * glob(1, 0) );
408 abs_z = std::abs( glob(2, 0) );
413 return std::make_pair(700, 3000);
415 return std::make_pair(
radius, abs_z);
419 return std::make_pair(
radius, abs_z);
429 if (radius < 350 and abs_z > 2400) {
433 if (
radius > 205 and radius < 350 and abs_z > 2100) {
437 if (radius < 220 and abs_z > 2200) {
441 if (radius < 140 and abs_z > 1890) {