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 for (
unsigned layer = 0; layer < track.getFPGATrackSimHits().size(); layer++) {
136 road_hits[layer].push_back(std::make_shared<FPGATrackSimHit>(hit));
138 hitLayers |= 1 << layer;
143 size_t slice = track.getSubRegion();
148 if (!success)
continue;
151 for (
auto num: numHits) {
152 if(num > 0) nhit += 1;
164 road.
setY(trackqoverpt);
165 road.
setXBin(track.getHoughXBin());
166 road.
setYBin(track.getHoughYBin());
170 unsigned int wclayers = 0;
171 for (
unsigned i = 0; i < numHits.size(); i++){
172 if(numHits[i]==0) wclayers |= (0x1 << i);
178 road.
setHits(std::move(road_hits));
184 ATH_MSG_DEBUG(
"Found " << roads.size() <<
" new roads in second stage.");
189 return StatusCode::SUCCESS;
193 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>& road_hits) {
198 double trackd0 = track.getD0();
199 double trackphi = track.getPhi();
200 double trackz0 = track.getZ0();
201 double tracketa = track.getEta();
202 double trackqoverpt = track.getQOverPt();
203 double cottracktheta = 0.5*(exp(tracketa)-exp(-tracketa));
204 size_t slice = track.getSubRegion();
208 for (
const std::shared_ptr<const FPGATrackSimHit>& hit:
m_phits_atLayer[slice][layer]) {
210 if (!rmap_2nd->
isInRegion(track.getSubRegion(), *hit)) {
214 double hitphi = hit->getGPhi();
215 double hitr = hit->getR();
216 double hitz = hit->getZ();
217 double pred_hitphi = trackphi - asin(hitr *
fpgatracksim::A * 1000 * trackqoverpt - trackd0/hitr);
218 double pred_hitz = trackz0 + hitr*cottracktheta;
222 double fieldCor =
fieldCorrection(track.getRegion(), trackqoverpt, hitr);
223 pred_hitphi += fieldCor;
226 double diffphi = abs(hitphi-pred_hitphi);
227 double diffz = abs(hitz-pred_hitz);
233 road_hits[layer].push_back(hit);
234 hitLayers |= 1 << hit->getLayer();
244 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>& road_hits) {
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));
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());
265 ATH_MSG_DEBUG(
"Track doesn't pass binning tool track parameter cuts");
270 ATH_MSG_DEBUG(
"Attempting to look up bin entry using binpars = " << binPars);
273 ATH_MSG_DEBUG(
"Matched track to new bin containing " << entry.lyrCnt() <<
" layers with " << entry.hitCnt <<
" hits total");
275 std::vector<std::vector<std::tuple<float, float, std::shared_ptr<const FPGATrackSimHit>>>> road_hits_sortable;
281 const std::shared_ptr<const FPGATrackSimHit>& hit = storedHit.
hitptr;
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;
292 double fieldCor =
fieldCorrection(track.getRegion(), trackqoverpt, hitr);
293 pred_hitphi += fieldCor;
296 double diffphi = abs(hitphi-pred_hitphi);
297 double diffz = abs(hitz-pred_hitz);
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;
307 if (hit->isBarrel()) {
310 ATH_MSG_WARNING(
"There is a hit in layer: " << layer <<
" with track eta " << tracketa <<
" in the barrel!");
314 road_hits[layer].push_back(hit);
315 hitLayers |= 1 << layer;
321 ATH_MSG_WARNING(
"There is a hit in layer: " << layer <<
" with track eta " << tracketa <<
" in the endcap!");
325 road_hits[layer].push_back(hit);
326 hitLayers |= 1 << layer;
332 road_hits_sortable[layer].push_back({diffphi, diffz, hit});
333 hitLayers |= 1 << layer;
340 for (
unsigned layer = 0; layer <
m_FPGATrackSimMapping->PlaneMap_2nd(0)->getNLogiLayers(); layer++) {
341 if (road_hits_sortable.at(layer).size() >= 2) {
343 std::ranges::sort(road_hits_sortable.at(layer), [zScale, phiScale](
auto&
a,
auto& b){
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;
350 double dphi = std::get<0>(a);
351 double dz = std::get<1>(a);
356 float distance_a = dphi*dphi/(phiScale*phiScale) + dz*dz/(zScale*zScale);
359 dphi = std::get<0>(b);
363 float distance_b = dphi*dphi/(phiScale*phiScale) + dz*dz/(zScale*zScale);
365 return distance_a < distance_b;
370 int cutoff = road_hits_sortable.at(layer).size();
372 cutoff = std::min(cutoff,
m_maxHits.value().at(layer));
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);