![Logo](../../ATLAS-Logo-Square-Blue-RGB.png) |
ATLAS Offline Software
|
Tool to perform ROB fragments to CPM towers, CMX-CP TOBs and CMX-CP hits, and CP container to raw data conversions.
More...
#include <CpByteStreamV2Tool.h>
|
| CpByteStreamV2Tool (const std::string &type, const std::string &name, const IInterface *parent) |
|
virtual | ~CpByteStreamV2Tool () |
|
virtual StatusCode | initialize () override |
|
StatusCode | convert (const std::string &sgKey, DataVector< LVL1::CPMTower > *ttCollection) const |
| Convert ROB fragments to CPM towers. More...
|
|
StatusCode | convert (const std::string &sgKey, const IROBDataProviderSvc::VROBFRAG &robFrags, DataVector< LVL1::CPMTower > *ttCollection) const |
|
StatusCode | convert (const std::string &sgKey, DataVector< LVL1::CMXCPTob > *tobCollection) const |
| Convert ROB fragments to CMX-CP TOBs. More...
|
|
StatusCode | convert (const std::string &sgKey, const IROBDataProviderSvc::VROBFRAG &robFrags, DataVector< LVL1::CMXCPTob > *tobCollection) const |
|
StatusCode | convert (const std::string &sgKey, DataVector< LVL1::CMXCPHits > *hitCollection) const |
| Convert ROB fragments to CMX-CP hits. More...
|
|
StatusCode | convert (const std::string &sgKey, const IROBDataProviderSvc::VROBFRAG &robFrags, DataVector< LVL1::CMXCPHits > *hitCollection) const |
|
StatusCode | convert (const LVL1::CPBSCollectionV2 *cp) const |
| Convert CP Container to bytestream. More...
|
|
const std::vector< uint32_t > & | sourceIDs () const |
| Return reference to vector with all possible Source Identifiers. More...
|
|
ServiceHandle< StoreGateSvc > & | evtStore () |
| The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
const ServiceHandle< StoreGateSvc > & | evtStore () const |
| The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
const ServiceHandle< StoreGateSvc > & | detStore () const |
| The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
virtual StatusCode | sysInitialize () override |
| Perform system initialization for an algorithm. More...
|
|
virtual StatusCode | sysStart () override |
| Handle START transition. More...
|
|
virtual std::vector< Gaudi::DataHandle * > | inputHandles () const override |
| Return this algorithm's input handles. More...
|
|
virtual std::vector< Gaudi::DataHandle * > | outputHandles () const override |
| Return this algorithm's output handles. More...
|
|
Gaudi::Details::PropertyBase & | declareProperty (Gaudi::Property< T > &t) |
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleKey &hndl, const std::string &doc, const SG::VarHandleKeyType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleBase &hndl, const std::string &doc, const SG::VarHandleType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleKeyArray &hndArr, const std::string &doc, const SG::VarHandleKeyArrayType &) |
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, T &property, const std::string &doc, const SG::NotHandleType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, T &property, const std::string &doc="none") |
| Declare a new Gaudi property. More...
|
|
void | updateVHKA (Gaudi::Details::PropertyBase &) |
|
MsgStream & | msg () const |
|
MsgStream & | msg (const MSG::Level lvl) const |
|
bool | msgLvl (const MSG::Level lvl) const |
|
|
std::vector< uint32_t > | makeSourceIDs () const |
| Create list of all source IDs. More...
|
|
StatusCode | convertBs (const std::string &sgKey, const IROBDataProviderSvc::VROBFRAG &robFrags, CpByteStreamToolData &data) const |
| Convert bytestream to given container type. More...
|
|
void | decodeCmxCp (CmxCpSubBlock *subBlock, int trigCpm, CpByteStreamToolData &data, LocalData &ld) const |
| Unpack CMX-CP sub-block. More...
|
|
void | decodeCpm (CpmSubBlockV2 *subBlock, int trigCpm, CpmTowerData &data, LocalData &ld) const |
| Unpack CPM sub-block. More...
|
|
const LVL1::CPMTower * | findCpmTower (unsigned int key, const ConstCpmTowerMap &ttMap) const |
| Find a CPM tower for given key. More...
|
|
LVL1::CPMTower * | findCpmTower (const CpmTowerData &data, unsigned int key) const |
|
const LVL1::CMXCPTob * | findCmxCpTob (int key, const ConstCmxCpTobMap &tobMap) const |
| Find CMX-CP TOB for given key. More...
|
|
LVL1::CMXCPTob * | findCmxCpTob (const CmxCpTobData &data, int key) const |
|
const LVL1::CMXCPHits * | findCmxCpHits (int key, const ConstCmxCpHitsMap &hitsMap) const |
| Find CMX-CP hits for given key. More...
|
|
LVL1::CMXCPHits * | findCmxCpHits (const CmxCpHitsData &data, int key) const |
|
void | setupCpmTowerMap (const CpmTowerCollection *ttCollection, ConstCpmTowerMap &ttMap, LVL1::TriggerTowerKey &towerKey) const |
| Set up CPM tower map. More...
|
|
void | setupCmxCpTobMap (const CmxCpTobCollection *tobCollection, ConstCmxCpTobMap &tobMap) const |
| Set up CMX-CP TOB map. More...
|
|
void | setupCmxCpHitsMap (const CmxCpHitsCollection *hitCollection, ConstCmxCpHitsMap &hitsMap) const |
| Set up CMX-CP hits map. More...
|
|
int | tobKey (int crate, int cmx, int cpm, int chip, int loc) const |
| Key for TOBs. More...
|
|
int | hitsKey (int crate, int cmx, int source) const |
| Key for Hits. More...
|
|
bool | slinkSlices (int crate, int module, int modulesPerSlink, int ×lices, int &trigJem, const ConstCpmTowerMap &ttMap, const ConstCmxCpTobMap &tobMap, const ConstCmxCpHitsMap &hitsMap, LVL1::TriggerTowerKey &towerKey) const |
| Get number of slices and triggered slice offset for next slink. More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &) |
| specialization for handling Gaudi::Property<SG::VarHandleKey> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyArrayType &) |
| specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleType &) |
| specialization for handling Gaudi::Property<SG::VarHandleBase> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &t, const SG::NotHandleType &) |
| specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray> More...
|
|
Tool to perform ROB fragments to CPM towers, CMX-CP TOBs and CMX-CP hits, and CP container to raw data conversions.
Based on ROD document version X_xxx.
- Author
- Peter Faulkner
Definition at line 54 of file CpByteStreamV2Tool.h.
◆ CmxCpHitsCollection
◆ CmxCpHitsMap
◆ CmxCpTobCollection
◆ CmxCpTobMap
◆ ConstCmxCpHitsMap
◆ ConstCmxCpTobMap
◆ ConstCpmTowerMap
◆ CpmTowerCollection
◆ CpmTowerMap
◆ ROBIterator
◆ ROBPointer
◆ RODPointer
◆ StoreGateSvc_t
◆ CollectionType
◆ CpByteStreamV2Tool()
LVL1BS::CpByteStreamV2Tool::CpByteStreamV2Tool |
( |
const std::string & |
type, |
|
|
const std::string & |
name, |
|
|
const IInterface * |
parent |
|
) |
| |
Definition at line 51 of file CpByteStreamV2Tool.cxx.
55 m_cpmMaps(
"LVL1::CpmMappingTool/CpmMappingTool"),
56 m_errorTool(
"LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"),
62 declareInterface<CpByteStreamV2Tool>(
this);
65 "Crate/Module/Channel to Eta/Phi/Layer mapping tool");
67 "Tool to collect errors for monitoring");
70 "Offset of CP crate numbers in bytestream");
72 "Offset of CP crate numbers in RDOs");
76 "ROB fragment source identifiers");
80 "Format version number in sub-block header");
82 "Format identifier (0-1) in sub-block header");
84 "The number of S-Links per crate");
86 "The number of slices in the simulation");
88 "If >0, the number of slices in bytestream");
90 "Minimum crate number, allows partial output");
92 "Maximum crate number, allows partial output");
◆ ~CpByteStreamV2Tool()
LVL1BS::CpByteStreamV2Tool::~CpByteStreamV2Tool |
( |
| ) |
|
|
virtual |
◆ convert() [1/7]
Convert CP Container to bytestream.
Definition at line 188 of file CpByteStreamV2Tool.cxx.
192 return StatusCode::FAILURE;
231 int timeslicesNew = 1;
244 if (
mod % modulesPerSlink == 0)
246 const int daqOrRoi = 0;
247 const int slink = (
m_slinks == 2) ? 2 * (
mod / modulesPerSlink)
248 :
mod / modulesPerSlink;
251 msg() <<
"Treating crate " << hwCrate
252 <<
" slink " << slink <<
endmsg;
263 msg(MSG::ERROR) <<
"Inconsistent number of slices or "
264 <<
"triggered slice offsets in data for crate "
265 << hwCrate <<
" slink " << slink <<
endmsg;
266 return StatusCode::FAILURE;
274 <<
"Slices/offset: " << timeslices <<
" " << trigCpm;
275 if (timeslices != timeslicesNew)
277 msg() <<
" modified to " << timeslicesNew <<
" " << trigCpmNew;
281 L1CaloUserHeader userHeader;
282 userHeader.setCpm(trigCpmNew);
286 theROD->push_back(userHeader.header());
295 CpmSubBlockV2 *
const subBlock =
new CpmSubBlockV2();
297 hwCrate,
module, timeslicesNew);
299 if (neutralFormat)
break;
316 std::vector<int> emData;
317 std::vector<int> hadData;
318 std::vector<int> emError;
319 std::vector<int> hadError;
334 const int index = ( neutralFormat ) ? 0 :
slice;
335 CpmSubBlockV2 *
const subBlock = cpmBlocks[
index];
337 hadData[
slice], emErr, hadErr);
348 subBlock->setStatus(failingBCN, gLinkTimeout, gLinkDown,
349 moduleError, fIFOOverflow, bCNMismatch,
350 gLinkProtocol, gLinkParity);
362 CpmSubBlockV2 *
const subBlock = *
pos;
363 if ( !subBlock->pack())
365 msg(MSG::ERROR) <<
"CPM sub-block packing failed" <<
endmsg;
366 return StatusCode::FAILURE;
370 msg() <<
"CPM sub-block data words: "
371 << subBlock->dataWords() <<
endmsg;
373 subBlock->write(theROD);
379 for (
int cmx = 0; cmx <
m_cmxs; ++cmx)
389 CmxCpSubBlock *
const block =
new CmxCpSubBlock();
393 if (neutralFormat)
break;
398 for (
int cpm = 1; cpm <=
m_modules; ++cpm)
400 for (
int chip = 0; chip <
m_chips; ++chip)
402 for (
int loc = 0; loc <
m_locs; ++loc)
404 const int key =
tobKey(crate, cmx, cpm, chip, loc);
410 std::vector<int> isolation;
411 std::vector<int>
error;
412 std::vector<unsigned int> presence;
426 const int index = ( neutralFormat ) ? 0 :
slice;
427 CmxCpSubBlock *
const subBlock = cmxBlocks[
index];
430 subBlock->setPresenceMap(
slice, cpm, presence[
slice]);
445 std::vector<unsigned int> hits0;
446 std::vector<unsigned int> hits1;
447 std::vector<int> err0;
448 std::vector<int> err1;
457 const int index = ( neutralFormat ) ? 0 :
slice;
458 CmxCpSubBlock *
const subBlock = cmxBlocks[
index];
459 subBlock->setHits(
slice, source, 0, hits0[
slice],
461 subBlock->setHits(
slice, source, 1, hits1[
slice],
465 subBlock->setRoiOverflow(
slice, source,
471 for (CmxCpSubBlock* subBlock : cmxBlocks)
473 if ( !subBlock->pack())
475 msg(MSG::ERROR) <<
"CMX-Cp sub-block packing failed" <<
endmsg;
476 return StatusCode::FAILURE;
480 msg() <<
"CMX-Cp sub-block data words: "
481 << subBlock->dataWords() <<
endmsg;
483 subBlock->write(theROD);
488 return StatusCode::SUCCESS;
◆ convert() [2/7]
◆ convert() [3/7]
◆ convert() [4/7]
◆ convert() [5/7]
◆ convert() [6/7]
◆ convert() [7/7]
◆ convertBs()
Convert bytestream to given container type.
Definition at line 526 of file CpByteStreamV2Tool.cxx.
539 CmxCpSubBlock cmxCpSubBlock;
540 CpmSubBlockV2 cpmSubBlock;
545 std::set<uint32_t> dupCheck;
548 for (; rob != robEnd; ++rob)
551 ATH_MSG_DEBUG(
"Treating ROB fragment " << robCount <<
" source_id = " << std::hex << (*rob)->rob_source_id() << std::dec);
555 const uint32_t robid = (*rob)->source_id();
556 if ((*rob)->nstatus() > 0)
559 (*rob)->status(robData);
563 if (
debug)
msg() <<
"ROB status error - skipping fragment" <<
endmsg;
570 if (!dupCheck.insert(robid).second)
582 (*rob)->rod_data(payloadBeg);
583 payloadEnd = payloadBeg + (*rob)->rod_ndata();
592 const uint32_t sourceID = (*rob)->rod_source_id();
603 msg() <<
"Wrong source identifier in data: ROD "
604 << MSG::hex << sourceID <<
" ROB " << robid
611 const int minorVersion = (*rob)->rod_version() & 0xffff;
621 msg() <<
"Treating crate " << rodCrate
632 L1CaloUserHeader userHeader(*
payload);
633 userHeader.setVersion(minorVersion);
634 const int headerWords = userHeader.words();
635 if (headerWords != 1)
638 if (
debug)
msg() <<
"Unexpected number of user header words: "
642 for (
int i = 0;
i < headerWords; ++
i) ++
payload;
644 const int trigCpm = userHeader.cpm();
647 msg() <<
"Minor format version number: " << MSG::hex
648 << minorVersion << MSG::dec <<
endmsg
649 <<
"Triggered slice offset: " << trigCpm <<
endmsg;
676 cmxCpSubBlock.clear();
678 if (cmxCpSubBlock.crate() != rodCrate)
680 if (
debug)
msg() <<
"Inconsistent crate number in ROD source ID"
708 if (cpmSubBlock.crate() != rodCrate)
710 if (
debug)
msg() <<
"Inconsistent crate number in ROD source ID"
717 decodeCpm(&cpmSubBlock, trigCpm,
static_cast<CpmTowerData&
>(
data),
ld);
731 return StatusCode::SUCCESS;
◆ declareGaudiProperty() [1/4]
specialization for handling Gaudi::Property<SG::VarHandleKeyArray>
Definition at line 170 of file AthCommonDataStore.h.
175 hndl.documentation());
◆ declareGaudiProperty() [2/4]
specialization for handling Gaudi::Property<SG::VarHandleKey>
Definition at line 156 of file AthCommonDataStore.h.
161 hndl.documentation());
◆ declareGaudiProperty() [3/4]
specialization for handling Gaudi::Property<SG::VarHandleBase>
Definition at line 184 of file AthCommonDataStore.h.
189 hndl.documentation());
◆ declareGaudiProperty() [4/4]
◆ declareProperty() [1/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
hndl | Object holding the property value. |
doc | Documentation string for the property. |
This is the version for types that derive from SG::VarHandleBase
. The property value object is put on the input and output lists as appropriate; then we forward to the base class.
Definition at line 245 of file AthCommonDataStore.h.
250 this->declare(hndl.
vhKey());
251 hndl.
vhKey().setOwner(
this);
◆ declareProperty() [2/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
hndl | Object holding the property value. |
doc | Documentation string for the property. |
This is the version for types that derive from SG::VarHandleKey
. The property value object is put on the input and output lists as appropriate; then we forward to the base class.
Definition at line 221 of file AthCommonDataStore.h.
◆ declareProperty() [3/6]
◆ declareProperty() [4/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
property | Object holding the property value. |
doc | Documentation string for the property. |
This is the generic version, for types that do not derive from SG::VarHandleKey
. It just forwards to the base class version of declareProperty
.
Definition at line 333 of file AthCommonDataStore.h.
◆ declareProperty() [5/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
property | Object holding the property value. |
doc | Documentation string for the property. |
This dispatches to either the generic declareProperty
or the one for VarHandle/Key/KeyArray.
Definition at line 352 of file AthCommonDataStore.h.
◆ declareProperty() [6/6]
◆ decodeCmxCp()
Unpack CMX-CP sub-block.
Definition at line 736 of file CpByteStreamV2Tool.cxx.
743 const int hwCrate = subBlock->crate();
744 const int cmx = subBlock->cmxPosition();
745 const int firmware = subBlock->cmxFirmware();
746 const int summing = subBlock->cmxSumming();
747 const int timeslices = subBlock->timeslices();
748 const int sliceNum = subBlock->slice();
751 msg() <<
"CMX-CP: Crate " << hwCrate
752 <<
" Position " << cmx
753 <<
" Firmware " << firmware
754 <<
" Summing " << summing
755 <<
" Total slices " << timeslices
756 <<
" Slice " << sliceNum
759 if (timeslices <= trigCpm)
761 if (
debug)
msg() <<
"Triggered slice from header "
762 <<
"inconsistent with number of slices: "
763 << trigCpm <<
", " << timeslices <<
endmsg;
767 if (timeslices <= sliceNum)
769 if (
debug)
msg() <<
"Total slices inconsistent with slice number: "
770 << timeslices <<
", " << sliceNum <<
endmsg;
775 if (subBlock->dataWords() && !subBlock->unpack())
779 std::string errMsg(subBlock->unpackErrorMsg());
780 msg() <<
"CMX-CP sub-block unpacking failed: " << errMsg <<
endmsg;
782 ld.rodErr = subBlock->unpackErrorCode();
791 const int subStatus = dErr.
error();
795 const int sliceBeg = ( neutralFormat ) ? 0 : sliceNum;
796 const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
802 CmxCpTobData& tdata =
static_cast<CmxCpTobData&
> (
data);
806 for (
int cpm = 1; cpm <=
m_modules; ++cpm)
808 const unsigned int presenceMap = subBlock->presenceMap(
slice, cpm);
809 for (
int tob = 0; tob <
m_maxTobs; ++tob)
811 const int energy = subBlock->energy(
slice, cpm, tob);
812 const int isolation = subBlock->isolation(
slice, cpm, tob);
813 int error = subBlock->tobError(
slice, cpm, tob);
814 if (
energy == 0 && isolation == 0 &&
error == 0)
break;
815 const int loc = subBlock->localCoord(
slice, cpm, tob);
816 const int chip = subBlock->chip(
slice, cpm, tob);
828 error = errBits.error();
829 const int key =
tobKey(crate, cmx, cpm, chip, loc);
833 ld.energyVec.assign(timeslices, 0);
834 ld.isolVec.assign(timeslices, 0);
835 ld.errorVec.assign(timeslices, 0);
836 ld.presenceMapVec.assign(timeslices, 0);
840 ld.presenceMapVec[
slice] = presenceMap;
842 std::make_unique<LVL1::CMXCPTob>(swCrate, cmx, cpm, chip, loc,
843 ld.energyVec,
ld.isolVec,
ld.errorVec,
844 ld.presenceMapVec, trigCpm);
845 tdata.m_tobMap.insert(std::make_pair(
key, tbp.get()));
846 tdata.m_tobCollection->push_back(std::move(tbp));
850 ld.energyVec =
tb->energyVec();
851 ld.isolVec =
tb->isolationVec();
852 ld.errorVec =
tb->errorVec();
853 ld.presenceMapVec =
tb->presenceMapVec();
854 const int nsl =
ld.energyVec.size();
855 if (timeslices != nsl)
857 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
872 ld.presenceMapVec[
slice] = presenceMap;
873 tb->addTob(
ld.energyVec,
ld.isolVec,
ld.errorVec,
ld.presenceMapVec);
881 CmxCpHitsData& hdata =
static_cast<CmxCpHitsData&
> (
data);
885 for (
int source = 0; source < maxSid; ++source)
892 const unsigned int hits0 = subBlock->hits(
slice, source, 0);
893 const unsigned int hits1 = subBlock->hits(
slice, source, 1);
894 int err0 = subBlock->hitsError(
slice, source, 0);
895 int err1 = subBlock->hitsError(
slice, source, 1);
896 int overflow = subBlock->roiOverflow(
slice, source);
900 err0 = err0Bits.error();
904 err1 = err1Bits.error();
905 if (hits0 || hits1 || err0 || err1)
911 ld.hitsVec0.assign(timeslices, 0);
912 ld.hitsVec1.assign(timeslices, 0);
913 ld.errVec0.assign(timeslices, 0);
914 ld.errVec1.assign(timeslices, 0);
920 std::make_unique<LVL1::CMXCPHits>(swCrate, cmx, source,
921 ld.hitsVec0,
ld.hitsVec1,
922 ld.errVec0,
ld.errVec1, trigCpm);
923 hdata.m_hitsMap.insert(std::make_pair(
key, chp.get()));
924 hdata.m_hitCollection->push_back(std::move(chp));
928 ld.hitsVec0 =
ch->hitsVec0();
929 ld.hitsVec1 =
ch->hitsVec1();
930 ld.errVec0 =
ch->errorVec0();
931 ld.errVec1 =
ch->errorVec1();
932 const int nsl =
ld.hitsVec0.size();
933 if (timeslices != nsl)
935 if (
debug)
msg() <<
"Inconsistent number of slices in sub-blocks"
951 ch->addHits(
ld.hitsVec0,
ld.hitsVec1,
ld.errVec0,
ld.errVec1);
◆ decodeCpm()
Unpack CPM sub-block.
Definition at line 963 of file CpByteStreamV2Tool.cxx.
971 const int hwCrate = subBlock->crate();
972 const int module = subBlock->module();
973 const int timeslices = subBlock->timeslices();
974 const int sliceNum = subBlock->slice();
977 msg() <<
"CPM: Crate " << hwCrate
979 <<
" Total slices " << timeslices
980 <<
" Slice " << sliceNum <<
endmsg;
988 if (timeslices <= trigCpm)
990 if (
debug)
msg() <<
"Triggered slice from header "
991 <<
"inconsistent with number of slices: "
992 << trigCpm <<
", " << timeslices <<
endmsg;
996 if (timeslices <= sliceNum)
998 if (
debug)
msg() <<
"Total slices inconsistent with slice number: "
999 << timeslices <<
", " << sliceNum <<
endmsg;
1004 if (subBlock->dataWords() && !subBlock->unpack())
1008 std::string errMsg(subBlock->unpackErrorMsg());
1009 msg() <<
"CPM sub-block unpacking failed: " << errMsg <<
endmsg;
1011 ld.rodErr = subBlock->unpackErrorCode();
1019 const int subStatus = dErr.
error();
1021 const int sliceBeg = ( neutralFormat ) ? 0 : sliceNum;
1022 const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
1030 if (!subStatus && !subBlock->anyTowerData(
chan))
continue;
1031 const int em = subBlock->emData(
slice,
chan);
1032 const int had = subBlock->hadData(
slice,
chan);
1033 const int emErr = subBlock->emError(
slice,
chan);
1034 const int hadErr = subBlock->hadError(
slice,
chan);
1035 int emErr1 = subStatus;
1041 emErr1 = emErrBits.error();
1043 int hadErr1 = subStatus;
1049 hadErr1 = hadErrBits.error();
1051 if (em || had || emErr1 || hadErr1)
1060 const unsigned int key =
ld.towerKey.ttKey(
phi,
eta);
1064 ld.emVec.assign(timeslices, 0);
1065 ld.hadVec.assign(timeslices, 0);
1066 ld.emErrVec.assign(timeslices, 0);
1067 ld.hadErrVec.assign(timeslices, 0);
1071 ld.hadErrVec[
slice] = hadErr1;
1073 std::make_unique<LVL1::CPMTower>(
phi,
eta,
ld.emVec,
ld.emErrVec,
1074 ld.hadVec,
ld.hadErrVec, trigCpm);
1075 data.m_ttMap.insert(std::make_pair(
key, ttp.get()));
1076 data.m_ttCollection->push_back(std::move(ttp));
1080 ld.emVec =
tt->emEnergyVec();
1081 ld.hadVec =
tt->hadEnergyVec();
1082 ld.emErrVec =
tt->emErrorVec();
1083 ld.hadErrVec =
tt->hadErrorVec();
1084 const int nsl =
ld.emVec.size();
1085 if (timeslices != nsl)
1089 msg() <<
"Inconsistent number of slices in sub-blocks"
1098 if (
debug)
msg() <<
"Duplicate data for slice "
1106 ld.hadErrVec[
slice] = hadErr1;
1107 tt->fill(
ld.emVec,
ld.emErrVec,
ld.hadVec,
ld.hadErrVec, trigCpm);
1111 else if (
verbose && (em || had || emErr || hadErr))
1113 msg(
MSG::VERBOSE) <<
"Non-zero data but no channel mapping for channel "
◆ detStore()
◆ evtStore() [1/2]
◆ evtStore() [2/2]
◆ extraDeps_update_handler()
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
◆ findCmxCpHits() [1/2]
Definition at line 1178 of file CpByteStreamV2Tool.cxx.
1181 CmxCpHitsMap::const_iterator mapIter =
data.m_hitsMap.find(
key);
1182 if (mapIter !=
data.m_hitsMap.end())
return mapIter->second;
◆ findCmxCpHits() [2/2]
Find CMX-CP hits for given key.
Definition at line 1170 of file CpByteStreamV2Tool.cxx.
1173 ConstCmxCpHitsMap::const_iterator mapIter = hitsMap.find(
key);
1174 if (mapIter != hitsMap.end())
return mapIter->second;
◆ findCmxCpTob() [1/2]
Definition at line 1159 of file CpByteStreamV2Tool.cxx.
1162 CmxCpTobMap::const_iterator mapIter =
data.m_tobMap.find(
key);
1163 if (mapIter !=
data.m_tobMap.end())
return mapIter->second;
◆ findCmxCpTob() [2/2]
Find CMX-CP TOB for given key.
Definition at line 1151 of file CpByteStreamV2Tool.cxx.
1154 ConstCmxCpTobMap::const_iterator mapIter = tobMap.find(
key);
1155 if (mapIter != tobMap.end())
return mapIter->second;
◆ findCpmTower() [1/2]
Definition at line 1140 of file CpByteStreamV2Tool.cxx.
1143 CpmTowerMap::const_iterator mapIter =
data.m_ttMap.find(
key);
1144 if (mapIter !=
data.m_ttMap.end())
return mapIter->second;
◆ findCpmTower() [2/2]
Find a CPM tower for given key.
Definition at line 1132 of file CpByteStreamV2Tool.cxx.
1135 ConstCpmTowerMap::const_iterator mapIter = ttMap.find(
key);
1136 if (mapIter != ttMap.end())
return mapIter->second;
◆ hitsKey()
int LVL1BS::CpByteStreamV2Tool::hitsKey |
( |
int |
crate, |
|
|
int |
cmx, |
|
|
int |
source |
|
) |
| const |
|
private |
◆ initialize()
StatusCode LVL1BS::CpByteStreamV2Tool::initialize |
( |
| ) |
|
|
overridevirtual |
◆ inputHandles()
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::CpByteStreamV2Tool::interfaceID |
( |
| ) |
|
|
static |
◆ makeSourceIDs()
std::vector< uint32_t > LVL1BS::CpByteStreamV2Tool::makeSourceIDs |
( |
| ) |
const |
|
private |
Create list of all source IDs.
Definition at line 493 of file CpByteStreamV2Tool.cxx.
505 for (
int slink = 0; slink < maxSlinks; ++slink)
507 const int daqOrRoi = 0;
◆ msg() [1/2]
◆ msg() [2/2]
◆ msgLvl()
◆ outputHandles()
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()
◆ renounceArray()
◆ setupCmxCpHitsMap()
◆ setupCmxCpTobMap()
Set up CMX-CP TOB map.
Definition at line 1209 of file CpByteStreamV2Tool.cxx.
1218 for (;
pos != pose; ++
pos)
1222 const int cmx = tob->
cmx();
1223 const int cpm = tob->
cpm();
1224 const int chip = tob->
chip();
1226 const int key =
tobKey(crate, cmx, cpm, chip, loc);
1227 tobMap.insert(std::make_pair(
key, tob));
◆ setupCpmTowerMap()
◆ slinkSlices()
Get number of slices and triggered slice offset for next slink.
Definition at line 1273 of file CpByteStreamV2Tool.cxx.
1292 if ( !
tt )
continue;
1293 const int numdat = 4;
1294 std::vector<int> sums(numdat);
1295 std::vector<int> sizes(numdat);
1297 (
tt->emEnergyVec()).end(), 0);
1299 (
tt->hadEnergyVec()).end(), 0);
1301 (
tt->emErrorVec()).end(), 0);
1303 (
tt->hadErrorVec()).end(), 0);
1304 sizes[0] = (
tt->emEnergyVec()).
size();
1305 sizes[1] = (
tt->hadEnergyVec()).
size();
1306 sizes[2] = (
tt->emErrorVec()).
size();
1307 sizes[3] = (
tt->hadErrorVec()).
size();
1308 const int peak =
tt->peak();
1309 for (
int i = 0;
i < numdat; ++
i)
1311 if (sums[
i] == 0)
continue;
1317 else if (
slices != sizes[
i] || trigC != peak)
return false;
1324 for (
int cmx = 0; cmx <
m_cmxs; ++cmx)
1326 for (
int cpm = 1; cpm <=
m_modules; ++ cpm)
1328 for (
int chip = 0; chip <
m_chips; ++chip)
1330 for (
int loc = 0; loc <
m_locs; ++loc)
1332 const int key =
tobKey(crate, cmx, cpm, chip, loc);
1337 const int numdat = 3;
1338 std::vector<int> sums(numdat);
1339 std::vector<int> sizes(numdat);
1349 const int peak = tob->
peak();
1350 for (
int i = 0;
i < numdat; ++
i)
1352 if (sums[
i] == 0)
continue;
1358 else if (
slices != sizes[
i] || trigC != peak)
return false;
1372 const int numdat = 4;
1373 std::vector<unsigned int> sums(numdat);
1374 std::vector<int> sizes(numdat);
1376 (
hits->hitsVec0()).end(), 0);
1378 (
hits->hitsVec1()).end(), 0);
1380 (
hits->errorVec0()).end(), 0);
1382 (
hits->errorVec1()).end(), 0);
1383 sizes[0] = (
hits->hitsVec0()).
size();
1384 sizes[1] = (
hits->hitsVec1()).
size();
1385 sizes[2] = (
hits->errorVec0()).
size();
1386 sizes[3] = (
hits->errorVec1()).
size();
1387 const int peak =
hits->peak();
1388 for (
int i = 0;
i < numdat; ++
i)
1390 if (sums[
i] == 0)
continue;
1396 else if (
slices != sizes[
i] || trigC != peak)
return false;
◆ sourceIDs()
const std::vector< uint32_t > & LVL1BS::CpByteStreamV2Tool::sourceIDs |
( |
| ) |
const |
◆ sysInitialize()
◆ sysStart()
Handle START transition.
We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.
◆ tobKey()
int LVL1BS::CpByteStreamV2Tool::tobKey |
( |
int |
crate, |
|
|
int |
cmx, |
|
|
int |
cpm, |
|
|
int |
chip, |
|
|
int |
loc |
|
) |
| const |
|
private |
Key for TOBs.
Definition at line 1257 of file CpByteStreamV2Tool.cxx.
1260 return (((((((crate << 1) | cmx) << 4) | cpm) << 4) | chip) << 2) | loc;
◆ updateVHKA()
◆ m_byteStreamCnvSvc
◆ m_channels
const int LVL1BS::CpByteStreamV2Tool::m_channels |
|
private |
◆ m_chips
const int LVL1BS::CpByteStreamV2Tool::m_chips |
|
private |
◆ m_cmxs
const int LVL1BS::CpByteStreamV2Tool::m_cmxs |
|
private |
◆ m_cpmMaps
◆ m_crateMax
int LVL1BS::CpByteStreamV2Tool::m_crateMax |
|
private |
◆ m_crateMin
int LVL1BS::CpByteStreamV2Tool::m_crateMin |
|
private |
◆ m_crateOffsetHw
int LVL1BS::CpByteStreamV2Tool::m_crateOffsetHw |
|
private |
◆ m_crateOffsetSw
int LVL1BS::CpByteStreamV2Tool::m_crateOffsetSw |
|
private |
◆ m_crates
int LVL1BS::CpByteStreamV2Tool::m_crates |
|
private |
◆ m_dataFormat
int LVL1BS::CpByteStreamV2Tool::m_dataFormat |
|
private |
◆ m_detStore
◆ m_dfltSlices
int LVL1BS::CpByteStreamV2Tool::m_dfltSlices |
|
private |
◆ m_enableEncoding
Gaudi::Property<bool> LVL1BS::CpByteStreamV2Tool::m_enableEncoding |
|
private |
Initial value:{
this, "enableEncoding", true, "Enable conversion from RDO to ByteStream"}
Definition at line 93 of file CpByteStreamV2Tool.h.
◆ m_errorTool
◆ m_evtStore
◆ m_forceSlices
int LVL1BS::CpByteStreamV2Tool::m_forceSlices |
|
private |
◆ m_locs
const int LVL1BS::CpByteStreamV2Tool::m_locs |
|
private |
◆ m_maxTobs
const int LVL1BS::CpByteStreamV2Tool::m_maxTobs |
|
private |
◆ m_modules
const int LVL1BS::CpByteStreamV2Tool::m_modules |
|
private |
◆ m_robDataProvider
◆ m_slinks
int LVL1BS::CpByteStreamV2Tool::m_slinks |
|
private |
◆ m_sourceIDsProp
std::vector<uint32_t> LVL1BS::CpByteStreamV2Tool::m_sourceIDsProp |
|
private |
◆ m_srcIdMap
◆ m_subDetector
const eformat::SubDetector LVL1BS::CpByteStreamV2Tool::m_subDetector |
|
private |
◆ m_varHandleArraysDeclared
◆ m_version
int LVL1BS::CpByteStreamV2Tool::m_version |
|
private |
◆ m_vhka
The documentation for this class was generated from the following files:
uint16_t minorVersionPreLS1() const
Return last ROD header minor version for pre-LS1 data.
char data[hepevt_bytes_allocation_ATLAS]
int slink(uint32_t code) const
Return slink from unpacked moduleID.
int cmx() const
returns CMX number (0/1)==(Left/Right)==(Tau/Em)
Scalar phi() const
phi method
Template class for assembling a full atlas raw event from subfragments.
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
bool ends_with(const char *s, const char *suffix)
Test whether one null-terminated byte string ends with another.
Scalar eta() const
pseudorapidity method
static int peak(int oldPeak, int oldSlices, int newSlices)
Return new triggered slice offset.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
const std::vector< int > & errorVec() const
returns error
Summary of CP (EM/tau) hits produced by the merger modules.
StoreGateSvc_t m_evtStore
Pointer to StoreGate (event store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
const T * get(size_type n) const
Access an element, as an rvalue.
bool msgLvl(const MSG::Level lvl) const
uint32_t getRobID(uint32_t rod_id) const
Make a ROB Source ID from a ROD source ID.
static bool cmxBlock(uint32_t word)
Determine if header word corresponds to CMX.
virtual void setOwner(IDataHandleHolder *o)=0
const std::vector< int > & isolationVec() const
returns isolation
The CPMTower class contains the TriggerTower information received by the Cluster Processor Modules.
static void data(const std::vector< int > &oldVec, std::vector< int > &newVec, int newSlices)
Return modified data vector<int>
(Non-const) Iterator class for DataVector/DataList.
const std::vector< int > & energyVec() const
For multi-slice readout.
void set(ErrorBit bit, int value=1)
Set an error bit or data.
int crate(uint32_t code) const
Return crate from unpacked moduleID.
#define CHECK(...)
Evaluate an expression and check for errors.
std::vector< const ROBF * > VROBFRAG
StoreGateSvc_t m_detStore
Pointer to StoreGate (detector store by default)
static SubBlockWordType wordType(uint32_t word)
Word identification.
int error() const
Return the full error word.
virtual void renounce()=0
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
int chip() const
returns chip number (3 or 4 bits?)
int crate() const
Data accessors.
uint16_t minorVersion() const
Return ROD header minor version to use when writing BS.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
static CmxFirmwareCode cmxType(uint32_t word)
CMX differentiation (CMX_CP, CMX_JET, or CMX_ENERGY)
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
int peak() const
returns peak slice number
eformat::SubDetector subDet(uint32_t code) const
Return sub-detector for given ID.
void setRodMinorVersion(uint16_t m)
change the ROD minor version
int cpm() const
returns CPM number
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
uint32_t getRodID(int crate, int slink, int daqOrRoi, eformat::SubDetector subdet) const
Make a ROD Source ID.
int location() const
returns location (3 or 2 bits?)
std::vector< uint32_t > RODDATA
ROD data as a vector of unsigned int.
virtual unsigned int ttKey(const TriggerTower &tower)
returns the key of the passed tower
int maxSlinks() const
Return the maximum possible number of slinks.
TOB data received by the merger modules.
int daqOrRoi(uint32_t code) const
Return daqOrRoi from unpacked moduleID.
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
The TriggerTowerKey object provides the key for each trigger tower depending on its eta-phi coords.
RODDATA * getRodData(uint32_t id)
get a block of ROD data
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.