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) {