27 #include "GaudiKernel/IEventProcessor.h"
33 #ifdef BENCHMARK_FPGATRACKSIM
54 while (std::getline(
ss,
line,
'\n')) {
130 return StatusCode::SUCCESS;
140 const EventContext& ctx = getContext();
146 ATH_MSG_WARNING(
"Didn't receive " << FPGAHits.
key() <<
" on first event; assuming no input events.");
148 SmartIF<IEventProcessor> appMgr{service(
"ApplicationMgr")};
150 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
151 return StatusCode::FAILURE;
153 return appMgr->stopRun();
162 ATH_CHECK( FPGAHits_1st.
record (std::make_unique<FPGATrackSimHitCollection>()));
163 ATH_CHECK( FPGAHits_2nd.
record (std::make_unique<FPGATrackSimHitCollection>()));
164 ATH_CHECK( FPGARoads_1st.
record (std::make_unique<FPGATrackSimRoadCollection>()));
165 ATH_CHECK( FPGAHitsInRoads_1st.
record (std::make_unique<FPGATrackSimHitContainer>()));
168 ATH_CHECK(FPGATracks_1stHandle.
record (std::make_unique<FPGATrackSimTrackCollection>()));
171 ATH_CHECK( FPGAHitsFiltered_1st.
record (std::make_unique<FPGATrackSimHitCollection>()));
174 ATH_CHECK( FPGASpacePoints.
record (std::make_unique<FPGATrackSimClusterCollection>()));
177 if (!
m_evtSel->getSelectedEvent()) {
181 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads_1st;
182 std::vector<FPGATrackSimTrack> tracks_1st;
183 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
187 return StatusCode::SUCCESS;
196 if (!FPGAEventInfo.
isValid()) {
197 ATH_MSG_ERROR(
"Could not find FPGA Event Info with key " << FPGAEventInfo.
key());
198 return StatusCode::FAILURE;
208 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits_output, phits_all, phits_1st, phits_2nd;
209 phits_1st.reserve(FPGAHits->size());
210 phits_2nd.reserve(FPGAHits->size());
219 for (
auto& hit : phits_1st) {
220 FPGAHits_1st->push_back(*hit);
239 for (
auto& hit : phits_2nd) {
240 FPGAHits_2nd->push_back(*hit);
249 ATH_MSG_DEBUG(
"1st stage hits: " << phits_1st.size() <<
" 2nd stage hits: " << phits_2nd.size() );
250 if (phits_1st.empty())
return StatusCode::SUCCESS;
253 if (!FPGATruthTracks.
isValid()) {
254 ATH_MSG_ERROR(
"Could not find FPGA Truth Track Collection with key " << FPGATruthTracks.
key());
255 return StatusCode::FAILURE;
260 if (!FPGAOfflineTracks.
isValid()) {
261 ATH_MSG_ERROR(
"Could not find FPGA Offline Track Collection with key " << FPGAOfflineTracks.
key());
262 return StatusCode::FAILURE;
271 const std::vector<FPGATrackSimTruthTrack>& truthtracks = *FPGATruthTracks;
276 auto monitorRoads = [&](
auto& monitor,
const auto& roads) {
277 if (!monitor.empty()) {
278 monitor->fillRoad(roads, truthtracks, nLogicalLayers);
285 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads_1st;
294 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter_roads;
297 roads_1st = std::move(postfilter_roads);
314 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter2_roads;
317 roads_1st = std::move(postfilter2_roads);
329 auto monitorTracks = [&](
auto& monitor,
const auto& tracks) {
330 if (monitor.empty())
return;
332 std::vector<const FPGATrackSimTrack*> track_ptrs;
333 track_ptrs.reserve(tracks.size());
335 if constexpr (std::is_pointer_v<
typename std::decay_t<decltype(tracks)>::
value_type>) {
337 track_ptrs.insert(track_ptrs.end(), tracks.begin(), tracks.end());
340 std::transform(tracks.begin(), tracks.end(), std::back_inserter(track_ptrs), [](
const auto&
t) { return &t; });
343 monitor->fillTrack(track_ptrs, truthtracks, 1.e15);
348 std::vector<FPGATrackSimTrack> tracks_1st;
361 for (
const auto& road : roads_1st) {
362 std::vector<FPGATrackSimTrack> tracksForCurrentRoad;
365 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadVec = {road};
369 if (!tracksForCurrentRoad.empty()) {
370 auto bestTrackIter = std::min_element(
371 tracksForCurrentRoad.begin(), tracksForCurrentRoad.end(),
373 return a.getChi2ndof() < b.getChi2ndof();
376 if (bestTrackIter != tracksForCurrentRoad.end() && bestTrackIter->getChi2ndof() < 1.e15) {
377 tracks_1st.push_back(*bestTrackIter);
386 ATH_MSG_DEBUG(
"No tracking. Just running dummy road2track algorith");
388 for (
const std::shared_ptr<const FPGATrackSimRoad>& road : roads_1st) {
389 std::vector<std::shared_ptr<const FPGATrackSimHit>> track_hits;
391 track_hits.insert(track_hits.end(), road->getHits(
layer).begin(), road->getHits(
layer).end());
396 for (
size_t ihit = 0; ihit < track_hits.size(); ++ihit) {
399 tracks_1st.push_back(track_cand);
418 track.setQOverPt(truthtracks.front().getQOverPt());
420 track.setD0(truthtracks.front().getD0());
422 track.setPhi(truthtracks.front().getPhi());
424 track.setZ0(truthtracks.front().getZ0());
426 track.setEta(truthtracks.front().getEta());
435 for (
auto const& road : roads_1st) {
436 std::vector<FPGATrackSimHit> road_hits;
437 ATH_MSG_DEBUG(
"Hough Road X Y: " << road->getX() <<
" " << road->getY());
438 for (
size_t l = 0;
l < road->getNLayers(); ++
l) {
439 for (
const auto& layerH : road->getHits(
l)) {
440 road_hits.push_back(*layerH);
443 FPGAHitsInRoads_1st->push_back(std::move(road_hits));
444 FPGARoads_1st->push_back(*road);
451 std::vector<const FPGATrackSimTrack*> tracks_1st_after_chi2;
452 std::vector<const FPGATrackSimTrack*> tracks_1st_after_overlap;
456 tracks_1st_after_chi2.push_back(&
track);
457 if (
track.passedOR()) {
458 tracks_1st_after_overlap.push_back(&
track);
473 if (truthtracks.size() > 0) {
478 unsigned npasschi2(0);
479 unsigned npasschi2OLR(0);
480 if (tracks_1st.size() > 0) {
483 for (
const auto&
track : tracks_1st) {
486 if (
track.passedOR()) {
502 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadsLRT;
503 std::vector<FPGATrackSimTrack> tracksLRT;
506 std::vector<std::shared_ptr<const FPGATrackSimHit>> remainingHits;
509 ATH_MSG_DEBUG(
"Doing hit filtering based on prompt tracks.");
512 for (
const auto &
Hit : remainingHits) FPGAHitsFiltered_1st->push_back(*
Hit);
515 ATH_MSG_DEBUG(
"No hit filtering requested; using all hits for LRT.");
516 remainingHits = std::move(phits_1st);
524 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
535 SmartIF<IEventProcessor> appMgr{service(
"ApplicationMgr")};
537 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
538 return StatusCode::FAILURE;
549 return StatusCode::SUCCESS;
558 std::vector<FPGATrackSimTrack>
const& tracks_1st,
563 ATH_MSG_DEBUG(
"NFPGATrackSimRoads_1st = " << roads_1st.size() <<
", NFPGATrackSimTracks_1st = " << tracks_1st.size());
581 return StatusCode::SUCCESS;
591 ATH_MSG_INFO(
"========================================================================================");
603 ATH_MSG_INFO(
"========================================================================================");
609 ATH_MSG_INFO(
"========================================================================================");
611 return StatusCode::SUCCESS;
621 for (
const auto& hit :
hits)
624 std::stringstream
ss;
625 for (
auto r : regions)