22 declareInterface<IFPGATrackSimTrackExtensionTool>(
this);
36 return StatusCode::FAILURE;
41 return StatusCode::FAILURE;
54 ATH_MSG_ERROR(
"Path to NN-based track extension ONNX file is empty! If you want to run this pipeline, you need to provide an input file.");
55 return StatusCode::FAILURE;
61 m_phits_atLayer[j] = std::map<unsigned, std::vector<std::shared_ptr<const FPGATrackSimHit>>>();
64 m_phits_atLayer[j][
i] = std::vector<std::shared_ptr<const FPGATrackSimHit>>();
70 return StatusCode::SUCCESS;
75 m_tree =
new TTree(
"NNPathFinderMonitoring",
"NNPathFinderMonitoring");
86 return StatusCode::SUCCESS;
91 const std::vector<std::shared_ptr<const FPGATrackSimTrack>> & tracks,
92 std::vector<std::shared_ptr<const FPGATrackSimRoad>> & roads) {
98 for (
auto&
entry : sliceEntry.second) {
108 for (
int ireg = 0; ireg < rmap_2nd->
getNRegions(); ireg++) {
118 for (
const std::shared_ptr<const FPGATrackSimHit>& hit :
hits) {
119 std::shared_ptr<FPGATrackSimHit> hitCopy = std::make_shared<FPGATrackSimHit>(*hit);
120 pmap_2nd->
map(*hitCopy);
135 for (std::shared_ptr<const FPGATrackSimTrack>
track : tracks)
140 if (
track->passedOR() == 0) {
144 const std::vector<FPGATrackSimHit> hitsOnTrack =
track->getFPGATrackSimHits();
156 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> road_hits;
158 for (
auto &thit : hitsOnTrack)
164 road_hits[thit.getLayer()].push_back(std::make_shared<const FPGATrackSimHit>(thit));
165 if (thit.isReal()) hitLayers |= 1 << thit.getLayer();
166 else wcLayers |= 1 << thit.getLayer();
169 road.
setHits(std::move(road_hits));
181 ATH_MSG_DEBUG(
"Hit "<<
" X: "<<hit->getX()<<
" Y: "<<hit->getY()<<
" Z: "<<hit->getZ()<<
" R: "<<hit->getR()<<
" layer: "<<hit->getLayer()<<
" hitType: "<<hit->getHitType()<<
" getDetType: "<<hit->getDetType());
186 std::vector<FPGATrackSimRoad> roadsToExtrapolate;
187 roadsToExtrapolate.push_back(road);
189 std::vector<FPGATrackSimRoad> completedRoads;
191 std::vector<unsigned long> currentRoadHitFineIDs;
192 std::vector<std::vector<unsigned long>> tmp_predictedHitsFineID;
194 std::vector<unsigned int> currentRoadHitITkLayer;
195 std::vector<std::vector<unsigned int>> tmp_foundHitITkLayer;
197 std::vector<float> currentRoadHitDistancePredFound;
198 std::vector<std::vector<float>> tmp_foundHitDistancePredFound;
201 for (
unsigned int i = 0;
i < roadsToExtrapolate.size();
i++){
202 tmp_predictedHitsFineID.push_back(currentRoadHitFineIDs);
203 tmp_foundHitITkLayer.push_back(currentRoadHitITkLayer);
204 tmp_foundHitDistancePredFound.push_back(currentRoadHitDistancePredFound);
210 while(roadsToExtrapolate.size() > 0)
213 std::vector<unsigned long> tmp_currentRoadHitFineIDs = *tmp_predictedHitsFineID.begin();
214 std::vector<unsigned int> tmp_currentRoadHitITkLayer = *tmp_foundHitITkLayer.begin();
215 std::vector<float> tmp_currentRoadHitDistancePredFound = *tmp_foundHitDistancePredFound.begin();
217 roadsToExtrapolate.erase(roadsToExtrapolate.begin());
218 tmp_predictedHitsFineID.erase(tmp_predictedHitsFineID.begin());
219 tmp_foundHitITkLayer.erase(tmp_foundHitITkLayer.begin());
220 tmp_foundHitDistancePredFound.erase(tmp_foundHitDistancePredFound.begin());
232 completedRoads.push_back(currentRoad);
240 std::vector<float> inputTensorValues;
248 std::vector<float> predhit;
261 if (abs(predhit[0]) < 25 && abs(predhit[1]) < 25)
263 completedRoads.push_back(currentRoad);
275 if (abs(predhit[0]) > 1024 || abs(predhit[1]) > 1024 ||
rad > 1024 || abs(predhit[2]) > 3000)
277 completedRoads.push_back(currentRoad);
287 ATH_MSG_DEBUG(
"Predicted hit at: "<<predhit[0]<<
" "<<predhit[1]<<
" "<<predhit[2]);
291 bool foundhitForRoad =
false;
292 bool skipSPInNextLayer =
false;
296 completedRoads.push_back(currentRoad);
301 unsigned lastLayerInRoad = 0;
302 std::shared_ptr<const FPGATrackSimHit> lastHit;
303 if(!
getLastLayer(currentRoad, lastLayerInRoad, lastHit) or !lastHit)
309 bool lastHitWasReal = lastHit->
isReal();
314 completedRoads.push_back(currentRoad);
323 if(skipSPInNextLayer)
326 skipSPInNextLayer =
false;
329 if(
layer <= lastLayerInRoad)
333 unsigned int hitsInWindow = 0;
336 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> listofHitsFound;
343 if (
getFineID(*hit) == fineID && hit->isReal())
346 double hitz = hit->getZ();
347 double hitr = hit->getR();
348 double predr = sqrt(predhit[0]*predhit[0] + predhit[1] * predhit[1]);
349 double predz = predhit[2];
369 if (abs(hitr - predr) < windowR && abs(hitz - predz) < windowZ)
371 std::vector<std::shared_ptr<const FPGATrackSimHit>> theseHits {hit};
372 hitsInWindow = hitsInWindow + 1;
379 int layerToCheck =
layer + 1;
380 if((
layer % 2) == 0) layerToCheck =
layer - 1;
383 skipSPInNextLayer =
true;
387 ATH_MSG_WARNING(
"For a SP in layer "<<
layer<<
" Couldn't find a matching strip SP in layer "<<layerToCheck);
391 std::shared_ptr<FPGATrackSimHit> guessedSecondHitPtr = std::make_shared<FPGATrackSimHit>();
392 guessedSecondHitPtr->
setX(0);
393 guessedSecondHitPtr->
setY(0);
394 guessedSecondHitPtr->
setZ(0);
395 guessedSecondHitPtr->
setLayer(layerToCheck);
400 theseHits.push_back(guessedSecondHitPtr);
404 listofHitsFound.push_back(theseHits);
410 std::sort(listofHitsFound.begin(), listofHitsFound.end(), [&predhit](
auto&
a,
auto&
b){
411 double predr = sqrt(predhit[0]*predhit[0] + predhit[1] * predhit[1]);
412 double predz = predhit[2];
415 double hitz = a[0]->getZ();
416 double hitr = a[0]->getR();
417 float distance_a= sqrt((hitr - predr)*(hitr - predr) + (hitz - predz)*(hitz - predz));
422 float distance_b= sqrt((hitr - predr)*(hitr - predr) + (hitz - predz)*(hitz - predz));
424 return distance_a < distance_b;
428 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> cleanHitsToGrow;
434 cleanHitsToGrow.reserve(nHitsToChoose);
435 std::copy(listofHitsFound.begin(), listofHitsFound.begin() + nHitsToChoose, std::back_inserter(cleanHitsToGrow));
439 cleanHitsToGrow = std::move(listofHitsFound);
443 for (
auto& hitsFound: cleanHitsToGrow)
446 auto hit = hitsFound[0];
449 double hitz = hit->getZ();
450 double hitr = hit->getR();
451 double predr = sqrt(predhit[0]*predhit[0] + predhit[1] * predhit[1]);
452 double predz = predhit[2];
453 float distancePredFound = sqrt((hitr - predr)*(hitr - predr) + (hitz - predz)*(hitz - predz));
457 if(!
addHitToRoad(newroad, currentRoad, std::move(hitsFound)))
463 roadsToExtrapolate.push_back(newroad);
464 foundhitForRoad =
true;
465 tmp_currentRoadHitFineIDs.push_back(fineID);
466 tmp_predictedHitsFineID.push_back(tmp_currentRoadHitFineIDs);
467 tmp_currentRoadHitITkLayer.push_back(hit->getLayerDisk());
468 tmp_foundHitITkLayer.push_back(tmp_currentRoadHitITkLayer);
469 tmp_currentRoadHitDistancePredFound.push_back(distancePredFound);
470 tmp_foundHitDistancePredFound.push_back(tmp_currentRoadHitDistancePredFound);
482 if (!foundhitForRoad)
494 std::vector<std::shared_ptr<const FPGATrackSimHit>> theseHits;
509 if (!
addHitToRoad(newroad, currentRoad, std::move(theseHits))) {
513 roadsToExtrapolate.push_back(newroad);
514 tmp_predictedHitsFineID.push_back(tmp_currentRoadHitFineIDs);
515 tmp_foundHitITkLayer.push_back(tmp_currentRoadHitITkLayer);
516 tmp_foundHitDistancePredFound.push_back(tmp_currentRoadHitDistancePredFound);
523 for (
auto road : completedRoads) {
535 currentRoadHitFineIDs.clear();
536 tmp_predictedHitsFineID.clear();
537 currentRoadHitITkLayer.clear();
538 tmp_foundHitITkLayer.clear();
539 currentRoadHitDistancePredFound.clear();
540 tmp_foundHitDistancePredFound.clear();
549 roads.emplace_back(std::make_shared<const FPGATrackSimRoad>(
r));
551 ATH_MSG_DEBUG(
"Found " << roads.size() <<
" new roads in second stage.");
562 return StatusCode::SUCCESS;
567 std::vector<std::shared_ptr<const FPGATrackSimHit>> hitsR;
570 hitsR.push_back(hit);
574 std::sort(hitsR.begin(), hitsR.end(), [](
auto&
a,
auto&
b){
575 if(a->getLayer() == b->getLayer()) return a->getR() < b->getR();
576 return a->getLayer() < b->getLayer();
581 for (
auto thit : hitsR)
587 std::vector<std::shared_ptr<const FPGATrackSimHit>> cleanHits;
588 bool skipHit =
false;
589 for (
auto thit : hitsR)
598 cleanHits.push_back(thit);
603 cleanHits.push_back(thit);
609 cleanHits.push_back(thit);
617 else if (thit->isStrip() && thit->isReal())
620 cleanHits.push_back(thit);
624 ATH_MSG_WARNING(
"No clue how to deal with this hit in the NN predicition ");
636 std::vector<std::shared_ptr<const FPGATrackSimHit>> hitsToEncode;
640 for (
auto thit : cleanHits)
649 for (
auto thit : hitsToEncode)
651 inputTensorValues.push_back(thit->getX()/
getXScale());
652 inputTensorValues.push_back(thit->getY()/
getYScale());
653 inputTensorValues.push_back(thit->getZ()/
getZScale());
658 return StatusCode::SUCCESS;
666 fineID =
std::distance(NNVoloutput.begin(),std::max_element(NNVoloutput.begin(), NNVoloutput.end()));
669 inputTensorValues.insert(inputTensorValues.end(), NNVoloutput.begin(), NNVoloutput.end());
679 return StatusCode::SUCCESS;
685 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> these_hits;
688 these_hits[thishit->getLayer()].push_back(thishit);
692 for (
auto& hit:
hits)
694 if(hit->getLayer() >= these_hits.size())
696 ATH_MSG_WARNING(
"Adding a hit with layer: "<<hit->getLayer()<<
" which is beyond the total size of the layers");
699 these_hits[hit->getLayer()].push_back(hit);
701 const auto nTheseHits = these_hits.size();
702 newroad.
setHits(std::move(these_hits));
708 for (
auto& hit:
hits)
710 if(hit->getLayer() > nTheseHits)
712 ATH_MSG_WARNING(
"Adding a hit with layer: "<<hit->getLayer()<<
" which is beyond the total size of the layers");
716 if (!hit->isReal()) {
717 wcLayers |= (0x1 << hit->getLayer());
720 hitLayers |= 1 << hit->getLayer();
727 return StatusCode::SUCCESS;
736 std::shared_ptr<FPGATrackSimHit> guessedHitPtr = std::make_shared<FPGATrackSimHit>();
737 guessedHitPtr->
setX(predhit[0]);
738 guessedHitPtr->
setY(predhit[1]);
739 guessedHitPtr->
setZ(predhit[2]);
742 unsigned lastHitLayer(9999);
743 double lastHitR(9999);
747 int layer = hit->getLayer();
748 double r = hit->getR();
753 lastHitLayer =
layer;
758 if (lastHitLayer == 0) {
762 guessedLayer = lastHitLayer-1;
765 guessedLayer = lastHitLayer-1;
769 unsigned lastHitLayer(0);
773 unsigned layer = hit->getLayer();
774 if (
layer > lastHitLayer)
776 lastHitLayer =
layer;
779 guessedLayer = lastHitLayer+1;
782 guessedHitPtr->
setLayer(guessedLayer);
792 hits.push_back(guessedHitPtr);
798 std::shared_ptr<FPGATrackSimHit> guessedSecondHitPtr = std::make_shared<FPGATrackSimHit>();
799 guessedSecondHitPtr->
setX(0);
800 guessedSecondHitPtr->
setY(0);
801 guessedSecondHitPtr->
setZ(0);
810 hits.push_back(guessedSecondHitPtr);
816 return StatusCode::SUCCESS;
823 for (
const std::shared_ptr<const FPGATrackSimHit>& hit: hitList)
828 return StatusCode::SUCCESS;
835 return StatusCode::FAILURE;
845 std::vector<std::shared_ptr<const FPGATrackSimHit>> hitsR;
847 hitsR.push_back(hit);
853 std::sort(hitsR.begin(), hitsR.end(), [](
auto&
a,
auto&
b){
854 if(a->getR() == b->getR()) return a->getLayer() < b->getLayer();
855 return a->getR() < b->getR();
860 std::sort(hitsR.begin(), hitsR.end(), [](
auto&
a,
auto&
b){
861 if(a->getLayer() == b->getLayer()) return a->getR() > b->getR();
862 return a->getLayer() > b->getLayer();
866 for (
unsigned long i = 0;
i < hitsR.size();
i++)
868 ATH_MSG_DEBUG(
"Hit i "<<
i<<
" X: "<<hitsR[
i]->getX()<<
" Y: "<<hitsR[
i]->getY()<<
" Z: "<<hitsR[
i]->getZ()<<
" R: "<<hitsR[
i]->getR()<<
" layer: "<<hitsR[
i]->
getLayer()<<
" hitType: "<<hitsR[
i]->getHitType()<<
" getDetType: "<<hitsR[
i]->getDetType());
882 unsigned layer = hit->getLayer();
883 if (
layer > lastHitLayer)
885 lastHitLayer =
layer;
890 return StatusCode::SUCCESS;