17 const std::string& t,
const std::string& n,
const IInterface* p)
27 m_dec_isset = std::make_unique<SG::AuxElement::Decorator<bool>>(
29 m_dec_hastime = std::make_unique<SG::AuxElement::Decorator<bool>>(
31 m_dec_time = std::make_unique<SG::AuxElement::Decorator<float>>(
33 m_dec_nhits = std::make_unique<SG::AuxElement::Decorator<int>>(
41 std::make_unique<SG::ConstAccessor<bool>>(
m_dec_prefix +
"_isset");
43 std::make_unique<SG::ConstAccessor<bool>>(
m_dec_prefix +
"_hastime");
45 std::make_unique<SG::ConstAccessor<float>>(
m_dec_prefix +
"_time");
47 std::make_unique<SG::ConstAccessor<int>>(
m_dec_prefix +
"_nhits");
49 std::make_unique<SG::ConstAccessor<int>>(
m_dec_prefix +
"_nprimehits");
51 std::make_unique<SG::ConstAccessor<float>>(
m_dec_prefix +
"_resolution");
53 return StatusCode::SUCCESS;
88 float fabs_eta = std::abs(track_particle.
eta());
103 m_dec_nhits->set(track_particle, used_hits.size());
107 return used_hits.size() > 0;
112 if (
m_acc_time->isAvailable(track_particle) and
114 return m_acc_time->operator()(track_particle);
116 throw std::runtime_error(
117 "[ExpertTrackTimeFromClustersTool::expertTime] ERROR, always call "
118 "expertHasTime on a track fist!");
128 throw std::runtime_error(
129 "[ExpertTrackTimeFromClustersTool::expertTimeRes] ERROR, always call "
130 "expertHasTime on a track fist!");
140 throw std::runtime_error(
141 "[ExpertTrackTimeFromClustersTool::nHits] ERROR, always call "
142 "expertHasTime on a track fist!");
146std::vector<ExpertTrackTimeFromClustersTool::Hit>
153 size_t vts = valid_hits.size();
180 HitVec_t time_candidates_copy = valid_hits;
181 bool searching =
true;
184 FloatVec_t chi2_contributions(time_candidates_copy.size(), 0.0);
185 for (
size_t i = 0; i < time_candidates_copy.size(); i++) {
186 HitVec_t buff = time_candidates_copy;
187 buff.erase(buff.begin() + i);
192 chi2_contributions.at(i) = local_chi2;
200 int position = std::distance(
201 chi2_contributions.begin(),
202 std::min_element(chi2_contributions.begin(), chi2_contributions.end()));
205 time_candidates_copy.erase(time_candidates_copy.begin() + position);
217 if (time_candidates_copy.size() == 2) {
220 return time_candidates_copy;
229 return time_candidates_copy;
235 if (std::abs(hits.at(0).time - hits.at(1).time) <
236 m_deltat_cut * std::hypot(hits.at(0).resolution, hits.at(1).resolution)) {
246 for (
size_t i = 0; i < hits.size(); i++) {
248 chi2 += (hits.at(i).time -
mean) * (hits.at(i).time -
mean) /
249 (hits.at(i).resolution * hits.at(i).resolution);
258 if (hits.size() == 0) {
262 for (
const Hit&
hit : hits) {
265 return sum / (float)hits.size();
268std::vector<ExpertTrackTimeFromClustersTool::Hit>
273 const std::vector<bool>& has_clusters =
275 const std::vector<int>& hit_classification =
279 valid_hits.reserve(4);
281 for (
size_t i = 0; i < has_clusters.size(); i++) {
282 if (not has_clusters.at(i)) {
286 newhit.
time = times.at(i);
288 newhit.
isprime = hit_classification.at(i) == 1;
290 valid_hits.push_back(newhit);
299 double radius = std::hypot(last_hit.X(), last_hit.Y());
300 double abs_z = std::abs(last_hit.Z());
303 bool is_last = abs_z > 2700;
304 is_last = is_last || (radius < 350 and abs_z > 2400);
305 is_last = is_last || (radius > 205 and radius < 350 and abs_z > 2100);
306 is_last = is_last || (radius < 220 and abs_z > 2200);
307 is_last = is_last || (radius < 140 and abs_z > 1890);
314 for (
const Hit&
hit : hits) {
336 "No available hits, returning -999.");
340 int n_assigned =
nHits(track_particle);
341 return (
float)n_primaries / (float)n_assigned;
347 if (hits.size() == 0) {
351 for (
const Hit&
hit : hits) {
352 sum += 1. / (
hit.resolution *
hit.resolution);
354 return std::sqrt(1. / sum);
360 unsigned int index = 0;
363 return TVector3(0, 0, 0);
366 return TVector3(track.parameterX(
index), track.parameterY(
index),
367 track.parameterZ(
index));
372 const std::vector<bool>& expected_hits =
374 return std::count(expected_hits.begin(), expected_hits.end(),
true);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x,...)
static const uint32_t nHits
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
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.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
@ LastMeasurement
Parameter defined at the position of the last measurement.