21#include "Acts/Utilities/TrackHelpers.hpp"
28 ISvcLocator* pSvcLocator)
43 return StatusCode::SUCCESS;
65 ATH_CHECK(layerClusterTimeHandle.isValid());
69 ATH_CHECK(layerHasExtensionHandle.isValid());
73 ATH_CHECK(layerClusterTruthClassHandle.isValid());
75 static const std::vector<char> s_no_holes(4,
false);
76 std::optional<SG::ReadDecorHandle<xAOD::TrackParticleContainer, std::vector<char>>>
83 for (
const auto* track_ptkl : *track_particles) {
86 const std::vector<float>& times = layerClusterTimeHandle(*track_ptkl);
87 const std::vector<char>& has_clusters = layerHasExtensionHandle(*track_ptkl);
88 const std::vector<int>& hit_classification = layerClusterTruthClassHandle(*track_ptkl);
89 const std::vector<char>& holes_HGTD =
m_doActs ? s_no_holes : (*holesHGTDHandle)(*track_ptkl);
103 short prime_pattern = 0x0;
104 for (
short i = 0; i < s_hgtd_layers; i++) {
105 if (
res.m_hits.at(i).m_isprime) {
106 prime_pattern |= (1 << i);
114 short expected_pattern = 0x0;
115 for (
short i = 0; i < s_hgtd_layers; i++) {
116 if (has_clusters.at(i) || holes_HGTD.at(i)) {
117 expected_pattern |= (1 << i);
123 time_handle(*track_ptkl) =
res.m_time;
124 timeres_handle(*track_ptkl) =
res.m_resolution;
125 hasValidTime_handle(*track_ptkl) =
res.m_hasValidTime;
126 summary_handle(*track_ptkl) =
res.m_field;
128 return StatusCode::SUCCESS;
136 const std::vector<char>& has_clusters,
137 const std::vector<int>& hit_classification)
const {
139 std::array<Hit, s_hgtd_layers> valid_hits =
getValidHits(times,
144 result.m_hits = valid_hits;
145 result.m_field = 0x0;
148 result.m_hasValidTime = 0;
154 short nhits = std::count_if(valid_hits.begin(), valid_hits.end(),
155 [](
const Hit& hit) { return hit.m_isvalid; });
159 result.m_time =
meanTime(valid_hits);
161 result.m_hasValidTime = recoed_pattern ? 1 : 0;
163 }
else if (nhits == 2) {
169 result.m_time =
meanTime(valid_hits);
171 result.m_hasValidTime = 1;
189 nhits = std::count_if(valid_hits.begin(), valid_hits.end(),
190 [](
const Hit& hit) { return hit.m_isvalid; });
201 result.m_time =
meanTime(valid_hits);
203 result.m_hasValidTime = 1;
214 result.m_time =
meanTime(valid_hits);
216 result.m_hasValidTime = 1;
222std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>
224 const std::vector<char>& has_clusters,
225 const std::vector<int>& hit_classification)
const {
226 std::array<Hit, s_hgtd_layers> valid_hits {};
228 for (
size_t i = 0; i < s_hgtd_layers; i++) {
229 Hit& newhit = valid_hits[i];
230 if (has_clusters.at(i)) {
231 newhit.
m_time = times.at(i);
232 newhit.
m_isprime = hit_classification.at(i) == 1;
242 const std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>& hits)
245 for (
short i = 0; i < s_hgtd_layers; i++) {
246 if (hits.at(i).m_isvalid) {
254 const std::array<Hit, s_hgtd_layers>& hits)
const {
259 for (
const auto& hit : hits) {
262 (hit.m_resolution * hit.m_resolution);
269 const std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>& hits)
272 short n_valid = std::count_if(hits.begin(), hits.end(),
273 [](
const Hit& hit) { return hit.m_isvalid; });
278 std::vector<float> times;
279 std::vector<float>
res;
280 for (
const auto& hit : hits) {
282 times.push_back(hit.
m_time);
287 return std::abs(times.at(0) - times.at(1)) <
292 const std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>& hits)
296 for (
const auto& hit : hits) {
306 const std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>& hits)
310 for (
const auto& hit : hits) {
312 sum += 1. / (hit.m_resolution * hit.m_resolution);
316 :
static_cast<float>(std::sqrt(1. / sum));
320 std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers> hits)
const {
321 short remove_layer = -1;
322 float local_min_chi2 = 999999;
323 for (
auto& hit : hits) {
325 bool validbuff = hit.m_isvalid;
326 hit.m_isvalid =
false;
328 hit.m_isvalid = validbuff;
329 if (local_chi2 < local_min_chi2) {
330 local_min_chi2 = local_chi2;
331 remove_layer = hit.m_layer;
338 std::array<TrackTimeDefAndQualityAlg::Hit, s_hgtd_layers>& hits,
340 for (
auto& hit : hits) {
341 if (hit.m_layer == layer) {
342 hit.m_isvalid =
false;
351 track.trackStateOnSurfaces();
358 for (
auto i = tsos->
rbegin(); i != tsos->
rend(); ++i) {
359 const auto* curr_last_tsos = *i;
360 if (not curr_last_tsos) {
365 curr_last_tsos->trackParameters() and
366 curr_last_tsos->measurementOnTrack()) {
367 return curr_last_tsos->trackParameters();
381 if (not track)
throw std::runtime_error(
"Cannot retrieve Trk track from Track Particle");
383 if (not last_hit_param)
throw std::runtime_error(
"Cannot retrieve Trk track parameters from Trk track");
385 radius = std::hypot(last_hit_param->
position().x(),
387 abs_z = std::abs(last_hit_param->
position().z());
391 if (not actsTrackLink.
isAvailable(track_particle))
throw std::runtime_error(
"Track particle does not have link to acts track");
394 if (not link_to_track.
isValid())
throw std::runtime_error(
"Element link to acts track is not valid");
396 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = *link_to_track;
397 if (not optional_track.has_value())
throw std::runtime_error(
"Link to acts track has no value");
399 const ActsTrk::TrackContainer::ConstTrackProxy& track = optional_track.value();
400 const auto lastMeasurementState = Acts::findLastMeasurementState(track);
401 const auto state = lastMeasurementState.value();
406 switch (clusterType) {
410 radius = glob.perp();
411 abs_z = std::abs(glob.z());
417 radius = glob.perp();
418 abs_z = std::abs(glob.z());
423 return std::make_pair(700, 3000);
425 return std::make_pair(radius, abs_z);
429 return std::make_pair(radius, abs_z);
439 if (radius < 350 and abs_z > 2400) {
443 if (radius > 205 and radius < 350 and abs_z > 2100) {
447 if (radius < 220 and abs_z > 2200) {
451 if (radius < 140 and abs_z > 1890) {
#define ATH_CHECK
Evaluate an expression and check for errors.
std::pair< std::vector< unsigned int >, bool > res
Handle class for reading a decoration on an object.
Handle class for reading from StoreGate.
Handle class for adding a decoration to an object.
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
An algorithm that can be simultaneously executed in multiple threads.
const_reverse_iterator rend() const noexcept
Return a const_reverse_iterator pointing at the beginning of the collection.
const_reverse_iterator rbegin() const noexcept
Return a const_reverse_iterator pointing past the end of the collection.
ElementLink implementation for ROOT usage.
bool isValid() const
Check if the element can be found.
const short m_primes_ptrn_sft
float calculateChi2(const std::array< Hit, s_hgtd_layers > &hits) const
Calculates the chi2 of the hit times given their resolution.
CleaningResult runTimeConsistencyCuts(const std::vector< float > ×, const std::vector< char > &has_clusters, const std::vector< int > &hit_classification) const
const short m_holes_ptrn_sft
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_time_dec_key
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_holesHGTDKey
FloatProperty m_chi2_threshold
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterTruthClassKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_time_res_dec_key
FloatProperty m_deltat_cut
std::pair< float, float > getRadiusAndZ(const xAOD::TrackParticle &track_particle) const
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerKey
float meanTime(const std::array< Hit, s_hgtd_layers > &hits) const
Calculates the arithmetic mean of the valid hit times;.
const short m_recoed_ptrn_sft
void setLayerAsInvalid(std::array< Hit, s_hgtd_layers > &hits, short layer) const
Given a layer number, the hit sitting on this layer is flagged as invalid.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_hasValidTime_dec_key
float trackTimeResolution(const std::array< Hit, s_hgtd_layers > &hits) const
Calculates the combined resolution.
const short m_comp_ptrn_sft
short findLayerWithBadChi2(std::array< Hit, s_hgtd_layers > hits) const
Identifies time outliers by finding the layer within which a hit contributes negatively to the overal...
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_layerClusterTimeKey
bool lastHitIsOnLastSurface(const xAOD::TrackParticle &track_particle) const
Checks if the last hit on track was found on a pre-specified set of Pixel and Strip layers close to t...
bool passesDeltaT(const std::array< Hit, s_hgtd_layers > &hits) const
Checks two hits for time compatibility.
FloatProperty m_default_time_res
virtual StatusCode execute(const EventContext &ctx) const override final
short getValidPattern(const std::array< Hit, s_hgtd_layers > &hits) const
Returns the pattern of valid hits in HGTD as a 4-bit bitfield, where a 1 encodes that a valid hit was...
std::array< Hit, s_hgtd_layers > getValidHits(const std::vector< float > ×, const std::vector< char > &has_clusters, const std::vector< int > &hit_classification) const
TrackTimeDefAndQualityAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_summarypattern_dec_key
const short m_exp_ptrn_sft
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_layerHasExtensionKey
const Trk::TrackParameters * getLastHitOnTrack(const Trk::Track &track) const
FloatProperty m_default_time
virtual StatusCode initialize() override final
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
const Amg::Vector3D & position() const
Access method for the position.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
const Trk::Track * track() const
Returns a pointer (which can be NULL) to the Trk::Track which was used to make this TrackParticle.
virtual xAOD::UncalibMeasType type() const =0
Returns the type of the measurement type as a simple enumeration.
double chi2(TH1 *h0, TH1 *h1)
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
DataVector< const Trk::TrackStateOnSurface > TrackStates
ParametersBase< TrackParametersDim, Charged > TrackParameters
StripCluster_v1 StripCluster
Define the version of the strip cluster class.
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.
UncalibMeasType
Define the type of the uncalibrated measurement.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".