ATLAS Offline Software
Loading...
Searching...
No Matches
TruthSegmentMaker.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4#include "TruthSegmentMaker.h"
5
6
8
15
16
17
19
20#include "GaudiKernel/PhysicalConstants.h"
21
22#include <unordered_map>
23
24namespace{
25 constexpr double c_inv = 1./Gaudi::Units::c_light;
26}
27
28namespace MuonR4{
29 using namespace SegmentFit;
30
32 ATH_CHECK(m_idHelperSvc.retrieve());
33 ATH_CHECK(m_readKeys.initialize());
34 if (m_readKeys.empty()){
35 ATH_MSG_ERROR("No simulated hit containers have been parsed to build the segments from ");
36 return StatusCode::FAILURE;
37 }
38 ATH_CHECK(m_mdtCalibKey.initialize(m_idHelperSvc->hasMDT()));
39 ATH_CHECK(m_nswUncertKey.initialize(m_idHelperSvc->hasMM() || m_idHelperSvc->hasSTGC()));
40
41 ATH_CHECK(m_segmentKey.initialize());
42 ATH_CHECK(m_eleLinkKey.initialize());
43 ATH_CHECK(m_ptKey.initialize());
44
45 ATH_CHECK(m_locParKey.initialize());
46 ATH_CHECK(m_qKey.initialize());
47
48 ATH_CHECK(m_geoCtxKey.initialize());
49 ATH_CHECK(detStore()->retrieve(m_detMgr));
50 return StatusCode::SUCCESS;
51 }
52 float TruthSegmentMaker::hitUncertainty(const EventContext& ctx, const xAOD::MuonSimHit& hit) const {
53 const Identifier hitId{hit.identify()};
54 switch (const auto techIdx = m_idHelperSvc->technologyIndex(hitId)) {
56 case MDT: {
57 const MuonCalib::MdtCalibDataContainer* calibCont{nullptr};
58 if (!SG::get(calibCont, m_mdtCalibKey, ctx).isSuccess()) {
59 THROW_EXCEPTION("Failed to retrieve Mdt calib constants");
60 }
61 const auto& rtCalib{calibCont->getCalibData(hitId, msgStream())->rtRelation};
62 const double driftTime = rtCalib->tr()->driftTime(hit.localPosition().perp()).value_or(rtCalib->tr()->maxRadius());
63 return rtCalib->rtRes()->resolution(driftTime);
64 } case RPC: {
65 const auto* re = m_detMgr->getRpcReadoutElement(hitId);
66 return re->stripEtaPitch() / std::sqrt(12.);
67 } case TGC: {
68 const auto* re = m_detMgr->getTgcReadoutElement(hitId);
69 const IdentifierHash measHash = re->measurementHash(hitId);
70 const auto& design = re->wireGangLayout(measHash);
71 return design.stripPitch() / std::sqrt(12.);
72 } case STGC:
73 case MM: {
74 const NswErrorCalibData* errorCalibDB{nullptr};
75 if (!SG::get(errorCalibDB, m_nswUncertKey, ctx).isSuccess()) {
76 THROW_EXCEPTION("Failed to retrieve the STGC calibration constants");
77 }
78 NswErrorCalibData::Input errorCalibInput{};
79 errorCalibInput.stripId= hitId;
80 errorCalibInput.locTheta = M_PI - hit.localDirection().theta();
81 if (techIdx == STGC) {
82 errorCalibInput.clusterAuthor = 3; // centroid
83 } else {
84 errorCalibInput.clusterAuthor=66; // cluster time projection method
85 }
86 return errorCalibDB->clusterUncertainty(errorCalibInput);
87 }
88 default:
89 break;
90 }
91 return 0.;
92 }
93 float TruthSegmentMaker::muonPt(const xAOD::MuonSimHit& hit, const Amg::Vector3D& globDir) const{
94 const auto& link = hit.genParticleLink();
95 if (link.isValid()) {
96 return link->momentum().perp();
97 }
98 const float e{hit.kineticEnergy()},m{hit.mass()};
99 return std::sqrt(std::max(e*e - m*m, 0.f)) * std::sin(globDir.theta());
100 }
102 const Identifier& chanId) const {
103 const MuonGMR4::MuonReadoutElement* reEle = m_detMgr->getReadoutElement(chanId);
104 const IdentifierHash trfHash{reEle->detectorType() == ActsTrk::DetectorType::Mdt ?
105 reEle->measurementHash(chanId) :
106 reEle->layerHash(chanId)};
107 return reEle->msSector()->globalToLocalTrans(gctx) * reEle->localToGlobalTrans(gctx, trfHash);
108
109 }
110
111 void TruthSegmentMaker::buildSegmentsFromBkg(const EventContext& ctx,
112 const Amg::Transform3D& locToGlob,
113 const SimHitVec_t& simHits,
114 WriteDecorHolder& out)const {
115
116 ATH_MSG_VERBOSE("Assemble segments from "<<simHits.size()<<" background hits.");
117 std::vector<char> alreadyUsed(simHits.size(), 0);
118 for (std::size_t h = 0 ;h < simHits.size(); ++h) {
119 if (alreadyUsed[h]) {
120 continue;
121 }
122 const auto& [refHit, refPos, refDir] = simHits[h];
124 ATH_MSG_VERBOSE("Try to find other hits on trajectory given by "<<m_idHelperSvc->toString(refHit->identify())
125 <<", "<<Amg::toString(refPos)<<", "<<Amg::toString(refDir)<<", E: "<<refHit->kineticEnergy() / Gaudi::Units::GeV<<" [GeV] "
126 <<", pt: "<<muonPt(*refHit, locToGlob.linear()* refDir)/ Gaudi::Units::GeV <<" [GeV].");
127 std::vector<std::size_t> indicesOnSeg{h};
128 for (std::size_t h1 = h +1; h1 < simHits.size(); ++h1) {
129 if (alreadyUsed[h1]) {
130 continue;
131 }
132 const auto&[testHit, testPos, testDir] = simHits[h1];
133
135 if (std::abs(refHit->kineticEnergy() - testHit->kineticEnergy()) > m_pileUpHitELoss) {
136 continue;
137 }
138 if (MC::charge(refHit) != MC::charge(testHit)){
139 continue;
140 }
141 const double angleDir = Amg::angle(testDir, refDir);
142 const double hitSep = std::abs(Amg::signedDistance(refPos, refDir, testPos,testDir));
143 ATH_MSG_VERBOSE("Test hit "<<m_idHelperSvc->toString(testHit->identify())<<", "
144 <<Amg::toString(testPos)<<", testDir: "<<Amg::toString(testDir)
145 <<", E: "<<testHit->kineticEnergy() / (Gaudi::Units::GeV)<<", angle: "
146 <<(angleDir / Gaudi::Units::deg) <<", distance: "<<hitSep<<".");
147
148 if (std::abs(angleDir) > m_pileUpHitAngleCone || hitSep > m_pileUpHitDistance) {
149 continue;
150 }
151 indicesOnSeg.push_back(h1);
152 }
154 const Amg::Vector3D globPos = locToGlob * refPos;
155 const Amg::Vector3D globDir = locToGlob.linear() * refDir;
156 const Amg::Vector3D perigee = globPos + Amg::intersect<3>(Amg::Vector3D::Zero(), Amg::Vector3D::UnitZ(),
157 globPos, globDir).value_or(0.) * globDir;
158 ATH_MSG_VERBOSE("Found "<<indicesOnSeg.size()<<" matching hits. Closest perigee "
159 <<Amg::toString(perigee)<<", "<<m_idCylinderR<<", "<<m_idCylinderHalfZ);
160 SimHitVec_t hitsOnSeg{};
161 std::ranges::transform(indicesOnSeg,
162 std::back_inserter(hitsOnSeg),
163 [&simHits](const auto idx) {
164 return simHits[idx];
165 });
166 if (perigee.perp() > m_idCylinderR || std::abs(perigee.z()) > m_idCylinderHalfZ ||
167 constructSegmentFromHits(ctx, locToGlob, hitsOnSeg, out)){
168 std::ranges::for_each(indicesOnSeg,
169 [&alreadyUsed](const auto idx) {
170 alreadyUsed[idx] = 1;
171 });
172 }
173 }
174 }
177 const Amg::Transform3D& locToGlob,
178 const SimHitVec_t& simHits,
179 WriteDecorHolder& out) const {
182 auto refHit_itr = std::ranges::min_element(simHits,
183 [](const HitPosTuple_t& a, const HitPosTuple_t& b){
184 return std::abs(std::get<1>(a).z()) <std::abs(std::get<1>(b).z());
185 });
186
187 const auto [simHit, localPos, chamberDir] = (*refHit_itr);
188 ATH_MSG_VERBOSE("Create segement from hit: "<<m_idHelperSvc->toString(simHit->identify())<<
189 " pdgId: "<<simHit->pdgId()<<", energy: "<<simHit->kineticEnergy()
190 <<", genParticle: "<<simHit->genParticleLink().cptr());
191 const Identifier segId{simHit->identify()};
192
194 const double distance = Amg::intersect<3>(localPos, chamberDir, Amg::Vector3D::UnitZ(), 0.).value_or(0.);
195 const Amg::Vector3D chamberPos = localPos + distance*chamberDir;
196
197 const Amg::Vector3D globPos = locToGlob * chamberPos;
198 const Amg::Vector3D globDir = locToGlob.linear() * chamberDir;
199 HitLinkVec_t associatedHits{};
200 unsigned nMdt{0}, nRpcEta{0}, nRpcPhi{0}, nTgcEta{0}, nTgcPhi{0};
201 unsigned nMm{0}, nStgcEta{0}, nStgcPhi{0};
203 float chi2{0.f};
204 for (const auto& [assocMe, pos, dir] : simHits) {
205 chi2 += std::pow(Amg::signedDistance(pos,dir, chamberPos, chamberDir) / hitUncertainty(ctx,*assocMe), 2);
206 const MuonGMR4::MuonReadoutElement* assocRE = m_detMgr->getReadoutElement(assocMe->identify());
207 switch (assocRE->detectorType()) {
209 ++nMdt;
210 break;
212 auto castRE{static_cast<const MuonGMR4::RpcReadoutElement*>(assocRE)};
213 if (castRE->nEtaStrips()) ++nRpcEta;
214 if (castRE->nPhiStrips()) ++nRpcPhi;
215 break;
217 auto castRE{static_cast<const MuonGMR4::TgcReadoutElement*>(assocRE)};
218 const IdentifierHash gapHash = assocRE->measurementHash(assocMe->identify());
219 if (castRE->numStrips(gapHash)){
220 ++nTgcPhi;
221 }
222 if (castRE->numWireGangs(gapHash)) {
223 ++nTgcEta;
224 }
225 break;
227 ++nStgcEta;
228 ++nStgcPhi;
229 break;
231 ++nMm;
232 break;
233 } default:
234 ATH_MSG_WARNING("Csc are not defined "<<m_idHelperSvc->toString(simHit->identify()));
235 }
236 ATH_MSG_VERBOSE("Associate hit "<<m_idHelperSvc->toString(assocMe->identify())
237 <<" pdgId: "<<assocMe->pdgId()<<", energy: "<<assocMe->kineticEnergy()
238 <<", genParticle: "<<assocMe->genParticleLink().cptr()<<", beta: "<<simHit->beta()
239 <<" global time: "<<simHit->globalTime()<<", pos: "<<Amg::toString(pos)
240 <<", dir: "<<Amg::toString(dir));
241 EleLink_t link{*static_cast<const xAOD::MuonSimHitContainer*>(assocMe->container()), assocMe->index()};
242 associatedHits.push_back(std::move(link));
243 }
244 int nPrecisionHits = nMdt + nMm + nStgcEta;
245 int nPhiLayers = nTgcPhi + nRpcPhi + nStgcPhi;
246 // if nMdt + nMm + nStgcEta < 3, do not create a segment
247 if (nPrecisionHits < 3) {
248 return nullptr;
249 }
250
251 xAOD::MuonSegment* truthSegment = out.segments.push_back(std::make_unique<xAOD::MuonSegment>());
252 out.ptDecor(*truthSegment) = muonPt(*simHit, globDir);
253 out.chargeDecor(*truthSegment) = MC::charge(simHit);
254 SegPars_t& locPars{out.paramDecor(*truthSegment)};
255 locPars[Acts::toUnderlying(ParamDefs::x0)] = chamberPos.x();
256 locPars[Acts::toUnderlying(ParamDefs::y0)] = chamberPos.y();
257 constexpr float betaLowLimit = 1.e-6;
258 locPars[Acts::toUnderlying(ParamDefs::t0)] = simHit->globalTime() + distance *c_inv / std::max(simHit->beta(), betaLowLimit);
259 locPars[Acts::toUnderlying(ParamDefs::theta)] = chamberDir.theta();
260 locPars[Acts::toUnderlying(ParamDefs::phi)] = chamberDir.phi();
261
262 truthSegment->setPosition(globPos.x(), globPos.y(), globPos.z());
263 truthSegment->setDirection(globDir.x(), globDir.y(), globDir.z());
264 truthSegment->setT0Error(locPars[Acts::toUnderlying(ParamDefs::t0)], 0.);
265
266 truthSegment->setNHits(nPrecisionHits, nPhiLayers, nTgcEta + nRpcEta);
267 truthSegment->setIdentifier(m_idHelperSvc->sector(segId),
268 m_idHelperSvc->chamberIndex(segId),
269 m_idHelperSvc->stationEta(segId),
270 m_idHelperSvc->technologyIndex(segId));
271 // adding chi2 and ndof (nHits - 5 for 2 position, 2 direction and 1 time)
272 if (nPhiLayers == 0){
273 truthSegment->setFitQuality(chi2, (nPrecisionHits + nTgcEta + nRpcEta - 3));
274 } else {
275 truthSegment->setFitQuality(chi2, (nPrecisionHits + nPhiLayers + nTgcEta + nRpcEta - 5));
276 }
277 out.hitLinkDecor(*truthSegment) = std::move(associatedHits);
278 return truthSegment;
279 }
280
281 StatusCode TruthSegmentMaker::execute(const EventContext& ctx) const {
282 const ActsTrk::GeometryContext* gctx{nullptr};
283 ATH_CHECK(SG::get(gctx, m_geoCtxKey, ctx));
284
285 using HitsPerParticle = std::unordered_map<HepMC::ConstGenParticlePtr, SimHitVec_t>;
286 using HitCollector = std::unordered_map<const MuonGMR4::SpectrometerSector*, HitsPerParticle>;
287 HitCollector hitCollector{};
288
290 const xAOD::MuonSimHitContainer* simHits{nullptr};
291 ATH_CHECK(SG::get(simHits, key, ctx));
292 for (const xAOD::MuonSimHit* simHit : *simHits) {
293 const MuonGMR4::MuonReadoutElement* reElement = m_detMgr->getReadoutElement(simHit->identify());
294 const MuonGMR4::SpectrometerSector* id{reElement->msSector()};
295 auto genLink = simHit->genParticleLink();
296 HepMC::ConstGenParticlePtr genParticle = nullptr;
297 if (genLink.isValid()){
298 genParticle = genLink.cptr();
299 }
300 if ( (!genParticle && (!m_includePileUpHits || simHit->kineticEnergy() < m_pileUpHitMinE
301 || !MC::isMuon(simHit))) || (m_useOnlyMuonHits && !MC::isMuon(simHit))) {
302 ATH_MSG_VERBOSE("Skip hit "<<m_idHelperSvc->toString(simHit->identify())<<
303 " pdgId: "<<simHit->pdgId()<<", energy: "<<simHit->kineticEnergy()
304 <<", genParticle: "<<genParticle);
305 continue;
306 }
307 const Amg::Transform3D toChTrf{toChamber(*gctx, simHit->identify())};
308 hitCollector[id][genParticle].emplace_back(simHit,
309 toChTrf *xAOD::toEigen(simHit->localPosition()),
310 toChTrf.linear()* xAOD::toEigen(simHit->localDirection()));
311 }
312 }
313
314 SG::WriteHandle writeHandle{m_segmentKey, ctx};
315 ATH_CHECK(writeHandle.record(std::make_unique<xAOD::MuonSegmentContainer>(),
316 std::make_unique<xAOD::MuonSegmentAuxContainer>()));
317
318 WriteDecorHolder writerHolder{*writeHandle,*this, ctx};
319
320 for (auto& [chamber, collectedParts] : hitCollector) {
321 const Amg::Transform3D& locToGlob{chamber->localToGlobalTrans(*gctx)};
322 for (auto& [particle, simHits]: collectedParts) {
323 /* Sort hits by local z */
324 std::ranges::stable_sort(simHits,[](const HitPosTuple_t& a, const HitPosTuple_t& b){
325 return std::get<1>(a).z() < std::get<1>(b).z();
326 });
327 if (!particle) {
328 buildSegmentsFromBkg(ctx, locToGlob, simHits, writerHolder);
329 continue;
330 }
331 constructSegmentFromHits(ctx, locToGlob, simHits, writerHolder);
332 }
333 }
334 ATH_MSG_DEBUG("Constructed "<<writeHandle->size()<<" truth segments in total ");
335 return StatusCode::SUCCESS;
336 }
337}
const boost::regex re(r_e)
#define M_PI
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
ATLAS-specific HepMC functions.
static Double_t a
#define z
virtual DetectorType detectorType() const =0
Returns the detector element type.
const ServiceHandle< StoreGateSvc > & detStore() const
Header file for AthHistogramAlgorithm.
This is a "hash" representation of an Identifier.
const MdtFullCalibData * getCalibData(const Identifier &measId, MsgStream &msg) const
Returns the calibration data associated with this station.
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
const SpectrometerSector * msSector() const
Returns the pointer to the envelope volume enclosing all chambers in the sector.
const Amg::Transform3D & localToGlobalTrans(const ActsTrk::GeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
virtual IdentifierHash measurementHash(const Identifier &measId) const =0
Constructs the identifier hash from the full measurement Identifier.
virtual IdentifierHash layerHash(const Identifier &measId) const =0
A spectrometer sector forms the envelope of all chambers that are placed in the same MS sector & laye...
Amg::Transform3D globalToLocalTrans(const ActsTrk::GeometryContext &gctx) const
Returns the global -> local transformation from the ATLAS global.
SG::WriteDecorHandleKey< xAOD::MuonSegmentContainer > m_locParKey
Decoration key of the local parameters.
std::vector< HitPosTuple_t > SimHitVec_t
Gaudi::Property< float > m_pileUpHitMinE
Minimum energy threshold for pile up hits to be converted.
SG::ReadHandleKey< ActsTrk::GeometryContext > m_geoCtxKey
Key to the geometry context.
StatusCode execute(const EventContext &ctx) const override
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
IdHelperSvc to decode the Identifiers.
Gaudi::Property< float > m_pileUpHitAngleCone
Maximum scattering angle between two pile-up hits.
Gaudi::Property< float > m_idCylinderR
ID / ITk cylinder radius.
Amg::Transform3D toChamber(const ActsTrk::GeometryContext &gctx, const Identifier &chanId) const
Returns the transform from the local simHit frame -> chamber frame.
const MuonGMR4::MuonDetectorManager * m_detMgr
Pointer to the muon readout geometry.
StatusCode initialize() override final
SG::WriteDecorHandleKey< xAOD::MuonSegmentContainer > m_eleLinkKey
Decoration key of the associated sim hit links.
SG::ReadCondHandleKey< MuonCalib::MdtCalibDataContainer > m_mdtCalibKey
Data dependency on the Mdt calibration container to calculate the uncertainty.
ElementLink< xAOD::MuonSimHitContainer > EleLink_t
Gaudi::Property< float > m_pileUpHitELoss
Maximum energy loss between two pile-up hits.
std::vector< EleLink_t > HitLinkVec_t
Gaudi::Property< float > m_idCylinderHalfZ
ID / Itk cylinder half length.
SG::WriteDecorHandleKey< xAOD::MuonSegmentContainer > m_qKey
Decoration key of the muon charge.
xAOD::MuonSegment * constructSegmentFromHits(const EventContext &ctx, const Amg::Transform3D &locToGlob, const SimHitVec_t &hits, WriteDecorHolder &writeShip) const
Takes a list of related sim hits and transforms them into a truth segment.
SG::WriteDecorHandleKey< xAOD::MuonSegmentContainer > m_ptKey
Decoration key of the associated particle pt.
Gaudi::Property< bool > m_useOnlyMuonHits
Build segments from muon hits only.
void buildSegmentsFromBkg(const EventContext &ctx, const Amg::Transform3D &locToGlob, const SimHitVec_t &simHits, WriteDecorHolder &writeShip) const
Attempts to assemble truth segments from a list of loose sim hits, i.e., the hits are stemming from a...
std::tuple< const xAOD::MuonSimHit *, Amg::Vector3D, Amg::Vector3D > HitPosTuple_t
Tuple consisting out of pointer to the sim hit and the position & direction expressed in the chamber'...
xAOD::MeasVector< Acts::toUnderlying(SegmentFit::ParamDefs::nPars)> SegPars_t
SG::WriteHandleKey< xAOD::MuonSegmentContainer > m_segmentKey
Key under which the segment Container will be recorded in StoreGate.
SG::ReadCondHandleKey< NswErrorCalibData > m_nswUncertKey
Data dependency on the Nsw calibration container to estimate the uncertaintys.
Gaudi::Property< bool > m_includePileUpHits
Construct segments from pile-up hits without GenParticleLink.
Gaudi::Property< float > m_pileUpHitDistance
Maximum separation between two pile-up hits.
float hitUncertainty(const EventContext &ctx, const xAOD::MuonSimHit &hit) const
Evaluates the hit uncertainty.
float muonPt(const xAOD::MuonSimHit &hit, const Amg::Vector3D &globDir) const
Returns the muon pt from the sim hit.
SG::ReadHandleKeyArray< xAOD::MuonSimHitContainer > m_readKeys
List of sim hit containers from which the truth segments shall be retrieved.
double clusterUncertainty(const Input &clustInfo) const
Property holding a SG store/key/clid from which a ReadHandle is made.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
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 setPosition(float x, float y, float z)
Sets the global position.
ConstVectorMap< 3 > localDirection() const
Returns the local direction of the traversing particle.
float mass() const
Returns the rest-mass 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.
const HepMcParticleLink & genParticleLink() const
Returns the link to the HepMC particle producing this hit.
float kineticEnergy() const
Returns the kinetic energy of the traversing particle.
double chi2(TH1 *h0, TH1 *h1)
@ Mm
Maybe not needed in the migration.
@ Tgc
Resitive Plate Chambers.
@ sTgc
Micromegas (NSW)
@ Rpc
Monitored Drift Tubes.
@ Mdt
MuonSpectrometer.
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.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
double signedDistance(const Amg::Vector3D &posA, const Amg::Vector3D &dirA, const Amg::Vector3D &posB, const Amg::Vector3D &dirB)
Calculates the signed distance between two lines in 3D space.
double angle(const Amg::Vector3D &v1, const Amg::Vector3D &v2)
calculates the opening angle between two vectors
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
const GenParticle * ConstGenParticlePtr
Definition GenParticle.h:38
bool isMuon(const T &p)
double charge(const T &p)
This header ties the generic definitions in this package.
TechnologyIndex
enum to classify the different layers in the muon spectrometer
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Definition TgcBase.h:6
MuonSimHit_v1 MuonSimHit
Defined the version of the MuonSimHit.
Definition MuonSimHit.h:12
MuonSimHitContainer_v1 MuonSimHitContainer
Define the version of the pixel cluster container.
MuonSegment_v1 MuonSegment
Reference the current persistent version:
Helper struct to ship the write DecorHandles and the reference to the output segment container throug...
Helper struct to be parsed to the object to derive the specific error of the cluster.
double locTheta
Direction of the muon in the local coordinate frame.
Identifier stripId
Identifier of the strip.
uint8_t clusterAuthor
Author of the cluster.
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10