95 {
96 std::unique_ptr<TrackCollection> newTracks(std::make_unique<TrackCollection>());
97 std::array< std::array<std::atomic<int>,
Nregions>,
nTypes> counters{};
98
99 for (const Trk::Track* thisTrack : *pTracks) {
100
103
104 TrackExtensionMap::const_iterator pThisExtensionPair = trackExtensionMap->find(thisTrack);
105
106 if (pThisExtensionPair == trackExtensionMap->end()) {
107 ATH_MSG_DEBUG(
"track not in extension map, copy original track to output");
108
109 std::unique_ptr<Trk::Track> ntrk(std::make_unique<Trk::Track>(*thisTrack));
111 newTracks->push_back(std::move(ntrk));
112
114 } else {
115 ATH_MSG_DEBUG(
"track found in extension map, processing...");
116
118
119 std::unique_ptr<Trk::Track> newtrack;
120
121 const Trk::TrackInfo oldTrackInfo = thisTrack->info();
122
123 const auto nRIO_OnTrack {pThisExtensionPair->second.size()};
124 std::vector<const Trk::PrepRawData*> vecPrd;
125 vecPrd.reserve(nRIO_OnTrack);
126
128 auto getPrepRawDataPtr = [](
const Trk::MeasurementBase*
m) {
129 const auto& pRot =
dynamic_cast <const Trk::RIO_OnTrack*
>(
m);
130 return pRot ? pRot->prepRawData() : nullptr;
131 };
132 const auto& theRIOs_OnTrack {pThisExtensionPair->second};
133
134 std::transform(theRIOs_OnTrack.begin(), theRIOs_OnTrack.end(), std::back_inserter(vecPrd), getPrepRawDataPtr);
135
136 ATH_MSG_DEBUG(
"fit track " << thisTrack <<
" with PRDs, number : " << vecPrd.size());
138
141
143
146 } else {
148
150
154 thisTrack->trackParameters()->front()->pT() >
m_pTminBrem &&
157 ATH_MSG_DEBUG(
"normal fit track failed, try to recover with brem fit");
158
160
162 }
163 }
164 } else {
165
166 std::vector<const Trk::PrepRawData*> vecPrdComb;
167
168 const Trk::Perigee* siPerigee = thisTrack->perigeeParameters();
169 if (!siPerigee) {
171
173
174 std::unique_ptr<Trk::Track> ntrk(std::make_unique< Trk::Track>(*thisTrack));
176 newTracks->push_back(std::move(ntrk));
177 } else {
178
180 pThisExtensionPair->first->measurementsOnTrack()->begin();
181 for (; RIOit != pThisExtensionPair->first->measurementsOnTrack()->
end(); ++RIOit) {
182 const Trk::RIO_OnTrack* rot = dynamic_cast <const Trk::RIO_OnTrack*> (*RIOit);
183 if (!rot)
ATH_MSG_ERROR(
"cast to ROT failed, should not happen here !");
185 }
186
187 for (auto & i : vecPrd) {
188 double inprod =
189 (
i->detectorElement()->surface(
i->identify()).center() - siPerigee->
position()).dot(
191 if (inprod < 0) {
192 vecPrdComb.insert(vecPrdComb.begin(), i);
193 } else {
194 vecPrdComb.push_back(i);
195 }
196 }
197
199
202 }
203 }
204 } else {
205 const auto& RIOs_OnTrack {pThisExtensionPair->second};
206
207 ATH_MSG_DEBUG(
"fit track " << thisTrack <<
" with ROTs, number : " << RIOs_OnTrack.size());
211
213
215 } else {
217
219
222 thisTrack->trackParameters()->front()->pT() >
m_pTminBrem &&
224 ATH_MSG_DEBUG(
"normal fit track failed, try to recover with brem fit");
225
227
229 }
230 }
231 } else {
232
234
235 const Trk::Perigee* siPerigee = thisTrack->perigeeParameters();
236 if (!siPerigee) {
238
240
241 std::unique_ptr<Trk::Track> ntrk(std::make_unique< Trk::Track>(*thisTrack));
243 newTracks->push_back(std::move(ntrk));
244 } else {
245
247 pThisExtensionPair->first->measurementsOnTrack()->begin();
248 for (; RIOit != pThisExtensionPair->first->measurementsOnTrack()->
end(); ++RIOit) {
249 rotSet.push_back(*RIOit);
250 }
251
252 for (const auto *i : pThisExtensionPair->second) {
253 double inprod = (
i->associatedSurface().center() - siPerigee->
position()).dot(
255 if (inprod < 0) {
256 rotSet.insert(rotSet.begin(), i);
257 } else {
258 rotSet.push_back(i);
259 }
260 }
262
264
266 }
267 }
268 }
269 if (!newtrack) {
270 ATH_MSG_DEBUG(
"refit of extended track failed, copy original track to output");
271
273
276 } else {
277
278 std::unique_ptr<Trk::Track> ntrk(std::make_unique<Trk::Track>(*thisTrack));
280 newTracks->push_back(std::move(ntrk));
281 }
282 } else {
283
287 bool passBasicSelections =
m_scoringTool->passBasicSelections(*newtrack);
288 if(passBasicSelections){
291 }
292 bool recheckBasicSel = false;
294 }
296
299 thisTrack->trackParameters()->front()->pT() >
m_pTminBrem &&
301 ATH_MSG_DEBUG(
"new track has low score, try to recover track using brem fit");
302
304 std::unique_ptr<Trk::Track> newBremTrack;
305
308 } else {
310 }
311 if (newBremTrack) {
312
313
316 }
318 ATH_MSG_DEBUG(
"recovered new track has score : " << newScore);
319
320 newtrack = std::move(newBremTrack);
321 }
322 }
323 if (newScore >= oldScore) {
325
329 }
330
331 newtrack->info().addPatternReco(oldTrackInfo);
332
334 newTracks->push_back(std::move(newtrack));
335 } else {
337
339
340 std::unique_ptr<Trk::Track> ntrk;
343 } else {
344 ntrk = std::make_unique<Trk::Track>(*thisTrack);
345 }
347 newTracks->push_back(std::move(ntrk));
348 }
349 }
350 }
351 }
352
353 {
354
356 }
357 return newTracks.release();
358}
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
void incrementRegionCounter(std::array< std::atomic< int >, 4 > &, const Trk::Track *, bool=true) const
monitoring and validation: does success/failure counting for each detector region
Trk::Track * trackPlusExtension(const EventContext &ctx, const Trk::Track *, const std::vector< const Trk::MeasurementBase * > &) const
internal structuring: creates new track with original one plus extension as outliers
FloatProperty m_pTminBrem
BooleanProperty m_suppressHoleSearch
BooleanProperty m_caloSeededBrem
Trk::ParticleHypothesis m_particleHypothesis
nomen est omen
PublicToolHandle< Trk::ITrackFitter > m_trackFitter
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
PublicToolHandle< Trk::ITrackScoringTool > m_scoringTool
BooleanProperty m_cosmics
BooleanProperty m_refitPrds
BooleanProperty m_keepFailedExtensionOnTrack
Gaudi::Property< Trk::RunOutlierRemoval > m_runOutlier
BooleanProperty m_tryBremFit
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & position() const
Access method for the position.
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
@ BremFit
A brem fit was performed on this track.
@ TrackInCaloROI
A track in a CaloROI.
@ InDetExtensionProcessor
Tracks with InDetExtensionProcessor used.
std::vector< const MeasurementBase * > MeasurementSet
vector of fittable measurements
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee