ATLAS Offline Software
Loading...
Searching...
No Matches
MuonSegmentConverterTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6
10
11namespace {
12 const SG::AuxElement::Accessor<float> acc_clusterTime("clusterTime");
13 const SG::AuxElement::Accessor<float> acc_clusterTimeError("clusterTimeError");
14 const SG::AuxElement::Accessor<bool> acc_clusterTimeValid("clusterTimeValid");
15
16 const SG::AuxElement::Accessor<uint8_t> acc_mmStereoHits("N_MicromegaStereoHits");
17 const SG::AuxElement::Accessor<uint8_t> acc_mmEtaHits("N_MicromegaEtaHits");
18
19 const SG::AuxElement::Accessor<uint8_t> acc_stgcEtaHits("N_StgcEtaHits");
20 const SG::AuxElement::Accessor<uint8_t> acc_stgcPhiHits("N_StgcPhiHits");
21}
22
23namespace Muon {
24
25MuonSegmentConverterTool::MuonSegmentConverterTool(const std::string& t, const std::string& n, const IInterface* p)
26 : base_class(t, n, p) {}
27
28StatusCode
30{
31 ATH_CHECK(m_hitSummaryTool.retrieve());
32 ATH_CHECK(m_idHelperSvc.retrieve());
33 ATH_CHECK(m_edmHelper.retrieve());
34 ATH_CHECK(m_hitTimingTool.retrieve());
35
36 return StatusCode::SUCCESS;
37}
38
41 xAOD::MuonSegmentContainer* container) const
42{
43 // sanity checks
44 if (!segLink.isValid() || !*segLink) {
45 ATH_MSG_WARNING(" Got invalid element link");
46 return nullptr;
47 }
48 const MuonSegment* seg = dynamic_cast<const MuonSegment*>(*segLink);
49 if (!seg) {
50 ATH_MSG_WARNING(" Trk::Segment is not a MuonSegment ");
51 return nullptr;
52 }
53
54 // create xAOD::Muon and set link
55 xAOD::MuonSegment* xaodSeg = convert(*seg, container);
56 if (xaodSeg) xaodSeg->setMuonSegment(segLink);
57 return xaodSeg;
58}
59
60
61void
63{
64
65 // loop over hits and extract clusters
66 std::vector<const MuonClusterOnTrack*> clusters;
67 for (const Trk::MeasurementBase* meas : seg.containedMeasurements()) {
68
69 // get Identifier and remove MDT hits
70 Identifier id = m_edmHelper->getIdentifier(*meas);
71 if (!id.is_valid() || !m_idHelperSvc->isTrigger(id)) continue;
72
73 // cast to MuonClusterOnTrack
74 const MuonClusterOnTrack* clus = dynamic_cast<const MuonClusterOnTrack*>(meas);
75 if (clus)
76 clusters.push_back(clus);
77 else {
78 const CompetingMuonClustersOnTrack* crot = dynamic_cast<const CompetingMuonClustersOnTrack*>(meas);
79 if (!crot){
80 continue;
81 }
82 std::ranges::transform(crot->containedROTs(), std::back_inserter(clusters),
83 [](const auto& rot) { return rot.get();});
84 }
85 }
86
87 // call timing tool and dress xaodSeg
88 IMuonHitTimingTool::TimingResult result = m_hitTimingTool->calculateTimingResult(clusters);
89 if (std::abs(result.time) > std::numeric_limits<float>::max()
90 || std::abs(result.error) > std::numeric_limits<float>::max())
91 {
92 // xAOD stores this as a float. To avoid FPE, we need to check here...
93 if (result.valid)
94 ATH_MSG_WARNING("Unphysical time returned by tool - ignoring. result.valid = "
95 + std::to_string(result.valid));
96 acc_clusterTime(xaodSeg) = std::numeric_limits<float>::max();
97 acc_clusterTimeError(xaodSeg) = std::numeric_limits<float>::max();
98 acc_clusterTimeValid(xaodSeg) = 0;
99 } else {
100 acc_clusterTime(xaodSeg) = result.time;
101 acc_clusterTimeError(xaodSeg) = result.error;
102 acc_clusterTimeValid(xaodSeg) = result.valid;
103 }
104}
105
106
109{
110
111 // create xAOD::MuonSegment
112 xAOD::MuonSegment* xaodSeg = new xAOD::MuonSegment();
113 if (container)
114 container->push_back(xaodSeg);
115 else
116 xaodSeg->makePrivateStore();
117
118 // set position and direction
119 xaodSeg->setPosition(seg.globalPosition().x(), seg.globalPosition().y(), seg.globalPosition().z());
120 xaodSeg->setDirection(seg.globalDirection().x(), seg.globalDirection().y(), seg.globalDirection().z());
121
122 // fit chi2
123 const Trk::FitQuality* fq = seg.fitQuality();
124 if (fq) xaodSeg->setFitQuality(fq->chiSquared(), fq->numberDoF());
125
126 // identifier
127 Identifier id = m_edmHelper->chamberId(seg);
128 int eta = m_idHelperSvc->stationEta(id);
129 int sector = m_idHelperSvc->sector(id);
131 MuonStationIndex::TechnologyIndex technology = m_idHelperSvc->technologyIndex(id);
132 xaodSeg->setIdentifier(sector, chIndex, eta, technology);
133
134 // hit counts
135 IMuonSegmentHitSummaryTool::HitCounts hitCounts = m_hitSummaryTool->getHitCounts(seg);
136 xaodSeg->setNHits(hitCounts.nmdtHits()+ hitCounts.nmmHits() + hitCounts.nstgcHits.netaHits + hitCounts.ncscHits.netaHits,
137 hitCounts.nphiTrigHitLayers + hitCounts.nstgcHits.nphiHits, hitCounts.netaTrigHitLayers);
138
139 // MDT + cluster timing
140 if (seg.hasFittedT0()) xaodSeg->setT0Error(seg.time(), seg.errorTime());
141 if (!m_hitTimingTool.empty()) addClusterTiming(seg, *xaodSeg);
143 if (m_idHelperSvc->hasMM()) {
144 acc_mmStereoHits(*xaodSeg) = hitCounts.nmmStereoHits;
145 acc_mmEtaHits(*xaodSeg) = hitCounts.nmmEtaHits;
146 }
147 if (m_idHelperSvc->hasSTGC()) {
148 acc_stgcEtaHits(*xaodSeg) = hitCounts.nstgcHits.netaHits;
149 acc_stgcPhiHits(*xaodSeg) = hitCounts.nstgcHits.nphiHits;
150 }
151 return xaodSeg;
152}
153
154
155} // namespace Muon
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
Class for competing MuonClusters, it extends the Trk::CompetingRIOsOnTrack base class.
const std::vector< std::unique_ptr< const MuonClusterOnTrack > > & containedROTs() const
returns the vector of SCT_ClusterOnTrack objects .
Base class for Muon cluster RIO_OnTracks.
MuonSegmentConverterTool(const std::string &, const std::string &, const IInterface *)
default AlgTool constructor
void addClusterTiming(const MuonSegment &seg, xAOD::MuonSegment &xaodSeg) const
helper function to dress output segment with cluster hit timing information
ToolHandle< IMuonHitTimingTool > m_hitTimingTool
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
ServiceHandle< IMuonEDMHelperSvc > m_edmHelper
ToolHandle< IMuonSegmentHitSummaryTool > m_hitSummaryTool
xAOD::MuonSegment * convert(const ElementLink< ::Trk::SegmentCollection > &segLink, xAOD::MuonSegmentContainer *container=0) const
convert a ElementLink to a Trk::Segment (should be of type MuonSegment) to a xAOD::MuonSegment,...
StatusCode initialize()
initialize method, method taken from bass-class AlgTool
This is the common class for 3D segments used in the muon spectrometer.
virtual const Amg::Vector3D & globalPosition() const override final
global position
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition FitQuality.h:97
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition FitQuality.h:60
double chiSquared() const
returns the of the overall track fit
Definition FitQuality.h:56
This class is the pure abstract base class for all fittable tracking measurements.
const FitQuality * fitQuality() const
return the FitQuality object, returns NULL if no FitQuality is defined
const std::vector< const Trk::MeasurementBase * > & containedMeasurements() const
returns the vector of Trk::MeasurementBase objects
float errorTime() const
access to the error on the measured time
float time() const
access to the measured time
void setDirection(float px, float py, float pz)
Sets the direction.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
void setNHits(int nPrecisionHits, int nPhiLayers, int nTrigEtaLayers)
Set the number of hits/layers.
void setT0Error(float t0, float t0Error)
Sets the time error.
void setIdentifier(int sector, ::Muon::MuonStationIndex::ChIndex chamberIndex, int etaIndex, ::Muon::MuonStationIndex::TechnologyIndex technology)
Set the identifier.
void setMuonSegment(const ElementLink< ::Trk::SegmentCollection > &segment)
void setPosition(float x, float y, float z)
Sets the global position.
ChIndex chIndex(const std::string &index)
convert ChIndex name string to enum
TechnologyIndex
enum to classify the different layers in the muon spectrometer
ChIndex
enum to classify the different chamber layers in the muon spectrometer
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
MuonSegmentContainer_v1 MuonSegmentContainer
Definition of the current "MuonSegment container version".
MuonSegment_v1 MuonSegment
Reference the current persistent version:
simple struct holding the result of the tool
uint8_t nmmStereoHits
Number of eta micromega hits.
uint8_t nmdtHits() const
Returns the number of hits in both MDT layers.
uint8_t nmmHits() const
Returns the number of hits in the micromegas.
uint8_t nphiTrigHitLayers
Number of eta stereo hits.