ATLAS Offline Software
Loading...
Searching...
No Matches
L0Muon::TgcL0Floating::SegmentReconstruction Class Reference

Reconstruct same-BC inter-station segments and transient candidates. More...

#include <TgcL0SegmentReconstruction.h>

Collaboration diagram for L0Muon::TgcL0Floating::SegmentReconstruction:

Public Member Functions

 SegmentReconstruction (SegmentReconstructionConfig config=SegmentReconstructionConfig{})
StatusCode build (const StationCoincidenceContainer &coincidences, TgcL0CandidateContainer &candidates, SegmentStatistics &statistics, TgcL0SegmentContainer *validationSegments=nullptr) const

Private Attributes

SegmentReconstructionConfig m_config {}

Detailed Description

Reconstruct same-BC inter-station segments and transient candidates.

Definition at line 63 of file TgcL0SegmentReconstruction.h.

Constructor & Destructor Documentation

◆ SegmentReconstruction()

L0Muon::TgcL0Floating::SegmentReconstruction::SegmentReconstruction ( SegmentReconstructionConfig config = SegmentReconstructionConfig{})
explicit

Definition at line 537 of file TgcL0SegmentReconstruction.cxx.

538 : m_config{std::move(config)} {}

Member Function Documentation

◆ build()

StatusCode L0Muon::TgcL0Floating::SegmentReconstruction::build ( const StationCoincidenceContainer & coincidences,
TgcL0CandidateContainer & candidates,
SegmentStatistics & statistics,
TgcL0SegmentContainer * validationSegments = nullptr ) const

Definition at line 540 of file TgcL0SegmentReconstruction.cxx.

544 {
545 candidates.clear();
546 statistics = SegmentStatistics{};
547 if (validationSegments != nullptr) validationSegments->clear();
548
549 using Projections =
550 std::array<std::array<std::vector<const Coincidence*>, 3>, 2>;
551 std::map<GroupKey, Projections> grouped;
552 for (const Coincidence& coincidence : coincidences) {
553 if (stationBit(coincidence.station) == 0U) continue;
554 const std::size_t projection = coincidence.isStrip ? 1U : 0U;
555 grouped[coincidence.key][projection][stationIndex(coincidence.station)]
556 .emplace_back(&coincidence);
557 }
558
559 std::set<CandidateKey> candidateKeys;
560 for (const auto& [groupKey, projections] : grouped) {
561 const std::vector<ProjectionSegment> wireSegments =
562 buildProjectionSegments(projections[0], false, m_config, statistics);
563 const std::vector<ProjectionSegment> stripSegments =
564 buildProjectionSegments(projections[1], true, m_config, statistics);
565 statistics.nWireSegments += wireSegments.size();
566 statistics.nStripSegments += stripSegments.size();
567 if (validationSegments != nullptr) {
568 appendValidationSegments(groupKey, wireSegments, *validationSegments);
569 appendValidationSegments(groupKey, stripSegments, *validationSegments);
570 }
571
572 std::vector<CandidatePair> pairs;
573 pairs.reserve(wireSegments.size() * stripSegments.size());
574 for (const ProjectionSegment& wire : wireSegments) {
575 if (m_config.maxCandidateDThetaAbs >= 0.F &&
576 std::abs(wire.residual) > m_config.maxCandidateDThetaAbs) {
577 statistics.nRejectedPairs += stripSegments.size();
578 continue;
579 }
580 for (const ProjectionSegment& strip : stripSegments) {
581 if (m_config.maxCandidateDPhiAbs >= 0.F &&
582 std::abs(strip.residual) > m_config.maxCandidateDPhiAbs) {
583 ++statistics.nRejectedPairs;
584 continue;
585 }
586 const PositionPair position =
587 selectPositionPair(wire, strip, m_config);
588 if (!position) {
589 ++statistics.nRejectedPairs;
590 continue;
591 }
592 const std::uint8_t positionMask = static_cast<std::uint8_t>(
593 wire.stationMask & strip.stationMask);
594 const std::uint8_t combinedMask = static_cast<std::uint8_t>(
595 wire.stationMask | strip.stationMask);
596 if (std::popcount(static_cast<unsigned int>(combinedMask)) < 2) {
597 ++statistics.nRejectedPairs;
598 continue;
599 }
600 pairs.emplace_back(
601 CandidatePair{&wire, &strip, position, positionMask, combinedMask});
602 }
603 }
604
605 pruneLocalCandidateBins(pairs, m_config, statistics);
606 suppressLocalPositionDuplicates(pairs, m_config, statistics);
607 retainCandidateWorkingSet(pairs,
608 m_config.maxSegmentCombinationsPerGroup,
609 statistics);
610
611 for (const CandidatePair& pair : pairs) {
612 const CandidateKey keyValue = candidateKey(groupKey, pair);
613 if (!candidateKeys.insert(keyValue).second) {
614 ++statistics.nDuplicateCandidates;
615 continue;
616 }
617
618 const ProjectionSegment& wire = *pair.wire;
619 const ProjectionSegment& strip = *pair.strip;
620 TgcL0Candidate candidate;
621 candidate.subdetectorId = groupKey.subDetectorId;
622 candidate.sectorId = groupKey.triggerSector;
623 candidate.readoutSector = pair.position.wire->detectorSector;
624 candidate.bcTag = groupKey.bcTag;
625 candidate.eta = pair.position.wire->eta;
626 candidate.phi = pair.position.strip->phi;
627 candidate.deltaTheta = wire.outputResidual;
628 candidate.deltaPhi = strip.outputResidual;
629 candidate.wireStationMask = wire.stationMask;
630 candidate.stripStationMask = strip.stationMask;
631 candidate.positionStationMask = pair.positionStationMask;
632 candidate.stationMask = candidate.positionStationMask;
633 candidate.m1WireQuality = quality(wire, Station::M1);
634 candidate.m2WireQuality = quality(wire, Station::M2);
635 candidate.m3WireQuality = quality(wire, Station::M3);
636 candidate.m1StripQuality = quality(strip, Station::M1);
637 candidate.m2StripQuality = quality(strip, Station::M2);
638 candidate.m3StripQuality = quality(strip, Station::M3);
639 candidate.pivotWireChannel = pair.position.wire->channel;
640 candidate.pivotStripChannel = pair.position.strip->channel;
641
642 if ((candidate.positionStationMask & 0x1U) != 0U) {
643 candidate.m1Eta = wire.points[0]->eta;
644 candidate.m1Phi = strip.points[0]->phi;
645 candidate.m1StationEta = wire.points[0]->stationEta;
646 candidate.m1StationPhi = wire.points[0]->stationPhi;
647 }
648 if ((candidate.positionStationMask & 0x2U) != 0U) {
649 candidate.m2Eta = wire.points[1]->eta;
650 candidate.m2Phi = strip.points[1]->phi;
651 candidate.m2StationEta = wire.points[1]->stationEta;
652 candidate.m2StationPhi = wire.points[1]->stationPhi;
653 }
654 if ((candidate.positionStationMask & 0x4U) != 0U) {
655 candidate.m3Eta = wire.points[2]->eta;
656 candidate.m3Phi = strip.points[2]->phi;
657 candidate.m3StationEta = wire.points[2]->stationEta;
658 candidate.m3StationPhi = wire.points[2]->stationPhi;
659 }
660 candidate.wireQuality = wire.summedQuality;
661 candidate.selectorPriority = static_cast<std::uint8_t>(
662 2U * std::popcount(
663 static_cast<unsigned int>(pair.combinedStationMask)) +
664 wire.summedQuality + strip.summedQuality);
665 candidates.emplace_back(candidate);
666 countPositionMask(candidate.positionStationMask, statistics);
667 }
668 }
669 return StatusCode::SUCCESS;
670}
const Amg::Vector3D & position() const
Method to retrieve the position of the Intersection.

Member Data Documentation

◆ m_config

SegmentReconstructionConfig L0Muon::TgcL0Floating::SegmentReconstruction::m_config {}
private

Definition at line 74 of file TgcL0SegmentReconstruction.h.

74{};

The documentation for this class was generated from the following files: