ATLAS Offline Software
Loading...
Searching...
No Matches
LVL1BS::JepRoiByteStreamV2Tool Class Reference

Tool to perform ROB fragments to JEM RoI and CMX RoI, and JEP RoI container to raw data conversions. More...

#include <JepRoiByteStreamV2Tool.h>

Inheritance diagram for LVL1BS::JepRoiByteStreamV2Tool:
Collaboration diagram for LVL1BS::JepRoiByteStreamV2Tool:

Public Member Functions

 JepRoiByteStreamV2Tool (const std::string &type, const std::string &name, const IInterface *parent)
virtual ~JepRoiByteStreamV2Tool ()
virtual StatusCode initialize () override
virtual StatusCode finalize () override
StatusCode convert (const std::string &name, DataVector< LVL1::JEMTobRoI > *jeCollection) const
 Convert ROB fragments to JEM RoIs.
StatusCode convert (const IROBDataProviderSvc::VROBFRAG &robFrags, DataVector< LVL1::JEMTobRoI > *jeCollection) const
StatusCode convert (const std::string &name, LVL1::CMXRoI *cmCollection) const
 Convert ROB fragments to CMX RoIs.
StatusCode convert (const IROBDataProviderSvc::VROBFRAG &robFrags, LVL1::CMXRoI *cmCollection) const
StatusCode convert (const LVL1::JEPRoIBSCollectionV2 *jep) const
 Convert JEP RoI Container to bytestream.
const std::vector< uint32_t > & sourceIDs (const std::string &sgKey) const
 Return reference to vector with all possible Source Identifiers.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Static Public Member Functions

static const InterfaceID & interfaceID ()
 AlgTool InterfaceID.

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef DataVector< LVL1::JEMTobRoIJemRoiCollection
typedef DataVector< LVL1::CMXEtSumsCmxSumsCollection
typedef std::map< uint32_t, const LVL1::JEMTobRoI * > JemRoiMap
typedef std::map< int, const LVL1::CMXEtSums * > CmxSumsMap
typedef IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator
typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType ROBPointer
typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer
typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

StatusCode convertBs (const IROBDataProviderSvc::VROBFRAG &robFrags, DataVector< LVL1::JEMTobRoI > *jeCollection, LVL1::CMXRoI *cmCollection) const
 Convert bytestream to given container type.
const LVL1::CMXEtSumsfindCmxSums (int crate, int source, const CmxSumsMap &cmxEtMap) const
 Find CMX energy sums for given crate, source.
std::vector< uint32_t > makeSourceIDs (bool roiDaq) const
void setupJemRoiMap (const JemRoiCollection *jeCollection, JemRoiMap &roiMap) const
 Set up JEM RoIs map.
void setupCmxEtMap (const CmxSumsCollection *enCollection, CmxSumsMap &cmxEtMap) const
 Set up CMX energy sums map.
void energySubBlockTypes (int source, CmxEnergySubBlock::SourceType &srcType, CmxEnergySubBlock::SumType &sumType, CmxEnergySubBlock::HitsType &hitType) const
 Get energy subBlock types from CMXEtSums source type.
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ServiceHandle< IByteStreamCnvSvcm_byteStreamCnvSvc { this, "ByteStreamCnvSvc", "ByteStreamCnvSvc" }
ServiceHandle< IROBDataProviderSvcm_robDataProvider
ToolHandle< LVL1BS::L1CaloErrorByteStreamToolm_errorTool
 Property: Error collection tool.
int m_crateOffsetHw
 Property: Hardware crate number offset.
int m_crateOffsetSw
 Property: Software crate number offset.
int m_version
 Property: Sub_block header version.
int m_dataFormat
 Property: Data compression format.
const int m_crates
 Number of crates.
const int m_modules
 Number of JEM modules per crate.
const int m_frames
 Number of RoI frames.
const int m_maxRoiWords
 Number of CMX energy RoI words.
int m_slinks
 Property: Number of slinks per crate when writing out bytestream.
int m_crateMin
 Property: Minimum crate number when writing out bytestream.
int m_crateMax
 Property: Maximum crate number when writing out bytestream.
std::vector< uint32_t > m_sourceIDsProp
 Property: ROB source IDs.
std::vector< uint32_t > m_sourceIDsRoIBProp
 Property: ROB source IDs for RoIB.
const eformat::SubDetector m_subDetector
 Sub-detector type.
const L1CaloSrcIdMap m_srcIdMap
 Source ID converter.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Tool to perform ROB fragments to JEM RoI and CMX RoI, and JEP RoI container to raw data conversions.

Based on ROD document version X_xxx. <<== CHECK

Author
Peter Faulkner

Definition at line 50 of file JepRoiByteStreamV2Tool.h.

Member Typedef Documentation

◆ CmxSumsCollection

◆ CmxSumsMap

typedef std::map<int, const LVL1::CMXEtSums*> LVL1BS::JepRoiByteStreamV2Tool::CmxSumsMap
private

Definition at line 88 of file JepRoiByteStreamV2Tool.h.

◆ JemRoiCollection

◆ JemRoiMap

typedef std::map<uint32_t, const LVL1::JEMTobRoI*> LVL1BS::JepRoiByteStreamV2Tool::JemRoiMap
private

Definition at line 87 of file JepRoiByteStreamV2Tool.h.

◆ ROBIterator

typedef IROBDataProviderSvc::VROBFRAG::const_iterator LVL1BS::JepRoiByteStreamV2Tool::ROBIterator
private

Definition at line 89 of file JepRoiByteStreamV2Tool.h.

◆ ROBPointer

◆ RODPointer

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ JepRoiByteStreamV2Tool()

LVL1BS::JepRoiByteStreamV2Tool::JepRoiByteStreamV2Tool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 44 of file JepRoiByteStreamV2Tool.cxx.

47 : AthAlgTool(type, name, parent),
48 m_robDataProvider("ROBDataProviderSvc", name),
49 m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
51 m_subDetector (eformat::TDAQ_CALO_JET_PROC_ROI)
52{
53 declareInterface<JepRoiByteStreamV2Tool>(this);
54
55 declareProperty("ErrorTool", m_errorTool,
56 "Tool to collect errors for monitoring");
57 declareProperty("CrateOffsetHw", m_crateOffsetHw = 12,
58 "Offset of JEP crate numbers in bytestream");
59 declareProperty("CrateOffsetSw", m_crateOffsetSw = 0,
60 "Offset of JEP crate numbers in RDOs");
61
62 // Properties for reading bytestream only
63 declareProperty("ROBSourceIDs", m_sourceIDsProp,
64 "ROB fragment source identifiers");
65 declareProperty("ROBSourceIDsRoIB", m_sourceIDsRoIBProp,
66 "ROB fragment source identifiers");
67
68 // Properties for writing bytestream only
69 declareProperty("DataVersion", m_version = 2, //<<== CHECK
70 "Format version number in sub-block header");
71 declareProperty("DataFormat", m_dataFormat = 1,
72 "Format identifier (0-1) in sub-block header");
73 declareProperty("SlinksPerCrate", m_slinks = 1,
74 "The number of S-Links per crate");
75 declareProperty("CrateMin", m_crateMin = 0,
76 "Minimum crate number, allows partial output");
77 declareProperty("CrateMax", m_crateMax = m_crates - 1,
78 "Maximum crate number, allows partial output");
79
80}
AthAlgTool()
Default constructor:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
int m_crateOffsetHw
Property: Hardware crate number offset.
const int m_crates
Number of crates.
int m_crateMax
Property: Maximum crate number when writing out bytestream.
int m_version
Property: Sub_block header version.
const int m_modules
Number of JEM modules per crate.
const int m_maxRoiWords
Number of CMX energy RoI words.
const eformat::SubDetector m_subDetector
Sub-detector type.
int m_dataFormat
Property: Data compression format.
const int m_frames
Number of RoI frames.
int m_crateMin
Property: Minimum crate number when writing out bytestream.
int m_slinks
Property: Number of slinks per crate when writing out bytestream.
std::vector< uint32_t > m_sourceIDsRoIBProp
Property: ROB source IDs for RoIB.
int m_crateOffsetSw
Property: Software crate number offset.
ServiceHandle< IROBDataProviderSvc > m_robDataProvider
ToolHandle< LVL1BS::L1CaloErrorByteStreamTool > m_errorTool
Property: Error collection tool.
std::vector< uint32_t > m_sourceIDsProp
Property: ROB source IDs.

◆ ~JepRoiByteStreamV2Tool()

LVL1BS::JepRoiByteStreamV2Tool::~JepRoiByteStreamV2Tool ( )
virtual

Definition at line 84 of file JepRoiByteStreamV2Tool.cxx.

85{
86}

Member Function Documentation

◆ convert() [1/5]

StatusCode LVL1BS::JepRoiByteStreamV2Tool::convert ( const IROBDataProviderSvc::VROBFRAG & robFrags,
DataVector< LVL1::JEMTobRoI > * jeCollection ) const

Definition at line 122 of file JepRoiByteStreamV2Tool.cxx.

125{
126 return convertBs(robFrags, jeCollection, nullptr);
127}
StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG &robFrags, DataVector< LVL1::JEMTobRoI > *jeCollection, LVL1::CMXRoI *cmCollection) const
Convert bytestream to given container type.

◆ convert() [2/5]

StatusCode LVL1BS::JepRoiByteStreamV2Tool::convert ( const IROBDataProviderSvc::VROBFRAG & robFrags,
LVL1::CMXRoI * cmCollection ) const

Definition at line 143 of file JepRoiByteStreamV2Tool.cxx.

146{
147 return convertBs(robFrags, nullptr, cmCollection);
148}

◆ convert() [3/5]

StatusCode LVL1BS::JepRoiByteStreamV2Tool::convert ( const LVL1::JEPRoIBSCollectionV2 * jep) const

Convert JEP RoI Container to bytestream.

Definition at line 152 of file JepRoiByteStreamV2Tool.cxx.

154{
155 const bool debug = msgLvl(MSG::DEBUG);
156 if (debug) msg(MSG::DEBUG);
157
158 // Get the event assembler
159 FullEventAssembler<L1CaloSrcIdMap>* fea = nullptr;
160 ATH_CHECK( m_byteStreamCnvSvc->getFullEventAssembler (fea,
161 "JepRoiByteStreamV2") );
162 const uint16_t minorVersion = m_srcIdMap.minorVersion();
163 fea->setRodMinorVersion(minorVersion);
164
165 // Pointer to ROD data vector
166
168
169 // Sub-block for neutral format
170 JemRoiSubBlockV2 subBlock;
171
172 // Set up the container maps
173
174 const bool neutralFormat = m_dataFormat == L1CaloSubBlock::NEUTRAL;
175
176 // JEM RoI map
177 JemRoiMap roiMap;
178 setupJemRoiMap(jep->JemRoi(), roiMap);
179 JemRoiMap::const_iterator mapIter = roiMap.begin();
180 JemRoiMap::const_iterator mapIterEnd = roiMap.end();
181
182 // CMX energy sums map
183 CmxSumsMap cmxEtMap;
184 if (neutralFormat) {
185 setupCmxEtMap(jep->CmxSums(), cmxEtMap);
186 }
187
188 // Loop over JEM RoI data
189
190 const int modulesPerSlink = m_modules / m_slinks;
191 for (int crate = m_crateMin; crate <= m_crateMax; ++crate) {
192 const int hwCrate = crate + m_crateOffsetHw;
193
194 for (int module = 0; module < m_modules; ++module) {
195
196 // Pack required number of modules per slink
197
198 if (module % modulesPerSlink == 0) {
199 const int daqOrRoi = 1;
200 const int slink = module / modulesPerSlink;
201 if (debug) {
202 msg() << "Treating crate " << hwCrate
203 << " slink " << slink << endmsg
204 << "Data Version/Format: " << m_version
205 << " " << m_dataFormat << endmsg;
206 }
207 const uint32_t rodIdJem = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
209 theROD = fea->getRodData(rodIdJem);
210 if (neutralFormat) {
211 const L1CaloUserHeader userHeader;
212 theROD->push_back(userHeader.header());
213 }
214 }
215 if (debug) msg() << "JEM Module " << module << endmsg;
216 if (!theROD) break; // for coverity, shouldn't happen
217
218 // Create a sub-block (Neutral format only)
219
220 if (neutralFormat) {
221 subBlock.clear();
222 subBlock.setRoiHeader(m_version, hwCrate, module);
223 }
224
225 // Find JEM RoIs for this module
226
227 for (; mapIter != mapIterEnd; ++mapIter) {
228 const LVL1::JEMTobRoI* const roi = mapIter->second;
229 if (roi->crate() < crate) continue;
230 if (roi->crate() > crate) break;
231 if (roi->jem() < module) continue;
232 if (roi->jem() > module) break;
233 if (roi->energyLarge() || roi->energySmall()) {
234 if (neutralFormat) subBlock.fillRoi(*roi);
235 else theROD->push_back(roi->roiWord());
236 }
237 }
238
239 // Pack and write the sub-block
240
241 if (neutralFormat) {
242 if ( !subBlock.pack()) {
243 msg(MSG::ERROR) << "JEM RoI sub-block packing failed" << endmsg;
244 return StatusCode::FAILURE;
245 }
246 if (debug) {
247 msg() << "JEM RoI sub-block data words: "
248 << subBlock.dataWords() << endmsg;
249 }
250 subBlock.write(theROD);
251 }
252 }
253 if (!theROD) break; // for coverity, shouldn't happen
254
255 // Append CMX RoIs to last S-Link of the system crate
256
257 if (crate != m_crates - 1) continue;
258
259 // Create sub-blocks for Neutral format
260
261 if (neutralFormat) {
262 const int timeslices = 1;
263 const int slice = 0;
264
265 // CMX-Energy
266
267 CmxEnergySubBlock subBlock;
268 const int cmxEnergyVersion = 3; //<<== CHECK
269 subBlock.setCmxHeader(cmxEnergyVersion, m_dataFormat, slice, hwCrate,
271 CmxSubBlock::LEFT, timeslices);
272 int maxSource = static_cast<int>(LVL1::CMXEtSums::MAX_SOURCE);
273 for (int source = 0; source < maxSource; ++source) {
274 const LVL1::CMXEtSums* const sums = findCmxSums(crate, source, cmxEtMap);
275 if ( sums ) {
276 const unsigned int ex = sums->Ex();
277 const unsigned int ey = sums->Ey();
278 const unsigned int et = sums->Et();
279 const int exErr = sums->ExError();
280 const int eyErr = sums->EyError();
281 const int etErr = sums->EtError();
282 if (source < m_modules) {
283 subBlock.setSubsums(slice, source, ex, ey, et, exErr, eyErr, etErr);
284 } else {
288 energySubBlockTypes(source, srcType, sumType, hitType);
289 if (srcType != CmxEnergySubBlock::MAX_SOURCE_TYPE) {
290 subBlock.setSubsums(slice, srcType, sumType, ex, ey, et,
291 exErr, eyErr, etErr);
292 } else if (hitType != CmxEnergySubBlock::MAX_HITS_TYPE) {
293 subBlock.setEtHits(slice, hitType, sumType, et);
294 }
295 }
296 }
297 }
298 if ( !subBlock.pack()) {
299 msg(MSG::ERROR) << "CMX-Energy sub-block packing failed" << endmsg;
300 return StatusCode::FAILURE;
301 }
302 if (debug) {
303 msg() << "CMX-Energy sub-block data words: "
304 << subBlock.dataWords() << endmsg;
305 }
306 subBlock.write(theROD);
307
308 } else {
309
310 // Standard format
311
312 const LVL1::CMXRoI* const roi = jep->CmxRoi();
313 if ( roi ) {
314 // CMX-Energy RoIs are not zero-supressed unless all are zero
315 for (int word = 0; word < m_maxRoiWords; ++word) {
316 theROD->push_back(roi->roiWord(word));
317 }
318 }
319 }
320 }
321
322 return StatusCode::SUCCESS;
323}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
float et(const xAOD::jFexSRJetRoI *j)
const bool debug
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
void setRodMinorVersion(uint16_t m)
change the ROD minor version
std::vector< uint32_t > RODDATA
ROD data as a vector of unsigned int.
RODDATA * getRodData(uint32_t id)
get a block of ROD data
void setupJemRoiMap(const JemRoiCollection *jeCollection, JemRoiMap &roiMap) const
Set up JEM RoIs map.
ServiceHandle< IByteStreamCnvSvc > m_byteStreamCnvSvc
void energySubBlockTypes(int source, CmxEnergySubBlock::SourceType &srcType, CmxEnergySubBlock::SumType &sumType, CmxEnergySubBlock::HitsType &hitType) const
Get energy subBlock types from CMXEtSums source type.
void setupCmxEtMap(const CmxSumsCollection *enCollection, CmxSumsMap &cmxEtMap) const
Set up CMX energy sums map.
const LVL1::CMXEtSums * findCmxSums(int crate, int source, const CmxSumsMap &cmxEtMap) const
Find CMX energy sums for given crate, source.
std::map< int, const LVL1::CMXEtSums * > CmxSumsMap
const L1CaloSrcIdMap m_srcIdMap
Source ID converter.
std::map< uint32_t, const LVL1::JEMTobRoI * > JemRoiMap
unsigned int Ey() const
returns module Ey sum for peak sample
unsigned int Ex() const
returns module Ex sum for peak sample
unsigned int Et() const
For triggered time slice.
int ExError() const
returns module Ex sum error for peak sample
int EyError() const
returns module Ey sum error for peak sample
int EtError() const
returns module ET sum error for peak sample
uint32_t roiWord(int word) const
Return packed Energy RoI word (0-5)
uint32_t roiWord() const
Return packed RoI word.
int energyLarge() const
Return energy large window size.
int energySmall() const
Return energy small window size.
const CMXRoI * CmxRoi() const
Return pointer to CMX RoIs.
const DataVector< CMXEtSums > * CmxSums() const
Return pointer to CMX energy sums collection.
const DataVector< JEMTobRoI > * JemRoi() const
Return pointer to JEM RoI collection.
setWord1 uint16_t
setEventNumber uint32_t

◆ convert() [4/5]

StatusCode LVL1BS::JepRoiByteStreamV2Tool::convert ( const std::string & name,
DataVector< LVL1::JEMTobRoI > * jeCollection ) const

Convert ROB fragments to JEM RoIs.

Definition at line 110 of file JepRoiByteStreamV2Tool.cxx.

113{
114 const std::vector<uint32_t>& vID(sourceIDs(sgKey));
115 // // get ROB fragments
117 m_robDataProvider->getROBData(Gaudi::Hive::currentContext(), vID, robFrags, "JepRoiByteStreamV2Tool");
118 ATH_MSG_DEBUG("Number of ROB fragments:" << robFrags.size());
119 return convert(robFrags, collection);
120}
#define ATH_MSG_DEBUG(x)
std::vector< const ROBF * > VROBFRAG
StatusCode convert(const std::string &name, DataVector< LVL1::JEMTobRoI > *jeCollection) const
Convert ROB fragments to JEM RoIs.
const std::vector< uint32_t > & sourceIDs(const std::string &sgKey) const
Return reference to vector with all possible Source Identifiers.

◆ convert() [5/5]

StatusCode LVL1BS::JepRoiByteStreamV2Tool::convert ( const std::string & name,
LVL1::CMXRoI * cmCollection ) const

Convert ROB fragments to CMX RoIs.

Definition at line 131 of file JepRoiByteStreamV2Tool.cxx.

134{
135 const std::vector<uint32_t>& vID(sourceIDs(sgKey));
136 // // get ROB fragments
138 m_robDataProvider->getROBData(Gaudi::Hive::currentContext(), vID, robFrags, "JepRoiByteStreamV2Tool");
139 ATH_MSG_DEBUG("Number of ROB fragments:" << robFrags.size());
140 return convert(robFrags, cmCollection);
141}

◆ convertBs()

StatusCode LVL1BS::JepRoiByteStreamV2Tool::convertBs ( const IROBDataProviderSvc::VROBFRAG & robFrags,
DataVector< LVL1::JEMTobRoI > * jeCollection,
LVL1::CMXRoI * cmCollection ) const
private

Convert bytestream to given container type.

Definition at line 381 of file JepRoiByteStreamV2Tool.cxx.

385{
386 const bool debug = msgLvl(MSG::DEBUG);
387 if (debug) msg(MSG::DEBUG);
388
389 // Loop over ROB fragments
390
391 int robCount = 0;
392 std::set<uint32_t> dupCheck;
393 std::set<uint32_t> dupRoiCheck;
394 ROBIterator rob = robFrags.begin();
395 ROBIterator robEnd = robFrags.end();
396 for (; rob != robEnd; ++rob) {
397
398 if (debug) {
399 ++robCount;
400 msg() << "Treating ROB fragment " << robCount << endmsg;
401 }
402
403 // Skip fragments with ROB status errors
404
405 uint32_t robid = (*rob)->source_id();
406 if ((*rob)->nstatus() > 0) {
407 ROBPointer robData;
408 (*rob)->status(robData);
409 if (*robData != 0) {
410 m_errorTool->robError(robid, *robData);
411 if (debug) msg() << "ROB status error - skipping fragment" << endmsg;
412 continue;
413 }
414 }
415
416 // Skip duplicate fragments
417
418 if (!dupCheck.insert(robid).second) {
420 if (debug) msg() << "Skipping duplicate ROB fragment" << endmsg;
421 continue;
422 }
423
424 // Unpack ROD data (slinks)
425
426 RODPointer payloadBeg;
428 RODPointer payloadEnd;
429 (*rob)->rod_data(payloadBeg);
430 payloadEnd = payloadBeg + (*rob)->rod_ndata();
431 payload = payloadBeg;
432 if (payload == payloadEnd) {
433 if (debug) msg() << "ROB fragment empty" << endmsg;
434 continue;
435 }
436
437 // Check identifier
438 const uint32_t sourceID = (*rob)->rod_source_id();
439 if (m_srcIdMap.getRobID(sourceID) != robid ||
440 m_srcIdMap.subDet(sourceID) != m_subDetector ||
441 m_srcIdMap.daqOrRoi(sourceID) != 1 ||
442 (m_srcIdMap.slink(sourceID) != 0 && m_srcIdMap.slink(sourceID) != 2) ||
443 m_srcIdMap.crate(sourceID) < m_crateOffsetHw ||
444 m_srcIdMap.crate(sourceID) >= m_crateOffsetHw + m_crates) {
446 if (debug) {
447 msg() << "Wrong source identifier in data: "
448 << MSG::hex << sourceID << MSG::dec << endmsg;
449 }
450 continue;
451 }
452
453 // Check minor version
454 const int minorVersion = (*rob)->rod_version() & 0xffff;
455 if (minorVersion <= m_srcIdMap.minorVersionPreLS1()) {
456 if (debug) msg() << "Skipping pre-LS1 data" << endmsg;
457 continue;
458 }
459 const int rodCrate = m_srcIdMap.crate(sourceID);
460 if (debug) {
461 msg() << "Treating crate " << rodCrate
462 << " slink " << m_srcIdMap.slink(sourceID) << endmsg;
463 }
464
465 // First word may be User Header
466 if (L1CaloUserHeader::isValid(*payload)) {
467 L1CaloUserHeader userHeader(*payload);
468 userHeader.setVersion(minorVersion);
469 const int headerWords = userHeader.words();
470 if (headerWords != 1) {
472 if (debug) msg() << "Unexpected number of user header words: "
473 << headerWords << endmsg;
474 continue;
475 }
476 for (int i = 0; i < headerWords; ++i) ++payload;
477 }
478
479 // Loop over sub-blocks if there are any
480
481 unsigned int rodErr = L1CaloSubBlock::ERROR_NONE;
482 while (payload != payloadEnd) {
483
485 const int slice = 0;
486 if (CmxSubBlock::cmxBlock(*payload)) {
487 // CMXs
489 CmxEnergySubBlock subBlock;
490 payload = subBlock.read(payload, payloadEnd);
491 if (cmCollection != nullptr) {
492 if (subBlock.dataWords() && !subBlock.unpack()) {
493 if (debug) {
494 std::string errMsg(subBlock.unpackErrorMsg());
495 msg() << "CMX-Energy sub-block unpacking failed: "
496 << errMsg << endmsg;
497 }
498 rodErr = subBlock.unpackErrorCode();
499 break;
500 }
501 const LVL1::CMXRoI roi(
502 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
505 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
508 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
511 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
514 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
517 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
520 subBlock.hits(slice, CmxEnergySubBlock::SUM_ET,
522 subBlock.hits(slice, CmxEnergySubBlock::MISSING_ET,
524 subBlock.hits(slice, CmxEnergySubBlock::MISSING_ET_SIG,
526 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
529 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
532 subBlock.energy(slice, CmxEnergySubBlock::TOTAL,
535 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
538 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
541 subBlock.error(slice, CmxEnergySubBlock::TOTAL,
544 subBlock.hits(slice, CmxEnergySubBlock::SUM_ET,
546 subBlock.hits(slice, CmxEnergySubBlock::MISSING_ET,
548 for (int word = 0; word < m_maxRoiWords; ++word) {
549 cmCollection->setRoiWord(roi.roiWord(word));
550 }
551 }
552 }
553 } else {
554 // JEM RoI
555 JemRoiSubBlockV2 subBlock;
556 payload = subBlock.read(payload, payloadEnd);
557 if (jeCollection != nullptr) {
558 if (subBlock.dataWords() && !subBlock.unpack()) {
559 if (debug) {
560 std::string errMsg(subBlock.unpackErrorMsg());
561 msg() << "JEM RoI sub-block unpacking failed: "
562 << errMsg << endmsg;
563 }
564 rodErr = subBlock.unpackErrorCode();
565 break;
566 }
567 for (int frame = 0; frame < m_frames; ++frame) {
568 const LVL1::JEMTobRoI roi = subBlock.roi(frame);
569 if (roi.energyLarge() || roi.energySmall()) {
570 jeCollection->push_back(new LVL1::JEMTobRoI(roi));
571 }
572 }
573 }
574 }
575 } else {
576 // Just RoI word
577 LVL1::JEMTobRoI jroi;
578 LVL1::CMXRoI croi;
579 if (jroi.setRoiWord(*payload)) {
580 if (jeCollection != nullptr) {
581 if (jroi.crate() != rodCrate - m_crateOffsetHw) {
582 if (debug) msg() << "Inconsistent RoI crate number: "
583 << jroi.crate() << endmsg;
585 break;
586 }
587 const uint32_t location = (*payload) & 0xfff80000;
588 if (dupRoiCheck.insert(location).second) {
589 if (jroi.energyLarge() || jroi.energySmall()) {
590 jeCollection->push_back(new LVL1::JEMTobRoI(*payload));
591 }
592 } else {
593 if (debug) msg() << "Duplicate RoI word "
594 << MSG::hex << *payload << MSG::dec << endmsg;
596 break;
597 }
598 }
599 } else if (croi.setRoiWord(*payload)) {
600 if (cmCollection != nullptr) {
601 const uint32_t roiType = (*payload) & 0xfc000000;
602
603 if (dupRoiCheck.insert(roiType).second) {
604 cmCollection->setRoiWord(*payload);
605 } else {
606 if (debug) msg() << "Duplicate RoI word "
607 << MSG::hex << *payload << MSG::dec << endmsg;
609 break;
610 }
611 }
612 } else {
613 if (debug) msg() << "Invalid RoI word "
614 << MSG::hex << *payload << MSG::dec << endmsg;
616 break;
617 }
618 ++payload;
619 }
620 }
621 if (rodErr != L1CaloSubBlock::ERROR_NONE)
622 m_errorTool->rodError(robid, rodErr);
623 }
624
625 return StatusCode::SUCCESS;
626}
value_type push_back(value_type pElem)
Add an element to the end of the collection.
static bool cmxBlock(uint32_t word)
Determine if header word corresponds to CMX.
static CmxFirmwareCode cmxType(uint32_t word)
CMX differentiation (CMX_CP, CMX_JET, or CMX_ENERGY)
OFFLINE_FRAGMENTS_NAMESPACE::PointerType ROBPointer
OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer
IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator
static SubBlockWordType wordType(uint32_t word)
Word identification.
static bool isValid(uint32_t word)
Test for valid header word.
bool setRoiWord(uint32_t roiWord)
Set RoI word with ID check.
Definition CMXRoI.cxx:115
bool setRoiWord(uint32_t roiWord)
Set RoI word with ID check.
Definition JEMTobRoI.cxx:55

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ energySubBlockTypes()

void LVL1BS::JepRoiByteStreamV2Tool::energySubBlockTypes ( int source,
CmxEnergySubBlock::SourceType & srcType,
CmxEnergySubBlock::SumType & sumType,
CmxEnergySubBlock::HitsType & hitType ) const
private

Get energy subBlock types from CMXEtSums source type.

Definition at line 680 of file JepRoiByteStreamV2Tool.cxx.

684{
685 switch (source) {
689 break;
693 break;
695 srcType = CmxEnergySubBlock::LOCAL;
697 break;
699 srcType = CmxEnergySubBlock::LOCAL;
701 break;
703 srcType = CmxEnergySubBlock::TOTAL;
705 break;
707 srcType = CmxEnergySubBlock::TOTAL;
709 break;
713 break;
717 break;
721 break;
725 break;
729 break;
730 default:
731 break;
732 }
733}

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ finalize()

StatusCode LVL1BS::JepRoiByteStreamV2Tool::finalize ( )
overridevirtual

Definition at line 103 of file JepRoiByteStreamV2Tool.cxx.

104{
105 return StatusCode::SUCCESS;
106}

◆ findCmxSums()

const LVL1::CMXEtSums * LVL1BS::JepRoiByteStreamV2Tool::findCmxSums ( int crate,
int source,
const CmxSumsMap & cmxEtMap ) const
private

Find CMX energy sums for given crate, source.

Definition at line 630 of file JepRoiByteStreamV2Tool.cxx.

633{
634 const LVL1::CMXEtSums* sums = 0;
635 CmxSumsMap::const_iterator mapIter;
636 mapIter = cmxEtMap.find(crate * 100 + source);
637 if (mapIter != cmxEtMap.end()) sums = mapIter->second;
638 return sums;
639}

◆ initialize()

StatusCode LVL1BS::JepRoiByteStreamV2Tool::initialize ( )
overridevirtual

Definition at line 91 of file JepRoiByteStreamV2Tool.cxx.

92{
93 ATH_MSG_INFO ("Initializing " << name());
94
95 ATH_CHECK( m_errorTool.retrieve() );
96 ATH_CHECK( m_byteStreamCnvSvc.retrieve() );
97
98 return StatusCode::SUCCESS;
99}
#define ATH_MSG_INFO(x)

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ interfaceID()

const InterfaceID & LVL1BS::JepRoiByteStreamV2Tool::interfaceID ( )
static

AlgTool InterfaceID.

Definition at line 37 of file JepRoiByteStreamV2Tool.cxx.

38{
40}
static const InterfaceID IID_IJepRoiByteStreamV2Tool("JepRoiByteStreamV2Tool", 1, 1)

◆ makeSourceIDs()

std::vector< uint32_t > LVL1BS::JepRoiByteStreamV2Tool::makeSourceIDs ( bool roiDaq) const
private

Definition at line 327 of file JepRoiByteStreamV2Tool.cxx.

328{
329 std::vector<uint32_t> sourceIDs;
330
331 if (roiDaq) {
333 }
334 else {
336 }
337
338 if (sourceIDs.empty()) {
339 const int maxCrates = m_crates + m_crateOffsetHw;
340 const int maxSlinks = m_srcIdMap.maxSlinks();
341 for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate)
342 {
343 for (int slink = 0; slink < maxSlinks; ++slink)
344 {
345 const int daqOrRoi = 1;
346 const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi,
348 const uint32_t robId = m_srcIdMap.getRobID(rodId);
349 if (roiDaq)
350 {
351 if (slink < 2) sourceIDs.push_back(robId);
352 }
353 else if (slink >= 2) sourceIDs.push_back(robId);
354 }
355 }
356
357 }
358 return sourceIDs;
359}

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setupCmxEtMap()

void LVL1BS::JepRoiByteStreamV2Tool::setupCmxEtMap ( const CmxSumsCollection * enCollection,
CmxSumsMap & cmxEtMap ) const
private

Set up CMX energy sums map.

Definition at line 661 of file JepRoiByteStreamV2Tool.cxx.

664{
665 cmxEtMap.clear();
666 if (etCollection) {
667 CmxSumsCollection::const_iterator pos = etCollection->begin();
668 CmxSumsCollection::const_iterator pose = etCollection->end();
669 for (; pos != pose; ++pos) {
670 const LVL1::CMXEtSums* const sums = *pos;
671 const int crate = sums->crate() - m_crateOffsetSw;
672 const int key = crate * 100 + sums->source();
673 cmxEtMap.insert(std::make_pair(key, sums));
674 }
675 }
676}
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838

◆ setupJemRoiMap()

void LVL1BS::JepRoiByteStreamV2Tool::setupJemRoiMap ( const JemRoiCollection * jeCollection,
JemRoiMap & roiMap ) const
private

Set up JEM RoIs map.

Definition at line 643 of file JepRoiByteStreamV2Tool.cxx.

646{
647 roiMap.clear();
648 if (jeCollection) {
649 JemRoiCollection::const_iterator pos = jeCollection->begin();
650 JemRoiCollection::const_iterator pose = jeCollection->end();
651 for (; pos != pose; ++pos) {
652 const LVL1::JEMTobRoI* const roi = *pos;
653 const uint32_t key = roi->roiWord();
654 roiMap.insert(std::make_pair(key, roi));
655 }
656 }
657}

◆ sourceIDs()

const std::vector< uint32_t > & LVL1BS::JepRoiByteStreamV2Tool::sourceIDs ( const std::string & sgKey) const

Return reference to vector with all possible Source Identifiers.

Definition at line 361 of file JepRoiByteStreamV2Tool.cxx.

363{
364 const std::string flag("RoIB");
365 const std::string::size_type pos = sgKey.find(flag);
366 const bool roiDaq =
367 (pos == std::string::npos || pos != sgKey.length() - flag.length());
368
369 if (roiDaq) {
370 static const std::vector<uint32_t> sourceIDs = makeSourceIDs(roiDaq);
371 return sourceIDs;
372 }
373 else {
374 static const std::vector<uint32_t> sourceIDsRoIB = makeSourceIDs(roiDaq);
375 return sourceIDsRoIB;
376 }
377}
std::vector< uint32_t > makeSourceIDs(bool roiDaq) const
bool flag
Definition master.py:29

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_byteStreamCnvSvc

ServiceHandle<IByteStreamCnvSvc> LVL1BS::JepRoiByteStreamV2Tool::m_byteStreamCnvSvc { this, "ByteStreamCnvSvc", "ByteStreamCnvSvc" }
private

Definition at line 82 of file JepRoiByteStreamV2Tool.h.

83{ this, "ByteStreamCnvSvc", "ByteStreamCnvSvc" };

◆ m_crateMax

int LVL1BS::JepRoiByteStreamV2Tool::m_crateMax
private

Property: Maximum crate number when writing out bytestream.

Definition at line 142 of file JepRoiByteStreamV2Tool.h.

◆ m_crateMin

int LVL1BS::JepRoiByteStreamV2Tool::m_crateMin
private

Property: Minimum crate number when writing out bytestream.

Definition at line 140 of file JepRoiByteStreamV2Tool.h.

◆ m_crateOffsetHw

int LVL1BS::JepRoiByteStreamV2Tool::m_crateOffsetHw
private

Property: Hardware crate number offset.

Definition at line 122 of file JepRoiByteStreamV2Tool.h.

◆ m_crateOffsetSw

int LVL1BS::JepRoiByteStreamV2Tool::m_crateOffsetSw
private

Property: Software crate number offset.

Definition at line 124 of file JepRoiByteStreamV2Tool.h.

◆ m_crates

const int LVL1BS::JepRoiByteStreamV2Tool::m_crates
private

Number of crates.

Definition at line 130 of file JepRoiByteStreamV2Tool.h.

◆ m_dataFormat

int LVL1BS::JepRoiByteStreamV2Tool::m_dataFormat
private

Property: Data compression format.

Definition at line 128 of file JepRoiByteStreamV2Tool.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_errorTool

ToolHandle<LVL1BS::L1CaloErrorByteStreamTool> LVL1BS::JepRoiByteStreamV2Tool::m_errorTool
private

Property: Error collection tool.

Definition at line 100 of file JepRoiByteStreamV2Tool.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_frames

const int LVL1BS::JepRoiByteStreamV2Tool::m_frames
private

Number of RoI frames.

Definition at line 134 of file JepRoiByteStreamV2Tool.h.

◆ m_maxRoiWords

const int LVL1BS::JepRoiByteStreamV2Tool::m_maxRoiWords
private

Number of CMX energy RoI words.

Definition at line 136 of file JepRoiByteStreamV2Tool.h.

◆ m_modules

const int LVL1BS::JepRoiByteStreamV2Tool::m_modules
private

Number of JEM modules per crate.

Definition at line 132 of file JepRoiByteStreamV2Tool.h.

◆ m_robDataProvider

ServiceHandle<IROBDataProviderSvc> LVL1BS::JepRoiByteStreamV2Tool::m_robDataProvider
private

Definition at line 98 of file JepRoiByteStreamV2Tool.h.

◆ m_slinks

int LVL1BS::JepRoiByteStreamV2Tool::m_slinks
private

Property: Number of slinks per crate when writing out bytestream.

Definition at line 138 of file JepRoiByteStreamV2Tool.h.

◆ m_sourceIDsProp

std::vector<uint32_t> LVL1BS::JepRoiByteStreamV2Tool::m_sourceIDsProp
private

Property: ROB source IDs.

Definition at line 144 of file JepRoiByteStreamV2Tool.h.

◆ m_sourceIDsRoIBProp

std::vector<uint32_t> LVL1BS::JepRoiByteStreamV2Tool::m_sourceIDsRoIBProp
private

Property: ROB source IDs for RoIB.

Definition at line 146 of file JepRoiByteStreamV2Tool.h.

◆ m_srcIdMap

const L1CaloSrcIdMap LVL1BS::JepRoiByteStreamV2Tool::m_srcIdMap
private

Source ID converter.

Definition at line 150 of file JepRoiByteStreamV2Tool.h.

◆ m_subDetector

const eformat::SubDetector LVL1BS::JepRoiByteStreamV2Tool::m_subDetector
private

Sub-detector type.

Definition at line 148 of file JepRoiByteStreamV2Tool.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_version

int LVL1BS::JepRoiByteStreamV2Tool::m_version
private

Property: Sub_block header version.

Definition at line 126 of file JepRoiByteStreamV2Tool.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: