63 const std::vector<std::shared_ptr<const FPGATrackSimTrack>> & tracks,
64 std::vector<std::shared_ptr<const 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;
116 for (std::shared_ptr<const FPGATrackSimTrack> track : tracks) {
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));
185 roads.emplace_back(std::make_shared<const FPGATrackSimRoad>(
r));
192 return StatusCode::SUCCESS;
196 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>& road_hits) {
201 double trackd0 = track->getD0();
202 double trackphi = track->getPhi();
203 double trackz0 = track->getZ0();
204 double tracketa = track->getEta();
205 double trackqoverpt = track->getQOverPt();
206 double cottracktheta = 0.5*(exp(tracketa)-exp(-tracketa));
207 size_t slice = track->getSubRegion();
211 for (
const std::shared_ptr<const FPGATrackSimHit>& hit:
m_phits_atLayer[slice][layer]) {
213 if (!rmap_2nd->
isInRegion(track->getSubRegion(), *hit)) {
217 double hitphi = hit->getGPhi();
218 double hitr = hit->getR();
219 double hitz = hit->getZ();
220 double pred_hitphi = trackphi - asin(hitr *
fpgatracksim::A * 1000 * trackqoverpt - trackd0/hitr);
221 double pred_hitz = trackz0 + hitr*cottracktheta;
225 double fieldCor =
fieldCorrection(track->getRegion(), trackqoverpt, hitr);
226 pred_hitphi += fieldCor;
229 double diffphi = abs(hitphi-pred_hitphi);
230 double diffz = abs(hitz-pred_hitz);
236 road_hits[layer].push_back(hit);
237 hitLayers |= 1 << hit->getLayer();
247 std::vector<std::vector<std::shared_ptr<const FPGATrackSimHit>>>& road_hits) {
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));
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());
268 ATH_MSG_DEBUG(
"Track doesn't pass binning tool track parameter cuts");
273 ATH_MSG_DEBUG(
"Attempting to look up bin entry using binpars = " << binPars);
276 ATH_MSG_DEBUG(
"Matched track to new bin containing " << entry.lyrCnt() <<
" layers with " << entry.hitCnt <<
" hits total");
278 std::vector<std::vector<std::tuple<float, float, std::shared_ptr<const FPGATrackSimHit>>>> road_hits_sortable;
284 const std::shared_ptr<const FPGATrackSimHit>& hit = storedHit.
hitptr;
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;
295 double fieldCor =
fieldCorrection(track->getRegion(), trackqoverpt, hitr);
296 pred_hitphi += fieldCor;
299 double diffphi = abs(hitphi-pred_hitphi);
300 double diffz = abs(hitz-pred_hitz);
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;
310 if (hit->isBarrel()) {
313 ATH_MSG_WARNING(
"There is a hit in layer: " << layer <<
" with track eta " << tracketa <<
" in the barrel!");
317 road_hits[layer].push_back(hit);
318 hitLayers |= 1 << layer;
324 ATH_MSG_WARNING(
"There is a hit in layer: " << layer <<
" with track eta " << tracketa <<
" in the endcap!");
328 road_hits[layer].push_back(hit);
329 hitLayers |= 1 << layer;
335 road_hits_sortable[layer].push_back({diffphi, diffz, hit});
336 hitLayers |= 1 << layer;
343 for (
unsigned layer = 0; layer <
m_FPGATrackSimMapping->PlaneMap_2nd(0)->getNLogiLayers(); layer++) {
344 if (road_hits_sortable.at(layer).size() >= 2) {
346 std::ranges::sort(road_hits_sortable.at(layer), [zScale, phiScale](
auto&
a,
auto& b){
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;
353 double dphi = std::get<0>(a);
354 double dz = std::get<1>(a);
359 float distance_a = dphi*dphi/(phiScale*phiScale) + dz*dz/(zScale*zScale);
362 dphi = std::get<0>(b);
366 float distance_b = dphi*dphi/(phiScale*phiScale) + dz*dz/(zScale*zScale);
368 return distance_a < distance_b;
373 int cutoff = road_hits_sortable.at(layer).size();
375 cutoff = std::min(cutoff,
m_maxHits.value().at(layer));
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);