diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.cxx index 2ab9fd571828b86b8b8bf2211df82f35cf2a2593..a23c4cd0718885888a65663419afed08295837b3 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ @@ -17,7 +17,6 @@ #include "CpmRoiSubBlock.h" #include "L1CaloErrorByteStreamTool.h" -#include "L1CaloSrcIdMap.h" #include "L1CaloUserHeader.h" #include "CpmRoiByteStreamTool.h" @@ -41,8 +40,8 @@ CpmRoiByteStreamTool::CpmRoiByteStreamTool(const std::string& type, const IInterface* parent) : AthAlgTool(type, name, parent), m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"), - m_crates(4), m_modules(14), m_srcIdMap(0), m_subBlock(0), m_rodStatus(0), - m_fea(0) + m_crates(4), m_modules(14), + m_subDetector (eformat::TDAQ_CALO_CLUSTER_PROC_ROI) { declareInterface<CpmRoiByteStreamTool>(this); @@ -52,9 +51,9 @@ CpmRoiByteStreamTool::CpmRoiByteStreamTool(const std::string& type, "Offset of CP crate numbers in RDOs"); // Properties for reading bytestream only - declareProperty("ROBSourceIDs", m_sourceIDs, + declareProperty("ROBSourceIDs", m_sourceIDsProp, "ROB fragment source identifiers"); - declareProperty("ROBSourceIDsRoIB", m_sourceIDsRoIB, + declareProperty("ROBSourceIDsRoIB", m_sourceIDsRoIBProp, "ROB fragment source identifiers for RoIBs"); // Properties for writing bytestream only @@ -78,31 +77,11 @@ CpmRoiByteStreamTool::~CpmRoiByteStreamTool() StatusCode CpmRoiByteStreamTool::initialize() { - msg(MSG::INFO) << "Initializing " << name() << " - package version " - << PACKAGE_VERSION << endmsg; - - StatusCode sc = m_errorTool.retrieve(); - if (sc.isFailure()) { - msg(MSG::ERROR) << "Failed to retrieve tool " << m_errorTool << endmsg; - return sc; - } else msg(MSG::INFO) << "Retrieved tool " << m_errorTool << endmsg; - - m_subDetector = eformat::TDAQ_CALO_CLUSTER_PROC_ROI; - m_srcIdMap = new L1CaloSrcIdMap(); - m_rodStatus = new std::vector<uint32_t>(2); - m_subBlock = new CpmRoiSubBlock(); - m_fea = new FullEventAssembler<L1CaloSrcIdMap>(); - return StatusCode::SUCCESS; -} + ATH_MSG_INFO ("Initializing " << name() << " - package version " + << PACKAGE_VERSION); -// Finalize + ATH_CHECK( m_errorTool.retrieve() ); -StatusCode CpmRoiByteStreamTool::finalize() -{ - delete m_fea; - delete m_subBlock; - delete m_rodStatus; - delete m_srcIdMap; return StatusCode::SUCCESS; } @@ -110,11 +89,14 @@ StatusCode CpmRoiByteStreamTool::finalize() StatusCode CpmRoiByteStreamTool::convert( const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMRoI>* const roiCollection) + DataVector<LVL1::CPMRoI>* const roiCollection) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); + // Sub-block for neutral format + CpmRoiSubBlock subBlock; + // Loop over ROB fragments int robCount = 0; @@ -165,12 +147,12 @@ StatusCode CpmRoiByteStreamTool::convert( // Check identifier const uint32_t sourceID = (*rob)->rod_source_id(); - if (m_srcIdMap->getRobID(sourceID) != robid || - m_srcIdMap->subDet(sourceID) != m_subDetector || - m_srcIdMap->daqOrRoi(sourceID) != 1 || - (m_srcIdMap->slink(sourceID) != 0 && m_srcIdMap->slink(sourceID) != 2) || - m_srcIdMap->crate(sourceID) < m_crateOffsetHw || - m_srcIdMap->crate(sourceID) >= m_crateOffsetHw + m_crates) { + if (m_srcIdMap.getRobID(sourceID) != robid || + m_srcIdMap.subDet(sourceID) != m_subDetector || + m_srcIdMap.daqOrRoi(sourceID) != 1 || + (m_srcIdMap.slink(sourceID) != 0 && m_srcIdMap.slink(sourceID) != 2) || + m_srcIdMap.crate(sourceID) < m_crateOffsetHw || + m_srcIdMap.crate(sourceID) >= m_crateOffsetHw + m_crates) { m_errorTool->rodError(robid, L1CaloSubBlock::ERROR_ROD_ID); if (debug) { msg() << "Wrong source identifier in data: " @@ -178,10 +160,10 @@ StatusCode CpmRoiByteStreamTool::convert( } continue; } - const int rodCrate = m_srcIdMap->crate(sourceID); + const int rodCrate = m_srcIdMap.crate(sourceID); if (debug) { msg() << "Treating crate " << rodCrate - << " slink " << m_srcIdMap->slink(sourceID) << endmsg; + << " slink " << m_srcIdMap.slink(sourceID) << endmsg; } // First word may be User Header @@ -205,26 +187,26 @@ StatusCode CpmRoiByteStreamTool::convert( while (payload != payloadEnd) { if (L1CaloSubBlock::wordType(*payload) == L1CaloSubBlock::HEADER) { - m_subBlock->clear(); - payload = m_subBlock->read(payload, payloadEnd); + subBlock.clear(); + payload = subBlock.read(payload, payloadEnd); if (debug) { - msg() << "CPM RoI sub-block: Crate " << m_subBlock->crate() - << " Module " << m_subBlock->module() << endmsg; + msg() << "CPM RoI sub-block: Crate " << subBlock.crate() + << " Module " << subBlock.module() << endmsg; } // Unpack sub-block - if (m_subBlock->dataWords() && !m_subBlock->unpack()) { + if (subBlock.dataWords() && !subBlock.unpack()) { if (debug) { - std::string errMsg(m_subBlock->unpackErrorMsg()); + std::string errMsg(subBlock.unpackErrorMsg()); msg() << "CPM RoI sub-block unpacking failed: " << errMsg << endmsg; } - rodErr = m_subBlock->unpackErrorCode(); + rodErr = subBlock.unpackErrorCode(); break; } const int numChips = 8; const int numLocs = 2; for (int chip = 0; chip < numChips; ++chip) { for (int loc = 0; loc < numLocs; ++loc) { - const LVL1::CPMRoI roi = m_subBlock->roi(chip, loc); + const LVL1::CPMRoI roi = subBlock.roi(chip, loc); if (roi.hits() || roi.error()) { roiCollection->push_back(new LVL1::CPMRoI(roi)); } @@ -277,27 +259,31 @@ StatusCode CpmRoiByteStreamTool::convert( StatusCode CpmRoiByteStreamTool::convert( const DataVector<LVL1::CPMRoI>* const roiCollection, - RawEventWrite* const re) + RawEventWrite* const re) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); // Clear the event assembler - m_fea->clear(); - const uint16_t minorVersion = m_srcIdMap->minorVersion(); - m_fea->setRodMinorVersion(minorVersion); - m_rodStatusMap.clear(); + FullEventAssembler<L1CaloSrcIdMap> fea; + const uint16_t minorVersion = m_srcIdMap.minorVersion(); + fea.setRodMinorVersion(minorVersion); // Pointer to ROD data vector FullEventAssembler<L1CaloSrcIdMap>::RODDATA* theROD = 0; + // Sub-block for neutral format + CpmRoiSubBlock subBlock; + // Set up the container map - setupCpmRoiMap(roiCollection); - CpmRoiMap::const_iterator mapIter = m_roiMap.begin(); - CpmRoiMap::const_iterator mapIterEnd = m_roiMap.end(); + // CPM RoI map + CpmRoiMap roiMap; + setupCpmRoiMap(roiCollection, roiMap); + CpmRoiMap::const_iterator mapIter = roiMap.begin(); + CpmRoiMap::const_iterator mapIterEnd = roiMap.end(); // Loop over data @@ -322,22 +308,21 @@ StatusCode CpmRoiByteStreamTool::convert( << "Data Version/Format: " << m_version << " " << m_dataFormat << endmsg; } - const uint32_t rodIdCpm = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, + const uint32_t rodIdCpm = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, m_subDetector); - theROD = m_fea->getRodData(rodIdCpm); + theROD = fea.getRodData(rodIdCpm); if (neutralFormat) { const L1CaloUserHeader userHeader; theROD->push_back(userHeader.header()); } - m_rodStatusMap.insert(make_pair(rodIdCpm, m_rodStatus)); } if (debug) msg() << "Module " << module << endmsg; // Create a sub-block (Neutral format only) if (neutralFormat) { - m_subBlock->clear(); - m_subBlock->setRoiHeader(m_version, hwCrate, module); + subBlock.clear(); + subBlock.setRoiHeader(m_version, hwCrate, module); } // Find CPM RoIs for this module @@ -349,7 +334,7 @@ StatusCode CpmRoiByteStreamTool::convert( if (roi->cpm() < module) continue; if (roi->cpm() > module) break; if (roi->hits() || roi->error()) { - if (neutralFormat) m_subBlock->fillRoi(*roi); + if (neutralFormat) subBlock.fillRoi(*roi); else theROD->push_back(roi->roiWord()); } } @@ -357,71 +342,94 @@ StatusCode CpmRoiByteStreamTool::convert( // Pack and write the sub-block if (neutralFormat) { - if ( !m_subBlock->pack()) { + if ( !subBlock.pack()) { msg(MSG::ERROR) << "CPMRoI sub-block packing failed" << endmsg; return StatusCode::FAILURE; } if (debug) { msg() << "CPMRoI sub-block data words: " - << m_subBlock->dataWords() << endmsg; + << subBlock.dataWords() << endmsg; } - m_subBlock->write(theROD); + subBlock.write(theROD); } } } // Fill the raw event - m_fea->fill(re, msg()); - - // Set ROD status words - - //L1CaloRodStatus::setStatus(re, m_rodStatusMap, m_srcIdMap); + fea.fill(re, msg()); return StatusCode::SUCCESS; } // Return reference to vector with all possible Source Identifiers +std::vector<uint32_t> CpmRoiByteStreamTool::makeSourceIDs (bool roiDaq) const +{ + std::vector<uint32_t> sourceIDs; + + if (roiDaq) { + sourceIDs = m_sourceIDsProp; + } + else { + sourceIDs = m_sourceIDsRoIBProp; + } + + if (sourceIDs.empty()) { + const int maxCrates = m_crates + m_crateOffsetHw; + const int maxSlinks = m_srcIdMap.maxSlinks(); + for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) + { + for (int slink = 0; slink < maxSlinks; ++slink) + { + const int daqOrRoi = 1; + const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, + m_subDetector); + const uint32_t robId = m_srcIdMap.getRobID(rodId); + if (roiDaq) + { + if (slink < 2) sourceIDs.push_back(robId); + } + else if (slink >= 2) sourceIDs.push_back(robId); + } + } + + } + return sourceIDs; +} + const std::vector<uint32_t>& CpmRoiByteStreamTool::sourceIDs( - const std::string& sgKey) + const std::string& sgKey) const { const std::string flag("RoIB"); const std::string::size_type pos = sgKey.find(flag); const bool roiDaq = (pos == std::string::npos || pos != sgKey.length() - flag.length()); - const bool empty = (roiDaq) ? m_sourceIDs.empty() : m_sourceIDsRoIB.empty(); - if (empty) { - const int maxCrates = m_crates + m_crateOffsetHw; - const int maxSlinks = m_srcIdMap->maxSlinks(); - for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) { - for (int slink = 0; slink < maxSlinks; ++slink) { - const int daqOrRoi = 1; - const uint32_t rodId = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, - m_subDetector); - const uint32_t robId = m_srcIdMap->getRobID(rodId); - if (roiDaq) { - if (slink < 2) m_sourceIDs.push_back(robId); - } else if (slink >= 2) m_sourceIDsRoIB.push_back(robId); - } - } + + if (roiDaq) { + static const std::vector<uint32_t> sourceIDs = makeSourceIDs(roiDaq); + return sourceIDs; + } + else { + static const std::vector<uint32_t> sourceIDsRoIB = makeSourceIDs(roiDaq); + return sourceIDsRoIB; } - return (roiDaq) ? m_sourceIDs : m_sourceIDsRoIB; } // Set up CPM RoI map void CpmRoiByteStreamTool::setupCpmRoiMap(const CpmRoiCollection* - const roiCollection) + const roiCollection, + CpmRoiMap& roiMap) const { - m_roiMap.clear(); + roiMap.clear(); if (roiCollection) { CpmRoiCollection::const_iterator pos = roiCollection->begin(); CpmRoiCollection::const_iterator pose = roiCollection->end(); for (; pos != pose; ++pos) { const LVL1::CPMRoI* const roi = *pos; const uint32_t key = roi->roiWord(); - m_roiMap.insert(std::make_pair(key, roi)); + roiMap.insert(std::make_pair(key, roi)); } } } diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.h index 659ad2b1c08adc2ff00613ab4b7bb074fae9ab10..e2d38a4e3fa3c4a706d8c9e7c8b8e3812f306a85 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.h +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamTool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGT1CALOBYTESTREAM_CPMROIBYTESTREAMTOOL_H @@ -11,6 +11,7 @@ #include <string> #include <vector> +#include "L1CaloSrcIdMap.h" #include "AthenaBaseComps/AthAlgTool.h" #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h" #include "ByteStreamData/RawEvent.h" @@ -52,19 +53,18 @@ class CpmRoiByteStreamTool : public AthAlgTool { /// AlgTool InterfaceID static const InterfaceID& interfaceID(); - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; /// Convert ROB fragments to CPM RoIs StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMRoI>* roiCollection); + DataVector<LVL1::CPMRoI>* roiCollection) const; /// Convert CPM RoI to bytestream StatusCode convert(const DataVector<LVL1::CPMRoI>* roiCollection, - RawEventWrite* re); + RawEventWrite* re) const; /// Return reference to vector with all possible Source Identifiers - const std::vector<uint32_t>& sourceIDs(const std::string& sgKey); + const std::vector<uint32_t>& sourceIDs(const std::string& sgKey) const; private: @@ -74,45 +74,37 @@ class CpmRoiByteStreamTool : public AthAlgTool { typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType ROBPointer; typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer; + std::vector<uint32_t> makeSourceIDs (bool roiDaq) const; + /// Set up CPM RoI map - void setupCpmRoiMap(const CpmRoiCollection* roiCollection); + void setupCpmRoiMap(const CpmRoiCollection* roiCollection, + CpmRoiMap& roiMap) const; /// Error collection tool ToolHandle<LVL1BS::L1CaloErrorByteStreamTool> m_errorTool; - /// Hardware crate number offset + /// Property: Hardware crate number offset int m_crateOffsetHw; - /// Software crate number offset + /// Property: Software crate number offset int m_crateOffsetSw; - /// Sub_block header version + /// Property: Sub_block header version int m_version; - /// Data compression format + /// Property: Data compression format int m_dataFormat; /// Number of crates - int m_crates; + const int m_crates; /// Number of CPM modules per crate - int m_modules; - /// Number of slinks per crate when writing out bytestream + const int m_modules; + /// Property: Number of slinks per crate when writing out bytestream int m_slinks; - /// ROB source IDs - std::vector<uint32_t> m_sourceIDs; - /// ROB source IDs for RoIB - std::vector<uint32_t> m_sourceIDsRoIB; + /// Property: ROB source IDs + std::vector<uint32_t> m_sourceIDsProp; + /// Property: ROB source IDs for RoIB + std::vector<uint32_t> m_sourceIDsRoIBProp; /// Sub-detector type - eformat::SubDetector m_subDetector; + const eformat::SubDetector m_subDetector; /// Source ID converter - L1CaloSrcIdMap* m_srcIdMap; - /// Sub-block for neutral format - CpmRoiSubBlock* m_subBlock; - /// CPM RoI map - CpmRoiMap m_roiMap; - /// ROD Status words - std::vector<uint32_t>* m_rodStatus; - /// ROD status map - std::map<uint32_t, std::vector<uint32_t>* > m_rodStatusMap; - /// Event assembler - FullEventAssembler<L1CaloSrcIdMap>* m_fea; - + const L1CaloSrcIdMap m_srcIdMap; }; } // end namespace diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.cxx index 5778110f761ed0852b7030eb60d8e82ccd052540..c441b6957d02dcc5d63bcacfb2c35ad6c9a3389e 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ @@ -17,7 +17,6 @@ #include "CpmRoiSubBlockV1.h" #include "L1CaloErrorByteStreamTool.h" -#include "L1CaloSrcIdMap.h" #include "L1CaloUserHeader.h" #include "CpmRoiByteStreamV1Tool.h" @@ -41,8 +40,8 @@ CpmRoiByteStreamV1Tool::CpmRoiByteStreamV1Tool(const std::string& type, const IInterface* parent) : AthAlgTool(type, name, parent), m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"), - m_crates(4), m_modules(14), m_srcIdMap(0), m_subBlock(0), m_rodStatus(0), - m_fea(0) + m_crates(4), m_modules(14), + m_subDetector (eformat::TDAQ_CALO_CLUSTER_PROC_ROI) { declareInterface<CpmRoiByteStreamV1Tool>(this); @@ -54,9 +53,9 @@ CpmRoiByteStreamV1Tool::CpmRoiByteStreamV1Tool(const std::string& type, "Offset of CP crate numbers in RDOs"); // Properties for reading bytestream only - declareProperty("ROBSourceIDs", m_sourceIDs, + declareProperty("ROBSourceIDs", m_sourceIDsProp, "ROB fragment source identifiers"); - declareProperty("ROBSourceIDsRoIB", m_sourceIDsRoIB, + declareProperty("ROBSourceIDsRoIB", m_sourceIDsRoIBProp, "ROB fragment source identifiers for RoIBs"); // Properties for writing bytestream only @@ -84,31 +83,11 @@ CpmRoiByteStreamV1Tool::~CpmRoiByteStreamV1Tool() StatusCode CpmRoiByteStreamV1Tool::initialize() { - msg(MSG::INFO) << "Initializing " << name() << " - package version " - << PACKAGE_VERSION << endmsg; - - StatusCode sc = m_errorTool.retrieve(); - if (sc.isFailure()) { - msg(MSG::ERROR) << "Failed to retrieve tool " << m_errorTool << endmsg; - return sc; - } else msg(MSG::INFO) << "Retrieved tool " << m_errorTool << endmsg; - - m_subDetector = eformat::TDAQ_CALO_CLUSTER_PROC_ROI; - m_srcIdMap = new L1CaloSrcIdMap(); - m_rodStatus = new std::vector<uint32_t>(2); - m_subBlock = new CpmRoiSubBlockV1(); - m_fea = new FullEventAssembler<L1CaloSrcIdMap>(); - return StatusCode::SUCCESS; -} + ATH_MSG_INFO ("Initializing " << name() << " - package version " + << PACKAGE_VERSION); -// Finalize + ATH_CHECK( m_errorTool.retrieve() ); -StatusCode CpmRoiByteStreamV1Tool::finalize() -{ - delete m_fea; - delete m_subBlock; - delete m_rodStatus; - delete m_srcIdMap; return StatusCode::SUCCESS; } @@ -116,11 +95,14 @@ StatusCode CpmRoiByteStreamV1Tool::finalize() StatusCode CpmRoiByteStreamV1Tool::convert( const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMRoI>* const roiCollection) + DataVector<LVL1::CPMRoI>* const roiCollection) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); + // Sub-block for neutral format + CpmRoiSubBlockV1 subBlock; + // Loop over ROB fragments int robCount = 0; @@ -171,12 +153,12 @@ StatusCode CpmRoiByteStreamV1Tool::convert( // Check identifier const uint32_t sourceID = (*rob)->rod_source_id(); - if (m_srcIdMap->getRobID(sourceID) != robid || - m_srcIdMap->subDet(sourceID) != m_subDetector || - m_srcIdMap->daqOrRoi(sourceID) != 1 || - (m_srcIdMap->slink(sourceID) != 0 && m_srcIdMap->slink(sourceID) != 2) || - m_srcIdMap->crate(sourceID) < m_crateOffsetHw || - m_srcIdMap->crate(sourceID) >= m_crateOffsetHw + m_crates) { + if (m_srcIdMap.getRobID(sourceID) != robid || + m_srcIdMap.subDet(sourceID) != m_subDetector || + m_srcIdMap.daqOrRoi(sourceID) != 1 || + (m_srcIdMap.slink(sourceID) != 0 && m_srcIdMap.slink(sourceID) != 2) || + m_srcIdMap.crate(sourceID) < m_crateOffsetHw || + m_srcIdMap.crate(sourceID) >= m_crateOffsetHw + m_crates) { m_errorTool->rodError(robid, L1CaloSubBlock::ERROR_ROD_ID); if (debug) { msg() << "Wrong source identifier in data: " @@ -187,14 +169,14 @@ StatusCode CpmRoiByteStreamV1Tool::convert( // Check minor version const int minorVersion = (*rob)->rod_version() & 0xffff; - if (minorVersion > m_srcIdMap->minorVersionPreLS1()) { + if (minorVersion > m_srcIdMap.minorVersionPreLS1()) { if (debug) msg() << "Skipping post-LS1 data" << endmsg; continue; } - const int rodCrate = m_srcIdMap->crate(sourceID); + const int rodCrate = m_srcIdMap.crate(sourceID); if (debug) { msg() << "Treating crate " << rodCrate - << " slink " << m_srcIdMap->slink(sourceID) << endmsg; + << " slink " << m_srcIdMap.slink(sourceID) << endmsg; } // First word may be User Header @@ -217,26 +199,26 @@ StatusCode CpmRoiByteStreamV1Tool::convert( while (payload != payloadEnd) { if (L1CaloSubBlock::wordType(*payload) == L1CaloSubBlock::HEADER) { - m_subBlock->clear(); - payload = m_subBlock->read(payload, payloadEnd); + subBlock.clear(); + payload = subBlock.read(payload, payloadEnd); if (debug) { - msg() << "CPM RoI sub-block: Crate " << m_subBlock->crate() - << " Module " << m_subBlock->module() << endmsg; + msg() << "CPM RoI sub-block: Crate " << subBlock.crate() + << " Module " << subBlock.module() << endmsg; } // Unpack sub-block - if (m_subBlock->dataWords() && !m_subBlock->unpack()) { + if (subBlock.dataWords() && !subBlock.unpack()) { if (debug) { - std::string errMsg(m_subBlock->unpackErrorMsg()); + std::string errMsg(subBlock.unpackErrorMsg()); msg() << "CPM RoI sub-block unpacking failed: " << errMsg << endmsg; } - rodErr = m_subBlock->unpackErrorCode(); + rodErr = subBlock.unpackErrorCode(); break; } const int numChips = 8; const int numLocs = 2; for (int chip = 0; chip < numChips; ++chip) { for (int loc = 0; loc < numLocs; ++loc) { - const LVL1::CPMRoI roi = m_subBlock->roi(chip, loc); + const LVL1::CPMRoI roi = subBlock.roi(chip, loc); if (roi.hits() || roi.error()) { roiCollection->push_back(new LVL1::CPMRoI(roi)); } @@ -289,27 +271,31 @@ StatusCode CpmRoiByteStreamV1Tool::convert( StatusCode CpmRoiByteStreamV1Tool::convert( const DataVector<LVL1::CPMRoI>* const roiCollection, - RawEventWrite* const re) + RawEventWrite* const re) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); // Clear the event assembler - m_fea->clear(); - uint16_t minorVersion = m_srcIdMap->minorVersionPreLS1(); - m_fea->setRodMinorVersion(minorVersion); - m_rodStatusMap.clear(); + FullEventAssembler<L1CaloSrcIdMap> fea; + uint16_t minorVersion = m_srcIdMap.minorVersionPreLS1(); + fea.setRodMinorVersion(minorVersion); // Pointer to ROD data vector FullEventAssembler<L1CaloSrcIdMap>::RODDATA* theROD = 0; + // Sub-block for neutral format + CpmRoiSubBlockV1 subBlock; + // Set up the container map - setupCpmRoiMap(roiCollection); - CpmRoiMap::const_iterator mapIter = m_roiMap.begin(); - CpmRoiMap::const_iterator mapIterEnd = m_roiMap.end(); + // CPM RoI map + CpmRoiMap roiMap; + setupCpmRoiMap(roiCollection, roiMap); + CpmRoiMap::const_iterator mapIter = roiMap.begin(); + CpmRoiMap::const_iterator mapIterEnd = roiMap.end(); // Loop over data @@ -334,22 +320,21 @@ StatusCode CpmRoiByteStreamV1Tool::convert( << "Data Version/Format: " << m_version << " " << m_dataFormat << endmsg; } - const uint32_t rodIdCpm = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, + const uint32_t rodIdCpm = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, m_subDetector); - theROD = m_fea->getRodData(rodIdCpm); + theROD = fea.getRodData(rodIdCpm); if (neutralFormat) { const L1CaloUserHeader userHeader; theROD->push_back(userHeader.header()); } - m_rodStatusMap.insert(make_pair(rodIdCpm, m_rodStatus)); } if (debug) msg() << "Module " << module << endmsg; // Create a sub-block (Neutral format only) if (neutralFormat) { - m_subBlock->clear(); - m_subBlock->setRoiHeader(m_version, hwCrate, module); + subBlock.clear(); + subBlock.setRoiHeader(m_version, hwCrate, module); } // Find CPM RoIs for this module @@ -361,7 +346,7 @@ StatusCode CpmRoiByteStreamV1Tool::convert( if (roi->cpm() < module) continue; if (roi->cpm() > module) break; if (roi->hits() || roi->error()) { - if (neutralFormat) m_subBlock->fillRoi(*roi); + if (neutralFormat) subBlock.fillRoi(*roi); else theROD->push_back(roi->roiWord()); } } @@ -369,71 +354,94 @@ StatusCode CpmRoiByteStreamV1Tool::convert( // Pack and write the sub-block if (neutralFormat) { - if ( !m_subBlock->pack()) { + if ( !subBlock.pack()) { msg(MSG::ERROR) << "CPMRoI sub-block packing failed" << endmsg; return StatusCode::FAILURE; } if (debug) { msg() << "CPMRoI sub-block data words: " - << m_subBlock->dataWords() << endmsg; + << subBlock.dataWords() << endmsg; } - m_subBlock->write(theROD); + subBlock.write(theROD); } } } // Fill the raw event - m_fea->fill(re, msg()); - - // Set ROD status words - - //L1CaloRodStatus::setStatus(re, m_rodStatusMap, m_srcIdMap); + fea.fill(re, msg()); return StatusCode::SUCCESS; } // Return reference to vector with all possible Source Identifiers +std::vector<uint32_t> CpmRoiByteStreamV1Tool::makeSourceIDs (bool roiDaq) const +{ + std::vector<uint32_t> sourceIDs; + + if (roiDaq) { + sourceIDs = m_sourceIDsProp; + } + else { + sourceIDs = m_sourceIDsRoIBProp; + } + + if (sourceIDs.empty()) { + const int maxCrates = m_crates + m_crateOffsetHw; + const int maxSlinks = m_srcIdMap.maxSlinks(); + for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) + { + for (int slink = 0; slink < maxSlinks; ++slink) + { + const int daqOrRoi = 1; + const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, + m_subDetector); + const uint32_t robId = m_srcIdMap.getRobID(rodId); + if (roiDaq) + { + if (slink < 2) sourceIDs.push_back(robId); + } + else if (slink >= 2) sourceIDs.push_back(robId); + } + } + + } + return sourceIDs; +} + const std::vector<uint32_t>& CpmRoiByteStreamV1Tool::sourceIDs( - const std::string& sgKey) + const std::string& sgKey) const { const std::string flag("RoIB"); const std::string::size_type pos = sgKey.find(flag); const bool roiDaq = (pos == std::string::npos || pos != sgKey.length() - flag.length()); - const bool empty = (roiDaq) ? m_sourceIDs.empty() : m_sourceIDsRoIB.empty(); - if (empty) { - const int maxCrates = m_crates + m_crateOffsetHw; - const int maxSlinks = m_srcIdMap->maxSlinks(); - for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) { - for (int slink = 0; slink < maxSlinks; ++slink) { - const int daqOrRoi = 1; - const uint32_t rodId = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, - m_subDetector); - const uint32_t robId = m_srcIdMap->getRobID(rodId); - if (roiDaq) { - if (slink < 2) m_sourceIDs.push_back(robId); - } else if (slink >= 2) m_sourceIDsRoIB.push_back(robId); - } - } + + if (roiDaq) { + static const std::vector<uint32_t> sourceIDs = makeSourceIDs(roiDaq); + return sourceIDs; + } + else { + static const std::vector<uint32_t> sourceIDsRoIB = makeSourceIDs(roiDaq); + return sourceIDsRoIB; } - return (roiDaq) ? m_sourceIDs : m_sourceIDsRoIB; } // Set up CPM RoI map void CpmRoiByteStreamV1Tool::setupCpmRoiMap(const CpmRoiCollection* - const roiCollection) + const roiCollection, + CpmRoiMap& roiMap) const { - m_roiMap.clear(); + roiMap.clear(); if (roiCollection) { CpmRoiCollection::const_iterator pos = roiCollection->begin(); CpmRoiCollection::const_iterator pose = roiCollection->end(); for (; pos != pose; ++pos) { const LVL1::CPMRoI* const roi = *pos; const uint32_t key = roi->roiWord(); - m_roiMap.insert(std::make_pair(key, roi)); + roiMap.insert(std::make_pair(key, roi)); } } } diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.h index ba9165d0e58d234892f1fb7152f2a69ebaef61cf..d80b57497febd67dd8861bd7f9f195eda4ee9569 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.h +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV1Tool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGT1CALOBYTESTREAM_CPMROIBYTESTREAMV1TOOL_H @@ -11,6 +11,7 @@ #include <string> #include <vector> +#include "L1CaloSrcIdMap.h" #include "AthenaBaseComps/AthAlgTool.h" #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h" #include "ByteStreamData/RawEvent.h" @@ -52,19 +53,18 @@ class CpmRoiByteStreamV1Tool : public AthAlgTool { /// AlgTool InterfaceID static const InterfaceID& interfaceID(); - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; /// Convert ROB fragments to CPM RoIs StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMRoI>* roiCollection); + DataVector<LVL1::CPMRoI>* roiCollection) const; /// Convert CPM RoI to bytestream StatusCode convert(const DataVector<LVL1::CPMRoI>* roiCollection, - RawEventWrite* re); + RawEventWrite* re) const; /// Return reference to vector with all possible Source Identifiers - const std::vector<uint32_t>& sourceIDs(const std::string& sgKey); + const std::vector<uint32_t>& sourceIDs(const std::string& sgKey) const; private: @@ -74,49 +74,41 @@ class CpmRoiByteStreamV1Tool : public AthAlgTool { typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType ROBPointer; typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer; + std::vector<uint32_t> makeSourceIDs (bool roiDaq) const; + /// Set up CPM RoI map - void setupCpmRoiMap(const CpmRoiCollection* roiCollection); + void setupCpmRoiMap(const CpmRoiCollection* roiCollection, + CpmRoiMap& roiMap) const; - /// Error collection tool + /// Property: Error collection tool ToolHandle<LVL1BS::L1CaloErrorByteStreamTool> m_errorTool; - /// Hardware crate number offset + /// Property: Hardware crate number offset int m_crateOffsetHw; - /// Software crate number offset + /// Property: Software crate number offset int m_crateOffsetSw; - /// Sub_block header version + /// Property: Sub_block header version int m_version; - /// Data compression format + /// Property: Data compression format int m_dataFormat; /// Number of crates - int m_crates; + const int m_crates; /// Number of CPM modules per crate - int m_modules; - /// Number of slinks per crate when writing out bytestream + const int m_modules; + /// Property: Number of slinks per crate when writing out bytestream int m_slinks; - /// Minimum crate number when writing out bytestream + /// Property: Minimum crate number when writing out bytestream int m_crateMin; - /// Maximum crate number when writing out bytestream + /// Property: Maximum crate number when writing out bytestream int m_crateMax; - /// ROB source IDs - std::vector<uint32_t> m_sourceIDs; - /// ROB source IDs for RoIB - std::vector<uint32_t> m_sourceIDsRoIB; + /// Property: ROB source IDs + std::vector<uint32_t> m_sourceIDsProp; + /// Property: ROB source IDs for RoIB + std::vector<uint32_t> m_sourceIDsRoIBProp; /// Sub-detector type - eformat::SubDetector m_subDetector; + const eformat::SubDetector m_subDetector; /// Source ID converter - L1CaloSrcIdMap* m_srcIdMap; - /// Sub-block for neutral format - CpmRoiSubBlockV1* m_subBlock; - /// CPM RoI map - CpmRoiMap m_roiMap; - /// ROD Status words - std::vector<uint32_t>* m_rodStatus; - /// ROD status map - std::map<uint32_t, std::vector<uint32_t>* > m_rodStatusMap; - /// Event assembler - FullEventAssembler<L1CaloSrcIdMap>* m_fea; - + const L1CaloSrcIdMap m_srcIdMap; }; } // end namespace diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.cxx index 270c25c0818764ad40e0c783c15a892c8b1a91cf..da54e63937f58485f4f023ec22dda22b260ff310 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ @@ -43,8 +43,8 @@ CpmRoiByteStreamV2Tool::CpmRoiByteStreamV2Tool(const std::string &type, : AthAlgTool(type, name, parent), m_robDataProvider("ROBDataProviderSvc", name), m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"), - m_crates(4), m_modules(14), m_srcIdMap(0), m_subBlock(0), m_rodStatus(0), - m_fea(0) + m_crates(4), m_modules(14), + m_subDetector (eformat::TDAQ_CALO_CLUSTER_PROC_ROI) { declareInterface<CpmRoiByteStreamV2Tool>(this); @@ -56,9 +56,9 @@ CpmRoiByteStreamV2Tool::CpmRoiByteStreamV2Tool(const std::string &type, "Offset of CP crate numbers in RDOs"); // Properties for reading bytestream only - declareProperty("ROBSourceIDs", m_sourceIDs, + declareProperty("ROBSourceIDs", m_sourceIDsProp, "ROB fragment source identifiers"); - declareProperty("ROBSourceIDsRoIB", m_sourceIDsRoIB, + declareProperty("ROBSourceIDsRoIB", m_sourceIDsRoIBProp, "ROB fragment source identifiers for RoIBs"); // Properties for writing bytestream only @@ -89,33 +89,11 @@ CpmRoiByteStreamV2Tool::~CpmRoiByteStreamV2Tool() StatusCode CpmRoiByteStreamV2Tool::initialize() { - msg(MSG::INFO) << "Initializing " << name() << " - package version " - << PACKAGE_VERSION << endmsg; + ATH_MSG_INFO ("Initializing " << name() << " - package version " + << PACKAGE_VERSION); - StatusCode sc = m_errorTool.retrieve(); - if (sc.isFailure()) - { - msg(MSG::ERROR) << "Failed to retrieve tool " << m_errorTool << endmsg; - return sc; - } - else msg(MSG::INFO) << "Retrieved tool " << m_errorTool << endmsg; - - m_subDetector = eformat::TDAQ_CALO_CLUSTER_PROC_ROI; - m_srcIdMap = new L1CaloSrcIdMap(); - m_rodStatus = new std::vector<uint32_t>(2); - m_subBlock = new CpmRoiSubBlockV2(); - m_fea = new FullEventAssembler<L1CaloSrcIdMap>(); - return StatusCode::SUCCESS; -} - -// Finalize + ATH_CHECK( m_errorTool.retrieve() ); -StatusCode CpmRoiByteStreamV2Tool::finalize() -{ - delete m_fea; - delete m_subBlock; - delete m_rodStatus; - delete m_srcIdMap; return StatusCode::SUCCESS; } @@ -123,7 +101,7 @@ StatusCode CpmRoiByteStreamV2Tool::finalize() StatusCode CpmRoiByteStreamV2Tool::convert( const std::string& sgKey, - DataVector<LVL1::CPMTobRoI> *const collection) + DataVector<LVL1::CPMTobRoI> *const collection) const { const std::vector<uint32_t>& vID(sourceIDs(sgKey)); // // get ROB fragments @@ -135,11 +113,14 @@ StatusCode CpmRoiByteStreamV2Tool::convert( StatusCode CpmRoiByteStreamV2Tool::convert( const IROBDataProviderSvc::VROBFRAG &robFrags, - DataVector<LVL1::CPMTobRoI> *const roiCollection) + DataVector<LVL1::CPMTobRoI> *const roiCollection) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); + // Sub-block for neutral format + CpmRoiSubBlockV2 subBlock; + // Loop over ROB fragments int robCount = 0; @@ -196,12 +177,12 @@ StatusCode CpmRoiByteStreamV2Tool::convert( // Check identifier const uint32_t sourceID = (*rob)->rod_source_id(); - if (m_srcIdMap->getRobID(sourceID) != robid || - m_srcIdMap->subDet(sourceID) != m_subDetector || - m_srcIdMap->daqOrRoi(sourceID) != 1 || - (m_srcIdMap->slink(sourceID) != 0 && m_srcIdMap->slink(sourceID) != 2) || - m_srcIdMap->crate(sourceID) < m_crateOffsetHw || - m_srcIdMap->crate(sourceID) >= m_crateOffsetHw + m_crates) + if (m_srcIdMap.getRobID(sourceID) != robid || + m_srcIdMap.subDet(sourceID) != m_subDetector || + m_srcIdMap.daqOrRoi(sourceID) != 1 || + (m_srcIdMap.slink(sourceID) != 0 && m_srcIdMap.slink(sourceID) != 2) || + m_srcIdMap.crate(sourceID) < m_crateOffsetHw || + m_srcIdMap.crate(sourceID) >= m_crateOffsetHw + m_crates) { m_errorTool->rodError(robid, L1CaloSubBlock::ERROR_ROD_ID); if (debug) @@ -214,16 +195,16 @@ StatusCode CpmRoiByteStreamV2Tool::convert( // Check minor version const int minorVersion = (*rob)->rod_version() & 0xffff; - if (minorVersion <= m_srcIdMap->minorVersionPreLS1()) + if (minorVersion <= m_srcIdMap.minorVersionPreLS1()) { if (debug) msg() << "Skipping pre-LS1 data" << endmsg; continue; } - const int rodCrate = m_srcIdMap->crate(sourceID); + const int rodCrate = m_srcIdMap.crate(sourceID); if (debug) { msg() << "Treating crate " << rodCrate - << " slink " << m_srcIdMap->slink(sourceID) << endmsg; + << " slink " << m_srcIdMap.slink(sourceID) << endmsg; } // First word may be User Header @@ -250,22 +231,22 @@ StatusCode CpmRoiByteStreamV2Tool::convert( if (L1CaloSubBlock::wordType(*payload) == L1CaloSubBlock::HEADER) { - m_subBlock->clear(); - payload = m_subBlock->read(payload, payloadEnd); + subBlock.clear(); + payload = subBlock.read(payload, payloadEnd); if (debug) { - msg() << "CPM RoI sub-block: Crate " << m_subBlock->crate() - << " Module " << m_subBlock->module() << endmsg; + msg() << "CPM RoI sub-block: Crate " << subBlock.crate() + << " Module " << subBlock.module() << endmsg; } // Unpack sub-block - if (m_subBlock->dataWords() && !m_subBlock->unpack()) + if (subBlock.dataWords() && !subBlock.unpack()) { if (debug) { - std::string errMsg(m_subBlock->unpackErrorMsg()); + std::string errMsg(subBlock.unpackErrorMsg()); msg() << "CPM RoI sub-block unpacking failed: " << errMsg << endmsg; } - rodErr = m_subBlock->unpackErrorCode(); + rodErr = subBlock.unpackErrorCode(); break; } const int numChips = 8; @@ -277,7 +258,7 @@ StatusCode CpmRoiByteStreamV2Tool::convert( { for (int type = 0; type < numTypes; ++type) { - const LVL1::CPMTobRoI roi = m_subBlock->roi(chip, loc, type); + const LVL1::CPMTobRoI roi = subBlock.roi(chip, loc, type); if (roi.energy() || roi.isolation()) { roiCollection->push_back(new LVL1::CPMTobRoI(roi)); @@ -351,34 +332,38 @@ StatusCode CpmRoiByteStreamV2Tool::convert( StatusCode CpmRoiByteStreamV2Tool::convert( const DataVector<LVL1::CPMTobRoI> *const roiCollection, - RawEventWrite *const re) + RawEventWrite *const re) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); // Clear the event assembler - - m_fea->clear(); - const uint16_t minorVersion = m_srcIdMap->minorVersion(); - m_fea->setRodMinorVersion(minorVersion); - m_rodStatusMap.clear(); + FullEventAssembler<L1CaloSrcIdMap> fea; + const uint16_t minorVersion = m_srcIdMap.minorVersion(); + fea.setRodMinorVersion(minorVersion); // Pointer to ROD data vector FullEventAssembler<L1CaloSrcIdMap>::RODDATA *theROD = 0; + // Sub-block for neutral format + CpmRoiSubBlockV2 subBlock; + // Set up the container map - setupCpmRoiMap(roiCollection); + // CPM RoI map + CpmRoiMap roiMap; + setupCpmRoiMap(roiCollection, roiMap); + if (debug) { msg() << "Number of RoIs to be written = " << roiCollection->size() - << " (collection), " << m_roiMap.size() << " (map)" + << " (collection), " << roiMap.size() << " (map)" << endmsg; } int count = 0; - CpmRoiMap::const_iterator mapIter = m_roiMap.begin(); - CpmRoiMap::const_iterator mapIterEnd = m_roiMap.end(); + CpmRoiMap::const_iterator mapIter = roiMap.begin(); + CpmRoiMap::const_iterator mapIterEnd = roiMap.end(); // Loop over data @@ -407,15 +392,14 @@ StatusCode CpmRoiByteStreamV2Tool::convert( << "Data Version/Format: " << m_version << " " << m_dataFormat << endmsg; } - const uint32_t rodIdCpm = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, + const uint32_t rodIdCpm = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, m_subDetector); - theROD = m_fea->getRodData(rodIdCpm); + theROD = fea.getRodData(rodIdCpm); if (neutralFormat) { const L1CaloUserHeader userHeader; theROD->push_back(userHeader.header()); } - m_rodStatusMap.insert(make_pair(rodIdCpm, m_rodStatus)); } if (debug) msg() << "Module " << module << endmsg; @@ -423,8 +407,8 @@ StatusCode CpmRoiByteStreamV2Tool::convert( if (neutralFormat) { - m_subBlock->clear(); - m_subBlock->setRoiHeader(m_version, hwCrate, module); + subBlock.clear(); + subBlock.setRoiHeader(m_version, hwCrate, module); } // Find CPM RoIs for this module @@ -438,7 +422,7 @@ StatusCode CpmRoiByteStreamV2Tool::convert( if (roi->cpm() > module) break; if (roi->energy() || roi->isolation()) { - if (neutralFormat) m_subBlock->fillRoi(*roi); + if (neutralFormat) subBlock.fillRoi(*roi); else theROD->push_back(roi->roiWord()); ++count; } @@ -448,7 +432,7 @@ StatusCode CpmRoiByteStreamV2Tool::convert( if (neutralFormat) { - if ( !m_subBlock->pack()) + if ( !subBlock.pack()) { msg(MSG::ERROR) << "CPMTobRoI sub-block packing failed" << endmsg; return StatusCode::FAILURE; @@ -456,9 +440,9 @@ StatusCode CpmRoiByteStreamV2Tool::convert( if (debug) { msg() << "CPMTobRoI sub-block data words: " - << m_subBlock->dataWords() << endmsg; + << subBlock.dataWords() << endmsg; } - m_subBlock->write(theROD); + subBlock.write(theROD); } } } @@ -469,55 +453,73 @@ StatusCode CpmRoiByteStreamV2Tool::convert( // Fill the raw event - m_fea->fill(re, msg()); + fea.fill(re, msg()); if (debug) msg() << MSG::dec; // fill seems to leave it in hex - // Set ROD status words - - //L1CaloRodStatus::setStatus(re, m_rodStatusMap, m_srcIdMap); - return StatusCode::SUCCESS; } // Return reference to vector with all possible Source Identifiers -const std::vector<uint32_t> &CpmRoiByteStreamV2Tool::sourceIDs( - const std::string &sgKey) +std::vector<uint32_t> CpmRoiByteStreamV2Tool::makeSourceIDs (bool roiDaq) const { - const std::string flag("RoIB"); - const std::string::size_type pos = sgKey.find(flag); - const bool roiDaq = - (pos == std::string::npos || pos != sgKey.length() - flag.length()); - const bool empty = (roiDaq) ? m_sourceIDs.empty() : m_sourceIDsRoIB.empty(); - if (empty) - { + std::vector<uint32_t> sourceIDs; + + if (roiDaq) { + sourceIDs = m_sourceIDsProp; + } + else { + sourceIDs = m_sourceIDsRoIBProp; + } + + if (sourceIDs.empty()) { const int maxCrates = m_crates + m_crateOffsetHw; - const int maxSlinks = m_srcIdMap->maxSlinks(); + const int maxSlinks = m_srcIdMap.maxSlinks(); for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) { for (int slink = 0; slink < maxSlinks; ++slink) { const int daqOrRoi = 1; - const uint32_t rodId = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, + const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, m_subDetector); - const uint32_t robId = m_srcIdMap->getRobID(rodId); + const uint32_t robId = m_srcIdMap.getRobID(rodId); if (roiDaq) { - if (slink < 2) m_sourceIDs.push_back(robId); + if (slink < 2) sourceIDs.push_back(robId); } - else if (slink >= 2) m_sourceIDsRoIB.push_back(robId); + else if (slink >= 2) sourceIDs.push_back(robId); } } + + } + return sourceIDs; +} + +const std::vector<uint32_t> &CpmRoiByteStreamV2Tool::sourceIDs( + const std::string &sgKey) const +{ + const std::string flag("RoIB"); + const std::string::size_type pos = sgKey.find(flag); + const bool roiDaq = + (pos == std::string::npos || pos != sgKey.length() - flag.length()); + + if (roiDaq) { + static const std::vector<uint32_t> sourceIDs = makeSourceIDs(roiDaq); + return sourceIDs; + } + else { + static const std::vector<uint32_t> sourceIDsRoIB = makeSourceIDs(roiDaq); + return sourceIDsRoIB; } - return (roiDaq) ? m_sourceIDs : m_sourceIDsRoIB; } // Set up CPM RoI map void CpmRoiByteStreamV2Tool::setupCpmRoiMap(const CpmRoiCollection * - const roiCollection) + const roiCollection, + CpmRoiMap& roiMap) const { - m_roiMap.clear(); + roiMap.clear(); if (roiCollection) { CpmRoiCollection::const_iterator pos = roiCollection->begin(); @@ -531,7 +533,7 @@ void CpmRoiByteStreamV2Tool::setupCpmRoiMap(const CpmRoiCollection * const int chip = roi->chip(); const int loc = roi->location() >> 2; const uint32_t key = (((((((crate << 4) | cpm) << 3) | chip) << 1) | loc) << 1) | type; - m_roiMap.insert(std::make_pair(key, roi)); + roiMap.insert(std::make_pair(key, roi)); } } } diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.h index 21c816f972ddd951978f6fe2829a1f8ac7b65a66..fc56c0a6a8b317d8c8d46cd1f74c728eb6e17bac 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.h +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpmRoiByteStreamV2Tool.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ #ifndef TRIGT1CALOBYTESTREAM_CPMROIBYTESTREAMV2TOOL_H @@ -11,6 +11,7 @@ #include <string> #include <vector> +#include "L1CaloSrcIdMap.h" #include "AthenaBaseComps/AthAlgTool.h" #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h" #include "ByteStreamData/RawEvent.h" @@ -52,21 +53,20 @@ class CpmRoiByteStreamV2Tool : public AthAlgTool { /// AlgTool InterfaceID static const InterfaceID& interfaceID(); - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; /// Convert ROB fragments to CPM RoIs StatusCode convert(const std::string& robFrags, - DataVector<LVL1::CPMTobRoI>* roiCollection); + DataVector<LVL1::CPMTobRoI>* roiCollection) const; StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMTobRoI>* roiCollection); + DataVector<LVL1::CPMTobRoI>* roiCollection) const; /// Convert CPM RoI to bytestream StatusCode convert(const DataVector<LVL1::CPMTobRoI>* roiCollection, - RawEventWrite* re); + RawEventWrite* re) const; /// Return reference to vector with all possible Source Identifiers - const std::vector<uint32_t>& sourceIDs(const std::string& sgKey); + const std::vector<uint32_t>& sourceIDs(const std::string& sgKey) const; private: @@ -76,54 +76,46 @@ class CpmRoiByteStreamV2Tool : public AthAlgTool { typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType ROBPointer; typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer; + std::vector<uint32_t> makeSourceIDs (bool roiDaq) const; + /// Set up CPM RoI map - void setupCpmRoiMap(const CpmRoiCollection* roiCollection); + void setupCpmRoiMap(const CpmRoiCollection* roiCollection, + CpmRoiMap& roiMap) const; ServiceHandle<IROBDataProviderSvc> m_robDataProvider; - /// Error collection tool + /// Property: Error collection tool ToolHandle<LVL1BS::L1CaloErrorByteStreamTool> m_errorTool; - /// Hardware crate number offset + /// Property: Hardware crate number offset int m_crateOffsetHw; - /// Software crate number offset + /// Property: Software crate number offset int m_crateOffsetSw; - /// Sub_block header version + /// Property: Sub_block header version int m_version; - /// Data compression format + /// Property: Data compression format int m_dataFormat; /// Number of crates - int m_crates; + const int m_crates; /// Number of CPM modules per crate - int m_modules; - /// Number of slinks per crate when writing out bytestream + const int m_modules; + /// Property: Number of slinks per crate when writing out bytestream int m_slinks; - /// Minimum crate number when writing out bytestream + /// Property: Minimum crate number when writing out bytestream int m_crateMin; - /// Maximum crate number when writing out bytestream + /// Property: Maximum crate number when writing out bytestream int m_crateMax; - /// ROB source IDs - std::vector<uint32_t> m_sourceIDs; - /// ROB source IDs for RoIB - std::vector<uint32_t> m_sourceIDsRoIB; + /// Property: ROB source IDs + std::vector<uint32_t> m_sourceIDsProp; + /// Property: ROB source IDs for RoIB + std::vector<uint32_t> m_sourceIDsRoIBProp; /// Sub-detector type - eformat::SubDetector m_subDetector; + const eformat::SubDetector m_subDetector; /// Source ID converter - L1CaloSrcIdMap* m_srcIdMap; - /// Sub-block for neutral format - CpmRoiSubBlockV2* m_subBlock; - /// CPM RoI map - CpmRoiMap m_roiMap; - /// ROD Status words - std::vector<uint32_t>* m_rodStatus; - /// ROD status map - std::map<uint32_t, std::vector<uint32_t>* > m_rodStatusMap; - /// Event assembler - FullEventAssembler<L1CaloSrcIdMap>* m_fea; - - // M7 format follows old specification, so we have two zeros + const L1CaloSrcIdMap m_srcIdMap; + + // Property: M7 format follows old specification, so we have two zeros // as most significant bits instead of 0xa bool m_isM7Format; - }; } // end namespace