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 535 of file TgcL0SegmentReconstruction.cxx.

536 : 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 538 of file TgcL0SegmentReconstruction.cxx.

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