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;
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);
179 inputTensorValues.resize(39);
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;
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();
334 float z0 = hit->getZ();
335 float r0 = std::sqrt(x0*x0+y0*y0);
336 float phi0 = hit->getGPhi();
353 if (flipZ)
zf =
z0 * -1;
358 if (hit->isStrip()) {
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;
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();
572 float z0 = hit->getZ();
573 float r0 = std::sqrt(x0*x0+y0*y0);
574 float phi0 = hit->getGPhi();
593 if (flipZ)
zf =
z0 * -1;
598 if (hit->isStrip()) {
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;
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);
932 inputTensorValues.resize(27);
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;
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);