Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
DecoratePLIT.cxx
Go to the documentation of this file.
1 // This is -*- c++ -*-
2 
3 /*
4  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5 */
6 
11 
12 
13 namespace Prompt {
14 
15  DecoratePLIT::DecoratePLIT(const std::string &name, ISvcLocator *pSvcLocator)
16  : AthReentrantAlgorithm(name, pSvcLocator)
17  {}
18 
20  ATH_MSG_DEBUG("Initializing DecoratePLIT " << name() );
21  ATH_MSG_DEBUG("m_leptonsName = " << m_leptonsName);
22 
23  ATH_MSG_DEBUG("Initializing " << m_electronsKey);
24  ATH_MSG_DEBUG("Initializing " << m_muonsKey);
25  ATH_MSG_DEBUG("Initializing " << m_trackjetsKey);
26  ATH_MSG_DEBUG("Initializing " << m_tracksKey);
27  ATH_MSG_DEBUG("Initializing " << m_caloclustersKey);
28 
34 
35  // initialise accessors
37 
38  // Load and initialize the neural network model from the given file path.
39  if(m_leptonsName == "Electrons") {
40  std::string fullPathToOnnxFile = PathResolverFindCalibFile(m_configPath.value() + m_configFileVersion.value());
41  m_saltModel = std::make_shared<FlavorTagInference::SaltModel>(fullPathToOnnxFile);
42 
43  std::string fullPathToOnnxFile_endcap = PathResolverFindCalibFile(m_configPath.value() + m_configFileVersion_endcap.value());
44  m_saltModel_endcap = std::make_shared<FlavorTagInference::SaltModel>(fullPathToOnnxFile_endcap);
45 
48 
49  // set up decorators using a dummy query of the onnx model
50  std::map<std::string, FlavorTagInference::Inputs> gnn_input;
51 
52  std::vector<float> elec_feat(m_num_lepton_features, 0.);
53  std::vector<int64_t> elec_feat_dim = {1, static_cast<int64_t>(elec_feat.size())};
54  FlavorTagInference::Inputs elec_info (elec_feat, elec_feat_dim);
55  gnn_input.insert({"jet_features", elec_info}); // need to use the "jet_features" keyword as we are borrowing flavour tagging code
56 
57  std::vector<float> track_feat(m_num_track_features, 0.);
58  std::vector<int64_t> track_feat_dim = {1, m_num_track_features};
59  FlavorTagInference::Inputs track_info(track_feat, track_feat_dim);
60  gnn_input.insert({"track_features", track_info});
61 
62  auto [out_f, out_vc, out_vf] = m_saltModel->runInference(gnn_input); // the dummy evaluation
63 
64  std::vector<std::string> output_names;
65  for (auto& singlefloat : out_f){
66  ATH_MSG_DEBUG("Found Electron output: "+singlefloat.first);
67  std::string outname = m_electronsKey.key()+"." + m_TaggerName + "_" + (singlefloat.first.find("elxpromp") != std::string::npos ? "PLITel_pelxpromp" : "PLITel_pnpxall" );
68  ATH_MSG_DEBUG("Decorating as "+outname);
69  output_names.push_back(outname);
70  }
71  ATH_CHECK(m_dec_el_plit_output.assign(output_names));
72  ATH_CHECK(m_dec_el_plit_output.initialize());
73  }
74  else if (m_leptonsName == "Muons") {
75  std::string fullPathToOnnxFile = PathResolverFindCalibFile(m_configPath.value() + m_configFileVersion.value());
76  m_saltModel = std::make_shared<FlavorTagInference::SaltModel>(fullPathToOnnxFile);
77 
80 
81  // set up decorators using a dummy query of the onnx model
82  std::map<std::string, FlavorTagInference::Inputs> gnn_input;
83 
84  std::vector<float> muon_feat(m_num_lepton_features, 0.);
85  std::vector<int64_t> muon_feat_dim = {1, static_cast<int64_t>(muon_feat.size())};
86  FlavorTagInference::Inputs muon_info (muon_feat, muon_feat_dim);
87  gnn_input.insert({"jet_features", muon_info}); // need to use the "jet_features" keyword as we are borrowing flavour tagging code
88 
89  std::vector<float> track_feat(m_num_track_features, 0.);
90  std::vector<int64_t> track_feat_dim = {1, m_num_track_features};
91  FlavorTagInference::Inputs track_info(track_feat, track_feat_dim);
92  gnn_input.insert({"track_features", track_info});
93 
94  auto [out_f, out_vc, out_vf] = m_saltModel->runInference(gnn_input); // the dummy evaluation
95 
96  std::vector<std::string> output_names;
97  for (auto& singlefloat : out_f){
98  ATH_MSG_DEBUG("Found Muon output: "+singlefloat.first);
99  std::string outname = m_muonsKey.key()+"." + m_TaggerName + "_" + (singlefloat.first.find("muxpromp") != std::string::npos ? "TPLTmu_pmuxpromp" : "TPLTmu_pnpxall" );
100  ATH_MSG_DEBUG("Decorating as "+outname);
101  output_names.push_back(outname);
102  }
103  ATH_CHECK(m_dec_mu_plit_output.assign(output_names));
104  ATH_CHECK(m_dec_mu_plit_output.initialize());
105  }
106  else {
107  ATH_MSG_ERROR(" ==> topology is not recognised! aborting.");
108  return StatusCode::FAILURE;
109  }
110 
111  ATH_MSG_INFO("DecoratePLIT " << name() << " initialization done." );
112 
113  return StatusCode::SUCCESS;
114  }
115 
116  StatusCode DecoratePLIT::execute(const EventContext& ctx) const {
119 
120  // Make sure all the decorations are added as long as tracks exist.
121  if (!tracks->empty()) {
126  }
127 
128  if (!m_electronsKey.empty()) {
129  // prepare decorators
130  // ------------------
131  std::vector<SG::WriteDecorHandle<xAOD::ElectronContainer, float>> dec_el_plit_output;
132  for (const auto& wdhk: m_dec_el_plit_output) {
133  dec_el_plit_output.emplace_back(wdhk, ctx);
134  }
136  for (const xAOD::Electron* elec : *electrons) {
137  if (!predictElec(*elec, *tracks, *caloclusters, dec_el_plit_output, ctx)) {
138  ATH_MSG_ERROR("DecoratePLIT::execute - failed to predict electron");
139  return StatusCode::FAILURE;
140  }
141  }
142  } else if (!m_muonsKey.empty()) {
143  // prepare decorators
144  // ------------------
145  std::vector<SG::WriteDecorHandle<xAOD::MuonContainer, float>> dec_mu_plit_output;
146  for (const auto& wdhk: m_dec_mu_plit_output) {
147  dec_mu_plit_output.emplace_back(wdhk, ctx);
148  }
150  for (const xAOD::Muon* muon : *muons) {
151  if (!predictMuon(*muon, *tracks, dec_mu_plit_output, ctx)) {
152  ATH_MSG_ERROR("DecoratePLIT::execute - failed to predict muon");
153  return StatusCode::FAILURE;
154  }
155  }
156  }
157 
158  return StatusCode::SUCCESS;
159  }
160 
162 
165 
168 
169  ATH_CHECK(m_acc_trk_dr_lepton.initialize());
170  ATH_CHECK(m_acc_trk_dr_leptontrack.initialize());
171  ATH_CHECK(m_acc_trk_d0.initialize());
172  ATH_CHECK(m_acc_trk_z0SinTheta.initialize());
173  ATH_CHECK(m_acc_trk_d0Uncertainty.initialize());
175  ATH_CHECK(m_acc_trk_muon_track.initialize());
176  ATH_CHECK(m_acc_trk_electron_track.initialize());
177 
178  return StatusCode::SUCCESS;
179  }
180 
182  const xAOD::Muon &muon,
183  const xAOD::TrackParticleContainer &tracks,
184  std::vector<SG::WriteDecorHandle<xAOD::MuonContainer, float>> &dec_mu_plit_output,
185  const EventContext& ctx) const {
186  // set up accessors
187  // ---------------
190 
198 
199  // prepare input
200  // -------------
201  std::map<std::string, FlavorTagInference::Inputs> gnn_input;
202 
203  // collect muon features
204  float muon_pt = muon.pt();
205  float muon_eta = muon.eta();
206  float muon_phi = muon.phi();
207 
208  float muon_ptvarcone30TTVARel = acc_ptvarcone30TTVA(muon) / muon_pt;
209  float muon_topoetcone30Rel = acc_topoetcone30(muon) / muon_pt;
210 
211  float muon_caloClusterERel = -99;
212  const xAOD::CaloCluster* cluster = muon.cluster();
213  if (cluster) {
214  float energyloss = 0;
215  if (!muon.parameter(energyloss,xAOD::Muon::MeasEnergyLoss)) {
216  ATH_MSG_WARNING("DecoratePLIT::execute - failed to retrieve energy loss");
217  return StatusCode::FAILURE;
218  }
219  float calE = cluster->calE();
220  if (std::abs(energyloss) > 0)
221  muon_caloClusterERel = calE / energyloss;
222  }
223 
224  // package muon features for inference
225  std::vector<float> muon_feat = {
226  muon_pt,
227  muon_eta,
228  muon_phi,
229  muon_ptvarcone30TTVARel,
230  muon_topoetcone30Rel,
231  muon_caloClusterERel};
232  std::vector<int64_t> muon_feat_dim = {1, static_cast<int64_t>(muon_feat.size())};
233 
234  // need to use the "jet_features" keyword as we are borrowing flavour tagging code
235  FlavorTagInference::Inputs muon_info (muon_feat, muon_feat_dim);
236  gnn_input.insert({"jet_features", muon_info});
237 
238  // decorate and fill track particles around the muon
239  const xAOD::TrackParticle *muonTrack = muon.primaryTrackParticle();
240  std::vector<const xAOD::IParticle *> parts;
241 
242  if(!fillParticles(parts, muon, muonTrack, tracks, ctx)) {
243  ATH_MSG_ERROR("DecoratePLIT::execute - failed to fill particles");
244  return StatusCode::FAILURE;
245  }
246 
247  // extract track features from track particles
248  std::vector<float> track_feat;
249  track_feat.reserve(parts.size() * static_cast<int64_t>(muon_feat.size()));
250 
251  // loop over parts and fill track_feat vector
252  for (const xAOD::IParticle *part: parts) {
253  const xAOD::TrackParticle *track = dynamic_cast<const xAOD::TrackParticle*>(part);
254 
255  // deta_lepton
256  float deta_lepton = track->p4().Eta() - muon.eta();
257  // dphi_lepton
258  float dphi_lepton = track->p4().DeltaPhi(muon.p4());
259  // qOverP
260  float qoverp = track->qOverP();
261  // btagIp_d0
262  float d0 = acc_d0(*track);
263  // btagIp_z0SinTheta
264  float z0SinTheta = acc_z0SinTheta(*track);
265  // btagIp_d0Uncertainty
266  float d0Uncertainty = acc_d0Uncertainty(*track);
267  // btagIp_z0SinThetaUncertainty
268  float z0SinThetaUncertainty = acc_z0SinThetaUncertainty(*track);
269  // btagIp_d0_significance
270  float d0_significance = -99;
271  if (abs(d0Uncertainty) > 0) d0_significance = d0 / d0Uncertainty;
272  // btagIp_z0SinTheta_significance
273  float z0SinTheta_significance = -99;
274  if (std::abs(z0SinThetaUncertainty) > 0) z0SinTheta_significance = z0SinTheta / z0SinThetaUncertainty;
275  // numberOfPixelHits
276  uint8_t pix_hits = 0;
277  if(!track->summaryValue(pix_hits,xAOD::numberOfPixelHits)){
278  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
279  return StatusCode::FAILURE;
280  }
281  // numberOfInnermostPixelLayerHits
282  uint8_t pix_innermosthits = 0;
283  if(!track->summaryValue(pix_innermosthits,xAOD::numberOfInnermostPixelLayerHits)){
284  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
285  return StatusCode::FAILURE;
286  }
287  // numberOfNextToInnermostPixelLayerHits
288  uint8_t pix_nextinnermosthits = 0;
289  if(!track->summaryValue(pix_nextinnermosthits,xAOD::numberOfNextToInnermostPixelLayerHits)){
290  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
291  return StatusCode::FAILURE;
292  }
293  // numberOfInnermostPixelLayerSharedHits
294  uint8_t pix_innermostsharedhits = 0;
295  if(!track->summaryValue(pix_innermostsharedhits,xAOD::numberOfInnermostPixelLayerSharedHits)){
296  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
297  return StatusCode::FAILURE;
298  }
299  // numberOfInnermostPixelLayerSplitHits
300  uint8_t pix_innermostsplithits = 0;
301  if(!track->summaryValue(pix_innermostsplithits,xAOD::numberOfInnermostPixelLayerSplitHits)){
302  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
303  return StatusCode::FAILURE;
304  }
305  // numberOfPixelSharedHits
306  uint8_t pix_shared = 0;
307  if(!track->summaryValue(pix_shared,xAOD::numberOfPixelSharedHits)){
308  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
309  return StatusCode::FAILURE;
310  }
311  // numberOfPixelSplitHits
312  uint8_t pix_split = 0;
313  if(!track->summaryValue(pix_split,xAOD::numberOfPixelSplitHits)){
314  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
315  return StatusCode::FAILURE;
316  }
317  // numberOfSCTHits
318  uint8_t sct_hits = 0;
319  if(!track->summaryValue(sct_hits,xAOD::numberOfSCTHits)){
320  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
321  return StatusCode::FAILURE;
322  }
323  // numberOfSCTSharedHits
324  uint8_t sct_shared = 0;
325  if(!track->summaryValue(sct_shared,xAOD::numberOfSCTSharedHits)){
326  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
327  return StatusCode::FAILURE;
328  }
329  // muon_track
330  char muon_track = acc_muon_track(*track);
331 
332  track_feat.push_back(deta_lepton);
333  track_feat.push_back(dphi_lepton);
334  track_feat.push_back(qoverp);
335  track_feat.push_back(d0);
336  track_feat.push_back(z0SinTheta);
337  //track_feat.push_back(d0Uncertainty); // removed in the latest trainings, redundant
338  //track_feat.push_back(z0SinThetaUncertainty); // removed in the latest trainings, redundant
339  track_feat.push_back(d0_significance);
340  track_feat.push_back(z0SinTheta_significance);
341  track_feat.push_back(pix_hits);
342  track_feat.push_back(pix_innermosthits);
343  track_feat.push_back(pix_nextinnermosthits);
344  track_feat.push_back(pix_innermostsharedhits);
345  track_feat.push_back(pix_innermostsplithits);
346  track_feat.push_back(pix_shared);
347  track_feat.push_back(pix_split);
348  track_feat.push_back(sct_hits);
349  track_feat.push_back(sct_shared);
350  track_feat.push_back(muon_track);
351  }
352 
353  // prepare track features for inference
354  int num_cnsts = parts.size();
355  std::vector<int64_t> track_feat_dim = {num_cnsts, m_num_track_features};
356 
357  FlavorTagInference::Inputs track_info(track_feat, track_feat_dim);
358  gnn_input.insert({"track_features", track_info});
359 
360  if (msgLvl(MSG::VERBOSE)) {
361  ATH_MSG_VERBOSE("gnn_input size = " << gnn_input.size());
362  for (auto& inp : gnn_input){
363  ATH_MSG_VERBOSE(" " + inp.first + " dim = ");
364  for (auto & dim: inp.second.second) {
366  }
367  ATH_MSG_VERBOSE(" " + inp.first + " content = ");
368  for (auto & con: inp.second.first) {
369  ATH_MSG_VERBOSE(" " + std::to_string(con));
370  }
371  }
372  }
373 
374  // run inference
375  // -------------
376  auto [out_f, out_vc, out_vf] = m_saltModel->runInference(gnn_input);
377  if (msgLvl(MSG::VERBOSE)) {
378  ATH_MSG_VERBOSE("runInference done.");
379 
380  ATH_MSG_VERBOSE("Output Float(s):");
381  for (auto& singlefloat : out_f){
382  ATH_MSG_VERBOSE(singlefloat.first + " = " << singlefloat.second);
383  }
384  ATH_MSG_VERBOSE("Output vector char(s):");
385  for (auto& vecchar : out_vc){
386  ATH_MSG_VERBOSE(vecchar.first + " = ");
387  for (auto& cc : vecchar.second){
389  }
390  }
391  ATH_MSG_VERBOSE("Output vector float(s):");
392  for (auto& vecfloat : out_vf){
393  ATH_MSG_VERBOSE(vecfloat.first + " = ");
394  for (auto& ff : vecfloat.second){
396  }
397  }
398  }
399  // filling the tagger scores
400  auto it_dec_mu_plit_output = dec_mu_plit_output.begin();
401  for (auto& singlefloat : out_f){
402  (*it_dec_mu_plit_output)(muon) = singlefloat.second;
403  ++it_dec_mu_plit_output;
404  }
405 
406  return StatusCode::SUCCESS;
407  }
408 
410  const xAOD::Electron &electron,
411  const xAOD::TrackParticleContainer &tracks,
412  const xAOD::CaloClusterContainer &caloclusters,
413  std::vector<SG::WriteDecorHandle<xAOD::ElectronContainer, float>> &dec_el_plit_output,
414  const EventContext& ctx) const {
415  // prepare input
416  // -------------
417  std::map<std::string, FlavorTagInference::Inputs> gnn_input;
418 
419  // accessors
420  // ---------
423 
431 
432  // collect electron features
433  float elec_pt = electron.pt();
434  float elec_eta = electron.eta();
435  float elec_phi = electron.phi();
436  float elec_ptvarcone30Rel = acc_ptvarcone30(electron) / elec_pt;
437  float elec_topoetcone30Rel = acc_topoetcone30(electron) / elec_pt;
438 
439  // compute electron calorimeter cluster information
440  float elec_caloClusterSumEtRel = 0.0;
441  float sumCoreEt_large = 0.0;
442  if (electron.caloCluster()) {
443  float elec_calEta = electron.caloCluster()->eta();
444  float elec_calPhi = electron.caloCluster()->phi();
445 
446  for (const xAOD::CaloCluster *cluster: caloclusters) {
447  float deta = elec_calEta - cluster->eta();
448  float dphi = TVector2::Phi_mpi_pi(elec_calPhi - cluster->phi());
449  float dr = std::sqrt(deta*deta + dphi*dphi);
450 
451  if (dr < m_lepCalErelConeSize) {
452  sumCoreEt_large += cluster->pt();
453  }
454  }
455  }
456  elec_caloClusterSumEtRel = sumCoreEt_large / elec_pt;
457 
458  // collect best matched GSF electron track kinematics
459  const xAOD::TrackParticle *electronTrack = nullptr;
460  const xAOD::TrackParticle *bestmatchedGSFElTrack = electron.trackParticle(0);
461  if (bestmatchedGSFElTrack) {
462  electronTrack = xAOD::EgammaHelpers::getOriginalTrackParticleFromGSF(bestmatchedGSFElTrack);
463  }
464 
465  //float elec_pt_track = -99;
466  //float elec_eta_track = -99;
467  //float elec_phi_track = -99;
468  //if (electronTrack) {
469  // elec_pt_track = electronTrack->pt();
470  // elec_eta_track = electronTrack->eta();
471  // elec_phi_track = electronTrack->phi();
472  //}
473 
474  std::vector<float> electron_feat = {
475  elec_pt,
476  elec_eta,
477  elec_phi,
478  elec_ptvarcone30Rel,
479  elec_topoetcone30Rel,
480  elec_caloClusterSumEtRel};
481  std::vector<int64_t> electron_feat_dim = {1, static_cast<int64_t>(electron_feat.size())};
482 
483  // need to use the "jet_features" keyword as we are borrowing flavour tagging code
484  FlavorTagInference::Inputs electron_info (electron_feat, electron_feat_dim);
485  gnn_input.insert({"jet_features", electron_info});
486 
487  // decorate and fill track particles around the electron
488  std::vector<const xAOD::IParticle *> parts;
489  if (!fillParticles(parts, electron, electronTrack, tracks, ctx)) {
490  ATH_MSG_ERROR("DecoratePLIT::execute - failed to fill particles");
491  return StatusCode::FAILURE;
492  }
493 
494  // collect track features from track particles
495  std::vector<float> track_feat;
496  track_feat.reserve(parts.size() * static_cast<int64_t>(electron_feat.size()));
497 
498  for (const xAOD::IParticle *part: parts) {
499  const xAOD::TrackParticle *track = dynamic_cast<const xAOD::TrackParticle*>(part);
500  if (!track) {
501  ATH_MSG_ERROR("DecoratePLIT::execute - null track pointer");
502  continue;
503  }
504 
505  // dr_lepton
506  // float dr_lepton = acc_dr_lepton(*track);
507  // deta_lepton
508  float deta_lepton = track->p4().Eta() - electron.eta();
509  // dphi_lepton
510  float dphi_lepton = track->p4().DeltaPhi(electron.p4());
511  // qOverP
512  float qoverp = track->qOverP();
513  // btagIp_d0
514  float d0 = acc_d0(*track);
515  // btagIp_z0SinTheta
516  float z0SinTheta = acc_z0SinTheta(*track);
517  // btagIp_d0_significance
518  float d0Uncertainty = acc_d0Uncertainty(*track);
519  float d0_significance = -99;
520  if (std::abs(d0Uncertainty) > 0) d0_significance = d0 / d0Uncertainty;
521  // btagIp_z0SinTheta_significance
522  float z0SinThetaUncertainty = acc_z0SinThetaUncertainty(*track);
523  float z0SinTheta_significance = -99;
524  if (std::abs(z0SinThetaUncertainty) > 0) z0SinTheta_significance = z0SinTheta / z0SinThetaUncertainty;
525  // numberOfInnermostPixelLayerHits
526  uint8_t pix_innermosthits = 0;
527  if(!track->summaryValue(pix_innermosthits,xAOD::numberOfInnermostPixelLayerHits)){
528  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerHits");
529  return StatusCode::FAILURE;
530  }
531  // numberOfNextToInnermostPixelLayerHits
532  uint8_t pix_nextinnermosthits = 0;
533  if(!track->summaryValue(pix_nextinnermosthits,xAOD::numberOfNextToInnermostPixelLayerHits)){
534  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfNextToInnermostPixelLayerHits");
535  return StatusCode::FAILURE;
536  }
537  // numberOfInnermostPixelLayerSharedHits
538  uint8_t pix_innermostsharedhits = 0;
539  if(!track->summaryValue(pix_innermostsharedhits,xAOD::numberOfInnermostPixelLayerSharedHits)){
540  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSharedHits");
541  return StatusCode::FAILURE;
542  }
543  // numberOfInnermostPixelLayerSplitHits
544  uint8_t pix_innermostsplithits = 0;
545  if(!track->summaryValue(pix_innermostsplithits,xAOD::numberOfInnermostPixelLayerSplitHits)){
546  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfInnermostPixelLayerSplitHits");
547  return StatusCode::FAILURE;
548  }
549  // numberOfPixelHits
550  uint8_t pix_hits = 0;
551  if(!track->summaryValue(pix_hits,xAOD::numberOfPixelHits)){
552  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelHits");
553  return StatusCode::FAILURE;
554  }
555  // numberOfPixelSharedHits
556  uint8_t pix_shared = 0;
557  if(!track->summaryValue(pix_shared,xAOD::numberOfPixelSharedHits)){
558  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSharedHits");
559  return StatusCode::FAILURE;
560  }
561  // numberOfPixelSplitHits
562  uint8_t pix_split = 0;
563  if(!track->summaryValue(pix_split,xAOD::numberOfPixelSplitHits)){
564  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfPixelSplitHits");
565  return StatusCode::FAILURE;
566  }
567  // numberOfSCTHits
568  uint8_t sct_hits = 0;
569  if(!track->summaryValue(sct_hits,xAOD::numberOfSCTHits)){
570  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTHits");
571  return StatusCode::FAILURE;
572  }
573  // numberOfSCTSharedHits
574  uint8_t sct_shared = 0;
575  if(!track->summaryValue(sct_shared,xAOD::numberOfSCTSharedHits)){
576  ATH_MSG_ERROR("DecoratePLIT::execute - failed to retrieve xAOD::numberOfSCTSharedHits");
577  return StatusCode::FAILURE;
578  }
579  // electron_track
580  char electron_track = acc_electron_track(*track);
581 
582 
583  //track_feat.push_back(dr_lepton); // removed in the latest trainings, redundan
584  track_feat.push_back(deta_lepton);
585  track_feat.push_back(dphi_lepton);
586  track_feat.push_back(qoverp);
587  track_feat.push_back(d0);
588  track_feat.push_back(z0SinTheta);
589  track_feat.push_back(d0_significance);
590  track_feat.push_back(z0SinTheta_significance);
591  track_feat.push_back(pix_innermosthits);
592  track_feat.push_back(pix_nextinnermosthits);
593  track_feat.push_back(pix_innermostsharedhits);
594  track_feat.push_back(pix_innermostsplithits);
595  track_feat.push_back(pix_hits);
596  track_feat.push_back(pix_shared);
597  track_feat.push_back(pix_split);
598  track_feat.push_back(sct_hits);
599  track_feat.push_back(sct_shared);
600  track_feat.push_back(electron_track);
601  }
602 
603  // prepare track features for inference
604  int num_cnsts = parts.size();
605  std::vector<int64_t> track_feat_dim = {num_cnsts, m_num_track_features};
606 
607  FlavorTagInference::Inputs track_info (track_feat, track_feat_dim);
608  gnn_input.insert({"track_features", track_info});
609 
610  if (msgLvl(MSG::VERBOSE)) {
611  ATH_MSG_VERBOSE("gnn_input size = " << gnn_input.size());
612  for (auto& inp : gnn_input){
613  ATH_MSG_VERBOSE(" " + inp.first + " dim = ");
614  for (auto & dim: inp.second.second) {
616  }
617  ATH_MSG_VERBOSE(" " + inp.first + " content = ");
618  for (auto & con: inp.second.first) {
619  ATH_MSG_VERBOSE(" " + std::to_string(con));
620  }
621  }
622  }
623 
624  // run inference
625  // -------------
626  // use different model for endcap electrons
627  auto [out_f, out_vc, out_vf] = (std::abs(elec_eta) < 1.37) ? m_saltModel->runInference(gnn_input) : m_saltModel_endcap->runInference(gnn_input);
628  if (msgLvl(MSG::VERBOSE)) {
629  ATH_MSG_VERBOSE("runInference done.");
630 
631  ATH_MSG_VERBOSE("Output Float(s):");
632  for (auto& singlefloat : out_f){
633  ATH_MSG_VERBOSE(singlefloat.first + " = " << singlefloat.second);
634  }
635  ATH_MSG_VERBOSE("Output vector char(s):");
636  for (auto& vecchar : out_vc){
637  ATH_MSG_VERBOSE(vecchar.first + " = ");
638  for (auto& cc : vecchar.second){
640  }
641  }
642  ATH_MSG_VERBOSE("Output vector float(s):");
643  for (auto& vecfloat : out_vf){
644  ATH_MSG_VERBOSE(vecfloat.first + " = ");
645  for (auto& ff : vecfloat.second){
647  }
648  }
649  }
650  // filling the tagger scores
651  auto it_dec_el_plit_output = dec_el_plit_output.begin();
652  for (auto& singlefloat : out_f){
653  (*it_dec_el_plit_output)(electron) = singlefloat.second;
654  ++it_dec_el_plit_output;
655  }
656 
657  return StatusCode::SUCCESS;
658  }
659 
660  bool DecoratePLIT::passed_r22tracking_cuts(const xAOD::TrackParticle& tp, const EventContext& ctx) const
661  {
662  // r22 default track selection for flavour tagging GN2 algorithm
663  constexpr float pt_minimum = 500; // MeV
664  constexpr float abs_eta_maximum = 2.5;
665  constexpr float d0_maximum = 3.5;
666  constexpr float z0_maximum= 5.0;
667  constexpr unsigned char si_hits_minimum = 8;
668  constexpr unsigned char si_shared_maximum = 1;
669  constexpr unsigned char si_holes_maximum = 2;
670  constexpr unsigned char pix_holes_maximum = 1;
671 
672  // accessors
675 
676  // get hit pixel info
677  uint8_t pix_shared = 0;
678  if(!tp.summaryValue(pix_shared,xAOD::numberOfPixelSharedHits)){
679  ATH_MSG_ERROR("DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelSharedHits");
680  return false;
681  }
682  uint8_t sct_shared = 0;
683  if(!tp.summaryValue(sct_shared,xAOD::numberOfSCTSharedHits)){
684  ATH_MSG_ERROR("DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTSharedHits");
685  return false;
686  }
687  uint8_t pix_hits = 0;
688  if(!tp.summaryValue(pix_hits,xAOD::numberOfPixelHits)){
689  ATH_MSG_ERROR("DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelHits");
690  return false;
691  }
692  uint8_t sct_hits = 0;
693  if(!tp.summaryValue(sct_hits,xAOD::numberOfSCTHits)){
694  ATH_MSG_ERROR("DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTHits");
695  return false;
696  }
697  uint8_t pix_dead = 0;
698  if(!tp.summaryValue(pix_dead,xAOD::numberOfPixelDeadSensors)){
699  ATH_MSG_ERROR("DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelDeadSensors");
700  return false;
701  }
702  uint8_t sct_dead = 0;
703  if(!tp.summaryValue(sct_dead,xAOD::numberOfSCTDeadSensors)){
704  ATH_MSG_ERROR("DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTDeadSensors");
705  return false;
706  }
707  uint8_t pix_holes = 0;
708  if(!tp.summaryValue(pix_holes,xAOD::numberOfPixelHoles)){
709  ATH_MSG_ERROR("DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfPixelHoles");
710  return false;
711  }
712  uint8_t sct_holes = 0;
713  if(!tp.summaryValue(sct_holes,xAOD::numberOfSCTHoles)){
714  ATH_MSG_ERROR("DecoratePLIT::passed_r22tracking_cuts - failed to retrieve xAOD::numberOfSCTHoles");
715  return false;
716  }
717 
718  if (std::abs(tp.eta()) > abs_eta_maximum)
719  return false;
720  double n_module_shared = (pix_shared + sct_shared / 2);
721  if (n_module_shared > si_shared_maximum)
722  return false;
723  if (tp.pt() <= pt_minimum)
724  return false;
725  if (std::isfinite(d0_maximum) &&
726  std::abs(acc_d0(tp)) >= d0_maximum)
727  return false;
728  if (std::isfinite(z0_maximum) &&
729  std::abs(acc_z0SinTheta(tp)) >= z0_maximum)
730  return false;
731  if (pix_hits + pix_dead + sct_hits + sct_dead < si_hits_minimum)
732  return false;
733  if ((pix_holes + sct_holes) > si_holes_maximum)
734  return false;
735  if (pix_holes > pix_holes_maximum)
736  return false;
737  return true;
738  }
739 
741  std::vector<const xAOD::IParticle *> &parts,
742  const xAOD::IParticle &lepton,
743  const xAOD::TrackParticle *trackLep,
745  const EventContext& ctx) const
746  {
747  // get lepton four momentum
748  const FourMom_t lepton_p4 = lepton.p4();
749 
750  // Precompute tracks used for reconstruction
751  std::set<const xAOD::TrackParticle*> tracksUsedForElectron;
752  std::set<const xAOD::TrackParticle*> tracksUsedForMuon;
753  if (const auto* elec = dynamic_cast<const xAOD::Electron*>(&lepton)) {
754  tracksUsedForElectron = xAOD::EgammaHelpers::getTrackParticles(elec, true); // useBremAssoc = true
755  } else if (const auto* muon = dynamic_cast<const xAOD::Muon*>(&lepton)) {
756  if (muon->muonType() == xAOD::Muon::Combined && muon->inDetTrackParticleLink().isValid()) {
757  tracksUsedForMuon.insert(muon->primaryTrackParticle()); // in the case of a muon, this is always 1 only
758  }
759  }
760 
761  // Loop over tracks and store them
762  for (const xAOD::TrackParticle *track: trackContainer) {
763  if (!track) {
764  ATH_MSG_ERROR("DecoratePLIT::fillParticles - null track pointer");
765  continue;
766  }
767  // check if track passed selection
768  if (!passed_r22tracking_cuts(*track, ctx)) continue;
769 
770  // decorate track
771  float dr_lepton = (lepton.p4().Pt() > 0.) ? track->p4().DeltaR(lepton.p4()) : -99;
772 
773  // do not even waste time to decorate something which is not used
774  if (dr_lepton > m_maxLepTrackdR && m_maxLepTrackdR>=0) {continue;}
775 
776  bool isUsedForElectron = tracksUsedForElectron.count(track);
777  bool isUsedForMuon = tracksUsedForMuon.count(track);
778 
779  if (!decorateTrack(*track, dr_lepton, isUsedForElectron, isUsedForMuon, trackLep)) {
780  ATH_MSG_ERROR("DecoratePLIT::fillParticles - failed to decorate track");
781  return StatusCode::FAILURE;
782  }
783 
784  parts.push_back(track);
785  }
786 
787  // Sort tracks by dR distance to lepton
788  auto SORT_TRACKLEP = [&lepton_p4](const xAOD::IParticle* a, const xAOD::IParticle* b) {
789  return a->p4().DeltaR(lepton_p4) < b->p4().DeltaR(lepton_p4);
790  };
791  std::sort(parts.begin(), parts.end(), SORT_TRACKLEP);
792 
793  return StatusCode::SUCCESS;
794  }
795 
797  const xAOD::TrackParticle& track,
798  float dr_lepton,
799  bool isUsedForElectron,
800  bool isUsedForMuon,
801  const xAOD::TrackParticle* trackLep) const
802  {
803  // Apply values to decorators
804  m_dec_trk_dr_lepton(track) = dr_lepton;
805  m_dec_trk_electron_track(track) = static_cast<char>(isUsedForElectron);
806  m_dec_trk_muon_track(track) = static_cast<char>(isUsedForMuon);
807 
808  float dr_leptontrack = -99;
809  if (trackLep) {
810  if (trackLep->pt() > 0.) {
811  dr_leptontrack = track.p4().DeltaR(trackLep->p4());
812  }
813  }
814  m_dec_trk_dr_leptontrack(track) = dr_leptontrack;
815 
816  return StatusCode::SUCCESS;
817  }
818 }
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
Prompt::DecoratePLIT::m_num_lepton_features
int m_num_lepton_features
Definition: DecoratePLIT.h:46
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
Prompt::DecoratePLIT::fillParticles
StatusCode fillParticles(std::vector< const xAOD::IParticle * > &parts, const xAOD::IParticle &lepton, const xAOD::TrackParticle *trackLep, const xAOD::TrackParticleContainer &trackContainer, const EventContext &ctx) const
Definition: DecoratePLIT.cxx:740
xAOD::numberOfPixelHoles
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
Definition: TrackingPrimitives.h:262
Prompt::DecoratePLIT::m_acc_trk_z0SinTheta
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_acc_trk_z0SinTheta
Definition: DecoratePLIT.h:124
Prompt
Definition: DecoratePLIT.h:29
xAOD::numberOfInnermostPixelLayerSplitHits
@ numberOfInnermostPixelLayerSplitHits
number of Pixel 0th layer barrel hits split by cluster splitting
Definition: TrackingPrimitives.h:241
yodamerge_tmp.dim
dim
Definition: yodamerge_tmp.py:239
xAOD::numberOfSCTSharedHits
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
Definition: TrackingPrimitives.h:273
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:557
ConstDataVector.h
DataVector adapter that acts like it holds const pointers.
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
Prompt::DecoratePLIT::DecoratePLIT
DecoratePLIT(const std::string &name, ISvcLocator *pSvcLocator)
Definition: DecoratePLIT.cxx:15
Prompt::DecoratePLIT::decorateTrack
StatusCode decorateTrack(const xAOD::TrackParticle &track, float dr_lepton, bool isUsedForElectron, bool isUsedForMuon, const xAOD::TrackParticle *trackLep) const
Definition: DecoratePLIT.cxx:796
Prompt::DecoratePLIT::m_caloclustersKey
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_caloclustersKey
Definition: DecoratePLIT.h:109
Prompt::DecoratePLIT::initialize
virtual StatusCode initialize() override
Definition: DecoratePLIT.cxx:19
Prompt::DecoratePLIT::m_electronsKey
SG::ReadHandleKey< xAOD::ElectronContainer > m_electronsKey
Definition: DecoratePLIT.h:93
ElectronxAODHelpers.h
Prompt::DecoratePLIT::m_configFileVersion_endcap
Gaudi::Property< std::string > m_configFileVersion_endcap
Definition: DecoratePLIT.h:83
ParticleTest.tp
tp
Definition: ParticleTest.py:25
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
Prompt::DecoratePLIT::execute
virtual StatusCode execute(const EventContext &) const override
Definition: DecoratePLIT.cxx:116
SG::Decorator::getDecorationArray
container_pointer_type getDecorationArray(const AuxVectorData &container) const
Get a pointer to the start of the auxiliary data array.
xAOD::numberOfPixelHits
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:260
xAOD::EgammaHelpers::getTrackParticles
std::set< const xAOD::TrackParticle * > getTrackParticles(const xAOD::Egamma *eg, bool useBremAssoc=true, bool allParticles=true)
Return a list of all or only the best TrackParticle associated to the object.
Definition: EgammaxAODHelpers.cxx:120
Prompt::DecoratePLIT::m_dec_trk_dr_lepton
const SG::Decorator< float > m_dec_trk_dr_lepton
Definition: DecoratePLIT.h:133
Prompt::DecoratePLIT::predictMuon
StatusCode predictMuon(const xAOD::Muon &muon, const xAOD::TrackParticleContainer &tracks, std::vector< SG::WriteDecorHandle< xAOD::MuonContainer, float >> &dec_mu_plit_output, const EventContext &ctx) const
Definition: DecoratePLIT.cxx:181
Prompt::DecoratePLIT::m_dec_trk_electron_track
const SG::Decorator< char > m_dec_trk_electron_track
Definition: DecoratePLIT.h:134
python.TurnDataReader.dr
dr
Definition: TurnDataReader.py:112
str::z0SinThetaUncertainty
const std::string z0SinThetaUncertainty
Definition: BTagTrackIpAccessor.cxx:13
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
Prompt::DecoratePLIT::m_dec_mu_plit_output
SG::WriteDecorHandleKeyArray< xAOD::MuonContainer > m_dec_mu_plit_output
Definition: DecoratePLIT.h:131
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
Prompt::DecoratePLIT::m_acc_trk_z0SinThetaUncertainty
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_acc_trk_z0SinThetaUncertainty
Definition: DecoratePLIT.h:126
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:41
Phi_mpi_pi
__HOSTDEV__ double Phi_mpi_pi(double)
Definition: GeoRegion.cxx:7
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
Prompt::DecoratePLIT::m_acc_trk_muon_track
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_acc_trk_muon_track
Definition: DecoratePLIT.h:127
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:74
Prompt::DecoratePLIT::m_saltModel_endcap
std::shared_ptr< const FlavorTagInference::SaltModel > m_saltModel_endcap
Definition: DecoratePLIT.h:44
IDTPM::z0SinTheta
float z0SinTheta(const U &p)
Definition: TrackParametersHelper.h:75
Prompt::DecoratePLIT::initializeAccessors
StatusCode initializeAccessors()
Definition: DecoratePLIT.cxx:161
Prompt::DecoratePLIT::m_acc_trk_dr_leptontrack
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_acc_trk_dr_leptontrack
Definition: DecoratePLIT.h:122
xAOD::TrackParticle_v1::p4
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
Definition: TrackParticle_v1.cxx:129
Prompt::DecoratePLIT::m_acc_mu_topoetcone30
SG::ReadDecorHandleKey< xAOD::MuonContainer > m_acc_mu_topoetcone30
Definition: DecoratePLIT.h:116
Prompt::DecoratePLIT::m_dec_trk_muon_track
const SG::Decorator< char > m_dec_trk_muon_track
Definition: DecoratePLIT.h:135
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:62
xAOD::numberOfPixelSharedHits
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
Definition: TrackingPrimitives.h:263
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
SG::ReadDecorHandle
Handle class for reading a decoration on an object.
Definition: StoreGate/StoreGate/ReadDecorHandle.h:94
D3PDSizeSummary.ff
ff
Definition: D3PDSizeSummary.py:305
Prompt::DecoratePLIT::m_acc_el_ptvarcone30
SG::ReadDecorHandleKey< xAOD::ElectronContainer > m_acc_el_ptvarcone30
Definition: DecoratePLIT.h:118
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:100
Prompt::DecoratePLIT::m_saltModel
std::shared_ptr< const FlavorTagInference::SaltModel > m_saltModel
Definition: DecoratePLIT.h:43
Prompt::DecoratePLIT::m_acc_el_topoetcone30
SG::ReadDecorHandleKey< xAOD::ElectronContainer > m_acc_el_topoetcone30
Definition: DecoratePLIT.h:119
Prompt::DecoratePLIT::m_maxLepTrackdR
Gaudi::Property< float > m_maxLepTrackdR
Definition: DecoratePLIT.h:85
TRT::Track::d0
@ d0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:62
Prompt::DecoratePLIT::passed_r22tracking_cuts
bool passed_r22tracking_cuts(const xAOD::TrackParticle &tp, const EventContext &ctx) const
Definition: DecoratePLIT.cxx:660
Prompt::DecoratePLIT::m_dec_el_plit_output
SG::WriteDecorHandleKeyArray< xAOD::ElectronContainer > m_dec_el_plit_output
Definition: DecoratePLIT.h:130
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Prompt::DecoratePLIT::m_configFileVersion
Gaudi::Property< std::string > m_configFileVersion
Definition: DecoratePLIT.h:82
python.TrackLeptonConfig.trackContainer
string trackContainer
Definition: TrackLeptonConfig.py:23
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
xAOD::numberOfPixelSplitHits
@ numberOfPixelSplitHits
number of Pixel all-layer hits split by cluster splitting [unit8_t].
Definition: TrackingPrimitives.h:264
xAOD::numberOfSCTHoles
@ numberOfSCTHoles
number of SCT holes [unit8_t].
Definition: TrackingPrimitives.h:271
Prompt::FourMom_t
TLorentzVector FourMom_t
Definition: DecoratePLIT.h:32
Prompt::DecoratePLIT::m_tracksKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_tracksKey
Definition: DecoratePLIT.h:105
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
Trk::Combined
@ Combined
Definition: TrackSummaryTool.h:32
Prompt::DecoratePLIT::m_acc_trk_dr_lepton
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_acc_trk_dr_lepton
Definition: DecoratePLIT.h:121
beamspotman.outname
outname
Definition: beamspotman.py:414
Prompt::DecoratePLIT::m_TaggerName
Gaudi::Property< std::string > m_TaggerName
Definition: DecoratePLIT.h:84
xAOD::numberOfNextToInnermostPixelLayerHits
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
Definition: TrackingPrimitives.h:249
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
Prompt::DecoratePLIT::predictElec
StatusCode predictElec(const xAOD::Electron &electron, const xAOD::TrackParticleContainer &tracks, const xAOD::CaloClusterContainer &caloclusters, std::vector< SG::WriteDecorHandle< xAOD::ElectronContainer, float >> &dec_el_plit_output, const EventContext &ctx) const
Definition: DecoratePLIT.cxx:409
FlavorTagInference::Inputs
std::pair< std::vector< float >, std::vector< int64_t > > Inputs
Definition: FlavorTagInference/FlavorTagInference/SaltModel.h:28
xAOD::EgammaHelpers::getOriginalTrackParticleFromGSF
const xAOD::TrackParticle * getOriginalTrackParticleFromGSF(const xAOD::TrackParticle *trkPar)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the GSF Track Particle...
Definition: ElectronxAODHelpers.cxx:22
xAOD::IParticle::p4
virtual FourMom_t p4() const =0
The full 4-momentum of the particle.
xAOD::Electron_v1
Definition: Electron_v1.h:34
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
Prompt::DecoratePLIT::m_muonsKey
SG::ReadHandleKey< xAOD::MuonContainer > m_muonsKey
Definition: DecoratePLIT.h:97
Prompt::DecoratePLIT::m_dec_trk_dr_leptontrack
const SG::Decorator< float > m_dec_trk_dr_leptontrack
Definition: DecoratePLIT.h:136
Prompt::DecoratePLIT::m_lepCalErelConeSize
Gaudi::Property< float > m_lepCalErelConeSize
Definition: DecoratePLIT.h:87
Prompt::DecoratePLIT::m_configPath
Gaudi::Property< std::string > m_configPath
Definition: DecoratePLIT.h:81
Prompt::DecoratePLIT::m_acc_trk_d0
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_acc_trk_d0
Definition: DecoratePLIT.h:123
Prompt::DecoratePLIT::m_acc_trk_electron_track
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_acc_trk_electron_track
Definition: DecoratePLIT.h:128
a
TList * a
Definition: liststreamerinfos.cxx:10
DecoratePLIT.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::numberOfSCTDeadSensors
@ numberOfSCTDeadSensors
number of dead SCT sensors crossed [unit8_t].
Definition: TrackingPrimitives.h:274
Prompt::DecoratePLIT::m_acc_mu_ptvarcone30TTVA
SG::ReadDecorHandleKey< xAOD::MuonContainer > m_acc_mu_ptvarcone30TTVA
Definition: DecoratePLIT.h:115
Prompt::DecoratePLIT::m_num_track_features
int m_num_track_features
Definition: DecoratePLIT.h:47
ReadDecorHandle.h
Handle class for reading a decoration on an object.
xAOD::numberOfInnermostPixelLayerSharedHits
@ numberOfInnermostPixelLayerSharedHits
number of Pixel 0th layer barrel hits shared by several tracks.
Definition: TrackingPrimitives.h:240
xAOD::numberOfSCTHits
@ numberOfSCTHits
number of hits in SCT [unit8_t].
Definition: TrackingPrimitives.h:269
doL1CaloHVCorrections.parts
parts
Definition: doL1CaloHVCorrections.py:334
xAOD::numberOfPixelDeadSensors
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
Definition: TrackingPrimitives.h:267
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:13
Prompt::DecoratePLIT::m_acc_trk_d0Uncertainty
SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_acc_trk_d0Uncertainty
Definition: DecoratePLIT.h:125
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
xAOD::numberOfInnermostPixelLayerHits
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
Definition: TrackingPrimitives.h:238
python.handimod.cc
int cc
Definition: handimod.py:523
Prompt::DecoratePLIT::m_leptonsName
Gaudi::Property< std::string > m_leptonsName
Definition: DecoratePLIT.h:77
Prompt::DecoratePLIT::m_trackjetsKey
SG::ReadHandleKey< xAOD::JetContainer > m_trackjetsKey
Definition: DecoratePLIT.h:101
str::d0Uncertainty
const std::string d0Uncertainty
Definition: BTagTrackIpAccessor.cxx:12