104{
105 const EventContext& ctx = getContext();
106
107
108
109 SG::ReadHandle<FPGATrackSimHitCollection> FPGAHits(
m_FPGAHitKey, ctx);
110 if (!FPGAHits.isValid()) {
112 ATH_MSG_WARNING(
"Didn't receive FPGAHits_2nd on first event; assuming no input events.");
113 }
114 SmartIF<IEventProcessor> appMgr{service("ApplicationMgr")};
115 if (!appMgr) {
116 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
117 return StatusCode::FAILURE;
118 }
119 return appMgr->stopRun();
120 }
121
123 if (!FPGAInputTracks.isValid()) {
124 SmartIF<IEventProcessor> appMgr{service("ApplicationMgr")};
125 if (!appMgr) {
126 ATH_MSG_ERROR(
"Failed to retrieve ApplicationMgr as IEventProcessor");
127 return StatusCode::FAILURE;
128 }
129 return appMgr->stopRun();
130 }
131
132
133 SG::WriteHandle<FPGATrackSimRoadCollection> FPGARoads_2nd (
m_FPGARoadKey, ctx);
135
136 ATH_CHECK( FPGARoads_2nd.record (std::make_unique<FPGATrackSimRoadCollection>()));
137 ATH_CHECK( FPGAHitsInRoads_2nd.record (std::make_unique<FPGATrackSimHitContainer>()));
138
139 SG::WriteHandle<FPGATrackSimTrackCollection> FPGATracks_2ndHandle (
m_FPGATrackKey, ctx);
140 ATH_CHECK(FPGATracks_2ndHandle.record (std::make_unique<FPGATrackSimTrackCollection>()));
142
143 if (!
m_evtSel->getSelectedEvent()) {
145 return StatusCode::SUCCESS;
146 }
147
148
151
152
153 std::vector<std::shared_ptr<const FPGATrackSimHit>> phits_2nd;
154 phits_2nd.reserve(FPGAHits->size());
155 for (const auto& hit : *FPGAHits) {
156 phits_2nd.push_back(std::make_shared<const FPGATrackSimHit>(hit));
157 }
158
159 std::vector<std::shared_ptr<const FPGATrackSimTrack>> tracks_1st;
160 tracks_1st.reserve(FPGAInputTracks->size());
161 for (const auto& track : *FPGAInputTracks) {
162 tracks_1st.push_back(std::make_shared<const FPGATrackSimTrack>(track));
163 }
164 ATH_MSG_DEBUG(
"Retrieved " << phits_2nd.size() <<
" hits and " << tracks_1st.size() <<
" tracks from storegate");
165
166
167 SG::ReadHandle<FPGATrackSimTruthTrackCollection> FPGATruthTracks(
m_FPGATruthTrackKey, ctx);
168 if (!FPGATruthTracks.isValid()) {
169 ATH_MSG_ERROR(
"Could not find FPGA Truth Track Collection with key " << FPGATruthTracks.key());
170 return StatusCode::FAILURE;
171 }
172
173
175 if (!FPGAOfflineTracks.isValid()) {
176 ATH_MSG_ERROR(
"Could not find FPGA Offline Track Collection with key " << FPGAOfflineTracks.key());
177 return StatusCode::FAILURE;
178 }
179
180
182 if (!FPGAEventInfo.isValid()) {
183 ATH_MSG_ERROR(
"Could not find FPGA Event Info with key " << FPGAEventInfo.key());
184 return StatusCode::FAILURE;
185 }
186 FPGATrackSimEventInfo eventInfo = *FPGAEventInfo.cptr();
188
189
190 std::vector<std::shared_ptr<const FPGATrackSimRoad>> prefilter_roads;
191 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roads = std::move(prefilter_roads);
192
194
196
197 for (auto const &road : roads) {
198 std::vector<FPGATrackSimHit> road_hits;
199 ATH_MSG_DEBUG(
"Hough Road X Y: " << road->getX() <<
" " << road->getY());
200 for (
size_t l = 0;
l < road->getNLayers(); ++
l) {
201 for (const auto &layerH : road->getHits(l)) {
202 road_hits.push_back(*layerH);
203 }
204 }
205 FPGAHitsInRoads_2nd->push_back(std::move(road_hits));
206 FPGARoads_2nd->push_back(*road);
207 }
208
210 auto mon_nroads = Monitored::Scalar<unsigned>("nroads_2nd", roads.size());
211 unsigned bitmask_best(0);
212 unsigned nhit_best(0);
213 for (auto const &road : roads) {
214 unsigned bitmask = road->getHitLayers();
215 if (road->getNHitLayers() > nhit_best) {
216 nhit_best = road->getNHitLayers();
217 bitmask_best = bitmask;
218 }
220 if (bitmask & (1 << l)) {
221 auto mon_layerIDs = Monitored::Scalar<unsigned>("layerIDs_2nd",l);
222 Monitored::Group(
m_monTool,mon_layerIDs);
223 }
224 }
225 }
226
228 if (bitmask_best & (1 << l)) {
229 auto mon_layerIDs_best = Monitored::Scalar<unsigned>("layerIDs_2nd_best",l);
230 Monitored::Group(
m_monTool,mon_layerIDs_best);
231 }
232 }
234
235
236 auto mon_nroads_postfilter = Monitored::Scalar<unsigned>("nroads_2nd_postfilter", roads.size());
237 Monitored::Group(
m_monTool, mon_nroads_postfilter);
238
239
240
242 std::vector<FPGATrackSimTrack> tracks;
247 } else {
249
251
252 std::vector<FPGATrackSimTrack> filteredTracks;
253
254 for (const auto& road : roads) {
255
256 std::vector<FPGATrackSimTrack> tracksForCurrentRoad;
257 std::vector<std::shared_ptr<const FPGATrackSimRoad>> roadVec = {road};
259
260
261 if (!tracksForCurrentRoad.empty()) {
262 auto bestTrackIter = std::min_element(
263 tracksForCurrentRoad.begin(), tracksForCurrentRoad.end(),
264 [](
const FPGATrackSimTrack&
a,
const FPGATrackSimTrack& b) {
265 return a.getChi2ndof() < b.getChi2ndof();
266 });
267
268 if (bestTrackIter != tracksForCurrentRoad.end() && bestTrackIter->getChi2ndof() < 1.e15) {
269 filteredTracks.push_back(*bestTrackIter);
270
271
272 auto mon_chi2 = Monitored::Scalar<float>("chi2_2nd_all", bestTrackIter->getChi2ndof());
274 }
275 }
276 }
277
278
279 tracks = std::move(filteredTracks);
280
281
282 if (!tracks.empty()) {
283 float bestChi2Overall = std::min_element(
284 tracks.begin(), tracks.end(),
285 [](
const FPGATrackSimTrack&
a,
const FPGATrackSimTrack& b) {
286 return a.getChi2ndof() < b.getChi2ndof();
287 })->getChi2ndof();
288
289 auto mon_best_chi2 = Monitored::Scalar<float>("best_chi2_2nd", bestChi2Overall);
290 Monitored::Group(
m_monTool, mon_best_chi2);
291 }
292 } else {
294 float bestchi2 = 1.e15;
295 for (const FPGATrackSimTrack& track : tracks) {
297 if (
chi2 < bestchi2) bestchi2 =
chi2;
298 auto mon_chi2 = Monitored::Scalar<float>(
"chi2_2nd_all",
chi2);
300 }
301 auto mon_best_chi2 = Monitored::Scalar<float>("best_chi2_2nd", bestchi2);
302 Monitored::Group(
m_monTool, mon_best_chi2);
303 }
304 }
305 } else {
306
308 }
310 auto mon_ntracks = Monitored::Scalar<unsigned>("ntrack_2nd", tracks.size());
312
313
316
317
320 }
321
322 std::vector<FPGATrackSimTruthTrack> truthtracks = *FPGATruthTracks;
323 std::vector<FPGATrackSimOfflineTrack> offlineTracks = *FPGAOfflineTracks;
324
325
327 for (auto track : tracks) {
328
330 track.setQOverPt(truthtracks.front().getQOverPt());
332 track.setD0(truthtracks.front().getD0());
334 track.setPhi(truthtracks.front().getPhi());
336 track.setZ0(truthtracks.front().getZ0());
338 track.setEta(truthtracks.front().getEta());
339 }
340 }
341
342 unsigned ntrackOLRChi2 = 0;
343 for (const FPGATrackSimTrack& track : tracks) {
346 if (
track.passedOR()) {
347 ntrackOLRChi2++;
349
350
351 float chi2olr =
track.getChi2ndof();
352 auto mon_chi2_or = Monitored::Scalar<float>("chi2_2nd_afterOLR", chi2olr);
353 Monitored::Group(
m_monTool, mon_chi2_or);
354 }
355 }
356 }
358 auto mon_ntracks_olr = Monitored::Scalar<unsigned>("ntrack_2nd_afterOLR", ntrackOLRChi2);
359 Monitored::Group(
m_monTool,mon_ntracks_olr);
360
363
364
365 if (truthtracks.size() > 0) {
367 auto passroad = Monitored::Scalar<bool>("eff_road_2nd",(roads.size() > 0));
368 auto passtrack = Monitored::Scalar<bool>("eff_track_2nd",(tracks.size() > 0));
369 auto truthpT_zoom = Monitored::Scalar<float>("pT_zoom",truthtracks.front().getPt()*0.001);
370 auto truthpT = Monitored::Scalar<float>("pT",truthtracks.front().getPt()*0.001);
371 auto trutheta = Monitored::Scalar<float>("eta",truthtracks.front().getEta());
372 auto truthphi= Monitored::Scalar<float>("phi",truthtracks.front().getPhi());
373 auto truthd0= Monitored::Scalar<float>("d0",truthtracks.front().getD0());
374 auto truthz0= Monitored::Scalar<float>("z0",truthtracks.front().getZ0());
377
378 unsigned npasschi2(0);
379 unsigned npasschi2OLR(0);
380
381 if (tracks.size() > 0) {
384 for (const auto& track : tracks) {
386 npasschi2++;
387 if (
track.passedOR()) {
388 npasschi2OLR++;
389 }
390 }
391 }
392 }
397
398 auto passtrackchi2 = Monitored::Scalar<bool>("eff_track_chi2_2nd",(npasschi2 > 0));
399 Monitored::Group(
m_monTool,passroad,passtrack,truthpT_zoom,truthpT,trutheta,truthphi,truthd0,truthz0,passtrackchi2);
400 }
401
402 for (const FPGATrackSimTrack& track : tracks) FPGATracks_2ndHandle->push_back(track);
403
404
406 auto dataFlowInfo = std::make_unique<FPGATrackSimDataFlowInfo>();
408 }
409
410
414 }
415
416
419
420 return StatusCode::SUCCESS;
421}
#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< 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
Gaudi::Property< bool > m_passLowestChi2TrackOnly
StatusCode writeOutputData(const std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads_2nd, std::vector< FPGATrackSimTrack > const &tracks_2nd, FPGATrackSimDataFlowInfo const *dataFlowInfo)
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