76 std::unique_ptr<Trk::Track> result1;
77 std::unique_ptr<Trk::Track> result2;
81 settings.
broad =
false;
82 std::unique_ptr<Trk::Track> refittedTrack =
m_refitTool->refit(track, ctx, &settings);
87 <<
m_printer->print(*refittedTrack) << std::endl
88 <<
m_printer->printStations(*refittedTrack));
91 result1.swap(refittedTrack);
94 <<
m_printer->print(*refittedTrack) << std::endl
95 <<
m_printer->printStations(*refittedTrack));
106 if (!refittedTrack) {
108 settings.
broad =
true;
109 refittedTrack =
m_refitTool->refit(track, ctx, &settings);
114 <<
m_printer->print(*refittedTrack) << std::endl
115 <<
m_printer->printStations(*refittedTrack));
117 result2.swap(refittedTrack);
120 <<
m_printer->print(*refittedTrack) << std::endl
121 <<
m_printer->printStations(*refittedTrack));
134 if (!refittedTrack || *refittedTrack->perigeeParameters() == *track.perigeeParameters()) {
136 if (!result1 && !result2)
return nullptr;
140 const Trk::FitQuality* fq1 = result1 ? result1->fitQuality() :
nullptr;
141 const Trk::FitQuality* fq2 = result2 ? result2->fitQuality() :
nullptr;
143 bool doSelection =
true;
146 if (!fq0 || (result1 && !fq1) || (result2 && !fq2)) {
159 if (muonSummary0) nhits0 = muonSummary0->
netaHits() + muonSummary0->
nphiHits();
164 if (muonSummary0) nhits0 = muonSummary0->
netaHits() + muonSummary0->
nphiHits();
170 if (muonSummary0) nhits0 = muonSummary0->
netaHits() + muonSummary0->
nphiHits();
184 if (muonSummary1) nhits1 = muonSummary1->
netaHits() + muonSummary1->
nphiHits();
189 if (muonSummary1) nhits1 = muonSummary1->
netaHits() + muonSummary1->
nphiHits();
203 if (muonSummary2) nhits2 = muonSummary2->
netaHits() + muonSummary2->
nphiHits();
208 if (muonSummary2) nhits2 = muonSummary2->
netaHits() + muonSummary2->
nphiHits();
211 if (nhits0 != -1 && nhits1 != -1 && nhits2 != -1) {
212 if (nhits0 == nhits1 && nhits0 == nhits2) doSelection =
true;
220 std::array<std::tuple<std::unique_ptr<Trk::Track> ,double,std::string>,3 > fitName {{
222 {std::move(result1),fq1 ? fq1->
chiSquared() : std::numeric_limits<double>::max(),
"precise refit"},
223 {std::move(result2),fq2 ? fq2->
chiSquared() : std::numeric_limits<double>::max(),
"loose refit"}
227 auto best=std::min_element(fitName.begin(),fitName.end(),[](
const auto&
a,
const auto& b){
228 return std::get<1>(a) < std::get<1>(b);
232 std::unique_ptr<Trk::Track> bestTrack=std::move(std::get<0>(*best));
237 return refittedTrack;