ATLAS Offline Software
Loading...
Searching...
No Matches
MuonR4::NswSegmentFinderAlg Class Reference

#include <NswSegmentFinderAlg.h>

Inheritance diagram for MuonR4::NswSegmentFinderAlg:
Collaboration diagram for MuonR4::NswSegmentFinderAlg:

Classes

class  SeedStatistics
 Seed statistics per sector to be printed in the end. More...

Public Member Functions

virtual ~NswSegmentFinderAlg ()=default
virtual StatusCode initialize () override
virtual StatusCode execute (const EventContext &ctx) const override
virtual StatusCode finalize () override
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
virtual void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

enum class  StripOrient {
  U , V , X , P ,
  C , Unknown
}
 Enumeration to classify the orientation of a NSW strip. More...
enum class  HitWindow { tooLow , inside , tooHigh }
 To fastly check whether a hit is roughly compatible with a muon trajectory a narrow corridor is opened from the estimated beamspot to the first tested hit in the seed finding. More...
using HitVec = SpacePointPerLayerSplitter::HitVec
using HitLayVec = SpacePointPerLayerSplitter::HitLayVec
using HitLaySpan_t = std::vector<std::reference_wrapper<const HitVec>>
 Abbrivation of the space comprising multiple hit vectors without copy.
using UsedHitMarker_t = std::vector<std::vector<unsigned int>>
 Abbrivation of the container book keeping whether a hit is used or not.
using UsedHitSpan_t = std::vector<std::reference_wrapper<std::vector<unsigned int>>>
 Abbrivation of the container to pass a subset of markers wtihout copy.
using InitialSeed_t = std::array<const SpacePoint*, 4>
 Abbrivation of the initial seed.
using InitialSeedVec_t = std::vector<InitialSeed_t>
 Vector of initial seeds.
using SegmentSeedVec_t = std::vector<std::unique_ptr<SegmentSeed>>
 Abbrivation of the seed vector.
using SegmentVec_t = std::vector<std::unique_ptr<Segment>>
 Abbrivation of the final segment vector.
typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

StripOrient classifyStrip (const SpacePoint &spacePoint) const
 Determines the orientation of the strip space point.
UsedHitMarker_t emptyBookKeeper (const HitLayVec &sortedSp) const
 Constructs an empty HitMarker from the split space points.
HitWindow hitFromIPCorridor (const SpacePoint &testHit, const Amg::Vector3D &beamSpotPos, const Amg::Vector3D &dirEstUp, const Amg::Vector3D &dirEstDn) const
 The hit is above the predefined corridor.
void constructPreliminarySeeds (const Amg::Vector3D &beamSpot, const HitLaySpan_t &combinatoricLayers, const UsedHitSpan_t &usedHits, InitialSeedVec_t &outVec) const
 Construct a set of prelimnary seeds from the selected combinatoric layers.
std::unique_ptr< SegmentSeedconstructCombinatorialSeed (const InitialSeed_t &initialSeed, const AmgSymMatrix(2)&bMatrix, const HoughMaximum &max, const HitLaySpan_t &extensionLayers, const UsedHitSpan_t &usedHits) const
 Construct a combinatorial seed from the initial 4-layer seed hits.
std::pair< SegmentSeedVec_t, SegmentVec_tbuildSegmentsFromMM (const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const HitLayVec &hitLayers, const HoughMaximum &max, const Amg::Vector3D &beamSpotPos, UsedHitMarker_t &usedHits, bool useOnlyMM) const
 Build the final segment seed from strip like measurements using the combinatorial seeding for MicroMegas (or strip measurements) logic.
std::pair< SegmentSeedVec_t, SegmentVec_tbuildSegmentsFromSTGC (const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const HitLayVec &hitLayers, const HoughMaximum &max, const Amg::Vector3D &beamSpotPos, UsedHitMarker_t &usedHits) const
 Build the segment for a seed from STGC 2D measurement layers directly and then attempt to append hits from the other layers.
std::unique_ptr< SegmentfitSegmentSeed (const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const SegmentSeed *patternSeed) const
 Fit the segment seeds.
void processSegment (std::unique_ptr< Segment > segment, const HitVec &seedHits, const HitLayVec &hitLayers, UsedHitMarker_t &usedHits, SegmentVec_t &segments) const
 Process the segment and mark the hits if it is successfully built or not by differently mark the hits as used.
void markHitsAsUsed (const HitVec &spacePoints, const HitLayVec &allSortHits, UsedHitMarker_t &usedHitMarker, unsigned int increase, bool markNeighborHits) const
 Hits that are used in a good seed/segment built should be flagged as used and not contribute to other seed.
HitVec extendHits (const Amg::Vector3D &startPos, const Amg::Vector3D &direction, const HitLaySpan_t &extensionLayers, const UsedHitSpan_t &usedHits) const
 Extend the seed with the hits from the other layers.
std::pair< SegmentSeedVec_t, SegmentVec_tfindSegmentsFromMaximum (const HoughMaximum &max, const ActsTrk::GeometryContext &gctx, const EventContext &ctx) const
 Find seed and segment from an eta hough maximum.
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

SG::ReadHandleKey< EtaHoughMaxContainerm_etaKey {this, "CombinatorialReadKey", "MuonHoughNswMaxima"}
SG::WriteHandleKey< SegmentSeedContainerm_writeSegmentSeedKey {this, "MuonNswSegmentSeedWriteKey", "MuonNswSegmentSeeds"}
SG::WriteHandleKey< SegmentContainerm_writeSegmentKey {this, "MuonNswSegmentWriteKey", "MuonNswSegments"}
SG::ReadHandleKey< ActsTrk::GeometryContextm_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"}
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
ToolHandle< MuonValR4::IPatternVisualizationToolm_visionTool {this, "VisualizationTool", ""}
 Pattern visualization tool.
ToolHandle< ISpacePointCalibratorm_calibTool {this, "Calibrator", "" }
std::unique_ptr< SegmentFit::SegmentLineFitterm_lineFitter {}
DoubleProperty m_windowTheta {this, "thetaWindow", 2.5 * Gaudi::Units::deg}
DoubleProperty m_minPullThreshold {this, "maxPull", 5.}
UnsignedIntegerProperty m_minSeedHits {this, "minSeedHits", 4}
UnsignedIntegerProperty m_maxInvalidClusters {this, "maxInvalidClusters", 4}
BooleanProperty m_markHitsFromSeed {this, "markHitsFromSeed", true}
BooleanProperty m_doOnlyMMCombinatorics {this, "doOnlyMMCombinatorics", false}
UnsignedIntegerProperty m_maxUsed {this, "maxHitIsUsed", 8}
UnsignedIntegerProperty m_minClusSize {this, "minClusterSize", 1}
DoubleProperty m_maxChi2 {this, "maxChi2", 5.}
UnsignedIntegerProperty m_maxClustersInLayer {this, "maxClustersInLayer", 8}
DoubleProperty m_maxdYWindow {this, "maxdYWindow", 4.*Gaudi::Units::cm}
BooleanProperty m_dumpSeedStatistics {this, "dumpStatistics", true}
std::unique_ptr< SeedStatistics > m_seedCounter ATLAS_THREAD_SAFE {}
const MuonGMR4::MuonDetectorManagerm_detMgr {}
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 33 of file NswSegmentFinderAlg.h.

Member Typedef Documentation

◆ HitLaySpan_t

using MuonR4::NswSegmentFinderAlg::HitLaySpan_t = std::vector<std::reference_wrapper<const HitVec>>
private

Abbrivation of the space comprising multiple hit vectors without copy.

Definition at line 112 of file NswSegmentFinderAlg.h.

◆ HitLayVec

◆ HitVec

◆ InitialSeed_t

using MuonR4::NswSegmentFinderAlg::InitialSeed_t = std::array<const SpacePoint*, 4>
private

Abbrivation of the initial seed.

Definition at line 118 of file NswSegmentFinderAlg.h.

◆ InitialSeedVec_t

Vector of initial seeds.

Definition at line 120 of file NswSegmentFinderAlg.h.

◆ SegmentSeedVec_t

using MuonR4::NswSegmentFinderAlg::SegmentSeedVec_t = std::vector<std::unique_ptr<SegmentSeed>>
private

Abbrivation of the seed vector.

Definition at line 125 of file NswSegmentFinderAlg.h.

◆ SegmentVec_t

using MuonR4::NswSegmentFinderAlg::SegmentVec_t = std::vector<std::unique_ptr<Segment>>
private

Abbrivation of the final segment vector.

Definition at line 127 of file NswSegmentFinderAlg.h.

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

◆ UsedHitMarker_t

using MuonR4::NswSegmentFinderAlg::UsedHitMarker_t = std::vector<std::vector<unsigned int>>
private

Abbrivation of the container book keeping whether a hit is used or not.

Definition at line 114 of file NswSegmentFinderAlg.h.

◆ UsedHitSpan_t

using MuonR4::NswSegmentFinderAlg::UsedHitSpan_t = std::vector<std::reference_wrapper<std::vector<unsigned int>>>
private

Abbrivation of the container to pass a subset of markers wtihout copy.

Definition at line 116 of file NswSegmentFinderAlg.h.

Member Enumeration Documentation

◆ HitWindow

enum class MuonR4::NswSegmentFinderAlg::HitWindow
strongprivate

To fastly check whether a hit is roughly compatible with a muon trajectory a narrow corridor is opened from the estimated beamspot to the first tested hit in the seed finding.

Hits in subsequent layers need to be within this corridor in order to be considered for seed construction. The HitWindow is the output classification of such a corridor test.

Enumerator
tooLow 
inside 

The hit is below the predefined corridor.

tooHigh 

The hit is inside the defined window and hence an initial candidate.

Definition at line 134 of file NswSegmentFinderAlg.h.

134 {tooLow,
135 inside,
136 tooHigh};

◆ StripOrient

enum class MuonR4::NswSegmentFinderAlg::StripOrient
strongprivate

Enumeration to classify the orientation of a NSW strip.

Enumerator

Stereo strips with positive angle.

Stereo strips with negative angle.

Ordinary eta strips.

Single phi measurements.

Unknown 

Combined 2D space point (sTGC wire + strip / sTgc pad)

Definition at line 45 of file NswSegmentFinderAlg.h.

45 {
46 U,
47 V,
48 X,
49 P,
50 C,
52 };
static Double_t P(Double_t *tt, Double_t *par)
@ Unknown
Definition TruthClasses.h:9
struct color C

Constructor & Destructor Documentation

◆ ~NswSegmentFinderAlg()

virtual MuonR4::NswSegmentFinderAlg::~NswSegmentFinderAlg ( )
virtualdefault

Member Function Documentation

◆ buildSegmentsFromMM()

std::pair< NswSegmentFinderAlg::SegmentSeedVec_t, NswSegmentFinderAlg::SegmentVec_t > MuonR4::NswSegmentFinderAlg::buildSegmentsFromMM ( const EventContext & ctx,
const ActsTrk::GeometryContext & gctx,
const HitLayVec & hitLayers,
const HoughMaximum & max,
const Amg::Vector3D & beamSpotPos,
UsedHitMarker_t & usedHits,
bool useOnlyMM ) const
private

Build the final segment seed from strip like measurements using the combinatorial seeding for MicroMegas (or strip measurements) logic.

Parameters
hitLayersReference to the hits of the strip layers
gctxThe geometry context
ctxThe event context
maxRefrence to the eta maximum from which the segment seed is constructed
beamSporPosThe beaspot position in the sector's frame to be used to constrain the hits selection
usedHitsRefrence to the book keeper of which of the hits on the extension was already used
useOnlyMM: Boolean to use only MM hits for the initial 4layer seed from the combinatorics

Definition at line 527 of file NswSegmentFinderAlg.cxx.

533 {
534
535 //go through the layers and build seeds from the combinations of hits
536 SegmentSeedVec_t seeds{};
537 SegmentVec_t segments{};
538 std::size_t layerSize = hitLayers.size();
539
540 if(layerSize < minLayers){
541 ATH_MSG_VERBOSE("Not enough layers to build a seed");
542 return {std::move(seeds), std::move(segments)};
543 }
544
545 //lamda helper to find the first unused strip hit on the layer
546 auto unusedStripHit = [&](const HitVec& layerHits, unsigned int layIdx) -> const SpacePoint* {
547 //in case of MM only combinatorial seeding - we consider only MM strip hits for seeding
548 bool isMM = useOnlyMM ? layerHits.front()->type() == xAOD::UncalibMeasType::MMClusterType : true;
549 for (auto [idx, hit] : Acts::enumerate(layerHits)) {
550 auto spOrient = classifyStrip(*hit);
551 bool isStrip = spOrient == StripOrient::X || spOrient == StripOrient::U || spOrient == StripOrient::V;
552 bool isUnused = usedHits[layIdx].at(idx) <= m_maxUsed;
553 if (isStrip && isUnused && isMM) {
554 return hit;
555 }
556 }
557 return nullptr;
558 };
559
560 std::array<const SpacePoint*, 4> seedHits{};
561 InitialSeedVec_t preLimSeeds{};
562
563 for (std::size_t i = 0; i < layerSize - 3; ++i) {
564 seedHits[0] = unusedStripHit(hitLayers[i], i);
565 if(!seedHits[0]) {
566 continue;
567 }
568 for (std::size_t j = i + 1; j < layerSize - 2; ++j) {
569 seedHits[1] = unusedStripHit(hitLayers[j], j);
570 if(!seedHits[1]){
571 continue;
572 }
573 for (std::size_t k = j + 1; k < layerSize - 1; ++k) {
574 seedHits[2] = unusedStripHit(hitLayers[k], k);
575 if(!seedHits[2]){
576 continue;
577 }
578 for (std::size_t l = k + 1; l < layerSize; ++l) {
579 seedHits[3] = unusedStripHit(hitLayers[l], l);
580 if(!seedHits[3]){
581 continue;
582 }
583
584 const HitLaySpan_t layers{hitLayers[i], hitLayers[j], hitLayers[k], hitLayers[l]};
585 //skip combination with at least one too busy layer
586 bool tooBusy = std::ranges::any_of(layers,
587 [this](const auto& layer) {
588 return layer.get().size() > m_maxClustersInLayer;
589 });
590 if (tooBusy) {
591 continue; // skip this combination
592 }
593
594 AmgSymMatrix(2) bMatrix = betaMatrix(seedHits);
595
596 if (std::abs(bMatrix.determinant()) < 1.e-6) {
597 continue;
598 }
599 ATH_MSG_DEBUG("Space point positions for seed layers: \n"
600 <<(*seedHits[0]) << ",\n"
601 <<(*seedHits[1]) << ",\n"
602 <<(*seedHits[2]) << ",\n"
603 <<(*seedHits[3]));
604
605
606 UsedHitSpan_t usedHitsSpan{usedHits[i], usedHits[j], usedHits[k], usedHits[l]};
607 // each layer may have more than one hit - take the hit combinations
608 constructPreliminarySeeds(beamSpotPos, layers, usedHitsSpan, preLimSeeds);
609
610 //the layers not participated in the seed build - gonna be used for the extension
611 HitLaySpan_t extensionLayers{};
612 UsedHitSpan_t usedExtensionHits{};
613 usedExtensionHits.reserve(hitLayers.size());
614 extensionLayers.reserve(hitLayers.size());
615 for (std::size_t e = 0 ; e < hitLayers.size(); ++e) {
616 if (!(e == i || e == j || e == k || e == l)){
617 extensionLayers.emplace_back(hitLayers[e]);
618 usedExtensionHits.emplace_back(usedHits[e]);
619 }
620 }
621 // we have made sure to have hits from all the four layers -
622 // start by 4 hits for the seed and try to build the extended seed for the combinatorics found
623 for (auto &combinatoricHits : preLimSeeds) {
624 auto seed = constructCombinatorialSeed(combinatoricHits, bMatrix, max, extensionLayers, usedExtensionHits);
625 if (!seed) {
626 continue;
627 }
628
629 std::unique_ptr<Segment> segment = fitSegmentSeed(ctx, gctx, seed.get());
630 processSegment(std::move(segment), seed->getHitsInMax(), hitLayers, usedHits, segments);
631 seeds.push_back(std::move(seed));
632
633 }
634 }
635 }
636 }
637 }
638 return std::make_pair(std::move(seeds),std::move(segments));
639}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
#define AmgSymMatrix(dim)
if(febId1==febId2)
#define max(a, b)
Definition cfImp.cxx:41
UnsignedIntegerProperty m_maxUsed
std::unique_ptr< SegmentSeed > constructCombinatorialSeed(const InitialSeed_t &initialSeed, const AmgSymMatrix(2)&bMatrix, const HoughMaximum &max, const HitLaySpan_t &extensionLayers, const UsedHitSpan_t &usedHits) const
Construct a combinatorial seed from the initial 4-layer seed hits.
UnsignedIntegerProperty m_maxClustersInLayer
std::unique_ptr< Segment > fitSegmentSeed(const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const SegmentSeed *patternSeed) const
Fit the segment seeds.
std::vector< std::reference_wrapper< const HitVec > > HitLaySpan_t
Abbrivation of the space comprising multiple hit vectors without copy.
std::vector< std::unique_ptr< SegmentSeed > > SegmentSeedVec_t
Abbrivation of the seed vector.
void constructPreliminarySeeds(const Amg::Vector3D &beamSpot, const HitLaySpan_t &combinatoricLayers, const UsedHitSpan_t &usedHits, InitialSeedVec_t &outVec) const
Construct a set of prelimnary seeds from the selected combinatoric layers.
void processSegment(std::unique_ptr< Segment > segment, const HitVec &seedHits, const HitLayVec &hitLayers, UsedHitMarker_t &usedHits, SegmentVec_t &segments) const
Process the segment and mark the hits if it is successfully built or not by differently mark the hits...
SpacePointPerLayerSplitter::HitVec HitVec
std::vector< InitialSeed_t > InitialSeedVec_t
Vector of initial seeds.
StripOrient classifyStrip(const SpacePoint &spacePoint) const
Determines the orientation of the strip space point.
@ X
Stereo strips with negative angle.
@ V
Stereo strips with positive angle.
std::vector< std::unique_ptr< Segment > > SegmentVec_t
Abbrivation of the final segment vector.
std::vector< std::reference_wrapper< std::vector< unsigned int > > > UsedHitSpan_t
Abbrivation of the container to pass a subset of markers wtihout copy.
layers(flags, cells_name, *args, **kw)
Here we define wrapper functions to set up all of the standard corrections.
constexpr unsigned minLayers
l
Printing final latex table to .tex output file.
@ layer
Definition HitInfo.h:79

◆ buildSegmentsFromSTGC()

std::pair< NswSegmentFinderAlg::SegmentSeedVec_t, NswSegmentFinderAlg::SegmentVec_t > MuonR4::NswSegmentFinderAlg::buildSegmentsFromSTGC ( const EventContext & ctx,
const ActsTrk::GeometryContext & gctx,
const HitLayVec & hitLayers,
const HoughMaximum & max,
const Amg::Vector3D & beamSpotPos,
UsedHitMarker_t & usedHits ) const
private

Build the segment for a seed from STGC 2D measurement layers directly and then attempt to append hits from the other layers.

Parameters
hitLayers: Reference to the hits of the layers
gctxThe reference to the geometry context
ctxThe reference to the event context
maxRefrence to the eta maximum from which the segment seed is constructed
beamSpotPosThe beamspot position in the sector's frame to be used to constrain the hits selection
usedHitsRefrence to the book keeper of which of the hits on the extension was already used

Definition at line 429 of file NswSegmentFinderAlg.cxx.

434 {
435
436 //go through the layers and build seeds from the combinations of hits
437 //starting from the outermost layers with 2D measurements (excluding pads)
438 SegmentSeedVec_t seeds{};
439 SegmentVec_t segments{};
440 std::size_t layerSize = hitLayers.size();
441 double thetaWindowCut{std::cos(2*m_windowTheta)};
442
443 // lamda helper to check if the spacepoint is combined (but not pad) and unused in an already constructed seed
444 auto isUnusedCombined = [&](std::size_t layIdx, std::size_t hitIdx) -> bool {
445 const SpacePoint* sp = hitLayers[layIdx][hitIdx];
447 THROW_EXCEPTION("Space point is not of sTgc type: "<<sp->msSector()->idHelperSvc()->toString(sp->identify()));
448 }
449 const auto* prd = static_cast<const xAOD::sTgcMeasurement*>(sp->primaryMeasurement());
450 bool isCombined = sTgcChannelType(prd->channelType()) == "S" && sp->dimension() == 2;
451 bool isUnused = usedHits[layIdx].at(hitIdx) <= m_maxUsed;
452 return isCombined && isUnused;
453
454 };
455
456 // find the 2D measurements from the outermost layers - even move one layer inside
457 for(std::size_t layIdx1 = 0; layIdx1 < 2; ++layIdx1){
458 for(std::size_t layIdx2 = layerSize-1; layIdx2 >= layerSize-2; --layIdx2){
459 //in case of MM layers we stop - the layers are sorted in Z
460 if(hitLayers[layIdx1].front()->type() == xAOD::UncalibMeasType::MMClusterType ||
461 hitLayers[layIdx2].front()->type() == xAOD::UncalibMeasType::MMClusterType){
462 ATH_MSG_VERBOSE("Outermost layers are MM - stop searching for sTgc Measurements");
463 return std::make_pair(std::move(seeds), std::move(segments));
464 }
465
466 //check if we have 2D measurements on these layers that are unused (excluding the pads)
467 for(std::size_t hitIdx1 = 0; hitIdx1 < hitLayers[layIdx1].size(); ++hitIdx1) {
468 const SpacePoint* hit1 = hitLayers[layIdx1][hitIdx1];
469 if(!isUnusedCombined(layIdx1, hitIdx1)){
470 continue;
471 }
472 for(std::size_t hitIdx2 = 0; hitIdx2 < hitLayers[layIdx2].size(); ++hitIdx2) {
473 const SpacePoint* hit2 = hitLayers[layIdx2][hitIdx2];
474 if(!isUnusedCombined(layIdx2, hitIdx2)){
475 continue;
476 }
477 //test if this selection of the hits from the two layers is aligned with the beam spot
478 const Amg::Vector3D beamSpotHitDir{(beamSpotPos - hit1->localPosition()).unit()};
479 const Amg::Vector3D seedDir{(hit2->localPosition() - hit1->localPosition()).unit()};
480 const double cosAngle = beamSpotHitDir.dot(seedDir);
481 //accept the deflection of direction with a tolerance of 1 deg
482 if(std::abs(cosAngle) < thetaWindowCut){
483 continue;
484 }
485 //found 2D hits on the outermost layers - build a seed
486 HitVec seedHits{hit1, hit2};
487 //get the seed direction and position from the two 2D hits
488 const Amg::Vector3D seedPos = hit1->localPosition();
489 //express position in z=0
490 const Amg::Vector3D seedPosZ0 = seedPos + Amg::intersect<3>(seedPos, seedDir, Amg::Vector3D::UnitZ(), 0.).value_or(0.)*seedDir;
491 // extend the seed to the other layers
492 HitLaySpan_t extensionLayers{};
493 UsedHitSpan_t usedExtensionHits{};
494 extensionLayers.reserve(hitLayers.size());
495 usedExtensionHits.reserve(hitLayers.size());
496 for (std::size_t e = 0 ; e < hitLayers.size(); ++e) {
497 if (!(e == layIdx1 || e == layIdx2)){
498 extensionLayers.emplace_back(hitLayers[e]);
499 usedExtensionHits.emplace_back(usedHits[e]);
500 }
501 }
502 auto extendedHits = extendHits(seedPosZ0, seedDir, extensionLayers, usedExtensionHits);
503 std::ranges::move(extendedHits, std::back_inserter(seedHits));
504
505 if(seedHits.size() < minLayers){
506 continue;
507 }
508
509 //make seed
510 auto seed = std::make_unique<SegmentSeed>(houghTanBeta(seedDir), seedPosZ0.y(),
511 houghTanAlpha(seedDir), seedPosZ0.x(),
512 seedHits.size(), std::move(seedHits),
513 max.parentBucket());
514 //fit the segment seed
515 std::unique_ptr<Segment> segment = fitSegmentSeed(ctx, gctx, seed.get());
516 processSegment(std::move(segment), seed->getHitsInMax(), hitLayers, usedHits, segments);
517 seeds.push_back(std::move(seed));
518
519 }
520 }
521 }
522 }
523 return std::make_pair(std::move(seeds),std::move(segments));
524}
static Double_t sp
HitVec extendHits(const Amg::Vector3D &startPos, const Amg::Vector3D &direction, const HitLaySpan_t &extensionLayers, const UsedHitSpan_t &usedHits) const
Extend the seed with the hits from the other layers.
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the point B' along the line B that's closest to a second line A.
Eigen::Matrix< double, 3, 1 > Vector3D
double houghTanBeta(const Amg::Vector3D &v)
Returns the hough tanBeta [y] / [z].
double houghTanAlpha(const Amg::Vector3D &v)
: Returns the hough tanAlpha [x] / [z]
sTgcMeasurement_v1 sTgcMeasurement
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ classifyStrip()

NswSegmentFinderAlg::StripOrient MuonR4::NswSegmentFinderAlg::classifyStrip ( const SpacePoint & spacePoint) const
private

Determines the orientation of the strip space point.

Definition at line 117 of file NswSegmentFinderAlg.cxx.

117 {
118
120 const auto& design = getDesign(sp);
121 if (!design.hasStereoAngle()) {
122 return StripOrient::X;
123 }
124 return design.stereoAngle() > 0. ? StripOrient::U : StripOrient::V;
125 } else if (sp.type() == xAOD::UncalibMeasType::sTgcStripType) {
126 const auto* prd = static_cast<const xAOD::sTgcMeasurement*>(sp.primaryMeasurement());
127 if (sp.dimension() == 2) {
128 return StripOrient::C;
129 }
130 //check if we have strip only or wire only measurements
132
133 }
134 ATH_MSG_WARNING("Cannot classify orientation of "<<m_idHelperSvc->toString(sp.identify()));
136}
#define ATH_MSG_WARNING(x)
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
@ Unknown
Combined 2D space point (sTGC wire + strip / sTgc pad)
virtual sTgcChannelTypes channelType() const =0
Returns the channel type of the measurement (Pad/Wire/Strip)

◆ constructCombinatorialSeed()

std::unique_ptr< SegmentSeed > MuonR4::NswSegmentFinderAlg::constructCombinatorialSeed ( const InitialSeed_t & initialSeed,
const AmgSymMatrix(2)& bMatrix,
const HoughMaximum & max,
const HitLaySpan_t & extensionLayers,
const UsedHitSpan_t & usedHits ) const
private

Construct a combinatorial seed from the initial 4-layer seed hits.

Parameters
initialSeedReference to the hit quadruplet that may form a seed
bMatrixKernel matrix calculated from the layer configuration to construct the seed
maxRefrence to the eta maximum from which the segment seed is constructed
extensionLayersReference to the hits on the remaining layers of the detector
usedHitsRefrence to the book keeper of which of the hits on the extension was already used

Definition at line 315 of file NswSegmentFinderAlg.cxx.

319 {
320 bool allValid = std::any_of(initialSeed.begin(), initialSeed.end(),
321 [this](const auto& hit){
322 if (hit->type() == xAOD::UncalibMeasType::MMClusterType) {
323 const auto* mmClust = static_cast<const xAOD::MMCluster*>(hit->primaryMeasurement());
324 return mmClust->stripNumbers().size() >= m_minClusSize;
325 }
326 return true;
327 });
328
329 if (!allValid) {
330 ATH_MSG_VERBOSE("Seed rejection: Not all clusters meet minimum strip size");
331 return nullptr;
332 }
333
334
335 std::array<double, 4> params = defineParameters(bMatrix, initialSeed);
336
337 const auto [segPos, direction] = seedSolution(initialSeed, params);
338
339 // check the consistency of the parameters - expected to lay in the strip's
340 // length
341 for (std::size_t i = 0; i < 4; ++i) {
342 const double halfLength = stripHalfLength(*initialSeed[i]);
343
344 if (std::abs(params[i]) > halfLength) {
345 ATH_MSG_VERBOSE("Seed Rejection: Invalid seed - outside of the strip's length "<< m_idHelperSvc->toString(initialSeed[i]->identify())
346 <<", param: "<<params[i]<<", halfLength: "<<halfLength);
347 return nullptr;
348 }
349 }
350 double tanAlpha = houghTanAlpha(direction);
351 double tanBeta = houghTanBeta(direction);
352
353 double interceptX = segPos.x();
354 double interceptY = segPos.y();
355
356
357 // extend the seed to the segment -- include hits from the other layers too
358 auto extendedHits = extendHits(segPos, direction, extensionLayers, usedHits);
359 HitVec hits{initialSeed.begin(),initialSeed.end()};
360 std::ranges::move(extendedHits, std::back_inserter(hits));
361
362 return std::make_unique<SegmentSeed>(tanBeta, interceptY, tanAlpha,
363 interceptX, hits.size(),
364 std::move(hits), max.parentBucket());
365}

◆ constructPreliminarySeeds()

void MuonR4::NswSegmentFinderAlg::constructPreliminarySeeds ( const Amg::Vector3D & beamSpot,
const HitLaySpan_t & combinatoricLayers,
const UsedHitSpan_t & usedHits,
InitialSeedVec_t & outVec ) const
private

Construct a set of prelimnary seeds from the selected combinatoric layers.

Quadruplets of hits, one from each layer, are formed if they are all within the the corridor as described above

Parameters
beamSpotPosition of the beam spot in the sector's frame
combinatoricLayersQuadruplet of four hit vectors from which the hits are retrieved
usedHitsMask marking hits that were already successfully added to a seed
outVecReference to the output vector where the initial seeds are stored. The vector is cleared at the beginning and capacity is allocated accordingly

Assign enough memory to the vector

The hit is alrady in a good seed. Don't consider again

Construct the beamspot to first hit connection to guestimate the angle

Apply cut window on theta of the seed.

Definition at line 215 of file NswSegmentFinderAlg.cxx.

218 {
220 seedHitsFromLayers.clear();
221 std::size_t maxSize{1};
222 for (const HitVec& hitVec : combinatoricLayers) {
223 maxSize = maxSize * hitVec.size();
224 }
225 seedHitsFromLayers.reserve(maxSize);
226
227 unsigned iterLay0{0}, iterLay1{0}, iterLay2{0}, iterLay3{0};
228 unsigned startLay1{0}, startLay2{0}, startLay3{0};
229
230 for( ; iterLay0 < combinatoricLayers[0].get().size() ; ++iterLay0){
232 if (usedHits[0].get()[iterLay0] > m_maxUsed) {
233 continue;
234 }
235 const SpacePoint* hit0 = combinatoricLayers[0].get()[iterLay0];
237 const Amg::Vector3D initSeedDir{(beamSpot - hit0->localPosition()).unit()};
238 const Amg::Vector3D dirEstUp = Amg::dirFromAngles(initSeedDir.phi(), initSeedDir.theta() - m_windowTheta);
239 const Amg::Vector3D dirEstDn = Amg::dirFromAngles(initSeedDir.phi(), initSeedDir.theta() + m_windowTheta);
240
241 ATH_MSG_VERBOSE("Reference hit: "<<m_idHelperSvc->toString(hit0->identify())
242 <<", position: "<<Amg::toString(hit0->localPosition())
243 <<", seed dir: "<<Amg::toString(initSeedDir)
244 <<", seed plane: "<<Amg::toString(SeedingAux::extrapolateToPlane(beamSpot, initSeedDir, *hit0)));
246 for( iterLay1 = startLay1; iterLay1 < combinatoricLayers[1].get().size() ; ++iterLay1){
247 TEST_HIT_CORRIDOR(1, iterLay1, startLay1);
248 for( iterLay2 = startLay2; iterLay2 < combinatoricLayers[2].get().size() ; ++iterLay2){
249 TEST_HIT_CORRIDOR(2, iterLay2, startLay2);
250 for( iterLay3 = startLay3; iterLay3 < combinatoricLayers[3].get().size(); ++iterLay3){
251 TEST_HIT_CORRIDOR(3, iterLay3, startLay3);
252 seedHitsFromLayers.emplace_back(std::array{hit0, combinatoricLayers[1].get()[iterLay1],
253 combinatoricLayers[2].get()[iterLay2],
254 combinatoricLayers[3].get()[iterLay3]});
255 }
256 }
257 }
258 }
259}
#define TEST_HIT_CORRIDOR(LAYER, HIT_ITER, START_LAYER)
Macro to check whether a hit is compatible with the hit corridor.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Amg::Vector3D dirFromAngles(const double phi, const double theta)
Constructs a direction vector from the azimuthal & polar angles.
AthConfigFlags beamSpot(AthConfigFlags flags, str instanceName, str recoMode)

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ emptyBookKeeper()

NswSegmentFinderAlg::UsedHitMarker_t MuonR4::NswSegmentFinderAlg::emptyBookKeeper ( const HitLayVec & sortedSp) const
private

Constructs an empty HitMarker from the split space points.

Parameters
sortedSpList of space points sorted by layer

Definition at line 108 of file NswSegmentFinderAlg.cxx.

108 {
109 UsedHitMarker_t emptyKeeper(sortedSp.size());
110 for (std::size_t l = 0; l < sortedSp.size(); ++l) {
111 emptyKeeper[l].resize(sortedSp[l].size(), 0);
112 }
113 return emptyKeeper;
114}
std::vector< std::vector< unsigned int > > UsedHitMarker_t
Abbrivation of the container book keeping whether a hit is used or not.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode MuonR4::NswSegmentFinderAlg::execute ( const EventContext & ctx) const
overridevirtual

Definition at line 818 of file NswSegmentFinderAlg.cxx.

818 {
819 // read the inputs
820 const EtaHoughMaxContainer *maxima{nullptr};
821 ATH_CHECK(SG::get( maxima, m_etaKey, ctx));
822
823 const ActsTrk::GeometryContext *gctx{nullptr};
824 ATH_CHECK(SG::get(gctx, m_geoCtxKey, ctx));
825
826 // prepare our output collection
827 SG::WriteHandle writeSegments{m_writeSegmentKey, ctx};
828 ATH_CHECK(writeSegments.record(std::make_unique<SegmentContainer>()));
829
830 SG::WriteHandle writeSegmentSeeds{m_writeSegmentSeedKey, ctx};
831 ATH_CHECK(writeSegmentSeeds.record(std::make_unique<SegmentSeedContainer>()));
832
833 // we use the information from the previous eta-hough transform
834 // to get the combined hits that belong in the same maxima
835 for (const HoughMaximum *max : *maxima) {
836
837 auto [seeds, segments] = findSegmentsFromMaximum(*max, *gctx, ctx);
838
839 if (msgLvl(MSG::VERBOSE)) {
840 for(const auto& hitMax : max->getHitsInMax()){
841 ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hitMax->identify())<<", "
842 <<Amg::toString(hitMax->localPosition())<<", dir: "
843 <<Amg::toString(hitMax->sensorDirection()));
844 }
845 }
846
847 for(auto& seed: seeds){
848
849 if (msgLvl(MSG::VERBOSE)){
850 std::stringstream sstr{};
851 sstr<<"Seed tanBeta = "<<seed->tanBeta()<<", y0 = "<<seed->interceptY()
852 <<", tanAlpha = "<<seed->tanAlpha()<<", x0 = "<<seed->interceptX()<<", hits in the seed "
853 <<seed->getHitsInMax().size()<<std::endl;
854
855 for(const auto& hit : seed->getHitsInMax()){
856 sstr<<" *** Hit "<<m_idHelperSvc->toString(hit->identify())<<", "
857 << Amg::toString(hit->localPosition())<<", dir: "<<Amg::toString(hit->sensorDirection())<<std::endl;
858 }
859 ATH_MSG_VERBOSE(sstr.str());
860 }
861 if (m_visionTool.isEnabled()) {
862 m_visionTool->visualizeSeed(ctx, *seed, "#phi-combinatorialSeed");
863 }
864
865 writeSegmentSeeds->push_back(std::move(seed));
866
867 }
868
869 for (auto &seg : segments) {
870
871 const Parameters pars = localSegmentPars(*gctx, *seg);
872
873 ATH_MSG_VERBOSE("Segment parameters : "<<toString(pars));
874
875 if (m_visionTool.isEnabled()) {
876 m_visionTool->visualizeSegment(ctx, *seg, "#phi-segment");
877 }
878
879 writeSegments->push_back(std::move(seg));
880
881 }
882 }
883
884 return StatusCode::SUCCESS;
885}
#define ATH_CHECK
Evaluate an expression and check for errors.
bool msgLvl(const MSG::Level lvl) const
std::pair< SegmentSeedVec_t, SegmentVec_t > findSegmentsFromMaximum(const HoughMaximum &max, const ActsTrk::GeometryContext &gctx, const EventContext &ctx) const
Find seed and segment from an eta hough maximum.
ToolHandle< MuonValR4::IPatternVisualizationTool > m_visionTool
Pattern visualization tool.
SG::WriteHandleKey< SegmentSeedContainer > m_writeSegmentSeedKey
SG::WriteHandleKey< SegmentContainer > m_writeSegmentKey
SG::ReadHandleKey< ActsTrk::GeometryContext > m_geoCtxKey
SG::ReadHandleKey< EtaHoughMaxContainer > m_etaKey
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
Acts::Experimental::CompositeSpacePointLineFitter::ParamVec_t Parameters
std::string toString(const Parameters &pars)
Dumps the parameters into a string with labels in front of each number.
DataVector< HoughMaximum > EtaHoughMaxContainer
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.

◆ extendHits()

NswSegmentFinderAlg::HitVec MuonR4::NswSegmentFinderAlg::extendHits ( const Amg::Vector3D & startPos,
const Amg::Vector3D & direction,
const HitLaySpan_t & extensionLayers,
const UsedHitSpan_t & usedHits ) const
private

Extend the seed with the hits from the other layers.

Parameters
startPosThe seed position
directionThe seed direction
extensionLayersThe layers to which the seed is extended by extrapolation
usedHitsThe book keeping of the used hits to be skipped

Definition at line 263 of file NswSegmentFinderAlg.cxx.

266 {
267
268 //the hits we need to return to extend the segment seed
269 HitVec combinatoricHits;
270
271 for (std::size_t i = 0; i < extensionLayers.size(); ++i) {
272 const HitVec& layer{extensionLayers[i].get()};
273 const Amg::Vector3D extrapPos = SeedingAux::extrapolateToPlane(startPos, direction, *layer.front());
274
275 unsigned indexOfHit = layer.size() + 1;
276 unsigned triedHit{0};
277 double minPull{std::numeric_limits<double>::max()};
278
279 // loop over the hits on the same layer
280 for (unsigned j = 0; j < layer.size(); ++j) {
281 if (usedHits[i].get().at(j) > m_maxUsed) {
282 continue;
283 }
284 auto hit = layer.at(j);
285 const double pull = std::sqrt(SeedingAux::chi2Term(extrapPos, direction, *hit));
286 ATH_MSG_VERBOSE("Trying extension with hit " << m_idHelperSvc->toString(hit->identify()));
287
288 //find the hit with the minimum pull (check at least one hit after we have increasing pulls)
289 if (pull > minPull) {
290 triedHit+=1;
291 continue;
292 }
293
294 if(triedHit>1){
295 break;
296 }
297
298 indexOfHit = j;
299 minPull = pull;
300 }
301
302 // complete the seed with the extended hits
303 if (minPull < m_minPullThreshold) {
304 const auto* bestCand = layer.at(indexOfHit);
305 ATH_MSG_VERBOSE("Extension successfull - hit" << m_idHelperSvc->toString(bestCand->identify())
306 <<", pos: "<<Amg::toString(bestCand->localPosition())
307 <<", dir: "<<Amg::toString(bestCand->sensorDirection())<<" found with pull "<<minPull);
308 combinatoricHits.push_back(bestCand);
309 }
310 }
311 return combinatoricHits;
312}

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonReentrantAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

virtual bool AthCommonReentrantAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ finalize()

StatusCode MuonR4::NswSegmentFinderAlg::finalize ( )
overridevirtual

Definition at line 887 of file NswSegmentFinderAlg.cxx.

887 {
888 if(m_seedCounter) {
889 m_seedCounter->printTableSeedStats(msgStream());
890 }
891 return StatusCode::SUCCESS;
892}

◆ findSegmentsFromMaximum()

std::pair< NswSegmentFinderAlg::SegmentSeedVec_t, NswSegmentFinderAlg::SegmentVec_t > MuonR4::NswSegmentFinderAlg::findSegmentsFromMaximum ( const HoughMaximum & max,
const ActsTrk::GeometryContext & gctx,
const EventContext & ctx ) const
private

Find seed and segment from an eta hough maximum.

Parameters
maxThe maximum from the eta hough transform
gctxThe geometry Context
ctxThe event context

Definition at line 642 of file NswSegmentFinderAlg.cxx.

644 {
645 // first sort the hits per layer from the maximum
646 SpacePointPerLayerSplitter hitLayers{max.getHitsInMax()};
647
648 const HitLayVec& stripHitsLayers{hitLayers.stripHits()};
649 const std::size_t layerSize = stripHitsLayers.size();
650
651 //seeds and segments containers
652 SegmentSeedVec_t seeds{};
653 SegmentVec_t segments{};
654
655 const Amg::Transform3D globToLocal = max.msSector()->globalToLocalTransform(gctx);
656 //counters for the number of seeds, extented seeds and segments
657
658 if (layerSize < minLayers) {
659 ATH_MSG_VERBOSE("Not enough layers to build a seed");
660 return std::make_pair(std::move(seeds),std::move(segments));
661 }
662
663 if (m_visionTool.isEnabled()) {
665 constexpr double legX{0.2};
666 double legY{0.8};
667 for (const SpacePoint* sp : max.getHitsInMax()) {
668 const xAOD::MuonSimHit* simHit = getTruthMatchedHit(*sp->primaryMeasurement());
669 if (!simHit) {
670 continue;
671 }
672
673 const MuonGMR4::MuonReadoutElement* reEle = m_detMgr->getReadoutElement(simHit->identify());
674 const Amg::Transform3D toChamb = reEle->msSector()->globalToLocalTransform(gctx) *
675 reEle->localToGlobalTransform(gctx, sp->identify());
676
677 const Amg::Vector3D hitPos = toChamb * xAOD::toEigen(simHit->localPosition());
678 const Amg::Vector3D hitDir = toChamb.linear() * xAOD::toEigen(simHit->localDirection());
679 const double pull = std::sqrt(SeedingAux::chi2Term(hitPos, hitDir, *sp));
680
682 const auto* mmClust = static_cast<const xAOD::MMCluster*>(sp->primaryMeasurement());
683 const MuonGMR4::MmReadoutElement* mmEle = mmClust->readoutElement();
684 const auto& design = mmEle->stripLayer(mmClust->measurementHash()).design();
685 std::string stereoDesign{!design.hasStereoAngle() ? "X" : design.stereoAngle() >0 ? "U": "V"};
686 primitives.push_back(MuonValR4::drawLabel(std::format("ml: {:1d}, gap: {:1d}, {:}, pull: {:.2f}",
687 mmEle->multilayer(), mmClust->gasGap(),
688 stereoDesign, pull), legX, legY, 14));
689 } else if(sp->type() == xAOD::UncalibMeasType::sTgcStripType) {
690 const auto* sTgcMeas = static_cast<const xAOD::sTgcMeasurement*>(sp->primaryMeasurement());
691 std::string channelString = sp->secondaryMeasurement() == nullptr ?
692 sTgcChannelType(sTgcMeas->channelType()) :
693 std::format("{:}/{:}", sTgcChannelType(sTgcMeas->channelType()),
694 sTgcChannelType(static_cast<const xAOD::sTgcMeasurement*>(sp->secondaryMeasurement())->channelType()));
695 primitives.push_back(MuonValR4::drawLabel(std::format("ml: {:1d}, gap: {:1d}, type: {:}, pull: {:.2f}",
696 sTgcMeas->readoutElement()->multilayer(), sTgcMeas->gasGap(),
697 channelString, pull), legX, legY, 14));
698 }
699 legY-=0.05;
700 }
701 m_visionTool->visualizeBucket(ctx, *max.parentBucket(),
702 "truth", std::move(primitives));
703 }
704
705 UsedHitMarker_t allUsedHits = emptyBookKeeper(stripHitsLayers);
706 std::size_t nSeeds{0}, nExtSeeds{0}, nSegments{0}; //for the seed statistics
707
708 // helper lamda function to increase counters and fill the seeds and segments we want to return after we construct them
709 // the extended seeds are returned even if they did not make it to a segment and the segments only if successfully fitted
710 auto processSeedsAndSegments = [&](std::pair<SegmentSeedVec_t, SegmentVec_t>&& seedSegmentPairs, std::string_view source) {
711 auto& [returnSeeds, returnSegments] = seedSegmentPairs;
712 ATH_MSG_DEBUG("From " << source << ": built " << returnSeeds.size() << " seeds and " << returnSegments.size() << " segments.");
713 for(auto& seed : returnSeeds) {
714 ++nSeeds;
715 if(seed->getHitsInMax().size() < m_minSeedHits){
716 continue;
717 }
718 ++nExtSeeds;
719 seeds.push_back(std::move(seed));
720 }
721 //move all the segments to the output container
722 std::ranges::move(returnSegments, std::back_inserter(segments));
723 nSegments += returnSegments.size();
724 };
725
726 //Start from outermost sTgc layers with combined 2D measurements
727 ATH_MSG_VERBOSE("Start building seed from sTgc outermost layers");
728 processSeedsAndSegments(buildSegmentsFromSTGC(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits), "sTgc segment seeds");
729
730 //continue with the combinatorial seeding for the strip measurements
732
733 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, true), "MM combinatoric segment seeds");
734
735 }else{
736
737 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, true), "MM combinatoric segment seeds");
738 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, false), "MM and STGC combinatoric segment seeds");
739
740 }
741
742 if(m_seedCounter) {
743 m_seedCounter->addToStat(max.msSector(), nSeeds, nExtSeeds, nSegments);
744 }
745
746 return std::make_pair(std::move(seeds),std::move(segments));
747}
bool const RAWDATA *ch2 const
const StripLayer & stripLayer(const Identifier &measId) const
int multilayer() const
Returns the multi layer of the element [1-2].
const Amg::Transform3D & localToGlobalTransform(const ActsTrk::GeometryContext &ctx) const
Returns the transformation from the local coordinate system of the readout element into the global AT...
const SpectrometerSector * msSector() const
Returns the pointer to the envelope volume enclosing all chambers in the sector.
Amg::Transform3D globalToLocalTransform(const ActsTrk::GeometryContext &gctx) const
Returns the global -> local transformation from the ATLAS global.
const StripDesign & design(bool phiView=false) const
Returns the underlying strip design.
const MuonGMR4::MuonDetectorManager * m_detMgr
std::pair< SegmentSeedVec_t, SegmentVec_t > buildSegmentsFromMM(const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const HitLayVec &hitLayers, const HoughMaximum &max, const Amg::Vector3D &beamSpotPos, UsedHitMarker_t &usedHits, bool useOnlyMM) const
Build the final segment seed from strip like measurements using the combinatorial seeding for MicroMe...
std::pair< SegmentSeedVec_t, SegmentVec_t > buildSegmentsFromSTGC(const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const HitLayVec &hitLayers, const HoughMaximum &max, const Amg::Vector3D &beamSpotPos, UsedHitMarker_t &usedHits) const
Build the segment for a seed from STGC 2D measurement layers directly and then attempt to append hits...
UsedHitMarker_t emptyBookKeeper(const HitLayVec &sortedSp) const
Constructs an empty HitMarker from the split space points.
SpacePointPerLayerSplitter::HitLayVec HitLayVec
UnsignedIntegerProperty m_minSeedHits
const MuonGMR4::MmReadoutElement * readoutElement() const
Retrieve the associated MmReadoutElement.
ConstVectorMap< 3 > localDirection() const
Returns the local direction of the traversing particle.
Identifier identify() const
Returns the global ATLAS identifier of the SimHit.
ConstVectorMap< 3 > localPosition() const
Returns the local postion of the traversing particle.
Eigen::Affine3d Transform3D
const xAOD::MuonSimHit * getTruthMatchedHit(const xAOD::UncalibratedMeasurement &prdHit)
Returns the MuonSimHit, if there's any, matched to the uncalibrated muon measurement.
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const unsigned int fontSize=18, const bool useNDC=true)
Create a TLatex label,.
MuonSimHit_v1 MuonSimHit
Defined the version of the MuonSimHit.
Definition MuonSimHit.h:12
MMCluster_v1 MMCluster

◆ fitSegmentSeed()

std::unique_ptr< Segment > MuonR4::NswSegmentFinderAlg::fitSegmentSeed ( const EventContext & ctx,
const ActsTrk::GeometryContext & gctx,
const SegmentSeed * patternSeed ) const
private

Fit the segment seeds.

Parameters
ctxThe reference to the event context
gctxThe reference to the Geometry Context
patternSeedThe pointer to the seed of which we fit the calibrated space points

Definition at line 368 of file NswSegmentFinderAlg.cxx.

370 {
371
372 if(patternSeed->getHitsInMax().size() < m_minSeedHits){
373 ATH_MSG_VERBOSE("Not enough hits in the SegmentSeed to fit a segment");
374 return nullptr;
375 }
376
377 ATH_MSG_VERBOSE("Fit the SegmentSeed");
378
379 //Calibration of the seed spacepoints
380 CalibSpacePointVec calibratedHits = m_calibTool->calibrate(ctx, patternSeed->getHitsInMax(),
381 patternSeed->localPosition(),
382 patternSeed->localDirection(), 0.);
383
384 const Amg::Transform3D& locToGlob{patternSeed->msSector()->localToGlobalTransform(gctx)};
385
386 return m_lineFitter->fitSegment(ctx, patternSeed, patternSeed->parameters(),
387 locToGlob, std::move(calibratedHits));
388}
std::unique_ptr< SegmentFit::SegmentLineFitter > m_lineFitter
ToolHandle< ISpacePointCalibrator > m_calibTool
ISpacePointCalibrator::CalibSpacePointVec CalibSpacePointVec

◆ hitFromIPCorridor()

NswSegmentFinderAlg::HitWindow MuonR4::NswSegmentFinderAlg::hitFromIPCorridor ( const SpacePoint & testHit,
const Amg::Vector3D & beamSpotPos,
const Amg::Vector3D & dirEstUp,
const Amg::Vector3D & dirEstDn ) const
inlineprivate

The hit is above the predefined corridor.

Tests whether a hit is inside the corridor defined by line connecting the centre of the first candidate hit in the seed and the beam spot. The theta angle is varied by m_windowTheta to define the lower & upper direction etimate. The function tests whether the strip then crosses the corridor.

Parameters
testHitReference to the hit to test
beamSpotPosPosition of the beam spot serving as starting point
dirEstUpDirection vector defining the upper limit of the corridor
dirEstDnDirection vector defining the lower limit of the corridor

Calculate the strip edges

Check whether the both edges are below the lower estimated muon arrival

Analogous check for the upper edge

No extrapolation needed

Analogous check for the upper edge

Definition at line 138 of file NswSegmentFinderAlg.cxx.

141 {
142
143 const Amg::Vector3D estPlaneArrivalUp = SeedingAux::extrapolateToPlane(beamSpotPos, dirEstUp, testHit);
144 const Amg::Vector3D estPlaneArrivalDn = SeedingAux::extrapolateToPlane(beamSpotPos, dirEstDn, testHit);
145
146 bool below{true}, above{true};
147 switch (classifyStrip(testHit)) {
148 using enum StripOrient;
149 case U:
150 case V:{
151 const double halfLength = 0.5* stripHalfLength(testHit);
153 const Amg::Vector3D leftEdge = testHit.localPosition() - halfLength * testHit.sensorDirection();
154 const Amg::Vector3D rightEdge = testHit.localPosition() + halfLength * testHit.sensorDirection();
155
157 below = estPlaneArrivalDn.y() > std::max(leftEdge.y(), rightEdge.y());
159 above = estPlaneArrivalUp.y() < std::min(leftEdge.y(), rightEdge.y());
160 break;
161 } case X:
162 case C: {
164 const double hY = testHit.localPosition().y();
165 below = estPlaneArrivalDn.y() > hY;
167 above = estPlaneArrivalUp.y() < hY;
168 break;
169 }
170 case P:{
171 break;
172 }
173 case Unknown:{
174 break;
175 }
176
177 }
178 ATH_MSG_VERBOSE("Hit " << m_idHelperSvc->toString(testHit.identify())
179 << (below || above ? " is outside the window" : " is inside the window"));
180 if(below) {
181 return HitWindow::tooLow;
182 }
183 if(above) {
184 return HitWindow::tooHigh;
185 }
186 return HitWindow::inside;
187};
@ inside
The hit is below the predefined corridor.
@ tooHigh
The hit is inside the defined window and hence an initial candidate.
StripOrient
Enumeration to classify the orientation of a NSW strip.

◆ initialize()

StatusCode MuonR4::NswSegmentFinderAlg::initialize ( )
overridevirtual

Definition at line 76 of file NswSegmentFinderAlg.cxx.

76 {
77 ATH_CHECK(m_geoCtxKey.initialize());
78 ATH_CHECK(m_etaKey.initialize());
79 ATH_CHECK(m_writeSegmentKey.initialize());
80 ATH_CHECK(m_writeSegmentSeedKey.initialize());
81 ATH_CHECK(m_idHelperSvc.retrieve());
82 ATH_CHECK(m_calibTool.retrieve());
83 ATH_CHECK(m_visionTool.retrieve(DisableTool{m_visionTool.empty()}));
85
86 if (!(m_idHelperSvc->hasMM() || m_idHelperSvc->hasSTGC())) {
87 ATH_MSG_ERROR("MM or STGC not part of initialized detector layout");
88 return StatusCode::FAILURE;
89 }
90
91 SegmentLineFitter::Config fitCfg{};
92 fitCfg.calibrator = m_calibTool.get();
93 fitCfg.visionTool = m_visionTool.get();
94 fitCfg.calcAlongStrip = false;
95 fitCfg.idHelperSvc = m_idHelperSvc.get();
96 fitCfg.parsToUse = {ParamDefs::x0, ParamDefs::y0, ParamDefs::theta, ParamDefs::phi};
97
98 m_lineFitter = std::make_unique<SegmentFit::SegmentLineFitter>(name(), std::move(fitCfg));
99
101 m_seedCounter = std::make_unique<SeedStatistics>();
102 }
103
104 return StatusCode::SUCCESS;
105}
#define ATH_MSG_ERROR(x)
const ServiceHandle< StoreGateSvc > & detStore() const
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

◆ markHitsAsUsed()

void MuonR4::NswSegmentFinderAlg::markHitsAsUsed ( const HitVec & spacePoints,
const HitLayVec & allSortHits,
UsedHitMarker_t & usedHitMarker,
unsigned int increase,
bool markNeighborHits ) const
private

Hits that are used in a good seed/segment built should be flagged as used and not contribute to other seed.

Parameters
spacePointsThe space points to be marked as used
allSortHitsAll the available hits
usedHitMarkerThe book keeping of the hits
increaseThe hit counter increase
markNeighborHitsFlag wether to mark hits on the layer in the vicinity
Todo
use the localMeasurementPos of the measurement?
Todo
use the localMeasurementPos of the measurement?

Definition at line 749 of file NswSegmentFinderAlg.cxx.

753 {
754
755 SpacePointPerLayerSorter layerSorter{};
756
757 for(const auto& sp : spacePoints){
758 // Proection against the auxiliary measurement
759 if(!sp){
760 continue;
761 }
762
763 unsigned measLayer = layerSorter.sectorLayerNum(*sp);
764
765 Amg::Vector2D spPosX{Amg::Vector2D::Zero()};
767 switch (sp->primaryMeasurement()->numDimensions()) {
768 case 1:
769 spPosX[Amg::x] = sp->primaryMeasurement()->localPosition<1>().x();
770 break;
771 case 2:
772 spPosX = xAOD::toEigen(sp->primaryMeasurement()->localPosition<2>());
773 break;
774 default:
775 THROW_EXCEPTION("Unsupported dimension");
776 }
777
778 for (std::size_t lIdx = 0; lIdx < allSortHits.size(); ++lIdx) {
779 const HitVec& hVec{allSortHits[lIdx]};
780 //check if they are not in the same layer
781 unsigned hitLayer = layerSorter.sectorLayerNum(*hVec.front());
782 if(hitLayer != measLayer) {
783 ATH_MSG_VERBOSE("Not in the same layer since measLayer = "<< measLayer << " and "<<hitLayer);
784 continue;
785 }
786 for (std::size_t hIdx = 0 ; hIdx < hVec.size(); ++hIdx) {
787 //check the dY between the measurement and the hits
788 auto testHit = hVec[hIdx];
789 if (testHit == sp) {
790 usedHitMarker[lIdx][hIdx] += incr;
791 if(!markNeighborHits){
792 break;
793 }
794 } else if (markNeighborHits) {
795 Amg::Vector2D testPosX{Amg::Vector2D::Zero()};
797 switch (testHit->primaryMeasurement()->numDimensions()) {
798 case 1:
799 testPosX[Amg::x] = testHit->primaryMeasurement()->localPosition<1>().x();
800 break;
801 case 2:
802 testPosX = xAOD::toEigen(testHit->primaryMeasurement()->localPosition<2>());
803 break;
804 default:
805 THROW_EXCEPTION("Unsupported dimension");
806 }
807 //if the hit not found let's see if it is too close to the segment's measurement
808 double deltaX = (testPosX - spPosX).mag();
809 if(deltaX < m_maxdYWindow){
810 usedHitMarker[lIdx][hIdx] += incr;
811 }
812 }
813 }
814 }
815 }
816}
Scalar mag() const
mag method
#define x
Eigen::Matrix< double, 2, 1 > Vector2D

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ processSegment()

void MuonR4::NswSegmentFinderAlg::processSegment ( std::unique_ptr< Segment > segment,
const HitVec & seedHits,
const HitLayVec & hitLayers,
UsedHitMarker_t & usedHits,
SegmentVec_t & segments ) const
private

Process the segment and mark the hits if it is successfully built or not by differently mark the hits as used.

Parameters
segmentThe segment to process
seedHitsThe seed hits which the segments is constructed from
hitLayersThe layers contributed to the seed
usedHitsThe reference of the book keeper for the hits to mark as used
segmentsReference to the segments otuput vector where the successfully built segments are stored

Definition at line 390 of file NswSegmentFinderAlg.cxx.

394 {
395
396 if (!segment) {
397 ATH_MSG_VERBOSE("Seed Rejection: Segment fit failed");
398
399 if (m_markHitsFromSeed && seedHits.size() > m_minSeedHits) {
400 // Mark hits from extended seed (used increment by 1)
401 markHitsAsUsed(seedHits, hitLayers, usedHits, 1, false);
402 }
403 return;
404 }
405
406 // -------- success path --------
407 ATH_MSG_DEBUG("Segment built with "
408 << segment->measurements().size()
409 << " hits, chi2/ndof: "
410 << segment->chi2() / std::max(1u,segment->nDoF()));
411
412 HitVec segMeasSP;
413 segMeasSP.reserve(segment->measurements().size());
414
415 std::ranges::transform(
416 segment->measurements(),
417 std::back_inserter(segMeasSP),
418 [](const auto& m) { return m->spacePoint(); }
419 );
420
421 // Mark segment hits as fully used (used increment by 10,
422 // hits are effectively removed)
423 markHitsAsUsed(segMeasSP, hitLayers, usedHits, 10, true);
424 segments.push_back(std::move(segment));
425
426}
void markHitsAsUsed(const HitVec &spacePoints, const HitLayVec &allSortHits, UsedHitMarker_t &usedHitMarker, unsigned int increase, bool markNeighborHits) const
Hits that are used in a good seed/segment built should be flagged as used and not contribute to other...

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonReentrantAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

107 {
109
110 if (sc.isFailure()) {
111 return sc;
112 }
113
114 ServiceHandle<ICondSvc> cs("CondSvc",name());
115 for (auto h : outputHandles()) {
116 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
117 // do this inside the loop so we don't create the CondSvc until needed
118 if ( cs.retrieve().isFailure() ) {
119 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
120 return StatusCode::SUCCESS;
121 }
122 if (cs->regHandle(this,*h).isFailure()) {
124 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
125 << " with CondSvc");
126 }
127 }
128 }
129 return sc;
130}
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::unique_ptr<SeedStatistics> m_seedCounter MuonR4::NswSegmentFinderAlg::ATLAS_THREAD_SAFE {}
private

Definition at line 315 of file NswSegmentFinderAlg.h.

315{};

◆ m_calibTool

ToolHandle<ISpacePointCalibrator> MuonR4::NswSegmentFinderAlg::m_calibTool {this, "Calibrator", "" }
private

Definition at line 274 of file NswSegmentFinderAlg.h.

274{this, "Calibrator", "" };

◆ m_detMgr

const MuonGMR4::MuonDetectorManager* MuonR4::NswSegmentFinderAlg::m_detMgr {}
private

Definition at line 317 of file NswSegmentFinderAlg.h.

317{};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doOnlyMMCombinatorics

BooleanProperty MuonR4::NswSegmentFinderAlg::m_doOnlyMMCombinatorics {this, "doOnlyMMCombinatorics", false}
private

Definition at line 295 of file NswSegmentFinderAlg.h.

295{this, "doOnlyMMCombinatorics", false};

◆ m_dumpSeedStatistics

BooleanProperty MuonR4::NswSegmentFinderAlg::m_dumpSeedStatistics {this, "dumpStatistics", true}
private

Definition at line 313 of file NswSegmentFinderAlg.h.

313{this, "dumpStatistics", true};

◆ m_etaKey

SG::ReadHandleKey<EtaHoughMaxContainer> MuonR4::NswSegmentFinderAlg::m_etaKey {this, "CombinatorialReadKey", "MuonHoughNswMaxima"}
private

Definition at line 256 of file NswSegmentFinderAlg.h.

256{this, "CombinatorialReadKey", "MuonHoughNswMaxima"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonReentrantAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_geoCtxKey

SG::ReadHandleKey<ActsTrk::GeometryContext> MuonR4::NswSegmentFinderAlg::m_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"}
private

Definition at line 265 of file NswSegmentFinderAlg.h.

265{this, "AlignmentKey", "ActsAlignment", "cond handle key"};

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> MuonR4::NswSegmentFinderAlg::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 268 of file NswSegmentFinderAlg.h.

268{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_lineFitter

std::unique_ptr<SegmentFit::SegmentLineFitter> MuonR4::NswSegmentFinderAlg::m_lineFitter {}
private

Definition at line 277 of file NswSegmentFinderAlg.h.

277{};

◆ m_markHitsFromSeed

BooleanProperty MuonR4::NswSegmentFinderAlg::m_markHitsFromSeed {this, "markHitsFromSeed", true}
private

Definition at line 292 of file NswSegmentFinderAlg.h.

292{this, "markHitsFromSeed", true};

◆ m_maxChi2

DoubleProperty MuonR4::NswSegmentFinderAlg::m_maxChi2 {this, "maxChi2", 5.}
private

Definition at line 304 of file NswSegmentFinderAlg.h.

304{this, "maxChi2", 5.};

◆ m_maxClustersInLayer

UnsignedIntegerProperty MuonR4::NswSegmentFinderAlg::m_maxClustersInLayer {this, "maxClustersInLayer", 8}
private

Definition at line 307 of file NswSegmentFinderAlg.h.

307{this, "maxClustersInLayer", 8};

◆ m_maxdYWindow

DoubleProperty MuonR4::NswSegmentFinderAlg::m_maxdYWindow {this, "maxdYWindow", 4.*Gaudi::Units::cm}
private

Definition at line 310 of file NswSegmentFinderAlg.h.

310{this, "maxdYWindow", 4.*Gaudi::Units::cm};

◆ m_maxInvalidClusters

UnsignedIntegerProperty MuonR4::NswSegmentFinderAlg::m_maxInvalidClusters {this, "maxInvalidClusters", 4}
private

Definition at line 289 of file NswSegmentFinderAlg.h.

289{this, "maxInvalidClusters", 4};

◆ m_maxUsed

UnsignedIntegerProperty MuonR4::NswSegmentFinderAlg::m_maxUsed {this, "maxHitIsUsed", 8}
private

Definition at line 298 of file NswSegmentFinderAlg.h.

298{this, "maxHitIsUsed", 8};

◆ m_minClusSize

UnsignedIntegerProperty MuonR4::NswSegmentFinderAlg::m_minClusSize {this, "minClusterSize", 1}
private

Definition at line 301 of file NswSegmentFinderAlg.h.

301{this, "minClusterSize", 1};

◆ m_minPullThreshold

DoubleProperty MuonR4::NswSegmentFinderAlg::m_minPullThreshold {this, "maxPull", 5.}
private

Definition at line 283 of file NswSegmentFinderAlg.h.

283{this, "maxPull", 5.};

◆ m_minSeedHits

UnsignedIntegerProperty MuonR4::NswSegmentFinderAlg::m_minSeedHits {this, "minSeedHits", 4}
private

Definition at line 286 of file NswSegmentFinderAlg.h.

286{this, "minSeedHits", 4};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_visionTool

ToolHandle<MuonValR4::IPatternVisualizationTool> MuonR4::NswSegmentFinderAlg::m_visionTool {this, "VisualizationTool", ""}
private

Pattern visualization tool.

Definition at line 271 of file NswSegmentFinderAlg.h.

271{this, "VisualizationTool", ""};

◆ m_windowTheta

DoubleProperty MuonR4::NswSegmentFinderAlg::m_windowTheta {this, "thetaWindow", 2.5 * Gaudi::Units::deg}
private

Definition at line 280 of file NswSegmentFinderAlg.h.

280{this, "thetaWindow", 2.5 * Gaudi::Units::deg};

◆ m_writeSegmentKey

SG::WriteHandleKey<SegmentContainer> MuonR4::NswSegmentFinderAlg::m_writeSegmentKey {this, "MuonNswSegmentWriteKey", "MuonNswSegments"}
private

Definition at line 262 of file NswSegmentFinderAlg.h.

262{this, "MuonNswSegmentWriteKey", "MuonNswSegments"};

◆ m_writeSegmentSeedKey

SG::WriteHandleKey<SegmentSeedContainer> MuonR4::NswSegmentFinderAlg::m_writeSegmentSeedKey {this, "MuonNswSegmentSeedWriteKey", "MuonNswSegmentSeeds"}
private

Definition at line 259 of file NswSegmentFinderAlg.h.

259{this, "MuonNswSegmentSeedWriteKey", "MuonNswSegmentSeeds"};

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