diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/RodHeaderByteStreamTool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/RodHeaderByteStreamTool.cxx index e92cd31d979c2538c65e9e4bf7d0b61945c1261a..edbf29adc20a4bc86a9e2a67a5590bf24a01661c 100644 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/RodHeaderByteStreamTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/RodHeaderByteStreamTool.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 */ @@ -48,30 +48,28 @@ RodHeaderByteStreamTool::RodHeaderByteStreamTool(const std::string& type, const IInterface* parent) : AthAlgTool(type, name, parent), m_robDataProvider("ROBDataProviderSvc", name), - m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"), - m_srcIdMap(0) + m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool") { declareInterface<RodHeaderByteStreamTool>(this); declareProperty("ErrorTool", m_errorTool, "Tool to collect errors for monitoring"); - declareProperty("ROBSourceIDs", m_sourceIDs, + declareProperty("ROBSourceIDs", m_sourceIDsProp, "ROB fragment source identifiers - All except RoIB"); - declareProperty("ROBSourceIDsPP", m_sourceIDsPP, + declareProperty("ROBSourceIDsPP", m_sourceIDsPPProp, "ROB fragment source identifiers - PP only"); - declareProperty("ROBSourceIDsCP", m_sourceIDsCP, + declareProperty("ROBSourceIDsCP", m_sourceIDsCPProp, "ROB fragment source identifiers - CP DAQ only"); - declareProperty("ROBSourceIDsJEP", m_sourceIDsJEP, + declareProperty("ROBSourceIDsJEP", m_sourceIDsJEPProp, "ROB fragment source identifiers - JEP DAQ only"); - declareProperty("ROBSourceIDsCPRoI", m_sourceIDsCPRoI, + declareProperty("ROBSourceIDsCPRoI", m_sourceIDsCPRoIProp, "ROB fragment source identifiers - CP RoI only"); - declareProperty("ROBSourceIDsJEPRoI", m_sourceIDsJEPRoI, + declareProperty("ROBSourceIDsJEPRoI", m_sourceIDsJEPRoIProp, "ROB fragment source identifiers - JEP RoI only"); - declareProperty("ROBSourceIDsCPRoIB", m_sourceIDsCPRoIB, + declareProperty("ROBSourceIDsCPRoIB", m_sourceIDsCPRoIBProp, "ROB fragment source identifiers - CP RoIB only"); - declareProperty("ROBSourceIDsJEPRoIB", m_sourceIDsJEPRoIB, + declareProperty("ROBSourceIDsJEPRoIB", m_sourceIDsJEPRoIBProp, "ROB fragment source identifiers - JEP RoIB only"); - } // Destructor @@ -85,16 +83,11 @@ RodHeaderByteStreamTool::~RodHeaderByteStreamTool() StatusCode RodHeaderByteStreamTool::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; + ATH_CHECK( m_errorTool.retrieve() ); - m_srcIdMap = new L1CaloSrcIdMap(); return StatusCode::SUCCESS; } @@ -102,7 +95,6 @@ StatusCode RodHeaderByteStreamTool::initialize() StatusCode RodHeaderByteStreamTool::finalize() { - delete m_srcIdMap; return StatusCode::SUCCESS; } @@ -111,7 +103,7 @@ StatusCode RodHeaderByteStreamTool::finalize() // Conversion bytestream to CMX-CP TOBs StatusCode RodHeaderByteStreamTool::convert( const std::string& sgKey, - DataVector<LVL1::RODHeader>* const rhCollection) + DataVector<LVL1::RODHeader>* const rhCollection) const { const std::vector<uint32_t>& vID(sourceIDs(sgKey)); // // get ROB fragments @@ -123,7 +115,7 @@ StatusCode RodHeaderByteStreamTool::convert( StatusCode RodHeaderByteStreamTool::convert( const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::RODHeader>* const rhCollection) + DataVector<LVL1::RODHeader>* const rhCollection) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); @@ -211,104 +203,113 @@ StatusCode RodHeaderByteStreamTool::convert( // Return reference to vector with all possible Source Identifiers const std::vector<uint32_t>& RodHeaderByteStreamTool::sourceIDs( - const std::string& sgKey) + const std::string& sgKey) const { - const bool pp = isAppended(sgKey, "PP"); - const bool cp = isAppended(sgKey, "CP"); - const bool jep = isAppended(sgKey, "JEP"); - const bool cpRoi = isAppended(sgKey, "CPRoI"); - const bool jepRoi = isAppended(sgKey, "JEPRoI"); - const bool cpRoib = isAppended(sgKey, "CPRoIB"); - const bool jepRoib = isAppended(sgKey, "JEPRoIB"); - const bool all = !(pp || cp || jep || cpRoi || jepRoi || cpRoib || jepRoib); - if (all && !m_sourceIDs.empty()) return m_sourceIDs; - if (pp && !m_sourceIDsPP.empty()) return m_sourceIDsPP; - if (cp && !m_sourceIDsCP.empty()) return m_sourceIDsCP; - if (jep && !m_sourceIDsJEP.empty()) return m_sourceIDsJEP; - if (cpRoi && !m_sourceIDsCPRoI.empty()) return m_sourceIDsCPRoI; - if (jepRoi && !m_sourceIDsJEPRoI.empty()) return m_sourceIDsJEPRoI; - if (cpRoib && !m_sourceIDsCPRoIB.empty()) return m_sourceIDsCPRoIB; - if (jepRoib && !m_sourceIDsJEPRoIB.empty()) return m_sourceIDsJEPRoIB; - // PP - if (all || pp) { - std::vector<int> slinks(4); - for (int i = 1; i < 4; ++i) slinks[i] = i; - fillRobIds(all, 8, 0, slinks, 0, eformat::TDAQ_CALO_PREPROC, - m_sourceIDsPP); - if (pp) return m_sourceIDsPP; + if (isAppended(sgKey, "PP")) { + static const std::vector<int> slinksPP { 0, 1, 2, 3 }; + static const std::vector<uint32_t> sourceIDsPP = + makeRobIds(8, 0, slinksPP, 0, eformat::TDAQ_CALO_PREPROC, + m_sourceIDsPPProp); + return sourceIDsPP; } - // CP - if (all || cp) { - std::vector<int> slinks(2); - slinks[1] = 2; - fillRobIds(all, 4, 8, slinks, 0, eformat::TDAQ_CALO_CLUSTER_PROC_DAQ, - m_sourceIDsCP); - if (cp) return m_sourceIDsCP; + + if (isAppended(sgKey, "CP")) { + static const std::vector<int> slinksCP { 0, 2 }; + static const std::vector<uint32_t> sourceIDsCP = + makeRobIds(4, 8, slinksCP, 0, eformat::TDAQ_CALO_CLUSTER_PROC_DAQ, + m_sourceIDsCPProp); + return sourceIDsCP; } - // CP RoI - if (all || cpRoi) { - const std::vector<int> slinks(1); - fillRobIds(all, 4, 8, slinks, 1, eformat::TDAQ_CALO_CLUSTER_PROC_ROI, - m_sourceIDsCPRoI); - if (cpRoi) return m_sourceIDsCPRoI; + + if (isAppended(sgKey, "CPRoI")) { + static const std::vector<int> slinksCPRoI { 0 }; + static const std::vector<uint32_t> sourceIDsCPRoI = + makeRobIds(4, 8, slinksCPRoI, 1, eformat::TDAQ_CALO_CLUSTER_PROC_ROI, + m_sourceIDsCPRoIProp); + return sourceIDsCPRoI; } - // JEP - if (all || jep) { - std::vector<int> slinks(4); - for (int i = 1; i < 4; ++i) slinks[i] = i; - fillRobIds(all, 2, 12, slinks, 0, eformat::TDAQ_CALO_JET_PROC_DAQ, - m_sourceIDsJEP); - if (jep) return m_sourceIDsJEP; + + if (isAppended(sgKey, "JEP")) { + static const std::vector<int> slinksJEP { 0, 1, 2, 3 }; + static const std::vector<uint32_t> sourceIDsJEP = + makeRobIds(2, 12, slinksJEP, 0, eformat::TDAQ_CALO_JET_PROC_DAQ, + m_sourceIDsJEPProp); + return sourceIDsJEP; } - // JEP RoI - if (all || jepRoi) { - const std::vector<int> slinks(1); - fillRobIds(all, 2, 12, slinks, 1, eformat::TDAQ_CALO_JET_PROC_ROI, - m_sourceIDsJEPRoI); - if (jepRoi) return m_sourceIDsJEPRoI; + + if (isAppended(sgKey, "JEPRoI")) { + static const std::vector<int> slinksJEPRoI { 0 }; + static const std::vector<uint32_t> sourceIDsJEPRoI = + makeRobIds(2, 12, slinksJEPRoI, 1, eformat::TDAQ_CALO_JET_PROC_ROI, + m_sourceIDsJEPRoIProp); + return sourceIDsJEPRoI; } - // Don't include RoIBs (LVL2) in complete set - // CP RoIB - if (cpRoib) { - const std::vector<int> slinks(1, 2); - fillRobIds(false, 4, 8, slinks, 1, eformat::TDAQ_CALO_CLUSTER_PROC_ROI, - m_sourceIDsCPRoIB); - return m_sourceIDsCPRoIB; + + if (isAppended(sgKey, "CPRoIB")) { + static const std::vector<int> slinksCPRoIB { 2 }; + static const std::vector<uint32_t> sourceIDsCPRoIB = + makeRobIds(4, 8, slinksCPRoIB, 1, eformat::TDAQ_CALO_CLUSTER_PROC_ROI, + m_sourceIDsCPRoIBProp); + return sourceIDsCPRoIB; } - // JEP RoIB - if (jepRoib) { - const std::vector<int> slinks(1, 2); - fillRobIds(false, 2, 12, slinks, 1, eformat::TDAQ_CALO_JET_PROC_ROI, - m_sourceIDsJEPRoIB); - return m_sourceIDsJEPRoIB; + + if (isAppended(sgKey, "JEPRoIB")) { + static const std::vector<int> slinksJEPRoIB { 2 }; + static const std::vector<uint32_t> sourceIDsJEPRoIB = + makeRobIds(2, 12, slinksJEPRoIB, 1, eformat::TDAQ_CALO_JET_PROC_ROI, + m_sourceIDsJEPRoIBProp); + return sourceIDsJEPRoIB; } - return m_sourceIDs; + + // all + static const std::vector<uint32_t> sourceIDs = makeAllRobIds(); + return sourceIDs; } // Fill vector with ROB IDs for given sub-detector -void RodHeaderByteStreamTool::fillRobIds(const bool all, const int numCrates, +std::vector<uint32_t> RodHeaderByteStreamTool::makeAllRobIds() const +{ + std::vector<uint32_t> robIds; + + auto append = [&robIds] (const std::vector<uint32_t>& v) + { robIds.insert (robIds.end(), v.begin(), v.end()); }; + + append (sourceIDs ("PP")); + append (sourceIDs ("CP")); + append (sourceIDs ("CPRoI")); + append (sourceIDs ("JEP")); + append (sourceIDs ("JEPRoI")); + + // Don't include RoIBs (LVL2) in complete set + return robIds; +} + + +std::vector<uint32_t> RodHeaderByteStreamTool::makeRobIds(const int numCrates, const int crateOffset, const std::vector<int>& slinks, const int daqOrRoi, const eformat::SubDetector subdet, - std::vector<uint32_t>& detSourceIDs) + const std::vector<uint32_t>& prop) const { - if (all && !detSourceIDs.empty()) { - std::copy(detSourceIDs.begin(), detSourceIDs.end(), - std::back_inserter(m_sourceIDs)); - } else { + std::vector<uint32_t> robs; + + if (!prop.empty()) { + robs = prop; + } + else { for (int crate = 0; crate < numCrates; ++crate) { const int numSlinks = slinks.size(); for (int i = 0; i < numSlinks; ++i) { - const uint32_t rodId = m_srcIdMap->getRodID(crate + crateOffset, - slinks[i], daqOrRoi, subdet); - const uint32_t robId = m_srcIdMap->getRobID(rodId); - if (all) m_sourceIDs.push_back(robId); - else detSourceIDs.push_back(robId); + const uint32_t rodId = m_srcIdMap.getRodID(crate + crateOffset, + slinks[i], daqOrRoi, subdet); + const uint32_t robId = m_srcIdMap.getRobID(rodId); + robs.push_back (robId); } } } + return robs; } // Return true if StoreGate key ends in given string diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/RodHeaderByteStreamTool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/RodHeaderByteStreamTool.h index b76978053125fa3c351d25ecba80cc7d0c2c70af..73a5ea0fdc7e69abbf4437c4bef89f7fb8301c4e 100644 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/RodHeaderByteStreamTool.h +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/RodHeaderByteStreamTool.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_RODHEADERBYTESTREAMTOOL_H @@ -13,6 +13,7 @@ #include "eformat/SourceIdentifier.h" #include "GaudiKernel/ToolHandle.h" +#include "L1CaloSrcIdMap.h" #include "AthenaBaseComps/AthAlgTool.h" #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h" #include "ByteStreamData/RawEvent.h" @@ -49,18 +50,18 @@ class RodHeaderByteStreamTool : public AthAlgTool { /// AlgTool InterfaceID static const InterfaceID& interfaceID(); - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; /// Convert ROB fragments to RODHeaders StatusCode convert(const std::string& name, - DataVector<LVL1::RODHeader>* rhCollection); + DataVector<LVL1::RODHeader>* rhCollection) const; StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::RODHeader>* rhCollection); + DataVector<LVL1::RODHeader>* rhCollection) 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: typedef DataVector<LVL1::RODHeader> RodHeaderCollection; @@ -69,10 +70,12 @@ class RodHeaderByteStreamTool : public AthAlgTool { typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType RODPointer; /// Fill vector with ROB IDs for given sub-detector - void fillRobIds(bool all, int numCrates, int crateOffset, - const std::vector<int>& slinks, int daqOrRoi, - eformat::SubDetector subdet, - std::vector<uint32_t>& detSourceIDs); + std::vector<uint32_t> makeAllRobIds() const; + std::vector<uint32_t> + makeRobIds(int numCrates, int crateOffset, + const std::vector<int>& slinks, int daqOrRoi, + eformat::SubDetector subdet, + const std::vector<uint32_t>& prop) const; /// Return true if StoreGate key ends in given string bool isAppended(const std::string& sgKey, const std::string& flag) const; @@ -83,17 +86,16 @@ class RodHeaderByteStreamTool : public AthAlgTool { ToolHandle<LVL1BS::L1CaloErrorByteStreamTool> m_errorTool; /// ROB source IDs - std::vector<uint32_t> m_sourceIDs; - std::vector<uint32_t> m_sourceIDsPP; - std::vector<uint32_t> m_sourceIDsCP; - std::vector<uint32_t> m_sourceIDsJEP; - std::vector<uint32_t> m_sourceIDsCPRoI; - std::vector<uint32_t> m_sourceIDsJEPRoI; - std::vector<uint32_t> m_sourceIDsCPRoIB; - std::vector<uint32_t> m_sourceIDsJEPRoIB; + std::vector<uint32_t> m_sourceIDsProp; + std::vector<uint32_t> m_sourceIDsPPProp; + std::vector<uint32_t> m_sourceIDsCPProp; + std::vector<uint32_t> m_sourceIDsJEPProp; + std::vector<uint32_t> m_sourceIDsCPRoIProp; + std::vector<uint32_t> m_sourceIDsJEPRoIProp; + std::vector<uint32_t> m_sourceIDsCPRoIBProp; + std::vector<uint32_t> m_sourceIDsJEPRoIBProp; /// Source ID converter - L1CaloSrcIdMap* m_srcIdMap; - + const L1CaloSrcIdMap m_srcIdMap; }; } // end namespace