ATLAS Offline Software
Loading...
Searching...
No Matches
JSSMLTool.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3// Local include(s).
5
6// Framework include(s).
8
9// ROOT includes
10#include "TSystem.h"
11#include "TH2D.h"
12
13namespace AthONNX {
14
15 //*******************************************************************
16 // for reading jet images
17 std::vector<float> JSSMLTool::ReadJetImagePixels( std::vector<TH2D> Images ) const //function to load test images
18 {
19
20 int n_rows = m_nPixelsX;
21 int n_cols = m_nPixelsY;
22 int n_colors = m_nPixelsZ;
23
24 std::vector<float> input_tensor_values(n_rows*n_cols*n_colors);
25
26 for(int iRow=0; iRow<n_rows; ++iRow){
27 for(int iColumn=0; iColumn<n_cols; ++iColumn){
28 for(int iColor=0; iColor<n_colors; ++iColor){
29 input_tensor_values[ (n_colors*n_cols*iRow) + iColumn*n_colors + iColor] = Images[iColor].GetBinContent(iRow+1, iColumn+1);
30 }
31 }
32 }
33
34 return input_tensor_values;
35 }
36
37 //********************************************************************************
38 // for reading DNN inputs
39 std::vector<float> JSSMLTool::ReadJSSInputs(std::map<std::string, double> JSSVars) const //function to load test images
40 {
41
42 std::vector<float> input_tensor_values(m_nvars);
43
44 // apply features scaling
45 for(const auto & var : JSSVars){
46 double mean = m_scaler.find(var.first)->second[0];
47 double std = m_scaler.find(var.first)->second[1];
48 JSSVars[var.first] = (var.second - mean) / std;
49 }
50
51 // then dump it to a vector
52 for(int v=0; v<m_nvars; ++v){
53 std::string name = m_JSSInputMap.find(v)->second;
54 input_tensor_values[v] = JSSVars[name];
55 }
56
57 return input_tensor_values;
58 }
59
60 //********************************************************************************
61 // for reading jet labels for DNN
62 // this can be extended in case of multi-class models
63 std::vector<int> JSSMLTool::ReadOutputLabels() const
64 {
65 std::vector<int> output_tensor_values(1);
66
67 output_tensor_values[0] = 1;
68
69 return output_tensor_values;
70 }
71
72 // constructor ---
73 JSSMLTool::JSSMLTool(const std::string& name):
74 AsgTool(name)
75 {
76 declareProperty("ModelPath", m_modelFileName);
77 declareProperty("nPixelsX", m_nPixelsX);
78 declareProperty("nPixelsY", m_nPixelsY);
79 declareProperty("nPixelsZ", m_nPixelsZ);
80 }
81
82 // initialize ---
83 StatusCode JSSMLTool::initialize( ) {
84
85 // Access the service.
86 // Find the model file.
87 ATH_MSG_INFO( "Using model file: " << m_modelFileName );
88
89 // Set up the ONNX Runtime session.
90 Ort::SessionOptions sessionOptions;
91 sessionOptions.SetIntraOpNumThreads( 1 );
92 sessionOptions.SetGraphOptimizationLevel( ORT_ENABLE_BASIC );
93
94 // according to the discussion here https://its.cern.ch/jira/browse/ATLASG-2866
95 // this should reduce memory use while slowing things down slightly
96 sessionOptions.DisableCpuMemArena();
97
98 // declare an allocator
99 Ort::AllocatorWithDefaultOptions allocator;
100
101 // create session and load model into memory
102 m_env = std::make_unique< Ort::Env >(ORT_LOGGING_LEVEL_WARNING, "");
103 m_session = std::make_unique< Ort::Session >( *m_env,
104 m_modelFileName.c_str(),
105 sessionOptions );
106
107 ATH_MSG_INFO( "Created the ONNX Runtime session" );
108
109 m_num_input_nodes = m_session->GetInputCount();
111
112 for( std::size_t i = 0; i < m_num_input_nodes; i++ ) {
113 // print input node names
114 char* input_name = m_session->GetInputNameAllocated(i, allocator).release();
115 ATH_MSG_DEBUG("Input "<<i<<" : "<<" name = "<<input_name);
116 m_input_node_names[i] = input_name;
117 // print input node types
118 Ort::TypeInfo type_info = m_session->GetInputTypeInfo(i);
119 auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
120 ONNXTensorElementDataType type = tensor_info.GetElementType();
121 ATH_MSG_DEBUG("Input "<<i<<" : "<<" type = "<<type);
122
123 // print input shapes/dims
124 m_input_node_dims = tensor_info.GetShape();
125 ATH_MSG_DEBUG("Input "<<i<<" : num_dims = "<<m_input_node_dims.size());
126 for (std::size_t j = 0; j < m_input_node_dims.size(); j++){
127 if(m_input_node_dims[j]<0)
128 m_input_node_dims[j] =1;
129 ATH_MSG_DEBUG("Input"<<i<<" : dim "<<j<<" = "<<m_input_node_dims[j]);
130 }
131 }
132
133 m_num_output_nodes = m_session->GetOutputCount();
135
136 for( std::size_t i = 0; i < m_num_output_nodes; i++ ) {
137 // print output node names
138 char* output_name = m_session->GetOutputNameAllocated(i, allocator).release();
139 ATH_MSG_DEBUG("Output "<<i<<" : "<<" name = "<<output_name);
140 m_output_node_names[i] = output_name;
141
142 Ort::TypeInfo type_info = m_session->GetOutputTypeInfo(i);
143 auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
144 ONNXTensorElementDataType type = tensor_info.GetElementType();
145 ATH_MSG_DEBUG("Output "<<i<<" : "<<" type = "<<type);
146
147 // print output shapes/dims
148 m_output_node_dims = tensor_info.GetShape();
149 ATH_MSG_INFO("Output "<<i<<" : num_dims = "<<m_output_node_dims.size());
150 for (std::size_t j = 0; j < m_output_node_dims.size(); j++){
151 if(m_output_node_dims[j]<0)
152 m_output_node_dims[j] =1;
153 ATH_MSG_INFO("Output"<<i<<" : dim "<<j<<" = "<<m_output_node_dims[j]);
154 }
155 }
156
157 // Return gracefully.
158 return StatusCode::SUCCESS;
159 } // end initialize ---
160
161 // constituents image based
162 double JSSMLTool::retrieveConstituentsScore(std::vector<TH2D> Images) const {
163
164 //*************************************************************************
165 // Score the model using sample data, and inspect values
166
167 // preparing container to hold input data
168 size_t input_tensor_size = m_nPixelsX*m_nPixelsY*m_nPixelsZ;
169 std::vector<float> input_tensor_values(input_tensor_size);
170
171 // loading input data
172 input_tensor_values = ReadJetImagePixels(Images);
173
174 // preparing container to hold output data
175 int testSample = 0;
176 std::vector<int> output_tensor_values_ = ReadOutputLabels();
177 int output_tensor_values = output_tensor_values_[testSample];
178
179 // create input tensor object from data values
180 auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
181 Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_size, m_input_node_dims.data(), m_input_node_dims.size());
182 assert(input_tensor.IsTensor());
183
184 auto output_tensors = m_session->Run(Ort::RunOptions{nullptr}, m_input_node_names.data(), &input_tensor, m_input_node_names.size(), m_output_node_names.data(), m_output_node_names.size());
185 assert(output_tensors.size() == 1 && output_tensors.front().IsTensor());
186
187 // Get pointer to output tensor float values
188 float* floatarr = output_tensors.front().GetTensorMutableData<float>();
189 int arrSize = sizeof(*floatarr)/sizeof(floatarr[0]);
190
191 // show true label for the test input
192 ATH_MSG_DEBUG("Label for the input test data = "<<output_tensor_values);
193 float ConstScore = -999;
194 int max_index = 0;
195 for (int i = 0; i < arrSize; i++){
196 ATH_MSG_VERBOSE("Score for class "<<i<<" = "<<floatarr[i]<<std::endl);
197 if (ConstScore<floatarr[i]){
198 ConstScore = floatarr[i];
199 max_index = i;
200 }
201 }
202 ATH_MSG_DEBUG("Class: "<<max_index<<" has the highest score: "<<floatarr[max_index]);
203
204 return ConstScore;
205
206 } // end retrieve CNN score ----
207
208 // constituents transformer based
209 double JSSMLTool::retrieveConstituentsScore(std::vector<std::vector<float>> constituents) const {
210
211 // the format of the packed constituents is:
212 // constituents.size() ---> 4, for example, (m pT, eta, phi)
213 // constituents.at(0) ---> number of constituents
214 // the packing can be done for any kind of low level inputs
215 // i.e. PFO/UFO constituents, topo-towers, tracks, etc
216 // they can be concatened one after the other in case of multiple inputs
217
218 //*************************************************************************
219 // Score the model using sample data, and inspect values
220 // loading input data
221
222 std::vector<int> output_tensor_values_ = ReadOutputLabels();
223
224 int testSample = 0;
225
226 //preparing container to hold output data
227 int output_tensor_values = output_tensor_values_[testSample];
228
229 // prepare the inputs
230 auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
231 std::vector<Ort::Value> input_tensors;
232 for (long unsigned int i=0; i<constituents.size(); i++) {
233
234 // test
235 std::vector<int64_t> const_dim = {1, static_cast<int64_t>(constituents.at(i).size())};
236
237 input_tensors.push_back(Ort::Value::CreateTensor<float>(
238 memory_info,
239 constituents.at(i).data(), constituents.at(i).size(), const_dim.data(), const_dim.size()
240 )
241 );
242 }
243
244 auto output_tensors = m_session->Run(Ort::RunOptions{nullptr}, m_input_node_names.data(), input_tensors.data(), m_input_node_names.size(), m_output_node_names.data(), m_output_node_names.size());
245 assert(output_tensors.size() == 1 && output_tensors.front().IsTensor());
246
247 // Get pointer to output tensor float values
248 float* floatarr = output_tensors.front().GetTensorMutableData<float>();
249 int arrSize = sizeof(*floatarr)/sizeof(floatarr[0]);
250
251 // show true label for the test input
252 ATH_MSG_DEBUG("Label for the input test data = "<<output_tensor_values);
253 float ConstScore = -999;
254 int max_index = 0;
255 for (int i = 0; i < arrSize; i++){
256 ATH_MSG_VERBOSE("Score for class "<<i<<" = "<<floatarr[i]<<std::endl);
257 ATH_MSG_VERBOSE(" +++ Score for class "<<i<<" = "<<floatarr[i]<<std::endl);
258 if (ConstScore<floatarr[i]){
259 ConstScore = floatarr[i];
260 max_index = i;
261 }
262 }
263 ATH_MSG_DEBUG("Class: "<<max_index<<" has the highest score: "<<floatarr[max_index]);
264
265 return ConstScore;
266
267 } // end retrieve constituents score ----
268
269 // constituents transformer based with const/inter variables
270 double JSSMLTool::retrieveConstituentsScore(std::vector<std::vector<float>> constituents, std::vector<std::vector<std::vector<float>>> interactions) const {
271
272 // the format of the constituents/interaction variables is:
273 // constituents ---> (nConstituents + nTowers, 7)
274 // interactions ---> (i, j, 4), with i, j in {nConstituents + nTowers}
275 // the packing can be done for any kind of low level inputs
276 // i.e. PFO/UFO constituents, topo-towers, tracks, etc
277 // they can be concatened one after the other in case of multiple inputs
278
279 //*************************************************************************
280 // Score the model using sample data, and inspect values
281 // loading input data
282
283 std::vector<int> output_tensor_values_ = ReadOutputLabels();
284
285 int testSample = 0;
286
287 //preparing container to hold output data
288 int output_tensor_values = output_tensor_values_[testSample];
289
290 // prepare the inputs
291 auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
292 std::vector<Ort::Value> input_tensors;
293
294 // unroll the inputs
295 std::vector<float> constituents_values; //(constituents.size()*7);
296 for (long unsigned int i=0; i<constituents.size(); i++) {
297 for (long unsigned int j=0; j<7; j++) {
298 constituents_values.push_back(constituents.at(i).at(j));
299 }
300 }
301
302 std::vector<float> interactions_values; //(interactions.size()*interactions.size()*4);
303 for (long unsigned int i=0; i<interactions.size(); i++) {
304 for (long unsigned int k=0; k<interactions.size(); k++) {
305 for (long unsigned int j=0; j<4; j++) {
306 interactions_values.push_back(interactions.at(i).at(k).at(j));
307 }
308 }
309 }
310
311 std::vector<int64_t> const_dim = {1, static_cast<int64_t>(constituents.size()), 7};
312 input_tensors.push_back(Ort::Value::CreateTensor<float>(
313 memory_info,
314 constituents_values.data(), constituents_values.size(), const_dim.data(), const_dim.size()
315 )
316 );
317
318 std::vector<int64_t> inter_dim = {1, static_cast<int64_t>(constituents.size()), static_cast<int64_t>(constituents.size()), 4};
319 input_tensors.push_back(Ort::Value::CreateTensor<float>(
320 memory_info,
321 interactions_values.data(), interactions_values.size(), inter_dim.data(), inter_dim.size()
322 )
323 );
324
325 auto output_tensors = m_session->Run(Ort::RunOptions{nullptr}, m_input_node_names.data(), input_tensors.data(), m_input_node_names.size(), m_output_node_names.data(), m_output_node_names.size());
326 assert(output_tensors.size() == 1 && output_tensors.front().IsTensor());
327
328 // Get pointer to output tensor float values
329 float* floatarr = output_tensors.front().GetTensorMutableData<float>();
330 int arrSize = sizeof(*floatarr)/sizeof(floatarr[0]);
331
332 // show true label for the test input
333 ATH_MSG_DEBUG("Label for the input test data = "<<output_tensor_values);
334 float ConstScore = -999;
335 int max_index = 0;
336 for (int i = 0; i < arrSize; i++){
337 ATH_MSG_VERBOSE("Score for class "<<i<<" = "<<floatarr[i]<<std::endl);
338 ATH_MSG_VERBOSE(" +++ Score for class "<<i<<" = "<<floatarr[i]<<std::endl);
339 if (ConstScore<floatarr[i]){
340 ConstScore = floatarr[i];
341 max_index = i;
342 }
343 }
344 ATH_MSG_DEBUG("Class: "<<max_index<<" has the highest score: "<<floatarr[max_index]);
345
346 return ConstScore;
347
348 } // end retrieve constituents score ----
349
350 // constituents transformer based with const/mask/inter variables
351 double JSSMLTool::retrieveConstituentsScore(std::vector<std::vector<float>> constituents, std::vector<std::vector<std::vector<float>>> interactions, std::vector<std::vector<float>> mask) const {
352
353 // the format of the constituents/interaction variables is:
354 // constituents ---> (nConstituents, 7)
355 // interactions ---> (i, j, 4), with i, j in {nConstituents}
356 // masks ---> (nConstituents, 1)
357 // the packing can be done for any kind of low level inputs
358 // i.e. PFO/UFO constituents, topo-towers, tracks, etc
359 // they can be concatened one after the other in case of multiple inputs
360
361 //*************************************************************************
362 // Score the model using sample data, and inspect values
363 // loading input data
364
365 std::vector<int> output_tensor_values_ = ReadOutputLabels();
366
367 int testSample = 0;
368
369 //preparing container to hold output data
370 int output_tensor_values = output_tensor_values_[testSample];
371
372 // prepare the inputs
373 auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
374 std::vector<Ort::Value> input_tensors;
375
376 // unroll the inputs
377 std::vector<float> constituents_values;
378 for (long unsigned int j=0; j<7; j++) {
379 for (long unsigned int i=0; i<constituents.size(); i++) {
380 constituents_values.push_back(constituents.at(i).at(j));
381 }
382 }
383
384 std::vector<float> interactions_values;
385 for (long unsigned int k=0; k<4; k++) {
386 for (long unsigned int i=0; i<interactions.size(); i++) {
387 for (long unsigned int j=0; j<interactions.size(); j++) {
388 interactions_values.push_back(interactions.at(i).at(j).at(k));
389 }
390 }
391 }
392
393 std::vector<float> mask_values;
394 for (long unsigned int j=0; j<1; j++) {
395 for (long unsigned int i=0; i<mask.size(); i++) {
396 mask_values.push_back(mask.at(i).at(j));
397 }
398 }
399
400 std::vector<int64_t> const_dim = {1, 7, static_cast<int64_t>(constituents.size())};
401 input_tensors.push_back(Ort::Value::CreateTensor<float>(
402 memory_info,
403 constituents_values.data(), constituents_values.size(), const_dim.data(), const_dim.size()
404 )
405 );
406
407 std::vector<int64_t> inter_dim = {1, 4, static_cast<int64_t>(interactions.size()), static_cast<int64_t>(interactions.size())};
408 input_tensors.push_back(Ort::Value::CreateTensor<float>(
409 memory_info,
410 interactions_values.data(), interactions_values.size(), inter_dim.data(), inter_dim.size()
411 )
412 );
413
414 std::vector<int64_t> mask_dim = {1, 1, static_cast<int64_t>(mask.size())};
415 input_tensors.push_back(Ort::Value::CreateTensor<float>(
416 memory_info,
417 mask_values.data(), mask_values.size(), mask_dim.data(), mask_dim.size()
418 )
419 );
420
421 auto output_tensors = m_session->Run(Ort::RunOptions{nullptr}, m_input_node_names.data(), input_tensors.data(), m_input_node_names.size(), m_output_node_names.data(), m_output_node_names.size());
422 assert(output_tensors.size() == 1 && output_tensors.front().IsTensor());
423
424 // Get pointer to output tensor float values
425 float* floatarr = output_tensors.front().GetTensorMutableData<float>();
426 int arrSize = sizeof(*floatarr)/sizeof(floatarr[0]);
427
428 // show true label for the test input
429 ATH_MSG_DEBUG("Label for the input test data = "<<output_tensor_values);
430 float ConstScore = -999;
431 int max_index = 0;
432 for (int i = 0; i < arrSize; i++){
433 ATH_MSG_VERBOSE("Score for class "<<i<<" = "<<floatarr[i]<<std::endl);
434 ATH_MSG_VERBOSE(" +++ Score for class "<<i<<" = "<<floatarr[i]<<std::endl);
435 if (ConstScore<floatarr[i]){
436 ConstScore = floatarr[i];
437 max_index = i;
438 }
439 }
440 ATH_MSG_DEBUG("Class: "<<max_index<<" has the highest score: "<<floatarr[max_index]);
441
442 return ConstScore;
443
444 } // end retrieve constituents score ----
445
446 // constituents transformer based with const/mask/inter variables
447 std::vector<float> JSSMLTool::retrieveConstituentsScoreMultiClass(const std::vector<std::vector<float>>& constituents, const std::vector<std::vector<std::vector<float>>>& interactions, const std::vector<std::vector<float>>& mask) const {
448
449 // the format of the constituents/interaction variables is:
450 // constituents ---> (nConstituents, 9)
451 // interactions ---> (i, j, 4), with i, j in {nConstituents}
452 // masks ---> (nConstituents, 1)
453 // the packing can be done for any kind of low level inputs
454 // i.e. PFO/UFO constituents, topo-towers, tracks, etc
455 // they can be concatened one after the other in case of multiple inputs
456
457 //*************************************************************************
458 // Score the model using sample data, and inspect values
459 // loading input data
460
461 // input info
462 const int nParticleVariables = 9;
463 const int nInteractionVariables = 4;
464
465 std::vector<int> output_tensor_values_ = ReadOutputLabels();
466
467 int testSample = 0;
468
469 //preparing container to hold output data
470 int output_tensor_values = output_tensor_values_[testSample];
471
472 // prepare the inputs
473 auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
474 std::vector<Ort::Value> input_tensors;
475
476 // unroll the inputs
477 std::vector<float> constituents_values;
478 for (const auto& c : constituents)
479 constituents_values.insert(constituents_values.end(), c.begin(), c.end());
480
481 std::vector<float> interactions_values;
482 for (const auto& inter_i : interactions) {
483 for (const auto& inter_j : inter_i)
484 interactions_values.insert(interactions_values.end(), inter_j.begin(), inter_j.end());
485 }
486
487 std::vector<uint8_t> mask_values;
488 for (const auto& m : mask)
489 mask_values.push_back(m[0]);
490
491 std::vector<int64_t> const_dim = {1, static_cast<int64_t>(constituents.size()), nParticleVariables};
492 input_tensors.push_back(Ort::Value::CreateTensor<float>(
493 memory_info,
494 constituents_values.data(), constituents_values.size(), const_dim.data(), const_dim.size()
495 )
496 );
497
498 std::vector<int64_t> inter_dim = {1, static_cast<int64_t>(interactions.size()), static_cast<int64_t>(interactions.size()), nInteractionVariables};
499 input_tensors.push_back(Ort::Value::CreateTensor<float>(
500 memory_info,
501 interactions_values.data(), interactions_values.size(), inter_dim.data(), inter_dim.size()
502 )
503 );
504
505 std::vector<int64_t> mask_dim = {1, static_cast<int64_t>(mask.size())};
506 input_tensors.push_back(Ort::Value::CreateTensor<bool>(
507 memory_info,
508 reinterpret_cast<bool*>(mask_values.data()),
509 mask_values.size(), mask_dim.data(), mask_dim.size()
510 )
511 );
512
513 std::vector<Ort::Value> output_tensors = m_session->Run(Ort::RunOptions{nullptr}, m_input_node_names.data(), input_tensors.data(), m_input_node_names.size(), m_output_node_names.data(), m_output_node_names.size());
514 assert(output_tensors.front().IsTensor());
515
516 // Get pointer to output tensor float values
517 float* floatarr = output_tensors.front().GetTensorMutableData<float>();
518 auto info = output_tensors.front().GetTensorTypeAndShapeInfo();
519 size_t arrSize = info.GetElementCount();
520
521 // show true label for the test input
522 ATH_MSG_DEBUG("Label for the input test data = "<<output_tensor_values);
523 std::vector<float> ConstScores;
524 for (long unsigned int i = 0; i < arrSize; i++){
525 ATH_MSG_VERBOSE(" +++ Score for class " << i << " = " << floatarr[i]);
526 ConstScores.push_back(floatarr[i]);
527 }
528
529 return ConstScores;
530
531 } // end retrieve constituents score ----
532
533 // dedicated DisCo/DNN method ---
534 double JSSMLTool::retrieveHighLevelScore(std::map<std::string, double> JSSVars) const {
535
536 //*************************************************************************
537 // Score the model using sample data, and inspect values
538
539 //preparing container to hold input data
540 size_t input_tensor_size = m_nvars;
541 std::vector<float> input_tensor_values(m_nvars);
542
543 // loading input data
544 input_tensor_values = ReadJSSInputs(JSSVars);
545
546 // preparing container to hold output data
547 int testSample = 0;
548 std::vector<int> output_tensor_values_ = ReadOutputLabels();
549 int output_tensor_values = output_tensor_values_[testSample];
550
551 // create input tensor object from data values
552 auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
553
554 // we need a multiple tensor input structure for DisCo model
555 Ort::Value input1 = Ort::Value::CreateTensor<float>(memory_info, const_cast<float*>(input_tensor_values.data()), input_tensor_size, m_input_node_dims.data(), m_input_node_dims.size());
556 std::vector<float> empty = {1.};
557 Ort::Value input2 = Ort::Value::CreateTensor<float>(memory_info, empty.data(), 1, m_input_node_dims.data(), m_input_node_dims.size());
558 Ort::Value input3 = Ort::Value::CreateTensor<float>(memory_info, empty.data(), 1, m_input_node_dims.data(), m_input_node_dims.size());
559 Ort::Value input4 = Ort::Value::CreateTensor<float>(memory_info, empty.data(), 1, m_input_node_dims.data(), m_input_node_dims.size());
560 std::vector<Ort::Value> input_tensor;
561 std::vector<int64_t> aaa = {1, m_nvars};
562 input_tensor.emplace_back(
563 Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_size, aaa.data(), aaa.size())
564 );
565 input_tensor.emplace_back(
566 Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_size, m_input_node_dims.data(), m_input_node_dims.size())
567 );
568 input_tensor.emplace_back(
569 Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_size, m_input_node_dims.data(), m_input_node_dims.size())
570 );
571 input_tensor.emplace_back(
572 Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_size, m_input_node_dims.data(), m_input_node_dims.size())
573 );
574
575 auto output_tensors = m_session->Run(Ort::RunOptions{nullptr}, m_input_node_names.data(), input_tensor.data(), m_input_node_names.size(), m_output_node_names.data(), m_output_node_names.size());
576 assert(output_tensors.size() == 1 && output_tensors.front().IsTensor());
577
578 // Get pointer to output tensor float values
579 float* floatarr = output_tensors.front().GetTensorMutableData<float>();
580 int arrSize = sizeof(*floatarr)/sizeof(floatarr[0]);
581
582 // show true label for the test input
583 ATH_MSG_DEBUG("Label for the input test data = "<<output_tensor_values);
584 float HLScore = -999;
585 int max_index = 0;
586 for (int i = 0; i < arrSize; i++){
587 ATH_MSG_VERBOSE("Score for class "<<i<<" = "<<floatarr[i]<<std::endl);
588 if (HLScore<floatarr[i]){
589 HLScore = floatarr[i];
590 max_index = i;
591 }
592 }
593 ATH_MSG_DEBUG("Class: "<<max_index<<" has the highest score: "<<floatarr[max_index]);
594
595 return HLScore;
596
597 } // end retrieve HighLevel score ----
598
599 // extra methods
600 StatusCode JSSMLTool::SetScaler(std::map<std::string, std::vector<double>> scaler){
601 m_scaler = scaler;
602
603 // ToDo:
604 // this will have an overriding config as property
605 m_JSSInputMap = {
606 {0,"pT"}, {1,"CNN"}, {2,"D2"}, {3,"nTracks"}, {4,"ZCut12"},
607 {5,"Tau1_wta"}, {6,"Tau2_wta"}, {7,"Tau3_wta"},
608 {8,"KtDR"}, {9,"Split12"}, {10,"Split23"},
609 {11,"ECF1"}, {12,"ECF2"}, {13,"ECF3"},
610 {14,"Angularity"}, {15,"FoxWolfram0"}, {16,"FoxWolfram2"},
611 {17,"Aplanarity"}, {18,"PlanarFlow"}, {19,"Qw"},
612 };
613 m_nvars = m_JSSInputMap.size();
614
615 return StatusCode::SUCCESS;
616 }
617
618} // namespace AthONNX
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
size_t size() const
Number of registered mappings.
static const Attributes_t empty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
std::string m_modelFileName
Name of the model file to load.
Definition JSSMLTool.h:83
std::map< std::string, std::vector< double > > m_scaler
Definition JSSMLTool.h:77
StatusCode SetScaler(std::map< std::string, std::vector< double > > scaler) override
virtual double retrieveHighLevelScore(std::map< std::string, double > JSSVars) const override
virtual StatusCode initialize() override
Function initialising the tool.
Definition JSSMLTool.cxx:83
std::vector< float > ReadJetImagePixels(std::vector< TH2D > Images) const
Definition JSSMLTool.cxx:17
JSSMLTool(const std::string &name)
Definition JSSMLTool.cxx:73
virtual std::vector< float > retrieveConstituentsScoreMultiClass(const std::vector< std::vector< float > > &constituents, const std::vector< std::vector< std::vector< float > > > &interactions, const std::vector< std::vector< float > > &mask) const override
std::vector< int > ReadOutputLabels() const
Definition JSSMLTool.cxx:63
std::unique_ptr< Ort::Env > m_env
Definition JSSMLTool.h:75
std::vector< int64_t > m_output_node_dims
Definition JSSMLTool.h:93
virtual double retrieveConstituentsScore(std::vector< TH2D > Images) const override
Function executing the tool for a single event.
size_t m_num_output_nodes
Definition JSSMLTool.h:94
size_t m_num_input_nodes
Definition JSSMLTool.h:89
std::vector< float > ReadJSSInputs(std::map< std::string, double > JSSVars) const
Definition JSSMLTool.cxx:39
std::vector< const char * > m_output_node_names
Definition JSSMLTool.h:95
std::vector< int64_t > m_input_node_dims
Definition JSSMLTool.h:88
std::map< int, std::string > m_JSSInputMap
Definition JSSMLTool.h:78
std::vector< const char * > m_input_node_names
Definition JSSMLTool.h:90
std::unique_ptr< Ort::Session > m_session
Definition JSSMLTool.h:74
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
STL namespace.