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}
DoubleProperty m_maxTanAlpha {this, "maxTanAlpha", 0.2}
BooleanProperty m_dumpSeedStatistics {this, "dumpStatistics", true}
BooleanProperty m_dumpObj {this, "dumpObj", false}
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 543 of file NswSegmentFinderAlg.cxx.

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

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

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

867 {
868 // read the inputs
869 const EtaHoughMaxContainer *maxima{nullptr};
870 ATH_CHECK(SG::get( maxima, m_etaKey, ctx));
871
872 const ActsTrk::GeometryContext *gctx{nullptr};
873 ATH_CHECK(SG::get(gctx, m_geoCtxKey, ctx));
874
875 // prepare our output collection
876 SG::WriteHandle writeSegments{m_writeSegmentKey, ctx};
877 ATH_CHECK(writeSegments.record(std::make_unique<SegmentContainer>()));
878
879 SG::WriteHandle writeSegmentSeeds{m_writeSegmentSeedKey, ctx};
880 ATH_CHECK(writeSegmentSeeds.record(std::make_unique<SegmentSeedContainer>()));
881
882 // we use the information from the previous eta-hough transform
883 // to get the combined hits that belong in the same maxima
884 for (const HoughMaximum *max : *maxima) {
885
886 auto [seeds, segments] = findSegmentsFromMaximum(*max, *gctx, ctx);
887
888 if (msgLvl(MSG::VERBOSE)) {
889 ATH_MSG_VERBOSE("Hits from Hough maximum");
890 for(const auto& hitMax : max->getHitsInMax()){
891 ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hitMax->identify())<<", "
892 <<Amg::toString(hitMax->localPosition())<<", dir: "
893 <<Amg::toString(hitMax->sensorDirection()));
894 }
895 }
896
897 for(auto& seed: seeds){
898
899 if (msgLvl(MSG::VERBOSE)){
900 std::stringstream sstr{};
901 sstr<<"Seed tanBeta = "<<seed->tanBeta()<<", y0 = "<<seed->interceptY()
902 <<", tanAlpha = "<<seed->tanAlpha()<<", x0 = "<<seed->interceptX()<<", hits in the seed "
903 <<seed->getHitsInMax().size()<<std::endl;
904
905 for(const auto& hit : seed->getHitsInMax()){
906 sstr<<" *** Hit "<<m_idHelperSvc->toString(hit->identify())<<", "
907 << Amg::toString(hit->localPosition())<<", dir: "<<Amg::toString(hit->sensorDirection())<<std::endl;
908 }
909 ATH_MSG_VERBOSE(sstr.str());
910 }
911 if (m_visionTool.isEnabled()) {
912 m_visionTool->visualizeSeed(ctx, *seed, "#phi-combinatorialSeed");
913 }
914
915 writeSegmentSeeds->push_back(std::move(seed));
916
917 }
918
919 for (auto &seg : segments) {
920 const Parameters pars = localSegmentPars(*gctx, *seg);
921
922 ATH_MSG_VERBOSE("Segment parameters : "<<toString(pars));
923
924 if (m_visionTool.isEnabled()) {
925 m_visionTool->visualizeSegment(ctx, *seg, "#phi-segment");
926 }
927
928 if(m_dumpObj){
929 Acts::ObjVisualization3D visualHelper{};
930 MuonValR4::drawSegmentMeasurements(*gctx, *seg, visualHelper);
931 MuonValR4::drawSegmentLine(*gctx, *seg, visualHelper);
932 visualHelper.write(std::format("Event_{:}_segment_{:}.obj", ctx.eventID().event_number(), seg->msSector()->identString()));
933 }
934
935 writeSegments->push_back(std::move(seg));
936
937 }
938 }
939
940 return StatusCode::SUCCESS;
941}
#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
void drawSegmentMeasurements(const ActsTrk::GeometryContext &gctx, const xAOD::MuonSegment &segment, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewSensitive)
Draw all uncalibrated measurements associated to the segment.
void drawSegmentLine(const ActsTrk::GeometryContext &gctx, const xAOD::MuonSegment &segment, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewLine, const double standardLength=1.*Gaudi::Units::m)
Draw a segment line inside the obj file.
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())<<" and pull "<<pull);
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 943 of file NswSegmentFinderAlg.cxx.

943 {
944 if(m_seedCounter) {
945 m_seedCounter->printTableSeedStats(msgStream());
946 }
947 return StatusCode::SUCCESS;
948}

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

663 {
664 // first sort the hits per layer from the maximum
665 SpacePointPerLayerSplitter hitLayers{max.getHitsInMax()};
666
667 const HitLayVec& stripHitsLayers{hitLayers.stripHits()};
668 const std::size_t layerSize = stripHitsLayers.size();
669
670 //seeds and segments containers
671 SegmentSeedVec_t seeds{};
672 SegmentVec_t segments{};
673
674 const Amg::Transform3D globToLocal = max.msSector()->globalToLocalTransform(gctx);
675 //counters for the number of seeds, extented seeds and segments
676
677 if (layerSize < minLayers) {
678 ATH_MSG_VERBOSE("Not enough layers to build a seed");
679 return std::make_pair(std::move(seeds),std::move(segments));
680 }
681
682 if (m_visionTool.isEnabled()) {
684 constexpr double legX{0.2};
685 double legY{0.8};
686 for (const SpacePoint* sp : max.getHitsInMax()) {
687 const xAOD::MuonSimHit* simHit = getTruthMatchedHit(*sp->primaryMeasurement());
688 if (!simHit) {
689 continue;
690 }
691
692 const MuonGMR4::MuonReadoutElement* reEle = m_detMgr->getReadoutElement(simHit->identify());
693 const Amg::Transform3D toChamb = reEle->msSector()->globalToLocalTransform(gctx) *
694 reEle->localToGlobalTransform(gctx, sp->identify());
695
696 const Amg::Vector3D hitPos = toChamb * xAOD::toEigen(simHit->localPosition());
697 const Amg::Vector3D hitDir = toChamb.linear() * xAOD::toEigen(simHit->localDirection());
698 const double pull = std::sqrt(SeedingAux::chi2Term(hitPos, hitDir, *sp));
699
701 const auto* mmClust = static_cast<const xAOD::MMCluster*>(sp->primaryMeasurement());
702 const MuonGMR4::MmReadoutElement* mmEle = mmClust->readoutElement();
703 const auto& design = mmEle->stripLayer(mmClust->measurementHash()).design();
704 std::string stereoDesign{!design.hasStereoAngle() ? "X" : design.stereoAngle() >0 ? "U": "V"};
705 primitives.push_back(MuonValR4::drawLabel(std::format("ml: {:1d}, gap: {:1d}, {:}, pull: {:.2f}",
706 mmEle->multilayer(), mmClust->gasGap(),
707 stereoDesign, pull), legX, legY, 14));
708 } else if(sp->type() == xAOD::UncalibMeasType::sTgcStripType) {
709 const auto* sTgcMeas = static_cast<const xAOD::sTgcMeasurement*>(sp->primaryMeasurement());
710 std::string channelString = sp->secondaryMeasurement() == nullptr ?
711 sTgcChannelType(sTgcMeas->channelType()) :
712 std::format("{:}/{:}", sTgcChannelType(sTgcMeas->channelType()),
713 sTgcChannelType(static_cast<const xAOD::sTgcMeasurement*>(sp->secondaryMeasurement())->channelType()));
714 primitives.push_back(MuonValR4::drawLabel(std::format("ml: {:1d}, gap: {:1d}, type: {:}, pull: {:.2f}",
715 sTgcMeas->readoutElement()->multilayer(), sTgcMeas->gasGap(),
716 channelString, pull), legX, legY, 14));
717 }
718 legY-=0.05;
719 }
720 m_visionTool->visualizeBucket(ctx, *max.parentBucket(),
721 "truth", std::move(primitives));
722 }
723
724 //dump spacepoints associated with truth sim hits to an obj file
725 if(m_dumpObj){
726 Acts::ObjVisualization3D visualHelper{};
727 for (const SpacePoint* sp : max.getHitsInMax()) {
728 const xAOD::MuonSimHit* simHit = getTruthMatchedHit(*sp->primaryMeasurement());
729 if (!simHit) {
730 continue;
731 }
732 MuonValR4::drawSpacePoint(gctx, *sp, visualHelper);
733 }
734 visualHelper.write(std::format("Event_{:}_{:}_spacepoints_truth.obj", ctx.eventID().event_number(), max.getHitsInMax().front()->chamber()->identString()));
735 }
736
737
738 UsedHitMarker_t allUsedHits = emptyBookKeeper(stripHitsLayers);
739 std::size_t nSeeds{0}, nExtSeeds{0}, nSegments{0}; //for the seed statistics
740
741 // helper lamda function to increase counters and fill the seeds and segments we want to return after we construct them
742 // the extended seeds are returned even if they did not make it to a segment and the segments only if successfully fitted
743 auto processSeedsAndSegments = [&](std::pair<SegmentSeedVec_t, SegmentVec_t>&& seedSegmentPairs, std::string_view source) {
744 auto& [returnSeeds, returnSegments] = seedSegmentPairs;
745 ATH_MSG_DEBUG("From " << source << ": built " << returnSeeds.size() << " seeds and " << returnSegments.size() << " segments.");
746 for(auto& seed : returnSeeds) {
747 ++nSeeds;
748 Acts::ObjVisualization3D visualHelper{};
749 if(seed->getHitsInMax().size() < m_minSeedHits){
750 ATH_MSG_VERBOSE("Seed with "<< seed->getHitsInMax().size() <<" hits rejected");
751 for(const auto& hit : seed->getHitsInMax()){
752 ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hit->identify())<<", "
753 <<Amg::toString(hit->localPosition())<<", dir: "
754 <<Amg::toString(hit->sensorDirection()));
755 if(m_dumpObj){
756 MuonValR4::drawSpacePoint(gctx, *hit, visualHelper);
757 }
758
759 }
760 if(m_dumpObj){
761 visualHelper.write(std::format("Event_{:}_{:}_notExtendedSeed.obj", ctx.eventID().event_number(), seed->getHitsInMax().front()->chamber()->identString()));
762 }
763 continue;
764 }
765 ++nExtSeeds;
766 seeds.push_back(std::move(seed));
767 }
768 //move all the segments to the output container
769 std::ranges::move(returnSegments, std::back_inserter(segments));
770 nSegments += returnSegments.size();
771 };
772
773 //Start from outermost sTgc layers with combined 2D measurements
774 ATH_MSG_VERBOSE("Start building seed from sTgc outermost layers");
775 processSeedsAndSegments(buildSegmentsFromSTGC(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits), "sTgc segment seeds");
776
777 //continue with the combinatorial seeding for the strip measurements
779
780 ATH_MSG_VERBOSE("Start building combinatoric seeds only from Micromegas");
781 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, true), "MM combinatoric segment seeds");
782
783 }else{
784
785 ATH_MSG_VERBOSE("Start building combinatoric seeds from Micromegas and sTgc hits");
786 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, true), "MM combinatoric segment seeds");
787 processSeedsAndSegments(buildSegmentsFromMM(ctx, gctx, stripHitsLayers, max, globToLocal.translation(), allUsedHits, false), "MM and STGC combinatoric segment seeds");
788
789 }
790
791 if(m_seedCounter) {
792 m_seedCounter->addToStat(max.msSector(), nSeeds, nExtSeeds, nSegments);
793 }
794
795 return std::make_pair(std::move(seeds),std::move(segments));
796}
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 double textSize=18, const bool useNDC=true, const int color=kBlack)
Create a TLatex label,.
void drawSpacePoint(const ActsTrk::GeometryContext &gctx, const MuonR4::SpacePoint &spacePoint, Acts::ObjVisualization3D &visualHelper, const Acts::ViewConfig &viewConfig=Acts::s_viewSensitive)
Draw an uncalibrated space point inside the obj file.
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 374 of file NswSegmentFinderAlg.cxx.

376 {
377
378 if(patternSeed->getHitsInMax().size() < m_minSeedHits){
379 ATH_MSG_VERBOSE("Not enough hits in the SegmentSeed to fit a segment");
380 return nullptr;
381 }
382
383 ATH_MSG_VERBOSE("Fit the SegmentSeed");
384 if (msgLvl(MSG::VERBOSE)) {
385 std::stringstream hitStream{};
386 for (const auto& hit : patternSeed->getHitsInMax()) {
387 hitStream<<"**** "<< (*hit)<<std::endl;
388 }
389 ATH_MSG_VERBOSE(__func__<<"() - "<<__LINE__ <<": Uncalibrated space points for the segment fit: "<<std::endl
390 <<hitStream.str());
391 }
392
393 //Calibration of the seed spacepoints
394 CalibSpacePointVec calibratedHits = m_calibTool->calibrate(ctx, patternSeed->getHitsInMax(),
395 patternSeed->localPosition(),
396 patternSeed->localDirection(), 0.);
397
398 const Amg::Transform3D& locToGlob{patternSeed->msSector()->localToGlobalTransform(gctx)};
399
400 return m_lineFitter->fitSegment(ctx, patternSeed, patternSeed->parameters(),
401 locToGlob, std::move(calibratedHits));
402}
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()}));
84 ATH_CHECK(detStore()->retrieve(m_detMgr));
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

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

802 {
803
804 SpacePointPerLayerSorter layerSorter{};
805
806 for(const auto& sp : spacePoints){
807 // Proection against the auxiliary measurement
808 if(!sp){
809 continue;
810 }
811
812 unsigned measLayer = layerSorter.sectorLayerNum(*sp);
813
814 Amg::Vector2D spPosX{Amg::Vector2D::Zero()};
816 switch (sp->primaryMeasurement()->numDimensions()) {
817 case 1:
818 spPosX[Amg::x] = sp->primaryMeasurement()->localPosition<1>().x();
819 break;
820 case 2:
821 spPosX = xAOD::toEigen(sp->primaryMeasurement()->localPosition<2>());
822 break;
823 default:
824 THROW_EXCEPTION("Unsupported dimension");
825 }
826
827 for (std::size_t lIdx = 0; lIdx < allSortHits.size(); ++lIdx) {
828 const HitVec& hVec{allSortHits[lIdx]};
829 //check if they are not in the same layer
830 unsigned hitLayer = layerSorter.sectorLayerNum(*hVec.front());
831 if(hitLayer != measLayer) {
832 ATH_MSG_VERBOSE("Not in the same layer since measLayer = "<< measLayer << " and "<<hitLayer);
833 continue;
834 }
835 for (std::size_t hIdx = 0 ; hIdx < hVec.size(); ++hIdx) {
836 //check the dY between the measurement and the hits
837 auto testHit = hVec[hIdx];
838 if (testHit == sp) {
839 usedHitMarker[lIdx][hIdx] += incr;
840 if(!markNeighborHits){
841 break;
842 }
843 } else if (markNeighborHits) {
844 Amg::Vector2D testPosX{Amg::Vector2D::Zero()};
846 switch (testHit->primaryMeasurement()->numDimensions()) {
847 case 1:
848 testPosX[Amg::x] = testHit->primaryMeasurement()->localPosition<1>().x();
849 break;
850 case 2:
851 testPosX = xAOD::toEigen(testHit->primaryMeasurement()->localPosition<2>());
852 break;
853 default:
854 THROW_EXCEPTION("Unsupported dimension");
855 }
856 //if the hit not found let's see if it is too close to the segment's measurement
857 double deltaX = (testPosX - spPosX).mag();
858 if(deltaX < m_maxdYWindow){
859 usedHitMarker[lIdx][hIdx] += incr;
860 }
861 }
862 }
863 }
864 }
865}
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 404 of file NswSegmentFinderAlg.cxx.

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

321{};

◆ 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 323 of file NswSegmentFinderAlg.h.

323{};

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

BooleanProperty MuonR4::NswSegmentFinderAlg::m_dumpObj {this, "dumpObj", false}
private

Definition at line 319 of file NswSegmentFinderAlg.h.

319{this, "dumpObj", false};

◆ m_dumpSeedStatistics

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

Definition at line 316 of file NswSegmentFinderAlg.h.

316{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_maxTanAlpha

DoubleProperty MuonR4::NswSegmentFinderAlg::m_maxTanAlpha {this, "maxTanAlpha", 0.2}
private

Definition at line 313 of file NswSegmentFinderAlg.h.

313{this, "maxTanAlpha", 0.2};

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