(first track monitor, after getting tracks) create a vector of references from a vector of instances
(second track monitor, after set track parameters to truth) create a vector of references from a vector of instances
147{
148 const EventContext& ctx = getContext();
149
150
151 SG::ReadHandle<FPGATrackSimHitCollection> FPGAHits(
m_FPGAHitKey, ctx);
152 if (!FPGAHits.isValid()) {
154 ATH_MSG_WARNING(
"Didn't receive " << FPGAHits.key() <<
" on first event; assuming no input events.");
155 }
156 SmartIF<IEventProcessor> appMgr{service("ApplicationMgr")};
157 if (!appMgr) {
158 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
159 return StatusCode::FAILURE;
160 }
161 return appMgr->stopRun();
162 }
163
164
165 SG::WriteHandle<FPGATrackSimHitCollection> FPGAHits_1st (
m_FPGAHitKey_1st,ctx);
166 SG::WriteHandle<FPGATrackSimHitCollection> FPGAHits_2nd (
m_FPGAHitKey_2nd,ctx);
167 SG::WriteHandle<FPGATrackSimRoadCollection> FPGARoads_1st (
m_FPGARoadKey, ctx);
169
170 ATH_CHECK( FPGAHits_1st.record (std::make_unique<FPGATrackSimHitCollection>()));
171 ATH_CHECK( FPGAHits_2nd.record (std::make_unique<FPGATrackSimHitCollection>()));
172 ATH_CHECK( FPGARoads_1st.record (std::make_unique<FPGATrackSimRoadCollection>()));
173 ATH_CHECK( FPGAHitsInRoads_1st.record (std::make_unique<FPGATrackSimHitContainer>()));
174
175 SG::WriteHandle<FPGATrackSimTrackCollection> FPGATracks_1stHandle (
m_FPGATrackKey, ctx);
176 ATH_CHECK(FPGATracks_1stHandle.record (std::make_unique<FPGATrackSimTrackCollection>()));
177
179 ATH_CHECK( FPGAHitsFiltered_1st.record (std::make_unique<FPGATrackSimHitCollection>()));
180
182 ATH_CHECK( FPGASpacePoints.record (std::make_unique<FPGATrackSimClusterCollection>()));
183
184
185 if (!
m_evtSel->getSelectedEvent()) {
186
187
189 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads_1st;
190 std::vector<FPGATrackSimTrack> tracks_1st;
191 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
193 }
194
195 return StatusCode::SUCCESS;
196 }
200 }
201
202
204
205
207 if (!FPGAEventInfo.isValid()) {
208 ATH_MSG_ERROR(
"Could not find FPGA Event Info with key " << FPGAEventInfo.key());
209 return StatusCode::FAILURE;
210 }
211 FPGATrackSimEventInfo eventInfo = *FPGAEventInfo.cptr();
216
218
219 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits_output, phits_all, phits_1st, phits_2nd;
220 phits_1st.reserve(FPGAHits->size());
221 phits_2nd.reserve(FPGAHits->size());
223 for (const FPGATrackSimHit& hit : *(FPGAHits.cptr())) {
224 phits_all.emplace_back(&hit, [](const FPGATrackSimHit*){});
225 }
226
227
229
230 for (auto& hit : phits_1st) {
231 FPGAHits_1st->push_back(*hit);
232 }
233
235
236
237
243 for (
const FPGATrackSimCluster& cluster :
m_spacepoints) FPGASpacePoints->push_back(cluster);
244 }
245
246
248 (
m_secondStageStrips ? phits_2nd : phits_1st).emplace_back(&hit, [](
const FPGATrackSimHit*){});
249 }
250 for (auto& hit : phits_2nd) {
251 FPGAHits_2nd->push_back(*hit);
252 }
253
254
255 for (const FPGATrackSimHit& hit : *(FPGAHits_2nd.cptr())) {
256 phits_output.emplace_back(&hit, [](const FPGATrackSimHit*){});
257 }
258
260 ATH_MSG_DEBUG(
"1st stage hits: " << phits_1st.size() <<
" 2nd stage hits: " << phits_2nd.size() );
261 if (phits_1st.empty()) return StatusCode::SUCCESS;
262
263 SG::ReadHandle<FPGATrackSimTruthTrackCollection> FPGATruthTracks(
m_FPGATruthTrackKey, ctx);
264 if (!FPGATruthTracks.isValid()) {
265 ATH_MSG_ERROR(
"Could not find FPGA Truth Track Collection with key " << FPGATruthTracks.key());
266 return StatusCode::FAILURE;
267 }
268
269
271 if (!FPGAOfflineTracks.isValid()) {
272 ATH_MSG_ERROR(
"Could not find FPGA Offline Track Collection with key " << FPGAOfflineTracks.key());
273 return StatusCode::FAILURE;
274 }
275
276
278
280
282 const std::vector<FPGATrackSimTruthTrack>& truthtracks = *FPGATruthTracks;
287 auto monitorRoads = [&](auto& monitor, const auto& roads) {
288 if (!monitor.empty()) {
289 monitor->fillRoad(roads, truthtracks, nLogicalLayers);
290 }
291 };
292
293
295
296 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads_1st;
300
301
302
303
305 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter_roads;
308 roads_1st = std::move(postfilter_roads);
309 }
313
314
315
321
322
323
325 std::vector<std::shared_ptr<const FPGATrackSimRoad>> postfilter2_roads;
328 roads_1st = std::move(postfilter2_roads);
329 }
333
334
336
338
340 auto monitorTracks = [&](auto& monitor, const auto& tracks) {
341 if (monitor.empty()) return;
342
343 std::vector<const FPGATrackSimTrack*> track_ptrs;
344 track_ptrs.reserve(tracks.size());
345
346 if constexpr (std::is_pointer_v<typename std::decay_t<decltype(tracks)>::value_type>) {
347
348 track_ptrs.insert(track_ptrs.end(), tracks.begin(), tracks.end());
349 } else {
350
351 std::transform(tracks.begin(), tracks.end(), std::back_inserter(track_ptrs), [](const auto& t) { return &t; });
352 }
353
354 monitor->fillTrack(track_ptrs, truthtracks, 1.e15);
355 };
356
357
359 std::vector<FPGATrackSimTrack> tracks_1st;
367 }
368 } else {
371
372 for (const auto& road : roads_1st) {
373 std::vector<FPGATrackSimTrack> tracksForCurrentRoad;
374
375
376 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadVec = {road};
378
379
380 if (!tracksForCurrentRoad.empty()) {
381 auto bestTrackIter = std::min_element(
382 tracksForCurrentRoad.begin(), tracksForCurrentRoad.end(),
383 [](
const FPGATrackSimTrack&
a,
const FPGATrackSimTrack& b) {
384 return a.getChi2ndof() < b.getChi2ndof();
385 });
386
387 if (bestTrackIter != tracksForCurrentRoad.end() && bestTrackIter->getChi2ndof() < 1.e15) {
388 tracks_1st.push_back(*bestTrackIter);
389 }
390 }
391 }
392 } else {
394 }
395 }
396 } else {
397 ATH_MSG_DEBUG(
"No tracking. Just running dummy road2track algorith");
399 for (const std::shared_ptr<const FPGATrackSimRoad>& road : roads_1st) {
400 std::vector<std::shared_ptr<const FPGATrackSimHit>> track_hits;
401 for (
unsigned layer = 0;
layer < road->getNLayers(); ++
layer) {
402 track_hits.insert(track_hits.end(), road->getHits(layer).begin(), road->getHits(layer).end());
403 }
404
405 FPGATrackSimTrack track_cand;
407 for (size_t ihit = 0; ihit < track_hits.size(); ++ihit) {
409 }
410 tracks_1st.push_back(track_cand);
411 }
412 }
414 }
415
416
417
420 for (auto &track : tracks_1st)
421 track.calculateTruth();
422
427
428
429
431
432 for (FPGATrackSimTrack& track : tracks_1st) {
436 track.setQOverPt(truthtracks.front().getQOverPt());
438 track.setD0(truthtracks.front().getD0());
440 track.setPhi(truthtracks.front().getPhi());
442 track.setZ0(truthtracks.front().getZ0());
444 track.setEta(truthtracks.front().getEta());
445 }
446 }
451
452
453 for (auto const& road : roads_1st) {
454 std::vector<FPGATrackSimHit> road_hits;
455 ATH_MSG_DEBUG(
"Hough Road X Y: " << road->getX() <<
" " << road->getY());
456 for (
size_t l = 0;
l < road->getNLayers(); ++
l) {
457 for (const auto& layerH : road->getHits(l)) {
458 road_hits.push_back(*layerH);
459 }
460 }
461 FPGAHitsInRoads_1st->push_back(std::move(road_hits));
462 FPGARoads_1st->push_back(*road);
463 }
464
465
468
469 std::vector<const FPGATrackSimTrack*> tracks_1st_after_chi2;
470 std::vector<const FPGATrackSimTrack*> tracks_1st_after_overlap;
471 for (const FPGATrackSimTrack& track : tracks_1st) {
474 tracks_1st_after_chi2.push_back(&track);
475 if (
track.passedOR()) {
476 tracks_1st_after_overlap.push_back(&track);
478 }
479 }
480 }
486
489
490
491 if (truthtracks.size() > 0) {
495
496 unsigned npasschi2(0);
497 unsigned npasschi2OLR(0);
498 if (tracks_1st.size() > 0) {
501 for (const auto& track : tracks_1st) {
503 npasschi2++;
504 if (
track.passedOR()) {
505 npasschi2OLR++;
506 }
507 }
508 }
509 }
514 }
515
516 for (const FPGATrackSimTrack& track : tracks_1st) FPGATracks_1stHandle->push_back(track);
517
518
519
520 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadsLRT;
521 std::vector<FPGATrackSimTrack> tracksLRT;
523
524 std::vector<std::shared_ptr<const FPGATrackSimHit>> remainingHits;
525
527 ATH_MSG_DEBUG(
"Doing hit filtering based on prompt tracks.");
529
530 for (const auto &Hit : remainingHits) FPGAHitsFiltered_1st->push_back(*Hit);
531
532 } else {
533 ATH_MSG_DEBUG(
"No hit filtering requested; using all hits for LRT.");
534 remainingHits = std::move(phits_1st);
535 }
536
537
540 }
541
542 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
543
544
547 }
548
549
552
553 SmartIF<IEventProcessor> appMgr{service("ApplicationMgr")};
554 if (!appMgr) {
555 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
556 return StatusCode::FAILURE;
557 }
558
559
561 }
562
563
566
567 return StatusCode::SUCCESS;
568}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
void roadsToTrack(std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads, std::vector< FPGATrackSimTrack > &track_cands, const FPGATrackSimPlaneMap *pmap)
ToolHandle< FPGATrackSimTrackMonitor > m_1st_stage_road_monitor
Gaudi::Property< int > m_region
Gaudi::Property< bool > m_filterRoads2
Gaudi::Property< bool > m_doTracking
FPGATrackSimLogicalEventInputHeader * m_slicedHitHeader
Gaudi::Property< bool > m_doLRT
ToolHandle< FPGATrackSimSpacePointsToolI > m_spacepointsTool
ToolHandle< FPGATrackSimOverlapRemovalTool > m_overlapRemovalTool_1st
Gaudi::Property< int > m_SetTruthParametersForTracks
SG::WriteHandleKey< FPGATrackSimHitCollection > m_FPGAHitKey_2nd
ToolHandle< FPGATrackSimTrackMonitor > m_1st_stage_road_post_OLR_monitor
ToolHandle< FPGATrackSimSlicingEngineTool > m_slicingEngineTool
Gaudi::Property< bool > m_writeOutputData
ServiceHandle< IChronoStatSvc > m_chrono
Gaudi::Property< bool > m_doGNNPixelSeeding
FPGATrackSimLogicalEventInputHeader * m_slicedStripHeaderPreSP
Gaudi::Property< bool > m_doGNNTrack
ToolHandle< FPGATrackSimHoughRootOutputTool > m_houghRootOutputTool
ToolHandle< FPGATrackSimTrackMonitor > m_1st_stage_road_post_filter_2_monitor
unsigned long m_maxNTracksTot
FPGATrackSimLogicalEventInputHeader * m_slicedFirstPixelHeader
Gaudi::Property< bool > m_doOverlapRemoval
Gaudi::Property< bool > m_doNNTrack
Gaudi::Property< bool > m_writeOutNonSPStripHits
Gaudi::Property< bool > m_doSpacepoints
ToolHandle< IFPGATrackSimRoadFilterTool > m_roadFilterTool
Gaudi::Property< bool > m_outputRoadUnionTool
StatusCode writeOutputData(const std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads_1st, std::vector< FPGATrackSimTrack > const &tracks_1st, FPGATrackSimDataFlowInfo const *dataFlowInfo)
FPGATrackSimLogicalEventInputHeader * m_slicedSecondPixelHeader
SG::WriteHandleKey< FPGATrackSimRoadCollection > m_FPGARoadKey
ToolHandle< FPGATrackSimNNTrackTool > m_NNTrackTool
ToolHandle< FPGATrackSimLLPRoadFilterTool > m_LRTRoadFilterTool
Gaudi::Property< bool > m_filterRoads
ToolHandle< IFPGATrackSimRoadFinderTool > m_LRTRoadFinderTool
ToolHandle< FPGATrackSimTrackMonitor > m_1st_stage_track_post_OLR_monitor
ToolHandle< FPGATrackSimOutputHeaderTool > m_writeOutputTool
ToolHandle< FPGATrackSimTrackMonitor > m_1st_stage_track_post_setTruth_monitor
SG::ReadHandleKey< FPGATrackSimHitCollection > m_FPGAHitKey
Gaudi::Property< bool > m_secondStageStrips
ToolHandle< FPGATrackSimTrackFitterTool > m_trackFitterTool_1st
Gaudi::Property< bool > m_doLRTHitFiltering
ToolHandle< IFPGATrackSimRoadFilterTool > m_roadFilterTool2
Gaudi::Property< bool > m_passLowestChi2TrackOnly
Gaudi::Property< bool > m_doHoughRootOutput1st
ToolHandle< FPGATrackSimTrackMonitor > m_1st_stage_track_post_chi2_monitor
ToolHandle< FPGATrackSimTrackMonitor > m_1st_stage_track_monitor
FPGATrackSimLogicalEventOutputHeader * m_logicEventOutputHeader
SG::WriteHandleKey< FPGATrackSimClusterCollection > m_FPGASpacePointsKey
ToolHandle< FPGATrackSimTrackMonitor > m_1st_stage_road_post_filter_1_monitor
SG::WriteHandleKey< FPGATrackSimHitContainer > m_FPGAHitInRoadsKey
Gaudi::Property< float > m_trackScoreCut
unsigned long m_maxNTracksChi2OLRTot
unsigned long m_maxNTracksChi2Tot
SG::ReadHandleKey< FPGATrackSimOfflineTrackCollection > m_FPGAOfflineTrackKey
long m_nTracksChi2OLRFound
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
ToolHandle< FPGATrackSimRoadUnionTool > m_roadFinderTool
SG::WriteHandleKey< FPGATrackSimHitCollection > m_FPGAHitKey_1st
SG::WriteHandleKey< FPGATrackSimTrackCollection > m_FPGATrackKey
Gaudi::Property< int > m_writeRegion
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_evtSel
std::vector< FPGATrackSimCluster > m_spacepoints
Gaudi::Property< bool > m_doMultiTruth
SG::WriteHandleKey< FPGATrackSimHitCollection > m_FPGAHitFilteredKey
SG::ReadHandleKey< FPGATrackSimTruthTrackCollection > m_FPGATruthTrackKey
unsigned long m_maxNRoadsFound
SG::ReadHandleKey< FPGATrackSimEventInfo > m_FPGAEventInfoKey
FPGATrackSimLogicalEventInputHeader * m_slicedStripHeader
void setNLayers(int)
set the number of layers in the track.
void setFPGATrackSimHit(unsigned i, const FPGATrackSimHit &hit)
l
Printing final latex table to .tex output file.
constexpr bool enableBenchmark