246 {
247
248
249 double trackd0 =
track.getD0();
250 double trackphi =
track.getPhi();
251 double trackz0 =
track.getZ0();
252 double tracketa =
track.getEta();
253 double trackqoverpt =
track.getQOverPt();
254 double cottracktheta = 0.5*(
exp(tracketa)-
exp(-tracketa));
255
256
257 const FPGATrackSimBinStep* binStep =
m_hitBinningTool->getBinTool().lastStep();
258 const IFPGATrackSimBinDesc* binDesc =
m_hitBinningTool->getBinTool().binDesc();
259 ATH_MSG_DEBUG(
"Attempting to look up binIdx for track with phi = " <<
track.getPhi() <<
", chi2/DOF = " <<
track.getChi2ndof() <<
", q/pt = " <<
track.getQOverPt() <<
", eta = " <<
track.getEta() <<
", d0 = " <<
track.getD0() <<
", z0 = " <<
track.getZ0());
260 FPGATrackSimTrackPars trackPars =
track.getPars();
261
262
264
267 ATH_MSG_DEBUG(
"Track doesn't pass binning tool track parameter cuts");
268 }
270
271 FPGATrackSimBinUtil::IdxSet binPars = binStep->
binIdx(parSet);
272 ATH_MSG_DEBUG(
"Attempting to look up bin entry using binpars = " << binPars);
274
275 ATH_MSG_DEBUG(
"Matched track to new bin containing " <<
entry.lyrCnt() <<
" layers with " <<
entry.hitCnt <<
" hits total");
276
277 std::vector<std::vector<std::tuple<float, float, std::shared_ptr<const FPGATrackSimHit>>>> road_hits_sortable;
279
280 for (FPGATrackSimBinUtil::StoredHit& storedHit :
entry.hits) {
281
283 const std::shared_ptr<const FPGATrackSimHit>& hit = storedHit.
hitptr;
284
285
286 double hitphi = hit->getGPhi();
287 double hitr = hit->getR();
288 double hitz = hit->getZ();
289 double pred_hitphi = trackphi - asin(hitr *
fpgatracksim::A * 1000 * trackqoverpt - trackd0/hitr);
290 double pred_hitz = trackz0 + hitr*cottracktheta;
291
292
295 pred_hitphi += fieldCor;
296 }
297
298 double diffphi = abs(hitphi-pred_hitphi);
299 double diffz = abs(hitz-pred_hitz);
300
301
302 ATH_MSG_DEBUG(
"Hit in region -- standard window comparison: comparing phi " << diffphi <<
" to " <<
m_phiwindows[layer] <<
" and z " << diffz <<
" to " <<
m_zwindows[layer]);
305 road_hits_sortable[
layer].push_back({diffphi, diffz, hit});
306 hitLayers |= 1 <<
layer;
307 }
309 if (hit->isBarrel()) {
312 ATH_MSG_WARNING(
"There is a hit in layer: " << layer <<
" with track eta " << tracketa <<
" in the barrel!");
313 }
316 road_hits[
layer].push_back(hit);
317 hitLayers |= 1 <<
layer;
318 }
319 }
320 else {
323 ATH_MSG_WARNING(
"There is a hit in layer: " << layer <<
" with track eta " << tracketa <<
" in the endcap!");
324 }
327 road_hits[
layer].push_back(hit);
328 hitLayers |= 1 <<
layer;
329 }
330 }
331 }
334 road_hits_sortable[
layer].push_back({diffphi, diffz, hit});
335 hitLayers |= 1 <<
layer;
336 }
337 }
338
339
343 if (road_hits_sortable.at(layer).size() >= 2) {
345 std::ranges::sort(road_hits_sortable.at(layer), [zScale, phiScale](
auto&
a,
auto& b){
346
347
348 if (std::get<2>(a)->getHitType() == HitType::spacepoint && std::get<2>(b)->getHitType() != HitType::spacepoint) return true;
349 else if (std::get<2>(b)->getHitType() == HitType::spacepoint && std::get<2>(a)->getHitType() != HitType::spacepoint) return false;
350
351
352 double dphi = std::get<0>(a);
353 double dz = std::get<1>(a);
354
355
356
357
358 float distance_a = dphi*dphi/(phiScale*phiScale) + dz*dz/(zScale*zScale);
359
360
361 dphi = std::get<0>(b);
362 dz = std::get<1>(b);
363
364
365 float distance_b = dphi*dphi/(phiScale*phiScale) + dz*dz/(zScale*zScale);
366
367 return distance_a < distance_b;
368 });
369 }
370
371
372 int cutoff = road_hits_sortable.at(layer).size();
374 cutoff = std::min(cutoff,
m_maxHits.value().at(layer));
375 }
376 for (int ihit = 0; ihit < cutoff; ihit++) {
377 auto& road_hit = std::get<2>(road_hits_sortable.at(layer).at(ihit));
378 road_hits.at(layer).push_back(road_hit);
379 }
380
381 }
382
383 return true;
384
385}
#define ATH_MSG_WARNING(x)
double fieldCorrection(unsigned region, double qoverpt, double r)
unsigned binIdx(unsigned par, double val) const
virtual const FPGATrackSimBinUtil::ParSet trackParsToParSet(const FPGATrackSimTrackPars &pars) const =0
static constexpr double A
std::shared_ptr< const FPGATrackSimHit > hitptr