19 std::unique_ptr<Trk::Track>
track{};
20 unsigned int container_index{0};
21 bool extp_succeed{
false};
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} {}
39 return StatusCode::SUCCESS;
44 unsigned int ntracks = 0;
47 if (!beamSpotHandle.isValid()) {
52 ATH_MSG_DEBUG(
"Beamspot position bs_x=" << beamSpotHandle->beamPos());
54 std::vector<track_link> trackLinks;
56 unsigned int index = -1;
58 for (
const auto*
track : tracks) {
61 if (!
track->trackLink().isValid() || !
track->track()) {
70 std::unique_ptr<Trk::Track> standaloneTrack;
72 standaloneTrack =
m_trackBuilder->standaloneFit(ctx, msTrack, beamSpotHandle->beamPos(),
nullptr);
76 if (standaloneTrack) {
79 standaloneTrack.reset();
87 standaloneTrack.reset();
88 ATH_MSG_DEBUG(
"extrapolated track has a degraded fit, don't use it");
92 if (standaloneTrack) {
96 <<
m_printer->print(*standaloneTrack) << std::endl
97 <<
m_printer->printStations(*standaloneTrack));
102 ATH_MSG_WARNING(
" Track with perigee without covariance " << (*standaloneTrack));
103 trackLinks.emplace_back(std::move(standaloneTrack),
index,
true);
108 bool skipTrack =
true;
110 std::unique_ptr<Trk::TrackSummary> msTrackSummary;
125 if (!skipTrack) { trackLinks.emplace_back(std::make_unique<Trk::Track>(msTrack),
index,
false); }
129 std::unique_ptr<TrackCollection> extrapTracks = std::make_unique<TrackCollection>(
SG::VIEW_ELEMENTS);
130 extrapTracks->reserve(trackLinks.size());
131 for (
const track_link& link : trackLinks) extrapTracks->push_back(link.track.get());
132 ATH_MSG_DEBUG(
"Finished back-tracking, total number of successfull fits " << ntracks);
135 std::unique_ptr<const TrackCollection> resolvedTracks(
m_ambiguityProcessor->process(extrapTracks.get()));
137 ATH_MSG_DEBUG(
"Finished ambiguity solving: " << extrapTracks->size() <<
" track(s) in -> " << resolvedTracks->size()
143 if (!readHandle.isValid()) {
146 segments = readHandle.cptr();
152 std::find_if(trackLinks.begin(), trackLinks.end(), [&
track](
const track_link& link) { return link.track.get() == track; });
154 if (tLink == trackLinks.end()) {
155 ATH_MSG_WARNING(
"Unable to find internal link between MS and SA tracks!");
159 std::unique_ptr<MuonCandidate> muon_candidate;
161 if (tLink->extp_succeed) {
162 outputTracks.
push_back(std::move(tLink->track));
164 muon_candidate = std::make_unique<MuonCandidate>(MS_TrkLink, saLink, outputTracks.
size() - 1);
168 muon_candidate = std::make_unique<MuonCandidate>(MS_TrkLink);
173 std::vector<const Muon::MuonSegment*> assoc_segs;
175 muon_candidate->setSegments(std::move(assoc_segs));