76 for (
int ireg = 0; ireg < rmap_2nd->
getNRegions(); ireg++) {
83 for (std::shared_ptr<const FPGATrackSimTrack>
track : tracks) {
85 if (
track->passedOR() == 0) {
88 const std::vector<FPGATrackSimHit> hitsOnTrack =
track->getFPGATrackSimHits();
92 for (
const auto &thit : hitsOnTrack) {
93 road.
addHit(std::make_shared<const FPGATrackSimHit>(thit));
98 for (
const std::shared_ptr<const FPGATrackSimHit>& hit:
hits) {
99 ATH_MSG_DEBUG(
"Hit " <<
" X: " << hit->getX() <<
" Y: " << hit->getY() <<
" Z: " << hit->getZ() <<
" R: " << hit->getR() <<
"phi = " << hit->getGPhi() <<
" hitType: " << hit->getHitType() <<
" getDetType: " << hit->getDetType());
102 std::vector<miniRoad> roadsToExtrapolate;
103 roadsToExtrapolate.push_back(road);
105 std::vector<miniRoad> completedRoads;
109 const int MAX_ROADS = 10000;
110 while(roadsToExtrapolate.size() > 0 &&
count < MAX_ROADS ) {
111 miniRoad currentRoad = *roadsToExtrapolate.begin();
114 roadsToExtrapolate.erase(roadsToExtrapolate.begin());
117 ATH_MSG_DEBUG(
"\033[1;31m-------------------------- extraploating road "<<
count <<
"------------------ \033[0m");
123 completedRoads.push_back(currentRoad);
127 std::vector<float> inputTensorValues;
132 std::vector<float> predhit;
142 if ((
m_useCartesian && (abs(predhit[0]) < 25 && abs(predhit[1]) < 25)) ||
145 completedRoads.push_back(currentRoad);
152 double radius = std::sqrt(predhit[0] * predhit[0] + predhit[1] * predhit[1]);
153 if ((
m_useCartesian && (abs(predhit[0]) > 1024 || abs(predhit[1]) > 1024 ||
radius > 1024 || abs(predhit[2]) > 3000)) ||
154 (!
m_useCartesian && (abs(predhit[0]) > 1024 || abs(predhit[2]) > 3000))) {
155 completedRoads.push_back(currentRoad);
160 ATH_MSG_DEBUG(
"Predicted hit at: " << predhit[0] <<
" " << predhit[1] <<
" " << predhit[2]);
164 bool foundhitForRoad =
false;
167 completedRoads.push_back(currentRoad);
171 unsigned lastLayerInRoad = 0;
172 std::shared_ptr<const FPGATrackSimHit> lastHit;
173 if(!
getLastLayer(currentRoad, lastLayerInRoad, lastHit) or !lastHit) {
177 unsigned layer = lastLayerInRoad+1;
178 bool lastHitWasReal = lastHit->
isReal();
179 float lastHitR = lastHit->
getR();
181 completedRoads.push_back(currentRoad);
184 unsigned int hitsInWindow = 0;
187 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> listofHitsFound;
189 for (
const std::shared_ptr<const FPGATrackSimHit>& hit:
hits) {
192 if ((hit->getHitType() ==
HitType::spacepoint) && ((hit->getPhysLayer(
true)) %2 == 1))
continue;
194 ATH_MSG_DEBUG(
"In the hit loop hit at x: " << hit->getX() <<
" y " << hit->getY() <<
" z " << hit->getZ() <<
" phi " << hit->getGPhi());
197 if (
getFineID(*hit) == fineID && hit->isReal()) {
199 double hitz = hit->getZ();
200 double hitr = hit->getR();
201 double hitphi = hit->getGPhi();
202 double predr = (
m_useCartesian ? sqrt(predhit[0] * predhit[0] + predhit[1] * predhit[1]) : predhit[0]);
203 double predphi = predhit[1];
204 double predz = predhit[2];
208 int fineID_index = 0;
214 ATH_MSG_DEBUG(
"No windows for predicted fineID " << fineID <<
", using maximum in provided list instead!");
220 if (fineID_index == -1) {
228 if (fineID_index == -1) {
236 if (fineID_index == -1) {
253 double dr = abs(hitr - predr);
254 double dz = abs(hitz - predz);
255 double dphi = abs(hitphi - predphi);
256 while (dphi >
pi) dphi -=
pi;
260 std::vector<std::shared_ptr<const FPGATrackSimHit>> theseHits {hit};
261 hitsInWindow = hitsInWindow + 1;
271 std::shared_ptr<FPGATrackSimHit> guessedSecondHitPtr = std::make_shared<FPGATrackSimHit>();
272 guessedSecondHitPtr->
setX(0);
273 guessedSecondHitPtr->
setY(0);
274 guessedSecondHitPtr->
setZ(0);
280 theseHits.push_back(guessedSecondHitPtr);
284 listofHitsFound.push_back(theseHits);
290 std::sort(listofHitsFound.begin(), listofHitsFound.end(), [&predhit](
auto&
a,
auto&
b){
291 double predr = sqrt(predhit[0] * predhit[0] + predhit[1] * predhit[1]);
292 double predz = predhit[2];
295 double hitz = a[0]->getZ();
296 double hitr = a[0]->getR();
297 float distance_a = (hitr - predr)*(hitr - predr) + (hitz - predz)*(hitz - predz);
302 float distance_b = (hitr - predr)*(hitr - predr) + (hitz - predz)*(hitz - predz);
304 return distance_a < distance_b;
308 std::sort(listofHitsFound.begin(), listofHitsFound.end(), [&predhit](
auto&
a,
auto&
b){
310 double predr = predhit[0];
311 double predphi = predhit[1];
312 double predz = predhit[2];
314 double hitr = a[0]->getR();
315 double hitphi = a[0]->getGPhi();
316 double hitz = a[0]->getZ();
317 double dz = abs(hitz - predz);
318 double dr = abs(hitr - predr);
319 double dphi = abs(hitphi - predphi);
320 while (dphi > pi) dphi -= pi;
323 float distance_a = dz*dz/(getZScale()*getZScale()) + dphi*dphi/(getPhiScale()*getPhiScale()) + dr*dr/(getRScale()*getRScale());
327 hitphi = b[0]->getGPhi();
329 dz = abs(hitz - predz);
330 dr = abs(hitr - predr);
331 dphi = abs(hitphi - predphi);
332 while (dphi > pi) dphi -= pi;
335 float distance_b = dz*dz/(getZScale()*getZScale()) + dphi*dphi/(getPhiScale()*getPhiScale()) + dr*dr/(getRScale()*getRScale());
337 return distance_a < distance_b;
341 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> cleanHitsToGrow;
346 cleanHitsToGrow.reserve(nHitsToChoose);
347 std::copy(listofHitsFound.begin(), listofHitsFound.begin() + nHitsToChoose, std::back_inserter(cleanHitsToGrow));
350 cleanHitsToGrow = std::move(listofHitsFound);
353 for (
auto& hitsFound: cleanHitsToGrow) {
357 if(!
addHitToRoad(newRoad, currentRoad, std::move(hitsFound))) {
361 roadsToExtrapolate.push_back(newRoad);
362 foundhitForRoad =
true;
369 if (!foundhitForRoad) {
376 std::vector<std::shared_ptr<const FPGATrackSimHit>> theseHits;
378 if (!
getFakeHit(currentRoad, predhit, fineID, theseHits)) {
388 if (!
addHitToRoad(newroad, currentRoad, std::move(theseHits))) {
392 roadsToExtrapolate.push_back(newroad);
397 for (
const auto &miniroad : completedRoads) {
410 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> roadhits = miniroad.getVecHits();
412 if (roadhits.size() > nexpected) {
413 roadhits.resize(nexpected);
415 else if (roadhits.size() < nexpected) {
417 std::shared_ptr<FPGATrackSimHit> emptyHitPtr = std::make_shared<FPGATrackSimHit>();
418 emptyHitPtr->
setX(0);
419 emptyHitPtr->
setY(0);
420 emptyHitPtr->
setZ(0);
423 std::vector<std::shared_ptr<const FPGATrackSimHit>> hitVec;
424 hitVec.push_back(emptyHitPtr);
425 roadhits.push_back(hitVec);
427 wclayers |= (1 <<
layer);
431 road.
setHits(std::move(roadhits));
441 roads.emplace_back(std::make_shared<const FPGATrackSimRoad>(
r));
443 ATH_MSG_DEBUG(
"Found " << roads.size() <<
" new roads in second stage.");
445 return StatusCode::SUCCESS;