8 #include "AthLinks/ElementLink.h"
23 declareInterface<DiTauToolBase > (
this);
32 ATH_MSG_INFO(
"Initializing DiTauOnnxDiscriminantTool" );
52 if (model_path.empty()) {
54 return StatusCode::FAILURE;
56 m_ort_env = std::make_unique<Ort::Env>(ORT_LOGGING_LEVEL_WARNING,
"OnnxUtil");
57 Ort::SessionOptions session_options;
58 session_options.SetIntraOpNumThreads(1);
59 session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
61 return StatusCode::SUCCESS;
69 return StatusCode::SUCCESS;
79 omni_scoreDec(*xDitau) =
score;
80 return StatusCode::SUCCESS;
85 flattened.reserve(vec_2d.size() * (vec_2d.empty() ? 0 : vec_2d[0].size()));
86 for (
const auto &inner : vec_2d) {
94 points.reserve(track_features.size() * 2);
95 for (
const auto &
track : track_features) {
103 std::vector<float>
mask;
104 mask.reserve(track_features.size());
106 return std::abs(track[2]) > 1e-6 ? 1.0f : 0.0f;
112 Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
113 return Ort::Value::CreateTensor<float>(memory_info,
data.data(),
data.size(),shape.data(), shape.size());
117 std::vector<Ort::Value> input_tensors;
125 std::vector<const char *> input_node_names;
129 std::vector<const char *> output_node_names;
133 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());
136 for (
size_t i = 0;
i < output_tensors.size(); ++
i) {
137 const auto &tensor = output_tensors[
i];
138 const size_t length = tensor.GetTensorTypeAndShapeInfo().GetElementCount();
139 const float *
data = tensor.GetTensorData<
float>();
170 std::vector<float> jet_vars = {
171 R_max_leadAcc (ditau),
172 R_max_sublAcc (ditau),
173 R_tracks_sublAcc (ditau),
174 R_isotrackAcc (ditau),
175 d0_leadtrack_leadAcc (ditau),
176 d0_leadtrack_sublAcc (ditau),
177 f_core_leadAcc (ditau),
178 f_core_sublAcc (ditau),
179 f_subjet_sublAcc (ditau),
181 f_isotracksAcc (ditau),
182 M_core_leadAcc (ditau),
183 M_core_sublAcc (ditau),
184 M_tracks_leadAcc (ditau),
185 static_cast<float>( n_trackAcc (ditau)),
187 std::vector<int64_t> jet_shape = {1,
static_cast<int64_t
>(jet_vars.size())};
190 std::vector<std::vector<float>> track_features(
m_maxTracks, std::vector<float>(11, 0.0
f));
192 float jet_eta = ditau.
eta();
196 for (
size_t i = 0;
i < num_tracks; ++
i) {
198 if (!trackLink.
isValid())
continue;
200 float track_eta = xTrack->
eta();
201 float track_phi = xTrack->
phi();
202 float delta_eta = track_eta - jet_eta;
205 float track_pt =
static_cast<float>(xTrack->
pt());
207 float jet_pt = ditau_ptAcc(ditau);
208 float pt_ratio = track_pt / jet_pt;
209 float pt_ratio_log = (pt_ratio <= 1.0f) ?
std::log(1.0
f - pt_ratio + 1
e-8
f) : 0.0f;
210 float track_charge = xTrack->
charge();
212 track_features[
i] = {
220 static_cast<float>(numberOfInrmstPxlLyrHitsAcc(*xTrack)),
221 static_cast<float>(numberOfPixelHitsAcc(*xTrack)),
222 static_cast<float>(numberOfSCTHitsAcc(*xTrack)),
226 std::vector<int64_t> track_shape = {1,
static_cast<int64_t
>(
m_maxTracks), 11};
233 {1, track_shape[1], 2},
237 std::move(jet_shape),
242 return output.output_1[1];