ATLAS Offline Software
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 
24 namespace{
25  constexpr double c_inv = 1./Gaudi::Units::c_light;
26 }
27 
28 namespace 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[toInt(ParamDefs::x0)] = chamberPos.x();
256  locPars[toInt(ParamDefs::y0)] = chamberPos.y();
257  constexpr float betaLowLimit = 1.e-6;
258  locPars[toInt(ParamDefs::time)] = simHit->globalTime() + distance *c_inv / std::max(simHit->beta(), betaLowLimit);
259  locPars[toInt(ParamDefs::theta)] = chamberDir.theta();
260  locPars[toInt(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[toInt(ParamDefs::time)], 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 ActsGeometryContext* 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 
289  for (const SG::ReadHandleKey<xAOD::MuonSimHitContainer>& key : m_readKeys) {
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 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
NswErrorCalibData
Definition: NswErrorCalibData.h:19
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
xAOD::MuonSimHit_v1
Definition: MuonSimHit_v1.h:18
STGC
@ STGC
Definition: RegSelEnums.h:39
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:18
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:79
MuonGMR4::MuonReadoutElement::msSector
const SpectrometerSector * msSector() const
Returns the pointer to the envelope volume enclosing all chambers in the sector.
MuonGMR4::SpectrometerSector
A spectrometer sector forms the envelope of all chambers that are placed in the same MS sector & laye...
Definition: SpectrometerSector.h:40
xAOD::MuonSimHit_v1::identify
Identifier identify() const
Returns the global ATLAS identifier of the SimHit.
Definition: xAODMuonSimHit_V1.cxx:42
Amg::angle
double angle(const Amg::Vector3D &v1, const Amg::Vector3D &v2)
calculates the opening angle between two vectors
Definition: GeoPrimitivesHelpers.h:41
xAOD::MuonSegment_v1::setPosition
void setPosition(float x, float y, float z)
Sets the global position.
Definition: MuonSegment_v1.cxx:26
MuonR4::TruthSegmentMaker::buildSegmentsFromBkg
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...
Definition: TruthSegmentMaker.cxx:111
calibdata.chamber
chamber
Definition: calibdata.py:31
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
MuonSegmentAuxContainer.h
MuonR4::TruthSegmentMaker::SimHitVec_t
std::vector< HitPosTuple_t > SimHitVec_t
Definition: TruthSegmentMaker.h:51
MuonR4::TruthSegmentMaker::execute
StatusCode execute(const EventContext &ctx) const override
Definition: TruthSegmentMaker.cxx:281
Muon::MuonStationIndex::TechnologyIndex
TechnologyIndex
enum to classify the different layers in the muon spectrometer
Definition: MuonStationIndex.h:54
ActsTrk::DetectorType::Tgc
@ Tgc
Resitive Plate Chambers.
MuonGMR4::MuonReadoutElement
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonReadoutElement.h:38
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:70
M_PI
#define M_PI
Definition: ActiveFraction.h:11
deg
#define deg
Definition: SbPolyhedron.cxx:17
xAOD::MuonSegment_v1
Class describing a MuonSegment.
Definition: MuonSegment_v1.h:33
MM
@ MM
Definition: RegSelEnums.h:38
ActsTrk::IDetectorElementBase::detectorType
virtual DetectorType detectorType() const =0
Returns the detector element type.
MuonGMR4::MuonReadoutElement::layerHash
virtual IdentifierHash layerHash(const Identifier &measId) const =0
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::ReadHandleKey
Property holding a SG store/key/clid from which a ReadHandle is made.
Definition: StoreGate/StoreGate/ReadHandleKey.h:39
ActsTrk::DetectorType::sTgc
@ sTgc
Micromegas (NSW)
read_hist_ntuple.h1
h1
Definition: read_hist_ntuple.py:21
SpectrometerSector.h
MuonGMR4::RpcReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/RpcReadoutElement.h:17
MuonR4::TruthSegmentMaker::SegPars_t
xAOD::MeasVector< SegmentFit::toInt(SegmentFit::ParamDefs::nPars)> SegPars_t
Definition: TruthSegmentMaker.h:60
xAOD::MuonSegment_v1::setT0Error
void setT0Error(float t0, float t0Error)
Sets the time error.
Definition: MuonSegment_v1.cxx:51
MuonR4::SegmentFit::ParamDefs::phi
@ phi
MuonR4::TruthSegmentMaker::WriteDecorHolder
Helper struct to ship the write DecorHandles and the reference to the output segment container throug...
Definition: TruthSegmentMaker.h:65
MuonR4::TruthSegmentMaker::constructSegmentFromHits
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.
Definition: TruthSegmentMaker.cxx:176
xAOD::MuonSegment_v1::setNHits
void setNHits(int nPrecisionHits, int nPhiLayers, int nTrigEtaLayers)
Set the number of hits/layers.
Definition: MuonSegment_v1.cxx:88
TruthSegmentMaker.h
sTgcReadoutElement.h
xAOD::MuonSimHit_v1::kineticEnergy
float kineticEnergy() const
Returns the kinetic energy of the traversing particle.
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TRT::Hit::driftTime
@ driftTime
Definition: HitInfo.h:43
xAOD::MuonSimHit_v1::genParticleLink
const HepMcParticleLink & genParticleLink() const
Returns the link to the HepMC particle producing this hit.
Definition: xAODMuonSimHit_V1.cxx:68
ActsTrk::DetectorType::Mm
@ Mm
Maybe not needed in the migration.
z
#define z
SG::get
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Definition: ReadCondHandle.h:287
TGC
Definition: TgcBase.h:6
h
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
extractSporadic.h
list h
Definition: extractSporadic.py:96
MuonR4::TruthSegmentMaker::HitLinkVec_t
std::vector< EleLink_t > HitLinkVec_t
Definition: TruthSegmentMaker.h:56
MuonGMR4::SpectrometerSector::globalToLocalTrans
Amg::Transform3D globalToLocalTrans(const ActsGeometryContext &gctx) const
Returns the global -> local transformation from the ATLAS global.
Definition: SpectrometerSector.cxx:78
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
xAOD::MuonSimHit_v1::localDirection
ConstVectorMap< 3 > localDirection() const
Returns the local direction of the traversing particle.
Definition: xAODMuonSimHit_V1.cxx:66
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
hist_file_dump.f
f
Definition: hist_file_dump.py:140
MuonR4::SegmentFit::ParamDefs::x0
@ x0
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
MuonR4::SegmentFit::ParamDefs::time
@ time
beamspotman.dir
string dir
Definition: beamspotman.py:621
NswErrorCalibData::Input::stripId
Identifier stripId
Identifier of the strip.
Definition: NswErrorCalibData.h:27
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
MuonR4::SegmentFit::ParamDefs::y0
@ y0
HepMC::ConstGenParticlePtr
const GenParticle * ConstGenParticlePtr
Definition: GenParticle.h:38
ActsTrk::DetectorType::Mdt
@ Mdt
MuonSpectrometer.
RPC
@ RPC
Definition: RegSelEnums.h:32
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:239
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
MuonR4::SegmentFit::toInt
constexpr int toInt(const ParamDefs p)
Definition: MuonHoughDefs.h:42
charge
double charge(const T &p)
Definition: AtlasPID.h:986
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
python.PhysicalConstants.c_light
float c_light
Definition: PhysicalConstants.py:73
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
THROW_EXCEPTION
#define THROW_EXCEPTION(MESSAGE)
Definition: throwExcept.h:10
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:16
RpcReadoutElement.h
MuonR4::TruthSegmentMaker::initialize
StatusCode initialize() override final
Definition: TruthSegmentMaker.cxx:31
MuonR4
This header ties the generic definitions in this package.
Definition: HoughEventData.h:16
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
a
TList * a
Definition: liststreamerinfos.cxx:10
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
MdtReadoutElement.h
MuonR4::TruthSegmentMaker::toChamber
Amg::Transform3D toChamber(const ActsGeometryContext &gctx, const Identifier &chanId) const
Returns the transform from the local simHit frame -> chamber frame.
Definition: TruthSegmentMaker.cxx:101
MuonCalib::MdtCalibDataContainer
Definition: MdtCalibDataContainer.h:20
xAOD::MuonSegment_v1::setIdentifier
void setIdentifier(int sector, ::Muon::MuonStationIndex::ChIndex chamberIndex, int etaIndex, ::Muon::MuonStationIndex::TechnologyIndex technology)
Set the identifier.
Definition: MuonSegment_v1.cxx:73
re
const boost::regex re(r_e)
MuonGMR4::MuonReadoutElement::measurementHash
virtual IdentifierHash measurementHash(const Identifier &measId) const =0
Constructs the identifier hash from the full measurement Identifier.
xAOD::MuonSimHit_v1::localPosition
ConstVectorMap< 3 > localPosition() const
Returns the local postion of the traversing particle.
Definition: xAODMuonSimHit_V1.cxx:60
ActsTrk::DetectorType::Rpc
@ Rpc
Monitored Drift Tubes.
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
xAOD::MuonSegment_v1::setDirection
void setDirection(float px, float py, float pz)
Sets the direction.
Definition: MuonSegment_v1.cxx:39
MuonGMR4::MuonReadoutElement::localToGlobalTrans
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:81
MuonR4::TruthSegmentMaker::HitPosTuple_t
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'...
Definition: TruthSegmentMaker.h:50
Amg::signedDistance
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.
Definition: GeoPrimitivesHelpers.h:329
NswErrorCalibData::Input
Helper struct to be parsed to the object to derive the specific error of the cluster.
Definition: NswErrorCalibData.h:25
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
MuonR4::TruthSegmentMaker::hitUncertainty
float hitUncertainty(const EventContext &ctx, const xAOD::MuonSimHit &hit) const
Evaluates the hit uncertainty.
Definition: TruthSegmentMaker.cxx:52
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
xAOD::MuonSegment_v1::setFitQuality
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
Definition: MuonSegment_v1.cxx:61
TgcReadoutElement.h
MuonR4::TruthSegmentMaker::muonPt
float muonPt(const xAOD::MuonSimHit &hit, const Amg::Vector3D &globDir) const
Returns the muon pt from the sim hit.
Definition: TruthSegmentMaker.cxx:93
MuonGMR4::TgcReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:19
xAOD::MuonSimHit_v1::mass
float mass() const
Returns the rest-mass of the traversing particle.
HepMCHelpers.h
MuonR4::SegmentFit::ParamDefs::theta
@ theta
MDT
@ MDT
Definition: RegSelEnums.h:31
MmReadoutElement.h
python.SystemOfUnits.m
float m
Definition: SystemOfUnits.py:106
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
isMuon
bool isMuon(const T &p)
Definition: AtlasPID.h:202
Identifier
Definition: IdentifierFieldParser.cxx:14