19 std::unique_ptr<Trk::Track>
track;
20 unsigned int container_index;
22 track_link(std::unique_ptr<Trk::Track> _trk,
unsigned int _idx,
bool _succeed) :
23 track{std::move(_trk)}, container_index{_idx}, extp_succeed{_succeed} {}
31 declareInterface<IMuonCandidateTool>(
this);
51 return StatusCode::SUCCESS;
56 unsigned int ntracks = 0;
59 if (!beamSpotHandle.isValid()) {
64 ATH_MSG_DEBUG(
"Beamspot position bs_x=" << beamSpotHandle->beamPos());
66 std::vector<track_link> trackLinks;
68 unsigned int index = -1;
70 for (
const auto*
track : tracks) {
73 if (!
track->trackLink().isValid() || !
track->track()) {
82 std::unique_ptr<Trk::Track> standaloneTrack;
84 standaloneTrack =
m_trackBuilder->standaloneFit(ctx, msTrack, beamSpotHandle->beamPos(),
nullptr);
88 if (standaloneTrack) {
91 standaloneTrack.reset();
99 standaloneTrack.reset();
100 ATH_MSG_DEBUG(
"extrapolated track has a degraded fit, don't use it");
104 if (standaloneTrack) {
108 <<
m_printer->print(*standaloneTrack) << std::endl
109 <<
m_printer->printStations(*standaloneTrack));
114 ATH_MSG_WARNING(
" Track with perigee without covariance " << (*standaloneTrack));
115 trackLinks.emplace_back(std::move(standaloneTrack),
index,
true);
120 bool skipTrack =
true;
122 std::unique_ptr<Trk::TrackSummary> msTrackSummary;
136 if (!skipTrack) { trackLinks.emplace_back(std::make_unique<Trk::Track>(msTrack),
index,
false); }
140 std::unique_ptr<TrackCollection> extrapTracks = std::make_unique<TrackCollection>(
SG::VIEW_ELEMENTS);
141 extrapTracks->
reserve(trackLinks.size());
142 for (
const track_link& link : trackLinks) extrapTracks->
push_back(link.track.get());
143 ATH_MSG_DEBUG(
"Finished back-tracking, total number of successfull fits " << ntracks);
146 std::unique_ptr<const TrackCollection> resolvedTracks(
m_ambiguityProcessor->process(extrapTracks.get()));
148 ATH_MSG_DEBUG(
"Finished ambiguity solving: " << extrapTracks->
size() <<
" track(s) in -> " << resolvedTracks->
size()
154 if (!readHandle.isValid()) {
157 segments = readHandle.cptr();
163 std::find_if(trackLinks.begin(), trackLinks.end(), [&
track](
const track_link& link) { return link.track.get() == track; });
165 if (tLink == trackLinks.end()) {
166 ATH_MSG_WARNING(
"Unable to find internal link between MS and SA tracks!");
170 std::unique_ptr<MuonCandidate> muon_candidate;
172 if (tLink->extp_succeed) {
173 outputTracks.
push_back(std::move(tLink->track));
175 muon_candidate = std::make_unique<MuonCandidate>(MS_TrkLink, saLink, outputTracks.
size() - 1);
179 muon_candidate = std::make_unique<MuonCandidate>(MS_TrkLink);
184 std::vector<const Muon::MuonSegment*> assoc_segs;
186 muon_candidate->setSegments(std::move(assoc_segs));