28 ATH_MSG_INFO(
"Initializing DiTauOnnxDiscriminantTool" );
31 if (model_path.empty()) {
33 return StatusCode::FAILURE;
35 m_ort_env = std::make_unique<Ort::Env>(ORT_LOGGING_LEVEL_WARNING,
"OnnxUtil");
36 Ort::SessionOptions session_options;
37 session_options.SetIntraOpNumThreads(1);
38 session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
60 return StatusCode::SUCCESS;
69 omni_scoreDec(xDiTau) = score;
70 return StatusCode::SUCCESS;
74 if (std::isnan(value))
75 return nan_replacement;
76 if (value == std::numeric_limits<float>::infinity())
77 return posinf_replacement;
78 if (value == -std::numeric_limits<float>::infinity())
79 return neginf_replacement;
84 std::vector<float> flattened;
85 flattened.reserve(vec_2d.size() * (vec_2d.empty() ? 0 : vec_2d[0].size()));
86 for (
const auto &inner : vec_2d) {
87 flattened.insert(flattened.end(), inner.begin(), inner.end());
93 std::vector<float> points;
94 points.reserve(track_features.size() * 2);
95 for (
const auto &track : track_features) {
96 points.push_back(track[0]);
97 points.push_back(track[1]);
103 std::vector<float>
mask;
104 mask.reserve(track_features.size());
105 std::transform(track_features.begin(), track_features.end(), std::back_inserter(mask), [](
const auto &track) {
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>();
164 static const SG::ConstAccessor< uint8_t > numberOfInrmstPxlLyrHitsAcc (
"numberOfInnermostPixelLayerHits");
165 static const SG::ConstAccessor< uint8_t > numberOfPixelHitsAcc (
"numberOfPixelHits");
166 static const SG::ConstAccessor< uint8_t > numberOfSCTHitsAcc (
"numberOfSCTHits");
167 static const SG::ConstAccessor< float > z0Acc (
"z0");
168 static const SG::ConstAccessor< float > d0Acc (
"d0");
172 std::vector<float> jet_vars = {
173 R_max_leadDec (ditau),
174 R_max_subleadDec (ditau),
175 R_tracks_sublDec (ditau),
176 R_isotracDec (ditau),
177 d0_leadtrack_leadDec (ditau),
178 d0_leadtrack_sublDec (ditau),
179 f_core_leadDec (ditau),
180 f_core_sublDec (ditau),
181 f_subjet_sublDec (ditau),
183 f_isotracks_Dec (ditau),
184 M_core_leadDec (ditau),
185 M_core_sublDec (ditau),
186 M_tracks_leadDec (ditau),
187 static_cast<float>( n_trackDec (ditau)),
189 std::vector<int64_t> jet_shape = {1,
static_cast<int64_t
>(jet_vars.size())};
192 std::vector<std::vector<float>> track_features(
m_maxTracks, std::vector<float>(11, 0.0f));
194 float jet_eta = ditau.
eta();
196 size_t num_tracks = std::min(
static_cast<size_t>(
m_maxTracks), vTauTracks.size());
198 for (
size_t i = 0;
i < num_tracks; ++
i) {
199 const ElementLink<xAOD::TrackParticleContainer> &trackLink = vTauTracks[
i];
200 if (!trackLink.
isValid())
continue;
202 float track_eta = xTrack->
eta();
203 float track_phi = xTrack->
phi();
204 float delta_eta = track_eta - jet_eta;
205 float delta_phi = std::remainder(track_phi - jet_phi, 2 *
M_PI);
206 float delta_R = std::hypot(delta_eta, delta_phi);
207 float track_pt =
static_cast<float>(xTrack->
pt());
208 float pt_log = std::log(track_pt + 1e-8f);
209 float jet_pt = ditau_ptDec(ditau);
210 float pt_ratio = track_pt / jet_pt;
211 float pt_ratio_log = std::log(1.0f - pt_ratio + 1e-8f);
212 float track_charge = xTrack->
charge();
213 float pt_ratio_log_nan_less =
nan_to_num(pt_ratio_log, 0.0f, 0.0f, 0.0f);
215 track_features[
i] = {
220 pt_ratio_log_nan_less,
223 static_cast<float>(numberOfInrmstPxlLyrHitsAcc(*xTrack)),
224 static_cast<float>(numberOfPixelHitsAcc(*xTrack)),
225 static_cast<float>(numberOfSCTHitsAcc(*xTrack)),
229 std::vector<int64_t> track_shape = {1,
static_cast<int64_t
>(
m_maxTracks), 11};
236 {1, track_shape[1], 2},
240 std::move(jet_shape),
245 return output.output_1[1];
#define ATH_CHECK
Evaluate an expression and check for errors.
char data[hepevt_bytes_allocation_ATLAS]
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
bool isValid() const
Test to see if the link can be dereferenced.
Helper class to provide type-safe access to aux data.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
const TrackParticleLinks_t & trackLinks() const
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float charge() const
Returns the charge.
bool pt_log(const xAOD::TauJet &, const xAOD::TauTrack &track, float &out)
delta_R(eta1, phi1, eta2, phi2)
TrackParticle_v1 TrackParticle
Reference the current persistent version:
DiTauJet_v1 DiTauJet
Definition of the current version.