ATLAS Offline Software
Loading...
Searching...
No Matches
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
24#include "GaudiKernel/ServiceHandle.h"
26
29
30using namespace LVL2_MUON_CALIBRATION;
31
32
33RpcCalibRawDataProvider::RpcCalibRawDataProvider(const std::string& name, ISvcLocator* pSvcLocator) :
34 AthReentrantAlgorithm(name, pSvcLocator) {}
35
37
38 ATH_MSG_INFO("RpcCalibRawDataProvider::initialize");
39
40 // retrieve common tools
41 ATH_CHECK(m_detectorManagerKey.initialize());
42 ATH_CHECK(m_muonIdHelper.retrieve());
43 ATH_CHECK(m_rpcReadKey.initialize());
44
45 // retrieve the dataProviderSvc
46 ATH_CHECK(m_dataProvider.retrieve());
47
48 // setup output RPC container keys
49 ATH_CHECK(m_rdoContainerKey.initialize());
50
51 return StatusCode::SUCCESS;
52}
53
54// --------------------------------------------------------------------
55// Execute
56StatusCode 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
75StatusCode 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 }
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
Property holding a SG store/key/clid from which a ReadHandle is made.
Property holding a SG store/key/clid from which a WriteHandle is made.
An algorithm that can be simultaneously executed in multiple threads.
StatusCode addOrDelete(std::unique_ptr< T > ptr)
IDC_WriteHandle getWriteHandle(IdentifierHash hash)
This is a "hash" representation of an Identifier.
std::map< int, RDOindex, std::less< int > > RDOmap
ServiceHandle< Muon::IMuonIdHelperSvc > m_muonIdHelper
SG::WriteHandleKey< RpcPadContainer > m_rdoContainerKey
ServiceHandle< IMuonCalibStreamDataProviderSvc > m_dataProvider
RpcCalibRawDataProvider(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
virtual StatusCode execute(const EventContext &ctx) const override
Execute.
StatusCode decodeImpl(const EventContext &ctx, RpcPadContainer *m_padContainer, const LVL2_MUON_CALIBRATION::CalibEvent *event) const
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_detectorManagerKey
MuonDetectorManager from the conditions store.
virtual StatusCode initialize() override
Initialize.
SG::ReadCondHandleKey< RpcCablingCondData > m_rpcReadKey
Use IdentifiableContainer with RpcPad.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
Definition index.py:1