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)