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
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 || crot->containedROTs().empty()) continue;
80 clusters.insert(clusters.end(), crot->containedROTs().begin(), crot->containedROTs().end());
81 }
82 }
83
84 // call timing tool and dress xaodSeg
85 IMuonHitTimingTool::TimingResult result = m_hitTimingTool->calculateTimingResult(clusters);
86 if (std::abs(result.time) > std::numeric_limits<float>::max()
87 || std::abs(result.error) > std::numeric_limits<float>::max())
88 {
89 // xAOD stores this as a float. To avoid FPE, we need to check here...
90 if (result.valid)
91 ATH_MSG_WARNING("Unphysical time returned by tool - ignoring. result.valid = "
92 + std::to_string(result.valid));
93 acc_clusterTime(xaodSeg) = std::numeric_limits<float>::max();
94 acc_clusterTimeError(xaodSeg) = std::numeric_limits<float>::max();
95 acc_clusterTimeValid(xaodSeg) = 0;
96 } else {
97 acc_clusterTime(xaodSeg) = result.time;
98 acc_clusterTimeError(xaodSeg) = result.error;
99 acc_clusterTimeValid(xaodSeg) = result.valid;
100 }
101}
102
103
106{
107
108 // create xAOD::MuonSegment
109 xAOD::MuonSegment* xaodSeg = new xAOD::MuonSegment();
110 if (container)
111 container->push_back(xaodSeg);
112 else
113 xaodSeg->makePrivateStore();
114
115 // set position and direction
116 xaodSeg->setPosition(seg.globalPosition().x(), seg.globalPosition().y(), seg.globalPosition().z());
117 xaodSeg->setDirection(seg.globalDirection().x(), seg.globalDirection().y(), seg.globalDirection().z());
118
119 // fit chi2
120 const Trk::FitQuality* fq = seg.fitQuality();
121 if (fq) xaodSeg->setFitQuality(fq->chiSquared(), fq->numberDoF());
122
123 // identifier
124 Identifier id = m_edmHelper->chamberId(seg);
125 int eta = m_idHelperSvc->stationEta(id);
126 int sector = m_idHelperSvc->sector(id);
128 MuonStationIndex::TechnologyIndex technology = m_idHelperSvc->technologyIndex(id);
129 xaodSeg->setIdentifier(sector, chIndex, eta, technology);
130
131 // hit counts
132 IMuonSegmentHitSummaryTool::HitCounts hitCounts = m_hitSummaryTool->getHitCounts(seg);
133 xaodSeg->setNHits(hitCounts.nmdtHits()+ hitCounts.nmmHits() + hitCounts.nstgcHits.netaHits + hitCounts.ncscHits.netaHits,
134 hitCounts.nphiTrigHitLayers + hitCounts.nstgcHits.nphiHits, hitCounts.netaTrigHitLayers);
135
136 // MDT + cluster timing
137 if (seg.hasFittedT0()) xaodSeg->setT0Error(seg.time(), seg.errorTime());
138 if (!m_hitTimingTool.empty()) addClusterTiming(seg, *xaodSeg);
140 if (m_idHelperSvc->hasMM()) {
141 acc_mmStereoHits(*xaodSeg) = hitCounts.nmmStereoHits;
142 acc_mmEtaHits(*xaodSeg) = hitCounts.nmmEtaHits;
143 }
144 if (m_idHelperSvc->hasSTGC()) {
145 acc_stgcEtaHits(*xaodSeg) = hitCounts.nstgcHits.netaHits;
146 acc_stgcPhiHits(*xaodSeg) = hitCounts.nstgcHits.nphiHits;
147 }
148 return xaodSeg;
149}
150
151
152} // 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< 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
void makePrivateStore()
Create a new (empty) private store for this object.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:573
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.