25 #include "GaudiKernel/IEventProcessor.h"
28 #ifdef BENCHMARK_FPGATRACKSIM
49 while (std::getline(
ss,
line,
'\n')) {
107 return StatusCode::SUCCESS;
117 const EventContext& ctx = getContext();
123 ATH_MSG_WARNING(
"Didn't receive " << FPGAHits.
key() <<
" on first event; assuming no input events.");
125 SmartIF<IEventProcessor> appMgr{service(
"ApplicationMgr")};
127 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
128 return StatusCode::FAILURE;
130 return appMgr->stopRun();
139 ATH_CHECK( FPGAHits_1st.
record (std::make_unique<FPGATrackSimHitCollection>()));
140 ATH_CHECK( FPGAHits_2nd.
record (std::make_unique<FPGATrackSimHitCollection>()));
141 ATH_CHECK( FPGARoads_1st.
record (std::make_unique<FPGATrackSimRoadCollection>()));
142 ATH_CHECK( FPGAHitsInRoads_1st.
record (std::make_unique<FPGATrackSimHitContainer>()));
145 ATH_CHECK(FPGATracks_1stHandle.
record (std::make_unique<FPGATrackSimTrackCollection>()));
148 ATH_CHECK( FPGAHitsFiltered_1st.
record (std::make_unique<FPGATrackSimHitCollection>()));
151 ATH_CHECK( FPGASpacePoints.
record (std::make_unique<FPGATrackSimClusterCollection>()));
154 if (!
m_evtSel->getSelectedEvent()) {
155 return StatusCode::SUCCESS;
164 if (!FPGAEventInfo.
isValid()) {
165 ATH_MSG_ERROR(
"Could not find FPGA Event Info with key " << FPGAEventInfo.
key());
166 return StatusCode::FAILURE;
176 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits_output, phits_all, phits_1st, phits_2nd;
177 phits_1st.reserve(FPGAHits->size());
178 phits_2nd.reserve(FPGAHits->size());
187 for (
auto& hit : phits_1st) {
188 FPGAHits_1st->push_back(*hit);
207 for (
auto& hit : phits_2nd) {
208 FPGAHits_2nd->push_back(*hit);
217 ATH_MSG_DEBUG(
"1st stage hits: " << phits_1st.size() <<
" 2nd stage hits: " << phits_2nd.size() );
218 if (phits_1st.empty())
return StatusCode::SUCCESS;
221 if (!FPGATruthTracks.
isValid()) {
222 ATH_MSG_ERROR(
"Could not find FPGA Truth Track Collection with key " << FPGATruthTracks.
key());
223 return StatusCode::FAILURE;
228 if (!FPGAOfflineTracks.
isValid()) {
229 ATH_MSG_ERROR(
"Could not find FPGA Offline Track Collection with key " << FPGAOfflineTracks.
key());
230 return StatusCode::FAILURE;
235 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads_1st;
238 ATH_MSG_DEBUG(
"Looping over " << roads_1st.size() <<
" roads");
240 for (
auto const &road : roads_1st) {
241 unsigned bitmask = road->getHitLayers();
243 if (bitmask & (1 <<
l)) {
254 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter_roads;
258 roads_1st = std::move(postfilter_roads);
262 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter2_roads;
265 roads_1st = std::move(postfilter2_roads);
274 std::vector<FPGATrackSimTrack> tracks_1st;
287 for (
const auto& road : roads_1st) {
288 std::vector<FPGATrackSimTrack> tracksForCurrentRoad;
291 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadVec = {road};
295 if (!tracksForCurrentRoad.empty()) {
296 auto bestTrackIter = std::min_element(
297 tracksForCurrentRoad.begin(), tracksForCurrentRoad.end(),
299 return a.getChi2ndof() < b.getChi2ndof();
302 if (bestTrackIter != tracksForCurrentRoad.end() && bestTrackIter->getChi2ndof() < 1.e15) {
303 tracks_1st.push_back(*bestTrackIter);
312 if (!tracks_1st.empty()) {
313 float bestChi2Overall = std::min_element(
314 tracks_1st.begin(), tracks_1st.end(),
316 return a.getChi2ndof() < b.getChi2ndof();
324 float bestchi2 = 1.e15;
327 if (
chi2 < bestchi2) bestchi2 =
chi2;
336 ATH_MSG_DEBUG(
"No tracking. Just running dummy road2track algorith");
338 for (
const std::shared_ptr<const FPGATrackSimRoad>& road : roads_1st) {
339 std::vector<std::shared_ptr<const FPGATrackSimHit>> track_hits;
341 track_hits.insert(track_hits.end(), road->getHits(
layer).begin(), road->getHits(
layer).end());
346 for (
size_t ihit = 0; ihit < track_hits.size(); ++ihit) {
349 tracks_1st.push_back(track_cand);
355 std::vector<FPGATrackSimTruthTrack> truthtracks = *FPGATruthTracks;
356 std::vector<FPGATrackSimOfflineTrack> offlineTracks = *FPGAOfflineTracks;
362 track.setQOverPt(truthtracks.front().getQOverPt());
364 track.setD0(truthtracks.front().getD0());
366 track.setPhi(truthtracks.front().getPhi());
368 track.setZ0(truthtracks.front().getZ0());
370 track.setEta(truthtracks.front().getEta());
374 for (
auto const& road : roads_1st) {
375 std::vector<FPGATrackSimHit> road_hits;
376 ATH_MSG_DEBUG(
"Hough Road X Y: " << road->getX() <<
" " << road->getY());
377 for (
size_t l = 0;
l < road->getNLayers(); ++
l) {
378 for (
const auto& layerH : road->getHits(
l)) {
379 road_hits.push_back(*layerH);
382 FPGAHitsInRoads_1st->push_back(road_hits);
383 FPGARoads_1st->push_back(*road);
394 unsigned ntrackOLRChi2 = 0;
398 if (
track.passedOR()) {
403 float chi2olr =
track.getChi2ndof();
417 if (truthtracks.size() > 0) {
430 unsigned npasschi2(0);
431 unsigned npasschi2OLR(0);
432 if (tracks_1st.size() > 0) {
435 for (
const auto&
track : tracks_1st) {
438 if (
track.passedOR()) {
456 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadsLRT;
457 std::vector<FPGATrackSimTrack> tracksLRT;
460 std::vector<std::shared_ptr<const FPGATrackSimHit>> remainingHits;
463 ATH_MSG_DEBUG(
"Doing hit filtering based on prompt tracks.");
466 for (
const auto &
Hit : remainingHits) FPGAHitsFiltered_1st->push_back(*
Hit);
469 ATH_MSG_DEBUG(
"No hit filtering requested; using all hits for LRT.");
470 remainingHits = phits_1st;
478 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
489 SmartIF<IEventProcessor> appMgr{service(
"ApplicationMgr")};
491 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
492 return StatusCode::FAILURE;
503 return StatusCode::SUCCESS;
512 std::vector<FPGATrackSimTrack>
const& tracks_1st,
517 ATH_MSG_DEBUG(
"NFPGATrackSimRoads_1st = " << roads_1st.size() <<
", NFPGATrackSimTracks_1st = " << tracks_1st.size());
535 return StatusCode::SUCCESS;
545 ATH_MSG_INFO(
"========================================================================================");
557 ATH_MSG_INFO(
"========================================================================================");
563 ATH_MSG_INFO(
"========================================================================================");
565 return StatusCode::SUCCESS;
575 for (
const auto& hit :
hits)
578 std::stringstream
ss;
579 for (
auto r : regions)