ATLAS Offline Software
Loading...
Searching...
No Matches
RodHeaderByteStreamTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5
6#include <algorithm>
7#include <set>
8
9#include "GaudiKernel/IInterface.h"
10#include "GaudiKernel/MsgStream.h"
11#include "GaudiKernel/StatusCode.h"
12
14
16#include "L1CaloSrcIdMap.h"
17#include "L1CaloSubBlock.h"
18
20
21
22namespace {
23bool hasEnding(std::string const &fullString, std::string const &ending) {
24 if (fullString.length() >= ending.length()) {
25 return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
26 } else {
27 return false;
28 }
29}
30}
31
32
33namespace LVL1BS {
34
35// Interface ID
36
37static const InterfaceID IID_IRodHeaderByteStreamTool("RodHeaderByteStreamTool", 1, 1);
38
43
44// Constructor
45
47 const std::string& name,
48 const IInterface* parent)
49 : AthAlgTool(type, name, parent),
50 m_robDataProvider("ROBDataProviderSvc", name),
51 m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool")
52{
53 declareInterface<RodHeaderByteStreamTool>(this);
54
55 declareProperty("UseSWROD",m_useSWROD = false, "Use SWROD readout instead of legacy (which was removed in 2024)");
56
57 declareProperty("ErrorTool", m_errorTool,
58 "Tool to collect errors for monitoring");
59 declareProperty("ROBSourceIDs", m_sourceIDsProp,
60 "ROB fragment source identifiers - All except RoIB");
61 declareProperty("ROBSourceIDsPP", m_sourceIDsPPProp,
62 "ROB fragment source identifiers - PP only");
63 declareProperty("ROBSourceIDsCP", m_sourceIDsCPProp,
64 "ROB fragment source identifiers - CP DAQ only");
65 declareProperty("ROBSourceIDsJEP", m_sourceIDsJEPProp,
66 "ROB fragment source identifiers - JEP DAQ only");
67 declareProperty("ROBSourceIDsCPRoI", m_sourceIDsCPRoIProp,
68 "ROB fragment source identifiers - CP RoI only");
69 declareProperty("ROBSourceIDsJEPRoI", m_sourceIDsJEPRoIProp,
70 "ROB fragment source identifiers - JEP RoI only");
71 declareProperty("ROBSourceIDsCPRoIB", m_sourceIDsCPRoIBProp,
72 "ROB fragment source identifiers - CP RoIB only");
73 declareProperty("ROBSourceIDsJEPRoIB", m_sourceIDsJEPRoIBProp,
74 "ROB fragment source identifiers - JEP RoIB only");
75}
76
77// Destructor
78
82
83// Initialize
84
85
87{
88 ATH_MSG_INFO( "Initializing " << name() );
89
90 m_srcIdMap.useSWROD(m_useSWROD);
91
92 ATH_CHECK( m_errorTool.retrieve() );
93
94 return StatusCode::SUCCESS;
95}
96
97// Finalize
98
100{
101 return StatusCode::SUCCESS;
102}
103
104// Conversion bytestream to RODHeaders
105
106// Conversion bytestream to CMX-CP TOBs
108 const EventContext& ctx,
109 const std::string& sgKey,
110 DataVector<LVL1::RODHeader>* const rhCollection) const
111{
112 const std::vector<uint32_t>& vID(sourceIDs(sgKey));
113 // // get ROB fragments
115 m_robDataProvider->getROBData(ctx, vID, robFrags, "RodHeaderByteStreamTool");
116 ATH_MSG_DEBUG("Number of ROB fragments:" << robFrags.size());
117 return convert(robFrags, rhCollection);
118}
119
121 const IROBDataProviderSvc::VROBFRAG& robFrags,
122 DataVector<LVL1::RODHeader>* const rhCollection) const
123{
124 const bool debug = msgLvl(MSG::DEBUG);
125 if (debug) msg(MSG::DEBUG);
126
127 // Loop over ROB fragments
128
129 int robCount = 0;
130 std::set<uint32_t> dupCheck;
131 ROBIterator rob = robFrags.begin();
132 ROBIterator robEnd = robFrags.end();
133 for (; rob != robEnd; ++rob) {
134
135 if (debug) {
136 ++robCount;
137 msg() << "Treating ROB fragment " << robCount << endmsg;
138 }
139
140 // Skip fragments with ROB status errors
141
142 uint32_t robid = (*rob)->source_id();
143 if ((*rob)->nstatus() > 0) {
144 ROBPointer robData;
145 (*rob)->status(robData);
146 if (*robData != 0) {
147 m_errorTool->robError(robid, *robData);
148 if (debug) msg() << "ROB status error - skipping fragment" << endmsg;
149 continue;
150 }
151 }
152
153 // Skip duplicate fragments
154
155 if (!dupCheck.insert(robid).second) {
157 if (debug) msg() << "Skipping duplicate ROB fragment" << endmsg;
158 continue;
159 }
160
161 // Unpack ROD header info
162
163 const uint32_t version = (*rob)->rod_version();
164 const uint32_t sourceId = (*rob)->rod_source_id();
165 const uint32_t run = (*rob)->rod_run_no();
166 const uint32_t lvl1Id = (*rob)->rod_lvl1_id();
167 const uint32_t bcId = (*rob)->rod_bc_id();
168 const uint32_t trigType = (*rob)->rod_lvl1_trigger_type();
169 const uint32_t detType = (*rob)->rod_detev_type();
170 const uint32_t nData = (*rob)->rod_ndata();
171
172 // Unpack status words
173
174 std::vector<uint32_t> statusWords;
175 unsigned int nstatus = (*rob)->rod_nstatus();
176 if (nstatus <= 2) {
177 RODPointer status;
178 RODPointer statusEnd;
179 (*rob)->rod_status(status);
180 statusEnd = status + nstatus;
181 for (; status != statusEnd; ++status) statusWords.push_back(*status);
182 } else { // Likely corruption
184 continue;
185 }
186
187 // Save
188
189 rhCollection->push_back(new LVL1::RODHeader(version, sourceId, run, lvl1Id,
190 bcId, trigType, detType, statusWords, nData));
191 if (debug) {
192 msg() << MSG::hex
193 << "ROD Header version/sourceId/run/lvl1Id/bcId/trigType/detType/nData: "
194 << version << "/" << sourceId << "/" << run << "/" << lvl1Id << "/"
195 << bcId << "/" << trigType << "/" << detType << "/" << nData
196 << endmsg << "ROD Status Words:";
197 std::vector<uint32_t>::const_iterator pos = statusWords.begin();
198 std::vector<uint32_t>::const_iterator pose = statusWords.end();
199 for (; pos != pose; ++pos) msg() << " " << *pos;
200 msg() << MSG::dec << endmsg;
201 }
202 }
203
204 return StatusCode::SUCCESS;
205}
206
207// Return reference to vector with all possible Source Identifiers
208
209const std::vector<uint32_t>& RodHeaderByteStreamTool::sourceIDs(
210 const std::string& sgKey) const
211{
212 if (isAppended(sgKey, "PP")) {
213 static const std::vector<int> slinksPP { 0, 1, 2, 3 };
214 static const std::vector<uint32_t> sourceIDsPP =
215 makeRobIds(8, 0, slinksPP, 0, eformat::TDAQ_CALO_PREPROC,
217 return sourceIDsPP;
218 }
219
220 if (isAppended(sgKey, "CP")) {
221 static const std::vector<int> slinksCP { 0, 2 };
222 static const std::vector<uint32_t> sourceIDsCP =
223 makeRobIds(4, 8, slinksCP, 0, eformat::TDAQ_CALO_CLUSTER_PROC_DAQ,
225 return sourceIDsCP;
226 }
227
228 if (isAppended(sgKey, "CPRoI")) {
229 static const std::vector<int> slinksCPRoI { 0 };
230 static const std::vector<uint32_t> sourceIDsCPRoI =
231 makeRobIds(4, 8, slinksCPRoI, 1, eformat::TDAQ_CALO_CLUSTER_PROC_ROI,
233 return sourceIDsCPRoI;
234 }
235
236 if (isAppended(sgKey, "JEP")) {
237 static const std::vector<int> slinksJEP { 0, 1, 2, 3 };
238 static const std::vector<uint32_t> sourceIDsJEP =
239 makeRobIds(2, 12, slinksJEP, 0, eformat::TDAQ_CALO_JET_PROC_DAQ,
241 return sourceIDsJEP;
242 }
243
244 if (isAppended(sgKey, "JEPRoI")) {
245 static const std::vector<int> slinksJEPRoI { 0 };
246 static const std::vector<uint32_t> sourceIDsJEPRoI =
247 makeRobIds(2, 12, slinksJEPRoI, 1, eformat::TDAQ_CALO_JET_PROC_ROI,
249 return sourceIDsJEPRoI;
250 }
251
252 if (isAppended(sgKey, "CPRoIB")) {
253 static const std::vector<int> slinksCPRoIB { 2 };
254 static const std::vector<uint32_t> sourceIDsCPRoIB =
255 makeRobIds(4, 8, slinksCPRoIB, 1, eformat::TDAQ_CALO_CLUSTER_PROC_ROI,
257 return sourceIDsCPRoIB;
258 }
259
260 if (isAppended(sgKey, "JEPRoIB")) {
261 static const std::vector<int> slinksJEPRoIB { 2 };
262 static const std::vector<uint32_t> sourceIDsJEPRoIB =
263 makeRobIds(2, 12, slinksJEPRoIB, 1, eformat::TDAQ_CALO_JET_PROC_ROI,
265 return sourceIDsJEPRoIB;
266 }
267
268 // all
269 static const std::vector<uint32_t> sourceIDs = makeAllRobIds();
270 return sourceIDs;
271}
272
273// Fill vector with ROB IDs for given sub-detector
274
275std::vector<uint32_t> RodHeaderByteStreamTool::makeAllRobIds() const
276{
277 std::vector<uint32_t> robIds;
278
279 auto append = [&robIds] (const std::vector<uint32_t>& v)
280 { robIds.insert (robIds.end(), v.begin(), v.end()); };
281
282 append (sourceIDs ("PP"));
283 append (sourceIDs ("CP"));
284 append (sourceIDs ("CPRoI"));
285 append (sourceIDs ("JEP"));
286 append (sourceIDs ("JEPRoI"));
287
288 // Don't include RoIBs (LVL2) in complete set
289 return robIds;
290}
291
292
293std::vector<uint32_t> RodHeaderByteStreamTool::makeRobIds(const int numCrates,
294 const int crateOffset,
295 const std::vector<int>& slinks,
296 const int daqOrRoi,
297 const eformat::SubDetector subdet,
298 const std::vector<uint32_t>& prop) const
299{
300 std::vector<uint32_t> robs;
301
302 if (!prop.empty()) {
303 robs = prop;
304 }
305 else {
306 for (int crate = 0; crate < numCrates; ++crate) {
307 const int numSlinks = slinks.size();
308 for (int i = 0; i < numSlinks; ++i) {
309 const uint32_t rodId = m_srcIdMap.getRodID(crate + crateOffset,
310 slinks[i], daqOrRoi, subdet);
311 const uint32_t robId = m_srcIdMap.getRobID(rodId);
312 robs.push_back (robId);
313 }
314 }
315 }
316 return robs;
317}
318
319// Return true if StoreGate key ends in given string
320
321bool RodHeaderByteStreamTool::isAppended(const std::string& sgKey,
322 const std::string& flag) const
323{
324
325 return ::hasEnding(sgKey, flag) || ::hasEnding(sgKey, flag + "Aux.");
326}
327
328} // end namespace
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
const bool debug
uint16_t bcId(uint32_t data)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
Derived DataVector<T>.
Definition DataVector.h:795
value_type push_back(value_type pElem)
Add an element to the end of the collection.
std::vector< const ROBF * > VROBFRAG
virtual StatusCode initialize() override
ToolHandle< LVL1BS::L1CaloErrorByteStreamTool > m_errorTool
Error collection tool.
std::vector< uint32_t > m_sourceIDsJEPProp
std::vector< uint32_t > m_sourceIDsCPRoIBProp
std::vector< uint32_t > m_sourceIDsPPProp
StatusCode convert(const EventContext &ctx, const std::string &name, DataVector< LVL1::RODHeader > *rhCollection) const
Convert ROB fragments to RODHeaders.
std::vector< uint32_t > makeAllRobIds() const
Fill vector with ROB IDs for given sub-detector.
RodHeaderByteStreamTool(const std::string &type, const std::string &name, const IInterface *parent)
std::vector< uint32_t > m_sourceIDsCPRoIProp
std::vector< uint32_t > m_sourceIDsJEPRoIProp
const L1CaloSrcIdMap m_srcIdMap
Source ID converter.
IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator
OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer
std::vector< uint32_t > m_sourceIDsProp
ROB source IDs.
virtual StatusCode finalize() override
OFFLINE_FRAGMENTS_NAMESPACE::PointerType ROBPointer
std::vector< uint32_t > makeRobIds(int numCrates, int crateOffset, const std::vector< int > &slinks, int daqOrRoi, eformat::SubDetector subdet, const std::vector< uint32_t > &prop) const
static const InterfaceID & interfaceID()
AlgTool InterfaceID.
bool isAppended(const std::string &sgKey, const std::string &flag) const
Return true if StoreGate key ends in given string.
std::vector< uint32_t > m_sourceIDsCPProp
ServiceHandle< IROBDataProviderSvc > m_robDataProvider
Service for reading bytestream.
std::vector< uint32_t > m_sourceIDsJEPRoIBProp
const std::vector< uint32_t > & sourceIDs(const std::string &sgKey) const
Return reference to vector with all possible Source Identifiers.
static const InterfaceID IID_IRodHeaderByteStreamTool("RodHeaderByteStreamTool", 1, 1)
int run(int argc, char *argv[])