 |
ATLAS Offline Software
|
#include <FPGATrackSimNNTrackTool.h>
|
Gaudi::Property< unsigned int > | m_minNumberOfRealHitsInATrack { this, "MinNumberOfRealHitsInATrack", 4, "Minimum number of real hits in a track candidate to process" } |
|
Gaudi::Property< bool > | m_doGNNTracking { this, "doGNNTracking", false, "Flag to turn on GNN Tracking configuration for road-to-track" } |
|
Gaudi::Property< int > | m_nInputsGNN { this, "nInputsGNN", 9, "Number of Hit Inputs for NN for GNN configuration. Depends on which model is chosen."} |
|
Gaudi::Property< bool > | m_useCartesian { this, "useCartesian", true, "If true, NNs use Cartestian coordinates. If false,they use cylindrical coordiantes"} |
|
TString | m_fileName |
|
|
ServiceHandle< IFPGATrackSimBankSvc > | m_FPGATrackSimBank { this,"FPGATrackSimBankSvc","FPGATrackSimBankSvc" } |
|
ToolHandle< IFPGATrackSimRoadFilterTool > | m_spRoadFilterTool {this, "SPRoadFilterTool", "FPGATrackSimSpacepointRoadFilterTool", "Spacepoint Road Filter Tool"} |
|
Gaudi::Property< bool > | m_doRegionalMapping { this, "RegionalMapping", false, "Use the sub-region maps to define the sector" } |
|
Gaudi::Property< bool > | m_doEtaPatternConsts { this, "doEtaPatternConsts", false, "Whether to use the eta pattern tool for constant generation" } |
|
Gaudi::Property< bool > | m_useSpacePoints { this, "useSpacePoints", false, "Whether we are using spacepoints." } |
|
Gaudi::Property< bool > | m_useSectors { this, "useSectors", false, "Will reverse calculate the sector for track-fitting purposes" } |
|
Gaudi::Property< bool > | m_idealGeoRoads { this, "IdealGeoRoads", true, "Set sectors to use ideal geometry fit constants" } |
|
Gaudi::Property< bool > | m_isSecondStage { this, "isSecondStage", true, "Is this the second stage?" } |
|
Gaudi::Property< bool > | m_do2ndStage {this, "Do2ndStageTrackFit", false, "Do 2nd stage track fit"} |
|
Definition at line 37 of file FPGATrackSimNNTrackTool.h.
◆ FPGATrackSimNNTrackTool()
FPGATrackSimNNTrackTool::FPGATrackSimNNTrackTool |
( |
const std::string & |
algname, |
|
|
const std::string & |
name, |
|
|
const IInterface * |
ifc |
|
) |
| |
◆ compute_truth()
Definition at line 973 of file FPGATrackSimNNTrackTool.cxx.
974 std::vector<FPGATrackSimMultiTruth> mtv;
978 if (!(
t.getHitMap() & (1 <<
layer)))
continue;
981 if (
layer <
t.getFPGATrackSimHits().size())
982 mtv.push_back(
t.getFPGATrackSimHits().at(
layer).getTruth());
986 mtv.back().assign_equal_normalization();
996 const bool ok = mt.best(tbarcode, tfrac);
998 t.setEventIndex(tbarcode.first);
999 t.setBarcode(tbarcode.second);
1000 t.setBarcodeFrac(tfrac);
◆ getD0Scale()
static float FPGATrackSimNNTrackTool::getD0Scale |
( |
| ) |
|
|
inlinestatic |
◆ getEtaScale()
static float FPGATrackSimNNTrackTool::getEtaScale |
( |
| ) |
|
|
inlinestatic |
◆ getInputNodesDims()
const std::vector<int64_t>& OnnxRuntimeBase::getInputNodesDims |
( |
| ) |
|
|
inlineinherited |
◆ getOutputNodesDims()
const std::vector<int64_t>& OnnxRuntimeBase::getOutputNodesDims |
( |
| ) |
|
|
inlineinherited |
◆ getPhiScale()
static float FPGATrackSimNNTrackTool::getPhiScale |
( |
| ) |
|
|
inlinestatic |
◆ getQoverPtScale()
static float FPGATrackSimNNTrackTool::getQoverPtScale |
( |
| ) |
|
|
inlinestatic |
◆ getRScale()
static float FPGATrackSimNNTrackTool::getRScale |
( |
| ) |
|
|
inlinestatic |
◆ getTracks_1st()
should be 2 missing coords for pixel
now we have saved our values, time to run inference and get the output
Definition at line 233 of file FPGATrackSimNNTrackTool.cxx.
237 return StatusCode::SUCCESS;
243 std::vector<std::vector<float> >inputTensorValuesAll;
246 for (
auto const &iroad : roads) {
248 double y = iroad->getY();
256 for (
unsigned ilayer = 0; ilayer < planeMap->
getNLogiLayers(); ilayer++) {
257 if ((missing_mask >> ilayer) & 0
x1) {
259 if (planeMap->
isPixel(ilayer)) nMissing++;
285 std::vector<std::vector<int>> combs;
290 for (
size_t icomb = 0; icomb < combs.size(); icomb++) {
291 std::vector<float> inputTensorValues;
292 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
295 std::vector<int>
const &hit_indices = combs[icomb];
301 if (hit_indices[
layer] >= 0) {
303 std::shared_ptr<const FPGATrackSimHit> hit = iroad->getHits(
layer)[hit_indices[
layer]];
306 hit_list.push_back(hit);
312 std::sort(hit_list.begin(), hit_list.end(),
313 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
314 double rho1 = std::hypot(hit1->getX(), hit1->getY());
315 double rho2 = std::hypot(hit2->getX(), hit2->getY());
322 double rotateAngle = 0;
323 bool gotSecondSP =
false;
330 for (
const auto &hit : hit_list) {
332 float x0 = hit->
getX();
333 float y0 = hit->
getY();
335 float r0 = std::sqrt(x0*x0+y0*y0);
353 if (flipZ)
zf =
z0 * -1;
367 inputTensorValues.push_back(xf_scaled);
368 inputTensorValues.push_back(yf_scaled);
369 inputTensorValues.push_back(zf_scaled);
377 inputTensorValues.push_back(rf_scaled);
378 inputTensorValues.push_back(phif_scaled);
379 inputTensorValues.push_back(zf_scaled);
382 else if (!gotSecondSP) {
393 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
394 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
395 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
398 inputTensorValues.push_back(xf_scaled);
399 inputTensorValues.push_back(yf_scaled);
400 inputTensorValues.push_back(zf_scaled);
404 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
405 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
406 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
407 inputTensorValues.push_back(rf_scaled);
408 inputTensorValues.push_back(phif_scaled);
409 inputTensorValues.push_back(zf_scaled);
418 inputTensorValues.push_back(xf_scaled);
419 inputTensorValues.push_back(yf_scaled);
420 inputTensorValues.push_back(zf_scaled);
427 inputTensorValues.push_back(rf_scaled);
428 inputTensorValues.push_back(phif_scaled);
429 inputTensorValues.push_back(zf_scaled);
437 inputTensorValues.resize(15);
439 inputTensorValuesAll.push_back(inputTensorValues);
445 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
448 tracks.push_back(track_cand);
458 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
460 float nn_val = NNoutputs[itrack][0];
462 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
464 tracks[itrack].setOrigChi2(
chi2);
465 tracks[itrack].setChi2(
chi2);
473 return StatusCode::SUCCESS;
◆ getTracks_2nd()
should be 2 missing coords for pixel
now we have saved our values, time to run inference and get the output
Definition at line 477 of file FPGATrackSimNNTrackTool.cxx.
481 std::vector<std::vector<float> >inputTensorValuesAll;
484 for (
auto const &iroad : roads) {
486 double y = iroad->getY();
493 for (
unsigned ilayer = 0; ilayer < 13; ilayer++) {
494 if ((missing_mask >> ilayer) & 0
x1) {
496 if (planeMap->
isPixel(ilayer)) nMissing++;
499 hit_mask |= (0x1 << ilayer);
523 std::vector<std::vector<int>> combs =
527 for (
size_t icomb = 0; icomb < combs.size(); icomb++) {
528 std::vector<float> inputTensorValues;
531 std::vector<int>
const &hit_indices = combs[icomb];
532 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
538 if (hit_indices[
layer] >= 0) {
540 std::shared_ptr<const FPGATrackSimHit> hit = iroad->getHits(
layer)[hit_indices[
layer]];
543 hit_list.push_back(hit);
549 std::sort(hit_list.begin(), hit_list.end(),
550 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
551 double rho1 = std::hypot(hit1->getX(), hit1->getY());
552 double rho2 = std::hypot(hit2->getX(), hit2->getY());
559 double rotateAngle = 0;
560 bool gotSecondSP =
false;
567 for (
const auto &hit : hit_list) {
570 float x0 = hit->
getX();
571 float y0 = hit->
getY();
573 float r0 = std::sqrt(x0*x0+y0*y0);
593 if (flipZ)
zf =
z0 * -1;
607 inputTensorValues.push_back(xf_scaled);
608 inputTensorValues.push_back(yf_scaled);
609 inputTensorValues.push_back(zf_scaled);
616 inputTensorValues.push_back(rf_scaled);
617 inputTensorValues.push_back(phif_scaled);
618 inputTensorValues.push_back(zf_scaled);
621 else if (!gotSecondSP) {
632 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
633 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
634 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
637 inputTensorValues.push_back(xf_scaled);
638 inputTensorValues.push_back(yf_scaled);
639 inputTensorValues.push_back(zf_scaled);
643 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
644 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
645 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
646 inputTensorValues.push_back(rf_scaled);
647 inputTensorValues.push_back(phif_scaled);
648 inputTensorValues.push_back(zf_scaled);
657 inputTensorValues.push_back(xf_scaled);
658 inputTensorValues.push_back(yf_scaled);
659 inputTensorValues.push_back(zf_scaled);
666 inputTensorValues.push_back(rf_scaled);
667 inputTensorValues.push_back(phif_scaled);
668 inputTensorValues.push_back(zf_scaled);
674 if (inputTensorValues.size() < 39) {
675 inputTensorValues.resize(39, 0.0
f);
677 else if (inputTensorValues.size() > 39) {
678 inputTensorValues.resize(39);
680 inputTensorValuesAll.push_back(inputTensorValues);
690 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
693 tracks.push_back(track_cand);
700 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
702 float nn_val = NNoutputs[itrack][0];
705 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
707 tracks[itrack].setOrigChi2(
chi2);
708 tracks[itrack].setChi2(
chi2);
717 return StatusCode::SUCCESS;
◆ getTracks_GNN()
should be 2 missing coords for pixel
now we have saved our values, time to run inference and get the output
Definition at line 720 of file FPGATrackSimNNTrackTool.cxx.
725 std::vector<std::vector<float> >inputTensorValuesAll;
728 for (
auto const &iroad : roads) {
732 double y = iroad->getY();
738 for (
unsigned ilayer = 0; ilayer < 13; ilayer++) {
739 if ((missing_mask >> ilayer) & 0
x1) {
741 if (planeMap->
isPixel(ilayer)) nMissing++;
744 hit_mask |= (0x1 << ilayer);
770 std::vector<std::vector<int>> combs;
771 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_hits;
773 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_pixel_hits;
774 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_strip_hits;
775 size_t pixelCount = 0;
778 all_hits.insert(all_hits.end(), iroad->getHits(
layer).begin(), iroad->getHits(
layer).end());
781 for (
const auto& hit : all_hits) {
787 if (pixelCount < 1)
continue;
789 std::vector<float> inputTensorValues;
790 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
792 for (
const auto &hit : all_hits) {
794 hit_list.push_back(hit);
801 std::sort(hit_list.begin(), hit_list.end(),
802 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
803 double rho1 = std::hypot(hit1->getX(), hit1->getY());
804 double rho2 = std::hypot(hit2->getX(), hit2->getY());
811 double rotateAngle = 0;
812 bool gotSecondSP =
false;
820 for (
const auto &hit : hit_list) {
822 float x0 = hit->getX();
823 float y0 = hit->getY();
824 float z0 = hit->getZ();
825 float r0 = std::sqrt(x0*x0+y0*y0);
826 float phi0 = hit->getGPhi();
845 if (flipZ)
zf =
z0 * -1;
850 if (hit->isStrip()) {
859 inputTensorValues.push_back(xf_scaled);
860 inputTensorValues.push_back(yf_scaled);
861 inputTensorValues.push_back(zf_scaled);
869 inputTensorValues.push_back(rf_scaled);
870 inputTensorValues.push_back(phif_scaled);
871 inputTensorValues.push_back(zf_scaled);
874 else if (!gotSecondSP) {
885 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
886 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
887 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
890 inputTensorValues.push_back(xf_scaled);
891 inputTensorValues.push_back(yf_scaled);
892 inputTensorValues.push_back(zf_scaled);
896 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
897 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
898 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
899 inputTensorValues.push_back(rf_scaled);
900 inputTensorValues.push_back(phif_scaled);
901 inputTensorValues.push_back(zf_scaled);
910 inputTensorValues.push_back(xf_scaled);
911 inputTensorValues.push_back(yf_scaled);
912 inputTensorValues.push_back(zf_scaled);
919 inputTensorValues.push_back(rf_scaled);
920 inputTensorValues.push_back(phif_scaled);
921 inputTensorValues.push_back(zf_scaled);
934 inputTensorValuesAll.push_back(inputTensorValues);
938 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
941 tracks.push_back(track_cand);
951 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
953 float nn_val = NNoutputs[itrack][0];
955 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
956 tracks[itrack].setOrigChi2(
chi2);
957 tracks[itrack].setChi2(
chi2);
966 return StatusCode::SUCCESS;
◆ getXScale()
static float FPGATrackSimNNTrackTool::getXScale |
( |
| ) |
|
|
inlinestatic |
◆ getYScale()
static float FPGATrackSimNNTrackTool::getYScale |
( |
| ) |
|
|
inlinestatic |
◆ getZ0Scale()
static float FPGATrackSimNNTrackTool::getZ0Scale |
( |
| ) |
|
|
inlinestatic |
◆ getZScale()
static float FPGATrackSimNNTrackTool::getZScale |
( |
| ) |
|
|
inlinestatic |
◆ initialize() [1/2]
StatusCode FPGATrackSimNNTrackTool::initialize |
( |
| ) |
|
|
overridevirtual |
Definition at line 25 of file FPGATrackSimNNTrackTool.cxx.
34 ATH_MSG_ERROR(
"Path to 1st stage NN-based fake track removal ONNX file is empty! If you want to run this pipeline, you need to provide an input file.");
35 return StatusCode::FAILURE;
42 ATH_MSG_INFO(
"Path 1st stage to NN-based track parameter estimation ONNX file is empty! Estimation is not run...");
50 ATH_MSG_ERROR(
"Path to 2nd stage NN-based fake track 1st stage removal ONNX file is empty! If you want to run this pipeline, you need to provide an input file.");
51 return StatusCode::FAILURE;
58 ATH_MSG_INFO(
"Path to 2nd stage NN-based track parameter estimation 2nd ONNX file is empty! Estimation is not run...");
62 return StatusCode::SUCCESS;
◆ initialize() [2/2]
void OnnxRuntimeBase::initialize |
( |
TString |
fileName | ) |
|
|
inherited |
Definition at line 16 of file OnnxRuntimeBase.cxx.
20 m_env = std::make_unique< Ort::Env >(ORT_LOGGING_LEVEL_WARNING,
"");
23 Ort::SessionOptions session_options;
25 session_options.SetIntraOpNumThreads(1);
26 session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
30 Ort::AllocatorWithDefaultOptions allocator;
32 size_t numInputNodes =
m_session->GetInputCount();
34 for (
size_t i = 0;
i < numInputNodes;
i++)
37 char* input_name =
new char[strlen(
name.get()) + 1];
38 strcpy(input_name,
name.get());
43 Ort::TypeInfo inputTypeInfo =
m_session->GetInputTypeInfo(
i);
44 auto tensorInfo = inputTypeInfo.GetTensorTypeAndShapeInfo();
49 size_t numOutputNodes =
m_session->GetOutputCount();
51 for (
size_t i = 0;
i < numOutputNodes;
i++)
54 char* output_name =
new char[strlen(
name.get()) + 1];
55 strcpy(output_name,
name.get());
59 Ort::TypeInfo outputTypeInfo =
m_session->GetOutputTypeInfo(
i);
60 auto tensorInfo = outputTypeInfo.GetTensorTypeAndShapeInfo();
◆ matchIdealGeoSector()
Definition at line 36 of file FPGATrackSimTrackingToolBase.cxx.
46 double qoverpt =
r.getY()*0.001;
48 qoverpt = std::abs(qoverpt);
52 const std::vector<double> &qoverpt_bins = sectorbank->
getQOverPtBins();
53 auto bounds = std::equal_range(qoverpt_bins.begin(), qoverpt_bins.end(), qoverpt);
57 sectorbin = std::clamp(sectorbin, 0, 10 *
static_cast<int>(qoverpt_bins.size() - 2));
61 int subregion =
r.getSubRegion();
65 std::vector<module_t> modules(
r.getNLayers(), -1);
67 for (
unsigned int il = 0;
il <
r.getNLayers();
il++) {
68 if (
r.getNHits_layer()[
il] == 0) {
71 wc_layers |= (0x1 <<
il);
73 std::unique_ptr<FPGATrackSimHit> wcHit = std::make_unique<FPGATrackSimHit>();
83 r.setHits(
il,{std::move(wcHit)});
86 modules[
il]= sectorbin;
89 r.setWCLayers(wc_layers);
100 r.setSectorBin(sectorbin);
◆ OnnxRuntimeBase() [1/2]
OnnxRuntimeBase::OnnxRuntimeBase |
|
private |
◆ OnnxRuntimeBase() [2/2]
OnnxRuntimeBase::OnnxRuntimeBase |
|
private |
◆ runONNXInference() [1/3]
std::vector< std::vector< float > > OnnxRuntimeBase::runONNXInference |
( |
NetworkBatchInput & |
inputTensorValues | ) |
const |
|
inherited |
Definition at line 96 of file OnnxRuntimeBase.cxx.
98 int batchSize = inputTensorValues.rows();
104 if (inputNodeDims[0] == -1)
106 inputNodeDims[0] = batchSize;
108 if (outputNodeDims[0] == -1)
110 outputNodeDims[0] = batchSize;
113 if(inputNodeDims[1]*inputNodeDims[2] != inputTensorValues.cols() && inputNodeDims[1] != inputTensorValues.cols())
115 throw std::runtime_error(
"runONNXInference: feature size doesn't match the input size: inputSize required: " +
std::to_string(inputNodeDims[1]*inputNodeDims[2]) +
" inputSize provided: " +
std::to_string(inputTensorValues.cols()));
118 if (batchSize != 1 && (inputNodeDims[0] != batchSize || outputNodeDims[0] != batchSize))
120 throw std::runtime_error(
"runONNXInference: batch size doesn't match the input or output node size");
125 Ort::MemoryInfo memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
126 Ort::Value inputTensor = Ort::Value::CreateTensor<float>(memoryInfo, inputTensorValues.data(), inputTensorValues.size(),inputNodeDims.data(), inputNodeDims.size());
128 if (!inputTensor.IsTensor())
130 throw std::runtime_error(
"runONNXInference: conversion of input to Tensor failed. ");
133 Ort::RunOptions run_options;
134 std::vector<Ort::Value> outputTensors =
140 if (!outputTensors[0].IsTensor() || (outputTensors.size() !=
m_outputNodeNames.size())) {
141 throw std::runtime_error(
"runONNXInference: calculation of output failed. ");
145 float* outputTensor = outputTensors.front().GetTensorMutableData<
float>();
147 std::vector<std::vector<float>> outputTensorValues(batchSize, std::vector<float>(outputNodeDims[1], -1));
148 for (
int i = 0;
i < outputNodeDims[0];
i++)
150 for (
int j = 0; j < ((outputNodeDims.size() > 1) ? outputNodeDims[1] : 1); j++)
152 outputTensorValues[
i][j] = outputTensor[
i * outputNodeDims[1] + j];
156 return outputTensorValues;
◆ runONNXInference() [2/3]
std::vector< float > OnnxRuntimeBase::runONNXInference |
( |
std::vector< float > & |
inputTensorValues | ) |
const |
|
inherited |
Definition at line 84 of file OnnxRuntimeBase.cxx.
87 for (
size_t i = 0;
i < inputTensorValues.size();
i++) {
88 vectorInput(0,
i) = inputTensorValues[
i];
91 return vectorOutput[0];
◆ runONNXInference() [3/3]
std::vector< std::vector< float > > OnnxRuntimeBase::runONNXInference |
( |
std::vector< std::vector< float > > & |
inputTensorValues | ) |
const |
|
inherited |
Definition at line 66 of file OnnxRuntimeBase.cxx.
68 std::vector<std::vector<float> >
output;
69 if (inputTensorValues.size() == 0)
return output;
71 NetworkBatchInput vectorInput(inputTensorValues.size(), inputTensorValues[0].size());
72 for (
size_t i = 0;
i < inputTensorValues.size();
i++) {
73 for (
size_t j = 0; j < inputTensorValues[
i].size(); j++) {
74 vectorInput(
i,j) = inputTensorValues[
i][j];
◆ runONNXInferenceMultilayerOutput()
std::map< int, Eigen::MatrixXf > OnnxRuntimeBase::runONNXInferenceMultilayerOutput |
( |
NetworkBatchInput & |
inputTensorValues | ) |
const |
|
inherited |
Definition at line 162 of file OnnxRuntimeBase.cxx.
164 const int batchSize = inputTensorValues.rows();
170 if (inputNodeDims[0] == -1)
172 inputNodeDims[0] = batchSize;
174 if (outputNodeDims[0] == -1)
176 outputNodeDims[0] = batchSize;
179 if(inputNodeDims[1] != inputTensorValues.cols())
181 throw std::runtime_error(
"runONNXInference: feature size doesn't match the input size: inputSize required: " +
std::to_string(inputNodeDims[1]) +
" inputSize provided: " +
std::to_string(inputTensorValues.cols()));
184 if (batchSize != 1 &&(inputNodeDims[0] != batchSize || outputNodeDims[0] != batchSize))
186 throw std::runtime_error(
"runONNXInference: batch size doesn't match the input or output node size");
190 Ort::MemoryInfo memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
191 Ort::Value inputTensor = Ort::Value::CreateTensor<float>(memoryInfo, inputTensorValues.data(), inputTensorValues.size(), inputNodeDims.data(), inputNodeDims.size());
193 if (!inputTensor.IsTensor())
195 throw std::runtime_error(
"runONNXInference: conversion of input to Tensor failed. ");
198 Ort::RunOptions run_options;
199 std::vector<Ort::Value> outputTensors =
205 if (!outputTensors[0].IsTensor() || (outputTensors.size() !=
m_outputNodeNames.size())) {
206 throw std::runtime_error(
"runONNXInference: calculation of output failed. ");
210 std::map<int, Eigen::MatrixXf> outputTensorMap;
211 size_t numOutputNodes =
m_session->GetOutputCount();
212 for (
size_t i=0;
i<numOutputNodes;
i++){
215 float*
output = outputTensors.at(
i).GetTensorMutableData<
float>();
216 Ort::TypeInfo outputTypeInfo =
m_session->GetOutputTypeInfo(
i);
217 auto outputTensorInfo = outputTypeInfo.GetTensorTypeAndShapeInfo();
220 outputNodeDims = outputTensorInfo.GetShape();
222 int nNodes = outputNodeDims.size() > 1 ? outputNodeDims[1] : 1;
223 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> batchMatrix(batchSize, nNodes);
224 for (
int j = 0; j < batchSize; j++)
226 Eigen::VectorXf
vec(nNodes);
227 for (
int k = 0;
k<nNodes;
k++)
229 float val =
output[j * outputNodeDims[1] +
k];
232 batchMatrix.row(j) =
vec;
234 outputTensorMap[
i] = std::move(batchMatrix);
236 return outputTensorMap;
◆ setRoadSectors()
StatusCode FPGATrackSimTrackingToolBase::setRoadSectors |
( |
std::vector< std::shared_ptr< const FPGATrackSimRoad >> & |
roads | ) |
|
|
inherited |
Definition at line 11 of file FPGATrackSimTrackingToolBase.cxx.
13 for (
auto& road: roads)
15 std::shared_ptr<FPGATrackSimRoad> nonConstRoad = std::const_pointer_cast<FPGATrackSimRoad>(road);
27 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter_roads;
29 roads = std::move(postfilter_roads);
31 return StatusCode::SUCCESS;
◆ setTrackParameters()
only set this for tracks passing goodness of fit AND overlap removal
Definition at line 66 of file FPGATrackSimNNTrackTool.cxx.
68 ATH_MSG_DEBUG(
"Running NN-based track parameter estimation!");
69 std::vector<float> paramNNoutputs;
73 for (
auto &
track : tracks) {
74 if (!
track.passedOR())
continue;
75 std::vector<float> inputTensorValues;
76 const std::vector <FPGATrackSimHit>&
hits =
track.getFPGATrackSimHits();
77 bool gotSecondSP =
false;
84 for (
const auto& hit :
hits) {
85 if (!hit.isReal())
continue;
88 float xf = hit.getX();
89 float yf = hit.getY();
90 float zf = hit.getZ();
91 float rf = std::sqrt(xf*xf+yf*yf);
92 float phif = hit.getGPhi();
104 inputTensorValues.push_back(xf_scaled);
105 inputTensorValues.push_back(yf_scaled);
106 inputTensorValues.push_back(zf_scaled);
114 inputTensorValues.push_back(rf_scaled);
115 inputTensorValues.push_back(phif_scaled);
116 inputTensorValues.push_back(zf_scaled);
119 else if (!gotSecondSP) {
131 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
132 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
133 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
136 inputTensorValues.push_back(xf_scaled);
137 inputTensorValues.push_back(yf_scaled);
138 inputTensorValues.push_back(zf_scaled);
142 float rf_scaled = (rf+tmp_rf) / (2.*
getRScale());
143 float phif_scaled = (phif+tmp_phif) / (2.*
getPhiScale());
144 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
146 inputTensorValues.push_back(rf_scaled);
147 inputTensorValues.push_back(phif_scaled);
148 inputTensorValues.push_back(zf_scaled);
157 inputTensorValues.push_back(xf_scaled);
158 inputTensorValues.push_back(yf_scaled);
159 inputTensorValues.push_back(zf_scaled);
166 inputTensorValues.push_back(rf_scaled);
167 inputTensorValues.push_back(phif_scaled);
168 inputTensorValues.push_back(zf_scaled);
174 if (inputTensorValues.size() < 15) {
175 inputTensorValues.resize(15, 0.0
f);
183 if (inputTensorValues.size() < 39) {
184 inputTensorValues.resize(39, 0.0
f);
186 else if (inputTensorValues.size() > 39) {
187 inputTensorValues.resize(39);
200 for (
unsigned int i = 0;
i < paramNNoutputs.size();
i++) {
223 track.setQOverPt(qopt);
229 return StatusCode::SUCCESS;
◆ m_barcode
std::vector<int> FPGATrackSimNNTrackTool::m_barcode |
|
private |
◆ m_barcodefrac
std::vector<float> FPGATrackSimNNTrackTool::m_barcodefrac |
|
private |
◆ m_do2ndStage
Gaudi::Property<bool> FPGATrackSimTrackingToolBase::m_do2ndStage {this, "Do2ndStageTrackFit", false, "Do 2nd stage track fit"} |
|
protectedinherited |
◆ m_doEtaPatternConsts
Gaudi::Property<bool> FPGATrackSimTrackingToolBase::m_doEtaPatternConsts { this, "doEtaPatternConsts", false, "Whether to use the eta pattern tool for constant generation" } |
|
protectedinherited |
◆ m_doGNNTracking
Gaudi::Property<bool> FPGATrackSimNNTrackTool::m_doGNNTracking { this, "doGNNTracking", false, "Flag to turn on GNN Tracking configuration for road-to-track" } |
◆ m_doRegionalMapping
Gaudi::Property<bool> FPGATrackSimTrackingToolBase::m_doRegionalMapping { this, "RegionalMapping", false, "Use the sub-region maps to define the sector" } |
|
protectedinherited |
◆ m_env
std::unique_ptr< Ort::Env > OnnxRuntimeBase::m_env |
|
privateinherited |
◆ m_etamodule
std::vector<unsigned int> FPGATrackSimNNTrackTool::m_etamodule |
|
private |
◆ m_etawidth
std::vector<unsigned int> FPGATrackSimNNTrackTool::m_etawidth |
|
private |
◆ m_eventindex
std::vector<int> FPGATrackSimNNTrackTool::m_eventindex |
|
private |
◆ m_fakeNN_1st
◆ m_fakeNN_2nd
◆ m_fileName
TString OnnxRuntimeBase::m_fileName |
|
inherited |
◆ m_FPGATrackSimBank
◆ m_FPGATrackSimMapping
◆ m_ID
std::vector<unsigned int> FPGATrackSimNNTrackTool::m_ID |
|
private |
◆ m_idealGeoRoads
Gaudi::Property<bool> FPGATrackSimTrackingToolBase::m_idealGeoRoads { this, "IdealGeoRoads", true, "Set sectors to use ideal geometry fit constants" } |
|
protectedinherited |
◆ m_input_node_dims
std::vector<int64_t> FPGATrackSimNNTrackTool::m_input_node_dims |
|
private |
◆ m_input_node_names
std::vector<const char*> FPGATrackSimNNTrackTool::m_input_node_names |
|
private |
◆ m_inputNodeDims
std::vector<int64_t> OnnxRuntimeBase::m_inputNodeDims |
|
privateinherited |
◆ m_inputNodeNames
std::vector<const char*> OnnxRuntimeBase::m_inputNodeNames |
|
privateinherited |
◆ m_isBarrel
std::vector<unsigned int> FPGATrackSimNNTrackTool::m_isBarrel |
|
private |
◆ m_isPixel
std::vector<unsigned int> FPGATrackSimNNTrackTool::m_isPixel |
|
private |
◆ m_isSecondStage
Gaudi::Property<bool> FPGATrackSimTrackingToolBase::m_isSecondStage { this, "isSecondStage", true, "Is this the second stage?" } |
|
protectedinherited |
◆ m_layer
std::vector<unsigned int> FPGATrackSimNNTrackTool::m_layer |
|
private |
◆ m_minNumberOfRealHitsInATrack
Gaudi::Property<unsigned int> FPGATrackSimNNTrackTool::m_minNumberOfRealHitsInATrack { this, "MinNumberOfRealHitsInATrack", 4, "Minimum number of real hits in a track candidate to process" } |
◆ m_nInputsGNN
Gaudi::Property<int> FPGATrackSimNNTrackTool::m_nInputsGNN { this, "nInputsGNN", 9, "Number of Hit Inputs for NN for GNN configuration. Depends on which model is chosen."} |
◆ m_output_node_names
std::vector<const char*> FPGATrackSimNNTrackTool::m_output_node_names |
|
private |
◆ m_outputNodeDims
std::vector<int64_t> OnnxRuntimeBase::m_outputNodeDims |
|
privateinherited |
◆ m_outputNodeNames
std::vector<const char*> OnnxRuntimeBase::m_outputNodeNames |
|
privateinherited |
◆ m_paramNN_1st
◆ m_paramNN_2nd
◆ m_phimodule
std::vector<unsigned int> FPGATrackSimNNTrackTool::m_phimodule |
|
private |
◆ m_phiwidth
std::vector<unsigned int> FPGATrackSimNNTrackTool::m_phiwidth |
|
private |
◆ m_session
std::unique_ptr<Ort::Session> OnnxRuntimeBase::m_session |
|
privateinherited |
◆ m_spRoadFilterTool
◆ m_tHistSvc
ServiceHandle<ITHistSvc> FPGATrackSimNNTrackTool::m_tHistSvc {this, "THistSvc","THistSvc"} |
|
private |
◆ m_truth_barcode
std::vector<int> FPGATrackSimNNTrackTool::m_truth_barcode |
|
private |
◆ m_truth_d0
std::vector<float> FPGATrackSimNNTrackTool::m_truth_d0 |
|
private |
◆ m_truth_eta
std::vector<float> FPGATrackSimNNTrackTool::m_truth_eta |
|
private |
◆ m_truth_eventindex
std::vector<int> FPGATrackSimNNTrackTool::m_truth_eventindex |
|
private |
◆ m_truth_pdg
std::vector<float> FPGATrackSimNNTrackTool::m_truth_pdg |
|
private |
◆ m_truth_phi
std::vector<float> FPGATrackSimNNTrackTool::m_truth_phi |
|
private |
◆ m_truth_pt
std::vector<float> FPGATrackSimNNTrackTool::m_truth_pt |
|
private |
◆ m_truth_q
std::vector<int> FPGATrackSimNNTrackTool::m_truth_q |
|
private |
◆ m_truth_z0
std::vector<float> FPGATrackSimNNTrackTool::m_truth_z0 |
|
private |
◆ m_useCartesian
Gaudi::Property<bool> FPGATrackSimNNTrackTool::m_useCartesian { this, "useCartesian", true, "If true, NNs use Cartestian coordinates. If false,they use cylindrical coordiantes"} |
◆ m_useParamNN_1st
bool FPGATrackSimNNTrackTool::m_useParamNN_1st = true |
|
private |
◆ m_useParamNN_2nd
bool FPGATrackSimNNTrackTool::m_useParamNN_2nd = true |
|
private |
◆ m_useSectors
Gaudi::Property<bool> FPGATrackSimTrackingToolBase::m_useSectors { this, "useSectors", false, "Will reverse calculate the sector for track-fitting purposes" } |
|
protectedinherited |
◆ m_useSpacePoints
Gaudi::Property<bool> FPGATrackSimTrackingToolBase::m_useSpacePoints { this, "useSpacePoints", false, "Whether we are using spacepoints." } |
|
protectedinherited |
◆ m_x
std::vector<float> FPGATrackSimNNTrackTool::m_x |
|
private |
◆ m_y
std::vector<float> FPGATrackSimNNTrackTool::m_y |
|
private |
◆ m_z
std::vector<float> FPGATrackSimNNTrackTool::m_z |
|
private |
The documentation for this class was generated from the following files:
void setHitMap(unsigned int v)
constexpr int SUBREGION_SECTOR_OFFSET
std::vector< float > runONNXInference(std::vector< float > &inputTensorValues) const
uint32_t getNLogiLayers() const
std::unique_ptr< Ort::Env > m_env
Scalar phi() const
phi method
Scalar eta() const
pseudorapidity method
void setHoughXBin(unsigned v)
void setFirstSectorID(int v)
std::vector< int64_t > m_outputNodeDims
void setFPGATrackSimHit(unsigned i, const FPGATrackSimHit &hit)
const std::vector< double > & getQOverPtBins() const
std::vector< int64_t > m_inputNodeDims
bool isPixel(int pl) const
std::unique_ptr< Ort::Session > m_session
ONNX runtime session / model properties.
typename vecDetail::vec_typedef< T, N >::type vec
Define a nice alias for the vectorized type.
void setDetType(SiliconTech detType)
void setHoughYBin(unsigned v)
std::vector< const char * > m_inputNodeNames
sector_t findSector(std::vector< module_t > const &modules) const
std::pair< unsigned long, unsigned long > Barcode
double chi2(TH1 *h0, TH1 *h1)
const double r0
electron radius{cm}
std::vector< std::vector< int > > getComboIndices(std::vector< size_t > const &sizes)
Given a vector of sizes (of arrays), generates a vector of all combinations of indices to index one e...
void setTrackStage(TrackStage v)
constexpr int QPT_SECTOR_OFFSET
std::string to_string(const DetectorType &type)
std::vector< const char * > m_outputNodeNames
accumulate
Update flags based on parser line args.
void setLayer(unsigned v)
void setSector(sector_t sector)
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
bool isAbsQOverPtBinning() const
void setSubRegion(unsigned v)
void setNLayers(int)
set the number of layers in the track.
const std::vector< std::vector< std::shared_ptr< const FPGATrackSimHit > > > & getAllHits() const
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > NetworkBatchInput
HitType getHitType() const
void setHitType(HitType type)