ATLAS Offline Software
RPCSimHitVariables.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
5 
9 
10 namespace MuonPRDTest {
11  RPCSimHitVariables::RPCSimHitVariables(MuonTesterTree& tree, const std::string& container_name, MSG::Level msglvl) :
12  PrdTesterModule(tree, "SIM_RPC", msglvl), m_key{container_name} {}
13 
15 
16  bool RPCSimHitVariables::fill(const EventContext& ctx) {
17  ATH_MSG_DEBUG("do fill RpcSDOVariable()");
18  SG::ReadHandle<RPCSimHitCollection> rpcContainer{m_key, ctx};
19  if (!rpcContainer.isValid()) {
20  ATH_MSG_FATAL("Failed to retrive digit container " << m_key.fullKey());
21  return false;
22  }
23  const MuonGM::MuonDetectorManager* MuonDetMgr = getDetMgr(ctx);
24  if (!MuonDetMgr) { return false; }
25  unsigned int n_hits{0};
26  // Get the RPC Id hit helper
27  const RpcHitIdHelper* rpchhelper = RpcHitIdHelper::GetHelper();
28  if (!rpcContainer->size()) ATH_MSG_DEBUG("RPC sdo container is empty");
29  for (const RPCSimHit& hit : *rpcContainer) {
30  HitID hitid = hit.RPCid();
31 
32  std::string stname = rpchhelper->GetStationName(hitid);
33  int steta = rpchhelper->GetZSector(hitid);
34  int stphi = rpchhelper->GetPhiSector(hitid);
35  int dbr = rpchhelper->GetDoubletR(hitid);
36  int dbz = rpchhelper->GetDoubletZ(hitid);
37  int dbp = rpchhelper->GetDoubletPhi(hitid);
38  int gg = rpchhelper->GetGasGapLayer(hitid);
39  int mfi = rpchhelper->GetMeasuresPhi(hitid);
40 
41  bool isValid = false;
42  // the last 2 arguments are:
43  // bool check -> set to true for validity check of identifier
44  // &bool isValid -> reference to boolean, which will be false in case of invalid identifier
45  // the channelID() function of the RpcIdHelper needs also a stripNumber, but the RpcHitIdHelper
46  // does not seem to return this, so we just give stripNumber=1 for now
47  Identifier offid = idHelperSvc()->rpcIdHelper().channelID(stname, steta, stphi, dbr, dbz, dbp, gg, mfi, 1, isValid);
48  if (!isValid) {
49  ATH_MSG_WARNING("Cannot build a valid Identifier for RPC stationName="
50  << stname << ", eta=" << steta << ", phi=" << stphi << ", doubletR=" << dbr << ", doubletZ=" << dbz
51  << ", doubletPhi=" << dbp << ", gasGap=" << gg << ", measuresPhi=" << mfi << "; skipping...");
52  continue;
53  }
54 
55  const MuonGM::RpcReadoutElement* rpcdet = MuonDetMgr->getRpcReadoutElement(offid);
56  if (!rpcdet) {
57  ATH_MSG_ERROR("RPCSimHitVariables::fillVariables() - Failed to retrieve RpcReadoutElement for "
58  << idHelperSvc()->toString(offid));
59  return false;
60  }
61 
62  m_rpc_Id.push_back(offid);
63  m_RPC_globalTime.push_back(hit.globalTime());
64  const Amg::Vector3D& localPosition = hit.localPosition();
65  m_RPC_hitLocalPositionX.push_back(localPosition.x());
66  m_RPC_hitLocalPositionY.push_back(localPosition.y());
67  Amg::Vector3D simHitPosGlo = rpcdet->localToGlobalCoords(localPosition, offid);
68  m_RPC_hitGlobalPosition.push_back(simHitPosGlo);
70  m_RPC_particleEncoding.push_back(hit.particleEncoding());
71  m_RPC_kineticEnergy.push_back(hit.kineticEnergy());
72  m_RPC_depositEnergy.push_back(hit.energyDeposit());
73  m_RPC_StepLength.push_back(hit.stepLength());
74 
75  int pdgId = -999;
76  int barcode = -999;
77  const HepMcParticleLink& pLink = hit.particleLink();
78  barcode = pLink.barcode();
79  if (pLink.isValid()) {
80  HepMC::ConstGenParticlePtr genP = pLink.cptr();
81  if (genP) {
82  pdgId = genP->pdg_id();
83  barcode = HepMC::barcode(genP);
84  } else {
85  ATH_MSG_WARNING("GenParticle is nullptr for hit in "
86  << stname << " (eta=" << steta << ", phi=" << stphi << ", doubletR=" << dbr << ", doubletZ=" << dbz
87  << ", doubletPhi=" << dbp << ", gasgaplayer=" << gg << ", measuresPhi=" << mfi << ")");
88  }
89  } else {
90  // if barcode is 0, the hit was not created by a particle generated in the GenEvent step, thus link cannot be valid
91  if (msgLvl(barcode == 0 ? MSG::DEBUG : MSG::WARNING)) {
92  msg(barcode == 0 ? MSG::DEBUG : MSG::WARNING)
93  << "HepMcParticleLink with barcode=" << barcode << " is not valid for hit in " << stname << " (eta=" << steta
94  << ", phi=" << stphi << ", doubletR=" << dbr << ", doubletZ=" << dbz << ", doubletPhi=" << dbp
95  << ", gasgaplayer=" << gg << ", measuresPhi=" << mfi << ")" << endmsg;
96  }
97  }
98  m_RPC_trackId.push_back(pdgId);
100  ++n_hits;
101  }
102  m_RPC_nSimHits = n_hits;
103 
104  ATH_MSG_DEBUG("processed " << m_RPC_nSimHits << " Rpc hits");
105  return true;
106  }
107 
108 } // namespace MuonPRDTest
MuonGM::MuonDetectorManager::getRpcReadoutElement
const RpcReadoutElement * getRpcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:168
RpcHitIdHelper::GetStationName
std::string GetStationName(const int &hid) const
Definition: RpcHitIdHelper.cxx:58
RpcHitIdHelper::GetHelper
static const RpcHitIdHelper * GetHelper(unsigned int nGasGaps=2)
Definition: RpcHitIdHelper.cxx:23
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MuonPRDTest::RPCSimHitVariables::RPCSimHitVariables
RPCSimHitVariables(MuonTesterTree &tree, const std::string &container_name, MSG::Level msglvl)
Definition: RPCSimHitVariables.cxx:11
RpcHitIdHelper::GetDoubletPhi
int GetDoubletPhi(const int &hid) const
Definition: RpcHitIdHelper.cxx:88
MuonPRDTest::RPCSimHitVariables::m_RPC_kineticEnergy
VectorBranch< float > & m_RPC_kineticEnergy
Definition: RPCSimHitVariables.h:23
RpcHitIdHelper::GetMeasuresPhi
int GetMeasuresPhi(const int &hid) const
Definition: RpcHitIdHelper.cxx:96
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
MuonPRDTest::RPCSimHitVariables::m_RPC_particleEncoding
VectorBranch< int > & m_RPC_particleEncoding
Definition: RPCSimHitVariables.h:22
tree
TChain * tree
Definition: tile_monitor.h:30
MuonPRDTest::RPCSimHitVariables::declare_keys
bool declare_keys() override final
Definition: RPCSimHitVariables.cxx:14
MuonPRDTest::PrdTesterModule::getDetMgr
const MuonGM::MuonDetectorManager * getDetMgr(const EventContext &ctx) const
Definition: PrdTesterModule.cxx:16
RpcHitIdHelper::GetDoubletZ
int GetDoubletZ(const int &hid) const
Definition: RpcHitIdHelper.cxx:92
MuonVal::RpcIdentifierBranch::push_back
void push_back(const Identifier &id) override final
Definition: IdentifierBranch.cxx:36
MuonGM::RpcReadoutElement
An RpcReadoutElement corresponds to a single RPC module; therefore typicaly a barrel muon station con...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/RpcReadoutElement.h:55
isValid
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition: AtlasPID.h:620
RpcIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int doubletR, int doubletZ, int doubletPhi, int gasGap, int measuresPhi, int strip) const
Definition: RpcIdHelper.cxx:939
RpcHitIdHelper.h
GenParticle.h
MuonVal::MuonTesterBranch::declare_dependency
bool declare_dependency(Key &key)
Declares the ReadHandle/ ReadCondHandleKey as data dependency of the algorithm.
MuonVal::ThreeVectorBranch::push_back
void push_back(const Amg::Vector3D &vec)
interface using the Amg::Vector3D
Definition: ThreeVectorBranch.cxx:23
MuonGM::RpcReadoutElement::localToGlobalCoords
Amg::Vector3D localToGlobalCoords(const Amg::Vector3D &x, const Identifier &id) const
Attention: these transformations do not represent the tracking transformations as obtained by the tra...
Definition: MuonDetDescr/MuonReadoutGeometry/src/RpcReadoutElement.cxx:208
RpcHitIdHelper::GetPhiSector
int GetPhiSector(const int &hid) const
Definition: RpcHitIdHelper.cxx:69
MuonPRDTest::RPCSimHitVariables::m_RPC_nSimHits
ScalarBranch< unsigned int > & m_RPC_nSimHits
Definition: RPCSimHitVariables.h:30
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
TrigConf::MSGTC::Level
Level
Definition: Trigger/TrigConfiguration/TrigConfBase/TrigConfBase/MsgStream.h:21
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
AthMessaging::msgLvl
bool msgLvl(const MSG::Level lvl) const
Test the output level.
Definition: AthMessaging.h:151
MuonVal::MuonTesterTree
Definition: MuonTesterTree.h:30
MuonPRDTest::RPCSimHitVariables::m_RPC_truthEl
VectorBranch< int > & m_RPC_truthEl
Definition: RPCSimHitVariables.h:27
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
MuonPRDTest::RPCSimHitVariables::m_rpc_Id
RpcIdentifierBranch m_rpc_Id
Definition: RPCSimHitVariables.h:31
MuonPRDTest::PrdTesterModule
Definition: PrdTesterModule.h:15
MuonPRDTest::RPCSimHitVariables::m_RPC_hitLocalPositionY
VectorBranch< float > & m_RPC_hitLocalPositionY
Definition: RPCSimHitVariables.h:35
MuonGM::MuonReadoutElement::globalPosition
const Amg::Vector3D globalPosition() const
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonReadoutElement.cxx:47
AthMessaging::msg
MsgStream & msg() const
The standard message stream.
Definition: AthMessaging.h:164
RpcHitIdHelper::GetGasGapLayer
int GetGasGapLayer(const int &hid) const
Definition: RpcHitIdHelper.cxx:84
MuonVal::VectorBranch::push_back
void push_back(const T &value)
Adds a new element at the end of the vector.
HepMC::ConstGenParticlePtr
const GenParticle * ConstGenParticlePtr
Definition: GenParticle.h:38
MuonPRDTest::RPCSimHitVariables::m_RPC_trackId
VectorBranch< int > & m_RPC_trackId
Definition: RPCSimHitVariables.h:26
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
RpcHitIdHelper::GetDoubletR
int GetDoubletR(const int &hid) const
Definition: RpcHitIdHelper.cxx:80
MuonGM::MuonDetectorManager
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MuonDetectorManager.h:50
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DEBUG
#define DEBUG
Definition: page_access.h:11
MuonPRDTest
Definition: CSCDigitVariables.h:10
MuonPRDTest::PrdTesterModule::idHelperSvc
const Muon::IMuonIdHelperSvc * idHelperSvc() const
Definition: PrdTesterModule.cxx:15
MuonPRDTest::RPCSimHitVariables::m_RPC_globalTime
VectorBranch< float > & m_RPC_globalTime
Definition: RPCSimHitVariables.h:33
MuonPRDTest::RPCSimHitVariables::m_key
SG::ReadHandleKey< RPCSimHitCollection > m_key
Definition: RPCSimHitVariables.h:20
WriteBchToCool.dbr
dbr
Definition: WriteBchToCool.py:164
RPCSimHit
Definition: RPCSimHit.h:19
RpcHitIdHelper
Definition: RpcHitIdHelper.h:13
MuonPRDTest::RPCSimHitVariables::m_RPC_detector_globalPosition
ThreeVectorBranch m_RPC_detector_globalPosition
Definition: RPCSimHitVariables.h:28
MuonPRDTest::RPCSimHitVariables::m_RPC_hitGlobalPosition
ThreeVectorBranch m_RPC_hitGlobalPosition
Definition: RPCSimHitVariables.h:21
HitID
int HitID
Definition: GenericMuonSimHit.h:13
MuonPRDTest::RPCSimHitVariables::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: RPCSimHitVariables.cxx:16
MuonPRDTest::RPCSimHitVariables::m_RPC_StepLength
VectorBranch< float > & m_RPC_StepLength
Definition: RPCSimHitVariables.h:25
MuonPRDTest::RPCSimHitVariables::m_RPC_hitLocalPositionX
VectorBranch< float > & m_RPC_hitLocalPositionX
Definition: RPCSimHitVariables.h:34
RpcHitIdHelper::GetZSector
int GetZSector(const int &hid) const
Definition: RpcHitIdHelper.cxx:74
MuonPRDTest::RPCSimHitVariables::m_RPC_depositEnergy
VectorBranch< float > & m_RPC_depositEnergy
Definition: RPCSimHitVariables.h:24
Muon::IMuonIdHelperSvc::rpcIdHelper
virtual const RpcIdHelper & rpcIdHelper() const =0
access to RpcIdHelper
RPCSimHitVariables.h
RpcReadoutElement.h
Identifier
Definition: IdentifierFieldParser.cxx:14