41 for (
auto& bdt : m_BDT) {
43 bdt.reader = std::make_unique<TMVA::Reader>(
"!Color:!Silent");
45 bdt.reader->AddVariable(
"m_delta_z", &bdt.delta_z);
46 bdt.reader->AddVariable(
"m_z_sigma", &bdt.z_sigma);
47 bdt.reader->AddVariable(
"m_q_over_p", &bdt.q_over_p);
48 bdt.reader->AddVariable(
"m_q_over_p_sigma", &bdt.q_over_p_sigma);
49 bdt.reader->AddVariable(
"m_delta_z_resunits", &bdt.delta_z_resunits);
50 bdt.reader->AddVariable(
"m_cluster_sumpt2", &bdt.cluster_sumpt2);
51 bdt.reader->AddVariable(
"m_d0", &bdt.d0);
52 bdt.reader->AddVariable(
"m_d0_sigma", &bdt.d0_sigma);
54 const std::string weightFile {
58 bdt.reader->BookMVA(
"BDT", weightFile);
61 return StatusCode::SUCCESS;
77 for (
const auto vx : *primVxCont) {
81 std::vector<const xAOD::TrackParticle*> hgtdTracks {
85 std::vector<HGTD::Cluster<const xAOD::TrackParticle*>> trackClusters {
98 vxTime(*vx) = HS_cluster.
getValues().at(0);
99 vxTimeRes(*vx) = HS_cluster.
getSigmas().at(0);
118 return StatusCode::SUCCESS;
121std::vector<const xAOD::TrackParticle*>
124 double min_trk_pt)
const {
126 std::vector<const xAOD::TrackParticle*> good_tracks { };
128 for (
const auto trk : *tracks) {
129 if (std::abs(trk->eta()) < 2.4 || std::abs(trk->eta()) > 4.0) {
133 if (trk->pt() < 1.0 * Gaudi::Units::GeV) {
137 good_tracks.push_back(trk);
146 double min_trk_pt,
const double significance_cut)
const {
148 if (track->pt() < min_trk_pt || std::abs(track->eta()) > 4.0) {
152 const double vx_z { vertex->z() };
153 const double vx_z_variance { vertex->covariancePosition()(2, 2) };
155 const double trk_z { track->vz() + track->z0() };
156 const double trk_z_variance { track->definingParametersCovMatrix()(1, 1) };
158 if (std::abs(trk_z - vx_z) / std::sqrt(trk_z_variance + vx_z_variance)
159 < significance_cut) {
166std::vector<HGTD::Cluster<const xAOD::TrackParticle*>>
168 const EventContext& ctx,
169 const std::vector<const xAOD::TrackParticle*>& tracks,
170 double cluster_distance)
const {
184 for (
const auto& track : tracks) {
186 if (trackValidTime(*track)) {
187 double time { trackTime(*track) };
188 double timeResolution { trackTimeResolution(*track) };
191 {time}, {timeResolution}, track);
204 const EventContext& ctx,
209 float max_BDT_score { -1.0f };
211 for (
const auto& cluster : clusters) {
214 if (cluster.getEntries().size() < 3) {
218 const float cluster_score {
scoreCluster(ctx, cluster, vertex) };
220 if (cluster_score >
m_bdt_cutvalue && cluster_score > max_BDT_score) {
222 max_BDT_score = cluster_score;
223 HS_cluster = cluster;
233 const EventContext& ctx,
237 std::pair<float, float> cluster_z {
getZOfCluster(cluster) };
239 std::pair<float, float> cluster_d0 {
getDOfCluster(cluster) };
240 double vertex_z_variance { vertex->covariancePosition()(2, 2) };
242 auto& bdt { *m_BDT.get(ctx) };
244 bdt.delta_z = cluster_z.first - vertex->z();
245 bdt.z_sigma = cluster_z.second;
246 bdt.q_over_p = cluster_oneover_p.first;
247 bdt.q_over_p_sigma = cluster_oneover_p.second;
248 bdt.d0 = cluster_d0.first;
249 bdt.d0_sigma = cluster_d0.second;
251 bdt.delta_z_resunits = (cluster_z.first - vertex->z()) /
252 std::sqrt(std::pow(cluster_z.second, 2.0) + vertex_z_variance);
254 return bdt.reader->EvaluateMVA(
"BDT");
260 std::vector<const xAOD::TrackParticle*> tracks { cluster.
getEntries() };
263 float denom { 0.0f };
265 for (
const auto& track : tracks) {
267 float z0 { track->z0() };
269 static_cast<float>(track->definingParametersCovMatrix()(1, 1))
272 num += z0 / z0_variance;
273 denom += 1.0f / z0_variance;
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 float avg_oneover_p = num / denom;
302 float avg_oneover_p_sigma = std::sqrt(1.0f / denom);
304 return {avg_oneover_p, avg_oneover_p_sigma};
310 std::vector<const xAOD::TrackParticle*> tracks { cluster.
getEntries() };
313 float denom { 0.0f };
315 for (
const auto& track : tracks) {
317 float d0 { track->d0() };
319 static_cast<float>(track->definingParametersCovMatrix()(0, 0))
322 num += d0 / d0_variance;
323 denom += 1.0f / d0_variance;
326 float avg_z0 = num / denom;
327 float avg_z0_sigma = std::sqrt(1.0f / denom);
329 return {avg_z0, avg_z0_sigma};
335 std::vector<const xAOD::TrackParticle*> tracks { cluster.
getEntries() };
337 float sumpt2 { 0.0f };
339 for (
const auto& track : tracks) {
340 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
const std::vector< T > & getEntries() const
Return the objects that are part of the Cluster.
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.
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-2025 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".