From cd21b6aa10124f1a13bed3f504621bab7aa8957e Mon Sep 17 00:00:00 2001
From: scott snyder <sss@karma>
Date: Mon, 28 Sep 2020 22:34:45 -0400
Subject: [PATCH] TrigT1CaloByteStream: Make CpByteStream* tools const.

Make remaining CpByteStream* tools const.
---
 .../src/CpByteStreamTool.cxx                  | 459 ++++++++--------
 .../src/CpByteStreamTool.h                    | 161 +++---
 .../src/CpByteStreamV1Tool.cxx                | 499 +++++++++---------
 .../src/CpByteStreamV1Tool.h                  | 164 +++---
 .../src/CpByteStreamV2Tool.cxx                |   6 +-
 .../src/CpByteStreamV2Tool.h                  |   4 +-
 .../src/CpReadByteStreamV1Cnv.icc             |   4 +-
 .../src/CpReadByteStreamV1V2Cnv.cxx           |   4 +-
 8 files changed, 679 insertions(+), 622 deletions(-)

diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx
index b14ec65ac48c..b99dbf95bd7d 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 7e42a7952350..dd7619a8c5ed 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 30e11fd588e5..878960c7eaf9 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 b804cd51f4c1..5154a79c067b 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 2c4966e11e5e..f8e6e1bb281d 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 b3653412790c..eec29fbf42ad 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 8bc7c26ac7a7..ff4203ca93e1 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 d5660c39f328..f3215f902495 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) {
-- 
GitLab