138{
139 int segmentCounter=0;
140 const EventContext& ctx = Gaudi::Hive::currentContext();
142
144
146
147
150
151
152
154 if (!inputSegments.isValid()) {
156 sc = StatusCode::FAILURE;
158 }
159
160
161
162
164 ATH_CHECK(final_outputTrackCollection.record(std::make_unique<TrackCollection>()));
165
166 std::vector<std::unique_ptr<Trk::Track> > output_track_collection;
167
168
171
172 if (!truthCollectionTRT.isValid()){
174 return StatusCode::FAILURE;
175 }
176 }
177
180
181
182
183 for(iseg=inputSegments->begin(); iseg != isegEnd; ++ iseg) {
184
185 segmentCounter++;
186
187
188 if((*iseg)->numberOfMeasurementBases()<10) continue;
189
191 for(
unsigned int i=0;
i<(*iseg)->numberOfMeasurementBases();++
i){
192 const Amg::VectorX& LocalParameters = (*iseg)->measurement(i)->localParameters();
193 const Amg::MatrixX& LocalErrorMatrix = (*iseg)->measurement(i)->localCovariance();
194 double z=(*iseg)->measurement(i)->globalPosition().z();
195 ATH_MSG_DEBUG(
"Segment "<<segmentCounter<<
" rioOnTrack "<<i<<
" (z="<<
z<<
") : "<<LocalParameters[0]
197 myset.push_back((*iseg)->measurement(i));
198 }
199
200 if((*iseg)->numberOfMeasurementBases()>0){
201 ATH_MSG_DEBUG(
"numberOfContainedRots: " << (*iseg)->numberOfMeasurementBases());
202
203 const Trk::StraightLineSurface* testSf
204 = dynamic_cast<const Trk::StraightLineSurface*>(&((*iseg)->associatedSurface()));
205
206
210
211 if(!testSf){
212 ATH_MSG_DEBUG(
"No straightLineSurface !! Trying Perigee ...");
213 const Trk::PerigeeSurface *testPSf=dynamic_cast<const Trk::PerigeeSurface*>(&((*iseg)->associatedSurface()));
214
215 if(!testPSf){
216 ATH_MSG_DEBUG(
"Associated surface dynamic_cast into PerigeeSurface failed: "<<(*iseg)->associatedSurface());
217 ATH_MSG_DEBUG(
"Leaving input matching perigee as nullptr, will not get a fittedTrack");
218 }else{
221 }
222 }else{
224
226 int nmeas=(*iseg)->numberOfMeasurementBases();
227 Amg::Vector3D surfpos(.5*((*iseg)->measurement(nmeas/2)->globalPosition()+(*iseg)->measurement(nmeas/2+1)->globalPosition()));
228 Trk::PerigeeSurface persurf(surfpos);
229 std::unique_ptr<const Trk::TrackParameters>
tmp =
230 m_extrapolator->extrapolateDirectly(ctx, *inputMatchLine, persurf);
233 }
234 }
236
237 std::unique_ptr<Trk::Track> fittedTrack;
239 if (inputMatchPerigee) inputpar=inputMatchPerigee;
240 else if (inputMatchLine) inputpar=inputMatchLine;
241
242 if (inputpar) {
244 myset,
245 *inputpar,
248 }
249 if(fittedTrack){
253 double mindist=9999;
254 for ( ; itSet!=itSetEnd; ++itSet) {
256 mindist=(**itSet).trackParameters()->position().perp();
257 measpar=(**itSet).trackParameters();
258 }
259 }
260 std::unique_ptr<Trk::TrackParameters> myper;
261 if (measpar){
263 }
264 if (!myper){
265 fittedTrack.reset();
266 }
267 else {
268 auto trajectory = std::make_unique<Trk::TrackStates>();
269 itSet = fittedTrack->trackStateOnSurfaces()->begin();
270 for ( ; itSet!=itSetEnd; ++itSet) {
272 auto trackpar=(**itSet).trackParameters() ? (**itSet).trackParameters()->uniqueClone() : nullptr;
273 auto measurement=(**itSet).measurementOnTrack() ? (**itSet).measurementOnTrack()->uniqueClone() : nullptr;
274 auto fitQual=(**itSet).fitQualityOnSurface() ;
275 auto mateff=(**itSet).materialEffectsOnTrack() ? (**itSet).materialEffectsOnTrack()->uniqueClone() : nullptr;
276 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern(0);
281 trajectory->push_back(
282 new Trk::TrackStateOnSurface(fitQual,
283 std::move(measurement),
284 std::move(trackpar),
285 std::move(mateff),
286 typePattern));
287 }
288 }
289 bool peradded=false;
290 itSet = trajectory->begin()+1;
291 itSetEnd = trajectory->end();
292 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern(0);
294 const auto myPosition {myper->position()};
296 const Trk::TrackStateOnSurface* pertsos =
297 new Trk::TrackStateOnSurface(nullptr,
298 std::move(myper),
299 nullptr,
300 typePattern);
301
303 for ( ; itSet!=itSetEnd; ++itSet) {
304 double inprod1=((**itSet).trackParameters()->position()-myPosition).dot(myMomentum);
305 --itSet;
306 double inprod2=((**itSet).trackParameters()->position()-myPosition).dot(myMomentum);
307 ++itSet;
308 if (inprod1>0 && inprod2<0) {
309 trajectory->insert(trajectory->begin()+index,pertsos);
310 peradded=true;
311 break;
312 }
314 }
315 if (!peradded){
316 itSet = trajectory->begin();
317 double inprod=((**itSet).trackParameters()->position()-myPosition).dot(myMomentum);
318 if (inprod>0) trajectory->insert(trajectory->begin(),pertsos);
319 else trajectory->push_back(pertsos);
320 }
321 std::unique_ptr<Trk::Track>
track =
322 std::make_unique<Trk::Track>(fittedTrack->info(),
323 std::move(trajectory),
324 fittedTrack->fitQuality()->uniqueClone());
325 fittedTrack = std::move(track);
326 }
327 }
328 if(fittedTrack){
329
330 int nHT=
nHTHits(fittedTrack.get());
333 if ((*iseg)->fitQuality())
ATH_MSG_DEBUG(
"Quality of Segment: chi^2 /ndof "<<(*iseg)->fitQuality()->chiSquared()<<
" / "<<(*iseg)->fitQuality()->numberDoF());
334 ATH_MSG_DEBUG(
"Quality of Track: chi^2 /ndof "<<fittedTrack->fitQuality()->chiSquared()<<
" / "<<fittedTrack->fitQuality()->numberDoF());
337
341
342 int nhits=(*iseg)->numberOfMeasurementBases();
343 ATH_MSG_DEBUG(
"Real/Noise : "<< truefraction <<
" chi2="<<fittedTrack->fitQuality()->chiSquared()/
double(fittedTrack->fitQuality()->numberDoF()));
344 if(truefraction>0.5){
346
349 }else{
351 }
352
355 }else{
357
360 }else{
362 }
363
365 }
366 }
367 output_track_collection.push_back(std::move(fittedTrack));
368 }else{
370 }
371
372 }else{
374 }
375
376 delete inputMatchLine;
377 delete inputMatchPerigee;
378
379 }
380 }
381
382 std::unique_ptr<Trk::PRDtoTrackMap> prd_to_track_map;
384
385 prd_to_track_map =
m_assoTool->createPRDtoTrackMap();
388 if (!input_asso_map.isValid()) {
390 }
391 *prd_to_track_map = *input_asso_map;
393 }
394 for (const std::unique_ptr<Trk::Track> &track : output_track_collection) {
396 }
397 }
398
399 final_outputTrackCollection->reserve(output_track_collection.size());
401 for (std::unique_ptr<Trk::Track> &track : output_track_collection) {
402 m_trkSummaryTool->computeAndReplaceTrackSummary(*track,prd_to_track_map.get());
403 final_outputTrackCollection->push_back(std::move(track));
404 }
405 }
406 else {
407 for (std::unique_ptr<Trk::Track> &track : output_track_collection) {
408 final_outputTrackCollection->push_back(std::move(track));
409 }
410 }
413 }
414
415 if (!final_outputTrackCollection.isValid()) {
416
418 return StatusCode::FAILURE;
419
420 }
421
423}
#define ATH_CHECK
Evaluate an expression and check for errors.
double getNoiseProbability(const Trk::Track *track) const
Get the fraction of noise TRT hits on this Track.
int nHTHits(const Trk::Track *track) const
Count number of TRT HT Hits on track.
ToolHandle< Trk::IExtrapolator > m_extrapolator
The Extrapolator.
SG::ReadHandleKey< Trk::SegmentCollection > m_inputSegmentCollectionName
Name of the TrackSegment Collection to read in.
double getRealFractionTRT(const Trk::Track *track, const EventContext &ctx) const
Get the fraction of truth TRT hits on this Track.
ToolHandle< Trk::IPRDtoTrackMapTool > m_assoTool
void combineSegments(const EventContext &ctx) const
SG::ReadHandleKey< PRD_MultiTruthCollection > m_multiTruthCollectionTRTName
Name of the TRT MultiTruthCollection.
std::map< int, int > m_MapReal
Map of hits and real tracks.
std::map< int, int > m_MapFake
Map of hits and fake tracks.
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trkSummaryTool
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_inputAssoMapName
key to be set to optionally store PRD to track association map
SG::WriteHandleKey< TrackCollection > m_outputTrackCollectionName
Name of the TrackCollection to write out.
SG::WriteHandleKey< Trk::PRDtoTrackMap > m_assoMapName
key for the PRDtoTrackMap to filled by the ambiguity score processor.
int nTRTHits(const Trk::Track *track) const
Count number of TRT Hits on track.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
@ BremPoint
This represents a brem point on the track, and so will contain TrackParameters and MaterialEffectsBas...
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
@ Scatterer
This represents a scattering point on the track, and so will contain TrackParameters and MaterialEffe...
ParametersBase< TrackParametersDim, Charged > TrackParameters