diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx index b14ec65ac48cc579b6ddaa166de3de4331758a3a..b99dbf95bd7d76962f723a90d814952a79bf3823 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.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 */ @@ -52,9 +52,7 @@ CpByteStreamTool::CpByteStreamTool(const std::string& type, m_cpmMaps("LVL1::CpmMappingTool/CpmMappingTool"), m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"), m_channels(80), m_crates(4), m_modules(14), - m_coreOverlap(0), m_subDetector(eformat::TDAQ_CALO_CLUSTER_PROC_DAQ), - m_srcIdMap(0), m_towerKey(0), m_cpmSubBlock(0), m_cmmCpSubBlock(0), - m_rodStatus(0), m_fea(0) + m_subDetector(eformat::TDAQ_CALO_CLUSTER_PROC_DAQ) { declareInterface<CpByteStreamTool>(this); @@ -67,7 +65,7 @@ CpByteStreamTool::CpByteStreamTool(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"); // Properties for writing bytestream only @@ -95,27 +93,12 @@ CpByteStreamTool::~CpByteStreamTool() StatusCode CpByteStreamTool::initialize() { - msg(MSG::INFO) << "Initializing " << name() << " - package version " - << PACKAGE_VERSION << endmsg; - - StatusCode sc = m_cpmMaps.retrieve(); - if (sc.isFailure()) { - msg(MSG::ERROR) << "Failed to retrieve tool " << m_cpmMaps << endmsg; - return sc; - } else msg(MSG::INFO) << "Retrieved tool " << m_cpmMaps << endmsg; - - 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_srcIdMap = new L1CaloSrcIdMap(); - m_towerKey = new LVL1::TriggerTowerKey(); - m_cpmSubBlock = new CpmSubBlock(); - m_cmmCpSubBlock = new CmmCpSubBlock(); - m_rodStatus = new std::vector<uint32_t>(2); - m_fea = new FullEventAssembler<L1CaloSrcIdMap>(); + ATH_MSG_INFO ("Initializing " << name() << " - package version " + << PACKAGE_VERSION); + + ATH_CHECK( m_cpmMaps.retrieve() ); + ATH_CHECK( m_errorTool.retrieve() ); + return StatusCode::SUCCESS; } @@ -123,59 +106,55 @@ StatusCode CpByteStreamTool::initialize() StatusCode CpByteStreamTool::finalize() { - delete m_fea; - delete m_rodStatus; - delete m_cmmCpSubBlock; - delete m_cpmSubBlock; - delete m_towerKey; - delete m_srcIdMap; return StatusCode::SUCCESS; } // Conversion bytestream to CPM towers StatusCode CpByteStreamTool::convert( + const std::string& sgKey, const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMTower>* const ttCollection) + DataVector<LVL1::CPMTower>* const ttCollection) const { CpmTowerData data (ttCollection); - return convertBs(robFrags, data); + return convertBs(sgKey, robFrags, data); } // Conversion bytestream to CPM hits StatusCode CpByteStreamTool::convert( + const std::string& sgKey, const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMHits>* const hitCollection) + DataVector<LVL1::CPMHits>* const hitCollection) const { CpmHitsData data (hitCollection); - return convertBs(robFrags, data); + return convertBs(sgKey, robFrags, data); } // Conversion bytestream to CMM-CP hits StatusCode CpByteStreamTool::convert( + const std::string& sgKey, const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CMMCPHits>* const hitCollection) + DataVector<LVL1::CMMCPHits>* const hitCollection) const { CmmHitsData data (hitCollection); - return convertBs(robFrags, data); + return convertBs(sgKey, robFrags, data); } // Conversion of CP container to bytestream StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, - 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; + fea.clear(); + const uint16_t minorVersion = m_srcIdMap.minorVersion(); + fea.setRodMinorVersion(minorVersion); // Pointer to ROD data vector @@ -183,9 +162,19 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, // Set up the container maps - setupCpmTowerMap(cp->towers()); - setupCpmHitsMap(cp->hits()); - setupCmmCpHitsMap(cp->cmmHits()); + LVL1::TriggerTowerKey towerKey; + + // CPM tower map + ConstCpmTowerMap ttMap; + setupCpmTowerMap(cp->towers(), ttMap, towerKey); + + // CPM hits map + ConstCpmHitsMap hitsMap; + setupCpmHitsMap(cp->hits(), hitsMap); + + // CMM-CP hits map + ConstCmmCpHitsMap cmmHitsMap; + setupCmmCpHitsMap(cp->cmmHits(), cmmHitsMap); // Loop over data @@ -215,7 +204,12 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, // Get number of CPM slices and triggered slice offset // for this slink if ( ! slinkSlices(crate, module, modulesPerSlink, - timeslices, trigCpm)) { + timeslices, trigCpm, + ttMap, + hitsMap, + cmmHitsMap, + towerKey)) + { msg(MSG::ERROR) << "Inconsistent number of slices or " << "triggered slice offsets in data for crate " << hwCrate << " slink " << slink << endmsg; @@ -234,22 +228,23 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, } L1CaloUserHeader userHeader; userHeader.setCpm(trigCpmNew); - 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); theROD->push_back(userHeader.header()); - m_rodStatusMap.insert(make_pair(rodIdCpm, m_rodStatus)); } if (debug) msg() << "Module " << module << endmsg; // Create a sub-block for each slice (except Neutral format) - m_cpmBlocks.clear(); + // Vector for current CPM sub-blocks + DataVector<CpmSubBlock> cpmBlocks; + for (int slice = 0; slice < timeslicesNew; ++slice) { CpmSubBlock* const subBlock = new CpmSubBlock(); subBlock->setCpmHeader(m_version, m_dataFormat, slice, hwCrate, module, timeslicesNew); - m_cpmBlocks.push_back(subBlock); + cpmBlocks.push_back(subBlock); if (neutralFormat) break; } @@ -261,8 +256,8 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, double phi = 0.; int layer = 0; if (m_cpmMaps->mapping(crate, module, chan, eta, phi, layer)) { - const unsigned int key = m_towerKey->ttKey(phi, eta); - const LVL1::CPMTower* const tt = findCpmTower(key); + const unsigned int key = towerKey.ttKey(phi, eta); + const LVL1::CPMTower* const tt = findCpmTower(key, ttMap); if (tt ) { std::vector<int> emData; std::vector<int> hadData; @@ -282,7 +277,7 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, (hadErrBits.get(LVL1::DataError::LinkDown) << 1) | hadErrBits.get(LVL1::DataError::Parity); const int index = ( neutralFormat ) ? 0 : slice; - CpmSubBlock* const subBlock = m_cpmBlocks[index]; + CpmSubBlock* const subBlock = cpmBlocks[index]; subBlock->fillTowerData(slice, chan, emData[slice], hadData[slice], emErr, hadErr); } @@ -292,7 +287,7 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, // Add CPM hits - const LVL1::CPMHits* const hits = findCpmHits(crate, module); + const LVL1::CPMHits* const hits = findCpmHits(crate, module, hitsMap); if (hits) { std::vector<unsigned int> vec0; std::vector<unsigned int> vec1; @@ -300,7 +295,7 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, ModifySlices::data(hits->HitsVec1(), vec1, timeslicesNew); for (int slice = 0; slice < timeslicesNew; ++slice) { const int index = ( neutralFormat ) ? 0 : slice; - CpmSubBlock* const subBlock = m_cpmBlocks[index]; + CpmSubBlock* const subBlock = cpmBlocks[index]; subBlock->setHits(slice, vec0[slice], vec1[slice]); } } @@ -308,7 +303,7 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, // Pack and write the sub-blocks DataVector<CpmSubBlock>::iterator pos; - for (pos = m_cpmBlocks.begin(); pos != m_cpmBlocks.end(); ++pos) { + for (pos = cpmBlocks.begin(); pos != cpmBlocks.end(); ++pos) { CpmSubBlock* const subBlock = *pos; if ( !subBlock->pack()) { msg(MSG::ERROR) << "CPM sub-block packing failed" << endmsg; @@ -326,8 +321,11 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, // Create a sub-block for each slice (except Neutral format) - m_cmmHit0Blocks.clear(); - m_cmmHit1Blocks.clear(); + /// Vector for current CMM-CP hit0 sub-blocks + DataVector<CmmCpSubBlock> cmmHit0Blocks; + /// Vector for current CMM-CP hit1 sub-blocks + DataVector<CmmCpSubBlock> cmmHit1Blocks; + const int summing = (crate == m_crates - 1) ? CmmSubBlock::SYSTEM : CmmSubBlock::CRATE; for (int slice = 0; slice < timeslicesNew; ++slice) { @@ -335,12 +333,12 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, h0Block->setCmmHeader(m_version, m_dataFormat, slice, hwCrate, summing, CmmSubBlock::CMM_CP, CmmSubBlock::RIGHT, timeslicesNew); - m_cmmHit0Blocks.push_back(h0Block); + cmmHit0Blocks.push_back(h0Block); CmmCpSubBlock* const h1Block = new CmmCpSubBlock(); h1Block->setCmmHeader(m_version, m_dataFormat, slice, hwCrate, summing, CmmSubBlock::CMM_CP, CmmSubBlock::LEFT, timeslicesNew); - m_cmmHit1Blocks.push_back(h1Block); + cmmHit1Blocks.push_back(h1Block); if (neutralFormat) break; } @@ -372,7 +370,7 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, continue; } } - const LVL1::CMMCPHits* const ch = findCmmCpHits(crate, dataID); + const LVL1::CMMCPHits* const ch = findCmmCpHits(crate, dataID, cmmHitsMap); if ( ch ) { std::vector<unsigned int> hits0; std::vector<unsigned int> hits1; @@ -386,17 +384,17 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, const LVL1::DataError err0Bits(err0[slice]); const LVL1::DataError err1Bits(err1[slice]); const int index = ( neutralFormat ) ? 0 : slice; - CmmCpSubBlock* subBlock = m_cmmHit0Blocks[index]; + CmmCpSubBlock* subBlock = cmmHit0Blocks[index]; subBlock->setHits(slice, source, hits0[slice], err0Bits.get(LVL1::DataError::Parity)); - subBlock = m_cmmHit1Blocks[index]; + subBlock = cmmHit1Blocks[index]; subBlock->setHits(slice, source, hits1[slice], err1Bits.get(LVL1::DataError::Parity)); } } } - DataVector<CmmCpSubBlock>::iterator cos = m_cmmHit0Blocks.begin(); - for (; cos != m_cmmHit0Blocks.end(); ++cos) { + DataVector<CmmCpSubBlock>::iterator cos = cmmHit0Blocks.begin(); + for (; cos != cmmHit0Blocks.end(); ++cos) { CmmCpSubBlock* const subBlock = *cos; if ( !subBlock->pack()) { msg(MSG::ERROR) << "CMM-Cp sub-block packing failed" << endmsg; @@ -408,8 +406,8 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, } subBlock->write(theROD); } - cos = m_cmmHit1Blocks.begin(); - for (; cos != m_cmmHit1Blocks.end(); ++cos) { + cos = cmmHit1Blocks.begin(); + for (; cos != cmmHit1Blocks.end(); ++cos) { CmmCpSubBlock* const subBlock = *cos; if ( !subBlock->pack()) { msg(MSG::ERROR) << "CMM-Cp sub-block packing failed" << endmsg; @@ -425,53 +423,67 @@ StatusCode CpByteStreamTool::convert(const LVL1::CPBSCollection* const cp, // 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 -const std::vector<uint32_t>& CpByteStreamTool::sourceIDs( - const std::string& sgKey) +std::vector<uint32_t> CpByteStreamTool::makeSourceIDs() const { - // Check if overlap tower channels wanted - const std::string flag("Overlap"); - const std::string::size_type pos = sgKey.find(flag); - m_coreOverlap = - (pos == std::string::npos || pos != sgKey.length() - flag.length()) ? 0 : 1; + std::vector<uint32_t> sourceIDs; - if (m_sourceIDs.empty()) { + if (!m_sourceIDsProp.empty()) { + sourceIDs = m_sourceIDsProp; + } + else { 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 maxSlinks = m_srcIdMap.maxSlinks(); + for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) + { + for (int slink = 0; slink < maxSlinks; ++slink) + { const int daqOrRoi = 0; - const uint32_t rodId = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, - m_subDetector); - const uint32_t robId = m_srcIdMap->getRobID(rodId); - m_sourceIDs.push_back(robId); + const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, + m_subDetector); + const uint32_t robId = m_srcIdMap.getRobID(rodId); + sourceIDs.push_back(robId); } } } - return m_sourceIDs; + return sourceIDs; +} + +const std::vector<uint32_t>& CpByteStreamTool::sourceIDs() const +{ + static const std::vector<uint32_t> sourceIDs = makeSourceIDs(); + return sourceIDs; } // Convert bytestream to given container type StatusCode CpByteStreamTool::convertBs( + const std::string& sgKey, const IROBDataProviderSvc::VROBFRAG& robFrags, - CpByteStreamToolData& data) + CpByteStreamToolData& data) const { + LocalData ld; + + // Check if overlap tower channels wanted + const std::string flag("Overlap"); + const std::string::size_type pos = sgKey.find(flag); + ld.coreOverlap = + (pos == std::string::npos || pos != sgKey.length() - flag.length()) ? 0 : 1; + const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); // Loop over ROB fragments + CmmCpSubBlock cmmCpSubBlock; + CpmSubBlock cpmSubBlock; + int robCount = 0; std::set<uint32_t> dupCheck; ROBIterator rob = robFrags.begin(); @@ -519,12 +531,12 @@ StatusCode CpByteStreamTool::convertBs( // 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) != 0 || - (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) != 0 || + (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: ROD " @@ -533,10 +545,10 @@ StatusCode CpByteStreamTool::convertBs( } 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 should be User Header @@ -574,59 +586,60 @@ StatusCode CpByteStreamTool::convertBs( // Loop over sub-blocks - m_rodErr = L1CaloSubBlock::ERROR_NONE; + ld.rodErr = L1CaloSubBlock::ERROR_NONE; while (payload != payloadEnd) { if (L1CaloSubBlock::wordType(*payload) != L1CaloSubBlock::HEADER) { if (debug) msg() << "Unexpected data sequence" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_MISSING_HEADER; + ld.rodErr = L1CaloSubBlock::ERROR_MISSING_HEADER; break; } if (CmmSubBlock::cmmBlock(*payload)) { // CMM if (CmmSubBlock::cmmType(*payload) == CmmSubBlock::CMM_CP) { - m_cmmCpSubBlock->clear(); - payload = m_cmmCpSubBlock->read(payload, payloadEnd); - if (m_cmmCpSubBlock->crate() != rodCrate) { + cmmCpSubBlock.clear(); + payload = cmmCpSubBlock.read(payload, payloadEnd); + if (cmmCpSubBlock.crate() != rodCrate) { if (debug) msg() << "Inconsistent crate number in ROD source ID" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER; + ld.rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER; break; } if (data.m_collection == CMM_CP_HITS) { - decodeCmmCp(m_cmmCpSubBlock, trigCmm, static_cast<CmmHitsData&>(data)); - if (m_rodErr != L1CaloSubBlock::ERROR_NONE) { + decodeCmmCp(&cmmCpSubBlock, trigCmm, static_cast<CmmHitsData&>(data), + ld); + if (ld.rodErr != L1CaloSubBlock::ERROR_NONE) { if (debug) msg() << "decodeCmmCp failed" << endmsg; break; } } } else { if (debug) msg() << "Invalid CMM type in module field" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_MODULE_NUMBER; + ld.rodErr = L1CaloSubBlock::ERROR_MODULE_NUMBER; break; } } else { // CPM CpmSubBlock subBlock; - m_cpmSubBlock->clear(); - payload = m_cpmSubBlock->read(payload, payloadEnd); - if (m_cpmSubBlock->crate() != rodCrate) { + cpmSubBlock.clear(); + payload = cpmSubBlock.read(payload, payloadEnd); + if (cpmSubBlock.crate() != rodCrate) { if (debug) msg() << "Inconsistent crate number in ROD source ID" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER; + ld.rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER; break; } if (data.m_collection == CPM_TOWERS || data.m_collection == CPM_HITS) { - decodeCpm(m_cpmSubBlock, trigCpm, data); - if (m_rodErr != L1CaloSubBlock::ERROR_NONE) { + decodeCpm(&cpmSubBlock, trigCpm, data, ld); + if (ld.rodErr != L1CaloSubBlock::ERROR_NONE) { if (debug) msg() << "decodeCpm failed" << endmsg; break; } } } } - if (m_rodErr != L1CaloSubBlock::ERROR_NONE) - m_errorTool->rodError(robid, m_rodErr); + if (ld.rodErr != L1CaloSubBlock::ERROR_NONE) + m_errorTool->rodError(robid, ld.rodErr); } return StatusCode::SUCCESS; @@ -635,7 +648,8 @@ StatusCode CpByteStreamTool::convertBs( // Unpack CMM-CP sub-block void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, - CmmHitsData& data) + CmmHitsData& data, + LocalData& ld) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); @@ -658,13 +672,13 @@ void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, if (debug) msg() << "Triggered CMM slice from header " << "inconsistent with number of slices: " << trigCmm << ", " << timeslices << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } if (timeslices <= sliceNum) { if (debug) msg() << "Total slices inconsistent with slice number: " << timeslices << ", " << sliceNum << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } // Unpack sub-block @@ -673,7 +687,7 @@ void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, std::string errMsg(subBlock->unpackErrorMsg()); msg() << "CMM-CP sub-block unpacking failed: " << errMsg << endmsg; } - m_rodErr = subBlock->unpackErrorCode(); + ld.rodErr = subBlock->unpackErrorCode(); return; } @@ -724,50 +738,50 @@ void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, if (hits || err) { LVL1::CMMCPHits* ch = findCmmCpHits(data, crate, dataID); if ( ! ch ) { // create new CMM hits - m_hitsVec0.assign(timeslices, 0); - m_hitsVec1.assign(timeslices, 0); - m_errVec0.assign(timeslices, 0); - m_errVec1.assign(timeslices, 0); + ld.hitsVec0.assign(timeslices, 0); + ld.hitsVec1.assign(timeslices, 0); + ld.errVec0.assign(timeslices, 0); + ld.errVec1.assign(timeslices, 0); if (module == CmmSubBlock::RIGHT) { - m_hitsVec0[slice] = hits; - m_errVec0[slice] = err; + ld.hitsVec0[slice] = hits; + ld.errVec0[slice] = err; } else { - m_hitsVec1[slice] = hits; - m_errVec1[slice] = err; + ld.hitsVec1[slice] = hits; + ld.errVec1[slice] = err; } auto chp = - std::make_unique<LVL1::CMMCPHits>(swCrate, dataID, m_hitsVec0, m_hitsVec1, - m_errVec0, m_errVec1, trigCmm); + std::make_unique<LVL1::CMMCPHits>(swCrate, dataID, ld.hitsVec0, ld.hitsVec1, + ld.errVec0, ld.errVec1, trigCmm); const int key = crate*100 + dataID; data.m_cmmHitsMap.insert(std::make_pair(key, chp.get())); data.m_cmmHitCollection->push_back(std::move(chp)); } else { - m_hitsVec0 = ch->HitsVec0(); - m_hitsVec1 = ch->HitsVec1(); - m_errVec0 = ch->ErrorVec0(); - m_errVec1 = ch->ErrorVec1(); - const int nsl = m_hitsVec0.size(); + ld.hitsVec0 = ch->HitsVec0(); + ld.hitsVec1 = ch->HitsVec1(); + ld.errVec0 = ch->ErrorVec0(); + ld.errVec1 = ch->ErrorVec1(); + const int nsl = ld.hitsVec0.size(); if (timeslices != nsl) { if (debug) msg() << "Inconsistent number of slices in sub-blocks" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } - if ((module == CmmSubBlock::RIGHT && (m_hitsVec0[slice] != 0 || - m_errVec0[slice] != 0)) || (module == CmmSubBlock::LEFT && - (m_hitsVec1[slice] != 0 || m_errVec1[slice] != 0))) { + if ((module == CmmSubBlock::RIGHT && (ld.hitsVec0[slice] != 0 || + ld.errVec0[slice] != 0)) || (module == CmmSubBlock::LEFT && + (ld.hitsVec1[slice] != 0 || ld.errVec1[slice] != 0))) { if (debug) msg() << "Duplicate data for slice " << slice << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; + ld.rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; return; } if (module == CmmSubBlock::RIGHT) { - m_hitsVec0[slice] = hits; - m_errVec0[slice] = err; + ld.hitsVec0[slice] = hits; + ld.errVec0[slice] = err; } else { - m_hitsVec1[slice] = hits; - m_errVec1[slice] = err; + ld.hitsVec1[slice] = hits; + ld.errVec1[slice] = err; } - ch->addHits(m_hitsVec0, m_hitsVec1, m_errVec0, m_errVec1); + ch->addHits(ld.hitsVec0, ld.hitsVec1, ld.errVec0, ld.errVec1); } } } @@ -779,7 +793,8 @@ void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, // Unpack CPM sub-block void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock, - int trigCpm, CpByteStreamToolData& data) + int trigCpm, CpByteStreamToolData& data, + LocalData& ld) const { const bool debug = msgLvl(MSG::DEBUG); const bool verbose = msgLvl(MSG::VERBOSE); @@ -797,20 +812,20 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock, } if (module < 1 || module > m_modules) { if (debug) msg() << "Unexpected module number: " << module << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_MODULE_NUMBER; + ld.rodErr = L1CaloSubBlock::ERROR_MODULE_NUMBER; return; } if (timeslices <= trigCpm) { if (debug) msg() << "Triggered CPM slice from header " << "inconsistent with number of slices: " << trigCpm << ", " << timeslices << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } if (timeslices <= sliceNum) { if (debug) msg() << "Total slices inconsistent with slice number: " << timeslices << ", " << sliceNum << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } // Unpack sub-block @@ -819,7 +834,7 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock, std::string errMsg(subBlock->unpackErrorMsg()); msg() << "CPM sub-block unpacking failed: " << errMsg << endmsg; } - m_rodErr = subBlock->unpackErrorCode(); + ld.rodErr = subBlock->unpackErrorCode(); return; } @@ -865,49 +880,49 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock, double phi = 0.; int layer = 0; if (m_cpmMaps->mapping(crate, module, chan, eta, phi, layer)) { - if (layer == m_coreOverlap) { - const unsigned int key = m_towerKey->ttKey(phi, eta); + if (layer == ld.coreOverlap) { + const unsigned int key = ld.towerKey->ttKey(phi, eta); LVL1::CPMTower* tt = findCpmTower(tdata, key); if ( ! tt ) { // create new CPM tower - m_emVec.assign(timeslices, 0); - m_hadVec.assign(timeslices, 0); - m_emErrVec.assign(timeslices, 0); - m_hadErrVec.assign(timeslices, 0); - m_emVec[slice] = em; - m_hadVec[slice] = had; - m_emErrVec[slice] = emErr1; - m_hadErrVec[slice] = hadErr1; + ld.emVec.assign(timeslices, 0); + ld.hadVec.assign(timeslices, 0); + ld.emErrVec.assign(timeslices, 0); + ld.hadErrVec.assign(timeslices, 0); + ld.emVec[slice] = em; + ld.hadVec[slice] = had; + ld.emErrVec[slice] = emErr1; + ld.hadErrVec[slice] = hadErr1; auto ttp = - std::make_unique<LVL1::CPMTower>(phi, eta, m_emVec, m_emErrVec, - m_hadVec, m_hadErrVec, trigCpm); + std::make_unique<LVL1::CPMTower>(phi, eta, ld.emVec, ld.emErrVec, + ld.hadVec, ld.hadErrVec, trigCpm); tdata.m_ttMap.insert(std::make_pair(key, ttp.get())); tdata.m_ttCollection->push_back(std::move(ttp)); } else { - m_emVec = tt->emEnergyVec(); - m_hadVec = tt->hadEnergyVec(); - m_emErrVec = tt->emErrorVec(); - m_hadErrVec = tt->hadErrorVec(); - const int nsl = m_emVec.size(); + ld.emVec = tt->emEnergyVec(); + ld.hadVec = tt->hadEnergyVec(); + ld.emErrVec = tt->emErrorVec(); + ld.hadErrVec = tt->hadErrorVec(); + const int nsl = ld.emVec.size(); if (timeslices != nsl) { if (debug) { msg() << "Inconsistent number of slices in sub-blocks" << endmsg; } - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } - if (m_emVec[slice] != 0 || m_hadVec[slice] != 0 || - m_emErrVec[slice] != 0 || m_hadErrVec[slice] != 0) { + if (ld.emVec[slice] != 0 || ld.hadVec[slice] != 0 || + ld.emErrVec[slice] != 0 || ld.hadErrVec[slice] != 0) { if (debug) msg() << "Duplicate data for slice " << slice << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; + ld.rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; return; } - m_emVec[slice] = em; - m_hadVec[slice] = had; - m_emErrVec[slice] = emErr1; - m_hadErrVec[slice] = hadErr1; - tt->fill(m_emVec, m_emErrVec, m_hadVec, m_hadErrVec, trigCpm); + ld.emVec[slice] = em; + ld.hadVec[slice] = had; + ld.emErrVec[slice] = emErr1; + ld.hadErrVec[slice] = hadErr1; + tt->fill(ld.emVec, ld.emErrVec, ld.hadVec, ld.hadErrVec, trigCpm); } } } else if (verbose && (em || had || emErr || hadErr)) { @@ -931,32 +946,32 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock, if (hits0 || hits1) { LVL1::CPMHits* ch = findCpmHits(hdata, crate, module); if ( ! ch ) { // create new CPM hits - m_hitsVec0.assign(timeslices, 0); - m_hitsVec1.assign(timeslices, 0); - m_hitsVec0[slice] = hits0; - m_hitsVec1[slice] = hits1; + ld.hitsVec0.assign(timeslices, 0); + ld.hitsVec1.assign(timeslices, 0); + ld.hitsVec0[slice] = hits0; + ld.hitsVec1[slice] = hits1; auto chp = - std::make_unique<LVL1::CPMHits>(swCrate, module, m_hitsVec0, m_hitsVec1, trigCpm); + std::make_unique<LVL1::CPMHits>(swCrate, module, ld.hitsVec0, ld.hitsVec1, trigCpm); hdata.m_hitsMap.insert(std::make_pair(crate*m_modules+module-1, chp.get())); hdata.m_hitCollection->push_back(std::move(chp)); } else { - m_hitsVec0 = ch->HitsVec0(); - m_hitsVec1 = ch->HitsVec1(); - const int nsl = m_hitsVec0.size(); + ld.hitsVec0 = ch->HitsVec0(); + ld.hitsVec1 = ch->HitsVec1(); + const int nsl = ld.hitsVec0.size(); if (timeslices != nsl) { if (debug) msg() << "Inconsistent number of slices in sub-blocks" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } - if (m_hitsVec0[slice] != 0 || m_hitsVec1[slice] != 0) { + if (ld.hitsVec0[slice] != 0 || ld.hitsVec1[slice] != 0) { if (debug) msg() << "Duplicate data for slice " << slice << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; + ld.rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; return; } - m_hitsVec0[slice] = hits0; - m_hitsVec1[slice] = hits1; - ch->addHits(m_hitsVec0, m_hitsVec1); + ld.hitsVec0[slice] = hits0; + ld.hitsVec1[slice] = hits1; + ch->addHits(ld.hitsVec0, ld.hitsVec1); } } else if (verbose) { msg(MSG::VERBOSE) << "No CPM hits data for crate/module/slice " @@ -972,10 +987,11 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock, // Find a CPM tower for given key const -LVL1::CPMTower* CpByteStreamTool::findCpmTower(const unsigned int key) const +LVL1::CPMTower* CpByteStreamTool::findCpmTower(const unsigned int key, + const ConstCpmTowerMap& ttMap) const { - ConstCpmTowerMap::const_iterator mapIter = m_ttMap.find(key); - if (mapIter != m_ttMap.end()) return mapIter->second; + ConstCpmTowerMap::const_iterator mapIter = ttMap.find(key); + if (mapIter != ttMap.end()) return mapIter->second; return nullptr; } @@ -990,11 +1006,13 @@ LVL1::CPMTower* CpByteStreamTool::findCpmTower(const CpmTowerData& data, // Find CPM hits for given crate, module const -LVL1::CPMHits* CpByteStreamTool::findCpmHits(const int crate, const int module) const +LVL1::CPMHits* CpByteStreamTool::findCpmHits(const int crate, + const int module, + const ConstCpmHitsMap& hitsMap) const { ConstCpmHitsMap::const_iterator mapIter = - m_hitsMap.find(crate*m_modules + module - 1); - if (mapIter != m_hitsMap.end()) return mapIter->second; + hitsMap.find(crate*m_modules + module - 1); + if (mapIter != hitsMap.end()) return mapIter->second; return nullptr; } @@ -1011,10 +1029,11 @@ LVL1::CPMHits* CpByteStreamTool::findCpmHits(const CpmHitsData& data, const LVL1::CMMCPHits* CpByteStreamTool::findCmmCpHits(const int crate, - const int dataID) const + const int dataID, + const ConstCmmCpHitsMap& cmmHitsMap) const { - ConstCmmCpHitsMap::const_iterator mapIter = m_cmmHitsMap.find(crate*100 + dataID); - if (mapIter != m_cmmHitsMap.end()) return mapIter->second; + ConstCmmCpHitsMap::const_iterator mapIter = cmmHitsMap.find(crate*100 + dataID); + if (mapIter != cmmHitsMap.end()) return mapIter->second; return nullptr; } @@ -1030,16 +1049,18 @@ LVL1::CMMCPHits* CpByteStreamTool::findCmmCpHits(const CmmHitsData& data, // Set up CPM tower map void CpByteStreamTool::setupCpmTowerMap(const CpmTowerCollection* - const ttCollection) + const ttCollection, + ConstCpmTowerMap& ttMap, + LVL1::TriggerTowerKey& towerKey) const { - m_ttMap.clear(); + ttMap.clear(); if (ttCollection) { CpmTowerCollection::const_iterator pos = ttCollection->begin(); CpmTowerCollection::const_iterator pose = ttCollection->end(); for (; pos != pose; ++pos) { const LVL1::CPMTower* const tt = *pos; - const unsigned int key = m_towerKey->ttKey(tt->phi(), tt->eta()); - m_ttMap.insert(std::make_pair(key, tt)); + const unsigned int key = towerKey.ttKey(tt->phi(), tt->eta()); + ttMap.insert(std::make_pair(key, tt)); } } } @@ -1047,9 +1068,10 @@ void CpByteStreamTool::setupCpmTowerMap(const CpmTowerCollection* // Set up CPM hits map void CpByteStreamTool::setupCpmHitsMap(const CpmHitsCollection* - const hitCollection) + const hitCollection, + ConstCpmHitsMap& hitsMap) const { - m_hitsMap.clear(); + hitsMap.clear(); if (hitCollection) { CpmHitsCollection::const_iterator pos = hitCollection->begin(); CpmHitsCollection::const_iterator pose = hitCollection->end(); @@ -1057,7 +1079,7 @@ void CpByteStreamTool::setupCpmHitsMap(const CpmHitsCollection* const LVL1::CPMHits* const hits = *pos; const int crate = hits->crate() - m_crateOffsetSw; const int key = m_modules * crate + hits->module() - 1; - m_hitsMap.insert(std::make_pair(key, hits)); + hitsMap.insert(std::make_pair(key, hits)); } } } @@ -1065,9 +1087,10 @@ void CpByteStreamTool::setupCpmHitsMap(const CpmHitsCollection* // Set up CMM-CP hits map void CpByteStreamTool::setupCmmCpHitsMap(const CmmCpHitsCollection* - const hitCollection) + const hitCollection, + ConstCmmCpHitsMap& cmmHitsMap) const { - m_cmmHitsMap.clear(); + cmmHitsMap.clear(); if (hitCollection) { CmmCpHitsCollection::const_iterator pos = hitCollection->begin(); CmmCpHitsCollection::const_iterator pose = hitCollection->end(); @@ -1075,7 +1098,7 @@ void CpByteStreamTool::setupCmmCpHitsMap(const CmmCpHitsCollection* const LVL1::CMMCPHits* const hits = *pos; const int crate = hits->crate() - m_crateOffsetSw; const int key = crate*100 + hits->dataID(); - m_cmmHitsMap.insert(std::make_pair(key, hits)); + cmmHitsMap.insert(std::make_pair(key, hits)); } } } @@ -1083,7 +1106,13 @@ void CpByteStreamTool::setupCmmCpHitsMap(const CmmCpHitsCollection* // Get number of slices and triggered slice offset for next slink bool CpByteStreamTool::slinkSlices(const int crate, const int module, - const int modulesPerSlink, int& timeslices, int& trigCpm) + const int modulesPerSlink, + int& timeslices, + int& trigCpm, + const ConstCpmTowerMap& ttMap, + const ConstCpmHitsMap& hitsMap, + const ConstCmmCpHitsMap& cmmHitsMap, + LVL1::TriggerTowerKey& towerKey) const { int slices = -1; int trigC = m_dfltSlices/2; @@ -1093,8 +1122,8 @@ bool CpByteStreamTool::slinkSlices(const int crate, const int module, double phi = 0.; int layer = 0; if ( !m_cpmMaps->mapping(crate, mod, chan, eta, phi, layer)) continue; - const unsigned int key = m_towerKey->ttKey(phi, eta); - const LVL1::CPMTower* const tt = findCpmTower(key); + const unsigned int key = towerKey.ttKey(phi, eta); + const LVL1::CPMTower* const tt = findCpmTower(key, ttMap); if ( !tt ) continue; const int numdat = 4; std::vector<int> sums(numdat); @@ -1120,7 +1149,7 @@ bool CpByteStreamTool::slinkSlices(const int crate, const int module, } else if (slices != sizes[i] || trigC != peak) return false; } } - const LVL1::CPMHits* const hits = findCpmHits(crate, mod); + const LVL1::CPMHits* const hits = findCpmHits(crate, mod, hitsMap); if (hits) { const int numdat = 2; std::vector<unsigned int> sums(numdat); @@ -1148,7 +1177,7 @@ bool CpByteStreamTool::slinkSlices(const int crate, const int module, const int numdat = 4; std::vector<unsigned int> sums(numdat); std::vector<int> sizes(numdat); - const LVL1::CMMCPHits* const hits = findCmmCpHits(crate, dataID); + const LVL1::CMMCPHits* const hits = findCmmCpHits(crate, dataID, cmmHitsMap); if (hits) { sums[0] = std::accumulate((hits->HitsVec0()).begin(), (hits->HitsVec0()).end(), 0); diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.h index 7e42a7952350238ea5556d04843592bbd34e3000..dd7619a8c5edda071b6a5afaba1752ff00573374 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.h +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.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_CPBYTESTREAMTOOL_H @@ -11,6 +11,7 @@ #include <string> #include <vector> +#include "L1CaloSrcIdMap.h" #include "AthenaBaseComps/AthAlgTool.h" #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h" #include "ByteStreamData/RawEvent.h" @@ -62,22 +63,50 @@ class CpByteStreamTool : public AthAlgTool { virtual StatusCode finalize(); /// Convert ROB fragments to CPM towers - StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMTower>* ttCollection); + StatusCode convert(const std::string& sgKey, + const IROBDataProviderSvc::VROBFRAG& robFrags, + DataVector<LVL1::CPMTower>* ttCollection) const; /// Convert ROB fragments to CPM hits - StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMHits>* hitCollection); + StatusCode convert(const std::string& sgKey, + const IROBDataProviderSvc::VROBFRAG& robFrags, + DataVector<LVL1::CPMHits>* hitCollection) const; /// Convert ROB fragments to CMM-CP hits - StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CMMCPHits>* hitCollection); + StatusCode convert(const std::string& sgKey, + const IROBDataProviderSvc::VROBFRAG& robFrags, + DataVector<LVL1::CMMCPHits>* hitCollection) const; /// Convert CP Container to bytestream - StatusCode convert(const LVL1::CPBSCollection* cp, RawEventWrite* re); + StatusCode convert(const LVL1::CPBSCollection* cp, 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; private: + struct LocalData + { + /// Tower channels to accept (1=Core, 2=Overlap) + int coreOverlap; + /// Unpacking error code + unsigned int rodErr = 0; + /// Hits0 vector for unpacking + std::vector<unsigned int> hitsVec0; + /// Hits1 vector for unpacking + std::vector<unsigned int> hitsVec1; + /// Error0 vector for unpacking + std::vector<int> errVec0; + /// Error1 vector for unpacking + std::vector<int> errVec1; + /// EM data vector for unpacking + std::vector<int> emVec; + /// Had data vector for unpacking + std::vector<int> hadVec; + /// EM error data vector for unpacking + std::vector<int> emErrVec; + /// Had error data vector for unpacking + std::vector<int> hadErrVec; + /// Trigger tower key provider + LVL1::TriggerTowerKey* towerKey; + }; enum CollectionType { CPM_TOWERS, CPM_HITS, CMM_CP_HITS }; @@ -122,112 +151,84 @@ class CpByteStreamTool : public AthAlgTool { CmmCpHitsMap m_cmmHitsMap; }; + /// Create list of all source IDs. + std::vector<uint32_t> makeSourceIDs() const; + /// Convert bytestream to given container type - StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG& robFrags, - CpByteStreamToolData& data); + StatusCode convertBs(const std::string& sgKey, + const IROBDataProviderSvc::VROBFRAG& robFrags, + CpByteStreamToolData& data) const; /// Unpack CMM-CP sub-block - void decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, CmmHitsData& data); + void decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, CmmHitsData& data, + LocalData& ld) const; /// Unpack CPM sub-block - void decodeCpm(CpmSubBlock* subBlock, int trigCpm, CpByteStreamToolData& data); + void decodeCpm(CpmSubBlock* subBlock, int trigCpm, CpByteStreamToolData& data, + LocalData& ld) const; /// Find a CPM tower for given key - const LVL1::CPMTower* findCpmTower(unsigned int key) const; + const LVL1::CPMTower* findCpmTower(unsigned int key, + const ConstCpmTowerMap& ttMap) const; LVL1::CPMTower* findCpmTower(const CpmTowerData& data, unsigned int key) const; /// Find CPM hits for given crate, module - const LVL1::CPMHits* findCpmHits(int crate, int module) const; + const LVL1::CPMHits* findCpmHits(int crate, int module, + const ConstCpmHitsMap& hitsMap) const; LVL1::CPMHits* findCpmHits(const CpmHitsData& data, int crate, int module) const; /// Find CMM-CP hits for given crate, data ID - const LVL1::CMMCPHits* findCmmCpHits(int crate, int dataID) const; + const LVL1::CMMCPHits* findCmmCpHits(int crate, int dataID, + const ConstCmmCpHitsMap& cmmHitsMap) const; LVL1::CMMCPHits* findCmmCpHits(const CmmHitsData& data, int crate, int dataID) const; /// Set up CPM tower map - void setupCpmTowerMap(const CpmTowerCollection* ttCollection); + void setupCpmTowerMap(const CpmTowerCollection* ttCollection, + ConstCpmTowerMap& ttMap, + LVL1::TriggerTowerKey& towerKey) const; /// Set up CPM hits map - void setupCpmHitsMap(const CpmHitsCollection* hitCollection); + void setupCpmHitsMap(const CpmHitsCollection* hitCollection, + ConstCpmHitsMap& hitsMap) const; /// Set up CMM-CP hits map - void setupCmmCpHitsMap(const CmmCpHitsCollection* hitCollection); + void setupCmmCpHitsMap(const CmmCpHitsCollection* hitCollection, + ConstCmmCpHitsMap& cmmHitsMap) const; /// Get number of slices and triggered slice offset for next slink bool slinkSlices(int crate, int module, int modulesPerSlink, - int& timeslices, int& trigJem); + int& timeslices, int& trigJem, + const ConstCpmTowerMap& ttMap, + const ConstCpmHitsMap& hitsMap, + const ConstCmmCpHitsMap& cmmHitsMap, + LVL1::TriggerTowerKey& towerKey) const; - /// Channel mapping tool + /// Property: Channel mapping tool ToolHandle<LVL1::IL1CaloMappingTool> m_cpmMaps; /// 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 channels per module - int m_channels; + const int m_channels; /// 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; - /// Default number of slices in simulation + /// Property: Default number of slices in simulation int m_dfltSlices; - /// Force number of slices in bytestream + /// Property: Force number of slices in bytestream int m_forceSlices; - /// Tower channels to accept (1=Core, 2=Overlap) - int m_coreOverlap; - /// Unpacking error code - unsigned int m_rodErr; - /// ROB source IDs - std::vector<uint32_t> m_sourceIDs; + /// Property: ROB source IDs + std::vector<uint32_t> m_sourceIDsProp; /// Sub-detector type - eformat::SubDetector m_subDetector; + const eformat::SubDetector m_subDetector; /// Source ID converter - L1CaloSrcIdMap* m_srcIdMap; - /// Trigger tower key provider - LVL1::TriggerTowerKey* m_towerKey; - /// CPM sub-block for unpacking - CpmSubBlock* m_cpmSubBlock; - /// CMM-CP sub-block for unpacking - CmmCpSubBlock* m_cmmCpSubBlock; - /// Hits0 vector for unpacking - std::vector<unsigned int> m_hitsVec0; - /// Hits1 vector for unpacking - std::vector<unsigned int> m_hitsVec1; - /// Error0 vector for unpacking - std::vector<int> m_errVec0; - /// Error1 vector for unpacking - std::vector<int> m_errVec1; - /// EM data vector for unpacking - std::vector<int> m_emVec; - /// Had data vector for unpacking - std::vector<int> m_hadVec; - /// EM error data vector for unpacking - std::vector<int> m_emErrVec; - /// Had error data vector for unpacking - std::vector<int> m_hadErrVec; - /// Vector for current CPM sub-blocks - DataVector<CpmSubBlock> m_cpmBlocks; - /// Vector for current CMM-CP hit0 sub-blocks - DataVector<CmmCpSubBlock> m_cmmHit0Blocks; - /// Vector for current CMM-CP hit1 sub-blocks - DataVector<CmmCpSubBlock> m_cmmHit1Blocks; - /// CPM tower map - ConstCpmTowerMap m_ttMap; - /// CPM hits map - ConstCpmHitsMap m_hitsMap; - /// CMM-CP hits map - ConstCmmCpHitsMap m_cmmHitsMap; - /// 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/CpByteStreamV1Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.cxx index 30e11fd588e54b5eb06aecd0646ed6397a8143d0..878960c7eaf92062625c26e4551fd8a01303b73c 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.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 */ @@ -25,7 +25,6 @@ #include "CmmSubBlock.h" #include "CpmSubBlockV1.h" #include "L1CaloErrorByteStreamTool.h" -#include "L1CaloSrcIdMap.h" #include "L1CaloSubBlock.h" #include "L1CaloUserHeader.h" #include "ModifySlices.h" @@ -52,9 +51,7 @@ CpByteStreamV1Tool::CpByteStreamV1Tool(const std::string& type, m_cpmMaps("LVL1::CpmMappingTool/CpmMappingTool"), m_errorTool("LVL1BS::L1CaloErrorByteStreamTool/L1CaloErrorByteStreamTool"), m_channels(80), m_crates(4), m_modules(14), - m_coreOverlap(0), m_subDetector(eformat::TDAQ_CALO_CLUSTER_PROC_DAQ), - m_srcIdMap(0), m_towerKey(0), m_cpmSubBlock(0), m_cmmCpSubBlock(0), - m_rodStatus(0), m_fea(0) + m_subDetector(eformat::TDAQ_CALO_CLUSTER_PROC_DAQ) { declareInterface<CpByteStreamV1Tool>(this); @@ -69,7 +66,7 @@ CpByteStreamV1Tool::CpByteStreamV1Tool(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"); // Properties for writing bytestream only @@ -101,27 +98,12 @@ CpByteStreamV1Tool::~CpByteStreamV1Tool() StatusCode CpByteStreamV1Tool::initialize() { - msg(MSG::INFO) << "Initializing " << name() << " - package version " - << PACKAGE_VERSION << endmsg; - - StatusCode sc = m_cpmMaps.retrieve(); - if (sc.isFailure()) { - msg(MSG::ERROR) << "Failed to retrieve tool " << m_cpmMaps << endmsg; - return sc; - } else msg(MSG::INFO) << "Retrieved tool " << m_cpmMaps << endmsg; - - 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_srcIdMap = new L1CaloSrcIdMap(); - m_towerKey = new LVL1::TriggerTowerKey(); - m_cpmSubBlock = new CpmSubBlockV1(); - m_cmmCpSubBlock = new CmmCpSubBlock(); - m_rodStatus = new std::vector<uint32_t>(2); - m_fea = new FullEventAssembler<L1CaloSrcIdMap>(); + ATH_MSG_INFO ("Initializing " << name() << " - package version " + << PACKAGE_VERSION); + + ATH_CHECK( m_cpmMaps.retrieve() ); + ATH_CHECK( m_errorTool.retrieve() ); + return StatusCode::SUCCESS; } @@ -129,59 +111,55 @@ StatusCode CpByteStreamV1Tool::initialize() StatusCode CpByteStreamV1Tool::finalize() { - delete m_fea; - delete m_rodStatus; - delete m_cmmCpSubBlock; - delete m_cpmSubBlock; - delete m_towerKey; - delete m_srcIdMap; return StatusCode::SUCCESS; } // Conversion bytestream to CPM towers StatusCode CpByteStreamV1Tool::convert( + const std::string& sgKey, const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMTower>* const ttCollection) + DataVector<LVL1::CPMTower>* const ttCollection) const { CpmTowerData data (ttCollection); - return convertBs(robFrags, data); + return convertBs(sgKey, robFrags, data); } // Conversion bytestream to CPM hits StatusCode CpByteStreamV1Tool::convert( + const std::string& sgKey, const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMHits>* const hitCollection) + DataVector<LVL1::CPMHits>* const hitCollection) const { CpmHitsData data (hitCollection); - return convertBs(robFrags, data); + return convertBs(sgKey, robFrags, data); } // Conversion bytestream to CMM-CP hits StatusCode CpByteStreamV1Tool::convert( + const std::string& sgKey, const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CMMCPHits>* const hitCollection) + DataVector<LVL1::CMMCPHits>* const hitCollection) const { CmmHitsData data (hitCollection); - return convertBs(robFrags, data); + return convertBs(sgKey, robFrags, data); } // Conversion of CP container to bytestream StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, - 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->minorVersionPreLS1(); - m_fea->setRodMinorVersion(minorVersion); - m_rodStatusMap.clear(); + FullEventAssembler<L1CaloSrcIdMap> fea; + fea.clear(); + const uint16_t minorVersion = m_srcIdMap.minorVersionPreLS1(); + fea.setRodMinorVersion(minorVersion); // Pointer to ROD data vector @@ -189,9 +167,19 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, // Set up the container maps - setupCpmTowerMap(cp->towers()); - setupCpmHitsMap(cp->hits()); - setupCmmCpHitsMap(cp->cmmHits()); + LVL1::TriggerTowerKey towerKey; + + // CPM tower map + ConstCpmTowerMap ttMap; + setupCpmTowerMap(cp->towers(), ttMap, towerKey); + + // CPM hits map + ConstCpmHitsMap hitsMap; + setupCpmHitsMap(cp->hits(), hitsMap); + + // CMM-CP hits map + ConstCmmCpHitsMap cmmHitsMap; + setupCmmCpHitsMap(cp->cmmHits(), cmmHitsMap); // Loop over data @@ -221,7 +209,11 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, // Get number of CPM slices and triggered slice offset // for this slink if ( ! slinkSlices(crate, module, modulesPerSlink, - timeslices, trigCpm)) { + timeslices, trigCpm, + ttMap, + hitsMap, + cmmHitsMap, + towerKey)) { msg(MSG::ERROR) << "Inconsistent number of slices or " << "triggered slice offsets in data for crate " << hwCrate << " slink " << slink << endmsg; @@ -240,22 +232,23 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, } L1CaloUserHeader userHeader; userHeader.setCpm(trigCpmNew); - const uint32_t rodIdCpm = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, - m_subDetector); - theROD = m_fea->getRodData(rodIdCpm); + const uint32_t rodIdCpm = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, + m_subDetector); + theROD = fea.getRodData(rodIdCpm); theROD->push_back(userHeader.header()); - m_rodStatusMap.insert(make_pair(rodIdCpm, m_rodStatus)); } if (debug) msg() << "Module " << module << endmsg; // Create a sub-block for each slice (except Neutral format) - m_cpmBlocks.clear(); + // Vector for current CPM sub-blocks + DataVector<CpmSubBlockV1> cpmBlocks; + for (int slice = 0; slice < timeslicesNew; ++slice) { CpmSubBlockV1* const subBlock = new CpmSubBlockV1(); subBlock->setCpmHeader(m_version, m_dataFormat, slice, hwCrate, module, timeslicesNew); - m_cpmBlocks.push_back(subBlock); + cpmBlocks.push_back(subBlock); if (neutralFormat) break; } @@ -267,8 +260,8 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, double phi = 0.; int layer = 0; if (m_cpmMaps->mapping(crate, module, chan, eta, phi, layer)) { - const unsigned int key = m_towerKey->ttKey(phi, eta); - const LVL1::CPMTower* const tt = findCpmTower(key); + const unsigned int key = towerKey.ttKey(phi, eta); + const LVL1::CPMTower* const tt = findCpmTower(key, ttMap); if (tt ) { std::vector<int> emData; std::vector<int> hadData; @@ -288,7 +281,7 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, (hadErrBits.get(LVL1::DataError::LinkDown) << 1) | hadErrBits.get(LVL1::DataError::Parity); const int index = ( neutralFormat ) ? 0 : slice; - CpmSubBlockV1* const subBlock = m_cpmBlocks[index]; + CpmSubBlockV1* const subBlock = cpmBlocks[index]; subBlock->fillTowerData(slice, chan, emData[slice], hadData[slice], emErr, hadErr); } @@ -298,7 +291,7 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, // Add CPM hits - const LVL1::CPMHits* const hits = findCpmHits(crate, module); + const LVL1::CPMHits* const hits = findCpmHits(crate, module, hitsMap); if (hits) { std::vector<unsigned int> vec0; std::vector<unsigned int> vec1; @@ -306,7 +299,7 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, ModifySlices::data(hits->HitsVec1(), vec1, timeslicesNew); for (int slice = 0; slice < timeslicesNew; ++slice) { const int index = ( neutralFormat ) ? 0 : slice; - CpmSubBlockV1* const subBlock = m_cpmBlocks[index]; + CpmSubBlockV1* const subBlock = cpmBlocks[index]; subBlock->setHits(slice, vec0[slice], vec1[slice]); } } @@ -314,7 +307,7 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, // Pack and write the sub-blocks DataVector<CpmSubBlockV1>::iterator pos; - for (pos = m_cpmBlocks.begin(); pos != m_cpmBlocks.end(); ++pos) { + for (pos = cpmBlocks.begin(); pos != cpmBlocks.end(); ++pos) { CpmSubBlockV1* const subBlock = *pos; if ( !subBlock->pack()) { msg(MSG::ERROR) << "CPM sub-block packing failed" << endmsg; @@ -332,8 +325,11 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, // Create a sub-block for each slice (except Neutral format) - m_cmmHit0Blocks.clear(); - m_cmmHit1Blocks.clear(); + /// Vector for current CMM-CP hit0 sub-blocks + DataVector<CmmCpSubBlock> cmmHit0Blocks; + /// Vector for current CMM-CP hit1 sub-blocks + DataVector<CmmCpSubBlock> cmmHit1Blocks; + const int summing = (crate == m_crates - 1) ? CmmSubBlock::SYSTEM : CmmSubBlock::CRATE; for (int slice = 0; slice < timeslicesNew; ++slice) { @@ -341,12 +337,12 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, h0Block->setCmmHeader(m_version, m_dataFormat, slice, hwCrate, summing, CmmSubBlock::CMM_CP, CmmSubBlock::RIGHT, timeslicesNew); - m_cmmHit0Blocks.push_back(h0Block); + cmmHit0Blocks.push_back(h0Block); CmmCpSubBlock* const h1Block = new CmmCpSubBlock(); h1Block->setCmmHeader(m_version, m_dataFormat, slice, hwCrate, summing, CmmSubBlock::CMM_CP, CmmSubBlock::LEFT, timeslicesNew); - m_cmmHit1Blocks.push_back(h1Block); + cmmHit1Blocks.push_back(h1Block); if (neutralFormat) break; } @@ -378,7 +374,7 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, continue; } } - const LVL1::CMMCPHits* const ch = findCmmCpHits(crate, dataID); + const LVL1::CMMCPHits* const ch = findCmmCpHits(crate, dataID, cmmHitsMap); if ( ch ) { std::vector<unsigned int> hits0; std::vector<unsigned int> hits1; @@ -392,17 +388,17 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, const LVL1::DataError err0Bits(err0[slice]); const LVL1::DataError err1Bits(err1[slice]); const int index = ( neutralFormat ) ? 0 : slice; - CmmCpSubBlock* subBlock = m_cmmHit0Blocks[index]; + CmmCpSubBlock* subBlock = cmmHit0Blocks[index]; subBlock->setHits(slice, source, hits0[slice], err0Bits.get(LVL1::DataError::Parity)); - subBlock = m_cmmHit1Blocks[index]; + subBlock = cmmHit1Blocks[index]; subBlock->setHits(slice, source, hits1[slice], err1Bits.get(LVL1::DataError::Parity)); } } } - DataVector<CmmCpSubBlock>::iterator cos = m_cmmHit0Blocks.begin(); - for (; cos != m_cmmHit0Blocks.end(); ++cos) { + DataVector<CmmCpSubBlock>::iterator cos = cmmHit0Blocks.begin(); + for (; cos != cmmHit0Blocks.end(); ++cos) { CmmCpSubBlock* const subBlock = *cos; if ( !subBlock->pack()) { msg(MSG::ERROR) << "CMM-Cp sub-block packing failed" << endmsg; @@ -414,8 +410,8 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, } subBlock->write(theROD); } - cos = m_cmmHit1Blocks.begin(); - for (; cos != m_cmmHit1Blocks.end(); ++cos) { + cos = cmmHit1Blocks.begin(); + for (; cos != cmmHit1Blocks.end(); ++cos) { CmmCpSubBlock* const subBlock = *cos; if ( !subBlock->pack()) { msg(MSG::ERROR) << "CMM-Cp sub-block packing failed" << endmsg; @@ -431,51 +427,64 @@ StatusCode CpByteStreamV1Tool::convert(const LVL1::CPBSCollectionV1* const cp, // 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 -const std::vector<uint32_t>& CpByteStreamV1Tool::sourceIDs( - const std::string& sgKey) +std::vector<uint32_t> CpByteStreamV1Tool::makeSourceIDs() const { - // Check if overlap tower channels wanted - const std::string flag("Overlap"); - const std::string::size_type pos = sgKey.find(flag); - m_coreOverlap = - (pos == std::string::npos || pos != sgKey.length() - flag.length()) ? 0 : 1; + std::vector<uint32_t> sourceIDs; - if (m_sourceIDs.empty()) { + if (!m_sourceIDsProp.empty()) { + sourceIDs = m_sourceIDsProp; + } + else { 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 maxSlinks = m_srcIdMap.maxSlinks(); + for (int hwCrate = m_crateOffsetHw; hwCrate < maxCrates; ++hwCrate) + { + for (int slink = 0; slink < maxSlinks; ++slink) + { const int daqOrRoi = 0; - const uint32_t rodId = m_srcIdMap->getRodID(hwCrate, slink, daqOrRoi, - m_subDetector); - const uint32_t robId = m_srcIdMap->getRobID(rodId); - m_sourceIDs.push_back(robId); + const uint32_t rodId = m_srcIdMap.getRodID(hwCrate, slink, daqOrRoi, + m_subDetector); + const uint32_t robId = m_srcIdMap.getRobID(rodId); + sourceIDs.push_back(robId); } } } - return m_sourceIDs; + return sourceIDs; +} + +const std::vector<uint32_t>& CpByteStreamV1Tool::sourceIDs() const +{ + static const std::vector<uint32_t> sourceIDs = makeSourceIDs(); + return sourceIDs; } // Convert bytestream to given container type StatusCode CpByteStreamV1Tool::convertBs( + const std::string& sgKey, const IROBDataProviderSvc::VROBFRAG& robFrags, - CpByteStreamToolData& data) + CpByteStreamToolData& data) const { + LocalData ld; + + const std::string flag("Overlap"); + const std::string::size_type pos = sgKey.find(flag); + ld.coreOverlap = + (pos == std::string::npos || pos != sgKey.length() - flag.length()) ? 0 : 1; + const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); + CmmCpSubBlock cmmCpSubBlock; + CpmSubBlockV1 cpmSubBlock; + // Loop over ROB fragments int robCount = 0; @@ -525,12 +534,12 @@ StatusCode CpByteStreamV1Tool::convertBs( // 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) != 0 || - (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) != 0 || + (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: ROD " @@ -542,14 +551,14 @@ StatusCode CpByteStreamV1Tool::convertBs( // 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 should be User Header @@ -586,12 +595,12 @@ StatusCode CpByteStreamV1Tool::convertBs( // Loop over sub-blocks - m_rodErr = L1CaloSubBlock::ERROR_NONE; + ld.rodErr = L1CaloSubBlock::ERROR_NONE; while (payload != payloadEnd) { if (L1CaloSubBlock::wordType(*payload) != L1CaloSubBlock::HEADER) { if (debug) msg() << "Unexpected data sequence" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_MISSING_HEADER; + ld.rodErr = L1CaloSubBlock::ERROR_MISSING_HEADER; break; } if (L1CaloSubBlock::version(*payload) != 1) { // <<== CHECK @@ -601,47 +610,48 @@ StatusCode CpByteStreamV1Tool::convertBs( if (CmmSubBlock::cmmBlock(*payload)) { // CMM if (CmmSubBlock::cmmType(*payload) == CmmSubBlock::CMM_CP) { - m_cmmCpSubBlock->clear(); - payload = m_cmmCpSubBlock->read(payload, payloadEnd); - if (m_cmmCpSubBlock->crate() != rodCrate) { + cmmCpSubBlock.clear(); + payload = cmmCpSubBlock.read(payload, payloadEnd); + if (cmmCpSubBlock.crate() != rodCrate) { if (debug) msg() << "Inconsistent crate number in ROD source ID" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER; + ld.rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER; break; } if (data.m_collection == CMM_CP_HITS) { - decodeCmmCp(m_cmmCpSubBlock, trigCmm, static_cast<CmmHitsData&>(data)); - if (m_rodErr != L1CaloSubBlock::ERROR_NONE) { + decodeCmmCp(&cmmCpSubBlock, trigCmm, static_cast<CmmHitsData&>(data), + ld); + if (ld.rodErr != L1CaloSubBlock::ERROR_NONE) { if (debug) msg() << "decodeCmmCp failed" << endmsg; break; } } } else { if (debug) msg() << "Invalid CMM type in module field" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_MODULE_NUMBER; + ld.rodErr = L1CaloSubBlock::ERROR_MODULE_NUMBER; break; } } else { // CPM - m_cpmSubBlock->clear(); - payload = m_cpmSubBlock->read(payload, payloadEnd); - if (m_cpmSubBlock->crate() != rodCrate) { + cpmSubBlock.clear(); + payload = cpmSubBlock.read(payload, payloadEnd); + if (cpmSubBlock.crate() != rodCrate) { if (debug) msg() << "Inconsistent crate number in ROD source ID" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER; + ld.rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER; break; } if (data.m_collection == CPM_TOWERS || data.m_collection == CPM_HITS) { - decodeCpm(m_cpmSubBlock, trigCpm, data); - if (m_rodErr != L1CaloSubBlock::ERROR_NONE) { + decodeCpm(&cpmSubBlock, trigCpm, data, ld); + if (ld.rodErr != L1CaloSubBlock::ERROR_NONE) { if (debug) msg() << "decodeCpm failed" << endmsg; break; } } } } - if (m_rodErr != L1CaloSubBlock::ERROR_NONE) - m_errorTool->rodError(robid, m_rodErr); + if (ld.rodErr != L1CaloSubBlock::ERROR_NONE) + m_errorTool->rodError(robid, ld.rodErr); } return StatusCode::SUCCESS; @@ -650,7 +660,8 @@ StatusCode CpByteStreamV1Tool::convertBs( // Unpack CMM-CP sub-block void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, - CmmHitsData& data) + CmmHitsData& data, + LocalData& ld) const { const bool debug = msgLvl(MSG::DEBUG); if (debug) msg(MSG::DEBUG); @@ -673,13 +684,13 @@ void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, if (debug) msg() << "Triggered CMM slice from header " << "inconsistent with number of slices: " << trigCmm << ", " << timeslices << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } if (timeslices <= sliceNum) { if (debug) msg() << "Total slices inconsistent with slice number: " << timeslices << ", " << sliceNum << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } // Unpack sub-block @@ -688,7 +699,7 @@ void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, std::string errMsg(subBlock->unpackErrorMsg()); msg() << "CMM-CP sub-block unpacking failed: " << errMsg << endmsg; } - m_rodErr = subBlock->unpackErrorCode(); + ld.rodErr = subBlock->unpackErrorCode(); return; } @@ -711,23 +722,23 @@ void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, if (summing == CmmSubBlock::CRATE && source != CmmCpSubBlock::LOCAL) continue; switch (source) { - case CmmCpSubBlock::LOCAL: - dataID = LVL1::CMMCPHits::LOCAL; - break; - case CmmCpSubBlock::REMOTE_0: - dataID = LVL1::CMMCPHits::REMOTE_0; - break; - case CmmCpSubBlock::REMOTE_1: - dataID = LVL1::CMMCPHits::REMOTE_1; - break; - case CmmCpSubBlock::REMOTE_2: - dataID = LVL1::CMMCPHits::REMOTE_2; - break; - case CmmCpSubBlock::TOTAL: - dataID = LVL1::CMMCPHits::TOTAL; - break; - default: - continue; + case CmmCpSubBlock::LOCAL: + dataID = LVL1::CMMCPHits::LOCAL; + break; + case CmmCpSubBlock::REMOTE_0: + dataID = LVL1::CMMCPHits::REMOTE_0; + break; + case CmmCpSubBlock::REMOTE_1: + dataID = LVL1::CMMCPHits::REMOTE_1; + break; + case CmmCpSubBlock::REMOTE_2: + dataID = LVL1::CMMCPHits::REMOTE_2; + break; + case CmmCpSubBlock::TOTAL: + dataID = LVL1::CMMCPHits::TOTAL; + break; + default: + continue; } } const unsigned int hits = subBlock->hits(slice, source); @@ -739,50 +750,50 @@ void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, if (hits || err) { LVL1::CMMCPHits* ch = findCmmCpHits(data, crate, dataID); if ( ! ch ) { // create new CMM hits - m_hitsVec0.assign(timeslices, 0); - m_hitsVec1.assign(timeslices, 0); - m_errVec0.assign(timeslices, 0); - m_errVec1.assign(timeslices, 0); + ld.hitsVec0.assign(timeslices, 0); + ld.hitsVec1.assign(timeslices, 0); + ld.errVec0.assign(timeslices, 0); + ld.errVec1.assign(timeslices, 0); if (module == CmmSubBlock::RIGHT) { - m_hitsVec0[slice] = hits; - m_errVec0[slice] = err; + ld.hitsVec0[slice] = hits; + ld.errVec0[slice] = err; } else { - m_hitsVec1[slice] = hits; - m_errVec1[slice] = err; + ld.hitsVec1[slice] = hits; + ld.errVec1[slice] = err; } auto chp = - std::make_unique<LVL1::CMMCPHits>(swCrate, dataID, m_hitsVec0, m_hitsVec1, - m_errVec0, m_errVec1, trigCmm); + std::make_unique<LVL1::CMMCPHits>(swCrate, dataID, ld.hitsVec0, ld.hitsVec1, + ld.errVec0, ld.errVec1, trigCmm); const int key = crate*100 + dataID; data.m_cmmHitsMap.insert(std::make_pair(key, chp.get())); data.m_cmmHitCollection->push_back(std::move(chp)); } else { - m_hitsVec0 = ch->HitsVec0(); - m_hitsVec1 = ch->HitsVec1(); - m_errVec0 = ch->ErrorVec0(); - m_errVec1 = ch->ErrorVec1(); - const int nsl = m_hitsVec0.size(); + ld.hitsVec0 = ch->HitsVec0(); + ld.hitsVec1 = ch->HitsVec1(); + ld.errVec0 = ch->ErrorVec0(); + ld.errVec1 = ch->ErrorVec1(); + const int nsl = ld.hitsVec0.size(); if (timeslices != nsl) { if (debug) msg() << "Inconsistent number of slices in sub-blocks" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } - if ((module == CmmSubBlock::RIGHT && (m_hitsVec0[slice] != 0 || - m_errVec0[slice] != 0)) || (module == CmmSubBlock::LEFT && - (m_hitsVec1[slice] != 0 || m_errVec1[slice] != 0))) { + if ((module == CmmSubBlock::RIGHT && (ld.hitsVec0[slice] != 0 || + ld.errVec0[slice] != 0)) || (module == CmmSubBlock::LEFT && + (ld.hitsVec1[slice] != 0 || ld.errVec1[slice] != 0))) { if (debug) msg() << "Duplicate data for slice " << slice << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; + ld.rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; return; } if (module == CmmSubBlock::RIGHT) { - m_hitsVec0[slice] = hits; - m_errVec0[slice] = err; + ld.hitsVec0[slice] = hits; + ld.errVec0[slice] = err; } else { - m_hitsVec1[slice] = hits; - m_errVec1[slice] = err; + ld.hitsVec1[slice] = hits; + ld.errVec1[slice] = err; } - ch->addHits(m_hitsVec0, m_hitsVec1, m_errVec0, m_errVec1); + ch->addHits(ld.hitsVec0, ld.hitsVec1, ld.errVec0, ld.errVec1); } } } @@ -794,7 +805,8 @@ void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, // Unpack CPM sub-block void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock, - int trigCpm, CpByteStreamToolData& data) + int trigCpm, CpByteStreamToolData& data, + LocalData& ld) const { const bool debug = msgLvl(MSG::DEBUG); const bool verbose = msgLvl(MSG::VERBOSE); @@ -812,20 +824,20 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock, } if (module < 1 || module > m_modules) { if (debug) msg() << "Unexpected module number: " << module << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_MODULE_NUMBER; + ld.rodErr = L1CaloSubBlock::ERROR_MODULE_NUMBER; return; } if (timeslices <= trigCpm) { if (debug) msg() << "Triggered CPM slice from header " << "inconsistent with number of slices: " << trigCpm << ", " << timeslices << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } if (timeslices <= sliceNum) { if (debug) msg() << "Total slices inconsistent with slice number: " << timeslices << ", " << sliceNum << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } // Unpack sub-block @@ -834,7 +846,7 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock, std::string errMsg(subBlock->unpackErrorMsg()); msg() << "CPM sub-block unpacking failed: " << errMsg << endmsg; } - m_rodErr = subBlock->unpackErrorCode(); + ld.rodErr = subBlock->unpackErrorCode(); return; } @@ -880,49 +892,49 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock, double phi = 0.; int layer = 0; if (m_cpmMaps->mapping(crate, module, chan, eta, phi, layer)) { - if (layer == m_coreOverlap) { - const unsigned int key = m_towerKey->ttKey(phi, eta); + if (layer == ld.coreOverlap) { + const unsigned int key = ld.towerKey.ttKey(phi, eta); LVL1::CPMTower* tt = findCpmTower(tdata, key); if ( ! tt ) { // create new CPM tower - m_emVec.assign(timeslices, 0); - m_hadVec.assign(timeslices, 0); - m_emErrVec.assign(timeslices, 0); - m_hadErrVec.assign(timeslices, 0); - m_emVec[slice] = em; - m_hadVec[slice] = had; - m_emErrVec[slice] = emErr1; - m_hadErrVec[slice] = hadErr1; + ld.emVec.assign(timeslices, 0); + ld.hadVec.assign(timeslices, 0); + ld.emErrVec.assign(timeslices, 0); + ld.hadErrVec.assign(timeslices, 0); + ld.emVec[slice] = em; + ld.hadVec[slice] = had; + ld.emErrVec[slice] = emErr1; + ld.hadErrVec[slice] = hadErr1; auto ttp = - std::make_unique<LVL1::CPMTower>(phi, eta, m_emVec, m_emErrVec, - m_hadVec, m_hadErrVec, trigCpm); + std::make_unique<LVL1::CPMTower>(phi, eta, ld.emVec, ld.emErrVec, + ld.hadVec, ld.hadErrVec, trigCpm); tdata.m_ttMap.insert(std::make_pair(key, ttp.get())); tdata.m_ttCollection->push_back(std::move(ttp)); } else { - m_emVec = tt->emEnergyVec(); - m_hadVec = tt->hadEnergyVec(); - m_emErrVec = tt->emErrorVec(); - m_hadErrVec = tt->hadErrorVec(); - const int nsl = m_emVec.size(); + ld.emVec = tt->emEnergyVec(); + ld.hadVec = tt->hadEnergyVec(); + ld.emErrVec = tt->emErrorVec(); + ld.hadErrVec = tt->hadErrorVec(); + const int nsl = ld.emVec.size(); if (timeslices != nsl) { if (debug) { msg() << "Inconsistent number of slices in sub-blocks" << endmsg; } - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } - if (m_emVec[slice] != 0 || m_hadVec[slice] != 0 || - m_emErrVec[slice] != 0 || m_hadErrVec[slice] != 0) { + if (ld.emVec[slice] != 0 || ld.hadVec[slice] != 0 || + ld.emErrVec[slice] != 0 || ld.hadErrVec[slice] != 0) { if (debug) msg() << "Duplicate data for slice " << slice << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; + ld.rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; return; } - m_emVec[slice] = em; - m_hadVec[slice] = had; - m_emErrVec[slice] = emErr1; - m_hadErrVec[slice] = hadErr1; - tt->fill(m_emVec, m_emErrVec, m_hadVec, m_hadErrVec, trigCpm); + ld.emVec[slice] = em; + ld.hadVec[slice] = had; + ld.emErrVec[slice] = emErr1; + ld.hadErrVec[slice] = hadErr1; + tt->fill(ld.emVec, ld.emErrVec, ld.hadVec, ld.hadErrVec, trigCpm); } } } else if (verbose && (em || had || emErr || hadErr)) { @@ -946,32 +958,32 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock, if (hits0 || hits1) { LVL1::CPMHits* ch = findCpmHits(hdata, crate, module); if ( ! ch ) { // create new CPM hits - m_hitsVec0.assign(timeslices, 0); - m_hitsVec1.assign(timeslices, 0); - m_hitsVec0[slice] = hits0; - m_hitsVec1[slice] = hits1; + ld.hitsVec0.assign(timeslices, 0); + ld.hitsVec1.assign(timeslices, 0); + ld.hitsVec0[slice] = hits0; + ld.hitsVec1[slice] = hits1; auto chp = - std::make_unique<LVL1::CPMHits>(swCrate, module, m_hitsVec0, m_hitsVec1, trigCpm); + std::make_unique<LVL1::CPMHits>(swCrate, module, ld.hitsVec0, ld.hitsVec1, trigCpm); hdata.m_hitsMap.insert(std::make_pair(crate*m_modules+module-1, chp.get())); hdata.m_hitCollection->push_back(std::move(chp)); } else { - m_hitsVec0 = ch->HitsVec0(); - m_hitsVec1 = ch->HitsVec1(); - const int nsl = m_hitsVec0.size(); + ld.hitsVec0 = ch->HitsVec0(); + ld.hitsVec1 = ch->HitsVec1(); + const int nsl = ld.hitsVec0.size(); if (timeslices != nsl) { if (debug) msg() << "Inconsistent number of slices in sub-blocks" << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_SLICES; + ld.rodErr = L1CaloSubBlock::ERROR_SLICES; return; } - if (m_hitsVec0[slice] != 0 || m_hitsVec1[slice] != 0) { + if (ld.hitsVec0[slice] != 0 || ld.hitsVec1[slice] != 0) { if (debug) msg() << "Duplicate data for slice " << slice << endmsg; - m_rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; + ld.rodErr = L1CaloSubBlock::ERROR_DUPLICATE_DATA; return; } - m_hitsVec0[slice] = hits0; - m_hitsVec1[slice] = hits1; - ch->addHits(m_hitsVec0, m_hitsVec1); + ld.hitsVec0[slice] = hits0; + ld.hitsVec1[slice] = hits1; + ch->addHits(ld.hitsVec0, ld.hitsVec1); } } else if (verbose) { msg(MSG::VERBOSE) << "No CPM hits data for crate/module/slice " @@ -987,10 +999,11 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock, // Find a CPM tower for given key const -LVL1::CPMTower* CpByteStreamV1Tool::findCpmTower(const unsigned int key) const +LVL1::CPMTower* CpByteStreamV1Tool::findCpmTower(const unsigned int key, + const ConstCpmTowerMap& ttMap) const { - ConstCpmTowerMap::const_iterator mapIter = m_ttMap.find(key); - if (mapIter != m_ttMap.end()) return mapIter->second; + ConstCpmTowerMap::const_iterator mapIter = ttMap.find(key); + if (mapIter != ttMap.end()) return mapIter->second; return nullptr; } @@ -1005,16 +1018,18 @@ LVL1::CPMTower* CpByteStreamV1Tool::findCpmTower(const CpmTowerData& data, // Find CPM hits for given crate, module const -LVL1::CPMHits* CpByteStreamV1Tool::findCpmHits(const int crate, const int module) const +LVL1::CPMHits* CpByteStreamV1Tool::findCpmHits(const int crate, + const int module, + const ConstCpmHitsMap& hitsMap) const { ConstCpmHitsMap::const_iterator mapIter = - m_hitsMap.find(crate*m_modules + module - 1); - if (mapIter != m_hitsMap.end()) return mapIter->second; + hitsMap.find(crate*m_modules + module - 1); + if (mapIter != hitsMap.end()) return mapIter->second; return nullptr; } LVL1::CPMHits* CpByteStreamV1Tool::findCpmHits(const CpmHitsData& data, - const int crate, const int module) const + const int crate, const int module) const { CpmHitsMap::const_iterator mapIter = data.m_hitsMap.find(crate*m_modules + module - 1); @@ -1026,10 +1041,11 @@ LVL1::CPMHits* CpByteStreamV1Tool::findCpmHits(const CpmHitsData& data, const LVL1::CMMCPHits* CpByteStreamV1Tool::findCmmCpHits(const int crate, - const int dataID) const + const int dataID, + const ConstCmmCpHitsMap& cmmHitsMap) const { - ConstCmmCpHitsMap::const_iterator mapIter = m_cmmHitsMap.find(crate*100 + dataID); - if (mapIter != m_cmmHitsMap.end()) return mapIter->second; + ConstCmmCpHitsMap::const_iterator mapIter = cmmHitsMap.find(crate*100 + dataID); + if (mapIter != cmmHitsMap.end()) return mapIter->second; return nullptr; } @@ -1044,17 +1060,18 @@ LVL1::CMMCPHits* CpByteStreamV1Tool::findCmmCpHits(const CmmHitsData& data, // Set up CPM tower map -void CpByteStreamV1Tool::setupCpmTowerMap(const CpmTowerCollection* - const ttCollection) +void CpByteStreamV1Tool::setupCpmTowerMap(const CpmTowerCollection* ttCollection, + ConstCpmTowerMap& ttMap, + LVL1::TriggerTowerKey& towerKey) const { - m_ttMap.clear(); + ttMap.clear(); if (ttCollection) { CpmTowerCollection::const_iterator pos = ttCollection->begin(); CpmTowerCollection::const_iterator pose = ttCollection->end(); for (; pos != pose; ++pos) { const LVL1::CPMTower* const tt = *pos; - const unsigned int key = m_towerKey->ttKey(tt->phi(), tt->eta()); - m_ttMap.insert(std::make_pair(key, tt)); + const unsigned int key = towerKey.ttKey(tt->phi(), tt->eta()); + ttMap.insert(std::make_pair(key, tt)); } } } @@ -1062,9 +1079,10 @@ void CpByteStreamV1Tool::setupCpmTowerMap(const CpmTowerCollection* // Set up CPM hits map void CpByteStreamV1Tool::setupCpmHitsMap(const CpmHitsCollection* - const hitCollection) + const hitCollection, + ConstCpmHitsMap& hitsMap) const { - m_hitsMap.clear(); + hitsMap.clear(); if (hitCollection) { CpmHitsCollection::const_iterator pos = hitCollection->begin(); CpmHitsCollection::const_iterator pose = hitCollection->end(); @@ -1072,7 +1090,7 @@ void CpByteStreamV1Tool::setupCpmHitsMap(const CpmHitsCollection* const LVL1::CPMHits* const hits = *pos; const int crate = hits->crate() - m_crateOffsetSw; const int key = m_modules * crate + hits->module() - 1; - m_hitsMap.insert(std::make_pair(key, hits)); + hitsMap.insert(std::make_pair(key, hits)); } } } @@ -1080,9 +1098,10 @@ void CpByteStreamV1Tool::setupCpmHitsMap(const CpmHitsCollection* // Set up CMM-CP hits map void CpByteStreamV1Tool::setupCmmCpHitsMap(const CmmCpHitsCollection* - const hitCollection) + const hitCollection, + ConstCmmCpHitsMap& cmmHitsMap) const { - m_cmmHitsMap.clear(); + cmmHitsMap.clear(); if (hitCollection) { CmmCpHitsCollection::const_iterator pos = hitCollection->begin(); CmmCpHitsCollection::const_iterator pose = hitCollection->end(); @@ -1090,7 +1109,7 @@ void CpByteStreamV1Tool::setupCmmCpHitsMap(const CmmCpHitsCollection* const LVL1::CMMCPHits* const hits = *pos; const int crate = hits->crate() - m_crateOffsetSw; const int key = crate*100 + hits->dataID(); - m_cmmHitsMap.insert(std::make_pair(key, hits)); + cmmHitsMap.insert(std::make_pair(key, hits)); } } } @@ -1098,7 +1117,13 @@ void CpByteStreamV1Tool::setupCmmCpHitsMap(const CmmCpHitsCollection* // Get number of slices and triggered slice offset for next slink bool CpByteStreamV1Tool::slinkSlices(const int crate, const int module, - const int modulesPerSlink, int& timeslices, int& trigCpm) + const int modulesPerSlink, + int& timeslices, + int& trigCpm, + const ConstCpmTowerMap& ttMap, + const ConstCpmHitsMap& hitsMap, + const ConstCmmCpHitsMap& cmmHitsMap, + LVL1::TriggerTowerKey& towerKey) const { int slices = -1; int trigC = m_dfltSlices/2; @@ -1108,8 +1133,8 @@ bool CpByteStreamV1Tool::slinkSlices(const int crate, const int module, double phi = 0.; int layer = 0; if ( !m_cpmMaps->mapping(crate, mod, chan, eta, phi, layer)) continue; - const unsigned int key = m_towerKey->ttKey(phi, eta); - const LVL1::CPMTower* const tt = findCpmTower(key); + const unsigned int key = towerKey.ttKey(phi, eta); + const LVL1::CPMTower* const tt = findCpmTower(key, ttMap); if ( !tt ) continue; const int numdat = 4; std::vector<int> sums(numdat); @@ -1135,7 +1160,7 @@ bool CpByteStreamV1Tool::slinkSlices(const int crate, const int module, } else if (slices != sizes[i] || trigC != peak) return false; } } - const LVL1::CPMHits* const hits = findCpmHits(crate, mod); + const LVL1::CPMHits* const hits = findCpmHits(crate, mod, hitsMap); if (hits) { const int numdat = 2; std::vector<unsigned int> sums(numdat); @@ -1163,7 +1188,7 @@ bool CpByteStreamV1Tool::slinkSlices(const int crate, const int module, const int numdat = 4; std::vector<unsigned int> sums(numdat); std::vector<int> sizes(numdat); - const LVL1::CMMCPHits* const hits = findCmmCpHits(crate, dataID); + const LVL1::CMMCPHits* const hits = findCmmCpHits(crate, dataID, cmmHitsMap); if (hits) { sums[0] = std::accumulate((hits->HitsVec0()).begin(), (hits->HitsVec0()).end(), 0); diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.h index b804cd51f4c19f3b4a02d6cdba86bd46db8242e1..5154a79c067bdb08ad87bb5cedb9c6b7723e0de2 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.h +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.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_CPBYTESTREAMV1TOOL_H @@ -11,6 +11,8 @@ #include <string> #include <vector> +#include "L1CaloSrcIdMap.h" +#include "TrigT1CaloUtils/TriggerTowerKey.h" #include "AthenaBaseComps/AthAlgTool.h" #include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h" #include "ByteStreamData/RawEvent.h" @@ -62,22 +64,50 @@ class CpByteStreamV1Tool : public AthAlgTool { virtual StatusCode finalize(); /// Convert ROB fragments to CPM towers - StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMTower>* ttCollection); + StatusCode convert(const std::string& sgKey, + const IROBDataProviderSvc::VROBFRAG& robFrags, + DataVector<LVL1::CPMTower>* ttCollection) const; /// Convert ROB fragments to CPM hits - StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CPMHits>* hitCollection); + StatusCode convert(const std::string& sgKey, + const IROBDataProviderSvc::VROBFRAG& robFrags, + DataVector<LVL1::CPMHits>* hitCollection) const; /// Convert ROB fragments to CMM-CP hits - StatusCode convert(const IROBDataProviderSvc::VROBFRAG& robFrags, - DataVector<LVL1::CMMCPHits>* hitCollection); + StatusCode convert(const std::string& sgKey, + const IROBDataProviderSvc::VROBFRAG& robFrags, + DataVector<LVL1::CMMCPHits>* hitCollection) const; /// Convert CP Container to bytestream - StatusCode convert(const LVL1::CPBSCollectionV1* cp, RawEventWrite* re); + StatusCode convert(const LVL1::CPBSCollectionV1* cp, 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; private: + struct LocalData + { + /// Tower channels to accept (1=Core, 2=Overlap) + int coreOverlap = 0; + /// Unpacking error code + unsigned int rodErr = 0; + /// Hits0 vector for unpacking + std::vector<unsigned int> hitsVec0; + /// Hits1 vector for unpacking + std::vector<unsigned int> hitsVec1; + /// Error0 vector for unpacking + std::vector<int> errVec0; + /// Error1 vector for unpacking + std::vector<int> errVec1; + /// EM data vector for unpacking + std::vector<int> emVec; + /// Had data vector for unpacking + std::vector<int> hadVec; + /// EM error data vector for unpacking + std::vector<int> emErrVec; + /// Had error data vector for unpacking + std::vector<int> hadErrVec; + /// Trigger tower key provider + LVL1::TriggerTowerKey towerKey; + }; enum CollectionType { CPM_TOWERS, CPM_HITS, CMM_CP_HITS }; @@ -122,116 +152,88 @@ class CpByteStreamV1Tool : public AthAlgTool { CmmCpHitsMap m_cmmHitsMap; }; + /// Create list of all source IDs. + std::vector<uint32_t> makeSourceIDs() const; + /// Convert bytestream to given container type - StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG& robFrags, - CpByteStreamToolData& data); + StatusCode convertBs(const std::string& sgKey, + const IROBDataProviderSvc::VROBFRAG& robFrags, + CpByteStreamToolData& data) const; /// Unpack CMM-CP sub-block - void decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, CmmHitsData& data); + void decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, CmmHitsData& data, + LocalData& ld) const; /// Unpack CPM sub-block - void decodeCpm(CpmSubBlockV1* subBlock, int trigCpm, CpByteStreamToolData& data); + void decodeCpm(CpmSubBlockV1* subBlock, int trigCpm, CpByteStreamToolData& data, + LocalData& ld) const; /// Find a CPM tower for given key - const LVL1::CPMTower* findCpmTower(unsigned int key) const; + const LVL1::CPMTower* findCpmTower(unsigned int key, + const ConstCpmTowerMap& ttMap) const; LVL1::CPMTower* findCpmTower(const CpmTowerData& data, unsigned int key) const; /// Find CPM hits for given crate, module - const LVL1::CPMHits* findCpmHits(int crate, int module) const; + const LVL1::CPMHits* findCpmHits(int crate, int module, + const ConstCpmHitsMap& hitsMap) const; LVL1::CPMHits* findCpmHits(const CpmHitsData& data, int crate, int module) const; /// Find CMM-CP hits for given crate, data ID - const LVL1::CMMCPHits* findCmmCpHits(int crate, int dataID) const; + const LVL1::CMMCPHits* findCmmCpHits(int crate, int dataID, + const ConstCmmCpHitsMap& cmmHitsMap) const; LVL1::CMMCPHits* findCmmCpHits(const CmmHitsData& data, int crate, int dataID) const; /// Set up CPM tower map - void setupCpmTowerMap(const CpmTowerCollection* ttCollection); + void setupCpmTowerMap(const CpmTowerCollection* ttCollection, + ConstCpmTowerMap& ttMap, + LVL1::TriggerTowerKey& towerKey) const; /// Set up CPM hits map - void setupCpmHitsMap(const CpmHitsCollection* hitCollection); + void setupCpmHitsMap(const CpmHitsCollection* hitCollection, + ConstCpmHitsMap& hitsMap) const; /// Set up CMM-CP hits map - void setupCmmCpHitsMap(const CmmCpHitsCollection* hitCollection); + void setupCmmCpHitsMap(const CmmCpHitsCollection* hitCollection, + ConstCmmCpHitsMap& cmmHitsMap) const; /// Get number of slices and triggered slice offset for next slink bool slinkSlices(int crate, int module, int modulesPerSlink, - int& timeslices, int& trigJem); + int& timeslices, int& trigJem, + const ConstCpmTowerMap& ttMap, + const ConstCpmHitsMap& hitsMap, + const ConstCmmCpHitsMap& cmmHitsMap, + LVL1::TriggerTowerKey& towerKey) const; /// Channel mapping tool ToolHandle<LVL1::IL1CaloMappingTool> m_cpmMaps; /// 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 channels per module - int m_channels; - /// Number of crates + const int m_channels; + /// Property: Number of crates 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; - /// Default number of slices in simulation + /// Property: Default number of slices in simulation int m_dfltSlices; - /// Force number of slices in bytestream + /// Property: Force number of slices in bytestream int m_forceSlices; - /// 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; - /// Tower channels to accept (1=Core, 2=Overlap) - int m_coreOverlap; - /// Unpacking error code - unsigned int m_rodErr; - /// ROB source IDs - std::vector<uint32_t> m_sourceIDs; + /// Property: ROB source IDs + std::vector<uint32_t> m_sourceIDsProp; /// Sub-detector type - eformat::SubDetector m_subDetector; + const eformat::SubDetector m_subDetector; /// Source ID converter - L1CaloSrcIdMap* m_srcIdMap; - /// Trigger tower key provider - LVL1::TriggerTowerKey* m_towerKey; - /// CPM sub-block for unpacking - CpmSubBlockV1* m_cpmSubBlock; - /// CMM-CP sub-block for unpacking - CmmCpSubBlock* m_cmmCpSubBlock; - /// Hits0 vector for unpacking - std::vector<unsigned int> m_hitsVec0; - /// Hits1 vector for unpacking - std::vector<unsigned int> m_hitsVec1; - /// Error0 vector for unpacking - std::vector<int> m_errVec0; - /// Error1 vector for unpacking - std::vector<int> m_errVec1; - /// EM data vector for unpacking - std::vector<int> m_emVec; - /// Had data vector for unpacking - std::vector<int> m_hadVec; - /// EM error data vector for unpacking - std::vector<int> m_emErrVec; - /// Had error data vector for unpacking - std::vector<int> m_hadErrVec; - /// Vector for current CPM sub-blocks - DataVector<CpmSubBlockV1> m_cpmBlocks; - /// Vector for current CMM-CP hit0 sub-blocks - DataVector<CmmCpSubBlock> m_cmmHit0Blocks; - /// Vector for current CMM-CP hit1 sub-blocks - DataVector<CmmCpSubBlock> m_cmmHit1Blocks; - /// CPM tower map - ConstCpmTowerMap m_ttMap; - /// CPM hits map - ConstCpmHitsMap m_hitsMap; - /// CMM-CP hits map - ConstCmmCpHitsMap m_cmmHitsMap; - /// 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/CpByteStreamV2Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.cxx index 2c4966e11e5eb770bf1a27ce9697e41bdb003402..f8e6e1bb281d9af4607dd50bdb41f9b8ff6b5a7a 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.cxx @@ -102,8 +102,8 @@ CpByteStreamV2Tool::~CpByteStreamV2Tool() StatusCode CpByteStreamV2Tool::initialize() { - msg(MSG::INFO) << "Initializing " << name() << " - package version " - << PACKAGE_VERSION << endmsg; + ATH_MSG_INFO ("Initializing " << name() << " - package version " + << PACKAGE_VERSION); CHECK(m_cpmMaps.retrieve()); CHECK(m_errorTool.retrieve()); @@ -207,7 +207,7 @@ StatusCode CpByteStreamV2Tool::convert(const LVL1::CPBSCollectionV2 *const cp, LVL1::TriggerTowerKey towerKey; - // CPM tower map + // CPM tower map ConstCpmTowerMap ttMap; setupCpmTowerMap(cp->towers(), ttMap, towerKey); diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.h index b3653412790c6bece90a6095d00fee69cbd79216..eec29fbf42adae9f6f604f97183d0042045af4e3 100755 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.h +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.h @@ -257,8 +257,8 @@ class CpByteStreamV2Tool : public AthAlgTool { const eformat::SubDetector m_subDetector; /// Source ID converter const L1CaloSrcIdMap m_srcIdMap; - /// Property: ROB source IDs - std::vector<uint32_t> m_sourceIDsProp; + /// Property: ROB source IDs + std::vector<uint32_t> m_sourceIDsProp; }; } // end namespace diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpReadByteStreamV1Cnv.icc b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpReadByteStreamV1Cnv.icc index 8bc7c26ac7a77064956c9f4c5ee727c407f70753..ff4203ca93e128f96d168b4317a7a61557ba1b4f 100644 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpReadByteStreamV1Cnv.icc +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpReadByteStreamV1Cnv.icc @@ -89,7 +89,7 @@ StatusCode CpReadByteStreamV1Cnv<Container>::createObj( IOpaqueAddress* pAddr, } // get SourceIDs - const std::vector<uint32_t>& vID(m_tool->sourceIDs(nm)); + const std::vector<uint32_t>& vID(m_tool->sourceIDs()); // get ROB fragments IROBDataProviderSvc::VROBFRAG robFrags; @@ -105,7 +105,7 @@ StatusCode CpReadByteStreamV1Cnv<Container>::createObj( IOpaqueAddress* pAddr, return StatusCode::SUCCESS; } - ATH_CHECK( m_tool->convert(robFrags, collection.get()) ); + ATH_CHECK( m_tool->convert(nm, robFrags, collection.get()) ); pObj = SG::asStorable(std::move(collection)); diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpReadByteStreamV1V2Cnv.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpReadByteStreamV1V2Cnv.cxx index d5660c39f3287e4d5446151b78be008ae825615f..f3215f902495cd6f8f1b854266e14a56ff253aee 100644 --- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpReadByteStreamV1V2Cnv.cxx +++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpReadByteStreamV1V2Cnv.cxx @@ -93,7 +93,7 @@ StatusCode CpReadByteStreamV1V2Cnv::createObj( IOpaqueAddress* pAddr, } // get SourceIDs - const std::vector<uint32_t>& vID1(m_tool1->sourceIDs(nm)); + const std::vector<uint32_t>& vID1(m_tool1->sourceIDs()); const std::vector<uint32_t>& vID2(m_tool2->sourceIDs()); // get ROB fragments @@ -115,7 +115,7 @@ StatusCode CpReadByteStreamV1V2Cnv::createObj( IOpaqueAddress* pAddr, // Pre-LS1 data if (robFrags1.size() > 0) { - ATH_CHECK( m_tool1->convert(robFrags1, towerCollection.get()) ); + ATH_CHECK( m_tool1->convert(nm, robFrags1, towerCollection.get()) ); } // Post-LS1 data if (robFrags2.size() > 0) {