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