]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDrawStreamTB.cxx
Copy arrays in assignment instead of the pointer; avoid double delete.
[u/mrichter/AliRoot.git] / TRD / AliTRDrawStreamTB.cxx
index 0e0df4cc88fab69aca1a32864e1ca8e135017f63..cb373ec85de236b48e017f1bdf52a1cc76161e26 100644 (file)
@@ -1,4 +1,4 @@
-/**************************************************************************
+#/**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * Author: The ALICE Off-line Project.                                    *
 #include "AliTRDdigitsManager.h"
 #include "AliTRDdataArrayS.h"
 #include "AliTRDdataArrayI.h"
+#include "AliTRDdataArrayDigits.h"
 #include "AliTRDSignalIndex.h"
+// #include "AliTRDReconstructor.h"
+#include "AliTRDrecoParam.h"
+#include "AliTRDcalibDB.h"
+#include "Cal/AliTRDCalPadStatus.h"
 
 #include "AliLog.h"
 #include "AliRawReader.h"
@@ -46,6 +51,7 @@
 #define END_OF_TRACKLET_MARKEROLD 0xaaaaaaaa
 #define END_OF_TRACKLET_MARKERNEW 0x10001000
 #define ENDOFRAWDATAMARKER 0x00000000
+#define ENDBITS 0x03
 #define WORD_SIZE sizeof(UInt_t)           // size of a word in bytes
 #define EXTRA_LEAD_WORDS 24
 #define CDH_WORDS 8
@@ -69,6 +75,7 @@
 // HC word 0
 #define HC_SPECIAL_RAW_VERSION(w) IS_BIT_SET(w,31)
 #define HC_MAJOR_RAW_VERSION(w) GET_VALUE_AT(w,0x7f,24)
+#define HC_MAJOR_RAW_VERSION_OPT(w) GET_VALUE_AT(w,0x7,24)
 #define HC_MINOR_RAW_VERSION(w) GET_VALUE_AT(w,0x7f,17)
 #define HC_EXTRA_WORDS(w) GET_VALUE_AT(w,0x7,14)
 #define HC_DCS_BOARD(w) GET_VALUE_AT(w,0xfff<<20,20)
 #define MCM_ROB_NUMBER(w) GET_VALUE_AT(w,0x7,28)
 #define MCM_EVENT_COUNTER(w) GET_VALUE_AT(w,0x00fffff,4)
 #define MCM_ADCMASK_VAL(w) GET_VALUE_AT(w,0x1fffff,4)
+#define MCM_ADCMASK_NADC(w) GET_VALUE_AT(w,0x1f,25)
+
+#define MCM_DUMMY_ADCMASK_VAL 0x015fffffc  // updated 
+//#define MCM_DUMMY_ADCMASK_VAL 0x001fffffc 
+#define ADCDATA_VAL1 0x2  // updated 
+#define ADCDATA_VAL2 0x3  // updated 
 
-//this should give 0x1fffff as a mask
-#define MCM_DUMMY_ADCMASK_VAL 0x001fffffc 
 //--------------------------------------------------------
 
 #define MAX_TRACKLETS_PERHC 256 // max number of tracklets per HC - large number for now
 //--------------------------------------------------------
 #define ADC_WORD_MASK(w) ((w) & 0x3)
 //--------------------------------------------------------
+
+
 ClassImp(AliTRDrawStreamTB)
 
 Bool_t AliTRDrawStreamTB::fgExtraSkip = kFALSE;
@@ -111,8 +124,11 @@ Bool_t AliTRDrawStreamTB::fgCleanDataOnly = kTRUE;
 Bool_t AliTRDrawStreamTB::fgDebugFlag = kTRUE;
 Bool_t AliTRDrawStreamTB::fgDebugStreamFlag = kFALSE;
 Bool_t AliTRDrawStreamTB::fgStackNumberChecker = kTRUE;
+Bool_t AliTRDrawStreamTB::fgStackLinkNumberChecker = kTRUE;
+Bool_t AliTRDrawStreamTB::fgSkipData = kTRUE;
 TTreeSRedirector *AliTRDrawStreamTB::fgDebugStreamer = 0;
 UInt_t AliTRDrawStreamTB::fgStreamEventCounter = 0;
+UInt_t AliTRDrawStreamTB::fgFirstEquipmentID = 0;
 UInt_t AliTRDrawStreamTB::fgDumpHead = 0;
 Int_t  AliTRDrawStreamTB::fgCommonAdditive = 0;
 Int_t AliTRDrawStreamTB::fgEmptySignals[] = 
@@ -122,7 +138,8 @@ Int_t AliTRDrawStreamTB::fgEmptySignals[] =
   };
 
 AliTRDrawStreamTB::AliTRDrawStreamTB()
-  : TObject()
+  : AliTRDrawStreamBase()
+//: TObject()
   , fSM()
   , fStack(0)
   , fHC(0)
@@ -132,6 +149,7 @@ AliTRDrawStreamTB::AliTRDrawStreamTB()
   , fpBegin(0)
   , fpEnd(0)
   , fWordLength(0)
+  , fEquipmentID(0)
   , fStackNumber(-1)
   , fStackLinkNumber(-1)
   , fhcMCMcounter(0)
@@ -162,7 +180,8 @@ AliTRDrawStreamTB::AliTRDrawStreamTB()
 
 //--------------------------------------------------------
 AliTRDrawStreamTB::AliTRDrawStreamTB(AliRawReader *rawReader)
-  : TObject()
+  : AliTRDrawStreamBase(rawReader)
+//: TObject()
   , fSM()
   , fStack(0)
   , fHC(0)
@@ -172,6 +191,7 @@ AliTRDrawStreamTB::AliTRDrawStreamTB(AliRawReader *rawReader)
   , fpBegin(0)
   , fpEnd(0)
   , fWordLength(0)
+  , fEquipmentID(0)
   , fStackNumber(-1)
   , fStackLinkNumber(-1)
   , fhcMCMcounter(0)
@@ -209,7 +229,8 @@ AliTRDrawStreamTB::AliTRDrawStreamTB(AliRawReader *rawReader)
 //------------------------------------------------------------
 
 AliTRDrawStreamTB::AliTRDrawStreamTB(const AliTRDrawStreamTB& /*st*/)
-  : TObject()
+  : AliTRDrawStreamBase()
+//: TObject()
   , fSM()
   , fStack(0)
   , fHC(0)
@@ -219,6 +240,7 @@ AliTRDrawStreamTB::AliTRDrawStreamTB(const AliTRDrawStreamTB& /*st*/)
   , fpBegin(0)
   , fpEnd(0)
   , fWordLength(0)
+  , fEquipmentID(0)
   , fStackNumber(-1)
   , fStackLinkNumber(-1)
   , fhcMCMcounter(0)
@@ -244,13 +266,14 @@ AliTRDrawStreamTB::AliTRDrawStreamTB(const AliTRDrawStreamTB& /*st*/)
 }
 
 //------------------------------------------------------------
-void AliTRDrawStreamTB::SetRawVersion(Int_t fraw)
+Bool_t AliTRDrawStreamTB::SetRawVersion(Int_t fraw)
 {
   //
   // function provided for backward compatibility
   //
   AliWarning("Raw data version is read from raw data stream! No point of setting it in here.");
   fraw = 0; // avoid warnings
+  return kFALSE;
 }
 
 //------------------------------------------------------------
@@ -563,13 +586,11 @@ AliTRDrawStreamTB::Next()
                      AliError(Form("Super Strange. HC missing at stack %d link %d", fStackNumber, fStackLinkNumber));
                      return kFALSE;
                    }
-                 //if (fgDebugFlag)  AliDebug(2, DumpHCinfoH0(fHC));             
                  if (fHC->fCorrupted == 0)
                    {
                      while (fhcMCMcounter < fHC->fMCMmax)
                        {
                          fMCM = &fHC->fMCMs[fhcMCMcounter];
-                         //if (fgDebugFlag)  AliDebug(2, DumpMCMinfo(fMCM));                                     
                          if (!fMCM)
                            {
                              AliError(Form("Super Strange. HC missing at stack %d link %d atMCMslot %d", 
@@ -578,7 +599,6 @@ AliTRDrawStreamTB::Next()
                            }
                          while(fmcmADCcounter < fMCM->fADCmax)
                            {
-                             //printf("%d %d %d %d\n", fStackNumber, fStackLinkNumber, fhcMCMcounter, fmcmADCcounter);
                              fADC = &fMCM->fADCs[fmcmADCcounter];
                              if (!fADC)
                                {
@@ -587,7 +607,6 @@ AliTRDrawStreamTB::Next()
                                  return kFALSE;
                                }
                              fmcmADCcounter++;
-                             //printf("ADC count %d \n",  fmcmADCcounter);
                              if (fSharedPadsOn)
                                {
                                  return kTRUE;
@@ -598,7 +617,6 @@ AliTRDrawStreamTB::Next()
                                    return kTRUE;
                                }
                            } //while adc in MCM
-                         //printf("MCM count %d \n", fhcMCMcounter);
                          fhcMCMcounter++;
                          // next MCM should go through all active ADCs
                          fmcmADCcounter = 0;
@@ -641,15 +659,30 @@ AliTRDrawStreamTB::NextChamber(AliTRDdigitsManager *digitsManager)
   // Return value is the detector number
   //
 
-  AliTRDdataArrayS *digits = 0;
+  AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
+  AliTRDdataArrayDigits *digits = 0;
   AliTRDdataArrayI *track0 = 0;
   AliTRDdataArrayI *track1 = 0;
   AliTRDdataArrayI *track2 = 0; 
   AliTRDSignalIndex *indexes = 0;
 
+  // Get the ADC baseline
+  Int_t adcBaseline = 0;
+//   if (!AliTRDReconstructor::RecoParam())
+//     {
+//       AliError("RecoParam does not exist\n");
+//       return 0;
+//     }
+//   else 
+//     {
+//       adcBaseline = ((Int_t) AliTRDReconstructor::RecoParam()->GetADCbaseline());
+//     }
+
+  static AliTRDrecoParam * par = AliTRDrecoParam::GetLowFluxParam();
+  adcBaseline = par->GetADCbaseline();
   // Loop through the digits
   Int_t lastdet = -1;
-  Int_t det    = -1;
+  Int_t det     = -1;
   //   Int_t returnDet = -1;
   Int_t it = 0;
   while (Next()) 
@@ -682,10 +715,14 @@ AliTRDrawStreamTB::NextChamber(AliTRDdigitsManager *digitsManager)
            }
 
          // Add a container for the digits of this detector
-         digits = (AliTRDdataArrayS *) digitsManager->GetDigits(det);
-         track0 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,0);
-         track1 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,1);
-         track2 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,2);
+         digits = (AliTRDdataArrayDigits *) digitsManager->GetDigits(det);
+
+          if (digitsManager->UsesDictionaries()) 
+            {
+             track0 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,0);
+             track1 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,1);
+             track2 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,2);
+           }
 
          if (!digits)
            {
@@ -709,9 +746,12 @@ AliTRDrawStreamTB::NextChamber(AliTRDdigitsManager *digitsManager)
          if (digits->GetNtime() == 0) 
            {
              digits->Allocate(rowMax, colMax, ntbins);
-             track0->Allocate(rowMax, colMax, ntbins);
-             track1->Allocate(rowMax, colMax, ntbins);
-             track2->Allocate(rowMax, colMax, ntbins);
+              if (digitsManager->UsesDictionaries()) 
+                {
+                 track0->Allocate(rowMax, colMax, ntbins);
+                 track1->Allocate(rowMax, colMax, ntbins);
+                 track2->Allocate(rowMax, colMax, ntbins);
+               }
            }
 
          indexes = digitsManager->GetIndexes(det);
@@ -722,18 +762,25 @@ AliTRDrawStreamTB::NextChamber(AliTRDdigitsManager *digitsManager)
          if (indexes->IsAllocated() == kFALSE)
            indexes->Allocate(rowMax, colMax, ntbins);
        }
-    
+
+      Char_t padStatus =  cal->GetPadStatus(det, GetCol(), GetRow());
+  
       // ntimebins data are ready to read
       for (it = 0; it < GetNumberOfTimeBins(); it++)
        {
-         if (GetSignals()[it] > 0)
+         if ((GetSignals()[it] - adcBaseline) > 0)
            {
-             digits->SetDataUnchecked(GetRow(), GetCol(), it, GetSignals()[it]);
-             
+             digits->SetDataUnchecked(GetRow(), GetCol(), it, GetSignals()[it] - adcBaseline);
+             if(padStatus)
+               digits->SetPadStatus(GetRow(), GetCol(), it, padStatus);
+                     
              indexes->AddIndexTBin(GetRow(), GetCol(), it);
-             track0->SetDataUnchecked(GetRow(), GetCol(), it, 0);
-             track1->SetDataUnchecked(GetRow(), GetCol(), it, 0);
-             track2->SetDataUnchecked(GetRow(), GetCol(), it, 0);
+              if (digitsManager->UsesDictionaries()) 
+                {
+                 track0->SetDataUnchecked(GetRow(), GetCol(), it, 0);
+                 track1->SetDataUnchecked(GetRow(), GetCol(), it, 0);
+                 track2->SetDataUnchecked(GetRow(), GetCol(), it, 0);
+               }
            }
        } // tbins
     }// while Next()
@@ -779,19 +826,6 @@ AliTRDrawStreamTB::Init()
 
   ResetCounters();
 
-  // in case rawreader manages the mem buffers
-  // lets go for the next buffer
-  if (fRawReader)
-    {
-      Int_t nextBuff = NextBuffer();
-      while (nextBuff != -1)
-       {
-         if (nextBuff > 0)
-           return kTRUE;                 
-         nextBuff = NextBuffer();
-       }
-    }
-
   if (fgDebugStreamFlag == kTRUE)
     {
       if (!fgDebugStreamer)
@@ -811,6 +845,19 @@ AliTRDrawStreamTB::Init()
        }
     }
 
+  // in case rawreader manages the mem buffers
+  // lets go for the next buffer
+  if (fRawReader)
+    {
+      Int_t nextBuff = NextBuffer();
+      while (nextBuff != -1)
+        {
+          if (nextBuff > 0)
+            return kTRUE;
+          nextBuff = NextBuffer();
+        }
+    }
+
   saveDir->cd();
 
   return kTRUE;
@@ -842,7 +889,12 @@ AliTRDrawStreamTB::InitBuffer(void *buffer, UInt_t length)
   //
 
   // not in the pre scan mode
-  fgStreamEventCounter++;
+  //get Equipment ID 
+  if(fgStreamEventCounter == 0) fgFirstEquipmentID = fRawReader->GetEquipmentId();
+  fEquipmentID = fRawReader->GetEquipmentId(); 
+  //fgStreamEventCounter++;
+  if(fEquipmentID == fgFirstEquipmentID) fgStreamEventCounter++;
+
   
   ResetCounters();
 
@@ -989,12 +1041,22 @@ AliTRDrawStreamTB::DecodeSM(void *buffer, UInt_t length)
 
          fHC = &fStack->fHalfChambers[ilink];
 
+          if (fgDebugStreamer)
+            {
+              TTreeSRedirector &cstream = *fgDebugStreamer;
+               cstream << "LINKDataStream"
+                  << "Event=" << fgStreamEventCounter
+                  << ".equipID=" << fEquipmentID
+                  << ".stack=" << fStackNumber
+                  << ".link=" << fStackLinkNumber
+                  << "\n";
+            }
+
+
          if (fSM.fTrackletEnable == kTRUE)
            {
              if (DecodeTracklets() == kFALSE)
                {
-                 //          if (fgWarnError) AliError(Form("--- Decode Tracklets failed. --------------- Link %d of %d", 
-                 //                                        ilink + 1, fStack->fActiveLinks));
                  if (fgDebugStreamer)
                    {
                      TTreeSRedirector &cstream = *fgDebugStreamer;
@@ -1028,40 +1090,31 @@ AliTRDrawStreamTB::DecodeSM(void *buffer, UInt_t length)
          
          if (DecodeHC() == kFALSE)
            {
-//           if (fgWarnError) AliError(Form("--- Decode HC failed. --------------- Link %d of %d", 
-//                                         ilink + 1, fStack->fActiveLinks));
              fSM.fClean = kFALSE;
-             fHC->fCorrupted += 100;
-              if (fHC->fCorrupted < 1111)  SeekEndOfData(); // In case that we met END_OF_TRACKLET_MARKERNEW during DecodeADC() & DecodeMCMheader()
-                                                            // we don't seek ENDOFRAWDATAMARKER
+             if (fgWarnError) 
+               {
+                 AliError(Form("Dumping Words for Debugging Purpose =========================>")); 
+                  DumpWords(fpPos-8, 16); 
+                 AliError(Form("Dumping Done!")); 
+               }
+              if (fHC->fCorrupted < 16)  SeekEndOfData(); // In case that we meet END_OF_TRACKLET_MARKERNEW during ADC data decoding or MCM header decoding
+                                                          // we don't seek ENDOFRAWDATAMARKER
 
              if (fgWarnError) 
                {
                  AliError(Form("Failed HC : %s", DumpHCinfoH0(fHC)));
                  AliError(Form("Failed HC : %s", DumpHCinfoH1(fHC)));
-                 AliError(Form("Debug Event Counter : %d", fgStreamEventCounter)); 
-               }
-             // let us assume that we have the HC data although link mask says different
-             // recovery
-              /* //we don't need to do
-             if (fStackLinkNumber == -1)
-               {
-                 if (fgWarnError) AliWarning("Trying to recover to the right Link Mask.");
-                 ilink -= 1;
+                 AliError(Form("Debug Event Counter : %d\n\n\n", fgStreamEventCounter)); 
                }
-              */
                      
              continue;
              //return kFALSE;
            }
          else
            {
-             // just finish off with the end of data markers
-             SeekEndOfData();
+             SeekEndOfData(); // make sure that finish off with the end of data markers
            }
 
-         //if (fgDebugFlag)  AliDebug(5, Form("++++ Done with link %d of %d", ilink + 1, fStack->fActiveLinks));
-
        } // ilink
     } // istack
 
@@ -1171,7 +1224,6 @@ AliTRDrawStreamTB::SeekNextMCMheader()
 
   while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd )
     {
-      //if (CheckMCMMask(fpPos) == 0)
       if (MCM_HEADER_MASK_ERR(*fpPos) == 0)      
        {
          if (fgWarnError) AliWarning(Form("^^^ Found : Pos 0x%08x : Val 0x%08x", fpPos, *fpPos));
@@ -1197,21 +1249,26 @@ AliTRDrawStreamTB::DecodeTracklets()
   fEndOfTrackletCount = 0;
 
   if (fgDebugFlag)  AliDebug(10, Form("Decode tracklets at 0x%08x : 0x%08x", fpPos, *fpPos));
-  //cout << Form("Decode tracklets..") << endl;;
-  //printf("[I] Tracklet... ? \n");
 
   while ( *fpPos != END_OF_TRACKLET_MARKEROLD && *fpPos != END_OF_TRACKLET_MARKERNEW && fpPos < fpEnd )
     {
 
       if (fgDebugFlag)  AliDebug(10, Form("Tracklet found at 0x%08x : 0x%08x", fpPos, *fpPos));
 
-      //decode tracklets here...
       fLinkTrackletCounter++;
 
       if (fLinkTrackletCounter > MAX_TRACKLETS_PERHC)
        {
          if (fgWarnError) AliWarning(Form("Max number of tracklets exceeded %d > %d. Something is wrong with the input data!", 
                          fLinkTrackletCounter, MAX_TRACKLETS_PERHC));
+          /*
+          if (fgWarnError)
+            {
+              AliError(Form("Dumping Words for Debugging Purpose =========================>"));
+              DumpWords(fpPos-300, 320);
+              AliError(Form("Dumping Done!"));
+            }
+          */
 
          if (fRawReader) fRawReader->AddMajorErrorLog(kTrackletOverflow,"Too many tracklets"); 
          return kFALSE;
@@ -1260,8 +1317,6 @@ AliTRDrawStreamTB::DecodeTracklets()
 
   while ( ( *fpPos == END_OF_TRACKLET_MARKEROLD || *fpPos == END_OF_TRACKLET_MARKERNEW ) && fpPos < fpEnd )
     {
-      //seek non end of tracklets
-      //printf("[I] End of tracklets. \n");
       if (fgDebugFlag)  AliDebug(10, Form("EoTracklets found at 0x%08x : 0x%08x", fpPos, *fpPos));
 
       fEndOfTrackletCount++;
@@ -1270,7 +1325,6 @@ AliTRDrawStreamTB::DecodeTracklets()
 
   if ( fEndOfTrackletCount < 2 )
     {
-      //if (fgWarnError) AliWarning(Form("End of tracklet marker words missing %d", 2 - fEndOfTrackletCount));
       if (fRawReader) fRawReader->AddMajorErrorLog(kEOTrackeltsMissing, "End of tracklets word missing"); 
       return kFALSE;
     }
@@ -1302,24 +1356,24 @@ AliTRDrawStreamTB::IsMCMheaderOK()
   // check the mcm header
   //
 
-  if ( fMCM->fCorrupted > 10 )
+  if ( fMCM->fCorrupted > 1 )
     {
       if (fRawReader) fRawReader->AddMajorErrorLog(kMCMheaderCorrupted,"ADC mask Corrupted"); 
-      if (fgWarnError) AliWarning(Form("Wrong ADC Mask word 0x%08x %s. Error : %d", *fMCM->fPos, DumpMCMadcMask(fMCM), fMCM->fCorrupted));
+      if (fgWarnError) AliWarning(Form("Wrong ADC Mask word 0x%08x %s. Error : %d\n", *fMCM->fPos, DumpMCMadcMask(fMCM), fMCM->fCorrupted));
       return kFALSE;
     }
 
   if ( fMCM->fCorrupted > 0 )
     {
       if (fRawReader) fRawReader->AddMajorErrorLog(kMCMheaderCorrupted,"Corrupted"); 
-      if (fgWarnError) AliWarning(Form("Wrong MCM word 0x%08x %s. Error : %d", *fMCM->fPos, DumpMCMinfo(fMCM), fMCM->fCorrupted));
+      if (fgWarnError) AliWarning(Form("Wrong MCM word 0x%08x %s. Error : %d\n", *fMCM->fPos, DumpMCMinfo(fMCM), fMCM->fCorrupted));
       return kFALSE;
     }
 
   if ( fMCM->fMCM < 0 || fMCM->fMCM > 15 || fMCM->fROB < 0 || fMCM->fROB > 7 ) 
     {
       if (fRawReader) fRawReader->AddMajorErrorLog(kWrongMCMorROB,"Wrong ROB or MCM"); 
-      if (fgWarnError) AliWarning(Form("Wrong fMCM or fROB. %s Skip this data.", DumpMCMinfo(fMCM)));
+      if (fgWarnError) AliWarning(Form("Wrong fMCM or fROB. %s\n", DumpMCMinfo(fMCM)));
       return kFALSE;
     }
 
@@ -1328,6 +1382,39 @@ AliTRDrawStreamTB::IsMCMheaderOK()
 
   return kTRUE;
 }
+
+//------------------------------------------------------------
+Bool_t 
+AliTRDrawStreamTB::IsMCMevCounterOK()
+{
+  //
+  // Check the MCM event counter
+  //
+
+  if (fEventCounter == 0)
+    {
+      fEventCounter = fMCM->fEvCounter;
+    }
+
+  if (fEventCounter < fLastEventCounter)
+    {
+      fMCM->fCorrupted += 2;
+      if (fgWarnError) AliWarning(Form("Event from the past? Current %d Last %d %s. Error : %d\n", fEventCounter, fLastEventCounter, DumpMCMinfo(fMCM), fMCM->fCorrupted));
+      if (fRawReader) fRawReader->AddMajorErrorLog(kMCMeventMissmatch, "Wrong MCM event counter ? Past-Future");
+      return kFALSE;
+    }
+
+  if (fEventCounter != fMCM->fEvCounter)
+    {
+      fMCM->fCorrupted += 2;
+      if (fgWarnError) AliWarning(Form("Event missmatch? FirstMCMs %d ThisMCMs %d %s. Error : %d\n", fEventCounter, fMCM->fEvCounter, DumpMCMinfo(fMCM), fMCM->fCorrupted));
+      if (fRawReader) fRawReader->AddMajorErrorLog(kMCMeventMissmatch, "Wrong MCM event counter ?");
+      return kFALSE;
+    }
+
+  return kTRUE;
+}
+
 //------------------------------------------------------------
 Bool_t 
 AliTRDrawStreamTB::DecodeMCMheader()
@@ -1336,16 +1423,26 @@ AliTRDrawStreamTB::DecodeMCMheader()
   // decode the mcm header
   //
 
-  DecodeMCMheader(fpPos, fMCM);
+  DecodeMCMheader(fpPos, fMCM); 
+  if (fHC->fCorrupted >= 16)
+    {
+      fpPos--; 
+      return kFALSE;
+    }
 
-  fMCM->fROW = fTRDfeeParam->GetPadRowFromMCM(fMCM->fROB, fMCM->fMCM);
+  fMCM->fROW = fTRDfeeParam->GetPadRowFromMCM(fMCM->fROB, fMCM->fMCM); 
 
-  if (fHC->fRawVMajor > 2)
+  if ((fHC->fRawVMajor > 2 && fHC->fRawVMajor <5) || (fHC->fRawVMajor > 31 && fHC->fRawVMajor < 64)) //cover old and new version definition of ZS data
     {
       fpPos++;
       if ( fpPos < fpEnd )
        {
-         DecodeMask(fpPos, fMCM);
+         DecodeMask(fpPos, fMCM); 
+          if (fHC->fCorrupted >= 16)
+            {
+              fpPos--; 
+              return kFALSE;
+            }
          MCMADCwordsWithTbins(fHC->fTimeBins, fMCM);
          fMCM->fAdcDataPos = fpPos + 1;
        }
@@ -1359,7 +1456,7 @@ AliTRDrawStreamTB::DecodeMCMheader()
   else
     {
       UInt_t dummyMask = MCM_DUMMY_ADCMASK_VAL;
-      DecodeMask(&dummyMask, fMCM);
+      DecodeMask(&dummyMask, fMCM); 
       MCMADCwordsWithTbins(fHC->fTimeBins, fMCM);
       fMCM->fAdcDataPos = fpPos + 1;
     }
@@ -1371,39 +1468,12 @@ AliTRDrawStreamTB::DecodeMCMheader()
     }
 
   if (IsMCMheaderOK() == kFALSE)
-    {
-      if (fMCM->fCorrupted >= 1111)
-        {
-         fpPos--; // to prevent DecodeTracklets() fault due to previous fpPos++
-         fHC->fCorrupted += 1111;
-        }
       return kFALSE;
-    }
 
-  if (fEventCounter == 0)
-    {
-      fEventCounter = fMCM->fEvCounter;
-    }
-  
-  if (fEventCounter < fLastEventCounter)
-    {
-      if (fgWarnError) AliWarning(Form("Weird. Event from the past? Current %d Last %d %s", fEventCounter, fLastEventCounter, DumpMCMinfo(fMCM)));
-      if (fRawReader) fRawReader->AddMajorErrorLog(kMCMeventMissmatch, "Wrong MCM event counter ? Past-Future"); 
+  if (IsMCMevCounterOK() == kFALSE) 
       return kFALSE;
-    }
-  
-  if (fEventCounter != fMCM->fEvCounter)
-    {
-      if (fgWarnError) AliWarning(Form("Weird. Event missmatch? %d %s", fEventCounter, DumpMCMinfo(fMCM)));
-      if (fRawReader) fRawReader->AddMajorErrorLog(kMCMeventMissmatch, "Wrong MCM event counter ?"); 
-      return kFALSE;
-    }
-
-  //fLastEventCounter = fEventCounter;
-  //AliInfo(Form("Current MCM %s", DumpMCMinfo(fMCM)));
     
   return kTRUE;
-  //return IsMCMheaderOK();
 }
 
 //------------------------------------------------------------
@@ -1436,8 +1506,6 @@ AliTRDrawStreamTB::IsHCheaderOK()
         if (fgWarnError) AliWarning(Form("Missmatch: Stack in HC header %d HW-stack %d", 
                                       fHC->fStack, fStackNumber));
         if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongStack, "Stack-HWstack");       
-        // Try this for recovery in DecodeSM(void*,UInt_t) after DecodeHC failed
-        // buffer will still will be marked as NOT clean
         fStackNumber = -1;
         return kFALSE;
      }
@@ -1450,15 +1518,17 @@ AliTRDrawStreamTB::IsHCheaderOK()
       return kFALSE;
     }
 
-  if ((fHC->fLayer * 2 != fStackLinkNumber) && (fHC->fLayer * 2 != fStackLinkNumber - 1)) 
+  if (fgStackLinkNumberChecker)
     {
-      if (fgWarnError) AliWarning(Form("Missmatch: plane(layer) in HCheader %d HW-Link %d | %s", 
-                                      fHC->fLayer, fStackLinkNumber, DumpStackInfo(fStack)));
-      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongLayer, "Plane-Link missmatch"); 
-      // Try this for recovery in DecodeSM(void*,UInt_t) after DecodeHC failed
-      // buffer will still will be marked as NOT clean
-      fStackLinkNumber = -1;
-      return kFALSE;      
+
+      if ((fHC->fLayer * 2 != fStackLinkNumber) && (fHC->fLayer * 2 != fStackLinkNumber - 1)) 
+        {
+          if (fgWarnError) AliWarning(Form("Missmatch: plane(layer) in HCheader %d HW-Link %d | %s", 
+                                      fHC->fLayer, fStackLinkNumber, DumpStackInfo(fStack)));
+          if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongLayer, "Plane-Link missmatch"); 
+          fStackLinkNumber = -1;
+          return kFALSE;      
+        }
     }
 
   if (fHC->fSide < 0 || fHC->fSide > 1)
@@ -1554,6 +1624,7 @@ AliTRDrawStreamTB::DecodeHCheader()
   fHC->fDET = -1;
   if (IsHCheaderOK() == kFALSE)
     {
+      if(fHC->fCorrupted < 1) fHC->fCorrupted +=4;
       return kFALSE;
     }
   
@@ -1578,7 +1649,7 @@ AliTRDrawStreamTB::DecodeHC()
                  << "Event=" << fgStreamEventCounter
                  << ".stack=" << fStackNumber
                  << ".link=" << fStackLinkNumber
-                 << ".hcCorrupted" << fHC->fCorrupted
+                 << ".hcCorrupted=" << fHC->fCorrupted
                  << ".hcRVmajor=" << fHC->fRawVMajor
                  << ".hcDCSboard=" << fHC->fDCSboard
                  << ".hcSM=" << fHC->fSM
@@ -1591,8 +1662,8 @@ AliTRDrawStreamTB::DecodeHC()
                  << ".hcPreTrigPh=" << fHC->fPreTriggerPhase
                  << ".hcDet=" << fHC->fDET
                  << ".hcROC=" << fHC->fROC
-                 << ".hc=RowMax" << fHC->fRowMax
-                 << ".hc=ColMax" << fHC->fColMax
+                 << ".hcRowMax=" << fHC->fRowMax
+                 << ".hcColMax=" << fHC->fColMax
                  << "\n";
        }
       
@@ -1652,7 +1723,8 @@ AliTRDrawStreamTB::DecodeHC()
                      << "\n";
            }
          
-         return kFALSE;
+         if (fgSkipData == kTRUE || fHC->fCorrupted >= 16) 
+            return kFALSE; //if(true), keep reading next words even previous words were corrupted - debugging purpose 
        }
 
       fHC->fMCMmax++;
@@ -1665,8 +1737,10 @@ AliTRDrawStreamTB::DecodeHC()
              if (fgDebugFlag)  AliDebug(9, Form("Buffer short of data. ADC data expected."));    
              if (fRawReader) fRawReader->AddMajorErrorLog(kADCdataMissing, "ADC data missing"); 
            }
-         
-         //      for (Int_t iadc = 0; iadc < TRD_MAX_ADC; iadc++)
+
+          unsigned long randVal, iniVal, expectedVal;
+          Int_t endbits = ENDBITS;
+
          for (Int_t iadc = 0; iadc < fMCM->fADCmax; iadc++)
            {
              fADC = &fMCM->fADCs[iadc];
@@ -1680,13 +1754,14 @@ AliTRDrawStreamTB::DecodeHC()
                  if (fgDebugStreamer)
                    {
                      TTreeSRedirector &cstream = *fgDebugStreamer;
-                     // means no data read
                      Int_t ierr = -99;
                      cstream << "ADCDecodeError"
                              << "Event=" << fgStreamEventCounter
                              << ".hcSM=" << fHC->fSM
                              << ".hcStack=" << fHC->fStack
                              << ".hcLayer=" << fHC->fLayer
+                              << ".hcSide=" << fHC->fSide
+                              << ".hcDet=" << fHC->fDET
                              << ".mcmROB=" << fMCM->fROB
                              << ".mcmMCM=" << fMCM->fMCM
                              << ".mcmADCMaskWord=" << fMCM->fADCMaskWord
@@ -1703,48 +1778,122 @@ AliTRDrawStreamTB::DecodeHC()
                  return kFALSE;
                }
 
-             //DECODE the data here
-             if (DecodeADC() == kFALSE)
-               {
-                 // check if we are out of the det when the pad is shared
-                 if (fADC->fIsShared && fADC->fCorrupted == 111)
+              if (fHC->fRawVMajor < 64) // normal(real) ADC data
+                {
+                 if (DecodeADC() == kFALSE)
                    {
-                     fADC->fCOL = -1;
-                     fpPos = fADC->fPos + fMCM->fSingleADCwords;
-                   }
-                  else if(fADC->fCorrupted >= 1111)
-                    {
-                      fHC->fCorrupted += 1111;
-                      return kFALSE;
-                    }
-                 else
-                   {
-                     if (fgWarnError) AliWarning(Form("ADC decode failed."));
-                     //fpPos = fMCM->fPpos + fMCMADCWords;
-
-                     if (fgDebugStreamer)
-                       {
-                         TTreeSRedirector &cstream = *fgDebugStreamer;
-                         cstream << "ADCDecodeError"
-                                 << "Event=" << fgStreamEventCounter
+                    // check if we are out of the det when the pad is shared
+                     if (fADC->fIsShared && fADC->fCorrupted == 4)
+                       {
+                         fADC->fCOL = -1;
+                         fpPos = fADC->fPos + fMCM->fSingleADCwords;
+                       }
+                     else
+                       {
+                         if (fgWarnError) AliWarning(Form("ADC decode failed."));
+
+                         if (fgDebugStreamer)
+                           {
+                             TTreeSRedirector &cstream = *fgDebugStreamer;
+                             cstream << "ADCDecodeError"
+                                 << "Event=" << fgStreamEventCounter
                                  << ".hcSM=" << fHC->fSM
                                  << ".hcStack=" << fHC->fStack
                                  << ".hcLayer=" << fHC->fLayer
+                                  << ".hcSide=" << fHC->fSide
+                                  << ".hcDet=" << fHC->fDET
                                  << ".mcmROB=" << fMCM->fROB
                                  << ".mcmMCM=" << fMCM->fMCM
                                  << ".mcmADCMaskWord=" << fMCM->fADCMaskWord
                                  << ".adcErr=" << fADC->fCorrupted
                                  << ".adcNumber=" << fADC->fADCnumber
                                  << "\n";                      
-                       }
+                           }
+                          if (fHC->fCorrupted < 16)
+                           fpPos = fADC->fPos + fMCM->fSingleADCwords;
 
-                     fpPos = fADC->fPos + fMCM->fSingleADCwords;
-                     return kFALSE;
+                         if (fgSkipData == kTRUE || fHC->fCorrupted >= 16) 
+                             return kFALSE; //if(true), keep reading next words even previous words were corrupted - debugging purpose 
+                       }
                    }
-               }
-             //decode the ADC words here
-           }     
-       } //mcm data present
+                } 
+              else // test pattern data
+                {
+                  if (fHC->fRawVMajorOpt == 1) //test pattern 1
+                    {
+                      Int_t iCpu = iadc/5;
+                      if(iadc==20) iCpu = 3;
+                      if(iadc%5==0 && iadc!=20) randVal = (1 << 9) | (fMCM->fROB << 6) | (fMCM->fMCM << 2) | iCpu;
+                      if (DecodeADCTP1(&randVal,&endbits) == kFALSE)
+                        {
+                          if (fgWarnError) AliWarning(Form("Summary: Test Pattern ADC data are corrupted in channel %d %s\n", iadc, DumpMCMinfo(fMCM)));
+                          if (fgDebugStreamer)
+                            {
+                              TTreeSRedirector &cstream = *fgDebugStreamer;
+                              cstream << "ADCDecodeError"
+                                  << "Event=" << fgStreamEventCounter
+                                  << ".hcSM=" << fHC->fSM
+                                  << ".hcStack=" << fHC->fStack
+                                  << ".hcLayer=" << fHC->fLayer
+                                  << ".hcSide=" << fHC->fSide
+                                  << ".hcDet=" << fHC->fDET
+                                  << ".mcmROB=" << fMCM->fROB
+                                  << ".mcmMCM=" << fMCM->fMCM
+                                  << ".mcmADCMaskWord=" << fMCM->fADCMaskWord
+                                  << ".adcErr=" << fADC->fCorrupted
+                                  << ".adcNumber=" << fADC->fADCnumber
+                                  << "\n";
+                            }
+                          if (fHC->fCorrupted < 16)
+                           fpPos = fADC->fPos + fMCM->fSingleADCwords;
+
+                         if (fgSkipData == kTRUE || fHC->fCorrupted >= 16) 
+                            return kFALSE; //if(true), keep reading next words even previous words were corrupted - debugging purpose 
+                        }
+                    }
+
+                  if (fHC->fRawVMajorOpt == 2 || fHC->fRawVMajorOpt == 3) //test pattern 2 or 3
+                    {
+                     iniVal = (fHC->fSM << 6) | (fHC->fStack << 0) | (fHC->fLayer << 3);
+                     iniVal = iniVal + 0x49;
+                     iniVal = (iniVal << 9) | (fMCM->fROB << 6) | (fMCM->fMCM << 2) | (fMCM->fEvCounter << 20);
+                      Int_t iCpu = iadc/5;
+                      if (iadc==20) iCpu = 3;
+                      if (iadc%5==0 && iadc!=20)
+                        {
+                          if (fHC->fRawVMajorOpt == 2) { expectedVal = ((iniVal | iCpu) << 6) + 1; };
+                          if (fHC->fRawVMajorOpt == 3) { expectedVal = iniVal | iCpu; };
+                        }
+                      if (DecodeADCTP23(&expectedVal) == kFALSE)
+                        {
+                          if (fgWarnError) AliWarning(Form("Summary: Test Pattern ADC data are corrupted in channel %d %s\n", iadc, DumpMCMinfo(fMCM)));
+                          if (fgDebugStreamer)
+                            {
+                              TTreeSRedirector &cstream = *fgDebugStreamer;
+                              cstream << "ADCDecodeError"
+                                  << "Event=" << fgStreamEventCounter
+                                  << ".hcSM=" << fHC->fSM
+                                  << ".hcStack=" << fHC->fStack
+                                  << ".hcLayer=" << fHC->fLayer
+                                  << ".hcSide=" << fHC->fSide
+                                  << ".hcDet=" << fHC->fDET
+                                  << ".mcmROB=" << fMCM->fROB
+                                  << ".mcmMCM=" << fMCM->fMCM
+                                  << ".mcmADCMaskWord=" << fMCM->fADCMaskWord
+                                  << ".adcErr=" << fADC->fCorrupted
+                                  << ".adcNumber=" << fADC->fADCnumber
+                                  << "\n";
+                            }
+                          if (fHC->fCorrupted < 16)
+                           fpPos = fADC->fPos + fMCM->fSingleADCwords;
+
+                         if (fgSkipData == kTRUE || fHC->fCorrupted >= 16) 
+                            return kFALSE; //if(true), keep reading next words even previous words were corrupted - debugging purpose 
+                        }
+                    }
+                }
+           } 
+       } 
       else
        {
          fpPos++;
@@ -1754,14 +1903,13 @@ AliTRDrawStreamTB::DecodeHC()
   if (fpPos >= fpEnd)
     {
       if (fgWarnError) AliWarning("We are at the end of buffer. There should be one more word left.");
-      //SeekEndOfData();  
       return kFALSE;
     }
 
   return kTRUE;
 }
-
 //------------------------------------------------------------
+
 Bool_t
 AliTRDrawStreamTB::DecodeADC()
 {
@@ -1770,16 +1918,11 @@ AliTRDrawStreamTB::DecodeADC()
   //
 
   fADC->fCorrupted = 0;
-  fMaskADCword = ADC_WORD_MASK(*fpPos);
-  fADC->fPos = fpPos;
-
-  if (*fpPos == END_OF_TRACKLET_MARKERNEW) // To read properly ZS data corrupted in this way
-    {
-      if (fgWarnError) AliError(Form("There should be ADC data. We met END_OF_TRACKLET_MARKER 0x%08x",*fpPos));
-      fADC->fCorrupted += 1111;
-      return kFALSE;
-    }
+  //fMaskADCword = ADC_WORD_MASK(*fpPos);
+  if(fADC->fADCnumber%2==1) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL1);
+  if(fADC->fADCnumber%2==0) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL2);
 
+  fADC->fPos = fpPos;
   fTbinADC = 0;
 
   for (Int_t i = 0; i < TRD_MAX_TBINS; i++)
@@ -1787,14 +1930,23 @@ AliTRDrawStreamTB::DecodeADC()
 
   for (Int_t iw = 0; iw < fMCM->fSingleADCwords; iw++)
     {
+      if (HC_HEADER_MASK_ERR(*fpPos) == 0 || *fpPos == END_OF_TRACKLET_MARKERNEW)
+        {
+          if (fgWarnError) AliError(Form("There should be ADC data. We meet HC header or END_OF_TRACKLET_MARKER 0x%08x",*fpPos));
+          fADC->fCorrupted += 16; 
+          fHC->fCorrupted += 16; 
+          fpPos--;
+
+          return kFALSE;
+        }
       if (fMaskADCword != ADC_WORD_MASK(*fpPos))
        {
-         //this is corrupted data
          fADC->fCorrupted += 1;
-         if (fgWarnError) AliWarning(Form("Mask Change in ADC data Previous word (%d) : 0x%08x Previous mask : 0x%08x Current word(%d) : 0x%08x Current mask : 0x%08x", 
-                                          iw - 1, *(fpPos-1), fMaskADCword, iw, *fpPos, ADC_WORD_MASK(*fpPos)));
+          if (fgWarnError) AliWarning(Form("Wrong ADC data mask! ADC channel number: %02d [Expected mask: 0x%08x  Current mask: 0x%08x] MCM= %s Error : %d",
+                                           fADC->fADCnumber, fMaskADCword, ADC_WORD_MASK(*fpPos),DumpMCMinfo(fMCM),fADC->fCorrupted));
+         //if (fgWarnError) AliWarning(Form("Mask Change in ADC data Previous word (%d) : 0x%08x Previous mask : 0x%08x Current word(%d) : 0x%08x Current mask : 0x%08x", 
+         //                               iw - 1, *(fpPos-1), fMaskADCword, iw, *fpPos, ADC_WORD_MASK(*fpPos)));
          if (fRawReader) fRawReader->AddMajorErrorLog(kADCmaskMissmatch, "Mask change inside single channel"); 
-
          break;
        }
 
@@ -1833,8 +1985,7 @@ AliTRDrawStreamTB::DecodeADC()
     {
       if (fADC->fIsShared == kFALSE)
        {
-         fADC->fCorrupted += 100;
-
+         fADC->fCorrupted += 2;
          if (fgWarnError) AliWarning(Form("Wrong column! ADCnumber %d MaxIs %d Col %d MaxIs %d MCM= %s", 
                                           fADC->fADCnumber, fMaxADCgeom, fADC->fCOL, fHC->fColMax, DumpMCMinfo(fMCM)));
          if (fRawReader) fRawReader->AddMajorErrorLog(kWrongPadcolumn, "Wrong column");          
@@ -1844,7 +1995,7 @@ AliTRDrawStreamTB::DecodeADC()
          // flag it - we are out of the det when the pad is shared
          if (fgDebugFlag) AliDebug(10, Form("Column out of the detector! ADCnumber %d MaxIs %d Col %d MaxIs %d MCM= %s", 
                                             fADC->fADCnumber, fMaxADCgeom, fADC->fCOL, fHC->fColMax, DumpMCMinfo(fMCM)));
-         fADC->fCorrupted += 111;
+         fADC->fCorrupted += 4;
        }
     }
 
@@ -1856,8 +2007,176 @@ AliTRDrawStreamTB::DecodeADC()
   fDecodedADCs++;
   return kTRUE;
 }
+//------------------------------------------------------------
+
+Bool_t
+AliTRDrawStreamTB::DecodeADCTP1(unsigned long *randVal, Int_t *endbits)
+{
+  //
+  // decode test pattern ADC channel
+  //
+
+  unsigned long expected;
+
+  fADC->fCorrupted = 0;
+  fADC->fPos = fpPos;
+  fTbinADC = 0;
+
+  for (Int_t i = 0; i < TRD_MAX_TBINS; i++)
+     fADC->fSignals[i] = 0;
+
+  for (Int_t iw = 0; iw < fMCM->fSingleADCwords; iw++)
+     {
+       if (HC_HEADER_MASK_ERR(*fpPos) == 0 || *fpPos == END_OF_TRACKLET_MARKERNEW)
+         {
+           if (fgWarnError) AliError(Form("There should be ADC data. We meet HC header or END_OF_TRACKLET_MARKER 0x%08x",*fpPos));
+           fADC->fCorrupted += 16; 
+           fHC->fCorrupted += 16; 
+           fpPos--;
+
+           return kFALSE;
+         }
+       expected = (AdvancePseudoRandom(randVal) << 2) | *endbits;
+       expected |= AdvancePseudoRandom(randVal) << 12;
+       expected |= AdvancePseudoRandom(randVal) << 22;
+       if (*fpPos != expected)
+         {
+           if (fgWarnError) AliError(Form("Error: fpPos=%d, size=%d, found=0x%08lx, expected=0x%08lx",iw, fMCM->fSingleADCwords, *fpPos, expected));
+           fADC->fCorrupted += 32; //test pattern corrupted
+         }
+       fADC->fSignals[fTbinADC + 0] = ((*fpPos & 0x00000ffc) >>  2);
+       fADC->fSignals[fTbinADC + 1] = ((*fpPos & 0x003ff000) >> 12);
+       fADC->fSignals[fTbinADC + 2] = ((*fpPos & 0xffc00000) >> 22);
+
+       fTbinADC += 3;
+       fpPos++;
+     }
+  *endbits = *endbits ^ 0x01;
+
+  if (fADC->fADCnumber <= 1 || fADC->fADCnumber == fMaxADCgeom - 1)
+    {
+      fADC->fIsShared = kTRUE;
+    }
+  else
+    {
+      fADC->fIsShared = kFALSE;
+    }
+
+  if ( fADC->fADCnumber >= fMaxADCgeom - 1)
+    {
+      fADC->fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber - 1);
+      fADC->fCOL--;
+    }
+  else
+    {
+      fADC->fCOL = fTRDfeeParam->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber);
+    }
+
+  if (fADC->fCorrupted > 0)
+    {
+      return kFALSE;
+    }
+
+  fDecodedADCs++;
+  return kTRUE;
+}
+//--------------------------------------------------------
+
+Bool_t
+AliTRDrawStreamTB::DecodeADCTP23(unsigned long *expected)
+{
+  //
+  // decode test pattern ADC channel
+  //
+
+  fADC->fCorrupted = 0;
+  fADC->fPos = fpPos;
+  fTbinADC = 0;
+
+  for (Int_t i = 0; i < TRD_MAX_TBINS; i++)
+     fADC->fSignals[i] = 0;
+
+  for (Int_t iw = 0; iw < fMCM->fSingleADCwords; iw++)
+     {
+       if (*fpPos == END_OF_TRACKLET_MARKERNEW)
+         {
+           if (fgWarnError) AliError(Form("There should be ADC data. We meet END_OF_TRACKLET_MARKER 0x%08x",*fpPos));
+           fADC->fCorrupted += 16; 
+           fHC->fCorrupted += 16; 
+           fpPos--;
+
+           return kFALSE;
+         }
+       if (*fpPos != *expected)
+         {
+           if (fgWarnError) 
+             {
+               if (fHC->fRawVMajorOpt == 2)
+                 {
+                   AliError(Form("Error: fpPos=%d, size=%d, found=0x%08lx, expected=0x%08lx",iw, fMCM->fSingleADCwords, *fpPos, *expected));
+                   AliError(Form("Found ev.cnt. %ld, expected %ld",   (*fpPos >> 26),            (*expected >> 26)));
+                   AliError(Form("Found sector  %ld, expected %ld",   (*fpPos >> 21) & 0x1f - 1, (*expected >> 21) & 0x1f - 1));
+                   AliError(Form("Found layer   %ld, expected %ld",   (*fpPos >> 18) & 0x07 - 1, (*expected >> 18) & 0x07 - 1));
+                   AliError(Form("Found chamber %ld, expected %ld",   (*fpPos >> 15) & 0x07 - 1, (*expected >> 15) & 0x07 - 1));
+                   AliError(Form("Found ROB     %ld, expected %ld",   (*fpPos >> 12) & 0x07,     (*expected >> 12) & 0x07));
+                   AliError(Form("Found MCM     %ld, expected %ld",   (*fpPos >>  8) & 0x0f,     (*expected >>  8) & 0x0f));
+                   AliError(Form("Found CPU     %ld, expected %ld",   (*fpPos >>  6) & 0x03,     (*expected >>  6) & 0x03));
+                   AliError(Form("Found counter %ld, expected %ld\n", (*fpPos >>  0) & 0x3f,     (*expected >>  0) & 0xf));
+                 } 
+               if (fHC->fRawVMajorOpt == 3)
+                 {
+                   AliError(Form("Error: fpPos=%d, size=%d, found=0x%08lx, expected=0x%08lx",iw, fMCM->fSingleADCwords, *fpPos, *expected));
+                   AliError(Form("Found ev.cnt. %ld, expected %ld",   (*fpPos >> 20),            (*expected >> 20)));
+                   AliError(Form("Found sector  %ld, expected %ld",   (*fpPos >> 15) & 0x1f - 1, (*expected >> 15) & 0x1f - 1));
+                   AliError(Form("Found layer   %ld, expected %ld",   (*fpPos >> 12) & 0x07 - 1, (*expected >> 12) & 0x07 - 1));
+                   AliError(Form("Found chamber %ld, expected %ld",   (*fpPos >>  9) & 0x07 - 1, (*expected >>  9) & 0x07 - 1));
+                   AliError(Form("Found ROB     %ld, expected %ld",   (*fpPos >>  6) & 0x07,     (*expected >>  6) & 0x07));
+                   AliError(Form("Found MCM     %ld, expected %ld",   (*fpPos >>  2) & 0x0f,     (*expected >>  2) & 0x0f));
+                   AliError(Form("Found CPU     %ld, expected %ld\n", (*fpPos >>  0) & 0x03,     (*expected >>  0) & 0x03));
+                 } 
+
+             }
+           fADC->fCorrupted += 32; //test pattern corrupted
+         }
+       fADC->fSignals[fTbinADC + 0] = ((*fpPos & 0x00000ffc) >>  2);
+       fADC->fSignals[fTbinADC + 1] = ((*fpPos & 0x003ff000) >> 12);
+       fADC->fSignals[fTbinADC + 2] = ((*fpPos & 0xffc00000) >> 22);
+
+       fTbinADC += 3;
+       fpPos++;
+       if (fHC->fRawVMajorOpt == 2) (*expected)++; 
+     }
+
+  if (fADC->fADCnumber <= 1 || fADC->fADCnumber == fMaxADCgeom - 1)
+    {
+      fADC->fIsShared = kTRUE;
+    }
+  else
+    {
+      fADC->fIsShared = kFALSE;
+    }
 
+  if ( fADC->fADCnumber >= fMaxADCgeom - 1)
+    {
+      fADC->fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber - 1);
+      fADC->fCOL--;
+    }
+  else
+    {
+      fADC->fCOL = fTRDfeeParam->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber);
+    }
+
+  if (fADC->fCorrupted > 0)
+    {
+      return kFALSE;
+    }
+
+  fDecodedADCs++;
+  return kTRUE;
+}
 //--------------------------------------------------------
+
+
 void AliTRDrawStreamTB::DecodeSMInfo(const UInt_t *word, struct AliTRDrawSM *sm) const
 {
   //
@@ -1972,6 +2291,7 @@ void AliTRDrawStreamTB::DecodeHCwordH0(const UInt_t *word, struct AliTRDrawHC *h
 
   hc->fSpecialRawV =  HC_SPECIAL_RAW_VERSION(vword);
   hc->fRawVMajor = HC_MAJOR_RAW_VERSION(vword);
+  hc->fRawVMajorOpt = HC_MAJOR_RAW_VERSION_OPT(vword); 
   hc->fRawVMinor = HC_MINOR_RAW_VERSION(vword);
   hc->fNExtraWords = HC_EXTRA_WORDS(vword);
   hc->fDCSboard = HC_DCS_BOARD(vword);
@@ -1994,8 +2314,8 @@ void AliTRDrawStreamTB::DecodeHCwordH1(const UInt_t *word, struct AliTRDrawHC *h
   // do it once here
   UInt_t vword = *word;
 
-  hc->fCorrupted += 10 * HC_HEADER_MASK_ERR(vword);
-  if (hc->fCorrupted > 10)
+  hc->fCorrupted += 2 * HC_HEADER_MASK_ERR(vword);
+  if (hc->fCorrupted >= 2)
     {
       hc->fH1ErrorCounter++;
     }
@@ -2041,22 +2361,20 @@ void AliTRDrawStreamTB::DecodeMCMheader(const UInt_t *word, struct AliTRDrawMCM
   // decode the mcm header
   //
 
-  // do it once here
   UInt_t vword = *word;
 
-  mcm->fCorrupted = MCM_HEADER_MASK_ERR(vword);
-  //printf("0x%08x %d\n", word, MCM_HEADER_MASK_ERR(vword));
-  if (vword == END_OF_TRACKLET_MARKERNEW) // To read properly ZS data corrupted in this way
+  if (vword == END_OF_TRACKLET_MARKERNEW) 
     {
-      if (fgWarnError) AliError(Form("There should be MCM header. We met END_OF_TRACKLET_MARKER 0x%08x",vword));
-      mcm->fCorrupted += 1111;
+      if (fgWarnError) AliError(Form("There should be MCM header. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));
+      mcm->fCorrupted += 16;
+      fHC->fCorrupted += 16; //to finish data reading of this HC
     }
+  mcm->fCorrupted = MCM_HEADER_MASK_ERR(vword); //if MCM header mask has error, set mcm->fCorrupted = 1
   if (mcm->fCorrupted)
     mcm->fErrorCounter++;
   mcm->fROB = MCM_ROB_NUMBER(vword);
   mcm->fMCM = MCM_MCM_NUMBER(vword);
   mcm->fEvCounter = MCM_EVENT_COUNTER(vword);
-
   mcm->fPos = (UInt_t*)word;
 }
 
@@ -2067,24 +2385,30 @@ UInt_t AliTRDrawStreamTB::GetMCMadcMask(const UInt_t *word, struct AliTRDrawMCM
   // get the adc mask
   //
 
-  // do it once here
   UInt_t vword = *word;
 
-  mcm->fADCindex = 0;
-  mcm->fADCmax   = 0;
-  mcm->fADCMask  = 0;
+  mcm->fADCindex  = 0;
+  mcm->fADCmax    = 0;
+  mcm->fADCMask   = 0;
+  mcm->fADCcount  = 0;
   mcm->fADCMaskWord = vword;
-  //memset(mcm->fADCchannel, 0, sizeof(UInt_t) * 30);
-  //if ((word & 0x0000000F) == 0x0000000C)
+
+  if (vword == END_OF_TRACKLET_MARKERNEW)
+    {
+      if (fgWarnError) AliError(Form("There should be MCMadcMask. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));
+      mcm->fCorrupted += 16;
+      fHC->fCorrupted += 16; //to finish data reading of this HC
+    }
+
   if ( MCM_ADCMASK_MASK_ERR(vword) == 0 )
     {
-      //mcm->fADCMask = (word >> 4) & skADCmaskBits;
-      mcm->fADCMask = MCM_ADCMASK_VAL(vword);
+      mcm->fADCMask  = MCM_ADCMASK_VAL(vword);
+      mcm->fADCcount = MCM_ADCMASK_NADC(~vword);
     }
   else
     {
       mcm->fADCMask = 0xffffffff;
-      mcm->fCorrupted += 10;
+      mcm->fCorrupted += 4;
       mcm->fMaskErrorCounter++;
     }
 
@@ -2102,6 +2426,7 @@ void AliTRDrawStreamTB::DecodeMask(const UInt_t *word, struct AliTRDrawMCM *mcm)
   mcm->fSingleADCwords = 0;
   mcm->fADCmax = 0;
   mcm->fADCMask = GetMCMadcMask(word, mcm);
+
   if (mcm->fADCMask > 0)
     {
       for (Int_t i = 0; i < TRD_MAX_ADC; i++)
@@ -2114,6 +2439,10 @@ void AliTRDrawStreamTB::DecodeMask(const UInt_t *word, struct AliTRDrawMCM *mcm)
            }
        }
     }
+  if (mcm->fADCcount != mcm->fADCmax && fHC->fRawVMajor >= 32) // backward compatibility
+    {
+      mcm->fCorrupted += 8; 
+    }
 }
 
 //--------------------------------------------------------
@@ -2130,6 +2459,18 @@ void AliTRDrawStreamTB::MCMADCwordsWithTbins(UInt_t fTbins, struct AliTRDrawMCM
     }
 }
   
+//--------------------------------------------------------
+const unsigned long AliTRDrawStreamTB::AdvancePseudoRandom(unsigned long *val) const
+{
+  //
+  // pseudo random number generator for test pattern data
+  //
+  unsigned long currentVal = *val;
+
+  *val = ( (*val << 1) | (((*val >> 9) ^ (*val >> 6)) & 1) ) & 0x3FF;
+  return currentVal;
+}
+
 //--------------------------------------------------------
 const char *AliTRDrawStreamTB::DumpMCMinfo(const struct AliTRDrawMCM *mcm)
 {