ATLAS Offline Software
RpcRdoToRpcDigit.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "RpcRdoToRpcDigit.h"
6 #include "GaudiKernel/PhysicalConstants.h"
8 namespace {
9  constexpr double inverseSpeedOfLight = 1 / Gaudi::Units::c_light;
10 }
11 
13  const IdentifierHash& hash, RpcDigitCollection* &coll, MsgStream& msg) {
15  coll = m_lastColl;
16  return StatusCode::SUCCESS;
17  }
19  if (m_lastColl) {
20  coll = m_lastColl;
21  return StatusCode::SUCCESS;
22  }
23  std::unique_ptr<RpcDigitCollection> new_coll = std::make_unique<RpcDigitCollection>(elementId, hash);
24  coll = new_coll.get();
26  if(lock.addOrDelete(std::move(new_coll)).isFailure()){
27  msg<<MSG::ERROR<<" Failed to add digit collection "<<elementId<<endmsg;
28  coll = nullptr;
29  return StatusCode::FAILURE;
30  }
31  m_lastColl = m_digitMap[hash] = coll;
32  return StatusCode::SUCCESS;
33 }
34 RpcRdoToRpcDigit::RpcRdoToRpcDigit(const std::string& name, ISvcLocator* pSvcLocator) : AthReentrantAlgorithm(name, pSvcLocator) {}
35 
37  ATH_CHECK(m_idHelperSvc.retrieve());
40  ATH_CHECK(m_rpcRdoDecoderTool.retrieve());
42 
46 
47  return StatusCode::SUCCESS;
48 }
49 
50 StatusCode RpcRdoToRpcDigit::execute(const EventContext& ctx) const {
51  ATH_MSG_DEBUG("in execute()");
52  // retrieve the collection of RDO
54  if (!rdoRH.isValid()) {
55  ATH_MSG_WARNING("No RPC RDO container found!");
56  return StatusCode::SUCCESS;
57  }
58  const RpcPadContainer* rdoContainer = rdoRH.cptr();
59  ATH_MSG_DEBUG("Retrieved " << rdoContainer->size() << " RPC RDOs.");
60 
62  ATH_CHECK(wh_rpcDigit.record(std::make_unique<RpcDigitContainer>(m_idHelperSvc->rpcIdHelper().module_hash_max())));
63  ATH_MSG_DEBUG("Decoding RPC RDO into RPC Digit");
64 
65 
67  TempDigitContainer temp_out{wh_rpcDigit.ptr()};
68  for (const RpcPad* rpcPad : *rdoContainer) {
69  if (!rpcPad->empty()) { ATH_CHECK(decodeRpc(rpcPad, temp_out, cablingCondData.cptr())); }
70  }
71  ATH_CHECK(decodeNRpc(ctx, *wh_rpcDigit));
72 
73  return StatusCode::SUCCESS;
74 }
75 
76 StatusCode RpcRdoToRpcDigit::decodeRpc(const RpcPad* rdoColl, TempDigitContainer& container, const RpcCablingCondData* rpcCab) const {
77 
78  ATH_MSG_DEBUG(" Number of CMs in this Pad " << rdoColl->size());
79  // Get pad online id and sector id
80  uint16_t padId = rdoColl->onlineId();
81  uint16_t sectorId = rdoColl->sector();
82 
83  // For each pad, loop on the coincidence matrices
84  for (const RpcCoinMatrix* coinMatrix : *rdoColl) {
85  // Get CM online Id
86  uint16_t cmaId = coinMatrix->onlineId();
87 
88  // For each CM, loop on the fired channels
89  for (const RpcFiredChannel* rpcChan : *coinMatrix) {
90  std::vector<std::unique_ptr<RpcDigit>> digitVec{m_rpcRdoDecoderTool->getDigit(rpcChan,
91  sectorId,
92  padId,
93  cmaId,
94  rpcCab)};
95 
96  if (digitVec.empty()) continue;
97 
98 
99  // Loop on the digits corresponding to the fired channel
100  for (std::unique_ptr<RpcDigit>& newDigit : digitVec) {
101  Identifier elementId = m_idHelperSvc->rpcIdHelper().elementID(newDigit->identify());
102  IdentifierHash coll_hash{0};
103  if (m_idHelperSvc->rpcIdHelper().get_module_hash(elementId, coll_hash)) {
104  ATH_MSG_ERROR("Unable to get RPC digit collection hash id the identifier is "
105  <<m_idHelperSvc->toString(newDigit->identify()));
106  return StatusCode::FAILURE;
107  }
108  RpcDigitCollection* collection{nullptr};
109  ATH_CHECK(container.findCollection(elementId,coll_hash,collection, msgStream()));
110  collection->push_back(std::move(newDigit));
111  }
112  }
113  }
114  return StatusCode::SUCCESS;
115 }
116 StatusCode RpcRdoToRpcDigit::decodeNRpc(const EventContext& ctx, RpcDigitContainer& out_container) const {
117  if (!m_decodeNrpcRDO) {
118  ATH_MSG_VERBOSE("NRPC rdo decoding has been switched off ");
119  return StatusCode::SUCCESS;
120  }
121 
123  if (!rdoContainer.isValid()) {
124  ATH_MSG_FATAL("Failed to retrieve "<<m_nRpcRdoKey.fullKey());
125  return StatusCode::FAILURE;
126  }
128  if (!cabling.isValid()) {
129  ATH_MSG_FATAL("Failed to retrieve "<<m_nRpcCablingKey.fullKey());
130  return StatusCode::FAILURE;
131  }
133  if (!muonDetMgr.isValid()) {
134  ATH_MSG_FATAL("Failed to retrieve the readout geometry "<<muonDetMgr.fullKey());
135  return StatusCode::FAILURE;
136  }
137  const RpcIdHelper& id_helper = m_idHelperSvc->rpcIdHelper();
138  std::map<IdentifierHash, std::unique_ptr<RpcDigitCollection>> digit_map{};
140  for (const xAOD::NRPCRDO* rdo : *rdoContainer) {
141  ATH_MSG_VERBOSE("Convert RDO tdcSector: "<< static_cast<int>(rdo->tdcsector())<<", tdc:"
142  <<static_cast<int>(rdo->tdc())<<" channel: "<<static_cast<int>(rdo->channel()) <<", time: "<<
143  rdo->time()<<", ToT: "<<rdo->timeoverthr());
144 
146  NrpcCablingData conv_obj{};
147  conv_obj.subDetector = rdo->subdetector();
148  conv_obj.tdcSector = rdo->tdcsector();
149  conv_obj.tdc = rdo->tdc();
150  conv_obj.channelId = rdo->channel();
151 
152  if (!cabling->getOfflineId(conv_obj, msgStream())) {
153  ATH_MSG_FATAL("Failed to convert online -> offline");
154  return StatusCode::FAILURE;
155  }
156  Identifier chanId{0};
157  if (!cabling->convert(conv_obj, chanId)) {
158  return StatusCode::FAILURE;
159  }
161  IdentifierHash modHash = m_idHelperSvc->moduleHash(chanId);
162  std::unique_ptr<RpcDigitCollection>& coll = digit_map[modHash];
164  if (!coll) {
165  coll = std::make_unique<RpcDigitCollection>(id_helper.elementID(chanId), modHash);
166  }
169  const float digit_time = rdo->time();
170  const float ToT = m_patch_for_rpc_time ? rdo->timeoverthr()
171  + inverseSpeedOfLight * (muonDetMgr->getRpcReadoutElement(chanId)->stripPos(chanId)).mag() : rdo->timeoverthr() ;
172 
173  std::unique_ptr<RpcDigit> digit = std::make_unique<RpcDigit>(chanId, digit_time, ToT, conv_obj.stripSide());
174  coll->push_back(std::move(digit));
175  }
176 
177  for (auto& [hash, coll] : digit_map){
178  if (coll->empty()) continue;
180  ATH_CHECK(lock.addOrDelete(std::move(coll)));
181  }
182  return StatusCode::SUCCESS;
183 }
RpcRdoToRpcDigit::TempDigitContainer::m_digitMap
std::map< IdentifierHash, RpcDigitCollection * > m_digitMap
Definition: RpcRdoToRpcDigit.h:38
RpcRdoToRpcDigit::TempDigitContainer::m_cont
RpcDigitContainer * m_cont
Definition: RpcRdoToRpcDigit.h:36
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
RpcRdoToRpcDigit::m_rpcRdoKey
SG::ReadHandleKey< RpcPadContainer > m_rpcRdoKey
Definition: RpcRdoToRpcDigit.h:45
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
IdentifiableContainerMT::getWriteHandle
IDC_WriteHandle getWriteHandle(IdentifierHash hash)
Definition: IdentifiableContainerMT.h:251
RpcIdHelper::elementID
Identifier elementID(int stationName, int stationEta, int stationPhi, int doubletR) const
Definition: RpcIdHelper.cxx:802
RpcRdoToRpcDigit::decodeNRpc
StatusCode decodeNRpc(const EventContext &ctx, RpcDigitContainer &container) const
Definition: RpcRdoToRpcDigit.cxx:116
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
RpcDigitContainer
Use IdentifiableContainer with RpcDigitCollection.
Definition: RpcDigitContainer.h:53
RpcDigitCollection
Definition: RpcDigitCollection.h:17
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
IdentifiableContainerMT::size
size_t size() const
Duplicate of fullSize for backwards compatability.
Definition: IdentifiableContainerMT.h:209
NrpcCablingOnlineID::subDetector
int16_t & subDetector
Identifier of the subdetector region in the readout BA / BC etc.
Definition: NrpcCablingData.h:77
xAOD::NRPCRDO_v1
Definition: NRPCRDO_v1.h:14
RpcRdoToRpcDigit::m_nRpcRdoKey
SG::ReadHandleKey< xAOD::NRPCRDOContainer > m_nRpcRdoKey
Definition: RpcRdoToRpcDigit.h:53
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
RpcCoinMatrix
Definition: RpcCoinMatrix.h:20
RpcRdoToRpcDigit::m_nRpcCablingKey
SG::ReadCondHandleKey< MuonNRPC_CablingMap > m_nRpcCablingKey
Definition: RpcRdoToRpcDigit.h:54
RpcIdHelper
Definition: RpcIdHelper.h:51
RpcRdoToRpcDigit::m_patch_for_rpc_time
Gaudi::Property< bool > m_patch_for_rpc_time
Definition: RpcRdoToRpcDigit.h:51
RpcRdoToRpcDigit::decodeRpc
StatusCode decodeRpc(const RpcPad *, TempDigitContainer &container, const RpcCablingCondData *rpcCab) const
Definition: RpcRdoToRpcDigit.cxx:76
RpcFiredChannel
Definition: RpcFiredChannel.h:20
RpcCablingCondData
Definition: RpcCablingCondData.h:21
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
RpcRdoToRpcDigit::m_rpcReadKey
SG::ReadCondHandleKey< RpcCablingCondData > m_rpcReadKey
Definition: RpcRdoToRpcDigit.h:47
RpcRdoToRpcDigit.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::WriteHandle::ptr
pointer_type ptr()
Dereference the pointer.
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
NrpcCablingData
Cabling information shipped around the Digi <-> Rdo conversions.
Definition: NrpcCablingData.h:121
IdentifiableContainerMT::IDC_WriteHandle
Definition: IdentifiableContainerMT.h:34
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
RpcRdoToRpcDigit::m_rpcRdoDecoderTool
ToolHandle< Muon::IRPC_RDO_Decoder > m_rpcRdoDecoderTool
Definition: RpcRdoToRpcDigit.h:43
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
RpcRdoToRpcDigit::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: RpcRdoToRpcDigit.h:44
RpcPad::onlineId
ubit16 onlineId() const
Definition: RpcPad.h:107
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
RpcRdoToRpcDigit::TempDigitContainer::m_lastColl
RpcDigitCollection * m_lastColl
Definition: RpcRdoToRpcDigit.h:37
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
RpcRdoToRpcDigit::initialize
virtual StatusCode initialize() override final
Definition: RpcRdoToRpcDigit.cxx:36
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
python.PhysicalConstants.c_light
float c_light
Definition: PhysicalConstants.py:63
RpcRdoToRpcDigit::TempDigitContainer::findCollection
StatusCode findCollection(const Identifier &elementId, const IdentifierHash &hash, RpcDigitCollection *&coll, MsgStream &msg)
Definition: RpcRdoToRpcDigit.cxx:12
RpcPad
Definition: RpcPad.h:21
IdentifiableContainerMT::IDC_WriteHandle::addOrDelete
StatusCode addOrDelete(std::unique_ptr< T > ptr)
Definition: IdentifiableContainerMT.h:56
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
RpcDigitCollection::identifierHash
IdentifierHash identifierHash() const
Definition: RpcDigitCollection.h:35
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
RpcPad::sector
int sector() const
Definition: RpcPad.h:112
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
RpcRdoToRpcDigit::RpcRdoToRpcDigit
RpcRdoToRpcDigit(const std::string &name, ISvcLocator *pSvcLocator)
Definition: RpcRdoToRpcDigit.cxx:34
AthCommonMsg< Gaudi::Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
IdentifierHash
Definition: IdentifierHash.h:38
RpcRdoToRpcDigit::TempDigitContainer
Definition: RpcRdoToRpcDigit.h:29
RpcRdoToRpcDigit::m_decodeNrpcRDO
Gaudi::Property< bool > m_decodeNrpcRDO
Definition: RpcRdoToRpcDigit.h:50
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
RpcRdoToRpcDigit::m_DetectorManagerKey
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
Definition: RpcRdoToRpcDigit.h:56
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
mag
Scalar mag() const
mag method
Definition: AmgMatrixBasePlugin.h:25
RpcRdoToRpcDigit::execute
virtual StatusCode execute(const EventContext &ctx) const override final
Definition: RpcRdoToRpcDigit.cxx:50
RpcRdoToRpcDigit::m_rpcDigitKey
SG::WriteHandleKey< RpcDigitContainer > m_rpcDigitKey
Definition: RpcRdoToRpcDigit.h:46
RpcPadContainer
Use IdentifiableContainer with RpcPad.
Definition: RpcPadContainer.h:23
RpcReadoutElement.h