ATLAS Offline Software
RpcCalibRawDataProvider.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
6 #include "GaudiKernel/DataObject.h"
7 #include "GaudiKernel/IRegistry.h"
8 #include "MuCalDecode/CalibData.h"
9 #include "MuCalDecode/CalibEvent.h"
10 #include "MuCalDecode/CalibUti.h"
13 
14 #include <iostream>
15 #include <list>
16 #include <algorithm>
17 #include <map>
18 
19 #include "StoreGate/StoreGateSvc.h"
24 #include "GaudiKernel/ServiceHandle.h"
26 
29 
30 using namespace LVL2_MUON_CALIBRATION;
31 
32 
33 RpcCalibRawDataProvider::RpcCalibRawDataProvider(const std::string& name, ISvcLocator* pSvcLocator) :
34  AthReentrantAlgorithm(name, pSvcLocator) {}
35 
37 
38  ATH_MSG_INFO("RpcCalibRawDataProvider::initialize");
39 
40  // retrieve common tools
42  ATH_CHECK(m_muonIdHelper.retrieve());
44 
45  // retrieve the dataProviderSvc
46  ATH_CHECK(m_dataProvider.retrieve());
47 
48  // setup output RPC container keys
50 
51  return StatusCode::SUCCESS;
52 }
53 
54 // --------------------------------------------------------------------
55 // Execute
56 StatusCode RpcCalibRawDataProvider::execute(const EventContext& ctx) const {
57 
58  ATH_MSG_INFO("RpcCalibRawDataProvider::execute");
59 
60  const CalibEvent *event = m_dataProvider->getEvent();
61 
62  // // setup output write handle for RpcPadContainer
64  ATH_CHECK(handle.record(std::make_unique<RpcPadContainer>(m_muonIdHelper->rpcIdHelper().module_hash_max())));
65  ATH_MSG_DEBUG("Created container " << m_rdoContainerKey.key());
66  // Pass the container from the handle
67  RpcPadContainer *padContainer = handle.ptr();
68 
69  ATH_CHECK(decodeImpl(ctx, padContainer, event));
70  ATH_MSG_DEBUG("RPC core decode processed in MT decode (calibration stream event)");
71 
72  return StatusCode::SUCCESS;
73 }
74 
75 StatusCode RpcCalibRawDataProvider::decodeImpl(const EventContext& ctx, RpcPadContainer *padContainer, const CalibEvent *event) const {
76 
77  // decoding process from https://gitlab.cern.ch/atlas-mcp/MdtCalib/mdtcalibframework/-/blob/master/MuonCalibStream/MuonCalibStreamCnv/src/RpcRDOContCalibStreamCnv.cxx
78  // to be verified with run3 data
79 
80  if (!event->rpc()) {
81  ATH_MSG_DEBUG("NO RPC hits!");
82  return StatusCode::SUCCESS;
83  }
85  const RpcCablingCondData *cabling{*readHandle};
86 
87  // RpcPadIdHash hashF;
88 
89  // extract the list of RPC pads
90  ATH_MSG_DEBUG("extract the list of RPC pads");
91  std::list<RpcCalibData> calib_pad = (event->rpc())->data();
92 
93  ATH_MSG_DEBUG("fillCollections: number of PADS= " << (event->rpc())->size());
94  ATH_MSG_DEBUG("fillCollections: number of matrices= " << calib_pad.size());
95 
96  // std::vector<RpcPad*>* m_rpcpads;
97  // Iterate on the readout PADS
98  std::vector<std::unique_ptr<RpcPad>> rpcPadCollections{};
99 
100  ATH_MSG_DEBUG("Iterate on the readout PADS");
101  int max_pad = 1;
102  for (int j = 0; j < max_pad; ++j) {
103  // Identifier elements
104  int name{0}, eta{0}, phi{0}, doublet_r{0}, doublet_z{0}, doublet_phi{0}, gas_gap{0}, measures_phi{0}, strip{0};
105 
106  unsigned int sector = (event->rpc())->sectorId();
107  unsigned int subsys = (event->rpc())->subsystemId();
108  unsigned int pad_id = (event->rpc())->padId();
109  unsigned int status = (event->rpc())->status();
110  unsigned int errorCode = (event->rpc())->error_code();
111 
113  if (subsys == 0x65) sector = sector + 32;
114 
115  ATH_MSG_DEBUG("fillCollections: pad no= " << j << " sector= " << sector << " subsys= " << subsys << " pad id= " << pad_id
116  << " status= " << status << " error code= " << errorCode);
117 
118  int side = (sector < 32) ? 0 : 1;
119  int logic_sector = sector % 32;
120  int key = side * 10000 + logic_sector * 100 + pad_id;
121 
122  // Retrieve the identifier elements from the map
123  const RpcCablingCondData::RDOmap &pad_map = cabling->give_RDOs();
124  RDOindex index = (*pad_map.find(key)).second;
125  index.offline_indexes(name, eta, phi, doublet_r, doublet_z, doublet_phi, gas_gap, measures_phi, strip);
126 
127  // Build the pad offline identifier
128  Identifier id = m_muonIdHelper->rpcIdHelper().padID(name, eta, phi, doublet_r, doublet_z, doublet_phi);
129 
130  std::unique_ptr<RpcPad> newpad = std::make_unique<RpcPad>(id, index.hash(), pad_id, status, errorCode, sector);
131 
132  // iterate on the matrices
133  ATH_MSG_DEBUG("Iterate on the matrices");
134  for (RpcCalibData &calib_matrix : calib_pad) {
135  unsigned int cmid = calib_matrix.onlineId();
136  unsigned int crc = calib_matrix.crc();
137  unsigned int fel1id = calib_matrix.fel1Id();
138  unsigned int febcid = calib_matrix.febcId();
139  ATH_MSG_DEBUG("fillCollections: matrix no= " << cmid << " crc= " << crc << " fel1id= " << fel1id << " febcid= " << febcid);
140  std::unique_ptr<RpcCoinMatrix> matrix = std::make_unique<RpcCoinMatrix>(id, cmid, crc, fel1id, febcid);
141 
142  // iterate on the fired channels
143  ATH_MSG_DEBUG("Iterate on the fired channels");
144  for (short unsigned int i = 0; i < calib_matrix.hitNum(); ++i) {
145  std::unique_ptr<RpcFiredChannel> rpcfiredchannel = nullptr ;
146  uint16_t bcid{0}, time{0}, ijk{0}, channel{0}, ovl{0}, thr{0};
147  calib_matrix.giveHit(i, bcid, time, ijk, channel, ovl, thr);
148 
149  ATH_MSG_DEBUG("Check BIS78 updates? " << __FILE__ << " " << __LINE__);
150  if (ijk < 7) {
151  rpcfiredchannel = std::make_unique<RpcFiredChannel>(bcid, time, ijk, channel);
152 
153  } else if (ijk == 7) {
154  rpcfiredchannel = std::make_unique<RpcFiredChannel>(bcid, time, ijk, thr, ovl);
155 
156  }
157  ATH_MSG_DEBUG("fillCollections: hit no= " << i << " bcid= " << bcid << " time= " << time << " ijk= " << ijk
158  << " channel=" << channel << " ovl= " << ovl << " thr= " << thr);
159  matrix->push_back(std::move(rpcfiredchannel));
160  ATH_MSG_DEBUG("fillCollections: hit added to the matrix");
161  } // end iterate on the fired channels
162  // add the matrix to the pad
163  newpad->push_back(std::move(matrix));
164  ATH_MSG_DEBUG("fillCollections: matrix added to the pad");
165  } // end iterate on the matrices
166 
167  // Push back the decoded pad in the vector
168 
169  rpcPadCollections.push_back(std::move(newpad));
170 
171  // m_rpcpads->push_back(newpad);
172  ATH_MSG_DEBUG("fillCollections: pad added to the pad vector");
173  } // end iterate on the readout PADS
174 
175  for (auto& coll : rpcPadCollections) {
176  if (!coll) continue;
177  const Identifier padId = coll->identify();
178  IdentifierHash elementHash = m_muonIdHelper->moduleHash(padId);
179  RpcPadContainer::IDC_WriteHandle lock = padContainer->getWriteHandle(elementHash);
180  ATH_CHECK(lock.addOrDelete(std::move(coll)));
181  }
182  ATH_MSG_DEBUG("Wrote " << rpcPadCollections.size() << " RPC PAD");
183 
184  return StatusCode::SUCCESS;
185  }
ReadHandleKey.h
Property holding a SG store/key/clid from which a ReadHandle is made.
MuonCalibStreamAddress.h
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
RpcCalibRawDataProvider::m_muonIdHelper
ServiceHandle< Muon::IMuonIdHelperSvc > m_muonIdHelper
Definition: RpcCalibRawDataProvider.h:64
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
SiliconTech::strip
@ strip
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:24
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
AthCheckMacros.h
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthMsgStreamMacros.h
RpcCalibRawDataProvider.h
LVL2_MUON_CALIBRATION
Definition: MuCalStreamerTool.h:37
IdentifiableContainerMT::getWriteHandle
IDC_WriteHandle getWriteHandle(IdentifierHash hash)
Definition: IdentifiableContainerMT.h:251
RpcCalibRawDataProvider::initialize
virtual StatusCode initialize() override
Initialize.
Definition: RpcCalibRawDataProvider.cxx:36
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
index
Definition: index.py:1
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
RpcCalibRawDataProvider::m_rdoContainerKey
SG::WriteHandleKey< RpcPadContainer > m_rdoContainerKey
Definition: RpcCalibRawDataProvider.h:67
RpcCalibRawDataProvider::execute
virtual StatusCode execute(const EventContext &ctx) const override
Execute.
Definition: RpcCalibRawDataProvider.cxx:56
ReadCondHandle.h
RpcCablingCondData
Definition: RpcCablingCondData.h:21
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
TRT::Hit::side
@ side
Definition: HitInfo.h:83
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
lumiFormat.i
int i
Definition: lumiFormat.py:85
MuonPrepDataCollection.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
WriteCondHandle.h
IdentifiableContainerMT::IDC_WriteHandle
Definition: IdentifiableContainerMT.h:34
RpcCablingCondData::RDOmap
std::map< int, RDOindex, std::less< int > > RDOmap
Definition: RpcCablingCondData.h:25
RpcCalibRawDataProvider::m_rpcReadKey
SG::ReadCondHandleKey< RpcCablingCondData > m_rpcReadKey
Definition: RpcCalibRawDataProvider.h:69
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
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
ReadCondHandleKey.h
WriteHandleKey.h
Property holding a SG store/key/clid from which a WriteHandle is made.
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
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)
xAOD::bcid
setEventNumber setTimeStamp bcid
Definition: EventInfo_v1.cxx:133
IdentifiableContainerMT::IDC_WriteHandle::addOrDelete
StatusCode addOrDelete(std::unique_ptr< T > ptr)
Definition: IdentifiableContainerMT.h:56
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
python.testIfMatch.matrix
matrix
Definition: testIfMatch.py:66
RpcCalibRawDataProvider::decodeImpl
StatusCode decodeImpl(const EventContext &ctx, RpcPadContainer *m_padContainer, const CalibEvent *event) const
Definition: RpcCalibRawDataProvider.cxx:75
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
LArHVGainsPredictor.error_code
error_code
Definition: LArHVGainsPredictor.py:229
RpcCalibRawDataProvider::m_detectorManagerKey
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_detectorManagerKey
Definition: RpcCalibRawDataProvider.h:61
merge.status
status
Definition: merge.py:17
RpcCalibRawDataProvider::m_dataProvider
ServiceHandle< IMuonCalibStreamDataProviderSvc > m_dataProvider
Definition: RpcCalibRawDataProvider.h:58
RpcCalibRawDataProvider::RpcCalibRawDataProvider
RpcCalibRawDataProvider(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Definition: RpcCalibRawDataProvider.cxx:33
StoreGateSvc.h
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
RDOindex
Definition: RDOindex.h:85
RpcPadContainer
Use IdentifiableContainer with RpcPad.
Definition: RpcPadContainer.h:23
RpcReadoutElement.h
Identifier
Definition: IdentifierFieldParser.cxx:14