64 std::vector<FPGATrackSimRoad>& roads) {
70 for (
auto& entry : sliceEntry.second) {
80 for (
int ireg = 0; ireg < rmap_2nd->
getNRegions(); ireg++) {
89 for (
const std::shared_ptr<const FPGATrackSimHit>& hit : hits) {
90 std::shared_ptr<FPGATrackSimHit> hitCopy = std::make_shared<FPGATrackSimHit>(*hit);
91 pmap_2nd->
map(*hitCopy);
92 if (!hitCopy->isMapped()){
106 std::vector<std::shared_ptr<const FPGATrackSimHit>> allMappedHits;
117 if (track.passedOR() == 0) {
122 double trackphi = track.getPhi();
123 double trackqoverpt = track.getQOverPt();
129 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>> road_hits;
134 const auto& track_hits = track.getFPGATrackSimHitPtrs();
135 for (
unsigned layer = 0; layer < track_hits.size(); layer++) {
136 if (!track_hits[layer])
continue;
138 road_hits[layer].push_back(std::make_shared<FPGATrackSimHit>(hit));
140 hitLayers |= 1 << layer;
145 size_t slice = track.getSubRegion();
150 if (!success)
continue;
153 for (
auto num: numHits) {
154 if(num > 0) nhit += 1;
166 road.
setY(trackqoverpt);
167 road.
setXBin(track.getHoughXBin());
168 road.
setYBin(track.getHoughYBin());
172 unsigned int wclayers = 0;
173 for (
unsigned i = 0; i < numHits.size(); i++){
174 if(numHits[i]==0) wclayers |= (0x1 << i);
180 road.
setHits(std::move(road_hits));
186 ATH_MSG_DEBUG(
"Found " << roads.size() <<
" new roads in second stage.");
191 return StatusCode::SUCCESS;
195 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>& road_hits) {
200 double trackd0 = track.getD0();
201 double trackphi = track.getPhi();
202 double trackz0 = track.getZ0();
203 double tracketa = track.getEta();
204 double trackqoverpt = track.getQOverPt();
205 double cottracktheta = 0.5*(exp(tracketa)-exp(-tracketa));
206 size_t slice = track.getSubRegion();
210 for (
const std::shared_ptr<const FPGATrackSimHit>& hit:
m_phits_atLayer[slice][layer]) {
212 if (!rmap_2nd->
isInRegion(track.getSubRegion(), *hit)) {
216 double hitphi = hit->getGPhi();
217 double hitr = hit->getR();
218 double hitz = hit->getZ();
219 double pred_hitphi = trackphi - asin(hitr *
fpgatracksim::A * 1000 * trackqoverpt - trackd0/hitr);
220 double pred_hitz = trackz0 + hitr*cottracktheta;
224 double fieldCor =
fieldCorrection(track.getRegion(), trackqoverpt, hitr);
225 pred_hitphi += fieldCor;
228 double diffphi = abs(hitphi-pred_hitphi);
229 double diffz = abs(hitz-pred_hitz);
235 road_hits[layer].push_back(hit);
236 hitLayers |= 1 << hit->getLayer();
246 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>& road_hits) {
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));
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());
267 ATH_MSG_DEBUG(
"Track doesn't pass binning tool track parameter cuts");
272 ATH_MSG_DEBUG(
"Attempting to look up bin entry using binpars = " << binPars);
275 ATH_MSG_DEBUG(
"Matched track to new bin containing " << entry.lyrCnt() <<
" layers with " << entry.hitCnt <<
" hits total");
277 std::vector<std::vector<std::tuple<float, float, std::shared_ptr<const FPGATrackSimHit>>>> road_hits_sortable;
283 const std::shared_ptr<const FPGATrackSimHit>& hit = storedHit.
hitptr;
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;
294 double fieldCor =
fieldCorrection(track.getRegion(), trackqoverpt, hitr);
295 pred_hitphi += fieldCor;
298 double diffphi = abs(hitphi-pred_hitphi);
299 double diffz = abs(hitz-pred_hitz);
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;
309 if (hit->isBarrel()) {
312 ATH_MSG_WARNING(
"There is a hit in layer: " << layer <<
" with track eta " << tracketa <<
" in the barrel!");
316 road_hits[layer].push_back(hit);
317 hitLayers |= 1 << layer;
323 ATH_MSG_WARNING(
"There is a hit in layer: " << layer <<
" with track eta " << tracketa <<
" in the endcap!");
327 road_hits[layer].push_back(hit);
328 hitLayers |= 1 << layer;
334 road_hits_sortable[layer].push_back({diffphi, diffz, hit});
335 hitLayers |= 1 << layer;
342 for (
unsigned layer = 0; layer <
m_FPGATrackSimMapping->PlaneMap_2nd(0)->getNLogiLayers(); layer++) {
343 if (road_hits_sortable.at(layer).size() >= 2) {
345 std::ranges::sort(road_hits_sortable.at(layer), [zScale, phiScale](
auto&
a,
auto& b){
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;
352 double dphi = std::get<0>(a);
353 double dz = std::get<1>(a);
358 float distance_a = dphi*dphi/(phiScale*phiScale) + dz*dz/(zScale*zScale);
361 dphi = std::get<0>(b);
365 float distance_b = dphi*dphi/(phiScale*phiScale) + dz*dz/(zScale*zScale);
367 return distance_a < distance_b;
372 int cutoff = road_hits_sortable.at(layer).size();
374 cutoff = std::min(cutoff,
m_maxHits.value().at(layer));
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);