ATLAS Offline Software
MMSimHitVariables.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
5 
8 
9 namespace MuonPRDTest {
10  MMSimHitVariables::MMSimHitVariables(MuonTesterTree& tree, const std::string& container_name, MSG::Level msglvl) :
11  PrdTesterModule(tree, "MM_Sim", false, msglvl), m_key{container_name} {}
12 
14 
15  bool MMSimHitVariables::fill(const EventContext& ctx) {
16  ATH_MSG_DEBUG("do fill MmSimHitVariables()");
17  SG::ReadHandle<MMSimHitCollection> mmContainer{m_key, ctx};
18  if (!mmContainer.isValid()) {
19  ATH_MSG_FATAL("Failed to retrieve digit container " << m_key.fullKey());
20  return false;
21  }
22  const MuonGM::MuonDetectorManager* MuonDetMgr = getDetMgr(ctx);
23  if (!MuonDetMgr) { return false; }
24  unsigned int n_hits{0};
25  // Get the MM Id hit helper
27  if (!mmContainer->size()) ATH_MSG_DEBUG("MM Sim container is empty");
28  for (const MMSimHit& hit : *mmContainer) {
29  int simId = hit.MMId();
30 
31  if(hit.depositEnergy()==0.) continue; // SimHits without energy loss are not recorded.
32 
33  // connect the hit with the MC truth
34  int barcode = hit.particleLink().barcode();
36  m_NSWMM_globalTime.push_back(hit.globalTime());
37 
38  const Amg::Vector3D& globalPosition = hit.globalPosition();
39  m_NSWMM_hitGlobalPosition.push_back(globalPosition);
40 
41  const Amg::Vector3D& globalDirection = hit.globalDirection();
42  m_NSWMM_hitGlobalDirection.push_back(globalDirection);
43 
44  m_NSWMM_particleEncoding.push_back(hit.particleEncoding());
45  m_NSWMM_kineticEnergy.push_back(hit.kineticEnergy());
46  m_NSWMM_depositEnergy.push_back(hit.depositEnergy());
47 
48  std::string stname = mmhhelper->GetStationName(simId);
49  int steta = mmhhelper->GetZSector(simId);
50  int stphi = mmhhelper->GetPhiSector(simId);
51  int multilayer = mmhhelper->GetMultiLayer(simId);
52  int layer = mmhhelper->GetLayer(simId);
53  int side = mmhhelper->GetSide(simId);
54 
55  if( stphi == 0 ){
56  ATH_MSG_ERROR("MicroMegas validation: unexpected phi range " << stphi);
57  return false;
58  }
59 
60  Identifier offId = idHelperSvc()->mmIdHelper().channelID( stname[2] == 'L' ? "MML" : "MMS",
61  side == 1 ? steta+1 : -steta-1,
62  (stphi-1)/2+1,multilayer,layer,1 );
63  m_NSWMM_Id.push_back(offId);
64 
65  // sanity checks
66  if( !idHelperSvc()->mmIdHelper().is_mm(offId) ){
67  ATH_MSG_WARNING("MM id is not a mm id! " << idHelperSvc()->mmIdHelper().print_to_string(offId));
68  }
69  if( !idHelperSvc()->mmIdHelper().is_muon(offId) ){
70  ATH_MSG_WARNING("MM id is not a muon id! " << idHelperSvc()->mmIdHelper().print_to_string(offId));
71  }
72  if( idHelperSvc()->mmIdHelper().is_mdt(offId)||idHelperSvc()->mmIdHelper().is_rpc(offId)||idHelperSvc()->mmIdHelper().is_tgc(offId)||idHelperSvc()->mmIdHelper().is_csc(offId)||idHelperSvc()->mmIdHelper().is_stgc(offId) ){
73  ATH_MSG_WARNING("MM id has wrong technology type! " << idHelperSvc()->mmIdHelper().is_mdt(offId) << " " << idHelperSvc()->mmIdHelper().is_rpc(offId)
74  << " " << idHelperSvc()->mmIdHelper().is_tgc(offId) << " " << idHelperSvc()->mmIdHelper().is_csc(offId) << " " << idHelperSvc()->mmIdHelper().is_stgc(offId) );
75  }
76  if( idHelperSvc()->mmIdHelper().gasGap(offId) != layer ) {
77  ATH_MSG_WARNING("MM id has bad layer field! " << idHelperSvc()->mmIdHelper().print_to_string(offId) );
78  }
79 
80  int isSmall = stname[2] == 'S';
81  ATH_MSG_DEBUG("MicroMegas geometry, retrieving detector element for: isSmall " << isSmall << " eta " << idHelperSvc()->mmIdHelper().stationEta(offId)
82  << " phi " << idHelperSvc()->mmIdHelper().stationPhi(offId) << " ml " << idHelperSvc()->mmIdHelper().multilayer(offId) );
83 
84  const MuonGM::MMReadoutElement* detEl = MuonDetMgr->getMMReadoutElement(offId);
85  if (!detEl) {
86  ATH_MSG_ERROR("MMSimHitVariables::fillVariables() - Failed to retrieve MMReadoutElement for "<<idHelperSvc()->mmIdHelper().print_to_string(offId).c_str());
87  return false;
88  }
89 
90  // surface
91  const Trk::PlaneSurface& surf = detEl->surface(offId);
92  // compute hit position within the detector element/surfaces
93  Amg::Transform3D gToL = detEl->absTransform().inverse();
94  Amg::Vector3D hpos(hit.globalPosition().x(),hit.globalPosition().y(),hit.globalPosition().z());
95  Amg::Vector3D dSurface_pos = gToL*hpos;
96 
97  // compute the hit position on the readout plane (same as in MuonFastDigitization)
98  Amg::Vector3D rSurface_pos = surf.transform().inverse()*hpos;
99 
100  Amg::Vector2D posOnSurfUnProjected(rSurface_pos.x(),rSurface_pos.y());
101 
102  // check where the readout plane is located and compute the local direction accordingly
103  Amg::Vector3D ldir(0., 0., 0.);
104  ldir = surf.transform().inverse().linear()*Amg::Vector3D(hit.globalDirection().x(), hit.globalDirection().y(), hit.globalDirection().z());
105 
106  double scale, scaletop;
107  double gasgap = 5.;
108 
109  scale = -rSurface_pos.z()/ldir.z();
110  scaletop = (gasgap+rSurface_pos.z())/ldir.z();
111 
112  Amg::Vector3D hitOnSurface = rSurface_pos + scale*ldir;
113  Amg::Vector3D hitOnTopSurface = rSurface_pos + scaletop*ldir;
114  Amg::Vector2D posOnSurf (hitOnSurface.x(), hitOnSurface.y());
115  Amg::Vector2D posOnTopSurf (hitOnTopSurface.x(),hitOnTopSurface.y());
116 
117 
118  int stripNumber = detEl->stripNumber(posOnSurf,offId);
119 
120  // perform bound check (making the call from the detector element to consider edge passivation)
121  m_NSWMM_isInsideBounds.push_back( detEl->insideActiveBounds(offId, posOnSurf) );
122 
123  if( stripNumber == -1 ){
124  ATH_MSG_WARNING("MicroMegas validation: failed to obtain strip number " << idHelperSvc()->mmIdHelper().print_to_string(offId) );
125  ATH_MSG_WARNING(" pos " << posOnSurf << " z " << rSurface_pos.z() );
126  stripNumber = 1;
127  }
128 
129  Identifier oldId = offId;
130  offId = idHelperSvc()->mmIdHelper().channelID(offId, idHelperSvc()->mmIdHelper().multilayer(offId), idHelperSvc()->mmIdHelper().gasGap(offId),stripNumber);
131  if( idHelperSvc()->mmIdHelper().gasGap(offId) != layer ) {
132  ATH_MSG_WARNING("MicroMegas validation: MM id has bad layer field(2)! " << std::endl << " " << idHelperSvc()->mmIdHelper().print_to_string(offId) << std::endl
133  << " " << idHelperSvc()->mmIdHelper().print_to_string(oldId) << " stripN " << stripNumber );
134  }
135 
136  Amg::Vector2D fastDigitPos(0.,0.);
137  if( !detEl->stripPosition(offId,fastDigitPos ) ){
138  ATH_MSG_WARNING("MicroMegas validation: failed to obtain local position for identifier " << idHelperSvc()->mmIdHelper().print_to_string(offId) );
139  }
140 
141  Amg::Vector3D detpos = detEl->globalPosition();
142  ATH_MSG_DEBUG("Global hit : r " << hit.globalPosition().perp() << ", phi " << hit.globalPosition().phi() << ", z " << hit.globalPosition().z()
143  << "; detEl: r " << detpos.perp() << ", phi " << detpos.phi() << ", z " << detpos.z()
144  << "; surf z " << surf.center().z() << ", ml " << multilayer << ", l " << layer );
145  ATH_MSG_DEBUG(" detEl: x " << dSurface_pos.x() << " y " << dSurface_pos.y() << " z " << dSurface_pos.z());
146  ATH_MSG_DEBUG("MM Fast digit: x " << fastDigitPos.x() << " y " << fastDigitPos.y()
147  << ", gToL: x " << rSurface_pos.x() << " y " << rSurface_pos.y() << " z " << rSurface_pos.z() );
148 
149  // Fill ntuple with the hit/surface/digit positions
153 
156 
157  ++n_hits;
158  }
159  m_NSWMM_nSimHits = n_hits;
160 
161  ATH_MSG_DEBUG("processed " << m_NSWMM_nSimHits << " MM hits");
162  return true;
163  }
164 }
MuonGM::MMReadoutElement::stripPosition
virtual bool stripPosition(const Identifier &id, Amg::Vector2D &pos) const override final
strip position – local or global If the strip number is outside the range of valid strips,...
Definition: MMReadoutElement.h:209
MMSimHitVariables.h
MicromegasHitIdHelper::GetSide
int GetSide(const int &hid) const
Definition: MicromegasHitIdHelper.cxx:94
MMSimHit
Definition: MMSimHit.h:15
dumpTgcDigiDeadChambers.gasGap
list gasGap
Definition: dumpTgcDigiDeadChambers.py:33
MicromegasHitIdHelper::GetStationName
std::string GetStationName(const int &hid) const
Definition: MicromegasHitIdHelper.cxx:61
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MicromegasHitIdHelper::GetMultiLayer
int GetMultiLayer(const int &hid) const
Definition: MicromegasHitIdHelper.cxx:84
MuonGM::MuonReadoutElement::absTransform
const Amg::Transform3D & absTransform() const
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonReadoutElement.h:210
MuonPRDTest::MMSimHitVariables::m_NSWMM_hitGlobalPosition
ThreeVectorBranch m_NSWMM_hitGlobalPosition
Definition: MMSimHitVariables.h:22
MuonGM::MMReadoutElement::insideActiveBounds
bool insideActiveBounds(const Identifier &id, const Amg::Vector2D &locpos, double tol1=0., double tol2=0.) const
boundary check Wrapper Trk::PlaneSurface::insideBounds() taking into account the passivated width
Definition: MMReadoutElement.h:257
MuonPRDTest::MMSimHitVariables::m_NSWMM_detector_globalPosition
ThreeVectorBranch m_NSWMM_detector_globalPosition
Definition: MMSimHitVariables.h:32
MuonPRDTest::MMSimHitVariables::m_NSWMM_nSimHits
ScalarBranch< unsigned int > & m_NSWMM_nSimHits
Definition: MMSimHitVariables.h:29
MuonPRDTest::MMSimHitVariables::fill
bool fill(const EventContext &ctx) override final
The fill method checks if enough information is provided such that the branch is cleared from the inf...
Definition: MMSimHitVariables.cxx:15
MicromegasHitIdHelper.h
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
MuonPRDTest::MMSimHitVariables::m_NSWMM_FastDigitRsurfacePositionX
VectorBranch< float > & m_NSWMM_FastDigitRsurfacePositionX
Definition: MMSimHitVariables.h:35
tree
TChain * tree
Definition: tile_monitor.h:30
MuonPRDTest::MMSimHitVariables::MMSimHitVariables
MMSimHitVariables(MuonTesterTree &tree, const std::string &container_name, MSG::Level msglvl)
Definition: MMSimHitVariables.cxx:10
MuonPRDTest::PrdTesterModule::getDetMgr
const MuonGM::MuonDetectorManager * getDetMgr(const EventContext &ctx) const
Definition: PrdTesterModule.cxx:15
MuonPRDTest::MMSimHitVariables::m_NSWMM_globalTime
VectorBranch< float > & m_NSWMM_globalTime
Definition: MMSimHitVariables.h:31
MuonPRDTest::MMSimHitVariables::declare_keys
bool declare_keys() override final
Definition: MMSimHitVariables.cxx:13
MuonVal::MmIdentifierBranch::push_back
void push_back(const Identifier &id) override final
Definition: IdentifierBranch.cxx:93
MicromegasHitIdHelper::GetZSector
int GetZSector(const int &hid) const
Definition: MicromegasHitIdHelper.cxx:78
MicromegasHitIdHelper::GetLayer
int GetLayer(const int &hid) const
Definition: MicromegasHitIdHelper.cxx:89
Trk::Surface::center
const Amg::Vector3D & center() const
Returns the center position of the Surface.
Muon::IMuonIdHelperSvc::mmIdHelper
virtual const MmIdHelper & mmIdHelper() const =0
access to CscIdHelper
MuonPRDTest::MMSimHitVariables::m_NSWMM_particleEncoding
VectorBranch< int > & m_NSWMM_particleEncoding
Definition: MMSimHitVariables.h:24
yodamerge_tmp.scale
scale
Definition: yodamerge_tmp.py:138
MuonPRDTest::MMSimHitVariables::m_NSWMM_hitToRsurfacePosition
ThreeVectorBranch m_NSWMM_hitToRsurfacePosition
Definition: MMSimHitVariables.h:34
MuonPRDTest::MMSimHitVariables::m_NSWMM_kineticEnergy
VectorBranch< float > & m_NSWMM_kineticEnergy
Definition: MMSimHitVariables.h:25
MuonGM::MuonClusterReadoutElement::surface
virtual const Trk::PlaneSurface & surface() const override
access to chamber surface (phi orientation), uses the first gas gap
Definition: MuonClusterReadoutElement.h:123
MuonVal::MuonTesterBranch::declare_dependency
bool declare_dependency(Key &key)
Declares the ReadHandle/ ReadCondHandleKey as data dependency of the algorithm.
TRT::Hit::side
@ side
Definition: HitInfo.h:83
MuonVal::ThreeVectorBranch::push_back
void push_back(const Amg::Vector3D &vec)
interface using the Amg::Vector3D
Definition: ThreeVectorBranch.cxx:23
MuonPRDTest::MMSimHitVariables::m_NSWMM_hitToDsurfacePosition
ThreeVectorBranch m_NSWMM_hitToDsurfacePosition
Definition: MMSimHitVariables.h:33
MMReadoutElement.h
TrigConf::MSGTC::Level
Level
Definition: Trigger/TrigConfiguration/TrigConfBase/TrigConfBase/MsgStream.h:21
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
MuonVal::MuonTesterTree
Definition: MuonTesterTree.h:30
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
MuonPRDTest::PrdTesterModule
Definition: PrdTesterModule.h:15
MuonPRDTest::MMSimHitVariables::m_NSWMM_Id
MmIdentifierBranch m_NSWMM_Id
Definition: MMSimHitVariables.h:30
MuonPRDTest::MMSimHitVariables::m_NSWMM_FastDigitRsurfacePositionY
VectorBranch< float > & m_NSWMM_FastDigitRsurfacePositionY
Definition: MMSimHitVariables.h:36
MuonGM::MuonReadoutElement::globalPosition
const Amg::Vector3D globalPosition() const
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx:47
MicromegasHitIdHelper
Definition: MicromegasHitIdHelper.h:13
MuonVal::VectorBranch::push_back
void push_back(const T &value)
Adds a new element at the end of the vector.
MuonPRDTest::MMSimHitVariables::m_NSWMM_trackId
VectorBranch< int > & m_NSWMM_trackId
Definition: MMSimHitVariables.h:28
MicromegasHitIdHelper::GetPhiSector
int GetPhiSector(const int &hid) const
Definition: MicromegasHitIdHelper.cxx:73
MuonPRDTest::MMSimHitVariables::m_NSWMM_isInsideBounds
VectorBranch< bool > & m_NSWMM_isInsideBounds
Definition: MMSimHitVariables.h:27
MuonPRDTest::MMSimHitVariables::m_NSWMM_hitGlobalDirection
ThreeVectorBranch m_NSWMM_hitGlobalDirection
Definition: MMSimHitVariables.h:23
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MicromegasHitIdHelper::GetHelper
static const MicromegasHitIdHelper * GetHelper()
Definition: MicromegasHitIdHelper.cxx:25
MuonPRDTest::MMSimHitVariables::m_key
SG::ReadHandleKey< MMSimHitCollection > m_key
Definition: MMSimHitVariables.h:21
MuonGM::MuonDetectorManager
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:49
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Trk::PlaneSurface
Definition: PlaneSurface.h:64
MuonGM::MMReadoutElement::stripNumber
virtual int stripNumber(const Amg::Vector2D &pos, const Identifier &id) const override final
strip number corresponding to local position.
Definition: MMReadoutElement.h:202
MuonGM::MuonDetectorManager::getMMReadoutElement
const MMReadoutElement * getMMReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:255
MuonPRDTest
Definition: CSCDigitVariables.h:10
MuonPRDTest::PrdTesterModule::idHelperSvc
const Muon::IMuonIdHelperSvc * idHelperSvc() const
Definition: PrdTesterModule.cxx:14
MuonGM::MMReadoutElement
An MMReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station con...
Definition: MMReadoutElement.h:23
MmIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channel) const
Definition: MmIdHelper.cxx:736
Trk::Surface::transform
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
MuonPRDTest::MMSimHitVariables::m_NSWMM_depositEnergy
VectorBranch< float > & m_NSWMM_depositEnergy
Definition: MMSimHitVariables.h:26