From d14c0186d3688c9215f1ea1454499c5e1b054a34 Mon Sep 17 00:00:00 2001
From: scott snyder <scott.snyder@cern.ch>
Date: Wed, 26 Jul 2017 14:32:21 +0200
Subject: [PATCH] TrigT1CaloByteStream: Fix const problems.

DataVector has had a long-standing bug in which it was possible to
get a non-const pointer from a const_iterator.  This package was relying
on that bug to compile.  Rework so that it handles const properly.

Classes in this package are used for both packing to bytestream and unpacking
from bytestream.  To do this, they use they use temporary maps stored
in data members with types like std::map<int, LVL1::CpmHits*>.
For the case of unpacking from bytestream, this is ok; however, for the
case of packing to bytestream, the pointers being entered into the
map should actually be const.

Reworked in this manner.  Bytestream packing is largely the same, with
the maps changed to be const.  For bytestream unpacking, we create
non-const maps as local variables and pass them around as needed.

Eventually, it would be nice to get rid of the member variables used for
packing as well.



Former-commit-id: 5e8c5163acb8b2b7bf08d174060dc48f44855507
---
 .../src/CpByteStreamTool.cxx                  | 133 +++++----
 .../src/CpByteStreamTool.h                    |  59 +++-
 .../src/CpByteStreamV1Tool.cxx                | 133 +++++----
 .../src/CpByteStreamV1Tool.h                  |  59 +++-
 .../src/CpByteStreamV2Tool.cxx                | 136 +++++----
 .../src/CpByteStreamV2Tool.h                  |  59 +++-
 .../src/JepByteStreamTool.cxx                 | 277 +++++++++++-------
 .../src/JepByteStreamTool.h                   |  90 ++++--
 .../src/JepByteStreamV1Tool.cxx               | 268 ++++++++++-------
 .../src/JepByteStreamV1Tool.h                 |  90 ++++--
 .../src/JepByteStreamV2Tool.cxx               | 226 ++++++++------
 .../src/JepByteStreamV2Tool.h                 |  90 ++++--
 12 files changed, 1029 insertions(+), 591 deletions(-)

diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx
index 26e0d842036..73bcb78f963 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.cxx
@@ -141,9 +141,8 @@ StatusCode CpByteStreamTool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CPMTower>* const ttCollection)
 {
-  m_ttCollection = ttCollection;
-  m_ttMap.clear();
-  return convertBs(robFrags, CPM_TOWERS);
+  CpmTowerData data (ttCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CPM hits
@@ -152,9 +151,8 @@ StatusCode CpByteStreamTool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CPMHits>* const hitCollection)
 {
-  m_hitCollection = hitCollection;
-  m_hitsMap.clear();
-  return convertBs(robFrags, CPM_HITS);
+  CpmHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMM-CP hits
@@ -163,9 +161,8 @@ StatusCode CpByteStreamTool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CMMCPHits>* const hitCollection)
 {
-  m_cmmHitCollection = hitCollection;
-  m_cmmHitsMap.clear();
-  return convertBs(robFrags, CMM_CP_HITS);
+  CmmHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion of CP container to bytestream
@@ -471,7 +468,7 @@ const std::vector<uint32_t>& CpByteStreamTool::sourceIDs(
 
 StatusCode CpByteStreamTool::convertBs(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
-                            const CollectionType collection)
+                            CpByteStreamToolData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -599,8 +596,8 @@ StatusCode CpByteStreamTool::convertBs(
 	    m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
 	    break;
           }
-	  if (collection == CMM_CP_HITS) {
-	    decodeCmmCp(m_cmmCpSubBlock, trigCmm);
+	  if (data.m_collection == CMM_CP_HITS) {
+	    decodeCmmCp(m_cmmCpSubBlock, trigCmm, static_cast<CmmHitsData&>(data));
 	    if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
 	      if (debug) msg() << "decodeCmmCp failed" << endmsg;
 	      break;
@@ -622,8 +619,8 @@ StatusCode CpByteStreamTool::convertBs(
 	  m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
 	  break;
         }
-	if (collection == CPM_TOWERS || collection == CPM_HITS) {
-	  decodeCpm(m_cpmSubBlock, trigCpm, collection);
+	if (data.m_collection == CPM_TOWERS || data.m_collection == CPM_HITS) {
+	  decodeCpm(m_cpmSubBlock, trigCpm, data);
 	  if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
 	    if (debug) msg() << "decodeCpm failed" << endmsg;
 	    break;
@@ -640,7 +637,8 @@ StatusCode CpByteStreamTool::convertBs(
 
 // Unpack CMM-CP sub-block
 
-void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm)
+void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm,
+                                   CmmHitsData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -727,7 +725,7 @@ void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm)
       errorBits.set(LVL1::DataError::SubStatusWord, subStatus);
       err = errorBits.error();
       if (hits || err) {
-        LVL1::CMMCPHits* ch = findCmmCpHits(crate, dataID);
+        LVL1::CMMCPHits* ch = findCmmCpHits(data, crate, dataID);
 	if ( ! ch ) {   // create new CMM hits
 	  m_hitsVec0.assign(timeslices, 0);
 	  m_hitsVec1.assign(timeslices, 0);
@@ -740,11 +738,12 @@ void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm)
 	    m_hitsVec1[slice] = hits;
 	    m_errVec1[slice]  = err;
 	  }
-	  ch = new LVL1::CMMCPHits(swCrate, dataID, m_hitsVec0, m_hitsVec1,
-	                                    m_errVec0, m_errVec1, trigCmm);
+          auto chp =
+            std::make_unique<LVL1::CMMCPHits>(swCrate, dataID, m_hitsVec0, m_hitsVec1,
+                                              m_errVec0, m_errVec1, trigCmm);
           const int key = crate*100 + dataID;
-	  m_cmmHitsMap.insert(std::make_pair(key, ch));
-	  m_cmmHitCollection->push_back(ch);
+	  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();
@@ -783,7 +782,7 @@ void CpByteStreamTool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm)
 // Unpack CPM sub-block
 
 void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock,
-                                 int trigCpm, const CollectionType collection)
+                                 int trigCpm, CpByteStreamToolData& data)
 {
   const bool debug   = msgLvl(MSG::DEBUG);
   const bool verbose = msgLvl(MSG::VERBOSE);
@@ -839,7 +838,8 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock,
   const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
   for (int slice = sliceBeg; slice < sliceEnd; ++slice) {
 
-    if (collection == CPM_TOWERS) {
+    if (data.m_collection == CPM_TOWERS) {
+      CpmTowerData& tdata = static_cast<CpmTowerData&> (data);
 
       // Loop over tower channels and fill CPM towers
 
@@ -870,7 +870,7 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock,
 	  if (m_cpmMaps->mapping(crate, module, chan, eta, phi, layer)) {
 	    if (layer == m_coreOverlap) {
 	      const unsigned int key = m_towerKey->ttKey(phi, eta);
-	      LVL1::CPMTower* tt = findCpmTower(key);
+	      LVL1::CPMTower* tt = findCpmTower(tdata, key);
 	      if ( ! tt ) {   // create new CPM tower
 	        m_emVec.assign(timeslices, 0);
 	        m_hadVec.assign(timeslices, 0);
@@ -880,10 +880,11 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock,
 	        m_hadVec[slice]    = had;
 	        m_emErrVec[slice]  = emErr1;
 	        m_hadErrVec[slice] = hadErr1;
-	        tt = new LVL1::CPMTower(phi, eta, m_emVec, m_emErrVec,
-	                                          m_hadVec, m_hadErrVec, trigCpm);
-	        m_ttMap.insert(std::make_pair(key, tt));
-	        m_ttCollection->push_back(tt);
+                auto ttp = 
+                  std::make_unique<LVL1::CPMTower>(phi, eta, m_emVec, m_emErrVec,
+                                                   m_hadVec, m_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();
@@ -923,22 +924,24 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock,
 	  msg(MSG::DEBUG);
         }
       }
-    } else if (collection == CPM_HITS) {
+    } else if (data.m_collection == CPM_HITS) {
+      CpmHitsData& hdata = static_cast<CpmHitsData&> (data);
 
       // Get CPM hits
 
       const unsigned int hits0 = subBlock->hits0(slice);
       const unsigned int hits1 = subBlock->hits1(slice);
       if (hits0 || hits1) {
-        LVL1::CPMHits* ch = findCpmHits(crate, module);
+        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;
-	  ch = new LVL1::CPMHits(swCrate, module, m_hitsVec0, m_hitsVec1, trigCpm);
-	  m_hitsMap.insert(std::make_pair(crate*m_modules+module-1, ch));
-	  m_hitCollection->push_back(ch);
+          auto chp = 
+            std::make_unique<LVL1::CPMHits>(swCrate, module, m_hitsVec0, m_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();
@@ -971,36 +974,60 @@ void CpByteStreamTool::decodeCpm(CpmSubBlock* subBlock,
 
 // Find a CPM tower for given key
 
-LVL1::CPMTower* CpByteStreamTool::findCpmTower(const unsigned int key)
+const
+LVL1::CPMTower* CpByteStreamTool::findCpmTower(const unsigned int key) const
+{
+  ConstCpmTowerMap::const_iterator mapIter = m_ttMap.find(key);
+  if (mapIter != m_ttMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CPMTower* CpByteStreamTool::findCpmTower(const CpmTowerData& data,
+                                               const unsigned int key) const
 {
-  LVL1::CPMTower* tt = 0;
-  CpmTowerMap::const_iterator mapIter;
-  mapIter = m_ttMap.find(key);
-  if (mapIter != m_ttMap.end()) tt = mapIter->second;
-  return tt;
+  CpmTowerMap::const_iterator mapIter = data.m_ttMap.find(key);
+  if (mapIter != data.m_ttMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CPM hits for given crate, module
 
-LVL1::CPMHits* CpByteStreamTool::findCpmHits(const int crate, const int module)
+const
+LVL1::CPMHits* CpByteStreamTool::findCpmHits(const int crate, const int module) const
 {
-  LVL1::CPMHits* hits = 0;
-  CpmHitsMap::const_iterator mapIter;
-  mapIter = m_hitsMap.find(crate*m_modules + module - 1);
-  if (mapIter != m_hitsMap.end()) hits = mapIter->second;
-  return hits;
+  ConstCpmHitsMap::const_iterator mapIter =
+    m_hitsMap.find(crate*m_modules + module - 1);
+  if (mapIter != m_hitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CPMHits* CpByteStreamTool::findCpmHits(const CpmHitsData& data,
+                                             const int crate, const int module) const
+{
+  CpmHitsMap::const_iterator mapIter =
+    data.m_hitsMap.find(crate*m_modules + module - 1);
+  if (mapIter != data.m_hitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMM-CP hits for given crate, dataID
 
+const
 LVL1::CMMCPHits* CpByteStreamTool::findCmmCpHits(const int crate,
-                                                 const int dataID)
+                                                 const int dataID) const
+{
+  ConstCmmCpHitsMap::const_iterator mapIter = m_cmmHitsMap.find(crate*100 + dataID);
+  if (mapIter != m_cmmHitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMMCPHits* CpByteStreamTool::findCmmCpHits(const CmmHitsData& data,
+                                                 const int crate,
+                                                 const int dataID) const
 {
-  LVL1::CMMCPHits* hits = 0;
-  CmmCpHitsMap::const_iterator mapIter;
-  mapIter = m_cmmHitsMap.find(crate*100 + dataID);
-  if (mapIter != m_cmmHitsMap.end()) hits = mapIter->second;
-  return hits;
+  CmmCpHitsMap::const_iterator mapIter = data.m_cmmHitsMap.find(crate*100 + dataID);
+  if (mapIter != data.m_cmmHitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Set up CPM tower map
@@ -1013,7 +1040,7 @@ void CpByteStreamTool::setupCpmTowerMap(const CpmTowerCollection*
     CpmTowerCollection::const_iterator pos  = ttCollection->begin();
     CpmTowerCollection::const_iterator pose = ttCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CPMTower* const tt = *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));
     }
@@ -1030,7 +1057,7 @@ void CpByteStreamTool::setupCpmHitsMap(const CpmHitsCollection*
     CpmHitsCollection::const_iterator pos  = hitCollection->begin();
     CpmHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CPMHits* const hits = *pos;
+      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));
@@ -1048,7 +1075,7 @@ void CpByteStreamTool::setupCmmCpHitsMap(const CmmCpHitsCollection*
     CmmCpHitsCollection::const_iterator pos  = hitCollection->begin();
     CmmCpHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMMCPHits* const hits = *pos;
+      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));
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.h
index 11ce0ad1b9d..7d1d1b9a5ab 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamTool.h
@@ -85,26 +85,61 @@ class CpByteStreamTool : public AthAlgTool {
    typedef DataVector<LVL1::CPMHits>                     CpmHitsCollection;
    typedef DataVector<LVL1::CMMCPHits>                   CmmCpHitsCollection;
    typedef std::map<unsigned int, LVL1::CPMTower*>       CpmTowerMap;
+   typedef std::map<unsigned int, const LVL1::CPMTower*> ConstCpmTowerMap;
    typedef std::map<int, LVL1::CPMHits*>                 CpmHitsMap;
+   typedef std::map<int, const LVL1::CPMHits*>           ConstCpmHitsMap;
    typedef std::map<int, LVL1::CMMCPHits*>               CmmCpHitsMap;
+   typedef std::map<int, const LVL1::CMMCPHits*>         ConstCmmCpHitsMap;
    typedef IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   struct CpByteStreamToolData
+   {
+     CpByteStreamToolData (const CollectionType collection)
+       : m_collection(collection){}
+     const CollectionType m_collection;
+   };
+   struct CpmTowerData : public CpByteStreamToolData
+   {
+     CpmTowerData (CpmTowerCollection* const ttCollection)
+       : CpByteStreamToolData (CPM_TOWERS), m_ttCollection (ttCollection) {}
+     CpmTowerCollection* const m_ttCollection;
+     CpmTowerMap  m_ttMap;
+   };
+   struct CpmHitsData : public CpByteStreamToolData
+   {
+     CpmHitsData (CpmHitsCollection* const hitCollection)
+       : CpByteStreamToolData (CPM_HITS), m_hitCollection (hitCollection) {}
+     CpmHitsCollection* const m_hitCollection;
+     CpmHitsMap   m_hitsMap;
+   };
+   struct CmmHitsData : public CpByteStreamToolData
+   {
+     CmmHitsData (CmmCpHitsCollection* const hitCollection)
+       : CpByteStreamToolData (CMM_CP_HITS), m_cmmHitCollection (hitCollection) {}
+     CmmCpHitsCollection* const m_cmmHitCollection;
+     CmmCpHitsMap m_cmmHitsMap;
+   };
+
    /// Convert bytestream to given container type
    StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                        CollectionType collection);
+                        CpByteStreamToolData& data);
    /// Unpack CMM-CP sub-block
-   void decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm);
+   void decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, CmmHitsData& data);
    /// Unpack CPM sub-block
-   void decodeCpm(CpmSubBlock* subBlock, int trigCpm, CollectionType collection);
+   void decodeCpm(CpmSubBlock* subBlock, int trigCpm, CpByteStreamToolData& data);
 
    /// Find a CPM tower for given key
-   LVL1::CPMTower*  findCpmTower(unsigned int key);
+   const LVL1::CPMTower*  findCpmTower(unsigned int key) const;
+   LVL1::CPMTower*  findCpmTower(const CpmTowerData& data, unsigned int key) const;
    /// Find CPM hits for given crate, module
-   LVL1::CPMHits*   findCpmHits(int crate, int module);
+   const LVL1::CPMHits*   findCpmHits(int crate, int module) const;
+   LVL1::CPMHits*   findCpmHits(const CpmHitsData& data, int crate, int module) const;
    /// Find CMM-CP hits for given crate, data ID
-   LVL1::CMMCPHits* findCmmCpHits(int crate, int dataID);
+   const LVL1::CMMCPHits* findCmmCpHits(int crate, int dataID) const;
+   LVL1::CMMCPHits* findCmmCpHits(const CmmHitsData& data,
+                                  int crate, int dataID) const;
 
    /// Set up CPM tower map
    void setupCpmTowerMap(const CpmTowerCollection* ttCollection);
@@ -180,18 +215,12 @@ class CpByteStreamTool : public AthAlgTool {
    DataVector<CmmCpSubBlock> m_cmmHit0Blocks;
    /// Vector for current CMM-CP hit1 sub-blocks
    DataVector<CmmCpSubBlock> m_cmmHit1Blocks;
-   /// Current CPM tower collection
-   CpmTowerCollection*  m_ttCollection;
-   /// Current CPM hits collection
-   CpmHitsCollection*   m_hitCollection;
-   /// Current CMM-CP hits collection
-   CmmCpHitsCollection* m_cmmHitCollection;
    /// CPM tower map
-   CpmTowerMap  m_ttMap;
+   ConstCpmTowerMap  m_ttMap;
    /// CPM hits map
-   CpmHitsMap   m_hitsMap;
+   ConstCpmHitsMap   m_hitsMap;
    /// CMM-CP hits map
-   CmmCpHitsMap m_cmmHitsMap;
+   ConstCmmCpHitsMap m_cmmHitsMap;
    /// ROD Status words
    std::vector<uint32_t>* m_rodStatus;
    /// ROD status map
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.cxx
index fba80862490..12284575cb3 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.cxx
@@ -147,9 +147,8 @@ StatusCode CpByteStreamV1Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CPMTower>* const ttCollection)
 {
-  m_ttCollection = ttCollection;
-  m_ttMap.clear();
-  return convertBs(robFrags, CPM_TOWERS);
+  CpmTowerData data (ttCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CPM hits
@@ -158,9 +157,8 @@ StatusCode CpByteStreamV1Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CPMHits>* const hitCollection)
 {
-  m_hitCollection = hitCollection;
-  m_hitsMap.clear();
-  return convertBs(robFrags, CPM_HITS);
+  CpmHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMM-CP hits
@@ -169,9 +167,8 @@ StatusCode CpByteStreamV1Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CMMCPHits>* const hitCollection)
 {
-  m_cmmHitCollection = hitCollection;
-  m_cmmHitsMap.clear();
-  return convertBs(robFrags, CMM_CP_HITS);
+  CmmHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion of CP container to bytestream
@@ -477,7 +474,7 @@ const std::vector<uint32_t>& CpByteStreamV1Tool::sourceIDs(
 
 StatusCode CpByteStreamV1Tool::convertBs(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
-                            const CollectionType collection)
+                            CpByteStreamToolData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -615,8 +612,8 @@ StatusCode CpByteStreamV1Tool::convertBs(
 	    m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
 	    break;
           }
-	  if (collection == CMM_CP_HITS) {
-	    decodeCmmCp(m_cmmCpSubBlock, trigCmm);
+	  if (data.m_collection == CMM_CP_HITS) {
+	    decodeCmmCp(m_cmmCpSubBlock, trigCmm, static_cast<CmmHitsData&>(data));
 	    if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
 	      if (debug) msg() << "decodeCmmCp failed" << endmsg;
 	      break;
@@ -637,8 +634,8 @@ StatusCode CpByteStreamV1Tool::convertBs(
 	  m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
 	  break;
         }
-	if (collection == CPM_TOWERS || collection == CPM_HITS) {
-	  decodeCpm(m_cpmSubBlock, trigCpm, collection);
+	if (data.m_collection == CPM_TOWERS || data.m_collection == CPM_HITS) {
+	  decodeCpm(m_cpmSubBlock, trigCpm, data);
 	  if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
 	    if (debug) msg() << "decodeCpm failed" << endmsg;
 	    break;
@@ -655,7 +652,8 @@ StatusCode CpByteStreamV1Tool::convertBs(
 
 // Unpack CMM-CP sub-block
 
-void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm)
+void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm,
+                                     CmmHitsData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -742,7 +740,7 @@ void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm)
       errorBits.set(LVL1::DataError::SubStatusWord, subStatus);
       err = errorBits.error();
       if (hits || err) {
-        LVL1::CMMCPHits* ch = findCmmCpHits(crate, dataID);
+        LVL1::CMMCPHits* ch = findCmmCpHits(data, crate, dataID);
 	if ( ! ch ) {   // create new CMM hits
 	  m_hitsVec0.assign(timeslices, 0);
 	  m_hitsVec1.assign(timeslices, 0);
@@ -755,11 +753,12 @@ void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm)
 	    m_hitsVec1[slice] = hits;
 	    m_errVec1[slice]  = err;
 	  }
-	  ch = new LVL1::CMMCPHits(swCrate, dataID, m_hitsVec0, m_hitsVec1,
-	                                    m_errVec0, m_errVec1, trigCmm);
+	  auto chp =
+            std::make_unique<LVL1::CMMCPHits>(swCrate, dataID, m_hitsVec0, m_hitsVec1,
+                                              m_errVec0, m_errVec1, trigCmm);
           const int key = crate*100 + dataID;
-	  m_cmmHitsMap.insert(std::make_pair(key, ch));
-	  m_cmmHitCollection->push_back(ch);
+	  data.m_cmmHitsMap.insert(std::make_pair(key, chp.get()));
+	  data.m_cmmHitCollection->push_back(std::move(ch));
         } else {
 	  m_hitsVec0 = ch->HitsVec0();
 	  m_hitsVec1 = ch->HitsVec1();
@@ -798,7 +797,7 @@ void CpByteStreamV1Tool::decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm)
 // Unpack CPM sub-block
 
 void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock,
-                                   int trigCpm, const CollectionType collection)
+                                   int trigCpm, CpByteStreamToolData& data)
 {
   const bool debug   = msgLvl(MSG::DEBUG);
   const bool verbose = msgLvl(MSG::VERBOSE);
@@ -854,7 +853,8 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock,
   const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
   for (int slice = sliceBeg; slice < sliceEnd; ++slice) {
 
-    if (collection == CPM_TOWERS) {
+    if (data.m_collection == CPM_TOWERS) {
+      CpmTowerData& tdata = static_cast<CpmTowerData&> (data);
 
       // Loop over tower channels and fill CPM towers
 
@@ -885,7 +885,7 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock,
 	  if (m_cpmMaps->mapping(crate, module, chan, eta, phi, layer)) {
 	    if (layer == m_coreOverlap) {
 	      const unsigned int key = m_towerKey->ttKey(phi, eta);
-	      LVL1::CPMTower* tt = findCpmTower(key);
+	      LVL1::CPMTower* tt = findCpmTower(tdata, key);
 	      if ( ! tt ) {   // create new CPM tower
 	        m_emVec.assign(timeslices, 0);
 	        m_hadVec.assign(timeslices, 0);
@@ -895,10 +895,11 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock,
 	        m_hadVec[slice]    = had;
 	        m_emErrVec[slice]  = emErr1;
 	        m_hadErrVec[slice] = hadErr1;
-	        tt = new LVL1::CPMTower(phi, eta, m_emVec, m_emErrVec,
-	                                          m_hadVec, m_hadErrVec, trigCpm);
-	        m_ttMap.insert(std::make_pair(key, tt));
-	        m_ttCollection->push_back(tt);
+	        auto ttp =
+                  std::make_unique<LVL1::CPMTower>(phi, eta, m_emVec, m_emErrVec,
+                                                   m_hadVec, m_hadErrVec, trigCpm);
+	        tdata.m_ttMap.insert(std::make_pair(key, ttp.get()));
+                tdata.m_ttCollection->push_back(std::move(tt));
               } else {
 	        m_emVec     = tt->emEnergyVec();
 	        m_hadVec    = tt->hadEnergyVec();
@@ -938,22 +939,24 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock,
 	  msg(MSG::DEBUG);
         }
       }
-    } else if (collection == CPM_HITS) {
+    } else if (data.m_collection == CPM_HITS) {
+      CpmHitsData& hdata = static_cast<CpmHitsData&> (data);
 
       // Get CPM hits
 
       const unsigned int hits0 = subBlock->hits0(slice);
       const unsigned int hits1 = subBlock->hits1(slice);
       if (hits0 || hits1) {
-        LVL1::CPMHits* ch = findCpmHits(crate, module);
+        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;
-	  ch = new LVL1::CPMHits(swCrate, module, m_hitsVec0, m_hitsVec1, trigCpm);
-	  m_hitsMap.insert(std::make_pair(crate*m_modules+module-1, ch));
-	  m_hitCollection->push_back(ch);
+	  auto chp =
+            std::make_unique<LVL1::CPMHits>(swCrate, module, m_hitsVec0, m_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();
@@ -986,36 +989,60 @@ void CpByteStreamV1Tool::decodeCpm(CpmSubBlockV1* subBlock,
 
 // Find a CPM tower for given key
 
-LVL1::CPMTower* CpByteStreamV1Tool::findCpmTower(const unsigned int key)
+const
+LVL1::CPMTower* CpByteStreamV1Tool::findCpmTower(const unsigned int key) const
+{
+  ConstCpmTowerMap::const_iterator mapIter = m_ttMap.find(key);
+  if (mapIter != m_ttMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CPMTower* CpByteStreamV1Tool::findCpmTower(const CpmTowerData& data,
+                                               const unsigned int key) const
 {
-  LVL1::CPMTower* tt = 0;
-  CpmTowerMap::const_iterator mapIter;
-  mapIter = m_ttMap.find(key);
-  if (mapIter != m_ttMap.end()) tt = mapIter->second;
-  return tt;
+  CpmTowerMap::const_iterator mapIter = data.m_ttMap.find(key);
+  if (mapIter != data.m_ttMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CPM hits for given crate, module
 
-LVL1::CPMHits* CpByteStreamV1Tool::findCpmHits(const int crate, const int module)
+const
+LVL1::CPMHits* CpByteStreamV1Tool::findCpmHits(const int crate, const int module) const
 {
-  LVL1::CPMHits* hits = 0;
-  CpmHitsMap::const_iterator mapIter;
-  mapIter = m_hitsMap.find(crate*m_modules + module - 1);
-  if (mapIter != m_hitsMap.end()) hits = mapIter->second;
-  return hits;
+  ConstCpmHitsMap::const_iterator mapIter =
+    m_hitsMap.find(crate*m_modules + module - 1);
+  if (mapIter != m_hitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CPMHits* CpByteStreamV1Tool::findCpmHits(const CpmHitsData& data,
+                                             const int crate, const int module) const
+{
+  CpmHitsMap::const_iterator mapIter =
+    data.m_hitsMap.find(crate*m_modules + module - 1);
+  if (mapIter != data.m_hitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMM-CP hits for given crate, dataID
 
+const
 LVL1::CMMCPHits* CpByteStreamV1Tool::findCmmCpHits(const int crate,
-                                                   const int dataID)
+                                                 const int dataID) const
+{
+  ConstCmmCpHitsMap::const_iterator mapIter = m_cmmHitsMap.find(crate*100 + dataID);
+  if (mapIter != m_cmmHitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMMCPHits* CpByteStreamV1Tool::findCmmCpHits(const CmmHitsData& data,
+                                                 const int crate,
+                                                 const int dataID) const
 {
-  LVL1::CMMCPHits* hits = 0;
-  CmmCpHitsMap::const_iterator mapIter;
-  mapIter = m_cmmHitsMap.find(crate*100 + dataID);
-  if (mapIter != m_cmmHitsMap.end()) hits = mapIter->second;
-  return hits;
+  CmmCpHitsMap::const_iterator mapIter = data.m_cmmHitsMap.find(crate*100 + dataID);
+  if (mapIter != data.m_cmmHitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Set up CPM tower map
@@ -1028,7 +1055,7 @@ void CpByteStreamV1Tool::setupCpmTowerMap(const CpmTowerCollection*
     CpmTowerCollection::const_iterator pos  = ttCollection->begin();
     CpmTowerCollection::const_iterator pose = ttCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CPMTower* const tt = *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));
     }
@@ -1045,7 +1072,7 @@ void CpByteStreamV1Tool::setupCpmHitsMap(const CpmHitsCollection*
     CpmHitsCollection::const_iterator pos  = hitCollection->begin();
     CpmHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CPMHits* const hits = *pos;
+      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));
@@ -1063,7 +1090,7 @@ void CpByteStreamV1Tool::setupCmmCpHitsMap(const CmmCpHitsCollection*
     CmmCpHitsCollection::const_iterator pos  = hitCollection->begin();
     CmmCpHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMMCPHits* const hits = *pos;
+      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));
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.h
index f1653634171..905be01d1af 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV1Tool.h
@@ -84,27 +84,62 @@ class CpByteStreamV1Tool : public AthAlgTool {
    typedef DataVector<LVL1::CPMTower>                    CpmTowerCollection;
    typedef DataVector<LVL1::CPMHits>                     CpmHitsCollection;
    typedef DataVector<LVL1::CMMCPHits>                   CmmCpHitsCollection;
+   typedef std::map<unsigned int, const LVL1::CPMTower*> ConstCpmTowerMap;
    typedef std::map<unsigned int, LVL1::CPMTower*>       CpmTowerMap;
+   typedef std::map<int, const LVL1::CPMHits*>           ConstCpmHitsMap;
    typedef std::map<int, LVL1::CPMHits*>                 CpmHitsMap;
+   typedef std::map<int, const LVL1::CMMCPHits*>         ConstCmmCpHitsMap;
    typedef std::map<int, LVL1::CMMCPHits*>               CmmCpHitsMap;
    typedef IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   struct CpByteStreamToolData
+   {
+     CpByteStreamToolData (const CollectionType collection)
+       : m_collection(collection){}
+     const CollectionType m_collection;
+   };
+   struct CpmTowerData : public CpByteStreamToolData
+   {
+     CpmTowerData (CpmTowerCollection* const ttCollection)
+       : CpByteStreamToolData (CPM_TOWERS), m_ttCollection (ttCollection) {}
+     CpmTowerCollection* const m_ttCollection;
+     CpmTowerMap  m_ttMap;
+   };
+   struct CpmHitsData : public CpByteStreamToolData
+   {
+     CpmHitsData (CpmHitsCollection* const hitCollection)
+       : CpByteStreamToolData (CPM_HITS), m_hitCollection (hitCollection) {}
+     CpmHitsCollection* const m_hitCollection;
+     CpmHitsMap   m_hitsMap;
+   };
+   struct CmmHitsData : public CpByteStreamToolData
+   {
+     CmmHitsData (CmmCpHitsCollection* const hitCollection)
+       : CpByteStreamToolData (CMM_CP_HITS), m_cmmHitCollection (hitCollection) {}
+     CmmCpHitsCollection* const m_cmmHitCollection;
+     CmmCpHitsMap m_cmmHitsMap;
+   };
+
    /// Convert bytestream to given container type
    StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                        CollectionType collection);
+                        CpByteStreamToolData& data);
    /// Unpack CMM-CP sub-block
-   void decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm);
+   void decodeCmmCp(CmmCpSubBlock* subBlock, int trigCmm, CmmHitsData& data);
    /// Unpack CPM sub-block
-   void decodeCpm(CpmSubBlockV1* subBlock, int trigCpm, CollectionType collection);
+   void decodeCpm(CpmSubBlockV1* subBlock, int trigCpm, CpByteStreamToolData& data);
 
    /// Find a CPM tower for given key
-   LVL1::CPMTower*  findCpmTower(unsigned int key);
+   const LVL1::CPMTower*  findCpmTower(unsigned int key) const;
+   LVL1::CPMTower*  findCpmTower(const CpmTowerData& data, unsigned int key) const;
    /// Find CPM hits for given crate, module
-   LVL1::CPMHits*   findCpmHits(int crate, int module);
+   const LVL1::CPMHits*   findCpmHits(int crate, int module) const;
+   LVL1::CPMHits*   findCpmHits(const CpmHitsData& data, int crate, int module) const;
    /// Find CMM-CP hits for given crate, data ID
-   LVL1::CMMCPHits* findCmmCpHits(int crate, int dataID);
+   const LVL1::CMMCPHits* findCmmCpHits(int crate, int dataID) const;
+   LVL1::CMMCPHits* findCmmCpHits(const CmmHitsData& data,
+                                  int crate, int dataID) const;
 
    /// Set up CPM tower map
    void setupCpmTowerMap(const CpmTowerCollection* ttCollection);
@@ -184,18 +219,12 @@ class CpByteStreamV1Tool : public AthAlgTool {
    DataVector<CmmCpSubBlock> m_cmmHit0Blocks;
    /// Vector for current CMM-CP hit1 sub-blocks
    DataVector<CmmCpSubBlock> m_cmmHit1Blocks;
-   /// Current CPM tower collection
-   CpmTowerCollection*  m_ttCollection;
-   /// Current CPM hits collection
-   CpmHitsCollection*   m_hitCollection;
-   /// Current CMM-CP hits collection
-   CmmCpHitsCollection* m_cmmHitCollection;
    /// CPM tower map
-   CpmTowerMap  m_ttMap;
+   ConstCpmTowerMap  m_ttMap;
    /// CPM hits map
-   CpmHitsMap   m_hitsMap;
+   ConstCpmHitsMap   m_hitsMap;
    /// CMM-CP hits map
-   CmmCpHitsMap m_cmmHitsMap;
+   ConstCmmCpHitsMap m_cmmHitsMap;
    /// ROD Status words
    std::vector<uint32_t>* m_rodStatus;
    /// ROD status map
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.cxx
index 637202d9ca8..aa146ebe7e0 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.cxx
@@ -154,9 +154,8 @@ StatusCode CpByteStreamV2Tool::convert(
     const IROBDataProviderSvc::VROBFRAG &robFrags,
     DataVector<LVL1::CPMTower> *const ttCollection)
 {
-    m_ttCollection = ttCollection;
-    m_ttMap.clear();
-    return convertBs(robFrags, CPM_TOWERS);
+    CpmTowerData data (ttCollection);
+    return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMX-CP TOBs
@@ -176,9 +175,8 @@ StatusCode CpByteStreamV2Tool::convert(
     const IROBDataProviderSvc::VROBFRAG &robFrags,
     DataVector<LVL1::CMXCPTob> *const tobCollection)
 {
-    m_tobCollection = tobCollection;
-    m_tobMap.clear();
-    return convertBs(robFrags, CMX_CP_TOBS);
+    CmxCpTobData data (tobCollection);
+    return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMX-CP hits
@@ -198,9 +196,8 @@ StatusCode CpByteStreamV2Tool::convert(
     const IROBDataProviderSvc::VROBFRAG &robFrags,
     DataVector<LVL1::CMXCPHits> *const hitCollection)
 {
-    m_hitCollection = hitCollection;
-    m_hitsMap.clear();
-    return convertBs(robFrags, CMX_CP_HITS);
+    CmxCpHitsData data (hitCollection);
+    return convertBs(robFrags, data);
 }
 
 // Conversion of CP container to bytestream
@@ -532,7 +529,7 @@ const std::vector<uint32_t> &CpByteStreamV2Tool::sourceIDs(
 
 StatusCode CpByteStreamV2Tool::convertBs(
     const IROBDataProviderSvc::VROBFRAG &robFrags,
-    const CollectionType collection)
+    CpByteStreamToolData& data)
 {
     const bool debug = msgLvl(MSG::DEBUG);
     if (debug) msg(MSG::DEBUG);
@@ -681,9 +678,9 @@ StatusCode CpByteStreamV2Tool::convertBs(
                         break;
                     }
 
-                    if (collection == CMX_CP_TOBS || collection == CMX_CP_HITS)
+                    if (data.m_collection == CMX_CP_TOBS || data.m_collection == CMX_CP_HITS)
                     {
-                        decodeCmxCp(m_cmxCpSubBlock, trigCpm, collection);
+                        decodeCmxCp(m_cmxCpSubBlock, trigCpm, data);
                         if (m_rodErr != L1CaloSubBlock::ERROR_NONE)
                         {
                             if (debug) msg() << "decodeCmxCp failed" << endmsg;
@@ -710,9 +707,9 @@ StatusCode CpByteStreamV2Tool::convertBs(
                     m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
                     break;
                 }
-                if (collection == CPM_TOWERS)
+                if (data.m_collection == CPM_TOWERS)
                 {
-                    decodeCpm(m_cpmSubBlock, trigCpm);
+                    decodeCpm(m_cpmSubBlock, trigCpm, static_cast<CpmTowerData&>(data));
                     if (m_rodErr != L1CaloSubBlock::ERROR_NONE)
                     {
                         if (debug) msg() << "decodeCpm failed" << endmsg;
@@ -732,7 +729,7 @@ StatusCode CpByteStreamV2Tool::convertBs(
 // Unpack CMX-CP sub-block
 
 void CpByteStreamV2Tool::decodeCmxCp(CmxCpSubBlock *subBlock, int trigCpm,
-                                     CollectionType collection)
+                                     CpByteStreamToolData& data)
 {
     const bool debug = msgLvl(MSG::DEBUG);
     if (debug) msg(MSG::DEBUG);
@@ -794,8 +791,9 @@ void CpByteStreamV2Tool::decodeCmxCp(CmxCpSubBlock *subBlock, int trigCpm,
     for (int slice = sliceBeg; slice < sliceEnd; ++slice)
     {
 
-        if (collection == CMX_CP_TOBS)
+        if (data.m_collection == CMX_CP_TOBS)
         {
+            CmxCpTobData& tdata = static_cast<CmxCpTobData&> (data);
 
             // TOBs
 
@@ -823,7 +821,7 @@ void CpByteStreamV2Tool::decodeCmxCp(CmxCpSubBlock *subBlock, int trigCpm,
                     }
                     error = errBits.error();
                     const int key = tobKey(crate, cmx, cpm, chip, loc);
-                    LVL1::CMXCPTob *tb = findCmxCpTob(key);
+                    LVL1::CMXCPTob *tb = findCmxCpTob(tdata, key);
                     if ( ! tb )   // create new CMX TOB
                     {
                         m_energyVec.assign(timeslices, 0);
@@ -834,11 +832,12 @@ void CpByteStreamV2Tool::decodeCmxCp(CmxCpSubBlock *subBlock, int trigCpm,
                         m_isolVec[slice]   = isolation;
                         m_errorVec[slice]  = error;
                         m_presenceMapVec[slice] = presenceMap;
-                        tb = new LVL1::CMXCPTob(swCrate, cmx, cpm, chip, loc,
-                                                m_energyVec, m_isolVec, m_errorVec,
-                                                m_presenceMapVec, trigCpm);
-                        m_tobMap.insert(std::make_pair(key, tb));
-                        m_tobCollection->push_back(tb);
+                        auto tbp =
+                          std::make_unique<LVL1::CMXCPTob>(swCrate, cmx, cpm, chip, loc,
+                                                           m_energyVec, m_isolVec, m_errorVec,
+                                                           m_presenceMapVec, trigCpm);
+                        tdata.m_tobMap.insert(std::make_pair(key, tbp.get()));
+                        tdata.m_tobCollection->push_back(std::move(tbp));
                     }
                     else
                     {
@@ -871,8 +870,9 @@ void CpByteStreamV2Tool::decodeCmxCp(CmxCpSubBlock *subBlock, int trigCpm,
             }
 
         }
-        else if (collection == CMX_CP_HITS)
+        else if (data.m_collection == CMX_CP_HITS)
         {
+            CmxCpHitsData& hdata = static_cast<CmxCpHitsData&> (data);
 
             // Hit/Topo counts
 
@@ -899,7 +899,7 @@ void CpByteStreamV2Tool::decodeCmxCp(CmxCpSubBlock *subBlock, int trigCpm,
                 if (hits0 || hits1 || err0 || err1)
                 {
                     const int key = hitsKey(crate, cmx, source);
-                    LVL1::CMXCPHits *ch = findCmxCpHits(key);
+                    LVL1::CMXCPHits *ch = findCmxCpHits(hdata, key);
                     if ( ! ch )     // create new CMX hits
                     {
                         m_hitsVec0.assign(timeslices, 0);
@@ -910,11 +910,12 @@ void CpByteStreamV2Tool::decodeCmxCp(CmxCpSubBlock *subBlock, int trigCpm,
                         m_hitsVec1[slice] = hits1;
                         m_errVec0[slice]  = err0;
                         m_errVec1[slice]  = err1;
-                        ch = new LVL1::CMXCPHits(swCrate, cmx, source,
-                                                 m_hitsVec0, m_hitsVec1,
-                                                 m_errVec0, m_errVec1, trigCpm);
-                        m_hitsMap.insert(std::make_pair(key, ch));
-                        m_hitCollection->push_back(ch);
+                        auto chp =
+                          std::make_unique<LVL1::CMXCPHits>(swCrate, cmx, source,
+                                                            m_hitsVec0, m_hitsVec1,
+                                                            m_errVec0, m_errVec1, trigCpm);
+                        hdata.m_hitsMap.insert(std::make_pair(key, chp.get()));
+                        hdata.m_hitCollection->push_back(std::move(chp));
                     }
                     else
                     {
@@ -953,7 +954,8 @@ void CpByteStreamV2Tool::decodeCmxCp(CmxCpSubBlock *subBlock, int trigCpm,
 
 // Unpack CPM sub-block
 
-void CpByteStreamV2Tool::decodeCpm(CpmSubBlockV2 *subBlock, int trigCpm)
+void CpByteStreamV2Tool::decodeCpm(CpmSubBlockV2 *subBlock, int trigCpm,
+                                   CpmTowerData& data)
 {
     const bool debug   = msgLvl(MSG::DEBUG);
     const bool verbose = msgLvl(MSG::VERBOSE);
@@ -1049,7 +1051,7 @@ void CpByteStreamV2Tool::decodeCpm(CpmSubBlockV2 *subBlock, int trigCpm)
                     if (layer == m_coreOverlap)
                     {
                         const unsigned int key = m_towerKey->ttKey(phi, eta);
-                        LVL1::CPMTower *tt = findCpmTower(key);
+                        LVL1::CPMTower *tt = findCpmTower(data, key);
                         if ( ! tt )     // create new CPM tower
                         {
                             m_emVec.assign(timeslices, 0);
@@ -1060,10 +1062,11 @@ void CpByteStreamV2Tool::decodeCpm(CpmSubBlockV2 *subBlock, int trigCpm)
                             m_hadVec[slice]    = had;
                             m_emErrVec[slice]  = emErr1;
                             m_hadErrVec[slice] = hadErr1;
-                            tt = new LVL1::CPMTower(phi, eta, m_emVec, m_emErrVec,
-                                                    m_hadVec, m_hadErrVec, trigCpm);
-                            m_ttMap.insert(std::make_pair(key, tt));
-                            m_ttCollection->push_back(tt);
+                            auto ttp =
+                              std::make_unique<LVL1::CPMTower>(phi, eta, m_emVec, m_emErrVec,
+                                                               m_hadVec, m_hadErrVec, trigCpm);
+                            data.m_ttMap.insert(std::make_pair(key, ttp.get()));
+                            data.m_ttCollection->push_back(std::move(ttp));
                         }
                         else
                         {
@@ -1118,35 +1121,56 @@ void CpByteStreamV2Tool::decodeCpm(CpmSubBlockV2 *subBlock, int trigCpm)
 
 // Find a CPM tower for given key
 
-LVL1::CPMTower *CpByteStreamV2Tool::findCpmTower(const unsigned int key)
+const
+LVL1::CPMTower *CpByteStreamV2Tool::findCpmTower(const unsigned int key) const
+{
+    ConstCpmTowerMap::const_iterator mapIter = m_ttMap.find(key);
+    if (mapIter != m_ttMap.end()) return mapIter->second;
+    return nullptr;
+}
+
+LVL1::CPMTower *CpByteStreamV2Tool::findCpmTower(const CpmTowerData& data,
+                                                 const unsigned int key) const
 {
-    LVL1::CPMTower *tt = 0;
-    CpmTowerMap::const_iterator mapIter;
-    mapIter = m_ttMap.find(key);
-    if (mapIter != m_ttMap.end()) tt = mapIter->second;
-    return tt;
+    CpmTowerMap::const_iterator mapIter = data.m_ttMap.find(key);
+    if (mapIter != data.m_ttMap.end()) return mapIter->second;
+    return nullptr;
 }
 
 // Find CMX-CP TOB for given key
 
-LVL1::CMXCPTob *CpByteStreamV2Tool::findCmxCpTob(const int key)
+const
+LVL1::CMXCPTob *CpByteStreamV2Tool::findCmxCpTob(const int key) const
 {
-    LVL1::CMXCPTob *tob = 0;
-    CmxCpTobMap::const_iterator mapIter;
-    mapIter = m_tobMap.find(key);
-    if (mapIter != m_tobMap.end()) tob = mapIter->second;
-    return tob;
+    ConstCmxCpTobMap::const_iterator mapIter = m_tobMap.find(key);
+    if (mapIter != m_tobMap.end()) return mapIter->second;
+    return nullptr;
+}
+
+LVL1::CMXCPTob *CpByteStreamV2Tool::findCmxCpTob(const CmxCpTobData& data,
+                                                 const int key) const
+{
+    CmxCpTobMap::const_iterator mapIter = data.m_tobMap.find(key);
+    if (mapIter != data.m_tobMap.end()) return mapIter->second;
+    return nullptr;
 }
 
 // Find CMX-CP hits for given key
 
-LVL1::CMXCPHits *CpByteStreamV2Tool::findCmxCpHits(const int key)
+const
+LVL1::CMXCPHits *CpByteStreamV2Tool::findCmxCpHits(const int key) const
+{
+    ConstCmxCpHitsMap::const_iterator mapIter = m_hitsMap.find(key);
+    if (mapIter != m_hitsMap.end()) return mapIter->second;
+    return nullptr;
+}
+
+LVL1::CMXCPHits *CpByteStreamV2Tool::findCmxCpHits(const CmxCpHitsData& data,
+                                                   const int key) const
 {
-    LVL1::CMXCPHits *hits = 0;
-    CmxCpHitsMap::const_iterator mapIter;
-    mapIter = m_hitsMap.find(key);
-    if (mapIter != m_hitsMap.end()) hits = mapIter->second;
-    return hits;
+    CmxCpHitsMap::const_iterator mapIter = data.m_hitsMap.find(key);
+    if (mapIter != data.m_hitsMap.end()) return mapIter->second;
+    return nullptr;
 }
 
 // Set up CPM tower map
@@ -1161,7 +1185,7 @@ void CpByteStreamV2Tool::setupCpmTowerMap(const CpmTowerCollection *
         CpmTowerCollection::const_iterator pose = ttCollection->end();
         for (; pos != pose; ++pos)
         {
-            LVL1::CPMTower *const tt = *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));
         }
@@ -1180,7 +1204,7 @@ void CpByteStreamV2Tool::setupCmxCpTobMap(const CmxCpTobCollection *
         CmxCpTobCollection::const_iterator pose = tobCollection->end();
         for (; pos != pose; ++pos)
         {
-            LVL1::CMXCPTob *const tob = *pos;
+            const LVL1::CMXCPTob *const tob = *pos;
             const int crate = tob->crate() - m_crateOffsetSw;
             const int cmx = tob->cmx();
             const int cpm = tob->cpm();
@@ -1204,7 +1228,7 @@ void CpByteStreamV2Tool::setupCmxCpHitsMap(const CmxCpHitsCollection *
         CmxCpHitsCollection::const_iterator pose = hitCollection->end();
         for (; pos != pose; ++pos)
         {
-            LVL1::CMXCPHits *const hits = *pos;
+            const LVL1::CMXCPHits *const hits = *pos;
             const int crate = hits->crate() - m_crateOffsetSw;
             const int cmx = hits->cmx();
             const int source = hits->source();
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.h
index 30ece2c6aca..2843ffa580e 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/CpByteStreamV2Tool.h
@@ -90,27 +90,60 @@ class CpByteStreamV2Tool : public AthAlgTool {
    typedef DataVector<LVL1::CMXCPTob>                    CmxCpTobCollection;
    typedef DataVector<LVL1::CMXCPHits>                   CmxCpHitsCollection;
    typedef std::map<unsigned int, LVL1::CPMTower*>       CpmTowerMap;
+   typedef std::map<unsigned int, const LVL1::CPMTower*> ConstCpmTowerMap;
    typedef std::map<int, LVL1::CMXCPTob*>                CmxCpTobMap;
+   typedef std::map<int, const LVL1::CMXCPTob*>          ConstCmxCpTobMap;
    typedef std::map<int, LVL1::CMXCPHits*>               CmxCpHitsMap;
+   typedef std::map<int, const LVL1::CMXCPHits*>         ConstCmxCpHitsMap;
    typedef IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   struct CpByteStreamToolData
+   {
+     CpByteStreamToolData (const CollectionType collection)
+       : m_collection(collection){}
+     const CollectionType m_collection;
+   };
+   struct CpmTowerData : public CpByteStreamToolData
+   {
+     CpmTowerData (CpmTowerCollection* const ttCollection)
+       : CpByteStreamToolData (CPM_TOWERS), m_ttCollection (ttCollection) {}
+     CpmTowerCollection* const m_ttCollection;
+     CpmTowerMap  m_ttMap;
+   };
+   struct CmxCpTobData : public CpByteStreamToolData
+   {
+     CmxCpTobData (CmxCpTobCollection* const tobCollection)
+       : CpByteStreamToolData (CMX_CP_TOBS), m_tobCollection (tobCollection) {}
+     CmxCpTobCollection* const m_tobCollection;
+     CmxCpTobMap  m_tobMap;
+   };
+   struct CmxCpHitsData : public CpByteStreamToolData
+   {
+     CmxCpHitsData (CmxCpHitsCollection* const hitCollection)
+       : CpByteStreamToolData (CMX_CP_HITS), m_hitCollection (hitCollection) {}
+     CmxCpHitsCollection* const m_hitCollection;
+     CmxCpHitsMap m_hitsMap;
+   };
+
    /// Convert bytestream to given container type
    StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                        CollectionType collection);
+                        CpByteStreamToolData& data);
    /// Unpack CMX-CP sub-block
-   void decodeCmxCp(CmxCpSubBlock* subBlock, int trigCpm,
-                                             CollectionType collection);
+   void decodeCmxCp(CmxCpSubBlock* subBlock, int trigCpm, CpByteStreamToolData& data);
    /// Unpack CPM sub-block
-   void decodeCpm(CpmSubBlockV2* subBlock, int trigCpm);
+   void decodeCpm(CpmSubBlockV2* subBlock, int trigCpm, CpmTowerData& data);
 
    /// Find a CPM tower for given key
-   LVL1::CPMTower*  findCpmTower(unsigned int key);
+   const LVL1::CPMTower*  findCpmTower(unsigned int key) const;
+   LVL1::CPMTower*  findCpmTower(const CpmTowerData& data, unsigned int key) const;
    /// Find CMX-CP TOB for given key
-   LVL1::CMXCPTob*  findCmxCpTob(int key);
+   const LVL1::CMXCPTob*  findCmxCpTob(int key) const;
+   LVL1::CMXCPTob*  findCmxCpTob(const CmxCpTobData& data, int key) const;
    /// Find CMX-CP hits for given key
-   LVL1::CMXCPHits* findCmxCpHits(int key);
+   const LVL1::CMXCPHits* findCmxCpHits(int key) const;
+   LVL1::CMXCPHits* findCmxCpHits(const CmxCpHitsData& data, int key) const;
 
    /// Set up CPM tower map
    void setupCpmTowerMap(const CpmTowerCollection* ttCollection);
@@ -209,18 +242,12 @@ class CpByteStreamV2Tool : public AthAlgTool {
    DataVector<CpmSubBlockV2> m_cpmBlocks;
    /// Vector for current CMX-CP sub-blocks
    DataVector<CmxCpSubBlock> m_cmxBlocks;
-   /// Current CPM tower collection
-   CpmTowerCollection*  m_ttCollection;
-   /// Current CMX-CP TOB collection
-   CmxCpTobCollection*  m_tobCollection;
-   /// Current CMX-CP hits collection
-   CmxCpHitsCollection* m_hitCollection;
    /// CPM tower map
-   CpmTowerMap  m_ttMap;
+   ConstCpmTowerMap  m_ttMap;
    /// CMX-CP TOB map
-   CmxCpTobMap  m_tobMap;
+   ConstCmxCpTobMap  m_tobMap;
    /// CMX-CP hits map
-   CmxCpHitsMap m_hitsMap;
+   ConstCmxCpHitsMap m_hitsMap;
    /// ROD Status words
    std::vector<uint32_t>* m_rodStatus;
    /// ROD status map
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamTool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamTool.cxx
index 71eb74a82a0..5d2a3274cee 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamTool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamTool.cxx
@@ -148,9 +148,8 @@ StatusCode JepByteStreamTool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::JetElement>* const jeCollection)
 {
-  m_jeCollection = jeCollection;
-  m_jeMap.clear();
-  return convertBs(robFrags, JET_ELEMENTS);
+  JetElementData data (jeCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to jet hits
@@ -159,9 +158,8 @@ StatusCode JepByteStreamTool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::JEMHits>* const hitCollection)
 {
-  m_hitCollection = hitCollection;
-  m_hitsMap.clear();
-  return convertBs(robFrags, JET_HITS);
+  JetHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to energy sums
@@ -170,9 +168,8 @@ StatusCode JepByteStreamTool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::JEMEtSums>* const etCollection)
 {
-  m_etCollection = etCollection;
-  m_etMap.clear();
-  return convertBs(robFrags, ENERGY_SUMS);
+  EnergySumsData data (etCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMM hits
@@ -181,9 +178,8 @@ StatusCode JepByteStreamTool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::CMMJetHits>* const hitCollection)
 {
-  m_cmmHitCollection = hitCollection;
-  m_cmmHitsMap.clear();
-  return convertBs(robFrags, CMM_HITS);
+  CmmHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMM energy sums
@@ -192,9 +188,8 @@ StatusCode JepByteStreamTool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::CMMEtSums>* const etCollection)
 {
-  m_cmmEtCollection = etCollection;
-  m_cmmEtMap.clear();
-  return convertBs(robFrags, CMM_SUMS);
+  CmmSumsData data (etCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion of JEP container to bytestream
@@ -588,7 +583,7 @@ const std::vector<uint32_t>& JepByteStreamTool::sourceIDs(
 
 StatusCode JepByteStreamTool::convertBs(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
-  const CollectionType collection)
+  JepByteStreamToolData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -716,8 +711,8 @@ StatusCode JepByteStreamTool::convertBs(
             m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
             break;
           }
-          if (collection == CMM_HITS) {
-            decodeCmmJet(m_cmmJetSubBlock, trigCmm);
+          if (data.m_collection == CMM_HITS) {
+            decodeCmmJet(m_cmmJetSubBlock, trigCmm, static_cast<CmmHitsData&>(data));
             if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
               if (debug) msg() << "decodeCmmJet failed" << endmsg;
               break;
@@ -732,8 +727,8 @@ StatusCode JepByteStreamTool::convertBs(
             m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
             break;
           }
-          if (collection == CMM_SUMS) {
-            decodeCmmEnergy(m_cmmEnergySubBlock, trigCmm);
+          if (data.m_collection == CMM_SUMS) {
+            decodeCmmEnergy(m_cmmEnergySubBlock, trigCmm, static_cast<CmmSumsData&>(data));
             if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
               if (debug) msg() << "decodeCmmEnergy failed" << endmsg;
               break;
@@ -754,9 +749,9 @@ StatusCode JepByteStreamTool::convertBs(
           m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
           break;
         }
-        if (collection == JET_ELEMENTS || collection == JET_HITS ||
-            collection == ENERGY_SUMS) {
-          decodeJem(m_jemSubBlock, trigJem, collection);
+        if (data.m_collection == JET_ELEMENTS || data.m_collection == JET_HITS ||
+            data.m_collection == ENERGY_SUMS) {
+          decodeJem(m_jemSubBlock, trigJem, data);
           if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
             if (debug) msg() << "decodeJem failed" << endmsg;
             break;
@@ -774,7 +769,8 @@ StatusCode JepByteStreamTool::convertBs(
 // Unpack CMM-Energy sub-block
 
 void JepByteStreamTool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
-                                        int trigCmm)
+                                        int trigCmm,
+                                        CmmSumsData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -883,7 +879,7 @@ void JepByteStreamTool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
       eyErr = eyErrBits.error();
       etErr = etErrBits.error();
       if (ex || ey || et || exErr || eyErr || etErr) {
-        LVL1::CMMEtSums* sums = findCmmSums(crate, dataID);
+        LVL1::CMMEtSums* sums = findCmmSums(data, crate, dataID);
         if ( ! sums ) {   // create new CMM energy sums
           m_exVec.assign(timeslices, 0);
           m_eyVec.assign(timeslices, 0);
@@ -897,11 +893,12 @@ void JepByteStreamTool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
           m_exErrVec[slice] = exErr;
           m_eyErrVec[slice] = eyErr;
           m_etErrVec[slice] = etErr;
-          sums = new LVL1::CMMEtSums(swCrate, dataID, m_etVec, m_exVec, m_eyVec,
-                                     m_etErrVec, m_exErrVec, m_eyErrVec, trigCmm);
+          auto sumsp = 
+            std::make_unique<LVL1::CMMEtSums>(swCrate, dataID, m_etVec, m_exVec, m_eyVec,
+                                              m_etErrVec, m_exErrVec, m_eyErrVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmEtMap.insert(std::make_pair(key, sums));
-          m_cmmEtCollection->push_back(sums);
+          data.m_cmmEtMap.insert(std::make_pair(key, sumsp.get()));
+          data.m_cmmEtCollection->push_back(std::move(sumsp));
         } else {
           m_exVec = sums->ExVec();
           m_eyVec = sums->EyVec();
@@ -942,18 +939,19 @@ void JepByteStreamTool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
       const unsigned int missEt = subBlock->missingEtHits(slice);
       if ( missEt || ssError ) {
         const int dataID = LVL1::CMMEtSums::MISSING_ET_MAP;
-        LVL1::CMMEtSums* map = findCmmSums(crate, dataID);
+        LVL1::CMMEtSums* map = findCmmSums(data, crate, dataID);
         if ( ! map ) {
           m_etVec.assign(timeslices, 0);
           m_etErrVec.assign(timeslices, 0);
           m_etVec[slice]    = missEt;
           m_etErrVec[slice] = ssError;
-          map = new LVL1::CMMEtSums(swCrate, dataID,
-                                    m_etVec, m_etVec, m_etVec,
-                                    m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
+          auto mapp =
+            std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
+                                              m_etVec, m_etVec, m_etVec,
+                                              m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmEtMap.insert(std::make_pair(key, map));
-          m_cmmEtCollection->push_back(map);
+          data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
+          data.m_cmmEtCollection->push_back(std::move(mapp));
         } else {
           m_etVec    = map->EtVec();
           m_etErrVec = map->EtErrorVec();
@@ -979,18 +977,19 @@ void JepByteStreamTool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
       const unsigned int sumEt = subBlock->sumEtHits(slice);
       if ( sumEt || ssError ) {
         const int dataID = LVL1::CMMEtSums::SUM_ET_MAP;
-        LVL1::CMMEtSums* map = findCmmSums(crate, dataID);
+        LVL1::CMMEtSums* map = findCmmSums(data, crate, dataID);
         if ( ! map ) {
           m_etVec.assign(timeslices, 0);
           m_etErrVec.assign(timeslices, 0);
           m_etVec[slice]    = sumEt;
           m_etErrVec[slice] = ssError;
-          map = new LVL1::CMMEtSums(swCrate, dataID,
-                                    m_etVec, m_etVec, m_etVec,
-                                    m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
+          auto mapp =
+            std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
+                                              m_etVec, m_etVec, m_etVec,
+                                              m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmEtMap.insert(std::make_pair(key, map));
-          m_cmmEtCollection->push_back(map);
+          data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
+          data.m_cmmEtCollection->push_back(std::move(mapp));
         } else {
           m_etVec    = map->EtVec();
           m_etErrVec = map->EtErrorVec();
@@ -1017,18 +1016,19 @@ void JepByteStreamTool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
         const unsigned int missEtSig = subBlock->missingEtSigHits(slice);
         if ( missEtSig || ssError ) {
           const int dataID = LVL1::CMMEtSums::MISSING_ET_SIG_MAP;
-          LVL1::CMMEtSums* map = findCmmSums(crate, dataID);
+          LVL1::CMMEtSums* map = findCmmSums(data, crate, dataID);
           if ( ! map ) {
             m_etVec.assign(timeslices, 0);
             m_etErrVec.assign(timeslices, 0);
             m_etVec[slice]    = missEtSig;
             m_etErrVec[slice] = ssError;
-            map = new LVL1::CMMEtSums(swCrate, dataID,
-                                      m_etVec, m_etVec, m_etVec,
-                                      m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
+            auto mapp = 
+              std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
+                                                m_etVec, m_etVec, m_etVec,
+                                                m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
             const int key = crate * 100 + dataID;
-            m_cmmEtMap.insert(std::make_pair(key, map));
-            m_cmmEtCollection->push_back(map);
+            data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
+            data.m_cmmEtCollection->push_back(std::move(mapp));
           } else {
             m_etVec    = map->EtVec();
             m_etErrVec = map->EtErrorVec();
@@ -1061,7 +1061,8 @@ void JepByteStreamTool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
 
 // Unpack CMM-Jet sub-block
 
-void JepByteStreamTool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
+void JepByteStreamTool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm,
+                                     CmmHitsData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -1153,16 +1154,17 @@ void JepByteStreamTool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
                   subBlock->jetHitsError(slice, source));
       const int err = errBits.error();
       if (hits || err) {
-        LVL1::CMMJetHits* jh = findCmmHits(crate, dataID);
+        LVL1::CMMJetHits* jh = findCmmHits(data, crate, dataID);
         if ( ! jh ) {   // create new CMM hits
           m_hitsVec.assign(timeslices, 0);
           m_errVec.assign(timeslices, 0);
           m_hitsVec[slice] = hits;
           m_errVec[slice]  = err;
-          jh = new LVL1::CMMJetHits(swCrate, dataID, m_hitsVec, m_errVec, trigCmm);
+          auto jhp =
+            std::make_unique<LVL1::CMMJetHits>(swCrate, dataID, m_hitsVec, m_errVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmHitsMap.insert(std::make_pair(key, jh));
-          m_cmmHitCollection->push_back(jh);
+          data.m_cmmHitsMap.insert(std::make_pair(key, jhp.get()));
+          data.m_cmmHitCollection->push_back(std::move(jhp));
         } else {
           m_hitsVec = jh->HitsVec();
           m_errVec  = jh->ErrorVec();
@@ -1180,7 +1182,7 @@ void JepByteStreamTool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
           }
           m_hitsVec[slice] = hits;
           m_errVec[slice]  = err;
-          jh->addHits(m_hitsVec, m_errVec);
+	  jh->addHits(m_hitsVec, m_errVec);
         }
       }
     }
@@ -1191,16 +1193,17 @@ void JepByteStreamTool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
       const unsigned int etMap = subBlock->jetEtMap(slice);
       if ( etMap || ssError ) {
         const int dataID = LVL1::CMMJetHits::ET_MAP;
-        LVL1::CMMJetHits* map = findCmmHits(crate, dataID);
+        LVL1::CMMJetHits* map = findCmmHits(data, crate, dataID);
         if ( ! map ) {
           m_hitsVec.assign(timeslices, 0);
           m_errVec.assign(timeslices, 0);
           m_hitsVec[slice] = etMap;
           m_errVec[slice]  = ssError;
-          map = new LVL1::CMMJetHits(swCrate, dataID, m_hitsVec, m_errVec, trigCmm);
+          auto mapp =
+            std::make_unique<LVL1::CMMJetHits>(swCrate, dataID, m_hitsVec, m_errVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmHitsMap.insert(std::make_pair(key, map));
-          m_cmmHitCollection->push_back(map);
+          data.m_cmmHitsMap.insert(std::make_pair(key, mapp.get()));
+          data.m_cmmHitCollection->push_back(std::move(mapp));
         } else {
           m_hitsVec = map->HitsVec();
           m_errVec  = map->ErrorVec();
@@ -1218,7 +1221,7 @@ void JepByteStreamTool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
           }
           m_hitsVec[slice] = etMap;
           m_errVec[slice]  = ssError;
-          map->addHits(m_hitsVec, m_errVec);
+	  map->addHits(m_hitsVec, m_errVec);
         }
       }
     }
@@ -1230,7 +1233,7 @@ void JepByteStreamTool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
 // Unpack JEM sub-block
 
 void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
-                                  const CollectionType collection)
+                                  JepByteStreamToolData& data)
 {
   const bool debug   = msgLvl(MSG::DEBUG);
   const bool verbose = msgLvl(MSG::VERBOSE);
@@ -1282,7 +1285,8 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
   const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
   for (int slice = sliceBeg; slice < sliceEnd; ++slice) {
 
-    if (collection == JET_ELEMENTS) {
+    if (data.m_collection == JET_ELEMENTS) {
+      JetElementData& jedata = static_cast<JetElementData&>(data);
 
       // Loop over jet element channels and fill jet elements
 
@@ -1294,13 +1298,15 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
           int layer = 0;
           if (m_jemMaps->mapping(crate, module, chan, eta, phi, layer)) {
             if (layer == m_coreOverlap) {
-              LVL1::JetElement* je = findJetElement(eta, phi);
+              LVL1::JetElement* je = findJetElement(jedata, eta, phi);
               if ( ! je ) {   // create new jet element
                 const unsigned int key = m_elementKey->jeKey(phi, eta);
-                je = new LVL1::JetElement(phi, eta, dummy, dummy, key,
-                                          dummy, dummy, dummy, trigJem);
-                m_jeMap.insert(std::make_pair(key, je));
-                m_jeCollection->push_back(je);
+                auto jep = 
+                  std::make_unique<LVL1::JetElement>(phi, eta, dummy, dummy, key,
+                                                     dummy, dummy, dummy, trigJem);
+                je = jep.get();
+                jedata.m_jeMap.insert(std::make_pair(key, jep.get()));
+                jedata.m_jeCollection->push_back(std::move(jep));
               } else {
                 const std::vector<int>& emEnergy(je->emEnergyVec());
                 const std::vector<int>& hadEnergy(je->hadEnergyVec());
@@ -1330,7 +1336,7 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
               emErrBits.set(LVL1::DataError::LinkDown, linkError);
               hadErrBits.set(LVL1::DataError::Parity, jetEle.hadParity());
               hadErrBits.set(LVL1::DataError::LinkDown, linkError >> 1);
-              je->addSlice(slice, jetEle.emData(), jetEle.hadData(),
+	      je->addSlice(slice, jetEle.emData(), jetEle.hadData(),
                            emErrBits.error(), hadErrBits.error(),
                            linkError);
             }
@@ -1345,19 +1351,21 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
           msg(MSG::DEBUG);
         }
       }
-    } else if (collection == JET_HITS) {
+    } else if (data.m_collection == JET_HITS) {
+      JetHitsData& jhdata = static_cast<JetHitsData&>(data);
 
       // Get jet hits
 
       const unsigned int hits = subBlock->jetHits(slice);
       if (hits) {
-        LVL1::JEMHits* jh = findJetHits(crate, module);
+        LVL1::JEMHits* jh = findJetHits(jhdata, crate, module);
         if ( ! jh ) {   // create new jet hits
           m_hitsVec.assign(timeslices, 0);
           m_hitsVec[slice] = hits;
-          jh = new LVL1::JEMHits(swCrate, module, m_hitsVec, trigJem);
-          m_hitsMap.insert(std::make_pair(crate * m_modules + module, jh));
-          m_hitCollection->push_back(jh);
+          auto jhp =
+            std::make_unique<LVL1::JEMHits>(swCrate, module, m_hitsVec, trigJem);
+          jhdata.m_hitsMap.insert(std::make_pair(crate * m_modules + module, jhp.get()));
+          jhdata.m_hitCollection->push_back(std::move(jhp));
         } else {
           m_hitsVec = jh->JetHitsVec();
           const int nsl = m_hitsVec.size();
@@ -1376,7 +1384,7 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
             return;
           }
           m_hitsVec[slice] = hits;
-          jh->addJetHits(m_hitsVec);
+	  jh->addJetHits(m_hitsVec);
         }
       } else if (verbose) {
         msg(MSG::VERBOSE) << "No jet hits data for crate/module/slice "
@@ -1384,7 +1392,8 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
                           << endmsg;
         msg(MSG::DEBUG);
       }
-    } else if (collection == ENERGY_SUMS) {
+    } else if (data.m_collection == ENERGY_SUMS) {
+      EnergySumsData& sumdata = static_cast<EnergySumsData&>(data);
 
       // Get energy subsums
 
@@ -1392,7 +1401,7 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
       const unsigned int ey = subBlock->ey(slice);
       const unsigned int et = subBlock->et(slice);
       if (ex | ey | et) {
-        LVL1::JEMEtSums* sums = findEnergySums(crate, module);
+        LVL1::JEMEtSums* sums = findEnergySums(sumdata, crate, module);
         if ( ! sums ) {   // create new energy sums
           m_exVec.assign(timeslices, 0);
           m_eyVec.assign(timeslices, 0);
@@ -1400,10 +1409,11 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
           m_exVec[slice] = ex;
           m_eyVec[slice] = ey;
           m_etVec[slice] = et;
-          sums = new LVL1::JEMEtSums(swCrate, module, m_etVec, m_exVec, m_eyVec,
-                                     trigJem);
-          m_etMap.insert(std::make_pair(crate * m_modules + module, sums));
-          m_etCollection->push_back(sums);
+          auto sumsp =
+            std::make_unique<LVL1::JEMEtSums>(swCrate, module, m_etVec, m_exVec, m_eyVec,
+                                              trigJem);
+          sumdata.m_etMap.insert(std::make_pair(crate * m_modules + module, sumsp.get()));
+          sumdata.m_etCollection->push_back(std::move(sumsp));
         } else {
           m_exVec = sums->ExVec();
           m_eyVec = sums->EyVec();
@@ -1443,63 +1453,104 @@ void JepByteStreamTool::decodeJem(JemSubBlock* subBlock, int trigJem,
 
 // Find a jet element given eta, phi
 
+const 
 LVL1::JetElement* JepByteStreamTool::findJetElement(const double eta,
-    const double phi)
+                                                    const double phi) const
 {
-  LVL1::JetElement* tt = 0;
   const unsigned int key = m_elementKey->jeKey(phi, eta);
-  JetElementMap::const_iterator mapIter;
-  mapIter = m_jeMap.find(key);
-  if (mapIter != m_jeMap.end()) tt = mapIter->second;
-  return tt;
+  ConstJetElementMap::const_iterator mapIter = m_jeMap.find(key);
+  if (mapIter != m_jeMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::JetElement* JepByteStreamTool::findJetElement(const JetElementData& data,
+                                                    const double eta,
+                                                    const double phi) const
+{
+  const unsigned int key = m_elementKey->jeKey(phi, eta);
+  JetElementMap::const_iterator mapIter = data.m_jeMap.find(key);
+  if (mapIter != data.m_jeMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find jet hits for given crate, module
 
+const
 LVL1::JEMHits* JepByteStreamTool::findJetHits(const int crate,
-    const int module)
+                                              const int module) const
 {
-  LVL1::JEMHits* hits = 0;
-  JetHitsMap::const_iterator mapIter;
-  mapIter = m_hitsMap.find(crate * m_modules + module);
-  if (mapIter != m_hitsMap.end()) hits = mapIter->second;
-  return hits;
+  ConstJetHitsMap::const_iterator mapIter = m_hitsMap.find(crate * m_modules + module);
+  if (mapIter != m_hitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::JEMHits* JepByteStreamTool::findJetHits(const JetHitsData& data,
+                                              const int crate,
+                                              const int module) const
+{
+  JetHitsMap::const_iterator mapIter = data.m_hitsMap.find(crate * m_modules + module);
+  if (mapIter != data.m_hitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find energy sums for given crate, module
 
+const
 LVL1::JEMEtSums* JepByteStreamTool::findEnergySums(const int crate,
-    const int module)
+                                                   const int module) const
 {
-  LVL1::JEMEtSums* sums = 0;
-  EnergySumsMap::const_iterator mapIter;
-  mapIter = m_etMap.find(crate * m_modules + module);
-  if (mapIter != m_etMap.end()) sums = mapIter->second;
-  return sums;
+  ConstEnergySumsMap::const_iterator mapIter = m_etMap.find(crate * m_modules + module);
+  if (mapIter != m_etMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::JEMEtSums* JepByteStreamTool::findEnergySums(const EnergySumsData& data,
+                                                   const int crate,
+                                                   const int module) const
+{
+  EnergySumsMap::const_iterator mapIter = data.m_etMap.find(crate * m_modules + module);
+  if (mapIter != data.m_etMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMM hits for given crate, dataID
 
+const
 LVL1::CMMJetHits* JepByteStreamTool::findCmmHits(const int crate,
-    const int dataID)
+                                                 const int dataID) const
+{
+  ConstCmmHitsMap::const_iterator mapIter = m_cmmHitsMap.find(crate * 100 + dataID);
+  if (mapIter != m_cmmHitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMMJetHits* JepByteStreamTool::findCmmHits(const CmmHitsData& data,
+                                                 const int crate,
+                                                 const int dataID) const
 {
-  LVL1::CMMJetHits* hits = 0;
-  CmmHitsMap::const_iterator mapIter;
-  mapIter = m_cmmHitsMap.find(crate * 100 + dataID);
-  if (mapIter != m_cmmHitsMap.end()) hits = mapIter->second;
-  return hits;
+  CmmHitsMap::const_iterator mapIter = data.m_cmmHitsMap.find(crate * 100 + dataID);
+  if (mapIter != data.m_cmmHitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMM energy sums for given crate, module, dataID
 
+const
 LVL1::CMMEtSums* JepByteStreamTool::findCmmSums(const int crate,
-    const int dataID)
+                                                const int dataID) const
+{
+  ConstCmmSumsMap::const_iterator mapIter = m_cmmEtMap.find(crate * 100 + dataID);
+  if (mapIter != m_cmmEtMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMMEtSums* JepByteStreamTool::findCmmSums(const CmmSumsData& data,
+                                                const int crate,
+                                                const int dataID) const
 {
-  LVL1::CMMEtSums* sums = 0;
-  CmmSumsMap::const_iterator mapIter;
-  mapIter = m_cmmEtMap.find(crate * 100 + dataID);
-  if (mapIter != m_cmmEtMap.end()) sums = mapIter->second;
-  return sums;
+  CmmSumsMap::const_iterator mapIter = data.m_cmmEtMap.find(crate * 100 + dataID);
+  if (mapIter != data.m_cmmEtMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Set up jet element map
@@ -1512,7 +1563,7 @@ void JepByteStreamTool::setupJeMap(const JetElementCollection*
     JetElementCollection::const_iterator pos  = jeCollection->begin();
     JetElementCollection::const_iterator pose = jeCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::JetElement* const je = *pos;
+      const LVL1::JetElement* const je = *pos;
       const unsigned int key = m_elementKey->jeKey(je->phi(), je->eta());
       m_jeMap.insert(std::make_pair(key, je));
     }
@@ -1529,7 +1580,7 @@ void JepByteStreamTool::setupHitsMap(const JetHitsCollection*
     JetHitsCollection::const_iterator pos  = hitCollection->begin();
     JetHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::JEMHits* const hits = *pos;
+      const LVL1::JEMHits* const hits = *pos;
       const int crate = hits->crate() - m_crateOffsetSw;
       const int key   = m_modules * crate + hits->module();
       m_hitsMap.insert(std::make_pair(key, hits));
@@ -1547,7 +1598,7 @@ void JepByteStreamTool::setupEtMap(const EnergySumsCollection*
     EnergySumsCollection::const_iterator pos  = etCollection->begin();
     EnergySumsCollection::const_iterator pose = etCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::JEMEtSums* const sums = *pos;
+      const LVL1::JEMEtSums* const sums = *pos;
       const int crate = sums->crate() - m_crateOffsetSw;
       const int key   = m_modules * crate + sums->module();
       m_etMap.insert(std::make_pair(key, sums));
@@ -1565,7 +1616,7 @@ void JepByteStreamTool::setupCmmHitsMap(const CmmHitsCollection*
     CmmHitsCollection::const_iterator pos  = hitCollection->begin();
     CmmHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMMJetHits* const hits = *pos;
+      const LVL1::CMMJetHits* 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));
@@ -1583,7 +1634,7 @@ void JepByteStreamTool::setupCmmEtMap(const CmmSumsCollection*
     CmmSumsCollection::const_iterator pos  = etCollection->begin();
     CmmSumsCollection::const_iterator pose = etCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMMEtSums* const sums = *pos;
+      const LVL1::CMMEtSums* const sums = *pos;
       const int crate = sums->crate() - m_crateOffsetSw;
       const int key   = crate * 100 + sums->dataID();
       m_cmmEtMap.insert(std::make_pair(key, sums));
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamTool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamTool.h
index 8e307e6ec5e..7e253dcdf7c 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamTool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamTool.h
@@ -96,35 +96,87 @@ class JepByteStreamTool : public AthAlgTool {
    typedef DataVector<LVL1::CMMJetHits>                  CmmHitsCollection;
    typedef DataVector<LVL1::CMMEtSums>                   CmmSumsCollection;
    typedef std::map<unsigned int, LVL1::JetElement*>     JetElementMap;
+   typedef std::map<unsigned int, const LVL1::JetElement*> ConstJetElementMap;
    typedef std::map<int, LVL1::JEMHits*>                 JetHitsMap;
+   typedef std::map<int, const LVL1::JEMHits*>           ConstJetHitsMap;
    typedef std::map<int, LVL1::JEMEtSums*>               EnergySumsMap;
+   typedef std::map<int, const LVL1::JEMEtSums*>         ConstEnergySumsMap;
    typedef std::map<int, LVL1::CMMJetHits*>              CmmHitsMap;
+   typedef std::map<int, const LVL1::CMMJetHits*>        ConstCmmHitsMap;
    typedef std::map<int, LVL1::CMMEtSums*>               CmmSumsMap;
+   typedef std::map<int, const LVL1::CMMEtSums*>         ConstCmmSumsMap;
    typedef IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   struct JepByteStreamToolData
+   {
+     JepByteStreamToolData (const CollectionType collection)
+       : m_collection(collection){}
+     const CollectionType m_collection;
+   };
+   struct JetElementData : public JepByteStreamToolData
+   {
+     JetElementData (JetElementCollection* const jeCollection)
+       : JepByteStreamToolData (JET_ELEMENTS), m_jeCollection (jeCollection) {}
+     JetElementCollection* const m_jeCollection;
+     JetElementMap m_jeMap;
+   };
+   struct JetHitsData : public JepByteStreamToolData
+   {
+     JetHitsData (JetHitsCollection* const hitCollection)
+       : JepByteStreamToolData (JET_HITS), m_hitCollection (hitCollection) {}
+     JetHitsCollection* const m_hitCollection;
+     JetHitsMap    m_hitsMap;
+   };
+   struct EnergySumsData : public JepByteStreamToolData
+   {
+     EnergySumsData (EnergySumsCollection* const etCollection)
+       : JepByteStreamToolData (ENERGY_SUMS), m_etCollection (etCollection) {}
+     EnergySumsCollection* const m_etCollection;
+     EnergySumsMap m_etMap;
+   };
+   struct CmmHitsData : public JepByteStreamToolData
+   {
+     CmmHitsData (CmmHitsCollection* const cmmHitCollection)
+       : JepByteStreamToolData (CMM_HITS), m_cmmHitCollection (cmmHitCollection) {}
+     CmmHitsCollection* const m_cmmHitCollection;
+     CmmHitsMap    m_cmmHitsMap;
+   };
+   struct CmmSumsData : public JepByteStreamToolData
+   {
+     CmmSumsData (CmmSumsCollection* const cmmEtCollection)
+       : JepByteStreamToolData (CMM_SUMS), m_cmmEtCollection (cmmEtCollection) {}
+     CmmSumsCollection* const m_cmmEtCollection;
+     CmmSumsMap    m_cmmEtMap;
+   };
+
    /// Convert bytestream to given container type
    StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                        CollectionType collection);
+                        JepByteStreamToolData& data);
    /// Unpack CMM-Energy sub-block
-   void decodeCmmEnergy(CmmEnergySubBlock* subBlock, int trigCmm);
+   void decodeCmmEnergy(CmmEnergySubBlock* subBlock, int trigCmm, CmmSumsData& data);
    /// Unpack CMM-Jet sub-block
-   void decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm);
+   void decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm, CmmHitsData& data);
    /// Unpack JEM sub-block
    void decodeJem(JemSubBlock* subBlock, int trigJem,
-                                         CollectionType collection);
+                  JepByteStreamToolData& data);
 
    /// Find a jet element given eta, phi
-   LVL1::JetElement* findJetElement(double eta, double phi);
+   const LVL1::JetElement* findJetElement(double eta, double phi) const;
+   LVL1::JetElement* findJetElement(const JetElementData& data, double eta, double phi) const;
    /// Find jet hits for given crate, module
-   LVL1::JEMHits*    findJetHits(int crate, int module);
+   const LVL1::JEMHits*    findJetHits(int crate, int module) const;
+   LVL1::JEMHits*    findJetHits(const JetHitsData& data, int crate, int module) const;
    /// Find energy sums for given crate, module
-   LVL1::JEMEtSums*  findEnergySums(int crate, int module);
+   const LVL1::JEMEtSums*  findEnergySums(int crate, int module) const;
+   LVL1::JEMEtSums*  findEnergySums(const EnergySumsData& data, int crate, int module) const;
    /// Find CMM hits for given crate, data ID
-   LVL1::CMMJetHits* findCmmHits(int crate, int dataID);
+   const LVL1::CMMJetHits* findCmmHits(int crate, int dataID) const;
+   LVL1::CMMJetHits* findCmmHits(const CmmHitsData& data, int crate, int dataID) const;
    /// Find CMM energy sums for given crate, data ID
-   LVL1::CMMEtSums*  findCmmSums(int crate, int dataID);
+   const LVL1::CMMEtSums*  findCmmSums(int crate, int dataID) const;
+   LVL1::CMMEtSums*  findCmmSums(const CmmSumsData& data, int crate, int dataID) const;
 
    /// Set up jet element map
    void setupJeMap(const JetElementCollection* jeCollection);
@@ -206,26 +258,16 @@ class JepByteStreamTool : public AthAlgTool {
    DataVector<CmmEnergySubBlock> m_cmmEnergyBlocks;
    /// Vector for current CMM-Jet sub-blocks
    DataVector<CmmJetSubBlock> m_cmmJetBlocks;
-   /// Current jet elements collection
-   JetElementCollection* m_jeCollection;
-   /// Current jet hits collection
-   JetHitsCollection*    m_hitCollection;
-   /// Current energy sums collection
-   EnergySumsCollection* m_etCollection;
-   /// Current CMM hits collection
-   CmmHitsCollection*    m_cmmHitCollection;
-   /// Current CMM energy sums collection
-   CmmSumsCollection*    m_cmmEtCollection;
    /// Jet element map
-   JetElementMap m_jeMap;
+   ConstJetElementMap m_jeMap;
    /// Jet hits map
-   JetHitsMap    m_hitsMap;
+   ConstJetHitsMap    m_hitsMap;
    /// Energy sums map
-   EnergySumsMap m_etMap;
+   ConstEnergySumsMap m_etMap;
    /// CMM hits map
-   CmmHitsMap    m_cmmHitsMap;
+   ConstCmmHitsMap    m_cmmHitsMap;
    /// CMM energy sums map
-   CmmSumsMap    m_cmmEtMap;
+   ConstCmmSumsMap    m_cmmEtMap;
    /// ROD Status words
    std::vector<uint32_t>* m_rodStatus;
    /// ROD status map
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV1Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV1Tool.cxx
index 80f60a2fd29..4ebb89cb44a 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV1Tool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV1Tool.cxx
@@ -154,9 +154,8 @@ StatusCode JepByteStreamV1Tool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::JetElement>* const jeCollection)
 {
-  m_jeCollection = jeCollection;
-  m_jeMap.clear();
-  return convertBs(robFrags, JET_ELEMENTS);
+  JetElementData data (jeCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to jet hits
@@ -165,9 +164,8 @@ StatusCode JepByteStreamV1Tool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::JEMHits>* const hitCollection)
 {
-  m_hitCollection = hitCollection;
-  m_hitsMap.clear();
-  return convertBs(robFrags, JET_HITS);
+  JetHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to energy sums
@@ -176,9 +174,8 @@ StatusCode JepByteStreamV1Tool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::JEMEtSums>* const etCollection)
 {
-  m_etCollection = etCollection;
-  m_etMap.clear();
-  return convertBs(robFrags, ENERGY_SUMS);
+  EnergySumsData data (etCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMM hits
@@ -187,9 +184,8 @@ StatusCode JepByteStreamV1Tool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::CMMJetHits>* const hitCollection)
 {
-  m_cmmHitCollection = hitCollection;
-  m_cmmHitsMap.clear();
-  return convertBs(robFrags, CMM_HITS);
+  CmmHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMM energy sums
@@ -198,9 +194,8 @@ StatusCode JepByteStreamV1Tool::convert(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
   DataVector<LVL1::CMMEtSums>* const etCollection)
 {
-  m_cmmEtCollection = etCollection;
-  m_cmmEtMap.clear();
-  return convertBs(robFrags, CMM_SUMS);
+  CmmSumsData data (etCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion of JEP container to bytestream
@@ -597,7 +592,7 @@ const std::vector<uint32_t>& JepByteStreamV1Tool::sourceIDs(
 
 StatusCode JepByteStreamV1Tool::convertBs(
   const IROBDataProviderSvc::VROBFRAG& robFrags,
-  const CollectionType collection)
+  JepByteStreamToolData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -731,8 +726,8 @@ StatusCode JepByteStreamV1Tool::convertBs(
             m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
             break;
           }
-          if (collection == CMM_HITS) {
-            decodeCmmJet(m_cmmJetSubBlock, trigCmm);
+          if (data.m_collection == CMM_HITS) {
+            decodeCmmJet(m_cmmJetSubBlock, trigCmm, static_cast<CmmHitsData&>(data));
             if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
               if (debug) msg() << "decodeCmmJet failed" << endmsg;
               break;
@@ -747,8 +742,8 @@ StatusCode JepByteStreamV1Tool::convertBs(
             m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
             break;
           }
-          if (collection == CMM_SUMS) {
-            decodeCmmEnergy(m_cmmEnergySubBlock, trigCmm);
+          if (data.m_collection == CMM_SUMS) {
+            decodeCmmEnergy(m_cmmEnergySubBlock, trigCmm, static_cast<CmmSumsData&>(data));
             if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
               if (debug) msg() << "decodeCmmEnergy failed" << endmsg;
               break;
@@ -769,9 +764,9 @@ StatusCode JepByteStreamV1Tool::convertBs(
           m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
           break;
         }
-        if (collection == JET_ELEMENTS || collection == JET_HITS ||
-            collection == ENERGY_SUMS) {
-          decodeJem(m_jemSubBlock, trigJem, collection);
+        if (data.m_collection == JET_ELEMENTS || data.m_collection == JET_HITS ||
+            data.m_collection == ENERGY_SUMS) {
+          decodeJem(m_jemSubBlock, trigJem, data);
           if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
             if (debug) msg() << "decodeJem failed" << endmsg;
             break;
@@ -789,7 +784,8 @@ StatusCode JepByteStreamV1Tool::convertBs(
 // Unpack CMM-Energy sub-block
 
 void JepByteStreamV1Tool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
-    int trigCmm)
+                                          int trigCmm,
+                                          CmmSumsData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -892,7 +888,7 @@ void JepByteStreamV1Tool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
       eyErr = eyErrBits.error();
       etErr = etErrBits.error();
       if (ex || ey || et || exErr || eyErr || etErr) {
-        LVL1::CMMEtSums* sums = findCmmSums(crate, dataID);
+        LVL1::CMMEtSums* sums = findCmmSums(data, crate, dataID);
         if ( ! sums ) {   // create new CMM energy sums
           m_exVec.assign(timeslices, 0);
           m_eyVec.assign(timeslices, 0);
@@ -906,11 +902,12 @@ void JepByteStreamV1Tool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
           m_exErrVec[slice] = exErr;
           m_eyErrVec[slice] = eyErr;
           m_etErrVec[slice] = etErr;
-          sums = new LVL1::CMMEtSums(swCrate, dataID, m_etVec, m_exVec, m_eyVec,
-                                     m_etErrVec, m_exErrVec, m_eyErrVec, trigCmm);
+          auto sumsp =
+            std::make_unique<LVL1::CMMEtSums>(swCrate, dataID, m_etVec, m_exVec, m_eyVec,
+                                              m_etErrVec, m_exErrVec, m_eyErrVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmEtMap.insert(std::make_pair(key, sums));
-          m_cmmEtCollection->push_back(sums);
+          data.m_cmmEtMap.insert(std::make_pair(key, sumsp.get()));
+          data.m_cmmEtCollection->push_back(std::move(sumsp));
         } else {
           m_exVec = sums->ExVec();
           m_eyVec = sums->EyVec();
@@ -951,18 +948,19 @@ void JepByteStreamV1Tool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
       const unsigned int missEt = subBlock->missingEtHits(slice);
       if ( missEt || ssError ) {
         const int dataID = LVL1::CMMEtSums::MISSING_ET_MAP;
-        LVL1::CMMEtSums* map = findCmmSums(crate, dataID);
+        LVL1::CMMEtSums* map = findCmmSums(data, crate, dataID);
         if ( ! map ) {
           m_etVec.assign(timeslices, 0);
           m_etErrVec.assign(timeslices, 0);
           m_etVec[slice]    = missEt;
           m_etErrVec[slice] = ssError;
-          map = new LVL1::CMMEtSums(swCrate, dataID,
-                                    m_etVec, m_etVec, m_etVec,
-                                    m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
+          auto mapp =
+            std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
+                                              m_etVec, m_etVec, m_etVec,
+                                              m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmEtMap.insert(std::make_pair(key, map));
-          m_cmmEtCollection->push_back(map);
+          data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
+          data.m_cmmEtCollection->push_back(std::move(mapp));
         } else {
           m_etVec    = map->EtVec();
           m_etErrVec = map->EtErrorVec();
@@ -988,18 +986,19 @@ void JepByteStreamV1Tool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
       const unsigned int sumEt = subBlock->sumEtHits(slice);
       if ( sumEt || ssError ) {
         const int dataID = LVL1::CMMEtSums::SUM_ET_MAP;
-        LVL1::CMMEtSums* map = findCmmSums(crate, dataID);
+        LVL1::CMMEtSums* map = findCmmSums(data, crate, dataID);
         if ( ! map ) {
           m_etVec.assign(timeslices, 0);
           m_etErrVec.assign(timeslices, 0);
           m_etVec[slice]    = sumEt;
           m_etErrVec[slice] = ssError;
-          map = new LVL1::CMMEtSums(swCrate, dataID,
-                                    m_etVec, m_etVec, m_etVec,
-                                    m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
+          auto mapp =
+            std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
+                                              m_etVec, m_etVec, m_etVec,
+                                              m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmEtMap.insert(std::make_pair(key, map));
-          m_cmmEtCollection->push_back(map);
+          data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
+          data.m_cmmEtCollection->push_back(std::move(mapp));
         } else {
           m_etVec    = map->EtVec();
           m_etErrVec = map->EtErrorVec();
@@ -1026,18 +1025,19 @@ void JepByteStreamV1Tool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
         const unsigned int missEtSig = subBlock->missingEtSigHits(slice);
         if ( missEtSig || ssError ) {
           const int dataID = LVL1::CMMEtSums::MISSING_ET_SIG_MAP;
-          LVL1::CMMEtSums* map = findCmmSums(crate, dataID);
+          LVL1::CMMEtSums* map = findCmmSums(data, crate, dataID);
           if ( ! map ) {
             m_etVec.assign(timeslices, 0);
             m_etErrVec.assign(timeslices, 0);
             m_etVec[slice]    = missEtSig;
             m_etErrVec[slice] = ssError;
-            map = new LVL1::CMMEtSums(swCrate, dataID,
-                                      m_etVec, m_etVec, m_etVec,
-                                      m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
+            auto mapp =
+              std::make_unique<LVL1::CMMEtSums>(swCrate, dataID,
+                                                m_etVec, m_etVec, m_etVec,
+                                                m_etErrVec, m_etErrVec, m_etErrVec, trigCmm);
             const int key = crate * 100 + dataID;
-            m_cmmEtMap.insert(std::make_pair(key, map));
-            m_cmmEtCollection->push_back(map);
+            data.m_cmmEtMap.insert(std::make_pair(key, mapp.get()));
+            data.m_cmmEtCollection->push_back(std::move(mapp));
           } else {
             m_etVec    = map->EtVec();
             m_etErrVec = map->EtErrorVec();
@@ -1070,7 +1070,8 @@ void JepByteStreamV1Tool::decodeCmmEnergy(CmmEnergySubBlock* subBlock,
 
 // Unpack CMM-Jet sub-block
 
-void JepByteStreamV1Tool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
+void JepByteStreamV1Tool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm,
+                                       CmmHitsData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -1165,16 +1166,17 @@ void JepByteStreamV1Tool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
                   subBlock->jetHitsError(slice, source));
       const int err = errBits.error();
       if (hits || err) {
-        LVL1::CMMJetHits* jh = findCmmHits(crate, dataID);
+        LVL1::CMMJetHits* jh = findCmmHits(data, crate, dataID);
         if ( ! jh ) {   // create new CMM hits
           m_hitsVec.assign(timeslices, 0);
           m_errVec.assign(timeslices, 0);
           m_hitsVec[slice] = hits;
           m_errVec[slice]  = err;
-          jh = new LVL1::CMMJetHits(swCrate, dataID, m_hitsVec, m_errVec, trigCmm);
+          auto jhp =
+            std::make_unique<LVL1::CMMJetHits>(swCrate, dataID, m_hitsVec, m_errVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmHitsMap.insert(std::make_pair(key, jh));
-          m_cmmHitCollection->push_back(jh);
+          data.m_cmmHitsMap.insert(std::make_pair(key, jhp.get()));
+          data.m_cmmHitCollection->push_back(std::move(jhp));
         } else {
           m_hitsVec = jh->HitsVec();
           m_errVec  = jh->ErrorVec();
@@ -1203,16 +1205,17 @@ void JepByteStreamV1Tool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
       const unsigned int etMap = subBlock->jetEtMap(slice);
       if ( etMap || ssError ) {
         const int dataID = LVL1::CMMJetHits::ET_MAP;
-        LVL1::CMMJetHits* map = findCmmHits(crate, dataID);
+        LVL1::CMMJetHits* map = findCmmHits(data, crate, dataID);
         if ( ! map ) {
           m_hitsVec.assign(timeslices, 0);
           m_errVec.assign(timeslices, 0);
           m_hitsVec[slice] = etMap;
           m_errVec[slice]  = ssError;
-          map = new LVL1::CMMJetHits(swCrate, dataID, m_hitsVec, m_errVec, trigCmm);
+          auto mapp =
+            std::make_unique<LVL1::CMMJetHits>(swCrate, dataID, m_hitsVec, m_errVec, trigCmm);
           const int key = crate * 100 + dataID;
-          m_cmmHitsMap.insert(std::make_pair(key, map));
-          m_cmmHitCollection->push_back(map);
+          data.m_cmmHitsMap.insert(std::make_pair(key, mapp.get()));
+          data.m_cmmHitCollection->push_back(std::move(mapp));
         } else {
           m_hitsVec = map->HitsVec();
           m_errVec  = map->ErrorVec();
@@ -1242,7 +1245,7 @@ void JepByteStreamV1Tool::decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm)
 // Unpack JEM sub-block
 
 void JepByteStreamV1Tool::decodeJem(JemSubBlockV1* subBlock, int trigJem,
-                                    const CollectionType collection)
+                                    JepByteStreamToolData& data)
 {
   const bool debug   = msgLvl(MSG::DEBUG);
   const bool verbose = msgLvl(MSG::VERBOSE);
@@ -1294,7 +1297,8 @@ void JepByteStreamV1Tool::decodeJem(JemSubBlockV1* subBlock, int trigJem,
   const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
   for (int slice = sliceBeg; slice < sliceEnd; ++slice) {
 
-    if (collection == JET_ELEMENTS) {
+    if (data.m_collection == JET_ELEMENTS) {
+      JetElementData& jedata = static_cast<JetElementData&>(data);
 
       // Loop over jet element channels and fill jet elements
 
@@ -1306,13 +1310,15 @@ void JepByteStreamV1Tool::decodeJem(JemSubBlockV1* subBlock, int trigJem,
           int layer = 0;
           if (m_jemMaps->mapping(crate, module, chan, eta, phi, layer)) {
             if (layer == m_coreOverlap) {
-              LVL1::JetElement* je = findJetElement(eta, phi);
+	      LVL1::JetElement* je = findJetElement(jedata, eta, phi);
               if ( ! je ) {   // create new jet element
                 const unsigned int key = m_elementKey->jeKey(phi, eta);
-                je = new LVL1::JetElement(phi, eta, dummy, dummy, key,
-                                          dummy, dummy, dummy, trigJem);
-                m_jeMap.insert(std::make_pair(key, je));
-                m_jeCollection->push_back(je);
+                auto jep =
+                  std::make_unique<LVL1::JetElement>(phi, eta, dummy, dummy, key,
+                                                     dummy, dummy, dummy, trigJem);
+                je = jep.get();
+                jedata.m_jeMap.insert(std::make_pair(key, jep.get()));
+                jedata.m_jeCollection->push_back(std::move(jep));
               } else {
                 const std::vector<int>& emEnergy(je->emEnergyVec());
                 const std::vector<int>& hadEnergy(je->hadEnergyVec());
@@ -1357,19 +1363,21 @@ void JepByteStreamV1Tool::decodeJem(JemSubBlockV1* subBlock, int trigJem,
           msg(MSG::DEBUG);
         }
       }
-    } else if (collection == JET_HITS) {
+    } else if (data.m_collection == JET_HITS) {
+      JetHitsData& jhdata = static_cast<JetHitsData&>(data);
 
       // Get jet hits
 
       const unsigned int hits = subBlock->jetHits(slice);
       if (hits) {
-        LVL1::JEMHits* jh = findJetHits(crate, module);
+        LVL1::JEMHits* jh = findJetHits(jhdata, crate, module);
         if ( ! jh ) {   // create new jet hits
           m_hitsVec.assign(timeslices, 0);
           m_hitsVec[slice] = hits;
-          jh = new LVL1::JEMHits(swCrate, module, m_hitsVec, trigJem);
-          m_hitsMap.insert(std::make_pair(crate * m_modules + module, jh));
-          m_hitCollection->push_back(jh);
+          auto jhp =
+            std::make_unique<LVL1::JEMHits>(swCrate, module, m_hitsVec, trigJem);
+          jhdata.m_hitsMap.insert(std::make_pair(crate * m_modules + module, jhp.get()));
+          jhdata.m_hitCollection->push_back(std::move(jhp));
         } else {
           m_hitsVec = jh->JetHitsVec();
           const int nsl = m_hitsVec.size();
@@ -1396,7 +1404,8 @@ void JepByteStreamV1Tool::decodeJem(JemSubBlockV1* subBlock, int trigJem,
                           << endmsg;
         msg(MSG::DEBUG);
       }
-    } else if (collection == ENERGY_SUMS) {
+    } else if (data.m_collection == ENERGY_SUMS) {
+      EnergySumsData& sumdata = static_cast<EnergySumsData&>(data);
 
       // Get energy subsums
 
@@ -1404,7 +1413,7 @@ void JepByteStreamV1Tool::decodeJem(JemSubBlockV1* subBlock, int trigJem,
       const unsigned int ey = subBlock->ey(slice);
       const unsigned int et = subBlock->et(slice);
       if (ex | ey | et) {
-        LVL1::JEMEtSums* sums = findEnergySums(crate, module);
+	LVL1::JEMEtSums* sums = findEnergySums(sumdata, crate, module);
         if ( ! sums ) {   // create new energy sums
           m_exVec.assign(timeslices, 0);
           m_eyVec.assign(timeslices, 0);
@@ -1412,10 +1421,11 @@ void JepByteStreamV1Tool::decodeJem(JemSubBlockV1* subBlock, int trigJem,
           m_exVec[slice] = ex;
           m_eyVec[slice] = ey;
           m_etVec[slice] = et;
-          sums = new LVL1::JEMEtSums(swCrate, module, m_etVec, m_exVec, m_eyVec,
-                                     trigJem);
-          m_etMap.insert(std::make_pair(crate * m_modules + module, sums));
-          m_etCollection->push_back(sums);
+          auto sumsp =
+            std::make_unique<LVL1::JEMEtSums>(swCrate, module, m_etVec, m_exVec, m_eyVec,
+                                              trigJem);
+          sumdata.m_etMap.insert(std::make_pair(crate * m_modules + module, sumsp.get()));
+          sumdata.m_etCollection->push_back(std::move(sumsp));
         } else {
           m_exVec = sums->ExVec();
           m_eyVec = sums->EyVec();
@@ -1455,63 +1465,104 @@ void JepByteStreamV1Tool::decodeJem(JemSubBlockV1* subBlock, int trigJem,
 
 // Find a jet element given eta, phi
 
+const 
 LVL1::JetElement* JepByteStreamV1Tool::findJetElement(const double eta,
-    const double phi)
+                                                      const double phi) const
 {
-  LVL1::JetElement* tt = 0;
   const unsigned int key = m_elementKey->jeKey(phi, eta);
-  JetElementMap::const_iterator mapIter;
-  mapIter = m_jeMap.find(key);
-  if (mapIter != m_jeMap.end()) tt = mapIter->second;
-  return tt;
+  ConstJetElementMap::const_iterator mapIter = m_jeMap.find(key);
+  if (mapIter != m_jeMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::JetElement* JepByteStreamV1Tool::findJetElement(const JetElementData& data,
+                                                      const double eta,
+                                                      const double phi) const
+{
+  const unsigned int key = m_elementKey->jeKey(phi, eta);
+  JetElementMap::const_iterator mapIter = data.m_jeMap.find(key);
+  if (mapIter != data.m_jeMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find jet hits for given crate, module
 
+const
 LVL1::JEMHits* JepByteStreamV1Tool::findJetHits(const int crate,
-    const int module)
+                                                const int module) const
+{
+  ConstJetHitsMap::const_iterator mapIter = m_hitsMap.find(crate * m_modules + module);
+  if (mapIter != m_hitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::JEMHits* JepByteStreamV1Tool::findJetHits(const JetHitsData& data,
+                                                const int crate,
+                                                const int module) const
 {
-  LVL1::JEMHits* hits = 0;
-  JetHitsMap::const_iterator mapIter;
-  mapIter = m_hitsMap.find(crate * m_modules + module);
-  if (mapIter != m_hitsMap.end()) hits = mapIter->second;
-  return hits;
+  JetHitsMap::const_iterator mapIter = data.m_hitsMap.find(crate * m_modules + module);
+  if (mapIter != data.m_hitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find energy sums for given crate, module
 
+const
 LVL1::JEMEtSums* JepByteStreamV1Tool::findEnergySums(const int crate,
-    const int module)
+                                                     const int module) const
+{
+  ConstEnergySumsMap::const_iterator mapIter = m_etMap.find(crate * m_modules + module);
+  if (mapIter != m_etMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::JEMEtSums* JepByteStreamV1Tool::findEnergySums(const EnergySumsData& data,
+                                                     const int crate,
+                                                     const int module) const
 {
-  LVL1::JEMEtSums* sums = 0;
-  EnergySumsMap::const_iterator mapIter;
-  mapIter = m_etMap.find(crate * m_modules + module);
-  if (mapIter != m_etMap.end()) sums = mapIter->second;
-  return sums;
+  EnergySumsMap::const_iterator mapIter = data.m_etMap.find(crate * m_modules + module);
+  if (mapIter != data.m_etMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMM hits for given crate, dataID
 
+const
 LVL1::CMMJetHits* JepByteStreamV1Tool::findCmmHits(const int crate,
-    const int dataID)
+                                                   const int dataID) const
 {
-  LVL1::CMMJetHits* hits = 0;
-  CmmHitsMap::const_iterator mapIter;
-  mapIter = m_cmmHitsMap.find(crate * 100 + dataID);
-  if (mapIter != m_cmmHitsMap.end()) hits = mapIter->second;
-  return hits;
+  ConstCmmHitsMap::const_iterator mapIter = m_cmmHitsMap.find(crate * 100 + dataID);
+  if (mapIter != m_cmmHitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMMJetHits* JepByteStreamV1Tool::findCmmHits(const CmmHitsData& data,
+                                                   const int crate,
+                                                   const int dataID) const
+{
+  CmmHitsMap::const_iterator mapIter = data.m_cmmHitsMap.find(crate * 100 + dataID);
+  if (mapIter != data.m_cmmHitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMM energy sums for given crate, module, dataID
 
+const
 LVL1::CMMEtSums* JepByteStreamV1Tool::findCmmSums(const int crate,
-    const int dataID)
+                                                  const int dataID) const
 {
-  LVL1::CMMEtSums* sums = 0;
-  CmmSumsMap::const_iterator mapIter;
-  mapIter = m_cmmEtMap.find(crate * 100 + dataID);
-  if (mapIter != m_cmmEtMap.end()) sums = mapIter->second;
-  return sums;
+  ConstCmmSumsMap::const_iterator mapIter = m_cmmEtMap.find(crate * 100 + dataID);
+  if (mapIter != m_cmmEtMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMMEtSums* JepByteStreamV1Tool::findCmmSums(const CmmSumsData& data,
+                                                  const int crate,
+                                                  const int dataID) const
+{
+  CmmSumsMap::const_iterator mapIter = data.m_cmmEtMap.find(crate * 100 + dataID);
+  if (mapIter != data.m_cmmEtMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Set up jet element map
@@ -1531,6 +1582,7 @@ void JepByteStreamV1Tool::setupJeMap(const JetElementCollection*
   }
 }
 
+
 // Set up jet hits map
 
 void JepByteStreamV1Tool::setupHitsMap(const JetHitsCollection*
@@ -1541,7 +1593,7 @@ void JepByteStreamV1Tool::setupHitsMap(const JetHitsCollection*
     JetHitsCollection::const_iterator pos  = hitCollection->begin();
     JetHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::JEMHits* const hits = *pos;
+      const LVL1::JEMHits* const hits = *pos;
       const int crate = hits->crate() - m_crateOffsetSw;
       const int key   = m_modules * crate + hits->module();
       m_hitsMap.insert(std::make_pair(key, hits));
@@ -1559,7 +1611,7 @@ void JepByteStreamV1Tool::setupEtMap(const EnergySumsCollection*
     EnergySumsCollection::const_iterator pos  = etCollection->begin();
     EnergySumsCollection::const_iterator pose = etCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::JEMEtSums* const sums = *pos;
+      const LVL1::JEMEtSums* const sums = *pos;
       const int crate = sums->crate() - m_crateOffsetSw;
       const int key   = m_modules * crate + sums->module();
       m_etMap.insert(std::make_pair(key, sums));
@@ -1577,7 +1629,7 @@ void JepByteStreamV1Tool::setupCmmHitsMap(const CmmHitsCollection*
     CmmHitsCollection::const_iterator pos  = hitCollection->begin();
     CmmHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMMJetHits* const hits = *pos;
+      const LVL1::CMMJetHits* 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));
@@ -1595,7 +1647,7 @@ void JepByteStreamV1Tool::setupCmmEtMap(const CmmSumsCollection*
     CmmSumsCollection::const_iterator pos  = etCollection->begin();
     CmmSumsCollection::const_iterator pose = etCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMMEtSums* const sums = *pos;
+      const LVL1::CMMEtSums* const sums = *pos;
       const int crate = sums->crate() - m_crateOffsetSw;
       const int key   = crate * 100 + sums->dataID();
       m_cmmEtMap.insert(std::make_pair(key, sums));
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV1Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV1Tool.h
index 85e61f68d1e..7eda9a1ff53 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV1Tool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV1Tool.h
@@ -96,35 +96,87 @@ class JepByteStreamV1Tool : public AthAlgTool {
    typedef DataVector<LVL1::CMMJetHits>                  CmmHitsCollection;
    typedef DataVector<LVL1::CMMEtSums>                   CmmSumsCollection;
    typedef std::map<unsigned int, LVL1::JetElement*>     JetElementMap;
+   typedef std::map<unsigned int, const LVL1::JetElement*> ConstJetElementMap;
    typedef std::map<int, LVL1::JEMHits*>                 JetHitsMap;
+   typedef std::map<int, const LVL1::JEMHits*>           ConstJetHitsMap;
    typedef std::map<int, LVL1::JEMEtSums*>               EnergySumsMap;
+   typedef std::map<int, const LVL1::JEMEtSums*>         ConstEnergySumsMap;
    typedef std::map<int, LVL1::CMMJetHits*>              CmmHitsMap;
+   typedef std::map<int, const LVL1::CMMJetHits*>        ConstCmmHitsMap;
    typedef std::map<int, LVL1::CMMEtSums*>               CmmSumsMap;
+   typedef std::map<int, const LVL1::CMMEtSums*>         ConstCmmSumsMap;
    typedef IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   struct JepByteStreamToolData
+   {
+     JepByteStreamToolData (const CollectionType collection)
+       : m_collection(collection){}
+     const CollectionType m_collection;
+   };
+   struct JetElementData : public JepByteStreamToolData
+   {
+     JetElementData (JetElementCollection* const jeCollection)
+       : JepByteStreamToolData (JET_ELEMENTS), m_jeCollection (jeCollection) {}
+     JetElementCollection* const m_jeCollection;
+     JetElementMap m_jeMap;
+   };
+   struct JetHitsData : public JepByteStreamToolData
+   {
+     JetHitsData (JetHitsCollection* const hitCollection)
+       : JepByteStreamToolData (JET_HITS), m_hitCollection (hitCollection) {}
+     JetHitsCollection* const m_hitCollection;
+     JetHitsMap    m_hitsMap;
+   };
+   struct EnergySumsData : public JepByteStreamToolData
+   {
+     EnergySumsData (EnergySumsCollection* const etCollection)
+       : JepByteStreamToolData (ENERGY_SUMS), m_etCollection (etCollection) {}
+     EnergySumsCollection* const m_etCollection;
+     EnergySumsMap m_etMap;
+   };
+   struct CmmHitsData : public JepByteStreamToolData
+   {
+     CmmHitsData (CmmHitsCollection* const cmmHitCollection)
+       : JepByteStreamToolData (CMM_HITS), m_cmmHitCollection (cmmHitCollection) {}
+     CmmHitsCollection* const m_cmmHitCollection;
+     CmmHitsMap    m_cmmHitsMap;
+   };
+   struct CmmSumsData : public JepByteStreamToolData
+   {
+     CmmSumsData (CmmSumsCollection* const cmmEtCollection)
+       : JepByteStreamToolData (CMM_SUMS), m_cmmEtCollection (cmmEtCollection) {}
+     CmmSumsCollection* const m_cmmEtCollection;
+     CmmSumsMap    m_cmmEtMap;
+   };
+
    /// Convert bytestream to given container type
    StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                        CollectionType collection);
+                        JepByteStreamToolData& data);
    /// Unpack CMM-Energy sub-block
-   void decodeCmmEnergy(CmmEnergySubBlock* subBlock, int trigCmm);
+   void decodeCmmEnergy(CmmEnergySubBlock* subBlock, int trigCmm, CmmSumsData& data);
    /// Unpack CMM-Jet sub-block
-   void decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm);
+   void decodeCmmJet(CmmJetSubBlock* subBlock, int trigCmm, CmmHitsData& data);
    /// Unpack JEM sub-block
    void decodeJem(JemSubBlockV1* subBlock, int trigJem,
-                                         CollectionType collection);
+                  JepByteStreamToolData& data);
 
    /// Find a jet element given eta, phi
-   LVL1::JetElement* findJetElement(double eta, double phi);
+   const LVL1::JetElement* findJetElement(double eta, double phi) const;
+   LVL1::JetElement* findJetElement(const JetElementData& data, double eta, double phi) const;
    /// Find jet hits for given crate, module
-   LVL1::JEMHits*    findJetHits(int crate, int module);
+   const LVL1::JEMHits*    findJetHits(int crate, int module) const;
+   LVL1::JEMHits*    findJetHits(const JetHitsData& data, int crate, int module) const;
    /// Find energy sums for given crate, module
-   LVL1::JEMEtSums*  findEnergySums(int crate, int module);
+   const LVL1::JEMEtSums*  findEnergySums(int crate, int module) const;
+   LVL1::JEMEtSums*  findEnergySums(const EnergySumsData& data, int crate, int module) const;
    /// Find CMM hits for given crate, data ID
-   LVL1::CMMJetHits* findCmmHits(int crate, int dataID);
+   const LVL1::CMMJetHits* findCmmHits(int crate, int dataID) const;
+   LVL1::CMMJetHits* findCmmHits(const CmmHitsData& data, int crate, int dataID) const;
    /// Find CMM energy sums for given crate, data ID
-   LVL1::CMMEtSums*  findCmmSums(int crate, int dataID);
+   const LVL1::CMMEtSums*  findCmmSums(int crate, int dataID) const;
+   LVL1::CMMEtSums*  findCmmSums(const CmmSumsData& data, int crate, int dataID) const;
 
    /// Set up jet element map
    void setupJeMap(const JetElementCollection* jeCollection);
@@ -210,26 +262,16 @@ class JepByteStreamV1Tool : public AthAlgTool {
    DataVector<CmmEnergySubBlock> m_cmmEnergyBlocks;
    /// Vector for current CMM-Jet sub-blocks
    DataVector<CmmJetSubBlock> m_cmmJetBlocks;
-   /// Current jet elements collection
-   JetElementCollection* m_jeCollection;
-   /// Current jet hits collection
-   JetHitsCollection*    m_hitCollection;
-   /// Current energy sums collection
-   EnergySumsCollection* m_etCollection;
-   /// Current CMM hits collection
-   CmmHitsCollection*    m_cmmHitCollection;
-   /// Current CMM energy sums collection
-   CmmSumsCollection*    m_cmmEtCollection;
    /// Jet element map
-   JetElementMap m_jeMap;
+   ConstJetElementMap m_jeMap;
    /// Jet hits map
-   JetHitsMap    m_hitsMap;
+   ConstJetHitsMap    m_hitsMap;
    /// Energy sums map
-   EnergySumsMap m_etMap;
+   ConstEnergySumsMap m_etMap;
    /// CMM hits map
-   CmmHitsMap    m_cmmHitsMap;
+   ConstCmmHitsMap    m_cmmHitsMap;
    /// CMM energy sums map
-   CmmSumsMap    m_cmmEtMap;
+   ConstCmmSumsMap    m_cmmEtMap;
    /// ROD Status words
    std::vector<uint32_t>* m_rodStatus;
    /// ROD status map
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV2Tool.cxx b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV2Tool.cxx
index 32a045b3651..5c29b9cfbcd 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV2Tool.cxx
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV2Tool.cxx
@@ -168,9 +168,8 @@ StatusCode JepByteStreamV2Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::JetElement>*  jeCollection)
 {
-  m_jeCollection = jeCollection;
-  m_jeMap.clear();
-  return convertBs(robFrags, JET_ELEMENTS);
+  JetElementData data (jeCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to energy sums
@@ -190,9 +189,8 @@ StatusCode JepByteStreamV2Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::JEMEtSums>*  etCollection)
 {
-  m_etCollection = etCollection;
-  m_etMap.clear();
-  return convertBs(robFrags, ENERGY_SUMS);
+  EnergySumsData data (etCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMX TOBs
@@ -212,9 +210,8 @@ StatusCode JepByteStreamV2Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CMXJetTob>*  tobCollection)
 {
-  m_cmxTobCollection = tobCollection;
-  m_cmxTobMap.clear();
-  return convertBs(robFrags, CMX_TOBS);
+  CmxTobData data (tobCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMX hits
@@ -234,9 +231,8 @@ StatusCode JepByteStreamV2Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CMXJetHits>*  hitCollection)
 {
-  m_cmxHitCollection = hitCollection;
-  m_cmxHitsMap.clear();
-  return convertBs(robFrags, CMX_HITS);
+  CmxHitsData data (hitCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion bytestream to CMX energy sums
@@ -257,9 +253,8 @@ StatusCode JepByteStreamV2Tool::convert(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
                             DataVector<LVL1::CMXEtSums>*  etCollection)
 {
-  m_cmxEtCollection = etCollection;
-  m_cmxEtMap.clear();
-  return convertBs(robFrags, CMX_SUMS);
+  CmxSumsData data (etCollection);
+  return convertBs(robFrags, data);
 }
 
 // Conversion of JEP container to bytestream
@@ -668,7 +663,7 @@ const std::vector<uint32_t>& JepByteStreamV2Tool::sourceIDs(
 
 StatusCode JepByteStreamV2Tool::convertBs(
                             const IROBDataProviderSvc::VROBFRAG& robFrags,
-                            const CollectionType collection)
+                            JepByteStreamToolData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -794,8 +789,8 @@ StatusCode JepByteStreamV2Tool::convertBs(
 	    m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
 	    break;
           }
-	  if (collection == CMX_HITS || collection == CMX_TOBS) {
-	    decodeCmxJet(m_cmxJetSubBlock, trigJem, collection);
+	  if (data.m_collection == CMX_HITS || data.m_collection == CMX_TOBS) {
+	    decodeCmxJet(m_cmxJetSubBlock, trigJem, data);
 	    if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
 	      if (debug) msg() << "decodeCmxJet failed" << endmsg;
 	      break;
@@ -810,8 +805,8 @@ StatusCode JepByteStreamV2Tool::convertBs(
 	    m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
 	    break;
           }
-	  if (collection == CMX_SUMS) {
-	    decodeCmxEnergy(m_cmxEnergySubBlock, trigJem);
+	  if (data.m_collection == CMX_SUMS) {
+	    decodeCmxEnergy(m_cmxEnergySubBlock, trigJem, static_cast<CmxSumsData&>(data));
 	    if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
 	      if (debug) msg() << "decodeCmxEnergy failed" << endmsg;
 	      break;
@@ -832,8 +827,8 @@ StatusCode JepByteStreamV2Tool::convertBs(
 	  m_rodErr = L1CaloSubBlock::ERROR_CRATE_NUMBER;
 	  break;
         }
-	if (collection == JET_ELEMENTS || collection == ENERGY_SUMS) {
-	  decodeJem(m_jemSubBlock, trigJem, collection);
+	if (data.m_collection == JET_ELEMENTS || data.m_collection == ENERGY_SUMS) {
+	  decodeJem(m_jemSubBlock, trigJem, data);
 	  if (m_rodErr != L1CaloSubBlock::ERROR_NONE) {
 	    if (debug) msg() << "decodeJem failed" << endmsg;
 	    break;
@@ -851,7 +846,8 @@ StatusCode JepByteStreamV2Tool::convertBs(
 // Unpack CMX-Energy sub-block
 
 void JepByteStreamV2Tool::decodeCmxEnergy(CmxEnergySubBlock* subBlock,
-                                                                 int trigJem)
+                                          int trigJem,
+                                          CmxSumsData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -970,7 +966,7 @@ void JepByteStreamV2Tool::decodeCmxEnergy(CmxEnergySubBlock* subBlock,
       eyErr = eyErrBits.error();
       etErr = etErrBits.error();
       if (ex || ey || et || exErr || eyErr || etErr) {
-        LVL1::CMXEtSums* sums = findCmxSums(crate, source);
+        LVL1::CMXEtSums* sums = findCmxSums(data, crate, source);
 	if ( ! sums ) {   // create new CMX energy sums
 	  exVec.assign(timeslices, 0);
 	  eyVec.assign(timeslices, 0);
@@ -984,11 +980,12 @@ void JepByteStreamV2Tool::decodeCmxEnergy(CmxEnergySubBlock* subBlock,
 	  exErrVec[slice] = exErr;
 	  eyErrVec[slice] = eyErr;
 	  etErrVec[slice] = etErr;
-	  sums = new LVL1::CMXEtSums(swCrate, source, etVec, exVec, eyVec,
-				     etErrVec, exErrVec, eyErrVec, trigJem);
+	  auto sumsp =
+            std::make_unique<LVL1::CMXEtSums>(swCrate, source, etVec, exVec, eyVec,
+                                              etErrVec, exErrVec, eyErrVec, trigJem);
           const int key = crate*100 + source;
-	  m_cmxEtMap.insert(std::make_pair(key, sums));
-	  m_cmxEtCollection->push_back(sums);
+	  data.m_cmxEtMap.insert(std::make_pair(key, sumsp.get()));
+	  data.m_cmxEtCollection->push_back(std::move(sumsp));
         } else {
 	  exVec = sums->ExVec();
 	  eyVec = sums->EyVec();
@@ -1030,7 +1027,7 @@ void JepByteStreamV2Tool::decodeCmxEnergy(CmxEnergySubBlock* subBlock,
 // Unpack CMX-Jet sub-block
 
 void JepByteStreamV2Tool::decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
-                                             const CollectionType collection)
+                                       JepByteStreamToolData& data)
 {
   const bool debug = msgLvl(MSG::DEBUG);
   if (debug) msg(MSG::DEBUG);
@@ -1095,7 +1092,8 @@ void JepByteStreamV2Tool::decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
 
     // Jet TOBs
 
-    if (collection == CMX_TOBS) {
+    if (data.m_collection == CMX_TOBS) {
+      CmxTobData& tdata = static_cast<CmxTobData&> (data);
 
       for (int jem = 0; jem < m_modules; ++jem) {
         const unsigned int presenceMap = subBlock->presenceMap(slice, jem);
@@ -1119,7 +1117,7 @@ void JepByteStreamV2Tool::decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
           }
 	  error = errBits.error();
 	  const int key = tobKey(crate, jem, frame, loc);
-	  LVL1::CMXJetTob* tb = findCmxTob(key);
+	  LVL1::CMXJetTob* tb = findCmxTob(tdata, key);
 	  if ( ! tb ) { // create new CMX TOB
 	    energyLgVec.assign(timeslices, 0);
 	    energySmVec.assign(timeslices, 0);
@@ -1129,11 +1127,12 @@ void JepByteStreamV2Tool::decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
 	    energySmVec[slice] = energySmall;
 	    errorVec[slice]    = error;
 	    presenceMapVec[slice] = presenceMap;
-	    tb = new LVL1::CMXJetTob(swCrate, jem, frame, loc,
-	                             energyLgVec, energySmVec, errorVec,
-				     presenceMapVec, trigJem);
-	    m_cmxTobMap.insert(std::make_pair(key, tb));
-	    m_cmxTobCollection->push_back(tb);
+	    auto tbp =
+              std::make_unique<LVL1::CMXJetTob>(swCrate, jem, frame, loc,
+                                                energyLgVec, energySmVec, errorVec,
+                                                presenceMapVec, trigJem);
+	    tdata.m_cmxTobMap.insert(std::make_pair(key, tbp.get()));
+	    tdata.m_cmxTobCollection->push_back(std::move(tbp));
           } else {
 	    energyLgVec = tb->energyLgVec();
 	    energySmVec = tb->energySmVec();
@@ -1164,7 +1163,8 @@ void JepByteStreamV2Tool::decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
 
     // Jet hit counts and topo info
 
-    else if (collection == CMX_HITS) {
+    else if (data.m_collection == CMX_HITS) {
+      CmxHitsData& hdata = static_cast<CmxHitsData&> (data);
 
       for (int source = 0; source < maxSource; ++source) {
         if (summing == CmxSubBlock::CRATE && 
@@ -1187,7 +1187,7 @@ void JepByteStreamV2Tool::decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
 	err0 = err0Bits.error();
 	err1 = err1Bits.error();
 	if (hit0 || hit1 || err0 || err1) {
-          LVL1::CMXJetHits* jh = findCmxHits(crate, source);
+          LVL1::CMXJetHits* jh = findCmxHits(hdata, crate, source);
 	  if ( ! jh ) {   // create new CMX hits
 	    hit0Vec.assign(timeslices, 0);
 	    hit1Vec.assign(timeslices, 0);
@@ -1197,11 +1197,12 @@ void JepByteStreamV2Tool::decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
 	    hit1Vec[slice] = hit1;
 	    err0Vec[slice] = err0;
 	    err1Vec[slice] = err1;
-	    jh = new LVL1::CMXJetHits(swCrate, source, hit0Vec, hit1Vec,
-	                              err0Vec, err1Vec, trigJem);
+	    auto jhp =
+              std::make_unique<LVL1::CMXJetHits>(swCrate, source, hit0Vec, hit1Vec,
+                                                 err0Vec, err1Vec, trigJem);
             const int key = crate*100 + source;
-	    m_cmxHitsMap.insert(std::make_pair(key, jh));
-	    m_cmxHitCollection->push_back(jh);
+	    hdata.m_cmxHitsMap.insert(std::make_pair(key, jhp.get()));
+	    hdata.m_cmxHitCollection->push_back(std::move(jhp));
           } else {
 	    hit0Vec = jh->hitsVec0();
 	    hit1Vec = jh->hitsVec1();
@@ -1237,7 +1238,7 @@ void JepByteStreamV2Tool::decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
 // Unpack JEM sub-block
 
 void JepByteStreamV2Tool::decodeJem(JemSubBlockV2* subBlock, int trigJem,
-                                        const CollectionType collection)
+                                    JepByteStreamToolData& data)
 {
   const bool debug   = msgLvl(MSG::DEBUG);
   const bool verbose = msgLvl(MSG::VERBOSE);
@@ -1292,7 +1293,8 @@ void JepByteStreamV2Tool::decodeJem(JemSubBlockV2* subBlock, int trigJem,
   const int sliceEnd = ( neutralFormat ) ? timeslices : sliceNum + 1;
   for (int slice = sliceBeg; slice < sliceEnd; ++slice) {
 
-    if (collection == JET_ELEMENTS) {
+    if (data.m_collection == JET_ELEMENTS) {
+      JetElementData& jedata = static_cast<JetElementData&> (data);
 
       // Loop over jet element channels and fill jet elements
 
@@ -1304,13 +1306,15 @@ void JepByteStreamV2Tool::decodeJem(JemSubBlockV2* subBlock, int trigJem,
 	  int layer = 0;
 	  if (m_jemMaps->mapping(crate, module, chan, eta, phi, layer)) {
 	    if (layer == m_coreOverlap) {
-	      LVL1::JetElement* je = findJetElement(eta, phi);
+	      LVL1::JetElement* je = findJetElement(jedata, eta, phi);
 	      if ( ! je ) {   // create new jet element
 	        const unsigned int key = m_elementKey->jeKey(phi, eta);
-	        je = new LVL1::JetElement(phi, eta, dummy, dummy, key,
-	                                  dummy, dummy, dummy, trigJem);
-	        m_jeMap.insert(std::make_pair(key, je));
-	        m_jeCollection->push_back(je);
+                auto jep =
+                  std::make_unique<LVL1::JetElement>(phi, eta, dummy, dummy, key,
+                                                     dummy, dummy, dummy, trigJem);
+                je = jep.get();
+	        jedata.m_jeMap.insert(std::make_pair(key, jep.get()));
+	        jedata.m_jeCollection->push_back(std::move(jep));
               } else {
 	        const std::vector<int>& emEnergy(je->emEnergyVec());
 		const std::vector<int>& hadEnergy(je->hadEnergyVec());
@@ -1355,7 +1359,8 @@ void JepByteStreamV2Tool::decodeJem(JemSubBlockV2* subBlock, int trigJem,
 	  msg(MSG::DEBUG);
         }
       }
-    } else if (collection == ENERGY_SUMS) {
+    } else if (data.m_collection == ENERGY_SUMS) {
+      EnergySumsData& sumdata = static_cast<EnergySumsData&> (data);
 
       // Get energy subsums
 
@@ -1363,7 +1368,7 @@ void JepByteStreamV2Tool::decodeJem(JemSubBlockV2* subBlock, int trigJem,
       const unsigned int ey = subBlock->ey(slice);
       const unsigned int et = subBlock->et(slice);
       if (ex | ey | et) {
-	LVL1::JEMEtSums* sums = findEnergySums(crate, module);
+	LVL1::JEMEtSums* sums = findEnergySums(sumdata, crate, module);
 	if ( ! sums ) {   // create new energy sums
 	  exVec.assign(timeslices, 0);
 	  eyVec.assign(timeslices, 0);
@@ -1371,10 +1376,11 @@ void JepByteStreamV2Tool::decodeJem(JemSubBlockV2* subBlock, int trigJem,
 	  exVec[slice] = ex;
 	  eyVec[slice] = ey;
 	  etVec[slice] = et;
-	  sums = new LVL1::JEMEtSums(swCrate, module, etVec, exVec, eyVec,
-	                                                          trigJem);
-          m_etMap.insert(std::make_pair(crate*m_modules+module, sums));
-	  m_etCollection->push_back(sums);
+	  auto sumsp =
+            std::make_unique<LVL1::JEMEtSums>(swCrate, module, etVec, exVec, eyVec,
+                                              trigJem);
+          sumdata.m_etMap.insert(std::make_pair(crate*m_modules+module, sumsp.get()));
+	  sumdata.m_etCollection->push_back(std::move(sumsp));
         } else {
 	  exVec = sums->ExVec();
 	  eyVec = sums->EyVec();
@@ -1422,62 +1428,102 @@ int JepByteStreamV2Tool::tobKey(const int crate, const int jem,
 
 // Find a jet element given eta, phi
 
+const
 LVL1::JetElement* JepByteStreamV2Tool::findJetElement(const double eta,
-                                                      const double phi)
+                                                      const double phi) const
 {
-  LVL1::JetElement* tt = 0;
   const unsigned int key = m_elementKey->jeKey(phi, eta);
-  JetElementMap::const_iterator mapIter;
-  mapIter = m_jeMap.find(key);
-  if (mapIter != m_jeMap.end()) tt = mapIter->second;
-  return tt;
+  ConstJetElementMap::const_iterator mapIter = m_jeMap.find(key);
+  if (mapIter != m_jeMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::JetElement* JepByteStreamV2Tool::findJetElement(const JetElementData& data,
+                                                      const double eta,
+                                                      const double phi) const
+{
+  const unsigned int key = m_elementKey->jeKey(phi, eta);
+  JetElementMap::const_iterator mapIter = data.m_jeMap.find(key);
+  if (mapIter != data.m_jeMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find energy sums for given crate, module
 
+const
 LVL1::JEMEtSums* JepByteStreamV2Tool::findEnergySums(const int crate,
-                                                     const int module)
+                                                     const int module) const
 {
-  LVL1::JEMEtSums* sums = 0;
-  EnergySumsMap::const_iterator mapIter;
-  mapIter = m_etMap.find(crate*m_modules + module);
-  if (mapIter != m_etMap.end()) sums = mapIter->second;
-  return sums;
+  ConstEnergySumsMap::const_iterator mapIter = m_etMap.find(crate*m_modules + module);
+  if (mapIter != m_etMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::JEMEtSums* JepByteStreamV2Tool::findEnergySums(const EnergySumsData& data,
+                                                     const int crate,
+                                                     const int module) const
+{
+  EnergySumsMap::const_iterator mapIter = data.m_etMap.find(crate*m_modules + module);
+  if (mapIter != data.m_etMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMX TOB for given crate, jem, frame, loc
 
-LVL1::CMXJetTob* JepByteStreamV2Tool::findCmxTob(const int key)
+const
+LVL1::CMXJetTob* JepByteStreamV2Tool::findCmxTob(const int key) const
 {
-  LVL1::CMXJetTob* tob = 0;
-  CmxTobMap::const_iterator mapIter;
-  mapIter = m_cmxTobMap.find(key);
-  if (mapIter != m_cmxTobMap.end()) tob = mapIter->second;
-  return tob;
+  ConstCmxTobMap::const_iterator mapIter = m_cmxTobMap.find(key);
+  if (mapIter != m_cmxTobMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMXJetTob* JepByteStreamV2Tool::findCmxTob(const CmxTobData& data,
+                                                 const int key) const
+{
+  CmxTobMap::const_iterator mapIter = data.m_cmxTobMap.find(key);
+  if (mapIter != data.m_cmxTobMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMX hits for given crate, source
 
+const
 LVL1::CMXJetHits* JepByteStreamV2Tool::findCmxHits(const int crate,
-                                                   const int source)
+                                                   const int source) const
+{
+  ConstCmxHitsMap::const_iterator mapIter = m_cmxHitsMap.find(crate*100 + source);
+  if (mapIter != m_cmxHitsMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMXJetHits* JepByteStreamV2Tool::findCmxHits(const CmxHitsData& data,
+                                                   const int crate,
+                                                   const int source) const
 {
-  LVL1::CMXJetHits* hits = 0;
-  CmxHitsMap::const_iterator mapIter;
-  mapIter = m_cmxHitsMap.find(crate*100 + source);
-  if (mapIter != m_cmxHitsMap.end()) hits = mapIter->second;
-  return hits;
+  CmxHitsMap::const_iterator mapIter = data.m_cmxHitsMap.find(crate*100 + source);
+  if (mapIter != data.m_cmxHitsMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Find CMX energy sums for given crate, module, source
 
+const
 LVL1::CMXEtSums* JepByteStreamV2Tool::findCmxSums(const int crate,
-                                                  const int source)
+                                                  const int source) const
+{
+  ConstCmxSumsMap::const_iterator mapIter = m_cmxEtMap.find(crate*100 + source);
+  if (mapIter != m_cmxEtMap.end()) return mapIter->second;
+  return nullptr;
+}
+
+LVL1::CMXEtSums* JepByteStreamV2Tool::findCmxSums(const CmxSumsData& data,
+                                                  const int crate,
+                                                  const int source) const
 {
-  LVL1::CMXEtSums* sums = 0;
-  CmxSumsMap::const_iterator mapIter;
-  mapIter = m_cmxEtMap.find(crate*100 + source);
-  if (mapIter != m_cmxEtMap.end()) sums = mapIter->second;
-  return sums;
+  CmxSumsMap::const_iterator mapIter = data.m_cmxEtMap.find(crate*100 + source);
+  if (mapIter != data.m_cmxEtMap.end()) return mapIter->second;
+  return nullptr;
 }
 
 // Set up jet element map
@@ -1490,7 +1536,7 @@ void JepByteStreamV2Tool::setupJeMap(const JetElementCollection*
     JetElementCollection::const_iterator pos  = jeCollection->begin();
     JetElementCollection::const_iterator pose = jeCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::JetElement* const je = *pos;
+      const LVL1::JetElement* const je = *pos;
       const unsigned int key = m_elementKey->jeKey(je->phi(), je->eta());
       m_jeMap.insert(std::make_pair(key, je));
     }
@@ -1507,7 +1553,7 @@ void JepByteStreamV2Tool::setupEtMap(const EnergySumsCollection*
     EnergySumsCollection::const_iterator pos  = etCollection->begin();
     EnergySumsCollection::const_iterator pose = etCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::JEMEtSums* const sums = *pos;
+      const LVL1::JEMEtSums* const sums = *pos;
       const int crate = sums->crate() - m_crateOffsetSw;
       const int key   = m_modules * crate + sums->module();
       m_etMap.insert(std::make_pair(key, sums));
@@ -1525,7 +1571,7 @@ void JepByteStreamV2Tool::setupCmxTobMap(const CmxTobCollection*
     CmxTobCollection::const_iterator pos  = tobCollection->begin();
     CmxTobCollection::const_iterator pose = tobCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMXJetTob* const tob = *pos;
+      const LVL1::CMXJetTob* const tob = *pos;
       const int crate = tob->crate() - m_crateOffsetSw;
       const int jem   = tob->jem();
       const int frame = tob->frame();
@@ -1546,7 +1592,7 @@ void JepByteStreamV2Tool::setupCmxHitsMap(const CmxHitsCollection*
     CmxHitsCollection::const_iterator pos  = hitCollection->begin();
     CmxHitsCollection::const_iterator pose = hitCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMXJetHits* const hits = *pos;
+      const LVL1::CMXJetHits* const hits = *pos;
       const int crate = hits->crate() - m_crateOffsetSw;
       const int key   = crate*100 + hits->source();
       m_cmxHitsMap.insert(std::make_pair(key, hits));
@@ -1564,7 +1610,7 @@ void JepByteStreamV2Tool::setupCmxEtMap(const CmxSumsCollection*
     CmxSumsCollection::const_iterator pos  = etCollection->begin();
     CmxSumsCollection::const_iterator pose = etCollection->end();
     for (; pos != pose; ++pos) {
-      LVL1::CMXEtSums* const sums = *pos;
+      const LVL1::CMXEtSums* const sums = *pos;
       const int crate = sums->crate() - m_crateOffsetSw;
       const int key   = crate*100 + sums->source();
       m_cmxEtMap.insert(std::make_pair(key, sums));
diff --git a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV2Tool.h b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV2Tool.h
index 571f34cd17b..e5a65dddb85 100755
--- a/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV2Tool.h
+++ b/Trigger/TrigT1/TrigT1CaloByteStream/src/JepByteStreamV2Tool.h
@@ -107,39 +107,91 @@ class JepByteStreamV2Tool : public AthAlgTool {
    typedef DataVector<LVL1::CMXJetHits>                  CmxHitsCollection;
    typedef DataVector<LVL1::CMXEtSums>                   CmxSumsCollection;
    typedef std::map<unsigned int, LVL1::JetElement*>     JetElementMap;
+   typedef std::map<unsigned int, const LVL1::JetElement*> ConstJetElementMap;
    typedef std::map<int, LVL1::JEMEtSums*>               EnergySumsMap;
+   typedef std::map<int, const LVL1::JEMEtSums*>         ConstEnergySumsMap;
    typedef std::map<int, LVL1::CMXJetTob*>               CmxTobMap;
+   typedef std::map<int, const LVL1::CMXJetTob*>         ConstCmxTobMap;
    typedef std::map<int, LVL1::CMXJetHits*>              CmxHitsMap;
+   typedef std::map<int, const LVL1::CMXJetHits*>        ConstCmxHitsMap;
    typedef std::map<int, LVL1::CMXEtSums*>               CmxSumsMap;
+   typedef std::map<int, const LVL1::CMXEtSums*>         ConstCmxSumsMap;
 
    typedef IROBDataProviderSvc::VROBFRAG::const_iterator ROBIterator;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      ROBPointer;
    typedef OFFLINE_FRAGMENTS_NAMESPACE::PointerType      RODPointer;
 
+   struct JepByteStreamToolData
+   {
+     JepByteStreamToolData (const CollectionType collection)
+       : m_collection(collection){}
+     const CollectionType m_collection;
+   };
+   struct JetElementData : public JepByteStreamToolData
+   {
+     JetElementData (JetElementCollection* const jeCollection)
+       : JepByteStreamToolData (JET_ELEMENTS), m_jeCollection (jeCollection) {}
+     JetElementCollection* const m_jeCollection;
+     JetElementMap m_jeMap;
+   };
+   struct EnergySumsData : public JepByteStreamToolData
+   {
+     EnergySumsData (EnergySumsCollection* const etCollection)
+       : JepByteStreamToolData (ENERGY_SUMS), m_etCollection (etCollection) {}
+     EnergySumsCollection* const m_etCollection;
+     EnergySumsMap m_etMap;
+   };
+   struct CmxTobData : public JepByteStreamToolData
+   {
+     CmxTobData (CmxTobCollection* const tobCollection)
+       : JepByteStreamToolData (CMX_TOBS), m_cmxTobCollection (tobCollection) {}
+     CmxTobCollection* const m_cmxTobCollection;
+     CmxTobMap     m_cmxTobMap;
+   };
+   struct CmxHitsData : public JepByteStreamToolData
+   {
+     CmxHitsData (CmxHitsCollection* const hitCollection)
+       : JepByteStreamToolData (CMX_HITS), m_cmxHitCollection (hitCollection) {}
+     CmxHitsCollection* const m_cmxHitCollection;
+     CmxHitsMap    m_cmxHitsMap;
+   };
+   struct CmxSumsData : public JepByteStreamToolData
+   {
+     CmxSumsData (CmxSumsCollection* const etCollection)
+       : JepByteStreamToolData (CMX_SUMS), m_cmxEtCollection (etCollection) {}
+     CmxSumsCollection* const m_cmxEtCollection;
+     CmxSumsMap    m_cmxEtMap;
+   };
+
    /// Convert bytestream to given container type
    StatusCode convertBs(const IROBDataProviderSvc::VROBFRAG& robFrags,
-                        CollectionType collection);
+                        JepByteStreamToolData& data);
    /// Unpack CMX-Energy sub-block
-   void decodeCmxEnergy(CmxEnergySubBlock* subBlock, int trigJem);
+   void decodeCmxEnergy(CmxEnergySubBlock* subBlock, int trigJem, CmxSumsData& data);
    /// Unpack CMX-Jet sub-block
    void decodeCmxJet(CmxJetSubBlock* subBlock, int trigJem,
-                                         CollectionType collection);
+                     JepByteStreamToolData& data);
    /// Unpack JEM sub-block
    void decodeJem(JemSubBlockV2* subBlock, int trigJem,
-                                         CollectionType collection);
+                  JepByteStreamToolData& data);
 
    /// Find TOB map key for given crate, jem, frame, loc
    int tobKey(int crate, int jem, int frame, int loc);
    /// Find a jet element given eta, phi
-   LVL1::JetElement* findJetElement(double eta, double phi);
+   const LVL1::JetElement* findJetElement(double eta, double phi) const;
+   LVL1::JetElement* findJetElement(const JetElementData& data, double eta, double phi) const;
    /// Find energy sums for given crate, module
-   LVL1::JEMEtSums*  findEnergySums(int crate, int module);
+   const LVL1::JEMEtSums*  findEnergySums(int crate, int module) const;
+   LVL1::JEMEtSums*  findEnergySums(const EnergySumsData& data, int crate, int module) const;
    /// Find CMX TOB for given key
-   LVL1::CMXJetTob*  findCmxTob(int key);
+   const LVL1::CMXJetTob*  findCmxTob(int key) const;
+   LVL1::CMXJetTob*  findCmxTob(const CmxTobData& data, int key) const;
    /// Find CMX hits for given crate, source
-   LVL1::CMXJetHits* findCmxHits(int crate, int source);
+   const LVL1::CMXJetHits* findCmxHits(int crate, int source) const;
+   LVL1::CMXJetHits* findCmxHits(const CmxHitsData& data, int crate, int source) const;
    /// Find CMX energy sums for given crate, source
-   LVL1::CMXEtSums*  findCmxSums(int crate, int source);
+   const LVL1::CMXEtSums*  findCmxSums(int crate, int source) const;
+   LVL1::CMXEtSums*  findCmxSums(const CmxSumsData& data, int crate, int source) const;
 
    /// Set up jet element map
    void setupJeMap(const JetElementCollection* jeCollection);
@@ -235,26 +287,16 @@ class JepByteStreamV2Tool : public AthAlgTool {
    DataVector<CmxEnergySubBlock> m_cmxEnergyBlocks;
    /// Vector for current CMX-Jet sub-blocks
    DataVector<CmxJetSubBlock> m_cmxJetBlocks;
-   /// Current jet elements collection
-   JetElementCollection* m_jeCollection;
-   /// Current energy sums collection
-   EnergySumsCollection* m_etCollection;
-   /// Current CMX TOB collection
-   CmxTobCollection*     m_cmxTobCollection;
-   /// Current CMX hits collection
-   CmxHitsCollection*    m_cmxHitCollection;
-   /// Current CMX energy sums collection
-   CmxSumsCollection*    m_cmxEtCollection;
    /// Jet element map
-   JetElementMap m_jeMap;
+   ConstJetElementMap m_jeMap;
    /// Energy sums map
-   EnergySumsMap m_etMap;
+   ConstEnergySumsMap m_etMap;
    /// CMX TOB map
-   CmxTobMap     m_cmxTobMap;
+   ConstCmxTobMap     m_cmxTobMap;
    /// CMX hits map
-   CmxHitsMap    m_cmxHitsMap;
+   ConstCmxHitsMap    m_cmxHitsMap;
    /// CMX energy sums map
-   CmxSumsMap    m_cmxEtMap;
+   ConstCmxSumsMap    m_cmxEtMap;
    /// ROD Status words
    std::vector<uint32_t>* m_rodStatus;
    /// ROD status map
-- 
GitLab