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;