105{
106 const EventContext& ctx = getContext();
107
108
109
110 SG::ReadHandle<FPGATrackSimHitCollection> FPGAHits(
m_FPGAHitKey, ctx);
111 if (!FPGAHits.isValid()) {
113 ATH_MSG_WARNING(
"Didn't receive FPGAHits_2nd on first event; assuming no input events.");
114 }
115 SmartIF<IEventProcessor> appMgr{service("ApplicationMgr")};
116 if (!appMgr) {
117 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
118 return StatusCode::FAILURE;
119 }
120 return appMgr->stopRun();
121 }
122
124 if (!FPGAInputTracks.isValid()) {
125 SmartIF<IEventProcessor> appMgr{service("ApplicationMgr")};
126 if (!appMgr) {
127 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
128 return StatusCode::FAILURE;
129 }
130 return appMgr->stopRun();
131 }
132
133
134 SG::WriteHandle<FPGATrackSimRoadCollection> FPGARoads_2nd (
m_FPGARoadKey, ctx);
136
137 ATH_CHECK( FPGARoads_2nd.record (std::make_unique<FPGATrackSimRoadCollection>()));
138 ATH_CHECK( FPGAHitsInRoads_2nd.record (std::make_unique<FPGATrackSimHitContainer>()));
139
140 SG::WriteHandle<FPGATrackSimTrackCollection> FPGATracks_2ndHandle (
m_FPGATrackKey, ctx);
141 ATH_CHECK(FPGATracks_2ndHandle.record (std::make_unique<FPGATrackSimTrackCollection>()));
142 {
143 std::optional<Athena::Chrono> chrono;
145
146 if (!
m_evtSel->getSelectedEvent()) {
148 return StatusCode::SUCCESS;
149 }
150
151
153 }
154
155
156 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits_2nd;
157 phits_2nd.reserve(FPGAHits->size());
158 for (const auto& hit : *FPGAHits) {
159 phits_2nd.push_back(std::make_shared<const FPGATrackSimHit>(*hit));
160 }
161
162 ATH_MSG_DEBUG(
"Retrieved " << phits_2nd.size() <<
" hits and " << FPGAInputTracks->size() <<
" tracks from storegate");
163
164
165 SG::ReadHandle<FPGATrackSimTruthTrackCollection> FPGATruthTracks(
m_FPGATruthTrackKey, ctx);
166 if (!FPGATruthTracks.isValid()) {
167 ATH_MSG_ERROR(
"Could not find FPGA Truth Track Collection with key " << FPGATruthTracks.key());
168 return StatusCode::FAILURE;
169 }
170
171
173 if (!FPGAOfflineTracks.isValid()) {
174 ATH_MSG_ERROR(
"Could not find FPGA Offline Track Collection with key " << FPGAOfflineTracks.key());
175 return StatusCode::FAILURE;
176 }
177
178
180 if (!FPGAEventInfo.isValid()) {
181 ATH_MSG_ERROR(
"Could not find FPGA Event Info with key " << FPGAEventInfo.key());
182 return StatusCode::FAILURE;
183 }
184 FPGATrackSimEventInfo eventInfo = *FPGAEventInfo.cptr();
186
187
188 std::vector<FPGATrackSimRoad> roads;
189
190 {
191 std::optional<Athena::Chrono> chrono;
193
195
196 for (auto const& road : roads) {
197 auto road_hits = std::make_unique<FPGATrackSimHitCollection>();
198 ATH_MSG_DEBUG(
"Hough Road X Y: " << road.getX() <<
" " << road.getY());
199 for (
size_t l = 0;
l < road.getNLayers(); ++
l) {
200 for (const auto& layerH : road.getHits(l)) {
201 road_hits->push_back(new FPGATrackSimHit(*layerH));
202 }
203 }
204 FPGAHitsInRoads_2nd->push_back(std::move(*road_hits));
205 FPGARoads_2nd->push_back(road);
206 }
207 }
208
209 auto mon_nroads = Monitored::Scalar<unsigned>("nroads_2nd", roads.size());
210 unsigned bitmask_best(0);
211 unsigned nhit_best(0);
212 for (auto const &road : roads) {
213 unsigned bitmask = road.getHitLayers();
214 if (road.getNHitLayers() > nhit_best) {
215 nhit_best = road.getNHitLayers();
216 bitmask_best = bitmask;
217 }
219 if (bitmask & (1 << l)) {
220 auto mon_layerIDs = Monitored::Scalar<unsigned>("layerIDs_2nd",l);
221 Monitored::Group(
m_monTool,mon_layerIDs);
222 }
223 }
224 }
225
227 if (bitmask_best & (1 << l)) {
228 auto mon_layerIDs_best = Monitored::Scalar<unsigned>("layerIDs_2nd_best",l);
229 Monitored::Group(
m_monTool,mon_layerIDs_best);
230 }
231 }
233
234
235 auto mon_nroads_postfilter = Monitored::Scalar<unsigned>("nroads_2nd_postfilter", roads.size());
236 Monitored::Group(
m_monTool, mon_nroads_postfilter);
237
238
239
240 std::vector<FPGATrackSimTrack> tracks;
241 {
242 std::optional<Athena::Chrono> chrono;
248 } else {
250
252
253 std::vector<FPGATrackSimTrack> filteredTracks;
254
255 for (const auto& road : roads) {
256
257 std::vector<FPGATrackSimTrack> tracksForCurrentRoad;
258 std::vector<FPGATrackSimRoad> roadVec = {road};
260
261
262 if (!tracksForCurrentRoad.empty()) {
263 auto bestTrackIter = std::min_element(
264 tracksForCurrentRoad.begin(), tracksForCurrentRoad.end(),
265 [](
const FPGATrackSimTrack&
a,
const FPGATrackSimTrack& b) {
266 return a.getChi2ndof() < b.getChi2ndof();
267 });
268
269 if (bestTrackIter != tracksForCurrentRoad.end() && bestTrackIter->getChi2ndof() < 1.e15) {
270 filteredTracks.push_back(*bestTrackIter);
271
272
273 auto mon_chi2 = Monitored::Scalar<float>("chi2_2nd_all", bestTrackIter->getChi2ndof());
275 }
276 }
277 }
278
279
280 tracks = std::move(filteredTracks);
281
282
283 if (!tracks.empty()) {
284 float bestChi2Overall = std::min_element(
285 tracks.begin(), tracks.end(),
286 [](
const FPGATrackSimTrack&
a,
const FPGATrackSimTrack& b) {
287 return a.getChi2ndof() < b.getChi2ndof();
288 })->getChi2ndof();
289
290 auto mon_best_chi2 = Monitored::Scalar<float>("best_chi2_2nd", bestChi2Overall);
291 Monitored::Group(
m_monTool, mon_best_chi2);
292 }
293 } else {
295 float bestchi2 = 1.e15;
296 for (const FPGATrackSimTrack& track : tracks) {
298 if (
chi2 < bestchi2) bestchi2 =
chi2;
299 auto mon_chi2 = Monitored::Scalar<float>(
"chi2_2nd_all",
chi2);
301 }
302 auto mon_best_chi2 = Monitored::Scalar<float>("best_chi2_2nd", bestchi2);
303 Monitored::Group(
m_monTool, mon_best_chi2);
304 }
305 }
306 } else {
307
309 }
310 }
311 auto mon_ntracks = Monitored::Scalar<unsigned>("ntrack_2nd", tracks.size());
313
314
315 {
316 std::optional<Athena::Chrono> chrono;
319 }
320 {
321 std::optional<Athena::Chrono> chrono;
323
326 }
327 }
328 const auto& truthtracks = *FPGATruthTracks;
329 const auto& offlineTracks = *FPGAOfflineTracks;
330
331
332 {
333 std::optional<Athena::Chrono> chrono;
336 for (auto track : tracks) {
338 track.setQOverPt(truthtracks.front().getQOverPt());
340 track.setD0(truthtracks.front().getD0());
342 track.setPhi(truthtracks.front().getPhi());
344 track.setZ0(truthtracks.front().getZ0());
346 track.setEta(truthtracks.front().getEta());
347 }
348 }
349 }
350
351 unsigned ntrackOLRChi2 = 0;
352 {
353 std::optional<Athena::Chrono> chrono;
355 for (const FPGATrackSimTrack& track : tracks) {
358 if (
track.passedOR()) {
359 ntrackOLRChi2++;
361
362
363 float chi2olr =
track.getChi2ndof();
364 auto mon_chi2_or = Monitored::Scalar<float>("chi2_2nd_afterOLR", chi2olr);
365 Monitored::Group(
m_monTool, mon_chi2_or);
366 }
367 }
368 }
369 auto mon_ntracks_olr = Monitored::Scalar<unsigned>("ntrack_2nd_afterOLR", ntrackOLRChi2);
370 Monitored::Group(
m_monTool,mon_ntracks_olr);
371 }
372
375
376
377 {
378 std::optional<Athena::Chrono> chrono;
380 if (truthtracks.size() > 0) {
382 auto passroad = Monitored::Scalar<bool>("eff_road_2nd",(roads.size() > 0));
383 auto passtrack = Monitored::Scalar<bool>("eff_track_2nd",(tracks.size() > 0));
384 auto truthpT_zoom = Monitored::Scalar<float>("pT_zoom",truthtracks.front().getPt()*0.001);
385 auto truthpT = Monitored::Scalar<float>("pT",truthtracks.front().getPt()*0.001);
386 auto trutheta = Monitored::Scalar<float>("eta",truthtracks.front().getEta());
387 auto truthphi= Monitored::Scalar<float>("phi",truthtracks.front().getPhi());
388 auto truthd0= Monitored::Scalar<float>("d0",truthtracks.front().getD0());
389 auto truthz0= Monitored::Scalar<float>("z0",truthtracks.front().getZ0());
392
393 unsigned npasschi2(0);
394 unsigned npasschi2OLR(0);
395
396 if (tracks.size() > 0) {
399 for (const auto& track : tracks) {
401 npasschi2++;
402 if (
track.passedOR()) {
403 npasschi2OLR++;
404 }
405 }
406 }
407 }
412
413 auto passtrackchi2 = Monitored::Scalar<bool>("eff_track_chi2_2nd",(npasschi2 > 0));
414 Monitored::Group(
m_monTool,passroad,passtrack,truthpT_zoom,truthpT,trutheta,truthphi,truthd0,truthz0,passtrackchi2);
415 }
416 }
417
418 {
419 std::optional<Athena::Chrono> chrono;
421 for (const FPGATrackSimTrack& track : tracks) FPGATracks_2ndHandle->push_back(track);
422 }
423
424
425 {
426 std::optional<Athena::Chrono> chrono;
429 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
431 }
432
436 }
437 }
438
439
442
443 return StatusCode::SUCCESS;
444}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
void roadsToTrack(std::vector< FPGATrackSimRoad > &roads, std::vector< FPGATrackSimTrack > &track_cands, const FPGATrackSimPlaneMap *pmap)
ToolHandle< IFPGATrackSimTrackExtensionTool > m_trackExtensionTool
SG::WriteHandleKey< FPGATrackSimRoadCollection > m_FPGARoadKey
ServiceHandle< IChronoStatSvc > m_chrono
unsigned long m_maxNTracksTot
Gaudi::Property< float > m_trackScoreCut
SG::ReadHandleKey< FPGATrackSimOfflineTrackCollection > m_FPGAOfflineTrackKey
unsigned long m_maxNTracksChi2OLRTot
ToolHandle< GenericMonitoringTool > m_monTool
SG::WriteHandleKey< FPGATrackSimTrackCollection > m_FPGATrackKey
SG::ReadHandleKey< FPGATrackSimTrackCollection > m_FPGAInputTrackKey
SG::ReadHandleKey< FPGATrackSimTruthTrackCollection > m_FPGATruthTrackKey
Gaudi::Property< bool > m_writeOutNonSPStripHits
unsigned long m_maxNRoadsFound
FPGATrackSimLogicalEventOutputHeader * m_logicEventOutputHeader
SG::ReadHandleKey< FPGATrackSimEventInfo > m_FPGAEventInfoKey
Gaudi::Property< bool > m_doHoughRootOutput2nd
SG::WriteHandleKey< FPGATrackSimHitContainer > m_FPGAHitInRoadsKey
unsigned long m_maxNTracksChi2Tot
ToolHandle< FPGATrackSimHoughRootOutputTool > m_houghRootOutputTool
Gaudi::Property< bool > m_doNNTrack_2nd
Gaudi::Property< bool > m_doTracking
ServiceHandle< IFPGATrackSimEventSelectionSvc > m_evtSel
ToolHandle< FPGATrackSimNNTrackTool > m_NNTrackTool
Gaudi::Property< int > m_SetTruthParametersForTracks
FPGATrackSimLogicalEventInputHeader * m_slicedHitHeader
ToolHandle< FPGATrackSimTrackFitterTool > m_trackFitterTool
ServiceHandle< IFPGATrackSimMappingSvc > m_FPGATrackSimMapping
StatusCode writeOutputData(const std::vector< FPGATrackSimRoad > &roads_2nd, std::vector< FPGATrackSimTrack > const &tracks_2nd, FPGATrackSimDataFlowInfo const *dataFlowInfo)
Gaudi::Property< bool > m_passLowestChi2TrackOnly
long m_nTracksChi2OLRFound
ToolHandle< FPGATrackSimOverlapRemovalTool > m_overlapRemovalTool
Gaudi::Property< bool > m_writeOutputData
SG::ReadHandleKey< FPGATrackSimHitCollection > m_FPGAHitKey
double chi2(TH1 *h0, TH1 *h1)
l
Printing final latex table to .tex output file.
constexpr bool enableBenchmark