 |
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 975 of file FPGATrackSimNNTrackTool.cxx.
976 std::vector<FPGATrackSimMultiTruth> mtv;
980 if (!(
t.getHitMap() & (1 <<
layer)))
continue;
983 if (
layer <
t.getFPGATrackSimHits().size())
984 mtv.push_back(
t.getFPGATrackSimHits().at(
layer).getTruth());
988 mtv.back().assign_equal_normalization();
998 const bool ok = mt.best(tbarcode, tfrac);
1000 t.setEventIndex(tbarcode.first);
1001 t.setBarcode(tbarcode.second);
1002 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++;
287 std::vector<std::vector<int>> combs;
292 for (
size_t icomb = 0; icomb < combs.size(); icomb++) {
293 std::vector<float> inputTensorValues;
294 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
297 std::vector<int>
const &hit_indices = combs[icomb];
303 if (hit_indices[
layer] >= 0) {
305 std::shared_ptr<const FPGATrackSimHit> hit = iroad->getHits(
layer)[hit_indices[
layer]];
308 hit_list.push_back(std::move(hit));
314 std::sort(hit_list.begin(), hit_list.end(),
315 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
316 double rho1 = std::hypot(hit1->getX(), hit1->getY());
317 double rho2 = std::hypot(hit2->getX(), hit2->getY());
324 double rotateAngle = 0;
325 bool gotSecondSP =
false;
332 for (
const auto &hit : hit_list) {
334 float x0 = hit->
getX();
335 float y0 = hit->
getY();
337 float r0 = std::sqrt(x0*x0+y0*y0);
355 if (flipZ)
zf =
z0 * -1;
369 inputTensorValues.push_back(xf_scaled);
370 inputTensorValues.push_back(yf_scaled);
371 inputTensorValues.push_back(zf_scaled);
379 inputTensorValues.push_back(rf_scaled);
380 inputTensorValues.push_back(phif_scaled);
381 inputTensorValues.push_back(zf_scaled);
384 else if (!gotSecondSP) {
395 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
396 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
397 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
400 inputTensorValues.push_back(xf_scaled);
401 inputTensorValues.push_back(yf_scaled);
402 inputTensorValues.push_back(zf_scaled);
406 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
407 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
408 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
409 inputTensorValues.push_back(rf_scaled);
410 inputTensorValues.push_back(phif_scaled);
411 inputTensorValues.push_back(zf_scaled);
420 inputTensorValues.push_back(xf_scaled);
421 inputTensorValues.push_back(yf_scaled);
422 inputTensorValues.push_back(zf_scaled);
429 inputTensorValues.push_back(rf_scaled);
430 inputTensorValues.push_back(phif_scaled);
431 inputTensorValues.push_back(zf_scaled);
439 inputTensorValues.resize(15);
441 inputTensorValuesAll.push_back(inputTensorValues);
447 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
450 tracks.push_back(track_cand);
460 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
462 float nn_val = NNoutputs[itrack][0];
464 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
466 tracks[itrack].setOrigChi2(
chi2);
467 tracks[itrack].setChi2(
chi2);
475 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 479 of file FPGATrackSimNNTrackTool.cxx.
483 std::vector<std::vector<float> >inputTensorValuesAll;
486 for (
auto const &iroad : roads) {
488 double y = iroad->getY();
495 for (
unsigned ilayer = 0; ilayer < 13; ilayer++) {
496 if ((missing_mask >> ilayer) & 0
x1) {
498 if (planeMap->
isPixel(ilayer)) nMissing++;
501 hit_mask |= (0x1 << ilayer);
525 std::vector<std::vector<int>> combs =
529 for (
size_t icomb = 0; icomb < combs.size(); icomb++) {
530 std::vector<float> inputTensorValues;
533 std::vector<int>
const &hit_indices = combs[icomb];
534 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
540 if (hit_indices[
layer] >= 0) {
542 std::shared_ptr<const FPGATrackSimHit> hit = iroad->getHits(
layer)[hit_indices[
layer]];
545 hit_list.push_back(hit);
551 std::sort(hit_list.begin(), hit_list.end(),
552 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
553 double rho1 = std::hypot(hit1->getX(), hit1->getY());
554 double rho2 = std::hypot(hit2->getX(), hit2->getY());
561 double rotateAngle = 0;
562 bool gotSecondSP =
false;
569 for (
const auto &hit : hit_list) {
572 float x0 = hit->
getX();
573 float y0 = hit->
getY();
575 float r0 = std::sqrt(x0*x0+y0*y0);
595 if (flipZ)
zf =
z0 * -1;
609 inputTensorValues.push_back(xf_scaled);
610 inputTensorValues.push_back(yf_scaled);
611 inputTensorValues.push_back(zf_scaled);
618 inputTensorValues.push_back(rf_scaled);
619 inputTensorValues.push_back(phif_scaled);
620 inputTensorValues.push_back(zf_scaled);
623 else if (!gotSecondSP) {
634 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
635 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
636 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
639 inputTensorValues.push_back(xf_scaled);
640 inputTensorValues.push_back(yf_scaled);
641 inputTensorValues.push_back(zf_scaled);
645 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
646 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
647 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
648 inputTensorValues.push_back(rf_scaled);
649 inputTensorValues.push_back(phif_scaled);
650 inputTensorValues.push_back(zf_scaled);
659 inputTensorValues.push_back(xf_scaled);
660 inputTensorValues.push_back(yf_scaled);
661 inputTensorValues.push_back(zf_scaled);
668 inputTensorValues.push_back(rf_scaled);
669 inputTensorValues.push_back(phif_scaled);
670 inputTensorValues.push_back(zf_scaled);
676 if (inputTensorValues.size() < 39) {
677 inputTensorValues.resize(39, 0.0
f);
679 else if (inputTensorValues.size() > 39) {
680 inputTensorValues.resize(39);
682 inputTensorValuesAll.push_back(inputTensorValues);
692 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
695 tracks.push_back(track_cand);
702 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
704 float nn_val = NNoutputs[itrack][0];
707 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
709 tracks[itrack].setOrigChi2(
chi2);
710 tracks[itrack].setChi2(
chi2);
719 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 722 of file FPGATrackSimNNTrackTool.cxx.
727 std::vector<std::vector<float> >inputTensorValuesAll;
730 for (
auto const &iroad : roads) {
734 double y = iroad->getY();
740 for (
unsigned ilayer = 0; ilayer < 13; ilayer++) {
741 if ((missing_mask >> ilayer) & 0
x1) {
743 if (planeMap->
isPixel(ilayer)) nMissing++;
746 hit_mask |= (0x1 << ilayer);
772 std::vector<std::vector<int>> combs;
773 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_hits;
775 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_pixel_hits;
776 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_strip_hits;
777 size_t pixelCount = 0;
780 all_hits.insert(all_hits.end(), iroad->getHits(
layer).begin(), iroad->getHits(
layer).end());
783 for (
const auto& hit : all_hits) {
789 if (pixelCount < 1)
continue;
791 std::vector<float> inputTensorValues;
792 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
794 for (
const auto &hit : all_hits) {
796 hit_list.push_back(hit);
803 std::sort(hit_list.begin(), hit_list.end(),
804 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
805 double rho1 = std::hypot(hit1->getX(), hit1->getY());
806 double rho2 = std::hypot(hit2->getX(), hit2->getY());
813 double rotateAngle = 0;
814 bool gotSecondSP =
false;
822 for (
const auto &hit : hit_list) {
824 float x0 = hit->getX();
825 float y0 = hit->getY();
826 float z0 = hit->getZ();
827 float r0 = std::sqrt(x0*x0+y0*y0);
828 float phi0 = hit->getGPhi();
847 if (flipZ)
zf =
z0 * -1;
852 if (hit->isStrip()) {
861 inputTensorValues.push_back(xf_scaled);
862 inputTensorValues.push_back(yf_scaled);
863 inputTensorValues.push_back(zf_scaled);
871 inputTensorValues.push_back(rf_scaled);
872 inputTensorValues.push_back(phif_scaled);
873 inputTensorValues.push_back(zf_scaled);
876 else if (!gotSecondSP) {
887 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
888 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
889 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
892 inputTensorValues.push_back(xf_scaled);
893 inputTensorValues.push_back(yf_scaled);
894 inputTensorValues.push_back(zf_scaled);
898 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
899 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
900 float zf_scaled = (
zf + tmp_zf) / (2.*
getZScale());
901 inputTensorValues.push_back(rf_scaled);
902 inputTensorValues.push_back(phif_scaled);
903 inputTensorValues.push_back(zf_scaled);
912 inputTensorValues.push_back(xf_scaled);
913 inputTensorValues.push_back(yf_scaled);
914 inputTensorValues.push_back(zf_scaled);
921 inputTensorValues.push_back(rf_scaled);
922 inputTensorValues.push_back(phif_scaled);
923 inputTensorValues.push_back(zf_scaled);
936 inputTensorValuesAll.push_back(inputTensorValues);
940 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
943 tracks.push_back(track_cand);
953 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
955 float nn_val = NNoutputs[itrack][0];
957 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
958 tracks[itrack].setOrigChi2(
chi2);
959 tracks[itrack].setChi2(
chi2);
968 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
void setBinIdx(std::vector< unsigned > x)
uint32_t getNLogiLayers() const
std::unique_ptr< Ort::Env > m_env
Scalar phi() const
phi method
Scalar eta() const
pseudorapidity method
accumulate
Update flags based on parser line args.
void setHoughXBin(unsigned v)
void setFirstSectorID(int v)
std::string to_string(const SectorProjector proj)
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::vector< const char * > m_outputNodeNames
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)