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);
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++;
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();
336 float z0 = hit->getZ();
337 float r0 = std::sqrt(x0*x0+y0*y0);
338 float phi0 = hit->getGPhi();
355 if (flipZ)
zf =
z0 * -1;
360 if (hit->isStrip()) {
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;
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();
574 float z0 = hit->getZ();
575 float r0 = std::sqrt(x0*x0+y0*y0);
576 float phi0 = hit->getGPhi();
595 if (flipZ)
zf =
z0 * -1;
600 if (hit->isStrip()) {
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;
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;
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);