25 #include "GaudiKernel/IEventProcessor.h"
28 #ifdef BENCHMARK_LOGICALHITSALG
49 while (std::getline(
ss,
line,
'\n')) {
93 return StatusCode::SUCCESS;
103 const EventContext& ctx = getContext();
109 ATH_MSG_WARNING(
"Didn't receive " << FPGAHits.
key() <<
" on first event; assuming no input events.");
111 SmartIF<IEventProcessor> appMgr{service(
"ApplicationMgr")};
113 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
114 return StatusCode::FAILURE;
116 return appMgr->stopRun();
124 ATH_CHECK( FPGAHits_2nd.
record (std::make_unique<FPGATrackSimHitCollection>()));
125 ATH_CHECK( FPGARoads_1st.
record (std::make_unique<FPGATrackSimRoadCollection>()));
126 ATH_CHECK( FPGAHitsInRoads_1st.
record (std::make_unique<FPGATrackSimHitContainer>()));
129 ATH_CHECK(FPGATracks_1stHandle.
record (std::make_unique<FPGATrackSimTrackCollection>()));
132 ATH_CHECK( FPGAHitsFiltered_1st.
record (std::make_unique<FPGATrackSimHitCollection>()));
135 if (!
m_evtSel->getSelectedEvent()) {
137 return StatusCode::SUCCESS;
145 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits_1st, phits_2nd;
147 phits_1st.reserve(FPGAHits->size());
148 phits_2nd.reserve(FPGAHits->size());
156 FPGAHits_2nd->push_back(hit);
162 if (!FPGATruthTracks.
isValid()) {
163 ATH_MSG_ERROR(
"Could not find FPGA Truth Track Collection with key " << FPGATruthTracks.
key());
164 return StatusCode::FAILURE;
169 if (!FPGAOfflineTracks.
isValid()) {
170 ATH_MSG_ERROR(
"Could not find FPGA Offline Track Collection with key " << FPGAOfflineTracks.
key());
171 return StatusCode::FAILURE;
175 std::vector<std::shared_ptr<const FPGATrackSimRoad>> prefilter_roads;
176 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads_1st =
177 std::move(prefilter_roads);
181 for (
auto const &road : roads_1st) {
182 unsigned bitmask = road->getHitLayers();
184 if (bitmask & (1 <<
l)) {
194 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter_roads;
198 roads_1st = std::move(postfilter_roads);
202 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter2_roads;
205 roads_1st = std::move(postfilter2_roads);
214 std::vector<FPGATrackSimTrack> tracks_1st;
223 for (
const auto& road : roads_1st) {
224 std::vector<FPGATrackSimTrack> tracksForCurrentRoad;
227 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadVec = {road};
231 if (!tracksForCurrentRoad.empty()) {
232 auto bestTrackIter = std::min_element(
233 tracksForCurrentRoad.begin(), tracksForCurrentRoad.end(),
235 return a.getChi2ndof() < b.getChi2ndof();
238 if (bestTrackIter != tracksForCurrentRoad.end() && bestTrackIter->getChi2ndof() < 1.e15) {
239 tracks_1st.push_back(*bestTrackIter);
248 if (!tracks_1st.empty()) {
249 float bestChi2Overall = std::min_element(
250 tracks_1st.begin(), tracks_1st.end(),
252 return a.getChi2ndof() < b.getChi2ndof();
260 float bestchi2 = 1.e15;
263 if (
chi2 < bestchi2) bestchi2 =
chi2;
274 for (
const std::shared_ptr<const FPGATrackSimRoad>& road : roads_1st) {
275 ntrackDummy += road->getNHitCombos();
277 tracks_1st.resize(ntrackDummy);
281 for (
auto const& road : roads_1st) {
282 std::vector<FPGATrackSimHit> road_hits;
283 ATH_MSG_DEBUG(
"Hough Road X Y: " << road->getX() <<
" " << road->getY());
284 for (
size_t l = 0;
l < road->getNLayers(); ++
l) {
285 for (
const auto& layerH : road->getHits(
l)) {
286 road_hits.push_back(*layerH);
289 FPGAHitsInRoads_1st->push_back(road_hits);
290 FPGARoads_1st->push_back(*road);
300 unsigned ntrackOLRChi2 = 0;
304 if (
track.passedOR()) {
309 float chi2olr =
track.getChi2ndof();
323 std::vector<FPGATrackSimTruthTrack> truthtracks = *FPGATruthTracks;
324 std::vector<FPGATrackSimOfflineTrack> offlineTracks = *FPGAOfflineTracks;
325 if (truthtracks.size() > 0) {
338 unsigned npasschi2(0);
339 unsigned npasschi2OLR(0);
340 if (tracks_1st.size() > 0) {
343 for (
const auto&
track : tracks_1st) {
346 if (
track.passedOR()) {
364 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadsLRT;
365 std::vector<FPGATrackSimTrack> tracksLRT;
368 std::vector<std::shared_ptr<const FPGATrackSimHit>> remainingHits;
371 ATH_MSG_DEBUG(
"Doing hit filtering based on prompt tracks.");
374 for (
const auto &
Hit : remainingHits) FPGAHitsFiltered_1st->push_back(*
Hit);
377 ATH_MSG_DEBUG(
"No hit filtering requested; using all hits for LRT.");
378 remainingHits = phits_1st;
386 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
397 SmartIF<IEventProcessor> appMgr{service(
"ApplicationMgr")};
399 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
400 return StatusCode::FAILURE;
403 phits_2nd.insert(phits_2nd.end(), std::make_move_iterator(phits_1st.begin()), std::make_move_iterator(phits_1st.end()));
412 return StatusCode::SUCCESS;
421 std::vector<FPGATrackSimTrack>
const& tracks_1st,
426 ATH_MSG_DEBUG(
"NFPGATrackSimRoads_1st = " << roads_1st.size() <<
", NFPGATrackSimTracks_1st = " << tracks_1st.size());
446 return StatusCode::SUCCESS;
456 ATH_MSG_INFO(
"========================================================================================");
468 ATH_MSG_INFO(
"========================================================================================");
474 ATH_MSG_INFO(
"========================================================================================");
476 return StatusCode::SUCCESS;
486 for (
const auto& hit :
hits)
489 std::stringstream
ss;
490 for (
auto r : regions)