40 const std::string weightFile {
44 for (
auto& bdt : m_BDT) {
46 bdt.reader = std::make_unique<TMVA::Reader>(
"!Color:!Silent");
48 bdt.reader->AddVariable(
"m_delta_z", &bdt.delta_z);
49 bdt.reader->AddVariable(
"m_z_sigma", &bdt.z_sigma);
50 bdt.reader->AddVariable(
"m_q_over_p", &bdt.q_over_p);
51 bdt.reader->AddVariable(
"m_q_over_p_sigma", &bdt.q_over_p_sigma);
52 bdt.reader->AddVariable(
"m_delta_z_resunits", &bdt.delta_z_resunits);
53 bdt.reader->AddVariable(
"m_cluster_sumpt2", &bdt.cluster_sumpt2);
54 bdt.reader->AddVariable(
"m_d0", &bdt.d0);
55 bdt.reader->AddVariable(
"m_d0_sigma", &bdt.d0_sigma);
56 bdt.reader->BookMVA(
"BDT", weightFile);
59 return StatusCode::SUCCESS;
75 for (
const auto vx : *primVxCont) {
79 std::vector<const xAOD::TrackParticle*> hgtdTracks {
83 std::vector<HGTD::Cluster<const xAOD::TrackParticle*>> trackClusters {
96 vxTime(*vx) = HS_cluster.
getValues().at(0);
97 vxTimeRes(*vx) = HS_cluster.
getSigmas().at(0);
116 return StatusCode::SUCCESS;
119std::vector<const xAOD::TrackParticle*>
122 double min_trk_pt)
const {
124 std::vector<const xAOD::TrackParticle*> good_tracks { };
126 for (
const auto trk : *tracks) {
127 if (std::abs(trk->eta()) < 2.4 || std::abs(trk->eta()) > 4.0) {
131 if (trk->pt() < 1.0 * Gaudi::Units::GeV) {
135 good_tracks.push_back(trk);
144 double min_trk_pt,
const double significance_cut)
const {
146 if (track->pt() < min_trk_pt || std::abs(track->eta()) > 4.0) {
150 const double vx_z { vertex->z() };
151 const double vx_z_variance { vertex->covariancePosition()(2, 2) };
153 const double trk_z { track->vz() + track->z0() };
154 const double trk_z_variance { track->definingParametersCovMatrix()(1, 1) };
156 if (std::abs(trk_z - vx_z) / std::sqrt(trk_z_variance + vx_z_variance)
157 < significance_cut) {
164std::vector<HGTD::Cluster<const xAOD::TrackParticle*>>
166 const EventContext& ctx,
167 const std::vector<const xAOD::TrackParticle*>& tracks,
168 double cluster_distance)
const {
182 for (
const auto& track : tracks) {
184 if (trackValidTime(*track)) {
185 double time { trackTime(*track) };
186 double timeResolution { trackTimeResolution(*track) };
189 {time}, {timeResolution}, track);
202 const EventContext& ctx,
207 float max_BDT_score { -1.0f };
209 for (
const auto& cluster : clusters) {
212 if (cluster.getEntries().size() < 3) {
216 const float cluster_score {
scoreCluster(ctx, cluster, vertex) };
218 if (cluster_score >
m_bdt_cutvalue && cluster_score > max_BDT_score) {
220 max_BDT_score = cluster_score;
221 HS_cluster = cluster;
231 const EventContext& ctx,
235 std::pair<float, float> cluster_z {
getZOfCluster(cluster) };
237 std::pair<float, float> cluster_d0 {
getDOfCluster(cluster) };
238 double vertex_z_variance { vertex->covariancePosition()(2, 2) };
240 auto& bdt { *m_BDT.get(ctx) };
242 bdt.delta_z = cluster_z.first - vertex->z();
243 bdt.z_sigma = cluster_z.second;
244 bdt.q_over_p = cluster_oneover_p.first;
245 bdt.q_over_p_sigma = cluster_oneover_p.second;
246 bdt.d0 = cluster_d0.first;
247 bdt.d0_sigma = cluster_d0.second;
249 bdt.delta_z_resunits = (cluster_z.first - vertex->z()) /
250 std::sqrt(std::pow(cluster_z.second, 2.0) + vertex_z_variance);
252 return bdt.reader->EvaluateMVA(
"BDT");
258 std::vector<const xAOD::TrackParticle*> tracks { cluster.
getEntries() };
261 float denom { 0.0f };
263 for (
const auto& track : tracks) {
265 float z0 { track->z0() };
267 static_cast<float>(track->definingParametersCovMatrix()(1, 1))
270 num += z0 / z0_variance;
271 denom += 1.0f / z0_variance;
274 throw std::runtime_error(
"VertexTimeAlg::getZOfCluster: denominator is zero");
276 float avg_z0 = num / denom;
277 float avg_z0_sigma = std::sqrt(1.0f / denom);
279 return {avg_z0, avg_z0_sigma};
285 std::vector<const xAOD::TrackParticle*> tracks { cluster.
getEntries() };
288 float denom { 0.0f };
290 for (
const auto& track : tracks) {
292 float one_over_p { std::abs(track->qOverP()) };
293 float one_over_p_variance {
294 static_cast<float>(track->definingParametersCovMatrix()(4, 4))
297 num += one_over_p / one_over_p_variance;
298 denom += 1.0f / one_over_p_variance;
301 throw std::runtime_error(
"VertexTimeAlg::getOneOverPOfCluster: denominator is zero");
303 float avg_oneover_p = num / denom;
304 float avg_oneover_p_sigma = std::sqrt(1.0f / denom);
306 return {avg_oneover_p, avg_oneover_p_sigma};
312 std::vector<const xAOD::TrackParticle*> tracks { cluster.
getEntries() };
315 float denom { 0.0f };
317 for (
const auto& track : tracks) {
319 float d0 { track->d0() };
321 static_cast<float>(track->definingParametersCovMatrix()(0, 0))
324 num += d0 / d0_variance;
325 denom += 1.0f / d0_variance;
328 throw std::runtime_error(
"VertexTimeAlg::getDOfCluster: denominator is zero");
330 float avg_z0 = num / denom;
331 float avg_z0_sigma = std::sqrt(1.0f / denom);
333 return {avg_z0, avg_z0_sigma};
339 std::vector<const xAOD::TrackParticle*> tracks { cluster.
getEntries() };
341 float sumpt2 { 0.0f };
343 for (
const auto& track : tracks) {
344 sumpt2 += std::pow(track->pt(), 2.0);
#define ATH_CHECK
Evaluate an expression and check for errors.
Handle class for reading a decoration on an object.
Handle class for reading from StoreGate.
Handle class for adding a decoration to an object.
Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration.
An algorithm that can be simultaneously executed in multiple threads.
void doClustering(ClusterAlgo algo)
void updateDistanceCut(double cut_value)
Set the distance cut.
void addCluster(const Cluster< T > &vx)
const std::vector< Cluster< T > > & getClusters() const
std::vector< double > getValues() const
Return the N-dimensional value of the Cluster.
const std::vector< double > & getSigmas() const
Return the N-dimensional resolution of the Cluster.
const std::vector< T > & getEntries() const
Return the objects that are part of the Cluster.
std::pair< float, float > getDOfCluster(const HGTD::Cluster< const xAOD::TrackParticle * > &cluster) const
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackCont_key
Gaudi::Property< float > m_default_vxTime
std::vector< const xAOD::TrackParticle * > vertexAssociatedHGTDTracks(const xAOD::Vertex *vertex, const xAOD::TrackParticleContainer *tracks, double min_trk_pt) const
std::pair< float, float > getOneOverPOfCluster(const HGTD::Cluster< const xAOD::TrackParticle * > &cluster) const
SG::ReadHandleKey< xAOD::VertexContainer > m_primVxCont_key
Gaudi::Property< float > m_bdt_cutvalue
std::pair< float, float > getZOfCluster(const HGTD::Cluster< const xAOD::TrackParticle * > &cluster) const
HGTD::Cluster< const xAOD::TrackParticle * > getHScluster(const EventContext &ctx, const std::vector< HGTD::Cluster< const xAOD::TrackParticle * > > &clusters, const xAOD::Vertex *vertex) const
bool passTrackVertexAssociation(const xAOD::TrackParticle *track, const xAOD::Vertex *vertex, double min_trk_pt, const double significance_cut=2.5) const
std::vector< HGTD::Cluster< const xAOD::TrackParticle * > > clusterTracksInTime(const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &tracks, double cluster_distance) const
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_vxTimeRes_key
VertexTimeAlg(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< float > m_default_vxTimeRes
float scoreCluster(const EventContext &ctx, const HGTD::Cluster< const xAOD::TrackParticle * > &cluster, const xAOD::Vertex *vertex) const
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_trackValidTime_key
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_trackTime_key
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_vxHasTime_key
StatusCode initialize() override final
float getSumPt2OfCluster(const HGTD::Cluster< const xAOD::TrackParticle * > &cluster) const
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_trackTimeRes_key
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_vxTime_key
StatusCode execute(const EventContext &ctx) const override final
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
Handle class for reading a decoration on an object.
const_pointer_type cptr()
Dereference the pointer.
Handle class for adding a decoration to an object.
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".