43 m_phits_atLayer[j] = std::map<unsigned, std::vector<std::shared_ptr<const FPGATrackSimHit>>>();
46 m_phits_atLayer[j][
i] = std::vector<std::shared_ptr<const FPGATrackSimHit>>();
59 return StatusCode::SUCCESS;
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);
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;
136 road_hits[
layer].push_back(std::make_shared<FPGATrackSimHit>(hit));
138 hitLayers |= 1 <<
layer;
148 if (!success)
continue;
151 for (
auto num: numHits) {
152 if(
num > 0) nhit += 1;
164 road.
setY(trackqoverpt);
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));
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;
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;
296 pred_hitphi += fieldCor;
299 double diffphi = abs(hitphi-pred_hitphi);
300 double diffz = abs(hitz-pred_hitz);
306 road_hits_sortable[
layer].push_back({diffphi, diffz, hit});
307 hitLayers |= 1 <<
layer;
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;
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();
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);