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.0f);
183 if (inputTensorValues.size() < 39) {
184 inputTensorValues.resize(39, 0.0f);
186 else if (inputTensorValues.size() > 39) {
187 inputTensorValues.resize(39);
196 if (isFirst) paramNNoutputs =
m_paramNN_1st.runONNXInference(inputTensorValues);
197 else paramNNoutputs =
m_paramNN_2nd.runONNXInference(inputTensorValues);
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) & 0x1) {
259 if (planeMap->
isPixel(ilayer)) nMissing++;
270 temp.setPatternID(iroad->getPID());
271 temp.setFirstSectorID(iroad->getSector());
272 temp.setHitMap(missing_mask);
273 temp.setNMissing(nMissing);
276 temp.setSubRegion(iroad->getSubRegion());
277 temp.setHoughX(iroad->getX());
278 temp.setHoughY(iroad->getY());
279 temp.setHoughXBin(iroad->getXBin());
280 temp.setHoughYBin(iroad->getYBin());
282 temp.setBinIdx(iroad->getBinIdx());
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];
300 for (
unsigned layer = 0; layer < planeMap->
getNLogiLayers(); layer++) {
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();
348 rotateAngle = std::atan(x0 / y0);
352 xf = x0 * std::cos(rotateAngle) - y0 * std::sin(rotateAngle);
353 yf = x0 * std::sin(rotateAngle) + y0 * std::cos(rotateAngle);
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);
458 auto NNoutputs =
m_fakeNN_1st.runONNXInference(inputTensorValuesAll);
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) & 0x1) {
498 if (planeMap->
isPixel(ilayer)) nMissing++;
501 hit_mask |= (0x1 << ilayer);
511 temp.setPatternID(iroad->getPID());
512 temp.setFirstSectorID(iroad->getSector());
513 temp.setHitMap(hit_mask);
514 temp.setNMissing(nMissing);
517 temp.setSubRegion(iroad->getSubRegion());
518 temp.setHoughX(iroad->getX());
519 temp.setHoughY(iroad->getY());
520 temp.setHoughXBin(iroad->getXBin());
521 temp.setHoughYBin(iroad->getYBin());
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;
537 for (
unsigned layer = 0; layer < 13; layer++) {
540 if (hit_indices[layer] >= 0) {
542 std::shared_ptr<const FPGATrackSimHit> hit = iroad->getHits(layer)[hit_indices[layer]];
545 hit_list.push_back(std::move(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();
587 rotateAngle = std::atan(x0 / y0);
591 xf = x0 * std::cos(rotateAngle) - y0 * std::sin(rotateAngle);
592 yf = x0 * std::sin(rotateAngle) + y0 * std::cos(rotateAngle);
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.0f);
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);
701 auto NNoutputs =
m_fakeNN_2nd.runONNXInference(inputTensorValuesAll);
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) & 0x1) {
743 if (planeMap->
isPixel(ilayer)) nMissing++;
746 hit_mask |= (0x1 << ilayer);
757 temp.setPatternID(iroad->getPID());
758 temp.setFirstSectorID(iroad->getSector());
759 temp.setHitMap(hit_mask);
760 temp.setNMissing(nMissing);
763 temp.setSubRegion(iroad->getSubRegion());
764 temp.setHoughX(iroad->getX());
765 temp.setHoughY(iroad->getY());
766 temp.setHoughXBin(iroad->getXBin());
767 temp.setHoughYBin(iroad->getYBin());
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;
779 for (
unsigned layer = 0; layer < iroad->getNLayers(); ++layer) {
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();
839 rotateAngle = std::atan(x0 / y0);
843 xf = x0 * std::cos(rotateAngle) - y0 * std::sin(rotateAngle);
844 yf = x0 * std::sin(rotateAngle) + y0 * std::cos(rotateAngle);
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);
951 auto NNoutputs =
m_fakeNN_1st.runONNXInference(inputTensorValuesAll);
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;