148 const EventContext& ctx = getContext();
154 ATH_MSG_WARNING(
"Didn't receive " << FPGAHits.
key() <<
" on first event; assuming no input events.");
156 SmartIF<IEventProcessor> appMgr{service(
"ApplicationMgr")};
158 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
159 return StatusCode::FAILURE;
161 return appMgr->stopRun();
170 ATH_CHECK( FPGAHits_1st.
record (std::make_unique<FPGATrackSimHitCollection>()));
171 ATH_CHECK( FPGAHits_2nd.
record (std::make_unique<FPGATrackSimHitCollection>()));
172 ATH_CHECK( FPGARoads_1st.
record (std::make_unique<FPGATrackSimRoadCollection>()));
173 ATH_CHECK( FPGAHitsInRoads_1st.
record (std::make_unique<FPGATrackSimHitContainer>()));
176 ATH_CHECK(FPGATracks_1stHandle.
record (std::make_unique<FPGATrackSimTrackCollection>()));
179 ATH_CHECK( FPGAHitsFiltered_1st.
record (std::make_unique<FPGATrackSimHitCollection>()));
182 ATH_CHECK( FPGASpacePoints.
record (std::make_unique<FPGATrackSimClusterCollection>()));
185 if (!
m_evtSel->getSelectedEvent()) {
189 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads_1st;
190 std::vector<FPGATrackSimTrack> tracks_1st;
191 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
195 return StatusCode::SUCCESS;
207 if (!FPGAEventInfo.
isValid()) {
208 ATH_MSG_ERROR(
"Could not find FPGA Event Info with key " << FPGAEventInfo.
key());
209 return StatusCode::FAILURE;
219 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits_output, phits_all, phits_1st, phits_2nd;
220 phits_1st.reserve(FPGAHits->size());
221 phits_2nd.reserve(FPGAHits->size());
230 for (
auto& hit : phits_1st) {
231 FPGAHits_1st->push_back(*hit);
250 for (
auto& hit : phits_2nd) {
251 FPGAHits_2nd->push_back(*hit);
260 ATH_MSG_DEBUG(
"1st stage hits: " << phits_1st.size() <<
" 2nd stage hits: " << phits_2nd.size() );
261 if (phits_1st.empty())
return StatusCode::SUCCESS;
264 if (!FPGATruthTracks.
isValid()) {
265 ATH_MSG_ERROR(
"Could not find FPGA Truth Track Collection with key " << FPGATruthTracks.
key());
266 return StatusCode::FAILURE;
271 if (!FPGAOfflineTracks.
isValid()) {
272 ATH_MSG_ERROR(
"Could not find FPGA Offline Track Collection with key " << FPGAOfflineTracks.
key());
273 return StatusCode::FAILURE;
282 const std::vector<FPGATrackSimTruthTrack>& truthtracks = *FPGATruthTracks;
287 auto monitorRoads = [&](
auto& monitor,
const auto& roads) {
288 if (!monitor.empty()) {
289 monitor->fillRoad(roads, truthtracks, nLogicalLayers);
296 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads_1st;
305 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter_roads;
308 roads_1st = std::move(postfilter_roads);
325 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter2_roads;
328 roads_1st = std::move(postfilter2_roads);
340 auto monitorTracks = [&](
auto& monitor,
const auto& tracks) {
341 if (monitor.empty())
return;
343 std::vector<const FPGATrackSimTrack*> track_ptrs;
344 track_ptrs.reserve(tracks.size());
346 if constexpr (std::is_pointer_v<
typename std::decay_t<
decltype(tracks)>
::value_type>) {
348 track_ptrs.insert(track_ptrs.end(), tracks.begin(), tracks.end());
351 std::transform(tracks.begin(), tracks.end(), std::back_inserter(track_ptrs), [](
const auto& t) { return &t; });
354 monitor->fillTrack(track_ptrs, truthtracks, 1.e15);
359 std::vector<FPGATrackSimTrack> tracks_1st;
372 for (
const auto& road : roads_1st) {
373 std::vector<FPGATrackSimTrack> tracksForCurrentRoad;
376 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadVec = {road};
380 if (!tracksForCurrentRoad.empty()) {
381 auto bestTrackIter = std::min_element(
382 tracksForCurrentRoad.begin(), tracksForCurrentRoad.end(),
384 return a.getChi2ndof() < b.getChi2ndof();
387 if (bestTrackIter != tracksForCurrentRoad.end() && bestTrackIter->getChi2ndof() < 1.e15) {
388 tracks_1st.push_back(*bestTrackIter);
397 ATH_MSG_DEBUG(
"No tracking. Just running dummy road2track algorith");
399 for (
const std::shared_ptr<const FPGATrackSimRoad>& road : roads_1st) {
400 std::vector<std::shared_ptr<const FPGATrackSimHit>> track_hits;
401 for (
unsigned layer = 0; layer < road->getNLayers(); ++layer) {
402 track_hits.insert(track_hits.end(), road->getHits(layer).begin(), road->getHits(layer).end());
407 for (
size_t ihit = 0; ihit < track_hits.size(); ++ihit) {
410 tracks_1st.push_back(track_cand);
420 for (
auto &track : tracks_1st)
421 track.calculateTruth();
436 track.setQOverPt(truthtracks.front().getQOverPt());
438 track.setD0(truthtracks.front().getD0());
440 track.setPhi(truthtracks.front().getPhi());
442 track.setZ0(truthtracks.front().getZ0());
444 track.setEta(truthtracks.front().getEta());
453 for (
auto const& road : roads_1st) {
454 std::vector<FPGATrackSimHit> road_hits;
455 ATH_MSG_DEBUG(
"Hough Road X Y: " << road->getX() <<
" " << road->getY());
456 for (
size_t l = 0; l < road->getNLayers(); ++l) {
457 for (
const auto& layerH : road->getHits(l)) {
458 road_hits.push_back(*layerH);
461 FPGAHitsInRoads_1st->push_back(std::move(road_hits));
462 FPGARoads_1st->push_back(*road);
469 std::vector<const FPGATrackSimTrack*> tracks_1st_after_chi2;
470 std::vector<const FPGATrackSimTrack*> tracks_1st_after_overlap;
474 tracks_1st_after_chi2.push_back(&track);
475 if (track.passedOR()) {
476 tracks_1st_after_overlap.push_back(&track);
491 if (truthtracks.size() > 0) {
496 unsigned npasschi2(0);
497 unsigned npasschi2OLR(0);
498 if (tracks_1st.size() > 0) {
501 for (
const auto& track : tracks_1st) {
504 if (track.passedOR()) {
516 for (
const FPGATrackSimTrack& track : tracks_1st) FPGATracks_1stHandle->push_back(track);
520 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadsLRT;
521 std::vector<FPGATrackSimTrack> tracksLRT;
524 std::vector<std::shared_ptr<const FPGATrackSimHit>> remainingHits;
527 ATH_MSG_DEBUG(
"Doing hit filtering based on prompt tracks.");
530 for (
const auto &
Hit : remainingHits) FPGAHitsFiltered_1st->push_back(*
Hit);
533 ATH_MSG_DEBUG(
"No hit filtering requested; using all hits for LRT.");
534 remainingHits = std::move(phits_1st);
542 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
553 SmartIF<IEventProcessor> appMgr{service(
"ApplicationMgr")};
555 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
556 return StatusCode::FAILURE;
567 return StatusCode::SUCCESS;