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