ATLAS Offline Software
ools/Root/DiTauOnnxDiscriminantTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 // Core include(s):
8 #include "AthLinks/ElementLink.h"
11 
12 using TrackParticleLinks_t = std::vector<ElementLink<xAOD::TrackParticleContainer>>;
13 
14 using namespace DiTauRecTools;
15 
16 //=================================PUBLIC-PART==================================
17 //______________________________________________________________________________
19  : AsgTool(name)
20 {
21 }
22 
23 //______________________________________________________________________________
25 
26 //______________________________________________________________________________
28 {
29  ATH_MSG_INFO( "Initializing DiTauOnnxDiscriminantTool" );
30  ATH_MSG_INFO( "onnxModelPath: " << m_onnxModelPath );
31  std::string model_path = PathResolverFindCalibFile(m_onnxModelPath);
32  if (model_path.empty()) {
33  ATH_MSG_ERROR("Could not find model file: " << m_onnxModelPath);
34  return StatusCode::FAILURE;
35  }
36  m_ort_env = std::make_unique<Ort::Env>(ORT_LOGGING_LEVEL_WARNING, "OnnxUtil");
37  Ort::SessionOptions session_options;
38  session_options.SetIntraOpNumThreads(1);
39  session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
40  m_ort_session = std::make_unique<Ort::Session>(*m_ort_env, model_path.c_str(), session_options);
41 
42  ATH_CHECK( m_ditauContainerKey.initialize() );
43  ATH_CHECK( m_ditau_pt_DecorKey.initialize() );
44  ATH_CHECK( m_f_core_lead_DecorKey.initialize() );
45  ATH_CHECK( m_f_core_sublead_DecorKey.initialize() );
46  ATH_CHECK( m_f_subjet_subl_DecorKey.initialize() );
47  ATH_CHECK( m_f_subjets_DecorKey.initialize() );
48  ATH_CHECK( m_R_max_lead_DecorKey.initialize() );
49  ATH_CHECK( m_R_max_sublead_DecorKey.initialize() );
50  ATH_CHECK( m_n_track_DecorKey.initialize() );
51  ATH_CHECK( m_R_track_all_DecorKey.initialize() );
52  ATH_CHECK( m_R_isotrack_DecorKey.initialize() );
53  ATH_CHECK( m_R_track_sublead_DecorKey.initialize() );
54  ATH_CHECK( m_M_core_lead_DecorKey.initialize() );
55  ATH_CHECK( m_M_core_sublead_DecorKey.initialize() );
56  ATH_CHECK( m_M_track_lead_DecorKey.initialize() );
59  ATH_CHECK( m_f_isotracks_DecorKey.initialize() );
60 
61  return StatusCode::SUCCESS;
62 }
63 
65 {
66  const static SG::Decorator<float> omni_scoreDec("omni_score");
67  ATH_MSG_DEBUG("Inferencing omni DiTau ID score...");
68  float score = GetDiTauObjOnnxScore(xDiTau);
69  ATH_MSG_DEBUG("DiTau ID score: " << score);
70  omni_scoreDec(xDiTau) = score;
71  return StatusCode::SUCCESS;
72 }
73 
74 float DiTauOnnxDiscriminantTool::nan_to_num(float value, float nan_replacement = 0.0f, float posinf_replacement = 0.0f, float neginf_replacement = 0.0f) const{
75  if (std::isnan(value))
76  return nan_replacement;
77  if (value == std::numeric_limits<float>::infinity())
78  return posinf_replacement;
79  if (value == -std::numeric_limits<float>::infinity())
80  return neginf_replacement;
81  return value;
82  }
83 
84 std::vector<float> DiTauOnnxDiscriminantTool::flatten(const std::vector<std::vector<float>> &vec_2d) const{
85  std::vector<float> flattened;
86  flattened.reserve(vec_2d.size() * (vec_2d.empty() ? 0 : vec_2d[0].size()));
87  for (const auto &inner : vec_2d) {
88  flattened.insert(flattened.end(), inner.begin(), inner.end());
89  }
90  return flattened;
91 }
92 
93 std::vector<float> DiTauOnnxDiscriminantTool::extract_points(const std::vector<std::vector<float>> &track_features) const{
94  std::vector<float> points;
95  points.reserve(track_features.size() * 2);
96  for (const auto &track : track_features) {
97  points.push_back(track[0]); // delta_eta
98  points.push_back(track[1]); // delta_phi
99  }
100  return points;
101 }
102 
103 std::vector<float> DiTauOnnxDiscriminantTool::create_mask(const std::vector<std::vector<float>> &track_features) const{
104  std::vector<float> mask;
105  mask.reserve(track_features.size());
106  std::transform(track_features.begin(), track_features.end(), std::back_inserter(mask), [](const auto &track) {
107  return std::abs(track[2]) > 1e-6 ? 1.0f : 0.0f;
108  });
109  return mask;
110 }
111 
112 Ort::Value DiTauOnnxDiscriminantTool::create_tensor(std::vector<float> &data, const std::vector<int64_t> &shape) const{
113  Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
114  return Ort::Value::CreateTensor<float>(memory_info, data.data(), data.size(),shape.data(), shape.size());
115 }
116 
118  std::vector<Ort::Value> input_tensors;
119  input_tensors.reserve(m_input_node_names.size());
120  input_tensors.emplace_back(create_tensor(inputs.input_features, inputs.input_features_shape));
121  input_tensors.emplace_back(create_tensor(inputs.input_points, inputs.input_points_shape));
122  input_tensors.emplace_back(create_tensor(inputs.input_mask, inputs.input_mask_shape));
123  input_tensors.emplace_back(create_tensor(inputs.input_jet, inputs.input_jet_shape));
124  input_tensors.emplace_back(create_tensor(inputs.input_time, inputs.input_time_shape));
125 
126  std::vector<const char *> input_node_names;
127  input_node_names.reserve(m_input_node_names.size());
128  std::transform(m_input_node_names.begin(), m_input_node_names.end(), std::back_inserter(input_node_names), [](const std::string &name) { return name.c_str(); });
129 
130  std::vector<const char *> output_node_names;
131  output_node_names.reserve(m_output_node_names.size());
132  std::transform(m_output_node_names.begin(), m_output_node_names.end(), std::back_inserter(output_node_names), [](const std::string &name) { return name.c_str(); });
133 
134  auto output_tensors = m_ort_session->Run(Ort::RunOptions{nullptr}, input_node_names.data(), input_tensors.data(), input_node_names.size(), output_node_names.data(), output_node_names.size());
135 
136  InferenceOutput output;
137  for (size_t i = 0; i < output_tensors.size(); ++i) {
138  const auto &tensor = output_tensors[i];
139  const size_t length = tensor.GetTensorTypeAndShapeInfo().GetElementCount();
140  const float *data = tensor.GetTensorData<float>();
141  (i == 0 ? output.output_1 : output.output_2) = std::vector<float>(data, data + length);
142  }
143  return output;
144 }
145 
147 
164  // Accessors for reading the necessary features from the xAOD::TrackParticle object
165  static const SG::ConstAccessor< uint8_t > numberOfInrmstPxlLyrHitsAcc ("numberOfInnermostPixelLayerHits");
166  static const SG::ConstAccessor< uint8_t > numberOfPixelHitsAcc ("numberOfPixelHits");
167  static const SG::ConstAccessor< uint8_t > numberOfSCTHitsAcc ("numberOfSCTHits");
168  static const SG::ConstAccessor< float > z0Acc ("z0");
169  static const SG::ConstAccessor< float > d0Acc ("d0");
170 
171 
172  // Input features for Ditau tagger ONNX model
173  std::vector<float> jet_vars = {
174  R_max_leadDec (ditau),
175  R_max_subleadDec (ditau),
176  R_tracks_sublDec (ditau),
177  R_isotracDec (ditau),
178  d0_leadtrack_leadDec (ditau),
179  d0_leadtrack_sublDec (ditau),
180  f_core_leadDec (ditau),
181  f_core_sublDec (ditau),
182  f_subjet_sublDec (ditau),
183  f_subjetDec (ditau),
184  f_isotracks_Dec (ditau),
185  M_core_leadDec (ditau),
186  M_core_sublDec (ditau),
187  M_tracks_leadDec (ditau),
188  static_cast<float>( n_trackDec (ditau)),
189  };
190  std::vector<int64_t> jet_shape = {1, static_cast<int64_t>(jet_vars.size())};
191 
192  const TrackParticleLinks_t &vTauTracks = ditau.trackLinks();
193  std::vector<std::vector<float>> track_features(m_maxTracks, std::vector<float>(11, 0.0f));
194 
195  float jet_eta = ditau.eta();
196  float jet_phi = ditau.phi();
197  size_t num_tracks = std::min(static_cast<size_t>(m_maxTracks), vTauTracks.size());
198 
199  for (size_t i = 0; i < num_tracks; ++i) {
200  const ElementLink<xAOD::TrackParticleContainer> &trackLink = vTauTracks[i];
201  if (!trackLink.isValid()) continue;
202  const xAOD::TrackParticle *xTrack = *trackLink;
203  float track_eta = xTrack->eta();
204  float track_phi = xTrack->phi();
205  float delta_eta = track_eta - jet_eta;
206  float delta_phi = std::remainder(track_phi - jet_phi, 2 * M_PI);
207  float delta_R = std::hypot(delta_eta, delta_phi);
208  float track_pt = static_cast<float>(xTrack->pt());
209  float pt_log = std::log(track_pt + 1e-8f);
210  float jet_pt = ditau_ptDec(ditau);
211  float pt_ratio = track_pt / jet_pt;
212  float pt_ratio_log = std::log(1.0f - pt_ratio + 1e-8f);
213  float track_charge = xTrack->charge();
214  float pt_ratio_log_nan_less = nan_to_num(pt_ratio_log, 0.0f, 0.0f, 0.0f);
215 
216  track_features[i] = {
217  delta_eta,
218  delta_phi,
219  pt_log,
220  d0Acc(*xTrack),
221  pt_ratio_log_nan_less,
222  z0Acc(*xTrack),
223  delta_R,
224  static_cast<float>(numberOfInrmstPxlLyrHitsAcc(*xTrack)),
225  static_cast<float>(numberOfPixelHitsAcc(*xTrack)),
226  static_cast<float>(numberOfSCTHitsAcc(*xTrack)),
227  track_charge
228  };
229  }
230  std::vector<int64_t> track_shape = {1, static_cast<int64_t>(m_maxTracks), 11};
231 
232  // Actual ONNX inference
234  flatten(track_features),
235  track_shape,
236  extract_points(track_features),
237  {1, track_shape[1], 2},
238  create_mask(track_features),
239  {1, track_shape[1]},
240  std::move(jet_vars),
241  std::move(jet_shape),
242  {0.0f},
243  {1, 1}
244  };
245  auto output = run_inference(inputs);
246  return output.output_1[1];
247 }
248 
249 
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:74
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
DiTauRecTools::DiTauOnnxDiscriminantTool::m_ditau_pt_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_ditau_pt_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:78
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
DiTauRecTools::DiTauOnnxDiscriminantTool::m_ort_session
std::unique_ptr< Ort::Session > m_ort_session
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:47
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
DiTauRecTools::DiTauOnnxDiscriminantTool::m_R_max_sublead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_R_max_sublead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:84
xAOD::TrackParticle_v1::charge
float charge() const
Returns the charge.
Definition: TrackParticle_v1.cxx:151
xAOD::TrackParticle_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: TrackParticle_v1.cxx:78
eFEXNTuple.delta_R
def delta_R(eta1, phi1, eta2, phi2)
Definition: eFEXNTuple.py:21
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
DiTauRecTools::DiTauOnnxDiscriminantTool::m_ditauContainerKey
SG::ReadHandleKey< xAOD::DiTauJetContainer > m_ditauContainerKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:77
M_PI
#define M_PI
Definition: ActiveFraction.h:11
DiTauOnnxDiscriminantTool.h
athena.value
value
Definition: athena.py:124
DiTauRecTools::DiTauOnnxDiscriminantTool::m_M_track_lead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_M_track_lead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:91
TrackParticleLinks_t
std::vector< ElementLink< xAOD::TrackParticleContainer > > TrackParticleLinks_t
Definition: src/DiTauOnnxDiscriminantTool.cxx:16
DiTauRecTools::DiTauOnnxDiscriminantTool::m_output_node_names
const std::vector< std::string > m_output_node_names
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:49
SG::ConstAccessor< uint8_t >
xAOD::DiTauJet_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
DiTauRecTools::DiTauOnnxDiscriminantTool::run_inference
InferenceOutput run_inference(OnnxInputs &inputs) const
Definition: ools/Root/DiTauOnnxDiscriminantTool.cxx:117
DiTauRecTools::DiTauOnnxDiscriminantTool::InferenceOutput
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:51
postInclude.inputs
inputs
Definition: postInclude.SortInput.py:15
DiTauRecTools::DiTauOnnxDiscriminantTool::OnnxInputs
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:56
DiTauRecTools::DiTauOnnxDiscriminantTool::create_mask
std::vector< float > create_mask(const std::vector< std::vector< float >> &track_features) const
Definition: ools/Root/DiTauOnnxDiscriminantTool.cxx:103
python.utils.AtlRunQueryLookup.mask
string mask
Definition: AtlRunQueryLookup.py:459
DiTauOnnxDiscriminantTool::~DiTauOnnxDiscriminantTool
virtual ~DiTauOnnxDiscriminantTool()
DiTauRecTools::DiTauOnnxDiscriminantTool::m_f_core_lead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_f_core_lead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:79
DiTauRecTools::DiTauOnnxDiscriminantTool::m_d0_leadtrack_lead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_d0_leadtrack_lead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:92
xAOD::DiTauJet_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
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
SG::Decorator< float >
lumiFormat.i
int i
Definition: lumiFormat.py:85
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
DiTauRecTools::DiTauOnnxDiscriminantTool::m_d0_leadtrack_sublead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_d0_leadtrack_sublead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:93
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
DiTauRecTools::DiTauOnnxDiscriminantTool::m_f_core_sublead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_f_core_sublead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:80
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
hist_file_dump.f
f
Definition: hist_file_dump.py:140
DiTauRecTools::DiTauOnnxDiscriminantTool::m_M_core_lead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_M_core_lead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:89
DiTauRecTools::DiTauOnnxDiscriminantTool::m_f_subjet_subl_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_f_subjet_subl_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:81
DiTauRecTools::DiTauOnnxDiscriminantTool::m_f_subjets_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_f_subjets_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:82
DiTauRecTools::DiTauOnnxDiscriminantTool::m_R_track_sublead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_R_track_sublead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:88
DiTauRecTools::DiTauOnnxDiscriminantTool::create_tensor
Ort::Value create_tensor(std::vector< float > &data, const std::vector< int64_t > &shape) const
Definition: ools/Root/DiTauOnnxDiscriminantTool.cxx:112
DiTauRecTools::DiTauOnnxDiscriminantTool::m_n_track_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_n_track_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:85
PathResolver.h
remainder
std::vector< std::string > remainder(const std::vector< std::string > &v1, const std::vector< std::string > &v2)
Definition: compareFlatTrees.cxx:44
DiTauRecTools::DiTauOnnxDiscriminantTool::m_onnxModelPath
Gaudi::Property< std::string > m_onnxModelPath
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:43
DiTauRecTools::DiTauOnnxDiscriminantTool::m_ort_env
std::unique_ptr< Ort::Env > m_ort_env
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:46
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DiTauRecTools
Implementation of boosted di-tau ID.
Definition: DiTauDiscriminantTool.h:31
DiTauRecTools::DiTauOnnxDiscriminantTool::m_M_core_sublead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_M_core_sublead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:90
DiTauOnnxDiscriminantTool::DiTauOnnxDiscriminantTool
DiTauOnnxDiscriminantTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: src/DiTauOnnxDiscriminantTool.cxx:20
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:283
xAOD::score
@ score
Definition: TrackingPrimitives.h:514
DiTauRecTools::DiTauOnnxDiscriminantTool::m_f_isotracks_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_f_isotracks_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:94
DiTauRecTools::DiTauOnnxDiscriminantTool::flatten
std::vector< float > flatten(const std::vector< std::vector< float >> &vec_2d) const
Definition: ools/Root/DiTauOnnxDiscriminantTool.cxx:84
python.general.flattened
def flattened(l)
Definition: general.py:125
TauGNNUtils::Variables::Track::pt_log
bool pt_log(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:478
DiTauRecTools::DiTauOnnxDiscriminantTool::m_input_node_names
const std::vector< std::string > m_input_node_names
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:48
eFEXNTuple.delta_phi
def delta_phi(phi1, phi2)
Definition: eFEXNTuple.py:15
DiTauOnnxDiscriminantTool::initialize
virtual StatusCode initialize() override
Tool initializer.
Definition: src/DiTauOnnxDiscriminantTool.cxx:30
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
ReadDecorHandle.h
Handle class for reading a decoration on an object.
xAOD::DiTauJet_v1
Definition: DiTauJet_v1.h:31
DiTauRecTools::DiTauOnnxDiscriminantTool::nan_to_num
float nan_to_num(float value, float nan_replacement, float posinf_replacement, float neginf_replacement) const
Definition: ools/Root/DiTauOnnxDiscriminantTool.cxx:74
Trk::jet_phi
@ jet_phi
Definition: JetVtxParamDefs.h:28
xAOD::track
@ track
Definition: TrackingPrimitives.h:513
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
xAOD::DiTauJet_v1::trackLinks
const TrackParticleLinks_t & trackLinks() const
DiTauRecTools::DiTauOnnxDiscriminantTool::GetDiTauObjOnnxScore
float GetDiTauObjOnnxScore(const xAOD::DiTauJet &ditau) const
Definition: ools/Root/DiTauOnnxDiscriminantTool.cxx:146
DiTauRecTools::DiTauOnnxDiscriminantTool::m_maxTracks
Gaudi::Property< size_t > m_maxTracks
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:44
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
DiTauRecTools::DiTauOnnxDiscriminantTool::m_R_isotrack_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_R_isotrack_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:87
DiTauRecTools::DiTauOnnxDiscriminantTool::m_R_max_lead_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_R_max_lead_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:83
jobOptions.points
points
Definition: jobOptions.GenevaPy8_Zmumu.py:97
xAOD::TrackParticle_v1::phi
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
DiTauRecTools::DiTauOnnxDiscriminantTool::m_R_track_all_DecorKey
SG::ReadDecorHandleKey< xAOD::DiTauJetContainer > m_R_track_all_DecorKey
Definition: ools/DiTauRecTools/DiTauOnnxDiscriminantTool.h:86
DiTauRecTools::DiTauOnnxDiscriminantTool::extract_points
std::vector< float > extract_points(const std::vector< std::vector< float >> &track_features) const
Definition: ools/Root/DiTauOnnxDiscriminantTool.cxx:93
DiTauRecTools::DiTauOnnxDiscriminantTool::execute
virtual StatusCode execute(const xAOD::DiTauJet &xDiTau) const override
Declare the interface that the class provides.
Definition: ools/Root/DiTauOnnxDiscriminantTool.cxx:64