ATLAS Offline Software
MlHitDumperAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3  */
4 
5 #include "MlHitDumperAlg.h"
6 
8 
9 
15 
16 #include <unordered_map>
17 
18 namespace MuonR4{
20  ATH_CHECK(m_spacePointKeys.initialize());
22 
24  ATH_CHECK(m_truthLinkKey.initialize());
25  m_tree.addBranch(std::make_unique<MuonVal::EventInfoBranch>(m_tree, MuonVal::EventInfoBranch::isMC));
26 
27 
28  m_spCollection = std::make_unique<MuonValR4::SpacePointTesterModule>(m_tree, m_spacePointKeys[0].key(), msgLevel());
30  m_muonP4 = std::make_unique<MuonValR4::IParticleFourMomBranch>(m_tree, "truthMuon");
32  ATH_CHECK(m_tree.init(this));
33  return StatusCode::SUCCESS;
34  }
36  const EventContext& ctx{Gaudi::Hive::currentContext()};
37  const ActsGeometryContext* gctx{};
38  ATH_CHECK(SG::get(gctx, m_geoCtxKey, ctx));
39 
40  std::unordered_map<const xAOD::MuonSimHit*, const xAOD::TruthParticle*> hitPartMap{};
41  const xAOD::MuonSegmentContainer* truthSegs{nullptr};
42  ATH_CHECK(SG::get(truthSegs, m_truthSegKey, ctx));
43  for (const xAOD::MuonSegment* segment : *truthSegs) {
45  for (const xAOD::MuonSimHit* hit : getMatchingSimHits(*segment)) {
46  hitPartMap[hit] = truthPart;
47  }
48  }
49 
51  const SpacePointContainer* spCont{nullptr};
52  ATH_CHECK(SG::get(spCont,key, ctx));
53  for (const SpacePointBucket* bucket : *spCont) {
54  m_spCollection->push_back(*bucket);
55  for (const auto& sp : *bucket) {
56  const xAOD::MuonSimHit* simHit = getTruthMatchedHit(*sp->primaryMeasurement());
57  m_muonP4->push_back(hitPartMap[simHit]);
58  m_truthLink[fillSpacePoint(*gctx, *sp)] = m_muonP4->find(hitPartMap[simHit]);
59  }
60  }
61  }
62  ATH_CHECK(m_tree.fill(ctx));
63 
64  return StatusCode::SUCCESS;
65  }
66  std::size_t MlHitDumperAlg::fillSpacePoint(const ActsGeometryContext& gctx, const SpacePoint& sp){
67  const Amg::Transform3D& lToGlob = sp.msSector()->localToGlobalTrans(gctx);
68  std::size_t idx = m_spCollection->push_back(sp);
69  m_spGlobPos.set(lToGlob * sp.positionInChamber(), idx);
70 
71  switch (sp.type()) {
72  using enum xAOD::UncalibMeasType;
73  case MdtDriftCircleType:{
74  const auto* prd = static_cast<const xAOD::MdtDriftCircle*>(sp.primaryMeasurement());
75  const auto* re = prd->readoutElement();
76  m_spGlobEdgeLow.set(re->readOutPos(gctx, prd->measurementHash()), idx);
77  m_spGlobEdgeHigh.set(re->highVoltPos(gctx, prd->measurementHash()), idx);
78  m_spReadoutSide[idx] = re->getParameters().readoutSide;
79  m_spTime[idx] = prd->tdc();
80  break;
81  }
82  case RpcStripType: {
83  const auto* prd = static_cast<const xAOD::RpcMeasurement*>(sp.primaryMeasurement());
84  const auto* re = prd->readoutElement();
85  m_spGlobEdgeLow.set(re->rightStripEdge(gctx, prd->measurementHash()), idx);
86  m_spGlobEdgeHigh.set(re->leftStripEdge(gctx, prd->measurementHash()), idx);
87  m_spReadoutSide[idx] = 1.;
88  m_spTime[idx] = prd->time();
89  break;
90  }
91  case TgcStripType: {
92  const auto* prd = static_cast<const xAOD::TgcStrip*>(sp.primaryMeasurement());
93  const auto* re = prd->readoutElement();
94  const MuonGMR4::StripDesign& design = re->sensorLayout(prd->layerHash())->design();
95  const double halfLength = design.stripLength(prd->channelNumber());
96  m_spReadoutSide[idx] = 1.;
97  m_spGlobEdgeLow.set( lToGlob*(sp.positionInChamber() -halfLength * sp.directionInChamber()) , idx);
98  m_spGlobEdgeHigh.set(lToGlob*(sp.positionInChamber() +halfLength * sp.directionInChamber()) , idx);
99  m_spTime[idx] = prd->bcBitMap();
100  break;
101  }
102  case MMClusterType: {
103  const auto* prd = static_cast<const xAOD::MMCluster*>(sp.primaryMeasurement());
104  const auto* re = prd->readoutElement();
105  m_spGlobEdgeLow.set(re->rightStripEdge(gctx, prd->measurementHash()), idx);
106  m_spGlobEdgeHigh.set(re->leftStripEdge(gctx, prd->measurementHash()), idx);
107  m_spReadoutSide[idx] = re->readoutSide(prd->measurementHash());
108  m_spTime[idx] = prd->time();
109  break;
110  }
111  case sTgcStripType: {
112  const auto* prd = static_cast<const xAOD::sTgcMeasurement*>(sp.primaryMeasurement());
113  const auto* re = prd->readoutElement();
114  m_spReadoutSide[idx] = 1.;
115  m_spTime[idx] = prd->time();
116  switch (prd->channelType()) {
118  case Pad:{
119  double xLow{std::numeric_limits<double>::max()},
123  for (const Amg::Vector2D& corner : re->localPadCorners(prd->measurementHash())) {
124  xLow = std::min(xLow, corner.x());
125  yLow = std::min(yLow, corner.y());
126  xHigh = std::max(xHigh, corner.x());
127  yHigh = std::max(yHigh, corner.y());
128  }
129  const Amg::Transform3D& padTrf{re->localToGlobalTrans(gctx, prd->layerHash())};
130  m_spGlobEdgeLow.set(padTrf * Amg::Vector3D{xLow,yLow, 0.}, idx);
131  m_spGlobEdgeHigh.set(padTrf * Amg::Vector3D{xHigh,yHigh, 0.}, idx);
132  break;
133  }
134  case Strip:
135  case Wire: {
136  const double halfLength = 0.5* re->stripLength(prd->measurementHash());
137  m_spGlobEdgeLow.set( lToGlob*(sp.positionInChamber() -halfLength * sp.directionInChamber()) , idx);
138  m_spGlobEdgeHigh.set(lToGlob*(sp.positionInChamber() +halfLength * sp.directionInChamber()) , idx);
139  break;
140 
141  }
142 
143  }
144  break;
145  }
146  default: break;
147  }
148  return idx;
149  }
152  return StatusCode::SUCCESS;
153  }
154 }
MuonSimHitHelpers.h
xAOD::MuonSimHit_v1
Definition: MuonSimHit_v1.h:18
MuonR4::SpacePoint::msSector
const MuonGMR4::SpectrometerSector * msSector() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:56
xAOD::RpcMeasurement_v1
RpcMeasurement_v1: Class storing the geneic.
Definition: RpcMeasurement_v1.h:21
MuonR4::MlHitDumperAlg::m_tree
MuonVal::MuonTesterTree m_tree
Definition: MlHitDumperAlg.h:37
MuonGMR4::StripDesign
Definition: StripDesign.h:30
MuonR4::SpacePoint::type
xAOD::UncalibMeasType type() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:71
MuonR4::MlHitDumperAlg::m_truthLinkKey
SG::ReadDecorHandleKey< xAOD::MuonSegmentContainer > m_truthLinkKey
Definition: MlHitDumperAlg.h:34
MuonR4::SpacePointBucket
: The muon space point bucket represents a collection of points that will bre processed together in t...
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePointContainer.h:21
MuonR4::MlHitDumperAlg::m_truthLink
MuonVal::VectorBranch< char > & m_truthLink
Definition: MlHitDumperAlg.h:48
MuonR4::getTruthMatchedParticle
const xAOD::TruthParticle * getTruthMatchedParticle(const xAOD::MuonSegment &segment)
Returns the particle truth-matched to the segment.
Definition: MuonSimHitHelpers.cxx:100
MuonVal::MuonTesterTree::init
StatusCode init(OWNER *instance)
Initialize method.
xAOD::MMCluster_v1
Definition: MMCluster_v1.h:20
MuonR4::MlHitDumperAlg::m_muonP4
std::shared_ptr< MuonVal::IParticleFourMomBranch > m_muonP4
Definition: MlHitDumperAlg.h:39
MuonGMR4::StripDesign::stripLength
virtual double stripLength(int stripNumb) const
Returns length of the strip.
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
MuonVal::EventInfoBranch::isMC
@ isMC
Flag determining whether the branch is simulation.
Definition: EventInfoBranch.h:20
MuonR4::MlHitDumperAlg::m_truthSegKey
SG::ReadHandleKey< xAOD::MuonSegmentContainer > m_truthSegKey
Definition: MlHitDumperAlg.h:32
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
xAOD::TgcStrip_v1
Definition: TgcStrip_v1.h:19
MuonR4::MlHitDumperAlg::m_spCollection
std::shared_ptr< MuonValR4::SpacePointTesterModule > m_spCollection
Definition: MlHitDumperAlg.h:41
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
MuonR4::MlHitDumperAlg::initialize
virtual StatusCode initialize() override final
Definition: MlHitDumperAlg.cxx:19
xAOD::MuonSegment_v1
Class describing a MuonSegment.
Definition: MuonSegment_v1.h:33
MuonR4::MlHitDumperAlg::m_spacePointKeys
SG::ReadHandleKeyArray< SpacePointContainer > m_spacePointKeys
Definition: MlHitDumperAlg.h:29
SG::ReadHandleKey< SpacePointContainer >
sTgcIdHelper::sTgcChannelTypes
sTgcChannelTypes
Definition: sTgcIdHelper.h:190
MuonR4::MlHitDumperAlg::m_spGlobPos
MuonVal::ThreeVectorBranch m_spGlobPos
Definition: MlHitDumperAlg.h:42
MuonR4::SpacePoint::primaryMeasurement
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:47
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
MlHitDumperAlg.h
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:37
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonR4::MlHitDumperAlg::m_spGlobEdgeHigh
MuonVal::ThreeVectorBranch m_spGlobEdgeHigh
Definition: MlHitDumperAlg.h:44
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
MuonR4::MlHitDumperAlg::m_spReadoutSide
MuonVal::VectorBranch< char > & m_spReadoutSide
Definition: MlHitDumperAlg.h:45
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
MuonR4::MlHitDumperAlg::finalize
virtual StatusCode finalize() override final
Definition: MlHitDumperAlg.cxx:150
MdtDriftCircle.h
MuonR4::SpacePoint
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:19
MuonR4::MlHitDumperAlg::m_geoCtxKey
SG::ReadHandleKey< ActsGeometryContext > m_geoCtxKey
Definition: MlHitDumperAlg.h:35
TgcStrip.h
MuonR4::SpacePoint::directionInChamber
const Amg::Vector3D & directionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:62
sTgcMeasurement.h
MuonR4::MlHitDumperAlg::m_spGlobEdgeLow
MuonVal::ThreeVectorBranch m_spGlobEdgeLow
Definition: MlHitDumperAlg.h:43
RpcMeasurement.h
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonR4
This header ties the generic definitions in this package.
Definition: HoughEventData.h:16
MuonR4::SpacePoint::positionInChamber
const Amg::Vector3D & positionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:59
MuonR4::MlHitDumperAlg::fillSpacePoint
std::size_t fillSpacePoint(const ActsGeometryContext &gctx, const SpacePoint &sp)
Definition: MlHitDumperAlg.cxx:66
MuonGMR4::SpectrometerSector::localToGlobalTrans
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &gctx) const
Returns the local -> global tarnsformation from the sector.
Definition: SpectrometerSector.cxx:75
re
const boost::regex re(r_e)
MuonVal::ThreeVectorBranch::set
void set(const Amg::Vector3D &vec, size_t pos)
Definition: ThreeVectorBranch.cxx:24
xAOD::UncalibMeasType
UncalibMeasType
Define the type of the uncalibrated measurement.
Definition: MeasurementDefs.h:25
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
MuonVal::MuonTesterTree::fill
bool fill(const EventContext &ctx)
Fills the tree per call.
Definition: MuonTesterTree.cxx:89
MuonR4::getTruthMatchedHit
const xAOD::MuonSimHit * getTruthMatchedHit(const xAOD::UncalibratedMeasurement &prdHit)
Returns the MuonSimHit, if there's any, matched to the uncalibrated muon measurement.
Definition: MuonSimHitHelpers.cxx:16
MuonVal::MuonTesterTree::write
StatusCode write()
Finally write the TTree objects.
Definition: MuonTesterTree.cxx:178
MMCluster.h
Pad
Definition: Pad.h:10
MuonR4::MlHitDumperAlg::m_spTime
MuonVal::VectorBranch< float > & m_spTime
Definition: MlHitDumperAlg.h:46
xAOD::MdtDriftCircle_v1
https://gitlab.cern.ch/atlas/athena/-/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecEvent/Mu...
Definition: MdtDriftCircle_v1.h:21
MuonR4::MlHitDumperAlg::execute
virtual StatusCode execute() override final
Definition: MlHitDumperAlg.cxx:35
MuonR4::getMatchingSimHits
std::unordered_set< const xAOD::MuonSimHit * > getMatchingSimHits(const xAOD::MuonSegment &segment)
: Returns all sim hits matched to a xAOD::MuonSegment
Definition: MuonSimHitHelpers.cxx:27
xAOD::sTgcMeasurement_v1
Definition: sTgcMeasurement_v1.h:21
NSWL1::PadTriggerAdapter::segment
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)
Definition: PadTriggerAdapter.cxx:5
MuonVal::MuonTesterTree::addBranch
bool addBranch(std::shared_ptr< IMuonTesterBranch > branch)
Branch is added to the tree without transferring the ownership.
Definition: MuonTesterTree.cxx:61
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37