6 #ifdef BENCHMARK_FPGATRACKSIM 
   17     ATH_CHECK(m_FPGATrackCollectionKeys.initialize());
 
   18     ATH_CHECK(m_FPGARoadCollectionKeys.initialize());
 
   19     ATH_CHECK(m_FPGAHitsInRoadsCollectionKeys.initialize());
 
   21     ATH_CHECK(m_FinalFPGARoadkCollectionKey.initialize());
 
   22     ATH_CHECK(m_FinalFPGAHitsInRoadsCollectionKey.initialize());
 
   23     ATH_CHECK(m_FinalFPGATrackCollectionKey.initialize());
 
   25     ATH_CHECK(m_overlapRemovalTool.retrieve());
 
   28     return StatusCode::SUCCESS;
 
   34     std::vector<SG::ReadHandle<FPGATrackSimTrackCollection>> incomingFPGATrackSimTrackCollections = m_FPGATrackCollectionKeys.makeHandles(ctx);
 
   37     std::vector<SG::ReadHandle<FPGATrackSimRoadCollection>> incomingFPGARoadSimTrackCollections = m_FPGARoadCollectionKeys.makeHandles(ctx);
 
   40     std::vector<SG::ReadHandle<FPGATrackSimHitContainer>> incomingFPGAHitsInRoadsCollections = m_FPGAHitsInRoadsCollectionKeys.makeHandles(ctx);
 
   43     std::vector<const FPGATrackSimTrackCollection*> incomingFPGATrackSimTrackCollectionsPtrs;
 
   46         if (!trackCollection.isValid())
 
   48             ATH_MSG_ERROR(
"Invalid FPGATrackCollection key with name " << trackCollection.key());
 
   49             return StatusCode::FAILURE;
 
   51         incomingFPGATrackSimTrackCollectionsPtrs.push_back(trackCollection.cptr());
 
   54     std::unique_ptr<FPGATrackSimTrackCollection> finalFPGATracksPtr = std::make_unique<FPGATrackSimTrackCollection>(); 
 
   55     ATH_CHECK(mergeTracks(incomingFPGATrackSimTrackCollectionsPtrs, finalFPGATracksPtr));
 
   56     finalFPGATracksHandle = std::move(finalFPGATracksPtr);
 
   59         std::vector<const FPGATrackSimRoadCollection*> incomingFPGARoadSimTrackCollectionsPtrs;
 
   60         std::vector<const FPGATrackSimHitContainer*> incomingFPGAHitsInRoadsCollectionsPtrs;
 
   63             if (!roadCollection.isValid())
 
   65                 ATH_MSG_ERROR(
"Invalid FPGARoadCollection key with name " << roadCollection.key());
 
   66                 return StatusCode::FAILURE;
 
   68             incomingFPGARoadSimTrackCollectionsPtrs.push_back(roadCollection.cptr());
 
   72             if (!hitsInRoadsCollection.isValid())
 
   74                 ATH_MSG_ERROR(
"Invalid FPGAHitsInRoadsCollection key with name " << hitsInRoadsCollection.key());
 
   75                 return StatusCode::FAILURE;
 
   77             incomingFPGAHitsInRoadsCollectionsPtrs.push_back(hitsInRoadsCollection.cptr());
 
   79         if (incomingFPGARoadSimTrackCollectionsPtrs.size() != incomingFPGAHitsInRoadsCollectionsPtrs.size()) {
 
   80             ATH_MSG_ERROR(
"Number of road collections and hit containers do not match: " << incomingFPGARoadSimTrackCollectionsPtrs.size() << 
" vs " << incomingFPGAHitsInRoadsCollectionsPtrs.size());
 
   81             return StatusCode::FAILURE;
 
   84         std::unique_ptr<FPGATrackSimRoadCollection> finalFPGARoadsPtr = std::make_unique<FPGATrackSimRoadCollection>(); 
 
   85         std::unique_ptr<FPGATrackSimHitContainer> finalFPGAHitsInRoadsPtr = std::make_unique<FPGATrackSimHitContainer>(); 
 
   86         ATH_CHECK(mergeRoads(incomingFPGARoadSimTrackCollectionsPtrs,
 
   87                              incomingFPGAHitsInRoadsCollectionsPtrs,
 
   89                              finalFPGAHitsInRoadsPtr));
 
   91         finalFPGARoads = std::move(finalFPGARoadsPtr);
 
   92         finalFPGAHitsInRoads = std::move(finalFPGAHitsInRoadsPtr);
 
   97     return StatusCode::SUCCESS;
 
  102     ATH_MSG_INFO(
"Number of tracks: incoming / passed region OR / passed globalOR: " << m_allIncomingTracks << 
" / " << m_nPreORTracks << 
" / " << m_nPostORTracks);
 
  103     return StatusCode::SUCCESS;
 
  107                                                                    std::unique_ptr<FPGATrackSimTrackCollection>& outputTracks)
 const {
 
  108     size_t numberOfAllTracks = 0;
 
  111         numberOfAllTracks += tracksInRegion->size();
 
  114     ATH_MSG_INFO(
"Filtering and concatenating " << numberOfAllTracks << 
" tracks from " << inputTracksPtrs.size() << 
" regions");
 
  115     if constexpr (
enableBenchmark) m_chrono->chronoStart(
"Merging Tracks");
 
  117     regionFilteredTracks.reserve(numberOfAllTracks);
 
  122             if (
track.passedOR())
 
  124                 regionFilteredTracks.push_back(
track);
 
  131     if constexpr (
enableBenchmark) m_chrono->chronoStart(
"Overlap removal (tracks)");
 
  132     if (m_doOverlapRemoval) 
ATH_CHECK(m_overlapRemovalTool->runOverlapRemoval(regionFilteredTracks));
 
  133     if constexpr (
enableBenchmark) m_chrono->chronoStop(
"Overlap removal (tracks)");
 
  135     if constexpr (
enableBenchmark) m_chrono->chronoStart(
"Copying final tracks");
 
  136     outputTracks->reserve(numberOfAllTracks);
 
  139         if(
track.passedOR()) outputTracks->push_back(
track);
 
  141     if constexpr (
enableBenchmark) m_chrono->chronoStop(
"Copying final tracks");
 
  143     m_nPreORTracks.fetch_add(regionFilteredTracks.size(), std::memory_order_relaxed); 
 
  144     m_allIncomingTracks.fetch_add(numberOfAllTracks, std::memory_order_relaxed); 
 
  145     m_nPostORTracks.fetch_add(outputTracks->size(), std::memory_order_relaxed); 
 
  147     return StatusCode::SUCCESS;
 
  152     const std::vector<const FPGATrackSimHitContainer*>& inputHitsInRoads,
 
  153     std::unique_ptr<FPGATrackSimRoadCollection>& outputRoads,
 
  154     std::unique_ptr<FPGATrackSimHitContainer>& outputHitsInRoads)
 const{
 
  155         size_t numberOfAllRoads = 0;
 
  156         size_t numberOfAllHitsInRoads = 0;
 
  158             numberOfAllRoads += roadCollection->size();
 
  161             numberOfAllHitsInRoads += hitsInRoadsContainer->size();
 
  164         ATH_MSG_INFO(
"Filtering and concatenating " << numberOfAllRoads << 
" roads from " << inputRoads.size() << 
" regions");
 
  165         if constexpr (
enableBenchmark) m_chrono->chronoStart(
"Merging Roads and HitsInRoads");
 
  166         outputRoads->reserve(numberOfAllRoads);
 
  167         outputHitsInRoads->reserve(numberOfAllHitsInRoads);
 
  169         for (
size_t i = 0; 
i < inputRoads.size(); ++
i) {
 
  172             outputRoads->insert(outputRoads->end(), roadCollection->begin(), roadCollection->end());
 
  173             outputHitsInRoads->insert(outputHitsInRoads->end(), hitsInRoadsContainer->begin(), hitsInRoadsContainer->end());
 
  175         if constexpr (
enableBenchmark) m_chrono->chronoStop(
"Merging Roads and HitsInRoads");
 
  177         return StatusCode::SUCCESS;