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