From c6d7cfd9ca924fbe270302d5be2e5657e7a3296f Mon Sep 17 00:00:00 2001
From: Joao Gentil Mendes Saraiva <joao.gentil.saraiva@cern.ch>
Date: Fri, 30 Oct 2020 13:06:48 +0000
Subject: [PATCH] TMDB bytestream conversion for RUN3

The TMDB board bytestream as been updated. RUN2 conversion is still inplace. Versions are interchangeable using tile cabling service flag that checks on the run period.
---
 .../TileDigitsContByteStreamTool.h            |   1 +
 .../TileMuRcvContByteStreamTool.h             |   2 +-
 .../TileByteStream/TileROD_Decoder.h          |   1 +
 .../TileByteStream/TileROD_Encoder.h          |   3 +-
 .../src/TileDigitsContByteStreamTool.cxx      |   5 +-
 .../src/TileMuRcvContByteStreamTool.cxx       |   6 +-
 .../TileByteStream/src/TileROD_Decoder.cxx    |  60 ++++-
 .../TileByteStream/src/TileROD_Encoder.cxx    | 207 ++++++++++++------
 8 files changed, 200 insertions(+), 85 deletions(-)

diff --git a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileDigitsContByteStreamTool.h b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileDigitsContByteStreamTool.h
index 288f0183342..46a14fb5723 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileDigitsContByteStreamTool.h
+++ b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileDigitsContByteStreamTool.h
@@ -59,6 +59,7 @@ class TileDigitsContByteStreamTool: public AthAlgTool {
     bool m_verbose;
     bool m_doFragType1;
     bool m_doFragType5;
+    int  m_runPeriod;
 };
 
 #endif
diff --git a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileMuRcvContByteStreamTool.h b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileMuRcvContByteStreamTool.h
index 5aa481e6928..2347ea923c2 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileMuRcvContByteStreamTool.h
+++ b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileMuRcvContByteStreamTool.h
@@ -62,7 +62,7 @@ class TileMuRcvContByteStreamTool: public AthAlgTool {
 
   const TileHid2RESrcID* m_hid2re;
 
-  //bool m_verbose;
+  int m_runPeriod;
 };
 
 #endif
diff --git a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h
index fb00fc0f4ab..f724cb0807e 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h
+++ b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h
@@ -578,6 +578,7 @@ class TileROD_Decoder: public AthAlgTool {
 
     unsigned int m_maxChannels;
     bool m_checkMaskedDrawers;
+    int m_runPeriod;
 
     const uint32_t * get_data(const ROBData * rob) const {
       const uint32_t * p;
diff --git a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Encoder.h b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Encoder.h
index a5395dd9dcd..92485ba25fb 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Encoder.h
+++ b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Encoder.h
@@ -53,7 +53,7 @@ class TileROD_Encoder
     /** set all necessary parameters for the encoder
      */
     void setTileHWID(const TileHWID* tileHWID, bool verbose, unsigned int type = 4);
-    void setTileHWID(const TileHWID* tileHWID);
+    void setTileHWID(const TileHWID* tileHWID, int m_runPeriod);
 
     /** set OF algorigtm type and amplitude units for a drawer
      */
@@ -147,6 +147,7 @@ class TileROD_Encoder
     unsigned int m_rChUnit;
 
     int m_maxChannels;
+    int m_runPeriod;
 };
 
 #endif
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamTool.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamTool.cxx
index b4338560885..63184382aaa 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamTool.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamTool.cxx
@@ -36,6 +36,7 @@ TileDigitsContByteStreamTool::TileDigitsContByteStreamTool( const std::string& t
   , m_tileHWID(0)
   , m_hid2re(0)
   , m_verbose(false)
+  , m_runPeriod(0)
 {
   declareInterface< TileDigitsContByteStreamTool >( this );
   declareProperty("DoFragType1", m_doFragType1 = false);
@@ -56,6 +57,8 @@ StatusCode TileDigitsContByteStreamTool::initialize() {
   ATH_CHECK( dec.retrieve() );
 
   m_hid2re = dec->getHid2reHLT();
+  TileCablingService *cabling = TileCablingService::getInstance();
+  m_runPeriod = cabling->runPeriod();
 
   return StatusCode::SUCCESS;
 }
@@ -85,7 +88,7 @@ StatusCode TileDigitsContByteStreamTool::convert(DIGITS* digitsContainer, FullEv
 
     if (isTMDB){  
        reid = m_hid2re->getRodTileMuRcvID(frag_id);
-       mapEncoder[reid].setTileHWID(m_tileHWID);
+       mapEncoder[reid].setTileHWID(m_tileHWID,m_runPeriod);
     } else {
        reid = m_hid2re->getRodID(frag_id);
        mapEncoder[reid].setTileHWID(m_tileHWID, m_verbose, 1);
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileMuRcvContByteStreamTool.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileMuRcvContByteStreamTool.cxx
index 7c17a17b6de..a81d7fb4818 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileMuRcvContByteStreamTool.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileMuRcvContByteStreamTool.cxx
@@ -47,7 +47,7 @@ TileMuRcvContByteStreamTool::TileMuRcvContByteStreamTool(const std::string& type
   : AthAlgTool(type, name, parent)
   , m_tileHWID(0)
   , m_hid2re(0)
-    //, m_verbose(false)
+  , m_runPeriod(0)
 {
   declareInterface<TileMuRcvContByteStreamTool>(this);
 }
@@ -67,6 +67,8 @@ StatusCode TileMuRcvContByteStreamTool::initialize() {
   ATH_CHECK( dec.retrieve() );
 
   m_hid2re = dec->getHid2reHLT();
+  TileCablingService *cabling = TileCablingService::getInstance();
+  m_runPeriod = cabling->runPeriod();
 
   return StatusCode::SUCCESS;
 }
@@ -98,7 +100,7 @@ StatusCode TileMuRcvContByteStreamTool::convert(TileMuonReceiverContainer* cont,
       n++;
       frag_id = (*it_cont)->identify();
       reid = m_hid2re->getRodTileMuRcvID(frag_id);
-      mapEncoder[reid].setTileHWID(m_tileHWID);
+      mapEncoder[reid].setTileHWID(m_tileHWID,m_runPeriod);
       const TileMuonReceiverObj* tileMuRcv = *it_cont;	
       mapEncoder[reid].addTileMuRcvObj(tileMuRcv);
     }                                                            
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx
index c327a680204..022f3015119 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx
@@ -43,8 +43,12 @@ TileROD_Decoder::TileROD_Decoder(const std::string& type, const std::string& nam
   , m_hid2reHLT(nullptr)
   , m_maxChannels(TileCalibUtils::MAX_CHAN)
   , m_checkMaskedDrawers(false)
-{
+  , m_runPeriod(0){
+
   declareInterface<TileROD_Decoder>(this);
+
+  m_WarningCounter = 0;
+  m_ErrorCounter = 0;
  
   for (std::atomic<const uint32_t*>& p : m_OFPtrs) {
     p = nullptr;
@@ -130,7 +134,9 @@ StatusCode TileROD_Decoder::initialize() {
     ATH_CHECK( m_tileBadChanTool.retrieve() );
   }
 
-  m_maxChannels = TileCablingService::getInstance()->getMaxChannels();
+  const TileCablingService *cablingService = TileCablingService::getInstance();
+  m_maxChannels    = cablingService->getMaxChannels();
+  m_runPeriod      = cablingService->runPeriod();
 
   m_Rw2Cell[0].reserve(m_maxChannels);
   m_Rw2Cell[1].reserve(m_maxChannels);
@@ -4469,6 +4475,7 @@ void TileROD_Decoder::unpack_frag41( uint32_t collid, uint32_t version, const ui
 
 void TileROD_Decoder::unpack_frag42( uint32_t sourceid, uint32_t version, const uint32_t* p, int datasize, TileMuonReceiverContainer &v ) const {
 
+  // == RUN 2 ==
   // results are hold in 3 16-bit words.
   //
   //    32nd bit -> |        results2       ||        results1       | <- 1st bit
@@ -4486,36 +4493,67 @@ void TileROD_Decoder::unpack_frag42( uint32_t sourceid, uint32_t version, const
   // bit-2        .
   // bit-1        .
   // bit-0 -> result.at(3)
+  //
+  // == RUN 3 ==
+  // results are hold in 3 16-bit words.
+  //
+  //               32nd bit -> |         results2 [16:31]            ||           results1 [0:15]           | <- 1st bit
+  //               32nd bit -> |            0x0   [16:31]            ||           results3 [0:15]           | <- 1st bit
+  //
+  //               32nd bit -> | 0x0 [12:15] | m-5 | m-4 | m-3 | m-2 || 0x0 [12:15] | m-3 | m-2 | m-1 | m-0 | <- 1st bit
+  //                           |          0x0 [16:31]                || 0x0 [12:15] | m-7 | m-6 | m-5 | m-4 |
+  //
+  // For each module m-X there is a 3-bit word with the results for a threshold
+  //
+  //                    |  d5+d6  |  d6   |  d5  |
+  //                    |   bit2  |  bit1 | bit0 |
+  //
+
+  int nbit=0;
+  int nmod=0;
+  uint32_t word=0x0;
 
-  int nbit,nmod;
-  uint32_t word;
   int drawer = (sourceid & 0xf0000) >> 8; // get ROS number from source ID
   if (drawer<0x300) { // barrel
     nbit = 4;
     nmod = 4;
     drawer |= ((sourceid & 0x0000f) << 2);
     word = (datasize > 0) ? p[0] : 0; // just use first word, although expect all zeros for the moment
-  } else {
+  } else { // extended barrel
     nbit = 4;
     nmod = 8;
     drawer |= ((sourceid & 0x0000f) << 3);
-    word = (datasize > 1) ? (p[1] << 20) | ((p[0] >> 8) & 0xff000) | ((p[0] >> 4) & 0xfff) : 0;
+    if (m_runPeriod<=2) {
+       word = (datasize > 1) ? (p[1] << 20) | ((p[0] >> 8) & 0xff000) | ((p[0] >> 4) & 0xfff) : 0;
+    } else {
+       word = (datasize > 1) ? (p[1] << 12) | (p[0] & 0xfff) : 0;
+    }
   }
 
   std::vector<bool> result(nbit);
   for (int j = 0; j < nmod; ++j) { // loop over modules
     for (int k = nbit-1; k >= 0; --k) { // loop over bits of one module in inversed order
-      result[k] = ((word & 1) != 0);
-      word >>= 1;
+      if (m_runPeriod<=2) {
+          result[k] = (word & 1);
+	  word >>= 1;
+      } else {
+          if (k==0) {
+	     result[k]=0;
+	  } else {
+	     result[k] = (word & 1);
+	     word >>= 1;
+	  }
+      }
     }
-
     TileMuonReceiverObj * obj = new TileMuonReceiverObj(drawer, result);
     v.push_back(obj);
-
     ++drawer;
   }
-  
+
   if (msgLvl(MSG::DEBUG)) {
+    if (m_runPeriod<=2) msg(MSG::DEBUG) << "TMDB version for RUN2 simulation (2014)" <<endmsg;
+    else msg(MSG::DEBUG) << "TMDB version for RUN3 simulation (2020)" <<endmsg;
+
     msg(MSG::DEBUG) << " TileROD_Decoder::unpack_frag42  source ID: 0x" << MSG::hex << sourceid << MSG::dec
                     << " version: " << version << endmsg;
 
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Encoder.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Encoder.cxx
index 937d2dba637..f46c6aa53b8 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Encoder.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Encoder.cxx
@@ -28,7 +28,8 @@ TileROD_Encoder::TileROD_Encoder():
   m_type(0), 
   m_unitType(0),
   m_rChUnit(0),
-  m_maxChannels(TileCalibUtils::MAX_CHAN) {
+  m_maxChannels(TileCalibUtils::MAX_CHAN),
+  m_runPeriod(0){
 }
 
 
@@ -56,8 +57,9 @@ void TileROD_Encoder::setTileHWID(const TileHWID* tileHWID, bool verbose, unsign
   }
 }
 
-void TileROD_Encoder::setTileHWID(const TileHWID* tileHWID) {
+void TileROD_Encoder::setTileHWID(const TileHWID* tileHWID, int runPeriod) {
    m_tileHWID = tileHWID;
+   m_runPeriod = runPeriod;
 }
 
 void TileROD_Encoder::setTypeAndUnit(TileFragHash::TYPE type, TileRawChannelUnit::UNIT unit) {
@@ -764,23 +766,20 @@ void TileROD_Encoder::fillRODTileMuRcvObj(std::vector<uint32_t>& v) {
 
   // this is the subfragment type 0x42	
 
-  ATH_MSG_DEBUG( "TMDB encoding sub-fragment 0x42: loop over " << m_vTileMuRcvObj.size() << " objects" );
+  ATH_MSG_INFO( "TMDB encoding sub-fragment 0x42: loop over " << m_vTileMuRcvObj.size() << " objects" );
 
   // sub-fragment marker
   //
   v.push_back(0xff1234ff);
 
-  // sub-fragment size
+  // type & version
   //
   v.push_back(5);
   uint savepos = v.size()-1;
-
-  // type & version
-  //
   uint32_t verfrag      = 0x500;
   uint32_t type_version = (0x42 << 16) + verfrag;
   v.push_back(type_version);
-  
+
   // counters and temporary words
   //
   int wc = 0;
@@ -789,71 +788,141 @@ void TileROD_Encoder::fillRODTileMuRcvObj(std::vector<uint32_t>& v) {
   uint32_t result2      = 0x0;
   uint32_t result3      = 0x0;
 
-  for (const TileMuonReceiverObj* tmurcv : m_vTileMuRcvObj) {
-
-    // results are hold in 3 16-bit words.
-    // 
-    //     32nd bit -> |        results2       || results1       | <- 1st bit
-    //                 |          0x0          ||        results3 |
-    // 
-    //     32nd bit -> | m-5 | m-4 | m-3 | m-2 || m-2 | m-1 | m-0 | 0x0 | <- 1st bit
-    //                 |          0x0          || 0x0 | m-7 | m-6 | m-5 |
-    //                 
-    // each 4 bit word is
-    //
-    //                 0      1      2     3    <-- in Obj
-    //              | d56h | d56l | d6h | d6l |
-    //                bit3   bit2  bit1  bit0
-    //   
+  switch (m_runPeriod) {
+
+	  case 2:// RUN2
   
-    int modid = tmurcv->identify() & 0xff;  
-
-    const std::vector<bool> & slin = tmurcv->GetDecision();
-    int imax = std::min((int)slin.size(),4);
-    uint32_t word4b = 0x0;
-    for (int i=0;i<imax;++i){
-      // slin   d56h d56l  d6h  d6l
-      // word4b bit3 bit2 bit1 bit0
-      if (slin[i]) word4b |= 1 << (3-i);
-    }
+	     msg(MSG::INFO) << "Going trough RUN2 encoding procedure for TMDB data" << endmsg;
+
+             for (const TileMuonReceiverObj* tmurcv : m_vTileMuRcvObj) {
+
+                // VERSION RUN2: results are hold in 3 16-bit words. Two 32 bit words.
+                //
+                //     32nd bit -> |        results2       ||       results1        | <- 1st bit
+                //                 |          0x0          ||       results3        |
+                //
+		//     32nd bit -> | m-5 | m-4 | m-3 | m-2 || m-2 | m-1 | m-0 | 0x0 | <- 1st bit
+		//                 |          0x0          || 0x0 | m-7 | m-6 | m-5 |
+		//
+                // each 4 bit word is
+		//
+		//                 0      1      2     3    <-- in Obj
+		//              | d56h | d56l | d6h | d6l |
+		//                bit3   bit2  bit1  bit0
+		//
+
+                int modid = tmurcv->identify() & 0xff;
+
+                const std::vector<bool> & slin = tmurcv->GetDecision();
+                int imax = std::min((int)slin.size(),4);
+                uint32_t word4b = 0x0;
+                for (int i=0;i<imax;++i){
+                   if (slin[i]) word4b |= 1 << (3-i);
+                }
     
-    if (msgLvl(MSG::DEBUG)) {
-      std::stringstream ss;
-      for (const auto & val : slin) {
-          ss<<std::setw(2)<<val;
-      }
-      msg(MSG::DEBUG) << "Result for module: "<<modid<<" in TMDB board "<<modid%8<<MSG::hex<<": 0x"<<word4b<<MSG::dec<<" from "<<ss.str() << endmsg; 
-    }
+                if (msgLvl(MSG::INFO)) {
+                   std::stringstream ss;
+                   for (const auto & val : slin) {
+                      ss<<std::setw(2)<<val;
+                   }
+                   msg(MSG::INFO) << "Result for module: "<<modid<<" in TMDB board "<<modid%8<<MSG::hex<<": 0x"<<word4b<<MSG::dec<<" from "<<ss.str() << endmsg; 
+                }
     
-    switch (modid%8) {
-    case 0: result1 |= word4b << 4  ; break;
-    case 1: result1 |= word4b << 8  ; break;
-    case 2: result1 |= word4b << 12 ; result2 |= word4b; break;
-    case 3: result2 |= word4b << 4  ; break; 
-    case 4: result2 |= word4b << 8  ; break;
-    case 5: result2 |= word4b << 12 ; result3 |= word4b; break;
-    case 6: result3 |= word4b << 4  ; break;
-    case 7: result3 |= word4b << 8  ; break;
-    }
-    ++chc;
-  }
-
-  ATH_MSG_DEBUG( "Summary : "<<MSG::hex<<" Results 1: 0x"<<result1<<" Results 2: 0x"<<result2<<" Results 3: 0x"<<result3<< MSG::dec );
-
-  v.push_back( result1 | (result2 << 16) ); ++wc;// | 5 4 3 2 | 2 1 0 - |
-  v.push_back( result3 ); ++wc;                  // | - - - - | - 7 6 5 | '-' means free/not set/0x0
-  v.at(savepos)=3+wc;
+		switch (modid%8) {
+                    case 0: result1 |= word4b << 4  ; break;
+                    case 1: result1 |= word4b << 8  ; break;
+                    case 2: result1 |= word4b << 12 ; result2 |= word4b; break;
+                    case 3: result2 |= word4b << 4  ; break;
+                    case 4: result2 |= word4b << 8  ; break;
+                    case 5: result2 |= word4b << 12 ; result3 |= word4b; break;
+                    case 6: result3 |= word4b << 4  ; break;
+                    case 7: result3 |= word4b << 8  ; break;
+                }
+                ++chc;
+             }
+
+             ATH_MSG_INFO( "Summary : "<<MSG::hex<<" Results 1: 0x"<<result1<<" Results 2: 0x"<<result2<<" Results 3: 0x"<<result3<< MSG::dec );
+
+             v.push_back( result1 | (result2 << 16) ); ++wc;// | 5 4 3 2 | 2 1 0 - |
+             v.push_back( result3 ); ++wc;                  // | - - - - | - 7 6 5 | '-' means free/not set/0x0
+             v.at(savepos)=3+wc;
+
+	     break;
+
+          case 3:// RUN3
+
+             msg(MSG::INFO) << "Going trough RUN3 encoding procedure for TMDB data" << endmsg;
+
+             for (const TileMuonReceiverObj* tmurcv : m_vTileMuRcvObj) {
+                // VERSION RUN3: results are hold in two 32-bit word to cover a TMDB board holding 8 TileCal modules.
+                //
+		//               32nd bit -> |         results2 [16:31]            ||           results1 [0:15]           | <- 1st bit
+                //               32nd bit -> |            0x0 [16:31]              ||           results3 [0:15]           | <- 1st bit
+                //
+		//               32nd bit -> | 0x0 [12:15] | m-5 | m-4 | m-3 | m-2 || 0x0 [12:15] | m-3 | m-2 | m-1 | m-0 | <- 1st bit
+		//                           |          0x0 [16:31]                || 0x0 [12:15] | m-7 | m-6 | m-5 | m-4 |
+		//
+		//               For each module m-X there is a 3-bit word with the result for a threshold
+		//
+		//                    |  d5+d6  |  d6   |  d5  |
+		//                    |   bit2  |  bit1 | bit0 |
+		//
+
+                // counters and temporary words
+                //
 
-  ATH_MSG_DEBUG( "Check version and counters: "<<MSG::hex<< verfrag <<MSG::dec<<" "<< chc <<" "<< wc <<" save in position: "<< savepos );
-
-  if (msgLvl(MSG::VERBOSE)) {
-    msg(MSG::VERBOSE) << "Check content of ROD fragment after including sub-fragment (0x42)... " << v.size() << endmsg;
-    for (size_t i=0; i<v.size(); ++i) {
-      msg(MSG::VERBOSE) << i << "\t" << v.at(i) << MSG::hex << " 0x" << v.at(i) << MSG::dec << endmsg;
-    }
-  }
-  
-  return;	
+/*
+ *
+ * Comment on implementation...
+ * In Athena the  container size is kept to 4. It is fully used for run2 but for run3 the first position is left empty.
+ * The most significative bit is placed in first position [0] of a container so the position reverse while encoding.
+ *
+ * */
+
+		int modid = tmurcv->identify() & 0xff;
+		const std::vector<bool> & slin = tmurcv->GetDecision();
+		int imax  = std::min((int)slin.size(),4);
+                uint32_t word3b = 0x0;
+                for (int i=1;i<imax;++i) {
+                   // slin    d56  d6   d5
+                   // word3b bit2 bit1 bit0
+                   // bit 4 is always 0 since iteration starts at 1
+                   if (slin[i]) word3b |= 1 << (3-i);
+                }
+
+		switch (modid%8) {
+		    case 0: result1 |= word3b   ; break;
+                    case 1: result1 |= word3b << 3  ; break;
+                    case 2: result1 |= word3b << 6  ; result2 |= word3b      ; break;
+                    case 3: result1 |= word3b << 9  ; result2 |= word3b << 3 ; break;
+                    case 4: result2 |= word3b << 6  ; result3 |= word3b      ; break;
+                    case 5: result2 |= word3b << 9  ; result3 |= word3b << 3 ; break;
+                    case 6: result3 |= word3b << 6  ; break;
+                    case 7: result3 |= word3b << 9  ; break;
+                }
+                ++chc;
+             }
+
+             ATH_MSG_INFO( "Summary : "<<MSG::hex<<" Results 1: 0x"<<result1<<" Results 2: 0x"<<result2<<" Results 3: 0x"<<result3<< MSG::dec );
+
+             v.push_back( result1 | (result2 << 16) ); ++wc;
+             v.push_back( result3 ); ++wc;
+             v.at(savepos) = 3+wc;
+
+	     break;
+
+	  case 0://not defined
+	     ATH_MSG_INFO("Tile Muon Decision Board (TMDB) fragment versions are only available for RUN2 and RUN3");
+	     break;
+          }
+          if (msgLvl(MSG::INFO)){
+             msg(MSG::INFO) << "Check version and counters: "<<MSG::hex<<verfrag<<MSG::dec<<" "<<chc<<" "<<wc<<" save in position: "<<savepos<<endmsg;
+	     msg(MSG::INFO) << "Check content of ROD fragment after including sub-fragment (0x42)... " << v.size() << endmsg;
+	     for (size_t i=0; i<v.size(); ++i) {
+	         msg(MSG::INFO) << i << "\t" << v.at(i) << MSG::hex << " 0x" << v.at(i) << MSG::dec << endmsg;
+	     }
+	  }
+  return;
 }
 
 // == END of TMDB Encoders
-- 
GitLab