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", 6}
UnsignedIntegerProperty m_maxInvalidClusters {this, "maxInvalidClusters", 4}
BooleanProperty m_markHitsFromSeed {this, "markHitsFromSeed", true}
BooleanProperty m_doOnlyMMCombinatorics {this, "doOnlyMMCombinatorics", false}
UnsignedIntegerProperty m_maxUsed {this, "maxHitIsUsed", 6}
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 537 of file NswSegmentFinderAlg.cxx.

543 {
544
545 //go through the layers and build seeds from the combinations of hits
546 SegmentSeedVec_t seeds{};
547 SegmentVec_t segments{};
548 std::size_t layerSize = hitLayers.size();
549
550 if(layerSize < minLayers){
551 ATH_MSG_VERBOSE("Not enough layers to build a seed");
552 return {std::move(seeds), std::move(segments)};
553 }
554
555 //lamda helper to find the first unused strip hit on the layer
556 auto unusedStripHit = [&](const HitVec& layerHits, unsigned int layIdx) -> const SpacePoint* {
557 //in case of MM only combinatorial seeding - we consider only MM strip hits for seeding
558 bool isMM = useOnlyMM ? layerHits.front()->type() == xAOD::UncalibMeasType::MMClusterType : true;
559 for (auto [idx, hit] : Acts::enumerate(layerHits)) {
560 auto spOrient = classifyStrip(*hit);
561 bool isStrip = spOrient == StripOrient::X || spOrient == StripOrient::U || spOrient == StripOrient::V;
562 bool isUnused = usedHits[layIdx].at(idx) <= m_maxUsed;
563 if (isStrip && isUnused && isMM) {
564 return hit;
565 }
566 }
567 return nullptr;
568 };
569
570 std::array<const SpacePoint*, 4> seedHits{};
571 InitialSeedVec_t preLimSeeds{};
572
573 for (std::size_t i = 0; i < layerSize - 3; ++i) {
574 seedHits[0] = unusedStripHit(hitLayers[i], i);
575 if(!seedHits[0]) {
576 continue;
577 }
578 for (std::size_t j = i + 1; j < layerSize - 2; ++j) {
579 seedHits[1] = unusedStripHit(hitLayers[j], j);
580 if(!seedHits[1]){
581 continue;
582 }
583 for (std::size_t k = j + 1; k < layerSize - 1; ++k) {
584 seedHits[2] = unusedStripHit(hitLayers[k], k);
585 if(!seedHits[2]){
586 continue;
587 }
588 for (std::size_t l = k + 1; l < layerSize; ++l) {
589 seedHits[3] = unusedStripHit(hitLayers[l], l);
590 if(!seedHits[3]){
591 continue;
592 }
593
594 const HitLaySpan_t layers{hitLayers[i], hitLayers[j], hitLayers[k], hitLayers[l]};
595 //skip combination with at least one too busy layer
596 bool tooBusy = std::ranges::any_of(layers,
597 [this](const auto& layer) {
598 return layer.get().size() > m_maxClustersInLayer;
599 });
600 if (tooBusy) {
601 continue; // skip this combination
602 }
603
604 AmgSymMatrix(2) bMatrix = betaMatrix(seedHits);
605
606 if (std::abs(bMatrix.determinant()) < 1.e-6) {
607 continue;
608 }
609 ATH_MSG_DEBUG("Space point positions for seed layers: \n"
610 <<(*seedHits[0]) << ",\n"
611 <<(*seedHits[1]) << ",\n"
612 <<(*seedHits[2]) << ",\n"
613 <<(*seedHits[3]));
614
615
616 UsedHitSpan_t usedHitsSpan{usedHits[i], usedHits[j], usedHits[k], usedHits[l]};
617 // each layer may have more than one hit - take the hit combinations
618 constructPreliminarySeeds(beamSpotPos, layers, usedHitsSpan, preLimSeeds);
619
620 //the layers not participated in the seed build - gonna be used for the extension
621 HitLaySpan_t extensionLayers{};
622 UsedHitSpan_t usedExtensionHits{};
623 usedExtensionHits.reserve(hitLayers.size());
624 extensionLayers.reserve(hitLayers.size());
625 for (std::size_t e = 0 ; e < hitLayers.size(); ++e) {
626 if (!(e == i || e == j || e == k || e == l)){
627 extensionLayers.emplace_back(hitLayers[e]);
628 usedExtensionHits.emplace_back(usedHits[e]);
629 }
630 }
631 // we have made sure to have hits from all the four layers -
632 // start by 4 hits for the seed and try to build the extended seed for the combinatorics found
633 for (auto &combinatoricHits : preLimSeeds) {
634 auto seed = constructCombinatorialSeed(combinatoricHits, bMatrix, max, extensionLayers, usedExtensionHits);
635 if(!seed){
636 continue;
637 }
638 if (seed->getHitsInMax().size() < m_minSeedHits) {
639 seeds.push_back(std::move(seed));
640 continue;
641 }
642
643 std::unique_ptr<Segment> segment = fitSegmentSeed(ctx, gctx, seed.get());
644 processSegment(std::move(segment), seed->getHitsInMax(), hitLayers, usedHits, segments);
645 seeds.push_back(std::move(seed));
646
647 }
648 }
649 }
650 }
651 }
652 return std::make_pair(std::move(seeds),std::move(segments));
653}
#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.
UnsignedIntegerProperty m_minSeedHits
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
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)

◆ 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 437 of file NswSegmentFinderAlg.cxx.

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

832 {
833 // read the inputs
834 const EtaHoughMaxContainer *maxima{nullptr};
835 ATH_CHECK(SG::get( maxima, m_etaKey, ctx));
836
837 const ActsTrk::GeometryContext *gctx{nullptr};
838 ATH_CHECK(SG::get(gctx, m_geoCtxKey, ctx));
839
840 // prepare our output collection
841 SG::WriteHandle writeSegments{m_writeSegmentKey, ctx};
842 ATH_CHECK(writeSegments.record(std::make_unique<SegmentContainer>()));
843
844 SG::WriteHandle writeSegmentSeeds{m_writeSegmentSeedKey, ctx};
845 ATH_CHECK(writeSegmentSeeds.record(std::make_unique<SegmentSeedContainer>()));
846
847 // we use the information from the previous eta-hough transform
848 // to get the combined hits that belong in the same maxima
849 for (const HoughMaximum *max : *maxima) {
850
851 auto [seeds, segments] = findSegmentsFromMaximum(*max, *gctx, ctx);
852
853 if (msgLvl(MSG::VERBOSE)) {
854 for(const auto& hitMax : max->getHitsInMax()){
855 ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hitMax->identify())<<", "
856 <<Amg::toString(hitMax->localPosition())<<", dir: "
857 <<Amg::toString(hitMax->sensorDirection()));
858 }
859 }
860
861 for(auto& seed: seeds){
862
863 if (msgLvl(MSG::VERBOSE)){
864 std::stringstream sstr{};
865 sstr<<"Seed tanBeta = "<<seed->tanBeta()<<", y0 = "<<seed->interceptY()
866 <<", tanAlpha = "<<seed->tanAlpha()<<", x0 = "<<seed->interceptX()<<", hits in the seed "
867 <<seed->getHitsInMax().size()<<std::endl;
868
869 for(const auto& hit : seed->getHitsInMax()){
870 sstr<<" *** Hit "<<m_idHelperSvc->toString(hit->identify())<<", "
871 << Amg::toString(hit->localPosition())<<", dir: "<<Amg::toString(hit->sensorDirection())<<std::endl;
872 }
873 ATH_MSG_VERBOSE(sstr.str());
874 }
875 if (m_visionTool.isEnabled()) {
876 m_visionTool->visualizeSeed(ctx, *seed, "#phi-combinatorialSeed");
877 }
878
879 writeSegmentSeeds->push_back(std::move(seed));
880
881 }
882
883 for (auto &seg : segments) {
884
885 const Parameters pars = localSegmentPars(*gctx, *seg);
886
887 ATH_MSG_VERBOSE("Segment parameters : "<<toString(pars));
888
889 if (m_visionTool.isEnabled()) {
890 m_visionTool->visualizeSegment(ctx, *seg, "#phi-segment");
891 }
892
893 writeSegments->push_back(std::move(seg));
894
895 }
896 }
897
898 return StatusCode::SUCCESS;
899}
#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 901 of file NswSegmentFinderAlg.cxx.

901 {
902 if(m_seedCounter) {
903 m_seedCounter->printTableSeedStats(msgStream());
904 }
905 return StatusCode::SUCCESS;
906}

◆ 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 656 of file NswSegmentFinderAlg.cxx.

658 {
659 // first sort the hits per layer from the maximum
660 SpacePointPerLayerSplitter hitLayers{max.getHitsInMax()};
661
662 const HitLayVec& stripHitsLayers{hitLayers.stripHits()};
663 const std::size_t layerSize = stripHitsLayers.size();
664
665 //seeds and segments containers
666 SegmentSeedVec_t seeds{};
667 SegmentVec_t segments{};
668
669 const Amg::Transform3D globToLocal = max.msSector()->globalToLocalTransform(gctx);
670 //counters for the number of seeds, extented seeds and segments
671
672 if (layerSize < minLayers) {
673 ATH_MSG_VERBOSE("Not enough layers to build a seed");
674 return std::make_pair(std::move(seeds),std::move(segments));
675 }
676
677 if (m_visionTool.isEnabled()) {
679 constexpr double legX{0.2};
680 double legY{0.8};
681 for (const SpacePoint* sp : max.getHitsInMax()) {
682 const xAOD::MuonSimHit* simHit = getTruthMatchedHit(*sp->primaryMeasurement());
683 if (!simHit) {
684 continue;
685 }
686
687 const MuonGMR4::MuonReadoutElement* reEle = m_detMgr->getReadoutElement(simHit->identify());
688 const Amg::Transform3D toChamb = reEle->msSector()->globalToLocalTransform(gctx) *
689 reEle->localToGlobalTransform(gctx, sp->identify());
690
691 const Amg::Vector3D hitPos = toChamb * xAOD::toEigen(simHit->localPosition());
692 const Amg::Vector3D hitDir = toChamb.linear() * xAOD::toEigen(simHit->localDirection());
693 const double pull = std::sqrt(SeedingAux::chi2Term(hitPos, hitDir, *sp));
694
696 const auto* mmClust = static_cast<const xAOD::MMCluster*>(sp->primaryMeasurement());
697 const MuonGMR4::MmReadoutElement* mmEle = mmClust->readoutElement();
698 const auto& design = mmEle->stripLayer(mmClust->measurementHash()).design();
699 std::string stereoDesign{!design.hasStereoAngle() ? "X" : design.stereoAngle() >0 ? "U": "V"};
700 primitives.push_back(MuonValR4::drawLabel(std::format("ml: {:1d}, gap: {:1d}, {:}, pull: {:.2f}",
701 mmEle->multilayer(), mmClust->gasGap(),
702 stereoDesign, pull), legX, legY, 14));
703 } else if(sp->type() == xAOD::UncalibMeasType::sTgcStripType) {
704 const auto* sTgcMeas = static_cast<const xAOD::sTgcMeasurement*>(sp->primaryMeasurement());
705 std::string channelString = sp->secondaryMeasurement() == nullptr ?
706 sTgcChannelType(sTgcMeas->channelType()) :
707 std::format("{:}/{:}", sTgcChannelType(sTgcMeas->channelType()),
708 sTgcChannelType(static_cast<const xAOD::sTgcMeasurement*>(sp->secondaryMeasurement())->channelType()));
709 primitives.push_back(MuonValR4::drawLabel(std::format("ml: {:1d}, gap: {:1d}, type: {:}, pull: {:.2f}",
710 sTgcMeas->readoutElement()->multilayer(), sTgcMeas->gasGap(),
711 channelString, pull), legX, legY, 14));
712 }
713 legY-=0.05;
714 }
715 m_visionTool->visualizeBucket(ctx, *max.parentBucket(),
716 "truth", std::move(primitives));
717 }
718
719 UsedHitMarker_t allUsedHits = emptyBookKeeper(stripHitsLayers);
720 std::size_t nSeeds{0}, nExtSeeds{0}, nSegments{0}; //for the seed statistics
721
722 // helper lamda function to increase counters and fill the seeds and segments we want to return after we construct them
723 // the extended seeds are returned even if they did not make it to a segment and the segments only if successfully fitted
724 auto processSeedsAndSegments = [&](std::pair<SegmentSeedVec_t, SegmentVec_t>&& seedSegmentPairs, std::string_view source) {
725 auto& [returnSeeds, returnSegments] = seedSegmentPairs;
726 ATH_MSG_DEBUG("From " << source << ": built " << returnSeeds.size() << " seeds and " << returnSegments.size() << " segments.");
727 for(auto& seed : returnSeeds) {
728 ++nSeeds;
729 if(seed->getHitsInMax().size() < m_minSeedHits){
730 continue;
731 }
732 ++nExtSeeds;
733 seeds.push_back(std::move(seed));
734 }
735 //move all the segments to the output container
736 std::ranges::move(returnSegments, std::back_inserter(segments));
737 nSegments += returnSegments.size();
738 };
739
740 //Start from outermost sTgc layers with combined 2D measurements
741 ATH_MSG_VERBOSE("Start building seed from sTgc outermost layers");
742 processSeedsAndSegments(buildSegmentsFromSTGC(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits), "sTgc segment seeds");
743
744 //continue with the combinatorial seeding for the strip measurements
746
747 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, true), "MM combinatoric segment seeds");
748
749 }else{
750
751 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, true), "MM combinatoric segment seeds");
752 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, false), "MM and STGC combinatoric segment seeds");
753
754 }
755
756 if(m_seedCounter) {
757 m_seedCounter->addToStat(max.msSector(), nSeeds, nExtSeeds, nSegments);
758 }
759
760 return std::make_pair(std::move(seeds),std::move(segments));
761}
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
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 if (msgLvl(MSG::VERBOSE)) {
379 std::stringstream hitStream{};
380 for (const auto& hit : patternSeed->getHitsInMax()) {
381 hitStream<<"**** "<< (*hit)<<std::endl;
382 }
383 ATH_MSG_VERBOSE(__func__<<"() - "<<__LINE__ <<": Uncalibrated space points for the segment fit: "<<std::endl
384 <<hitStream.str());
385 }
386
387 //Calibration of the seed spacepoints
388 CalibSpacePointVec calibratedHits = m_calibTool->calibrate(ctx, patternSeed->getHitsInMax(),
389 patternSeed->localPosition(),
390 patternSeed->localDirection(), 0.);
391
392 const Amg::Transform3D& locToGlob{patternSeed->msSector()->localToGlobalTransform(gctx)};
393
394 return m_lineFitter->fitSegment(ctx, patternSeed, patternSeed->parameters(),
395 locToGlob, std::move(calibratedHits));
396}
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 763 of file NswSegmentFinderAlg.cxx.

767 {
768
769 SpacePointPerLayerSorter layerSorter{};
770
771 for(const auto& sp : spacePoints){
772 // Proection against the auxiliary measurement
773 if(!sp){
774 continue;
775 }
776
777 unsigned measLayer = layerSorter.sectorLayerNum(*sp);
778
779 Amg::Vector2D spPosX{Amg::Vector2D::Zero()};
781 switch (sp->primaryMeasurement()->numDimensions()) {
782 case 1:
783 spPosX[Amg::x] = sp->primaryMeasurement()->localPosition<1>().x();
784 break;
785 case 2:
786 spPosX = xAOD::toEigen(sp->primaryMeasurement()->localPosition<2>());
787 break;
788 default:
789 THROW_EXCEPTION("Unsupported dimension");
790 }
791
792 for (std::size_t lIdx = 0; lIdx < allSortHits.size(); ++lIdx) {
793 const HitVec& hVec{allSortHits[lIdx]};
794 //check if they are not in the same layer
795 unsigned hitLayer = layerSorter.sectorLayerNum(*hVec.front());
796 if(hitLayer != measLayer) {
797 ATH_MSG_VERBOSE("Not in the same layer since measLayer = "<< measLayer << " and "<<hitLayer);
798 continue;
799 }
800 for (std::size_t hIdx = 0 ; hIdx < hVec.size(); ++hIdx) {
801 //check the dY between the measurement and the hits
802 auto testHit = hVec[hIdx];
803 if (testHit == sp) {
804 usedHitMarker[lIdx][hIdx] += incr;
805 if(!markNeighborHits){
806 break;
807 }
808 } else if (markNeighborHits) {
809 Amg::Vector2D testPosX{Amg::Vector2D::Zero()};
811 switch (testHit->primaryMeasurement()->numDimensions()) {
812 case 1:
813 testPosX[Amg::x] = testHit->primaryMeasurement()->localPosition<1>().x();
814 break;
815 case 2:
816 testPosX = xAOD::toEigen(testHit->primaryMeasurement()->localPosition<2>());
817 break;
818 default:
819 THROW_EXCEPTION("Unsupported dimension");
820 }
821 //if the hit not found let's see if it is too close to the segment's measurement
822 double deltaX = (testPosX - spPosX).mag();
823 if(deltaX < m_maxdYWindow){
824 usedHitMarker[lIdx][hIdx] += incr;
825 }
826 }
827 }
828 }
829 }
830}
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 398 of file NswSegmentFinderAlg.cxx.

402 {
403
404 if (!segment) {
405 ATH_MSG_VERBOSE("Seed Rejection: Segment fit failed");
406
407 if (m_markHitsFromSeed && seedHits.size() > m_minSeedHits) {
408 // Mark hits from extended seed (used increment by 1)
409 markHitsAsUsed(seedHits, hitLayers, usedHits, 1, false);
410 }
411 return;
412 }
413
414 // -------- success path --------
415 ATH_MSG_DEBUG("Segment built with "
416 << segment->measurements().size()
417 << " hits, chi2/ndof: "
418 << segment->chi2() / std::max(1u,segment->nDoF()));
419
420 HitVec segMeasSP;
421 segMeasSP.reserve(segment->measurements().size());
422
423 std::ranges::transform(
424 segment->measurements(),
425 std::back_inserter(segMeasSP),
426 [](const auto& m) { return m->spacePoint(); }
427 );
428
429 // Mark segment hits as fully used (used increment by 10,
430 // hits are effectively removed)
431 markHitsAsUsed(segMeasSP, hitLayers, usedHits, 10, true);
432 segments.push_back(std::move(segment));
433
434}
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", 6}
private

Definition at line 298 of file NswSegmentFinderAlg.h.

298{this, "maxHitIsUsed", 6};

◆ 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", 6}
private

Definition at line 286 of file NswSegmentFinderAlg.h.

286{this, "minSeedHits", 6};

◆ 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: