ATLAS Offline Software
Loading...
Searching...
No Matches
SiSPGNNTrackMaker.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <memory>
6#include <fstream>
7#include <tuple>
8#include <utility>
9
10#include "SiSPGNNTrackMaker.h"
11
15
17 const std::string& name, ISvcLocator* pSvcLocator)
18 : AthReentrantAlgorithm(name, pSvcLocator)
19{
20
21}
22
24{
25 ATH_CHECK(m_SpacePointsPixelKey.initialize());
26 ATH_CHECK(m_SpacePointsSCTKey.initialize());
28 ATH_CHECK(m_ClusterPixelKey.initialize());
29 ATH_CHECK(m_ClusterStripKey.initialize());
30
31 ATH_CHECK(m_outputTracksKey.initialize());
32 ATH_CHECK(m_outputEdgeScoresKey.initialize());
33
34 ATH_CHECK(m_trackFitter.retrieve());
35 ATH_CHECK(m_seedFitter.retrieve());
36 ATH_CHECK(m_trackSummaryTool.retrieve());
37
38 if (!m_gnnTrackFinder.empty() && !m_gnnTrackReader.empty()) {
39 ATH_MSG_ERROR("Use either track finder or track reader, not both.");
40 return StatusCode::FAILURE;
41 }
42
43 if (!m_gnnTrackFinder.empty()) {
44 ATH_MSG_INFO("Use GNN Track Finder");
45 ATH_CHECK(m_gnnTrackFinder.retrieve());
46 }
47 if (!m_gnnTrackReader.empty()) {
48 ATH_MSG_INFO("Use GNN Track Reader");
49 ATH_CHECK(m_gnnTrackReader.retrieve());
50 }
52 ATH_MSG_INFO("Use input clusters");
53 }
54 // retrieve eta dependent cut svc
56
57 ATH_MSG_INFO("Applying the following cuts during GNN-based track reconstruction: ");
58 ATH_MSG_INFO("Min pT: " << m_pTmin);
59 ATH_MSG_INFO("Max eta: " << m_etamax);
60 ATH_MSG_INFO("Min number of clusters: " << m_minClusters);
61 ATH_MSG_INFO("Min number of pixel clusters: " << m_minPixelClusters);
62 ATH_MSG_INFO("Min number of strip clusters: " << m_minStripClusters);
63
64
66 ATH_MSG_INFO("Applying the following eta dependant track cuts after GNN-based track reconstruction: ");
67 std::vector <double> etaBins, minPT, maxz0, maxd0;
68 std::vector <int> minClusters, minPixelHits, maxHoles;
69 m_etaDependentCutsSvc->getValue(InDet::CutName::etaBins, etaBins);
70 ATH_MSG_INFO("Eta bins: " << etaBins );
71 m_etaDependentCutsSvc->getValue(InDet::CutName::minClusters, minClusters);
72 ATH_MSG_INFO("Min Si Hits: " << minClusters );
73 m_etaDependentCutsSvc->getValue(InDet::CutName::minPixelHits, minPixelHits);
74 ATH_MSG_INFO("Min pixel hits: " << minPixelHits );
75 m_etaDependentCutsSvc->getValue(InDet::CutName::maxHoles, maxHoles);
76 ATH_MSG_INFO("Max holes: " << maxHoles);
77 m_etaDependentCutsSvc->getValue(InDet::CutName::minPT, minPT);
78 ATH_MSG_INFO("Min pT: " << minPT);
79 m_etaDependentCutsSvc->getValue(InDet::CutName::maxZImpact, maxz0);
80 ATH_MSG_INFO("Max z0: " << maxz0);
81 m_etaDependentCutsSvc->getValue(InDet::CutName::maxPrimaryImpact, maxd0);
82 ATH_MSG_INFO("Max d0: " << maxd0);
83 }
84
85 return StatusCode::SUCCESS;
86}
87
88StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const
89{
91 ATH_CHECK(outputTracks.record(std::make_unique<TrackCollection>()));
92
94 ATH_CHECK(outputEdgeScores.record(std::make_unique<std::vector<std::vector<float>>>()));
95
96 // get event info
97 uint32_t runNumber = ctx.eventID().run_number();
98 uint32_t eventNumber = ctx.eventID().event_number();
99
100 // get all space points from event
101 std::vector<const Trk::SpacePoint*> spacePoints = getSpacePointsInEvent(ctx, eventNumber);
102
103 // get all clusters from event
104 std::vector<const Trk::PrepRawData*> allClusters = getClustersInEvent(ctx, eventNumber);
105
106 // get tracks from GNN chain
107 std::vector<std::vector<uint32_t> > TT;
108 std::vector<std::vector<uint32_t> > clusterTracks;
109 std::unordered_map<int, std::unordered_map<int, float>> edgeMap;
110 if (m_gnnTrackFinder.isSet()) {
111 ATH_CHECK(m_gnnTrackFinder->getTracks(
112 spacePoints,
113 TT,
114 m_saveEdgeScore ? &edgeMap : nullptr
115 )
116 );
117 } else if (m_gnnTrackReader.isSet()) {
118 // if track candidates are built from cluster, get both clusters and SPs
120 m_gnnTrackReader->getTracks(runNumber, eventNumber, clusterTracks, TT) :
121 m_gnnTrackReader->getTracks(runNumber, eventNumber, TT);
122 } else {
123 ATH_MSG_ERROR("Both GNNTrackFinder and GNNTrackReader are not set");
124 return StatusCode::FAILURE;
125 }
126
127 ATH_MSG_DEBUG("Event " << eventNumber << " obtained " << TT.size() << " Tracks");
128
129 // loop over all track candidates
130 // and perform track fitting for each.
131 int trackCounter = -1;
132 std::vector<int> status_codes;
133 // track processing loop
134 for (auto& trackIndices : TT) {
135 // For each track candidate:
136 trackCounter++;
137
138 // 1. Sort space points by distance from origin (and retrieve SP ID for edge scores)
139 std::pair<std::vector<const Trk::SpacePoint*>, std::vector<uint32_t> > trackInfos = getSpacePoints(trackIndices, spacePoints);
140 std::vector<const Trk::SpacePoint*> trackCandidate = trackInfos.first;
141 std::vector<uint32_t> sortedID = trackInfos.second;
142
143 // 2. Get associated clusters
144 // if track candidates are built from cluster, get both clusters and SPs
145 std::vector<const Trk::PrepRawData*> clusters = m_areInputClusters ?
146 getClusters (clusterTracks, allClusters, trackCounter)
147 : spacePointsToClusters(trackCandidate) ;
148
149 // 3. Perform track fitting:
150 // - Initial conformal mapping
151 // - First chi2 fit without outlier removal
152 // - Second chi2 fit with improved initial estimate of track parameters and with outlier removal
153 // 4. Apply quality cuts (pT, eta)
154 // 5. Compute track summary
155 // 6. Store track if it passes all criteria
156 auto [fitSuccess, passTrackCut, track] = doFitAndCut(ctx, trackCandidate, clusters, trackCounter);
157
158 if (not fitSuccess) {
159 continue;
160 }
161
162 if (passTrackCut <= 0) {
163 outputTracks->push_back(track.release());
164 if (m_saveEdgeScore){
165 std::vector<float> edges = getEdgeScores(sortedID, edgeMap);
166 outputEdgeScores->push_back(edges);
167 }
168 }
169
170 status_codes.push_back(passTrackCut);
171
172 }
173
174 if (m_doRecoTrackCuts) {
175 ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, "
176 << std::count(status_codes.begin(), status_codes.end(), 0)
177 << " tracks remains after applying track cuts");
178 } else {
179 ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, all tracks are kept");
180 }
181
182 return StatusCode::SUCCESS;
183}
184
186 const std::vector<uint32_t>& sortedID,
187 const std::unordered_map<int, std::unordered_map<int, float>>& edgeMap
188) const {
189
190 std::vector<float> edges;
191 edges.reserve(sortedID.size() - 1);
192
193 if (sortedID.size() < 2) {
194 ATH_MSG_WARNING("Not enough SP in this track, returning empty edge list!");
195 return edges;
196 }
197 if (edgeMap.empty()) {
198 ATH_MSG_WARNING("Empty edgeMap, returning empty edge list! ");
199 return edges;
200 }
201
202 for (std::size_t i = 0; i < sortedID.size() - 1; ++i) {
203 uint32_t src = sortedID[i];
204 uint32_t dst = sortedID[i+1];
205
206 auto srcMap = edgeMap.find(src);
207 if (srcMap == edgeMap.end()) {
208 edges.push_back(-1.f);
209 continue;
210 }
211
212 auto dstMap = srcMap->second.find(dst);
213 if (dstMap == srcMap->second.end()) {
214 edges.push_back(-1.f);
215 continue;
216 }
217
218 float score = dstMap->second;
219 edges.push_back(score);
220 }
221
222 return edges;
223}
224
225bool InDet::SiSPGNNTrackMaker::prefitCheck(unsigned int nPix, unsigned int nStrip, unsigned int nClusters, unsigned int nSpacePoints) const {
226 return nPix >= m_minPixelClusters && nStrip >= m_minStripClusters && nClusters >= m_minClusters && nSpacePoints >= 3;
227}
228
229
231{
232 const Trk::Perigee* origPerigee = track.perigeeParameters();
233 double pt = origPerigee->pT();
234
235 double eta = std::abs(origPerigee->eta());
236
237 double d0 = std::abs(origPerigee->parameters()[Trk::d0]);
238
239 double z0 = std::abs(origPerigee->parameters()[Trk::z0]);
240
241 int nHolesOnTrack = track.trackSummary()->get(Trk::numberOfPixelHoles) +
242 track.trackSummary()->get(Trk::numberOfSCTHoles);
243
244 int nPixels = track.trackSummary()->get(Trk::numberOfPixelHits);
245 int nStrips = track.trackSummary()->get(Trk::numberOfSCTHits);
246 int nClusters = nPixels + nStrips;
247
248 ATH_MSG_DEBUG("track params: (pt,eta,d0,z0)=(" << pt << "," << eta << "," << d0 << "," << z0
249 << ") Nclusters:" << nClusters << " pixel "<< nPixels
250 << " strips " << nStrips);
251
252 // min Si hits
253 if (nClusters < m_etaDependentCutsSvc->getMinSiHitsAtEta(eta))
254 return 1;
255
256 // min pixel hits
257 if (nPixels < m_etaDependentCutsSvc->getMinPixelHitsAtEta(eta))
258 return 2;
259
260 // min pT, default 400
261 if (pt < m_etaDependentCutsSvc->getMinPtAtEta(eta))
262 return 3;
263
264 // max z0
265 if (z0 > m_etaDependentCutsSvc->getMaxZImpactAtEta(eta))
266 return 4;
267
268 // max d0
269 if (d0 > m_etaDependentCutsSvc->getMaxPrimaryImpactAtEta(eta))
270 return 5;
271
272 // max holes
273 if (nHolesOnTrack > m_etaDependentCutsSvc->getMaxSiHolesAtEta(eta))
274 return 6;
275
276 return 0;
277}
278
279std::vector<const Trk::SpacePoint*> InDet::SiSPGNNTrackMaker::getSpacePointsInEvent (
280 const EventContext& ctx,
281 int eventNumber
282) const {
283 std::vector<const Trk::SpacePoint*> spacePoints;
284
285 int npixsp(0), nstrip(0), n_overlap(0);
287 spacePoints.push_back(sp);
288 npixsp++;
289 }
291 spacePoints.push_back(sp);
292 nstrip++;
293 }
295 spacePoints.push_back(sp);
296 n_overlap++;
297 }
298 ATH_MSG_DEBUG("Event " << eventNumber << " has " << npixsp
299 << " pixel space points, " << nstrip
300 << " strips space points, " << n_overlap
301 << " overlapping spacepoints, " << spacePoints.size()
302 << " space points");
303
304 return spacePoints;
305}
306
307std::vector<const Trk::SpacePoint*> InDet::SiSPGNNTrackMaker::getSpacePointsInEvent(
308 const EventContext& ctx,
310) const {
311 std::vector<const Trk::SpacePoint*> spacePoints;
312 if (not containerKey.empty()){
313
314 SG::ReadHandle<SpacePointContainer> container{containerKey, ctx};
315
316 if (container.isValid()){
317 // loop over spacepoint collection
318 auto spc = container->begin();
319 auto spce = container->end();
320 for(; spc != spce; ++spc){
321 const SpacePointCollection* spCollection = (*spc);
322 auto sp = spCollection->begin();
323 auto spe = spCollection->end();
324 for(; sp != spe; ++sp) {
325 const Trk::SpacePoint* spacePoint = (*sp);
326 spacePoints.push_back(spacePoint);
327 }
328 }
329 }
330 }
331
332 return spacePoints;
333}
334
335std::vector<const Trk::SpacePoint*> InDet::SiSPGNNTrackMaker::getSpacePointsInEvent(
336 const EventContext& ctx,
338) const {
339
340 std::vector<const Trk::SpacePoint*> spacePoints;
341
342 if (not containerKey.empty()){
343
344 SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, ctx};
345
346 if (collection.isValid()){
347 for (const Trk::SpacePoint *sp : *collection) {
348 spacePoints.push_back(sp);
349 }
350 }
351 }
352
353 return spacePoints;
354}
355
356std::vector<const Trk::PrepRawData*> InDet::SiSPGNNTrackMaker::getClustersInEvent (
357 const EventContext& ctx,
358 int eventNumber
359) const {
360 std::vector<const Trk::PrepRawData*> allClusters;
361 if (m_areInputClusters) {
363 ctx);
365 ctx);
366
367 if (!pixcontainer.isValid()) {
368 ATH_MSG_ERROR("Pixel container invalid, returning");
369 return allClusters;
370 }
371
372 if (!strip_container.isValid()) {
373 ATH_MSG_ERROR("Strip container invalid, returning");
374 return allClusters;
375 }
376
377 auto pixcollection = pixcontainer->begin();
378 auto pixcollectionEnd = pixcontainer->end();
379 for (; pixcollection != pixcollectionEnd; ++pixcollection) {
380 if ((*pixcollection)->empty()) {
381 ATH_MSG_WARNING("Empty pixel cluster collection encountered");
382 continue;
383 }
384 auto const* clusterCollection = (*pixcollection);
385 auto thisCluster = clusterCollection->begin();
386 auto clusterEnd = clusterCollection->end();
387 for (; thisCluster != clusterEnd; ++thisCluster) {
388 const PixelCluster* cl = (*thisCluster);
389 allClusters.push_back(cl);
390 }
391 }
392
393 auto strip_collection = strip_container->begin();
394 auto strip_collectionEnd = strip_container->end();
395 for (; strip_collection != strip_collectionEnd; ++strip_collection) {
396 if ((*strip_collection)->empty()) {
397 ATH_MSG_WARNING("Empty strip cluster collection encountered");
398 continue;
399 }
400 auto const* clusterCollection = (*strip_collection);
401 auto thisCluster = clusterCollection->begin();
402 auto clusterEnd = clusterCollection->end();
403 for (; thisCluster != clusterEnd; ++thisCluster) {
404 const SCT_Cluster* cl = (*thisCluster);
405 allClusters.push_back(cl);
406 }
407 }
408
409 ATH_MSG_DEBUG("Event " << eventNumber << " has " << allClusters.size()
410 << " clusters");
411 }
412 return allClusters;
413}
414
415
416std::pair<std::vector<const Trk::SpacePoint*>, std::vector<uint32_t> > InDet::SiSPGNNTrackMaker::getSpacePoints (
417 const std::vector<uint32_t>& trackIndices,
418 const std::vector<const Trk::SpacePoint*>& allSpacePoints
419) const {
420
421 std::vector<const Trk::SpacePoint*> trackCandidate;
422 std::vector<uint32_t> sorted_idx;
423 trackCandidate.reserve(trackIndices.size());
424 sorted_idx.reserve(trackIndices.size());
425
426 std::vector<std::tuple<double, const Trk::SpacePoint*, uint32_t> > distanceSortedSPs;
427
428 // get track space points
429 // sort SPs in track by distance from origin
430 for (auto& id : trackIndices) {
432 if (id > allSpacePoints.size()) {
433 ATH_MSG_WARNING("SpacePoint index "
434 << id << " out of range: " << allSpacePoints.size());
435 continue;
436 }
437
438 const Trk::SpacePoint* sp = allSpacePoints[id];
439
440 // store distance - hit paire
441 if (sp != nullptr) {
442 distanceSortedSPs.push_back(
443 std::make_tuple(
444 pow(sp->globalPosition().x(), 2) + pow(sp->globalPosition().y(), 2),
445 sp,
446 id
447 )
448 );
449 }
450 }
451
452 // sort by distance
453 std::sort(distanceSortedSPs.begin(), distanceSortedSPs.end());
454
455 // add SP to trk candidate in the same order
456 for (size_t i = 0; i < distanceSortedSPs.size(); i++) {
457 trackCandidate.push_back(std::get<1>(distanceSortedSPs[i]));
458
459 if (m_saveEdgeScore) {
460 sorted_idx.push_back(std::get<2>(distanceSortedSPs[i]));
461 }
462 }
463
464 return std::make_pair(trackCandidate, sorted_idx);
465}
466
467std::vector<const Trk::PrepRawData*> InDet::SiSPGNNTrackMaker :: spacePointsToClusters (
468 const std::vector<const Trk::SpacePoint*>& spacePoints
469) const {
470 std::vector<const Trk::PrepRawData*> clusters;
471 for (const Trk::SpacePoint* sp : spacePoints) {
472 clusters.push_back(sp->clusterList().first);
473 if (sp->clusterList().second != nullptr) {
474 clusters.push_back(sp->clusterList().second);
475 }
476 }
477 return clusters;
478}
479
480std::vector<const Trk::PrepRawData*> InDet::SiSPGNNTrackMaker :: getClusters (
481 const std::vector<std::vector<uint32_t>>& clusterTracks,
482 const std::vector<const Trk::PrepRawData*>& allClusters,
483 int trackNumber
484) const {
485 std::vector<uint32_t> clusterIndices = clusterTracks[trackNumber];
486 std::vector<const Trk::PrepRawData*> clusters;
487 clusters.reserve(clusterIndices.size());
488 for (uint32_t id : clusterIndices) {
489 if (id > allClusters.size()) {
490 ATH_MSG_ERROR("Cluster index out of range");
491 continue;
492 }
493 clusters.push_back(allClusters[id]);
494 }
495 return clusters;
496}
497
530
531std::tuple<bool, int, std::unique_ptr<Trk::Track>> InDet::SiSPGNNTrackMaker::doFitAndCut (
532 const EventContext& ctx,
533 std::vector<const Trk::SpacePoint*>& spacePoints,
534 std::vector<const Trk::PrepRawData*>& clusters,
535 int& trackCounter
536 ) const
537 {
538 // get cluster list
539 int nPIX(0), nStrip(0);
540
541 for (const Trk::PrepRawData* cl : clusters) {
542 if (cl->type(Trk::PrepRawDataType::PixelCluster)) nPIX++;
543 if (cl->type(Trk::PrepRawDataType::SCT_Cluster)) nStrip++;
544 }
545
546 ATH_MSG_DEBUG("Track " << trackCounter << " has " << spacePoints.size()
547 << " space points, " << clusters.size()
548 << " clusters, " << nPIX << " pixel clusters, "
549 << nStrip << " strip clusters");
550
551 // check hit counts
552 if (not prefitCheck(nPIX, nStrip, clusters.size(), spacePoints.size())) {
553 ATH_MSG_DEBUG("Track " << trackCounter << " does not pass prefit cuts, skipping");
554 return std::make_tuple(false, 999, nullptr);
555 }
556
557 // conformal mapping for track parameters
558 auto trkParameters = m_seedFitter->fit(spacePoints);
559 if (trkParameters == nullptr) {
560 ATH_MSG_DEBUG("Conformal mapping failed");
561 return std::make_tuple(false, 999, nullptr);
562 }
563
564 std::unique_ptr<Trk::Track> track = fitTrack(ctx, clusters, *trkParameters, trackCounter);
565
566 if (track == nullptr || track->perigeeParameters() == nullptr) {
567 ATH_MSG_DEBUG("Track " << trackCounter
568 << " fails the chi2 fit, skipping");
569 return std::make_tuple(false, 999, nullptr);
570 }
571
572 // compute pT and skip if pT too low
573 if (track->perigeeParameters()->pT() < m_pTmin) {
574 ATH_MSG_DEBUG("Track " << trackCounter
575 << "with pt = " << track->perigeeParameters()->pT()
576 << " has pT too low, skipping track!");
577 return std::make_tuple(false, 999, nullptr);
578 }
579
580 // get rid of tracks with eta too large
581 if (std::abs(track->perigeeParameters()->eta()) > m_etamax) {
582 ATH_MSG_DEBUG("Track " << trackCounter << "with eta = "
583 << std::abs(track->perigeeParameters()->eta())
584 << " has eta too high, skipping track!");
585 return std::make_tuple(false, 999, nullptr);
586 }
587
588 // if track fit succeeds, eta and pT within range, compute track summary. This is quite expensive.
589 m_trackSummaryTool->computeAndReplaceTrackSummary(
590 ctx, *track, false /* DO NOT suppress hole search*/);
591
592 int passTrackCut = (m_doRecoTrackCuts) ? passEtaDepCuts(*track) : -1;
593
594 return std::make_tuple(true, passTrackCut, std::move(track));
595
596 }
597
598std::unique_ptr<Trk::Track> InDet::SiSPGNNTrackMaker::fitTrack (
599 const EventContext& ctx,
600 std::vector<const Trk::PrepRawData*> clusters,
601 const Trk::TrackParameters& initial_params,
602 int trackCounter
603 ) const
604 {
605
607 // first fit the track with local parameters and without outlier removal.
608 bool keepOnTrying = true;
609 std::unique_ptr<Trk::Track> track;
610 while (keepOnTrying) {
611 track = m_trackFitter->fit(ctx, clusters, initial_params, false, matEffects);
612 // any need to recover a failed fit ?
613 if (track == nullptr || track->perigeeParameters() == nullptr) {
614 clusters.pop_back();
615 if (clusters.size()<m_minClusters || !m_doRecoverFailedFits) {
616 keepOnTrying = false;
617 }
618 } else {
619 keepOnTrying = false;
620 }
621 }
622
623 if (track == nullptr || track->perigeeParameters() == nullptr) {
624 ATH_MSG_DEBUG("Track " << trackCounter
625 << " fails the first chi2 fit, skipping");
626 return track;
627 }
628
629 // reject track with pT too low, default 400 MeV
630 if (track->perigeeParameters()->pT() < m_pTmin) {
631 ATH_MSG_DEBUG("Track " << trackCounter
632 << " fails the first chi2 fit, skipping");
633 return nullptr;
634 }
635
636 // finally fit with outlier removal
637 Trk::Perigee origPerigee = *track->perigeeParameters();
638 keepOnTrying = true;
639 while (keepOnTrying) {
640 track = m_trackFitter->fit(ctx, clusters, origPerigee, true, matEffects);
641 // any need to recover a failed or bad fit ?
642 bool doRefit=false;
643 if (track == nullptr || track->trackSummary() == nullptr || track->outliersOnTrack()->size()>=3) {
644 doRefit=true;
645 }
646 if (doRefit && m_doRecoverFailedFits) {
647 clusters.pop_back();
648 if (clusters.size()<m_minClusters) {
649 keepOnTrying=false;
650 }
651 } else {
652 keepOnTrying=false;
653 }
654 }
655
656 if (!track) ATH_MSG_DEBUG("Track " << trackCounter
657 << " fails the second chi2 fit, skipping");
658
659 return track;
660
661 }
662
664// Overload of << operator MsgStream
666
667MsgStream& InDet::operator <<
668 (MsgStream& sl,const InDet::SiSPGNNTrackMaker& se)
669{
670 return se.dump(sl);
671}
672
674// Overload of << operator std::ostream
676std::ostream& InDet::operator <<
677 (std::ostream& sl,const InDet::SiSPGNNTrackMaker& se)
678{
679 return se.dump(sl);
680}
681
683// Dumps relevant information into the MsgStream
685
686MsgStream& InDet::SiSPGNNTrackMaker::dump( MsgStream& out ) const
687{
688 out<<std::endl;
689 if(msgLvl(MSG::DEBUG)) return dumpevent(out);
690 else return dumptools(out);
691}
692
694// Dumps conditions information into the MsgStream
696
697MsgStream& InDet::SiSPGNNTrackMaker::dumptools( MsgStream& out ) const
698{
699 out<<"| Location of output tracks | "
700 <<std::endl;
701 out<<"|----------------------------------------------------------------"
702 <<"----------------------------------------------------|"
703 <<std::endl;
704 return out;
705}
706
708// Dumps event information into the ostream
710
711MsgStream& InDet::SiSPGNNTrackMaker::dumpevent( MsgStream& out ) const
712{
713 return out;
714}
715
716std::ostream& InDet::SiSPGNNTrackMaker::dump( std::ostream& out ) const
717{
718 return out;
719}
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t sp
bool msgLvl(const MSG::Level lvl) const
An algorithm that can be simultaneously executed in multiple threads.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
InDet::SiSPGNNTrackMaker is an algorithm that uses the GNN-based track finding tool to reconstruct tr...
SG::WriteHandleKey< std::vector< std::vector< float > > > m_outputEdgeScoresKey
ToolHandle< ISeedFitter > m_seedFitter
MsgStream & dump(MsgStream &out) const
std::unique_ptr< Trk::Track > fitTrack(const EventContext &ctx, std::vector< const Trk::PrepRawData * > clusters, const Trk::TrackParameters &initial_params, int trackCounter) const
UnsignedIntegerProperty m_minStripClusters
ToolHandle< IGNNTrackReaderTool > m_gnnTrackReader
std::pair< std::vector< const Trk::SpacePoint * >, std::vector< uint32_t > > getSpacePoints(const std::vector< uint32_t > &trackIndices, const std::vector< const Trk::SpacePoint * > &allSpacePoints) const
SG::ReadHandleKey< InDet::PixelClusterContainer > m_ClusterPixelKey
BooleanProperty m_doRecoverFailedFits
SG::ReadHandleKey< InDet::SCT_ClusterContainer > m_ClusterStripKey
UnsignedIntegerProperty m_minPixelClusters
BooleanProperty m_doRecoTrackCuts
BooleanProperty m_areInputClusters
int passEtaDepCuts(const Trk::Track &track) const
SiSPGNNTrackMaker(const std::string &name, ISvcLocator *pSvcLocator)
ServiceHandle< IInDetEtaDependentCutsSvc > m_etaDependentCutsSvc
std::vector< const Trk::PrepRawData * > getClustersInEvent(const EventContext &ctx, int eventNumber) const
std::vector< float > getEdgeScores(const std::vector< uint32_t > &sortedID, const std::unordered_map< int, std::unordered_map< int, float > > &edgeMap) const
SG::WriteHandleKey< TrackCollection > m_outputTracksKey
std::vector< const Trk::PrepRawData * > spacePointsToClusters(const std::vector< const Trk::SpacePoint * > &spacePoints) const
ToolHandle< Trk::ITrackFitter > m_trackFitter
Track Fitter.
SG::ReadHandleKey< SpacePointContainer > m_SpacePointsSCTKey
MsgStream & dumpevent(MsgStream &out) const
virtual StatusCode initialize() override
ToolHandle< IGNNTrackFinder > m_gnnTrackFinder
GNN-based track finding tool that produces track candidates.
bool prefitCheck(unsigned int nPix, unsigned int nStrip, unsigned int nClusters, unsigned int nSpacePoints) const
std::vector< const Trk::SpacePoint * > getSpacePointsInEvent(const EventContext &ctx, int eventNumber) const
UnsignedIntegerProperty m_minClusters
virtual StatusCode execute(const EventContext &ctx) const override
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
std::vector< const Trk::PrepRawData * > getClusters(const std::vector< std::vector< uint32_t > > &clusterTracks, const std::vector< const Trk::PrepRawData * > &allClusters, int trackNumber) const
SG::ReadHandleKey< SpacePointOverlapCollection > m_SpacePointsOverlapKey
SG::ReadHandleKey< SpacePointContainer > m_SpacePointsPixelKey
std::tuple< bool, int, std::unique_ptr< Trk::Track > > doFitAndCut(const EventContext &ctx, std::vector< const Trk::SpacePoint * > &spacePoints, std::vector< const Trk::PrepRawData * > &clusters, int &trackCounter) const
Fits a track and applies quality cuts to determine if it should be kept.
MsgStream & dumptools(MsgStream &out) const
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
bool empty() const
Test if the key is blank.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
double eta() const
Access method for pseudorapidity - from momentum.
double pT() const
Access method for transverse momentum.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfSCTHoles
number of Holes in both sides of a SCT module
@ numberOfPixelHoles
number of pixels which have a ganged ambiguity.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.