313 {
314
317
318 std::vector<std::unique_ptr<MuPatTrack> > resultAll;
319
320
323
325
326 std::vector<std::unique_ptr<MuPatTrack> >
result;
327
328
330
332
333 std::set<StIndex> stations;
334
335 for (
unsigned int lit = 0; lit <
strategy.getAll().size(); ++lit) {
336 std::vector<ChIndex> chambers =
strategy.getCh(lit);
337
338
340
341 for (unsigned int chin = 0; chin < chambers.size(); ++chin) {
342
344
345
346 if (stations.count(stIndex)) continue;
347 SegCol& segments = stationSegments[
toInt(stIndex)];
348
349
350
352
353 for (unsigned int iseg = 0; iseg < segments.size(); iseg++) {
354 double thetaSeg = std::abs((*segments[iseg]).segment->globalPosition().theta());
355
356
357 if ((0.74159 > thetaSeg && thetaSeg > 0.51159) || (2.63 > thetaSeg && thetaSeg > 2.40))
358 mySegColVec[lit].push_back(segments[iseg]);
359 }
360 } else {
361 mySegColVec[lit].insert(mySegColVec[lit].
end(), segments.begin(), segments.end());
362 }
363
364 stations.insert(stIndex);
365 }
366
367 } else {
368
369 for (unsigned int chin = 0; chin < chambers.size(); ++chin) {
370 SegCol& segments = chamberSegments[
toInt(chambers[chin])];
371
372 mySegColVec[lit].insert(mySegColVec[lit].
end(), segments.begin(), segments.end());
373 }
374 }
375
376 }
377
378
379 for (unsigned int lit = 0; lit < mySegColVec.size(); ++lit) {
381 }
382
384 bool hasSegments = false;
385 for (unsigned int lit = 0; lit < mySegColVec.size(); ++lit) {
386 if (!mySegColVec[lit].
empty()) {
387 hasSegments = true;
388 break;
389 }
390 }
391 if (hasSegments) {
393 for (unsigned int lit = 0; lit < mySegColVec.size(); ++lit)
394 for (unsigned int sit = 0; sit < mySegColVec[lit].size(); ++sit)
398 }
399 }
400
401
403
404
405 std::vector<unsigned int> seeds;
406
407
409
410 std::vector<std::pair<int, unsigned int> > occupancy;
411 for (unsigned int lit = 0; lit < mySegColVec.size(); ++lit) {
412 occupancy.emplace_back(mySegColVec[lit].size(), lit);
413 }
415 for (unsigned int lit = 0; lit < occupancy.size(); ++lit) { seeds.push_back(occupancy[lit].second); }
416 } else {
418 if (seeds.empty()) {
419 for (unsigned int j = 0; j < mySegColVec.size(); ++j) seeds.push_back(j);
420 }
421 }
423
424 MuPatSegment* seedSeg = nullptr;
425
426 for (unsigned int lin = 0; lin < seeds.size(); ++lin) {
427
428 ATH_MSG_VERBOSE(
"New seed layer " << lin <<
" segments in layer " << mySegColVec[lin].size());
429
430 for (
unsigned int sin = 0;
sin < mySegColVec[lin].size();
sin++) {
431 seedSeg = mySegColVec[lin].operator[](
sin);
432 if (!seedSeg) continue;
433
434
435 if (cutSeeds && seedSeg->usedInFit) continue;
436
437
439 (
m_segQCut[0] == -99 && !(seedSeg->segQuality && seedSeg->segQuality->isStrict())))
440 continue;
442
443 int segsInCone = 0;
444 double phiSeed = seedSeg->segment->globalPosition().phi();
445 double etaSeed = seedSeg->segment->globalPosition().eta();
446 for (unsigned int sin2 = 0; sin2 < mySegColVec[lin].size(); sin2++) {
447 if (sin == sin2) continue;
448 MuPatSegment* seg = mySegColVec[lin].operator[](sin2);
449
450 if (seg->quality <
m_segQCut[0] || (
m_segQCut[0] == -99 && !(seg->segQuality && seg->segQuality->isStrict())))
451 continue;
452
453 double phiSeg = seg->segment->globalPosition().phi();
454 double etaSeg = seg->segment->globalPosition().eta();
455
457 double deltaEta = std::abs(etaSeed - etaSeg);
459
460 if (
deltaR < 0.35) segsInCone++;
461 }
462 ATH_MSG_VERBOSE(
"New seed " << sin <<
" segments in cone " << segsInCone);
463
465
466 std::vector<std::unique_ptr<MuPatTrack> >
found =
468
470 if (!
found.empty()) {
471 result.insert(
result.end(), std::make_move_iterator(
found.begin()), std::make_move_iterator(
found.end()));
472 }
473 }
474 }
475
476
478
479
480 if (msgLvl(MSG::DEBUG) && !
result.empty()) {
483 }
484
486
488 resultAll.insert(resultAll.end(), std::make_move_iterator(
result.begin()), std::make_move_iterator(
result.end()));
489
490 }
491
493
495 SegCol& emSegments = stationSegments[
toInt(StIndex::EM)];
496
497 if (!emSegments.empty()) {
498 for (MuPatSegment* sit : emSegments) {
499
500 if (!sit->tracks().empty()) continue;
501
502
503 if (sit->quality < 2) continue;
504
505
506 std::unique_ptr<Trk::Track> segmentTrack(
m_segmentFitter->fit(*sit->segment));
507 if (segmentTrack) {
508
510 if (recoveredTrack) segmentTrack.swap(recoveredTrack);
511
512
515 }
516
517 std::unique_ptr<MuPatTrack>
can =
m_candidateTool->createCandidate(*sit, segmentTrack);
518 if (can)
519 resultAll.push_back(std::move(can));
520 else
522 }
523 }
524 }
525 }
526
527
528 if (!resultAll.empty()) {
531 else
533 }
534 std::unique_ptr<TrackCollection> finalTrack = nullptr;
535 if (!resultAll.empty()) { finalTrack =
selectTracks(resultAll); }
536
537 return finalTrack;
538 }
std::unique_ptr< TrackCollection > selectTracks(std::vector< std::unique_ptr< MuPatTrack > > &candidates, bool takeOwnership=true) const
ToolHandle< IMuonHoleRecoveryTool > m_muonHoleRecoverTool
void refineTracks(const EventContext &ctx, std::vector< std::unique_ptr< MuPatTrack > > &candidates) const
void solveAmbiguities(std::vector< std::unique_ptr< MuPatTrack > > &tracks, const MuonTrackSteeringStrategy *strat=nullptr) const
Resolve ambiguities among tracks for a single strategy This allows a strategy-specific ambiguity solv...
std::vector< std::unique_ptr< MuPatTrack > > findTrackFromSeed(const EventContext &ctx, MuPatSegment &seedSeg, const MuonTrackSteeringStrategy &strat, const unsigned int layer, const SegColVec_t &segs) const
Find tracks starting from a good segment.
std::vector< SegCol > SegColVec_t
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
ToolHandle< IMuonSegmentFittingTool > m_segmentFitter
StIndex toStationIndex(ChIndex index)
convert ChIndex into StIndex