66 {
67
68
69 roads.clear();
72
73
74
76 for (
int ireg = 0; ireg < rmap_2nd->
getNRegions(); ireg++) {
77 FPGATrackSimTowerInputHeader tower = FPGATrackSimTowerInputHeader(ireg);
79 }
80 }
82
83 for (std::shared_ptr<const FPGATrackSimTrack> track : tracks) {
85 if (
track->passedOR() == 0) {
86 continue;
87 }
88 const std::vector<FPGATrackSimHit> hitsOnTrack =
track->getFPGATrackSimHits();
89 miniRoad road;
91
92 for (const auto &thit : hitsOnTrack) {
93 road.
addHit(std::make_shared<const FPGATrackSimHit>(thit));
94 }
95
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());
100 }
101 }
102 std::vector<miniRoad> roadsToExtrapolate;
103 roadsToExtrapolate.push_back(std::move(road));
104
105 std::vector<miniRoad> completedRoads;
106
108
109 const int MAX_ROADS = 10000;
110 while(roadsToExtrapolate.size() > 0 &&
count < MAX_ROADS ) {
111 miniRoad currentRoad = *roadsToExtrapolate.begin();
112
113
114 roadsToExtrapolate.erase(roadsToExtrapolate.begin());
117 ATH_MSG_DEBUG(
"\033[1;31m-------------------------- extraploating road "<<
count <<
"------------------ \033[0m");
119 }
120
122 {
123 completedRoads.push_back(std::move(currentRoad));
124 continue;
125 }
126
127 std::vector<float> inputTensorValues;
130 continue;
131 }
132 std::vector<float> predhit;
133 long fineID;
136 continue;
137 }
138
140
141
142 if ((
m_useCartesian && (abs(predhit[0]) < 25 && abs(predhit[1]) < 25)) ||
144 {
145 completedRoads.push_back(std::move(currentRoad));
146 continue;
147 }
148 }
149 else {
150
151
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(std::move(currentRoad));
156 continue;
157 }
158 }
160 ATH_MSG_DEBUG(
"Predicted hit at: " << predhit[0] <<
" " << predhit[1] <<
" " << predhit[2]);
161 }
162
163
164 bool foundhitForRoad = false;
165 if(fineID == 215){
167 completedRoads.push_back(std::move(currentRoad));
168 continue;
169 }
170
171 unsigned lastLayerInRoad = 0;
172 std::shared_ptr<const FPGATrackSimHit> lastHit;
173 if(!
getLastLayer(currentRoad, lastLayerInRoad, lastHit) or !lastHit) {
175 continue;
176 }
177 unsigned layer = lastLayerInRoad+1;
178 bool lastHitWasReal = lastHit->isReal();
179 float lastHitR = lastHit->getR();
181 completedRoads.push_back(std::move(currentRoad));
182 continue;
183 }
184 unsigned int hitsInWindow = 0;
185
186
187 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> listofHitsFound;
188
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());
195 }
196
197 if (
getFineID(*hit) == fineID && hit->isReal()) {
198
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;
209
211
212 auto fineID_it = std::find(m_windowFineID.begin(), m_windowFineID.end(), fineID);
213 if (fineID_it == m_windowFineID.end()){
214 ATH_MSG_DEBUG("No windows for predicted fineID " << fineID << ", using maximum in provided list instead!");
215 fineID_index = -1;
216 }
217 else {
218 fineID_index = fineID_it - m_windowFineID.begin();
219 }
220 }
222 if (fineID_index == -1) {
224 }
225 else {
227 }
228 }
230 if (fineID_index == -1) {
232 }
233 else {
235 }
236 }
238 if (fineID_index == -1) {
240 }
241 else {
243 }
244 }
245
246
250
254
255 double dr = abs(hitr - predr);
256 double dz = abs(hitz - predz);
257 double dphi = abs(hitphi - predphi);
258 while (dphi >
pi) dphi -=
pi;
260 (!
m_useCartesian && dphi < windowPhi && dz < windowZ && dr < windowR))
261 {
262 std::vector<std::shared_ptr<const FPGATrackSimHit>> theseHits {hit};
263 hitsInWindow = hitsInWindow + 1;
264
265 if(hit->isStrip()) {
267
269 ATH_MSG_WARNING(
"For a SP in layer " << layer <<
" Couldn't find a matching strip SP");
270 }
271 }
272 else {
273 std::shared_ptr<FPGATrackSimHit> guessedSecondHitPtr = std::make_shared<FPGATrackSimHit>();
274 guessedSecondHitPtr->setX(0);
275 guessedSecondHitPtr->setY(0);
276 guessedSecondHitPtr->setZ(0);
277 guessedSecondHitPtr->setPhysLayer(lastHit->getPhysLayer(true)+1);
281
282 theseHits.push_back(guessedSecondHitPtr);
283 }
284 }
285
286 listofHitsFound.push_back(std::move(theseHits));
287 }
288 }
289 }
290
292 std::sort(listofHitsFound.begin(), listofHitsFound.end(), [&predhit](
auto&
a,
auto& b){
293 double predr = sqrt(predhit[0] * predhit[0] + predhit[1] * predhit[1]);
294 double predz = predhit[2];
295
296
297 double hitz = a[0]->getZ();
298 double hitr = a[0]->getR();
299 float distance_a = (hitr - predr)*(hitr - predr) + (hitz - predz)*(hitz - predz);
300
301
302 hitz = b[0]->getZ();
303 hitr = b[0]->getR();
304 float distance_b = (hitr - predr)*(hitr - predr) + (hitz - predz)*(hitz - predz);
305
306 return distance_a < distance_b;
307 });
308 }
309 else {
310 std::sort(listofHitsFound.begin(), listofHitsFound.end(), [&predhit](
auto&
a,
auto& b){
311
312 double predr = predhit[0];
313 double predphi = predhit[1];
314 double predz = predhit[2];
315
316 double hitr = a[0]->getR();
317 double hitphi = a[0]->getGPhi();
318 double hitz = a[0]->getZ();
319 double dz = abs(hitz - predz);
320 double dr = abs(hitr - predr);
321 double dphi = abs(hitphi - predphi);
322 while (dphi > pi) dphi -= pi;
323
324
325 float distance_a = dz*dz/(getZScale()*getZScale()) + dphi*dphi/(getPhiScale()*getPhiScale()) + dr*dr/(getRScale()*getRScale());
326
327
328 hitr = b[0]->getR();
329 hitphi = b[0]->getGPhi();
330 hitz = b[0]->getZ();
331 dz = abs(hitz - predz);
332 dr = abs(hitr - predr);
333 dphi = abs(hitphi - predphi);
334 while (dphi > pi) dphi -= pi;
335
336
337 float distance_b = dz*dz/(getZScale()*getZScale()) + dphi*dphi/(getPhiScale()*getPhiScale()) + dr*dr/(getRScale()*getRScale());
338
339 return distance_a < distance_b;
340 });
341 }
342
343 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> cleanHitsToGrow;
344
345
347 int nHitsToChoose = std::min(
int(
m_maxBranches.value()),
int(listofHitsFound.size()));
348 cleanHitsToGrow.reserve(nHitsToChoose);
349 std::copy(listofHitsFound.begin(), listofHitsFound.begin() + nHitsToChoose, std::back_inserter(cleanHitsToGrow));
350 }
351 else {
352 cleanHitsToGrow = std::move(listofHitsFound);
353 }
354
355 for (auto& hitsFound: cleanHitsToGrow) {
356
357
358 miniRoad newRoad;
359 if(!
addHitToRoad(newRoad, currentRoad, std::move(hitsFound))) {
361 continue;
362 }
363 roadsToExtrapolate.push_back(newRoad);
364 foundhitForRoad = true;
366 ATH_MSG_DEBUG(
"------ road grown with hit from layer "<<layer<<
" to");
368 }
369 }
370
371 if (!foundhitForRoad) {
372
374
375 continue;
376 }
377 else {
378 std::vector<std::shared_ptr<const FPGATrackSimHit>> theseHits;
379
380 if (!
getFakeHit(currentRoad, predhit, fineID, theseHits)) {
382 continue;
383 }
384
386 continue;
387 }
388
389 miniRoad newroad;
390 if (!
addHitToRoad(newroad, currentRoad, std::move(theseHits))) {
392 continue;
393 }
394 roadsToExtrapolate.push_back(std::move(newroad));
395 }
396 }
397 }
398
399 for (const auto &miniroad : completedRoads) {
400 FPGATrackSimRoad road;
404
410
411
412 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> roadhits = miniroad.getVecHits();
414 if (roadhits.size() > nexpected) {
415 roadhits.resize(nexpected);
416 }
417 else if (roadhits.size() < nexpected) {
418 for (unsigned layer = roadhits.size(); layer < nexpected; layer++) {
419 std::shared_ptr<FPGATrackSimHit> emptyHitPtr = std::make_shared<FPGATrackSimHit>();
420 emptyHitPtr->setX(0);
421 emptyHitPtr->setY(0);
422 emptyHitPtr->setZ(0);
423 emptyHitPtr->setLayer(layer);
425
426 roadhits.emplace_back(1,emptyHitPtr);
428 wclayers |= (1 <<
layer);
430 }
431 }
432 road.
setHits(std::move(roadhits));
433
434 m_roads.push_back(std::move(road));
435 }
436 }
437
439 for (FPGATrackSimRoad &
r :
m_roads)
440 {
442 roads.emplace_back(std::make_shared<const FPGATrackSimRoad>(
r));
443 }
444 ATH_MSG_DEBUG(
"Found " << roads.size() <<
" new roads in second stage.");
445
446 return StatusCode::SUCCESS;
447}
#define ATH_MSG_WARNING(x)
bool isFineIDInStrip(long ID)
long getFineID(const FPGATrackSimHit &hit)
bool isFineIDInPixel(long ID)
void setHitLayers(layer_bitmask_t hit_layers)
void setHits(std::vector< std::vector< std::shared_ptr< const FPGATrackSimHit > > > &&hits)
void setRoadID(int roadID)
layer_bitmask_t getWCLayers() const
void setWCLayers(layer_bitmask_t wc_layers)
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
void addHit(const std::shared_ptr< const FPGATrackSimHit > &hit)
unsigned getNHits() const
size_t getNWCLayers() const