]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDrawFastStream.cxx
coverity defects fixed
[u/mrichter/AliRoot.git] / TRD / AliTRDrawFastStream.cxx
index 57336117492805a55ea66bccf8620e2e47d64985..9ef2e2f1e471fe1927184634b9f95bb13f827661 100644 (file)
@@ -29,9 +29,7 @@
 //                                                                            //\r
 ////////////////////////////////////////////////////////////////////////////////\r
 \r
-#include "TString.h"\r
 #include "TFile.h"\r
-#include "TTreeStream.h"\r
 \r
 #include "AliTRDrawFastStream.h"\r
 #include "AliTRDgeometry.h"\r
@@ -40,9 +38,8 @@
 #include "AliTRDarrayDictionary.h"\r
 #include "AliTRDarrayADC.h"\r
 #include "AliTRDSignalIndex.h"\r
-#include "AliTRDrawTPStream.h"\r
+#include "AliTRDdigitsParam.h"\r
 \r
-#include "AliLog.h"\r
 #include "AliRawReader.h"\r
 \r
 #define END_OF_TRACKLET_MARKEROLD 0xaaaaaaaa\r
@@ -88,7 +85,7 @@
 #define HC_NTIMEBINS(w) GET_VALUE_AT(w,0x3f,26)\r
 #define HC_BUNCH_CROSS_COUNTER(w) GET_VALUE_AT(w,0xffff,10)\r
 #define HC_PRETRIGGER_COUNTER(w) GET_VALUE_AT(w,0xf,6)\r
-#define HC_PRETRIGGER_PHASE(w) GET_VALUE_AT(w,0xf,6)\r
+#define HC_PRETRIGGER_PHASE(w) GET_VALUE_AT(w,0xf,2)\r
 \r
 // MCM word and ADC mask\r
 #define MCM_HEADER_MASK_ERR(w) ( ((w) & (0xf)) == (0xc) ? 0 : 1) // 0 if OK!!!\r
@@ -110,16 +107,14 @@ ClassImp(AliTRDrawFastStream)
 \r
 Bool_t AliTRDrawFastStream::fgExtraSkip = kFALSE;\r
 Bool_t AliTRDrawFastStream::fgSkipCDH = kFALSE;\r
-Bool_t AliTRDrawFastStream::fgWarnError = kTRUE;\r
 Bool_t AliTRDrawFastStream::fgCleanDataOnly = kFALSE;\r
 Bool_t AliTRDrawFastStream::fgDebugFlag = kTRUE;\r
 Bool_t AliTRDrawFastStream::fgEnableMemoryReset = kTRUE;\r
 Bool_t AliTRDrawFastStream::fgStackNumberChecker = kTRUE;\r
-Bool_t AliTRDrawFastStream::fgStackLinkNumberChecker = kTRUE;\r
+Bool_t AliTRDrawFastStream::fgStackLinkNumberChecker = kFALSE;\r
 Bool_t AliTRDrawFastStream::fgSkipData = kTRUE;\r
 Bool_t AliTRDrawFastStream::fgEnableDecodeConfigData = kFALSE;\r
 Int_t AliTRDrawFastStream::fgDumpHead = -1;\r
-Int_t  AliTRDrawFastStream::fgCommonAdditive = 0;\r
 Short_t AliTRDrawFastStream::fgMCMordering[] =\r
   {\r
     12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3 \r
@@ -128,12 +123,6 @@ Short_t AliTRDrawFastStream::fgROBordering[] =
   {\r
     0, 1, 2, 3\r
   };\r
-Bool_t  AliTRDrawFastStream::fDumpingEnable = kFALSE;\r
-Int_t  AliTRDrawFastStream::fDumpingSM = -1;\r
-Int_t  AliTRDrawFastStream::fDumpingStack = -1;\r
-Int_t  AliTRDrawFastStream::fDumpingLayer = -1;\r
-Int_t  AliTRDrawFastStream::fDumpingROB = -1;\r
-Int_t  AliTRDrawFastStream::fDumpingMCM = -1;\r
 \r
 Int_t  AliTRDrawFastStream::fgLastHC = -1;\r
 Int_t  AliTRDrawFastStream::fgLastROB = -1;\r
@@ -145,11 +134,15 @@ AliTRDrawFastStream::AliTRDrawFastStream()
   , fSM()\r
   , fStack(0)\r
   , fHC(0)\r
+  , fLastHC(0)\r
   , fMCM()\r
   , fpPos(0)\r
   , fpBegin(0)\r
   , fpEnd(0)\r
   , fWordLength(0)\r
+  , fpPosTemp(0)\r
+  , fGlobalNTimeBins(0)\r
+  , fIsTimeBinSet(kFALSE)\r
   , fStackNumber(-1)\r
   , fStackLinkNumber(-1)\r
   , fLinkTrackletCounter(-1)\r
@@ -165,10 +158,13 @@ AliTRDrawFastStream::AliTRDrawFastStream()
   , fCOL(0)\r
   , fExtendedCOL(0)\r
   , fIsShared(0)\r
+  , fWarnError(kTRUE)\r
+  , fWarnWarning(kFALSE)\r
   , fBufferRead(0)\r
   , fGeometry(0)\r
   , fRawReader(0)\r
   , fTRDfeeParam(0)\r
+  , fCommonAdditive(0)\r
 {\r
   //\r
   // default constructor\r
@@ -185,11 +181,15 @@ AliTRDrawFastStream::AliTRDrawFastStream(AliRawReader *rawReader)
   , fSM()\r
   , fStack(0)\r
   , fHC(0)\r
+  , fLastHC(0)\r
   , fMCM()\r
   , fpPos(0)\r
   , fpBegin(0)\r
   , fpEnd(0)\r
   , fWordLength(0)\r
+  , fpPosTemp(0)\r
+  , fGlobalNTimeBins(0)\r
+  , fIsTimeBinSet(kFALSE)\r
   , fStackNumber(-1)\r
   , fStackLinkNumber(-1)\r
   , fLinkTrackletCounter(-1)\r
@@ -205,10 +205,13 @@ AliTRDrawFastStream::AliTRDrawFastStream(AliRawReader *rawReader)
   , fCOL(0)\r
   , fExtendedCOL(0)\r
   , fIsShared(0)\r
+  , fWarnError(kTRUE)\r
+  , fWarnWarning(kFALSE)\r
   , fBufferRead(0)\r
   , fGeometry(0)\r
   , fRawReader(rawReader)\r
   , fTRDfeeParam(0)\r
+  , fCommonAdditive(0)\r
 {\r
   //\r
   // default constructor\r
@@ -229,11 +232,15 @@ AliTRDrawFastStream::AliTRDrawFastStream(const AliTRDrawFastStream& /*st*/)
   , fSM()\r
   , fStack(0)\r
   , fHC(0)\r
+  , fLastHC(0)\r
   , fMCM()\r
   , fpPos(0)\r
   , fpBegin(0)\r
   , fpEnd(0)\r
   , fWordLength(0)\r
+  , fpPosTemp(0)\r
+  , fGlobalNTimeBins(0)\r
+  , fIsTimeBinSet(kFALSE)\r
   , fStackNumber(-1)\r
   , fStackLinkNumber(-1)\r
   , fLinkTrackletCounter(-1)\r
@@ -249,10 +256,13 @@ AliTRDrawFastStream::AliTRDrawFastStream(const AliTRDrawFastStream& /*st*/)
   , fCOL(0)\r
   , fExtendedCOL(0)\r
   , fIsShared(0)\r
+  , fWarnError(kTRUE)\r
+  , fWarnWarning(kFALSE)\r
   , fBufferRead(0)\r
   , fGeometry(0)\r
   , fRawReader(0)\r
   , fTRDfeeParam(0)\r
+  , fCommonAdditive(0)\r
 {\r
   //\r
   // Copy constructor\r
@@ -329,7 +339,7 @@ Bool_t AliTRDrawFastStream::SkipWords(UInt_t iw)
     return kTRUE;\r
   }\r
   else {\r
-    if (fgWarnError) AliWarning(Form("Skip %d words failed. %d available", iw, fpEnd - fpPos - 1));\r
+    if (fWarnWarning) AliWarning(Form("Skip %u words failed. %ld available", iw, fpEnd - fpPos - 1));\r
     return kFALSE;\r
   }\r
 \r
@@ -339,7 +349,9 @@ Bool_t AliTRDrawFastStream::SkipWords(UInt_t iw)
 //------------------------------------------------------------\r
 Bool_t AliTRDrawFastStream::SetReader(AliRawReader *reader)\r
 {\r
-\r
+  // \r
+  // set raw reader pointer\r
+  // \r
   if (reader != 0) {\r
     fRawReader = reader;\r
     if (fRawReader) {\r
@@ -519,7 +531,6 @@ void AliTRDrawFastStream::ResetPerMCM()
   fMCM.fADCMaskWord = 0;\r
   fMCM.fADCmax = 0;\r
   fMCM.fADCcount = 0;\r
-  fMCM.fMCMADCWords = 0;\r
   fMCM.fSingleADCwords = 0;\r
   fMCM.fMCMhdCorrupted = 0;\r
   fMCM.fADCmaskCorrupted = 0;\r
@@ -611,6 +622,7 @@ Int_t AliTRDrawFastStream::NextChamber(AliTRDdigitsManager *digitsManager, UInt_
   AliTRDarrayDictionary *track1 = 0;\r
   AliTRDarrayDictionary *track2 = 0; \r
   AliTRDSignalIndex *indexes = 0;\r
+  AliTRDdigitsParam *digitsparam = 0;\r
 \r
   Int_t lastdet = -1;\r
   Int_t det     = -1;\r
@@ -637,8 +649,8 @@ Int_t AliTRDrawFastStream::NextChamber(AliTRDdigitsManager *digitsManager, UInt_
 \r
     if (det != lastdet) {\r
       // If new detector found\r
-      if (lastdet == -1) lastdet = det;\r
-      else {fStackLinkNumber--; return lastdet;}\r
+      if (lastdet == -1) {lastdet = det; fLastHC = fHC;}\r
+      else {fStackLinkNumber--; fHC = fLastHC ; return lastdet;}\r
 \r
       if (det < 0 || det >= AliTRDgeometry::kNdet) continue;\r
 \r
@@ -653,13 +665,20 @@ Int_t AliTRDrawFastStream::NextChamber(AliTRDdigitsManager *digitsManager, UInt_
 \r
       if (!digits) return -1;\r
 \r
-      Int_t rowMax = GetRowMax();\r
+      //Int_t rowMax = GetRowMax();\r
+      Int_t rowMax = fGeometry->RowmaxC1(); // we use maximum row number among all detectors to reuse memory\r
       Int_t colMax = GetColMax();\r
-      //Int_t ntbins = GetNumberOfTimeBins();\r
-      Int_t ntbins = 30; //[mj temp]\r
+      Int_t ntbins = GetGlobalNTimeBins(); \r
+\r
+      // Set digitsparam variables\r
+      digitsparam = (AliTRDdigitsParam *) digitsManager->GetDigitsParam();\r
+      digitsparam->SetNTimeBins(det,ntbins);\r
+      fCommonAdditive=10;\r
+      digitsparam->SetADCbaseline(det,fCommonAdditive);\r
 \r
       // Allocate memory space for the digits buffer\r
-      if (digits->GetNtime() == 0) {\r
+      //if (digits->GetNtime() == 0) {\r
+      if (ntbins != digits->GetNtime()) {\r
         digits->Allocate(rowMax, colMax, ntbins);\r
         if (digitsManager->UsesDictionaries()) {\r
           track0->Allocate(rowMax, colMax, ntbins);\r
@@ -673,7 +692,7 @@ Int_t AliTRDrawFastStream::NextChamber(AliTRDdigitsManager *digitsManager, UInt_
       indexes->SetStack(GetStack());\r
       indexes->SetLayer(GetLayer());\r
       indexes->SetDetNumber(det);\r
-      if (indexes->IsAllocated() == kFALSE)\r
+      if (indexes->GetNtime() != ntbins)\r
         indexes->Allocate(rowMax, colMax, ntbins);\r
     }\r
 \r
@@ -681,7 +700,7 @@ Int_t AliTRDrawFastStream::NextChamber(AliTRDdigitsManager *digitsManager, UInt_
       if (DecodeTracklets() == kFALSE) {\r
         SeekEndOfData();\r
 \r
-        if (fgWarnError) AliError(Form("Tracklet decoding failed stack %d link %d", GetStack(), fStackLinkNumber));\r
+        if (fWarnWarning) AliWarning(Form("Tracklet decoding failed stack %d link %d", GetStack(), fStackLinkNumber));\r
 \r
         // copy error codes in memory into error container\r
         if (errorCodeContainer) {\r
@@ -708,7 +727,7 @@ Int_t AliTRDrawFastStream::NextChamber(AliTRDdigitsManager *digitsManager, UInt_
            if (fHC->fEOTECorrupted != kTRUE)  SeekEndOfData();\r
 \r
 /*\r
-      if (fgWarnError) {\r
+      if (fWarnError) {\r
         AliError(Form("Failed HC : %s", DumpHCinfoH0(fHC)));\r
         AliError(Form("Failed HC : %s", DumpHCinfoH1(fHC)));\r
       }\r
@@ -716,6 +735,9 @@ Int_t AliTRDrawFastStream::NextChamber(AliTRDdigitsManager *digitsManager, UInt_
          }\r
     else SeekEndOfData(); // make sure that finish off with the end of data markers\r
 \r
+    // set pretrigger phase since it is only avaliable after decoding HC header \r
+    digitsparam->SetPretriggerPhase(det,GetPreTriggerPhase());\r
+\r
     // copy tracklets in memory into tracklet container\r
     if (trackletContainer) {\r
       ntracklets = GetNTracklets();\r
@@ -790,7 +812,7 @@ Bool_t AliTRDrawFastStream::InitBuffer(void *buffer, UInt_t length)
   fpPos = fpBegin;\r
 \r
   if (fpBegin == 0 || length <= 0) {\r
-    AliError(Form("Buffer size or pointer is strange. pointer to the buffer is 0x%08x of size %d", fpBegin, length));\r
+    AliError(Form("Buffer size or pointer is strange. pointer to the buffer is 0x%p of size %u", fpBegin, length));\r
     return kFALSE;\r
   }\r
 \r
@@ -820,13 +842,14 @@ Bool_t AliTRDrawFastStream::DecodeSMHeader(void *buffer, UInt_t length)
   ResetIterators(); \r
 \r
   if (InitBuffer(buffer, length) == kFALSE) {\r
-    if (fgWarnError) AliError("InitBuffer failed.");      \r
+    if (fWarnError) AliError("InitBuffer failed.");      \r
     return kFALSE;\r
   }\r
 \r
   if (DecodeGTUheader()== kFALSE)\r
     return kFALSE;\r
 \r
+  Int_t nLinkErrors=0;\r
   for (Int_t istack = 0; istack < 5; istack++) {\r
      fStackNumber = istack; \r
      if (fSM.fStackActive[istack] == kFALSE) continue;\r
@@ -842,16 +865,17 @@ Bool_t AliTRDrawFastStream::DecodeSMHeader(void *buffer, UInt_t length)
         if (!(fStack->fLinksDataType[ilink] == 0 && fStack->fLinksMonitor[ilink] == 0)) {\r
           fStack->fLinkMonitorError[ilink] = 1;\r
           fStack->fLinkMonitorError[ilink] += fNWordsCounter; // counts words of given hc having link monitor error\r
+          nLinkErrors++;\r
           //continue;\r
         }\r
 \r
            if (fpPos >= fpEnd) {\r
           if (fRawReader) fRawReader->AddMajorErrorLog(kLinkDataMissing, "Link data missing");          \r
-          if (fgWarnError) AliError("Link data missing.");\r
+          if (fWarnWarning) AliWarning("Link data missing.");\r
           break;\r
         }\r
 \r
-             // HLT streamer set det number using SM header \r
+             // set det number using SM header \r
         fHC = &fStack->fHalfChambers[ilink];\r
              fHC->fSM = fRawReader->GetEquipmentId() - 1024;\r
              fHC->fStack = fStackNumber;\r
@@ -864,6 +888,14 @@ Bool_t AliTRDrawFastStream::DecodeSMHeader(void *buffer, UInt_t length)
           }\r
   }    \r
 \r
+  // set number of timebin to be used in the digit container \r
+  if (nLinkErrors>30) fGlobalNTimeBins=30;\r
+  else if (!fIsTimeBinSet) {\r
+    fpPosTemp = fpPos;\r
+    SetGlobalNTimebins();\r
+    fIsTimeBinSet = kTRUE;\r
+  }\r
+\r
   ResetIterators(); // need to do it again for Next() function\r
 \r
   return kTRUE;\r
@@ -914,7 +946,7 @@ Bool_t AliTRDrawFastStream::DecodeGTUheader()
     }\r
   }\r
   else {\r
-    if (fgWarnError) AliWarning("No additional sm headers and stack index words present.");\r
+    if (fWarnWarning) AliWarning("No additional sm headers and stack index words present.");\r
     if (fRawReader) fRawReader->AddMajorErrorLog(kDecodeStackInfo, "Stack info missing");\r
     return kFALSE;\r
   }\r
@@ -923,7 +955,7 @@ Bool_t AliTRDrawFastStream::DecodeGTUheader()
     if (fgDebugFlag)  AliDebug(5, "GTU headers are OK.");\r
   }\r
   else {\r
-    if (fgWarnError) AliWarning("No data just after GTU headers.");\r
+    if (fWarnError) AliError("No data just after GTU headers.");\r
     if (fRawReader) fRawReader->AddMajorErrorLog(kMissingData, "Missing sm data");\r
     return kFALSE;\r
   }\r
@@ -985,10 +1017,10 @@ Bool_t AliTRDrawFastStream::DecodeTracklets()
   fEndOfTrackletCount = 0;  // tracklet endmarker counter of this link\r
   fHC->fNTracklets = 0;     // number of tracklet of this link, should be less than 256\r
 \r
-  if (fgDebugFlag)  AliDebug(10, Form("Decode tracklets at 0x%08x : 0x%08x", fpPos, *fpPos));\r
+  if (fgDebugFlag)  AliDebug(10, Form("Decode tracklets at 0x%p : 0x%08x", fpPos, *fpPos));\r
 \r
   while (!(*fpPos == END_OF_TRACKLET_MARKEROLD || *fpPos == END_OF_TRACKLET_MARKERNEW) && fpPos < fpEnd) {\r
-    if (fgDebugFlag)  AliDebug(10, Form("Tracklet found at 0x%08x : 0x%08x", fpPos, *fpPos));\r
+    if (fgDebugFlag)  AliDebug(10, Form("Tracklet found at 0x%p : 0x%08x", fpPos, *fpPos));\r
 \r
     fLinkTrackletCounter++;\r
 \r
@@ -1007,7 +1039,7 @@ Bool_t AliTRDrawFastStream::DecodeTracklets()
   fHC->fNTracklets = fLinkTrackletCounter;\r
 \r
   while ((*fpPos == END_OF_TRACKLET_MARKEROLD || *fpPos == END_OF_TRACKLET_MARKERNEW) && fpPos < fpEnd) {\r
-    if (fgDebugFlag)  AliDebug(10, Form("EoTracklets found at 0x%08x : 0x%08x", fpPos, *fpPos));\r
+    if (fgDebugFlag)  AliDebug(10, Form("EoTracklets found at 0x%p : 0x%08x", fpPos, *fpPos));\r
 \r
     fEndOfTrackletCount++;\r
     fpPos++;\r
@@ -1069,31 +1101,31 @@ Bool_t AliTRDrawFastStream::DecodeHC(AliTRDdigitsManager *digitsManager, AliTRDa
   //\r
   if (fpPos >= fpEnd) {\r
     fHC->fCorrupted += 1; \r
-    if (fgWarnError) AliError("No data(including HC header) in the buffer");\r
+    if (fWarnError) AliError("No data(including HC header) in the buffer");\r
     return kFALSE;;\r
   }\r
 \r
   if (DecodeHCheader() == kFALSE) {\r
-    if (fgWarnError) AliWarning(Form("HC Header decode failed. H0 Error: %d H1 Error: %d",fHC->fH0Corrupted,fHC->fH1Corrupted));\r
+    if (fWarnWarning) AliWarning(Form("HC Header decode failed. H0 Error: %d H1 Error: %d",fHC->fH0Corrupted,fHC->fH1Corrupted));\r
     return kFALSE;\r
   }\r
   else {\r
     fpPos++;\r
     if (fpPos >= fpEnd) {\r
       fHC->fCorrupted += 2; \r
-      if (fgWarnError) AliError("No data right after HC header in the buffer");\r
+      if (fWarnError) AliError("No data right after HC header in the buffer");\r
       return kFALSE;\r
     }\r
   }\r
 \r
-  if ((fHC->fRawVMajor & 64) == 64) { // test pattern data\r
-    AliTRDrawTPStream *tpStream = new AliTRDrawTPStream(fHC->fRawVMajorOpt, fpPos);\r
-    if (tpStream->DecodeTPdata() == kFALSE) {\r
-      if (fgWarnError) AliError("Failed to decode test pattern data");\r
-      return kFALSE;\r
-    }\r
-    return kTRUE;\r
-  }\r
+//   if ((fHC->fRawVMajor & 64) == 64) { // test pattern data\r
+//     AliTRDrawTPStream *tpStream = new AliTRDrawTPStream(fHC->fRawVMajorOpt, fpPos);\r
+//     if (tpStream->DecodeTPdata() == kFALSE) {\r
+//       if (fWarnError) AliError("Failed to decode test pattern data");\r
+//       return kFALSE;\r
+//     }\r
+//     return kTRUE;\r
+//   }\r
 \r
   fHC->fMCMmax = 0; // count number of mcms in a hc \r
   while (*fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd) {\r
@@ -1113,7 +1145,7 @@ Bool_t AliTRDrawFastStream::DecodeHC(AliTRDdigitsManager *digitsManager, AliTRDa
       fHC->fErrorCodes[fHC->fMCMmax+2] += (fMCM.fADCmaskCorrupted << 4);\r
       fHC->fErrorCodes[fHC->fMCMmax+2] += ((fMCM.fDataCorrupted & 1) << 6);\r
       fHC->fErrorCodes[fHC->fMCMmax+2] += (fMCM.fMCM << 7);  // encode MCM number\r
-      fHC->fErrorCodes[fHC->fMCMmax+2] += (fMCM.fROB << 13); // encode ROB number\r
+      fHC->fErrorCodes[fHC->fMCMmax+2] += (fMCM.fROB << 11); // encode ROB number\r
 \r
       fHC->fMCMmax++; // increase mcm counter to match with expected rob/mcm number\r
 \r
@@ -1143,17 +1175,8 @@ Bool_t AliTRDrawFastStream::DecodeHC(AliTRDdigitsManager *digitsManager, AliTRDa
       fADCnumber = 0;\r
       for (Int_t iadc = 0; iadc < fMCM.fADCmax; iadc++) {\r
          fADCnumber = fMCM.fADCchannel[iadc];\r
-\r
-         if ( fADCnumber >= fMaxADCgeom - 1) {\r
-                fExtendedCOL = fTRDfeeParam->GetExtendedPadColFromADC(fMCM.fROB, fMCM.fMCM, fADCnumber-1);\r
-                fExtendedCOL--;\r
-                fCOL = fTRDfeeParam->GetPadColFromADC(fMCM.fROB, fMCM.fMCM, fADCnumber-1);\r
-                fCOL--;\r
-              }\r
-              else {\r
            fExtendedCOL = fTRDfeeParam->GetExtendedPadColFromADC(fMCM.fROB, fMCM.fMCM, fADCnumber);\r
            fCOL = fTRDfeeParam->GetPadColFromADC(fMCM.fROB, fMCM.fMCM, fADCnumber);\r
-         }\r
 \r
          if (fADCnumber <= 1 || fADCnumber == fMaxADCgeom - 1)  // if adc number = 0, 1, 20\r
                       fIsShared = kTRUE;\r
@@ -1166,9 +1189,22 @@ Bool_t AliTRDrawFastStream::DecodeHC(AliTRDdigitsManager *digitsManager, AliTRDa
            return kFALSE;\r
          }\r
 \r
-         if (DecodeADC(digitsManager, digits, track0, track1, track2, indexes) == kFALSE) {\r
-           return kFALSE;\r
+         //if (GetGlobalNTimeBins() < 31){\r
+         if (fHC->fTimeBins < 31){\r
+           if (DecodeADC(digitsManager, digits, track0, track1, track2, indexes) == kFALSE) {\r
+             return kFALSE;\r
+           }\r
+         }\r
+         //else if (GetGlobalNTimeBins() > 32) {\r
+         else if (fHC->fTimeBins > 32) {\r
+           if (DecodeADCExtended(digitsManager, digits, track0, track1, track2, indexes) == kFALSE) {\r
+             return kFALSE;\r
+           }\r
+         }\r
+         else { // nsamples = 31, 32 are not implemented in the TRAP and should never happen  \r
+           if (fWarnError) AliError("nsamples are 31 or 32. These are not implemented in the TRAP and should never happen!");\r
          }\r
+\r
       } // iadc\r
     }\r
     else { // if there is no adc activated\r
@@ -1213,7 +1249,7 @@ Bool_t AliTRDrawFastStream::DecodeHCheader()
 \r
   if (IsHCheaderOK() == kFALSE) {\r
     fHC->fH0Corrupted += 2;\r
-    if (fgDebugFlag) AliDebug(11,Form("H0 Header Insane. Word 0x%08x", *fHC->fPos));\r
+    if (fgDebugFlag) AliDebug(11,Form("H0 Header Insane. Word 0x%p", *fHC->fPos));\r
     return kFALSE;\r
   }\r
 \r
@@ -1231,7 +1267,7 @@ Bool_t AliTRDrawFastStream::DecodeHCwordH0(const UInt_t *word, struct AliTRDrawH
 \r
   hc->fH0Corrupted = HC_HEADER_MASK_ERR(vword);\r
   if (hc->fH0Corrupted > 0) {\r
-    if (fgDebugFlag) AliDebug(11,Form("H0 Header Mask Error. Word 0x%08x",*fHC->fPos ));\r
+    if (fgDebugFlag) AliDebug(11,Form("H0 Header Mask Error. Word 0x%p",*fHC->fPos ));\r
     return kFALSE;\r
   }\r
   hc->fSpecialRawV =  HC_SPECIAL_RAW_VERSION(vword);\r
@@ -1259,7 +1295,7 @@ Bool_t AliTRDrawFastStream::DecodeHCwordH1(const UInt_t *word, struct AliTRDrawH
 \r
   hc->fH1Corrupted = HC_HEADER_MASK_ERR(vword);\r
   if (hc->fH1Corrupted > 0) {\r
-    if (fgDebugFlag) AliDebug(11,Form("H1 Header Mask Error. Word 0x%08x", *(fHC->fPos+1) ));\r
+    if (fgDebugFlag) AliDebug(11,Form("H1 Header Mask Error. Word 0x%p", *(fHC->fPos+1) ));\r
     return kFALSE;\r
   }\r
   hc->fTimeBins = HC_NTIMEBINS(vword);\r
@@ -1306,7 +1342,7 @@ Bool_t AliTRDrawFastStream::IsHCheaderOK()
   }\r
 \r
   if (fgStackLinkNumberChecker) {\r
-    if (fHC->fLayerHCheader != fHC->fLayer) {\r
+    if (fHC->fLayerHCheader * 2 + fHC->fSideHCheader != fHC->fLayer * 2 + fHC->fSide) {\r
       if (fgDebugFlag) AliDebug(11,Form("Missmatch: Layer number between HC header %d and GTU link mask %d | %s",\r
                                         fHC->fLayerHCheader, fHC->fLayer, DumpStackInfo(fStack)));\r
       return kFALSE;\r
@@ -1399,7 +1435,7 @@ void AliTRDrawFastStream::DecodeMCMheader(const UInt_t *word, struct AliTRDrawMC
   UInt_t vword = *word;\r
 \r
   if (vword == END_OF_TRACKLET_MARKERNEW) {\r
-    if (fgWarnError) AliError(Form("There should be MCM header. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));\r
+    if (fWarnError) AliError(Form("There should be MCM header. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));\r
     fHC->fEOTECorrupted = kTRUE; //to finish data reading of this HC\r
   }\r
 \r
@@ -1428,7 +1464,7 @@ UInt_t AliTRDrawFastStream::GetMCMadcMask(const UInt_t *word, struct AliTRDrawMC
   mcm->fADCMaskWord = vword;\r
 \r
   if (vword == END_OF_TRACKLET_MARKERNEW) {\r
-    if (fgWarnError) AliError(Form("There should be MCMadcMask. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));\r
+    if (fWarnError) AliError(Form("There should be MCMadcMask. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));\r
     fHC->fEOTECorrupted = kTRUE; //to finish data reading of this HC\r
   }\r
 \r
@@ -1452,7 +1488,6 @@ void AliTRDrawFastStream::DecodeMask(const UInt_t *word, struct AliTRDrawMCM *mc
   //\r
   // decode the adc mask - adcs to be read out\r
   //\r
-  mcm->fMCMADCWords = 0;\r
   mcm->fSingleADCwords = 0;\r
   mcm->fADCmax = 0;\r
   mcm->fADCMask = GetMCMadcMask(word, mcm);\r
@@ -1480,11 +1515,9 @@ void AliTRDrawFastStream::MCMADCwordsWithTbins(UInt_t fTbins, struct AliTRDrawMC
   //\r
   //  count the expected mcm words for a given tbins\r
   //\r
-  mcm->fMCMADCWords = ( mcm->fADCmax ) * ( fTbins / 3 );\r
   mcm->fSingleADCwords = 0;\r
-  if (mcm->fADCmax > 0) {\r
-    mcm->fSingleADCwords = mcm->fMCMADCWords/mcm->fADCmax;\r
-  }\r
+  mcm->fSingleADCwords = (fTbins-1)/3+1;\r
+  if (fTbins > 32) mcm->fSingleADCwords = 10; // if the timebin is more than 30, then fix the number of adc words to 10\r
 }\r
 \r
 //------------------------------------------------------------\r
@@ -1562,7 +1595,7 @@ Bool_t AliTRDrawFastStream::DecodeADC(AliTRDdigitsManager *digitsManager, AliTRD
 \r
   for (Int_t iw = 0; iw < fMCM.fSingleADCwords; iw++) {\r
      if (HC_HEADER_MASK_ERR(*fpPos) == 0 || *fpPos == END_OF_TRACKLET_MARKERNEW) {\r
-       if (fgWarnError) AliError(Form("There should be ADC data. We meet HC header or END_OF_TRACKLET_MARKER 0x%08x",*fpPos));\r
+       if (fWarnError) AliError(Form("There should be ADC data. We meet HC header or END_OF_TRACKLET_MARKER 0x%08x",*fpPos));\r
        fHC->fEOTECorrupted = kTRUE; \r
        fpPos--;\r
        return kFALSE;\r
@@ -1576,7 +1609,7 @@ Bool_t AliTRDrawFastStream::DecodeADC(AliTRDdigitsManager *digitsManager, AliTRD
        if (!isWritten) { \r
          fHC->fErrorCodes[index+66] += (fADCnumber << 4);; \r
          fHC->fErrorCodes[index+66] += (fMCM.fMCM << 9);; \r
-         fHC->fErrorCodes[index+66] += (fMCM.fROB << 15);; \r
+         fHC->fErrorCodes[index+66] += (fMCM.fROB << 13);; \r
          isWritten = kTRUE; \r
        }\r
        fMCM.fDataCorrupted = kTRUE;\r
@@ -1586,23 +1619,97 @@ Bool_t AliTRDrawFastStream::DecodeADC(AliTRDdigitsManager *digitsManager, AliTRD
      }\r
      // decode and put into the digit container\r
      Int_t adcSignals[3];\r
-     adcSignals[0] = ((*fpPos & 0x00000ffc) >>  2) - fgCommonAdditive;\r
-     adcSignals[1] = ((*fpPos & 0x003ff000) >> 12) - fgCommonAdditive;\r
-     adcSignals[2] = ((*fpPos & 0xffc00000) >> 22) - fgCommonAdditive;\r
+     adcSignals[0] = ((*fpPos & 0x00000ffc) >>  2);\r
+     adcSignals[1] = ((*fpPos & 0x003ff000) >> 12);\r
+     adcSignals[2] = ((*fpPos & 0xffc00000) >> 22);\r
 \r
      if(GetCol() < 0 || (!fSharedPadsOn & fIsShared)) {fpPos++; continue;};    \r
+\r
      for (Int_t i = 0; i < 3; i++) {\r
-        if (adcSignals[i] > 0) { \r
-               if (fSharedPadsOn) \r
-            digits->SetDataByAdcCol(GetRow(), GetExtendedCol(), fTbinADC + i, adcSignals[i]);\r
-               else \r
-            digits->SetData(GetRow(), GetCol(), fTbinADC + i, adcSignals[i]);\r
-               indexes->AddIndexRC(GetRow(), GetCol());\r
-             } \r
+        digits->SetDataByAdcCol(GetRow(), GetExtendedCol(), fTbinADC + i, adcSignals[i]);\r
+        indexes->AddIndexRC(GetRow(), GetCol());\r
         if (digitsManager->UsesDictionaries()) {\r
-          track0->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
-          track1->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
-          track2->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
+         track0->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
+         track1->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
+         track2->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
+        }\r
+     } // i\r
+     fTbinADC += 3;\r
+     fpPos++;\r
+  } // iw\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t AliTRDrawFastStream::DecodeADCExtended(AliTRDdigitsManager *digitsManager, AliTRDarrayADC *digits, \r
+                              AliTRDarrayDictionary *track0, AliTRDarrayDictionary *track1, AliTRDarrayDictionary *track2, \r
+                              AliTRDSignalIndex *indexes)\r
+{\r
+  //\r
+  // decode single ADC channel\r
+  //\r
+  if(fADCnumber%2==1) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL1);\r
+  if(fADCnumber%2==0) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL2);\r
+\r
+  Bool_t isWritten = kFALSE; //for error code recording\r
+\r
+  fTbinADC = ((*fpPos & 0x000000fc) >>  2);\r
+  fMCM.fSingleADCwords  = ((*fpPos & 0x00000f00) >>  8);\r
+  \r
+  Int_t adcFirst2Signals[2];\r
+  adcFirst2Signals[0] = ((*fpPos & 0x003ff000) >> 12);\r
+  adcFirst2Signals[1] = ((*fpPos & 0xffc00000) >> 22);\r
+\r
+  for (Int_t i = 0; i < 2; i++) {\r
+     digits->SetDataByAdcCol(GetRow(), GetExtendedCol(), fTbinADC + i, adcFirst2Signals[i]);\r
+     indexes->AddIndexRC(GetRow(), GetCol());\r
+     if (digitsManager->UsesDictionaries()) {\r
+       track0->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
+       track1->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
+       track2->SetData(GetRow(), GetCol(), fTbinADC + i, 0);\r
+     }\r
+  } // i\r
+\r
+  fpPos++;\r
+  for (Int_t iw = 0; iw < fMCM.fSingleADCwords-1; iw++) {\r
+     if (HC_HEADER_MASK_ERR(*fpPos) == 0 || *fpPos == END_OF_TRACKLET_MARKERNEW) {\r
+       if (fWarnError) AliError(Form("There should be ADC data. We meet HC header or END_OF_TRACKLET_MARKER 0x%08x",*fpPos));\r
+       fHC->fEOTECorrupted = kTRUE; \r
+       fpPos--;\r
+       return kFALSE;\r
+     }\r
+     if (fMaskADCword != ADC_WORD_MASK(*fpPos)) {\r
+       if (fgDebugFlag) AliDebug(11,Form("Wrong ADC data mask! [Expected mask: 0x%08x  Current mask: 0x%08x] ADC channel number: %02d MCM= %s ",\r
+                                         fMaskADCword, ADC_WORD_MASK(*fpPos), fADCnumber, DumpMCMinfo(&fMCM)));\r
+      // encode adc level error codes\r
+       Int_t index = 21*(fMCM.fMCM + 16*int(fMCM.fROB/2)) + fADCnumber;\r
+       fHC->fErrorCodes[index+66] += 1; \r
+       if (!isWritten) { \r
+         fHC->fErrorCodes[index+66] += (fADCnumber << 4);; \r
+         fHC->fErrorCodes[index+66] += (fMCM.fMCM << 9);; \r
+         fHC->fErrorCodes[index+66] += (fMCM.fROB << 13);; \r
+         isWritten = kTRUE; \r
+       }\r
+       fMCM.fDataCorrupted = kTRUE;\r
+       fHC->fDataCorrupted = kTRUE;\r
+       fpPos++;\r
+       continue;\r
+     }\r
+     // decode and put into the digit container\r
+     Int_t adcSignals[3];\r
+     adcSignals[0] = ((*fpPos & 0x00000ffc) >>  2);\r
+     adcSignals[1] = ((*fpPos & 0x003ff000) >> 12);\r
+     adcSignals[2] = ((*fpPos & 0xffc00000) >> 22);\r
+\r
+     if(GetCol() < 0 || (!fSharedPadsOn & fIsShared)) {fpPos++; continue;};    \r
+     for (Int_t i = 0; i < 3; i++) {\r
+        digits->SetDataByAdcCol(GetRow(), GetExtendedCol(), fTbinADC + 2 + i, adcSignals[i]);\r
+        indexes->AddIndexRC(GetRow(), GetCol());\r
+        if (digitsManager->UsesDictionaries()) {\r
+         track0->SetData(GetRow(), GetCol(), fTbinADC + 2 + i, 0);\r
+         track1->SetData(GetRow(), GetCol(), fTbinADC + 2 + i, 0);\r
+         track2->SetData(GetRow(), GetCol(), fTbinADC + 2 + i, 0);\r
         }\r
      } // i\r
      fTbinADC += 3;\r
@@ -1621,11 +1728,11 @@ Bool_t AliTRDrawFastStream::SeekEndOfData()
   Int_t fEndOfDataCount = 0;\r
   fNWordsCounter = 0;\r
 \r
-  while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd ) {\r
+  while ( fpPos < fpEnd && *fpPos != ENDOFRAWDATAMARKER ) {\r
     fpPos++;\r
     fNWordsCounter++;\r
   }\r
-  while (*fpPos == ENDOFRAWDATAMARKER && fpPos < fpEnd ) {\r
+  while ( fpPos < fpEnd && *fpPos == ENDOFRAWDATAMARKER ) {\r
     fEndOfDataCount++;\r
     fpPos++;\r
   }\r
@@ -1643,7 +1750,7 @@ Bool_t AliTRDrawFastStream::SeekNextMCMheader()
 \r
   while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd ) {\r
     if (MCM_HEADER_MASK_ERR(*fpPos) == 0 && MCM_HEADER_MASK_ERR(*(fpPos+1)) == 0) {\r
-      if (fgDebugFlag) AliDebug(11,Form("Found : Pos 0x%08x : Val 0x%08x", fpPos, *fpPos));\r
+      if (fgDebugFlag) AliDebug(11,Form("Found : Pos 0x%p : Val 0x%08x", fpPos, *fpPos));\r
       return kTRUE;\r
     }\r
     if ( *fpPos == END_OF_TRACKLET_MARKERNEW) {\r
@@ -1684,13 +1791,56 @@ Bool_t AliTRDrawFastStream::SkipMCMdata(UInt_t iw)
   return kFALSE;\r
 }\r
 \r
+//------------------------------------------------------------\r
+Bool_t AliTRDrawFastStream::SetGlobalNTimebins()\r
+{\r
+  // get number of time bin info from HC headers then set \r
+  Int_t nHCs=0;\r
+  while (SetNTimebins()==kFALSE){\r
+    if (fgDebugFlag) AliDebug(11,Form("Failed to get number of time bin information from the %dth HC",nHCs));\r
+    nHCs++;\r
+  }\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t AliTRDrawFastStream::SetNTimebins()\r
+{\r
+  // goes to the HC header position\r
+  while (!(*fpPosTemp == END_OF_TRACKLET_MARKERNEW) && fpPosTemp < fpEnd) {\r
+    fpPosTemp++;\r
+  }\r
+  while (*fpPosTemp == END_OF_TRACKLET_MARKERNEW) {\r
+    fpPosTemp++;\r
+  }\r
+  // skip H0 \r
+  fpPosTemp++;\r
+\r
+  UInt_t vword = 0;\r
+  if (!(vword = *fpPosTemp)) {\r
+    fGlobalNTimeBins = 30; // default number of timebins \r
+    return kFALSE;\r
+  }\r
+\r
+  // get the number of time bins \r
+  if (HC_HEADER_MASK_ERR(vword) == 0) {\r
+    fGlobalNTimeBins = HC_NTIMEBINS(vword);\r
+    if (fGlobalNTimeBins > 64 || fGlobalNTimeBins < 10) return kFALSE; // minimal protection\r
+  }\r
+  else\r
+    return kFALSE;\r
+\r
+  return kTRUE;\r
+}\r
+\r
 //------------------------------------------------------------\r
 Bool_t AliTRDrawFastStream::DumpWords(UInt_t *px, UInt_t iw, UInt_t marker)\r
 {\r
   //\r
   // dump given number of words for debugging\r
   //\r
-  TString tsreturn = Form("\n[ Dump Sequence at 0x%08x ] : ", px);\r
+  TString tsreturn = Form("\n[ Dump Sequence at 0x%p ] : ", px);\r
   for (UInt_t i = 0; i < iw; i++) {\r
      if ( iw != 0 && px + iw > fpEnd) \r
        return kFALSE;\r
@@ -1739,8 +1889,9 @@ const char *AliTRDrawFastStream::DumpHCinfoH0(const struct AliTRDrawHC *hc)
   if (!hc)\r
     return Form("Unable to dump. Null received as parameter!?!");\r
   else\r
-    return Form("[ HC[0] at 0x%08x ] : 0x%08x Info is : RawV %d SM %d Stack %d Layer %d Side %d DCSboard %d",\r
-                hc->fPos[0], *(hc->fPos[0]), hc->fRawVMajor, hc->fSM, hc->fStack, hc->fLayer, hc->fSide, hc->fDCSboard);\r
+     return Form("[ HC[0] at 0x%p ] : 0x%08x Info is : RawV %d SM %d Stack %d Layer %d Side %d DCSboard %d",\r
+                hc->fPos[0], *(hc->fPos[0]), hc->fRawVMajor, fRawReader->GetEquipmentId()-1024, \r
+                hc->fStack, hc->fLayer, hc->fSide, hc->fDCSboard);\r
 }\r
 \r
 //--------------------------------------------------------\r
@@ -1752,7 +1903,7 @@ const char *AliTRDrawFastStream::DumpHCinfoH1(const struct AliTRDrawHC *hc)
   if (!hc)\r
     return Form("Unable to dump. Null received as parameter!?!");\r
   else\r
-    return Form("[ HC[1] at 0x%08x ] : 0x%08x Info is : TBins %d BCcount %d PreTrigCount %d PreTrigPhase %d",\r
+    return Form("[ HC[1] at 0x%p ] : 0x%08x Info is : TBins %d BCcount %d PreTrigCount %d PreTrigPhase %d",\r
                 hc->fPos[1], *(hc->fPos[1]), hc->fTimeBins, hc->fBunchCrossCounter, hc->fPreTriggerCounter, hc->fPreTriggerPhase);\r
 }\r
 \r
@@ -1784,3 +1935,5 @@ const char *AliTRDrawFastStream::DumpMCMadcMask(const struct AliTRDrawMCM *mcm)
   tsreturn += "";\r
   return tsreturn.Data();\r
 }\r
+\r
+\r