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 auto& hits = track.getFPGATrackSimHitPtrs();
77 bool gotSecondSP =
false;
84 for (
const auto& hit_ptr : hits) {
87 return StatusCode::FAILURE;
89 if (!hit_ptr->isReal())
continue;
90 const auto& hit = *hit_ptr;
93 float xf = hit.getX();
94 float yf = hit.getY();
95 float zf = hit.getZ();
96 float rf = std::sqrt(xf*xf+yf*yf);
97 float phif = hit.getGPhi();
109 inputTensorValues.push_back(xf_scaled);
110 inputTensorValues.push_back(yf_scaled);
111 inputTensorValues.push_back(zf_scaled);
119 inputTensorValues.push_back(rf_scaled);
120 inputTensorValues.push_back(phif_scaled);
121 inputTensorValues.push_back(zf_scaled);
124 else if (!gotSecondSP) {
136 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
137 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
138 float zf_scaled = (zf + tmp_zf) / (2.*
getZScale());
141 inputTensorValues.push_back(xf_scaled);
142 inputTensorValues.push_back(yf_scaled);
143 inputTensorValues.push_back(zf_scaled);
147 float rf_scaled = (rf+tmp_rf) / (2.*
getRScale());
148 float phif_scaled = (phif+tmp_phif) / (2.*
getPhiScale());
149 float zf_scaled = (zf + tmp_zf) / (2.*
getZScale());
151 inputTensorValues.push_back(rf_scaled);
152 inputTensorValues.push_back(phif_scaled);
153 inputTensorValues.push_back(zf_scaled);
162 inputTensorValues.push_back(xf_scaled);
163 inputTensorValues.push_back(yf_scaled);
164 inputTensorValues.push_back(zf_scaled);
171 inputTensorValues.push_back(rf_scaled);
172 inputTensorValues.push_back(phif_scaled);
173 inputTensorValues.push_back(zf_scaled);
179 if (inputTensorValues.size() < 15) {
180 inputTensorValues.resize(15, 0.0f);
188 if (inputTensorValues.size() < 39) {
189 inputTensorValues.resize(39, 0.0f);
191 else if (inputTensorValues.size() > 39) {
192 inputTensorValues.resize(39);
201 if (isFirst) paramNNoutputs =
m_paramNN_1st.runONNXInference(inputTensorValues);
202 else paramNNoutputs =
m_paramNN_2nd.runONNXInference(inputTensorValues);
205 for (
unsigned int i = 0; i < paramNNoutputs.size(); i++) {
228 track.setQOverPt(qopt);
234 return StatusCode::SUCCESS;
242 return StatusCode::SUCCESS;
248 std::vector<std::vector<float> >inputTensorValuesAll;
251 for (
auto const &iroad : roads) {
253 double y = iroad.getY();
261 for (
unsigned ilayer = 0; ilayer < planeMap->
getNLogiLayers(); ilayer++) {
262 if ((missing_mask >> ilayer) & 0x1) {
264 if (planeMap->
isPixel(ilayer)) nMissing++;
275 temp.setPatternID(iroad.getPID());
276 temp.setFirstSectorID(iroad.getSector());
277 temp.setHitMap(missing_mask);
278 temp.setNMissing(nMissing);
281 temp.setSubRegion(iroad.getSubRegion());
282 temp.setHoughX(iroad.getX());
283 temp.setHoughY(iroad.getY());
284 temp.setHoughXBin(iroad.getXBin());
285 temp.setHoughYBin(iroad.getYBin());
287 temp.setBinIdx(iroad.getBinIdx());
292 std::vector<std::vector<int>> combs;
297 for (
size_t icomb = 0; icomb < combs.size(); icomb++) {
298 std::vector<float> inputTensorValues;
299 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
302 std::vector<int>
const &hit_indices = combs[icomb];
305 for (
unsigned layer = 0; layer < planeMap->
getNLogiLayers(); layer++) {
308 if (hit_indices[layer] >= 0) {
310 std::shared_ptr<const FPGATrackSimHit> hit = iroad.getHitPtrs(layer)[hit_indices[layer]];
313 hit_list.push_back(std::move(hit));
319 std::sort(hit_list.begin(), hit_list.end(),
320 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
321 double rho1 = std::hypot(hit1->getX(), hit1->getY());
322 double rho2 = std::hypot(hit2->getX(), hit2->getY());
329 double rotateAngle = 0;
330 bool gotSecondSP =
false;
337 for (
const auto &hit : hit_list) {
339 float x0 = hit->getX();
340 float y0 = hit->getY();
341 float z0 = hit->getZ();
342 float r0 = std::sqrt(x0*x0+y0*y0);
343 float phi0 = hit->getGPhi();
353 rotateAngle = std::atan(x0 / y0);
357 xf = x0 * std::cos(rotateAngle) - y0 * std::sin(rotateAngle);
358 yf = x0 * std::sin(rotateAngle) + y0 * std::cos(rotateAngle);
360 if (flipZ) zf = z0 * -1;
365 if (hit->isStrip()) {
374 inputTensorValues.push_back(xf_scaled);
375 inputTensorValues.push_back(yf_scaled);
376 inputTensorValues.push_back(zf_scaled);
384 inputTensorValues.push_back(rf_scaled);
385 inputTensorValues.push_back(phif_scaled);
386 inputTensorValues.push_back(zf_scaled);
389 else if (!gotSecondSP) {
400 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
401 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
402 float zf_scaled = (zf + tmp_zf) / (2.*
getZScale());
405 inputTensorValues.push_back(xf_scaled);
406 inputTensorValues.push_back(yf_scaled);
407 inputTensorValues.push_back(zf_scaled);
411 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
412 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
413 float zf_scaled = (zf + tmp_zf) / (2.*
getZScale());
414 inputTensorValues.push_back(rf_scaled);
415 inputTensorValues.push_back(phif_scaled);
416 inputTensorValues.push_back(zf_scaled);
425 inputTensorValues.push_back(xf_scaled);
426 inputTensorValues.push_back(yf_scaled);
427 inputTensorValues.push_back(zf_scaled);
434 inputTensorValues.push_back(rf_scaled);
435 inputTensorValues.push_back(phif_scaled);
436 inputTensorValues.push_back(zf_scaled);
444 inputTensorValues.resize(15);
446 inputTensorValuesAll.push_back(inputTensorValues);
452 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
455 tracks.push_back(track_cand);
463 auto NNoutputs =
m_fakeNN_1st.runONNXInference(inputTensorValuesAll);
465 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
467 float nn_val = NNoutputs[itrack][0];
469 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
471 tracks[itrack].setOrigChi2(
chi2);
472 tracks[itrack].setChi2(
chi2);
480 return StatusCode::SUCCESS;
488 std::vector<std::vector<float> >inputTensorValuesAll;
491 for (
auto const &iroad : roads) {
493 double y = iroad.getY();
500 for (
unsigned ilayer = 0; ilayer < 13; ilayer++) {
501 if ((missing_mask >> ilayer) & 0x1) {
503 if (planeMap->
isPixel(ilayer)) nMissing++;
506 hit_mask |= (0x1 << ilayer);
516 temp.setPatternID(iroad.getPID());
517 temp.setFirstSectorID(iroad.getSector());
518 temp.setHitMap(hit_mask);
519 temp.setNMissing(nMissing);
522 temp.setSubRegion(iroad.getSubRegion());
523 temp.setHoughX(iroad.getX());
524 temp.setHoughY(iroad.getY());
525 temp.setHoughXBin(iroad.getXBin());
526 temp.setHoughYBin(iroad.getYBin());
530 std::vector<std::vector<int>> combs =
534 for (
size_t icomb = 0; icomb < combs.size(); icomb++) {
535 std::vector<float> inputTensorValues;
538 std::vector<int>
const &hit_indices = combs[icomb];
539 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
542 for (
unsigned layer = 0; layer < 13; layer++) {
545 if (hit_indices[layer] >= 0) {
547 std::shared_ptr<const FPGATrackSimHit> hit = iroad.getHitPtrs(layer)[hit_indices[layer]];
550 hit_list.push_back(std::move(hit));
556 std::sort(hit_list.begin(), hit_list.end(),
557 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
558 double rho1 = std::hypot(hit1->getX(), hit1->getY());
559 double rho2 = std::hypot(hit2->getX(), hit2->getY());
566 double rotateAngle = 0;
567 bool gotSecondSP =
false;
574 for (
const auto &hit : hit_list) {
577 float x0 = hit->getX();
578 float y0 = hit->getY();
579 float z0 = hit->getZ();
580 float r0 = std::sqrt(x0*x0+y0*y0);
581 float phi0 = hit->getGPhi();
592 rotateAngle = std::atan(x0 / y0);
596 xf = x0 * std::cos(rotateAngle) - y0 * std::sin(rotateAngle);
597 yf = x0 * std::sin(rotateAngle) + y0 * std::cos(rotateAngle);
600 if (flipZ) zf = z0 * -1;
605 if (hit->isStrip()) {
614 inputTensorValues.push_back(xf_scaled);
615 inputTensorValues.push_back(yf_scaled);
616 inputTensorValues.push_back(zf_scaled);
623 inputTensorValues.push_back(rf_scaled);
624 inputTensorValues.push_back(phif_scaled);
625 inputTensorValues.push_back(zf_scaled);
628 else if (!gotSecondSP) {
639 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
640 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
641 float zf_scaled = (zf + tmp_zf) / (2.*
getZScale());
644 inputTensorValues.push_back(xf_scaled);
645 inputTensorValues.push_back(yf_scaled);
646 inputTensorValues.push_back(zf_scaled);
650 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
651 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
652 float zf_scaled = (zf + tmp_zf) / (2.*
getZScale());
653 inputTensorValues.push_back(rf_scaled);
654 inputTensorValues.push_back(phif_scaled);
655 inputTensorValues.push_back(zf_scaled);
664 inputTensorValues.push_back(xf_scaled);
665 inputTensorValues.push_back(yf_scaled);
666 inputTensorValues.push_back(zf_scaled);
673 inputTensorValues.push_back(rf_scaled);
674 inputTensorValues.push_back(phif_scaled);
675 inputTensorValues.push_back(zf_scaled);
681 if (inputTensorValues.size() < 39) {
682 inputTensorValues.resize(39, 0.0f);
684 else if (inputTensorValues.size() > 39) {
685 inputTensorValues.resize(39);
687 inputTensorValuesAll.push_back(inputTensorValues);
697 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
700 tracks.push_back(track_cand);
706 auto NNoutputs =
m_fakeNN_2nd.runONNXInference(inputTensorValuesAll);
707 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
709 float nn_val = NNoutputs[itrack][0];
712 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
714 tracks[itrack].setOrigChi2(
chi2);
715 tracks[itrack].setChi2(
chi2);
724 return StatusCode::SUCCESS;
732 std::vector<std::vector<float> >inputTensorValuesAll;
735 for (
auto const &iroad : roads) {
739 double y = iroad.getY();
745 for (
unsigned ilayer = 0; ilayer < 13; ilayer++) {
746 if ((missing_mask >> ilayer) & 0x1) {
748 if (planeMap->
isPixel(ilayer)) nMissing++;
751 hit_mask |= (0x1 << ilayer);
762 temp.setPatternID(iroad.getPID());
763 temp.setFirstSectorID(iroad.getSector());
764 temp.setHitMap(hit_mask);
765 temp.setNMissing(nMissing);
768 temp.setSubRegion(iroad.getSubRegion());
769 temp.setHoughX(iroad.getX());
770 temp.setHoughY(iroad.getY());
771 temp.setHoughXBin(iroad.getXBin());
772 temp.setHoughYBin(iroad.getYBin());
777 std::vector<std::vector<int>> combs;
778 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_hits;
780 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_pixel_hits;
781 std::vector<std::shared_ptr<const FPGATrackSimHit>> all_strip_hits;
782 size_t pixelCount = 0;
784 for (
unsigned layer = 0; layer < iroad.getNLayers(); ++layer) {
785 all_hits.insert(all_hits.end(), iroad.getHitPtrs(layer).begin(), iroad.getHitPtrs(layer).end());
788 for (
const auto& hit : all_hits) {
794 if (pixelCount < 1)
continue;
796 std::vector<float> inputTensorValues;
797 std::vector<std::shared_ptr<const FPGATrackSimHit>> hit_list;
799 for (
const auto &hit : all_hits) {
801 hit_list.push_back(hit);
808 std::sort(hit_list.begin(), hit_list.end(),
809 [](std::shared_ptr<const FPGATrackSimHit> &hit1, std::shared_ptr<const FPGATrackSimHit> &hit2) {
810 double rho1 = std::hypot(hit1->getX(), hit1->getY());
811 double rho2 = std::hypot(hit2->getX(), hit2->getY());
818 double rotateAngle = 0;
819 bool gotSecondSP =
false;
827 for (
const auto &hit : hit_list) {
829 float x0 = hit->getX();
830 float y0 = hit->getY();
831 float z0 = hit->getZ();
832 float r0 = std::sqrt(x0*x0+y0*y0);
833 float phi0 = hit->getGPhi();
844 rotateAngle = std::atan(x0 / y0);
848 xf = x0 * std::cos(rotateAngle) - y0 * std::sin(rotateAngle);
849 yf = x0 * std::sin(rotateAngle) + y0 * std::cos(rotateAngle);
852 if (flipZ) zf = z0 * -1;
857 if (hit->isStrip()) {
866 inputTensorValues.push_back(xf_scaled);
867 inputTensorValues.push_back(yf_scaled);
868 inputTensorValues.push_back(zf_scaled);
876 inputTensorValues.push_back(rf_scaled);
877 inputTensorValues.push_back(phif_scaled);
878 inputTensorValues.push_back(zf_scaled);
881 else if (!gotSecondSP) {
892 float xf_scaled = (xf + tmp_xf) / (2.*
getXScale());
893 float yf_scaled = (yf + tmp_yf) / (2.*
getYScale());
894 float zf_scaled = (zf + tmp_zf) / (2.*
getZScale());
897 inputTensorValues.push_back(xf_scaled);
898 inputTensorValues.push_back(yf_scaled);
899 inputTensorValues.push_back(zf_scaled);
903 float rf_scaled = (rf + tmp_rf) / (2.*
getRScale());
904 float phif_scaled = (phif + tmp_phif) / (2.*
getPhiScale());
905 float zf_scaled = (zf + tmp_zf) / (2.*
getZScale());
906 inputTensorValues.push_back(rf_scaled);
907 inputTensorValues.push_back(phif_scaled);
908 inputTensorValues.push_back(zf_scaled);
917 inputTensorValues.push_back(xf_scaled);
918 inputTensorValues.push_back(yf_scaled);
919 inputTensorValues.push_back(zf_scaled);
926 inputTensorValues.push_back(rf_scaled);
927 inputTensorValues.push_back(phif_scaled);
928 inputTensorValues.push_back(zf_scaled);
941 inputTensorValuesAll.push_back(inputTensorValues);
945 for (
unsigned ihit = 0; ihit < hit_list.size(); ihit++) {
948 tracks.push_back(track_cand);
956 auto NNoutputs =
m_fakeNN_1st.runONNXInference(inputTensorValuesAll);
958 for (
unsigned itrack = 0; itrack < NNoutputs.size(); itrack++) {
960 float nn_val = NNoutputs[itrack][0];
962 double chi2 = (1 - nn_val) * (tracks[itrack].getNCoords() - tracks[itrack].getNMissing() - 5);
963 tracks[itrack].setOrigChi2(
chi2);
964 tracks[itrack].setChi2(
chi2);
973 return StatusCode::SUCCESS;