66 {
69 bool isLowPt = false;
71 if (isLowPt)
73 else
75
76 std::unique_ptr<Trk::Track> result1;
77 std::unique_ptr<Trk::Track> result2;
78
79
81 settings.broad = false;
82 std::unique_ptr<Trk::Track> refittedTrack =
m_refitTool->refit(track, ctx, &settings);
83 if (refittedTrack) {
84
87 <<
m_printer->print(*refittedTrack) << std::endl
88 <<
m_printer->printStations(*refittedTrack));
89
90
91 result1.swap(refittedTrack);
92 } else {
94 <<
m_printer->print(*refittedTrack) << std::endl
95 <<
m_printer->printStations(*refittedTrack));
96 if (isLowPt)
98 else
100 }
101 } else {
103 }
104
105
106 if (!refittedTrack) {
107
108 settings.broad = true;
109 refittedTrack =
m_refitTool->refit(track, ctx, &settings);
110 if (refittedTrack) {
111
114 <<
m_printer->print(*refittedTrack) << std::endl
115 <<
m_printer->printStations(*refittedTrack));
116
117 result2.swap(refittedTrack);
118 } else {
120 <<
m_printer->print(*refittedTrack) << std::endl
121 <<
m_printer->printStations(*refittedTrack));
122 if (isLowPt)
124 else
127 }
128 } else {
130 }
131 }
132
133
134 if (!refittedTrack || *refittedTrack->perigeeParameters() == *
track.perigeeParameters()) {
135
136 if (!result1 && !result2) return nullptr;
137
138
139 const Trk::FitQuality* fq0 =
track.fitQuality();
140 const Trk::FitQuality* fq1 = result1 ? result1->fitQuality() : nullptr;
141 const Trk::FitQuality* fq2 = result2 ? result2->fitQuality() : nullptr;
142
143 bool doSelection = true;
144
145
146 if (!fq0 || (result1 && !fq1) || (result2 && !fq2)) {
148 doSelection = false;
149
151 doSelection = false;
152
153 int nhits0 = -1;
154 Trk::TrackSummary* summary0 =
track.trackSummary();
155 Trk::MuonTrackSummary* muonSummary0 = nullptr;
156 if (summary0) {
159 if (muonSummary0) nhits0 = muonSummary0->
netaHits() + muonSummary0->
nphiHits();
160 } else {
161 Trk::TrackSummary tmpSum(*summary0);
163 muonSummary0 = tmpSum.muonTrackSummary();
164 if (muonSummary0) nhits0 = muonSummary0->
netaHits() + muonSummary0->
nphiHits();
165 }
166 } else {
167 Trk::TrackSummary tmpSummary;
170 if (muonSummary0) nhits0 = muonSummary0->
netaHits() + muonSummary0->
nphiHits();
171 }
172
173 int nhits1 = -1;
174 Trk::TrackSummary* summary1 =
track.trackSummary();
175 Trk::MuonTrackSummary* muonSummary1 = nullptr;
176 if (summary1) {
179 else {
180 Trk::TrackSummary* tmpSum = summary1;
183 }
184 if (muonSummary1) nhits1 = muonSummary1->
netaHits() + muonSummary1->
nphiHits();
185 } else {
186 Trk::TrackSummary tmpSummary;
189 if (muonSummary1) nhits1 = muonSummary1->
netaHits() + muonSummary1->
nphiHits();
190 }
191
192 int nhits2 = -1;
193 Trk::TrackSummary* summary2 =
track.trackSummary();
194 Trk::MuonTrackSummary* muonSummary2 = nullptr;
195 if (summary2) {
198 else {
199 Trk::TrackSummary* tmpSum = summary2;
202 }
203 if (muonSummary2) nhits2 = muonSummary2->
netaHits() + muonSummary2->
nphiHits();
204 } else {
205 Trk::TrackSummary tmpSummary;
208 if (muonSummary2) nhits2 = muonSummary2->
netaHits() + muonSummary2->
nphiHits();
209 }
210
211 if (nhits0 != -1 && nhits1 != -1 && nhits2 != -1) {
212 if (nhits0 == nhits1 && nhits0 == nhits2) doSelection = true;
213 }
214
216 }
217
218 if (doSelection) {
219
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"}
224 }};
225
226
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);
229 });
230
232 std::unique_ptr<Trk::Track> bestTrack=std::move(std::get<0>(*best));
233 return bestTrack;
234 }
235 return nullptr;
236 }
237 return refittedTrack;
238 }
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
double chiSquared() const
returns the of the overall track fit
unsigned int netaHits() const
number of eta hits on the track
unsigned int nphiHits() const
number of phi hits on the track
const Amg::Vector3D & momentum() const
Access method for the momentum.
const MuonTrackSummary * muonTrackSummary() const
returns a pointer to the MuonTrackSummary if available
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
best(iterable, priorities=[3, 2, 1, -1, 0])