]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Bug detail:
authorcblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 27 Jul 2009 08:41:49 +0000 (08:41 +0000)
committercblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 27 Jul 2009 08:41:49 +0000 (08:41 +0000)
In case we use NextChamber(,..) function(which we does in our normal
reconstruction) in the current reader, we are missing the first ADC
channel data of every chamber except for the first chamber of a
supermodule. It happened since we use this first channel to check if we
meet new chamber without iterating back in case we return new chamber.
Theodor, once it is in svn, could you again compare the output of this
reader to those of HLTstreamer, and let me know if you still see the
problme? Thanks.

TRD/AliTRDrawStream.cxx

index 87cad550244b87e34a52054f3316b5bbc46b7429..bee76b0226c46b7d1434788e4a4eea8d5d3f7f8d 100644 (file)
-/**************************************************************************\r\r
-* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r\r
-q*                                                                        *\r\r
-* Author: The ALICE Off-line Project.                                    *\r\r
-* Contributors are mentioned in the code where appropriate.              *\r\r
-*                                                                        *\r\r
-* Permission to use, copy, modify and distribute this software and its   *\r\r
-* documentation strictly for non-commercial purposes is hereby granted   *\r\r
-* without fee, provided that the above copyright notice appears in all   *\r\r
-* copies and that both the copyright notice and this permission notice   *\r\r
-* appear in the supporting documentation. The authors make no claims     *\r\r
-* about the suitability of this software for any purpose. It is          *\r\r
-* provided "as is" without express or implied warranty.                  *\r\r
-**************************************************************************/\r\r
-\r\r
-/* $Id: AliTRDrawStream.cxx 27797 2008-08-05 14:37:22Z cblume $ */\r\r
-\r\r
-///////////////////////////////////////////////////////////////////////////////\r\r
-//                                                                           //\r\r
-// This class provides access to TRD digits in raw data.                     //\r\r
-//                                                                           //\r\r
-// It loops over all TRD digits in the raw data given by the AliRawReader.   //\r\r
-// The Next method goes to the next digit. If there are no digits left       //\r\r
-// it returns kFALSE.                                                        //\r\r
-// Several getters provide information about the current digit.              //\r\r
-//                                                                           //\r\r
-// Author: M. Ploskon (ploskon@ikf.uni-frankfurt.de)                         //\r\r
-//                                                                           //\r\r
-///////////////////////////////////////////////////////////////////////////////\r\r
-\r\r
-#include "TString.h"\r\r
-#include "TFile.h"\r\r
-#include "TTreeStream.h"\r\r
-\r\r
-#include "AliTRDrawStream.h"\r\r
-#include "AliTRDgeometry.h"\r\r
-#include "AliTRDfeeParam.h"\r\r
-#include "AliTRDdigitsManager.h"\r\r
-#include "AliTRDarrayDictionary.h"\r\r
-#include "AliTRDarrayADC.h"\r\r
-#include "AliTRDSignalIndex.h"\r\r
-//#include "AliTRDcalibDB.h" \r\r
-//#include "Cal/AliTRDCalPadStatus.h" //is now read in clusterizer\r\r
-#include "AliTRDrawTPStream.h"\r\r
-\r\r
-#include "AliLog.h"\r\r
-#include "AliRawReader.h"\r\r
-\r\r
-#define END_OF_TRACKLET_MARKEROLD 0xaaaaaaaa\r\r
-#define END_OF_TRACKLET_MARKERNEW 0x10001000\r\r
-#define ENDOFRAWDATAMARKER 0x00000000\r\r
-#define WORD_SIZE sizeof(UInt_t)           // size of a word in bytes\r\r
-#define EXTRA_LEAD_WORDS 24\r\r
-#define CDH_WORDS 8\r\r
-\r\r
-#define IS_BIT_SET(w,b) ( ((w) >> (b)) & 0x1 ) // 1 if bit b is set in word w\r\r
-#define GET_VALUE_AT(w,m,s) (( (w) >> (s)) & (m) )      // get value of word w rshifted by s and mask with m\r\r
-\r\r
-// SM index word masks:\r\r
-#define SM_HEADER_SIZE(w) GET_VALUE_AT(w,0xffff,16) \r\r
-#define TRACKLETS_ENABLED(w) IS_BIT_SET(w,5)\r\r
-#define STACK_MASK(w) ((w) & 0x1f)\r\r
-\r\r
-// Stack word masks\r\r
-#define STACK_HEADER_SIZE(w) GET_VALUE_AT(w,0xffff,16)\r\r
-#define STACK_LINK_WORD(w) ((w) & 0xfff)\r\r
-#define LINK0_DATA_TYPE_FLAG(w) (GET_VALUE_AT(w,0x3,4) == (0x0) ? 0 : 1) // 0 if physics data\r\r
-#define LINK1_DATA_TYPE_FLAG(w) (GET_VALUE_AT(w,0x3,20) == (0x0) ? 0 : 1) // 0 if physics data\r\r
-#define LINK0_MONITOR_FLAG(w) (GET_VALUE_AT(w,0xf,0) == (0x0) ? 0 : 1) // 0 if OK\r\r
-#define LINK1_MONITOR_FLAG(w) (GET_VALUE_AT(w,0xf,16) == (0x0) ? 0 : 1) // 0 if OK\r\r
-\r\r
-// HC word masks\r\r
-//#define HC_HEADER_MASK_ERR(w) ( ((w) & (0x80000003)) == (0x80000001) ? 0 : 1) // 0 if OK!!!\r\r
-#define HC_HEADER_MASK_ERR(w) ( ((w) & (0x3)) == (0x1) ? 0 : 1) // 0 if OK!!!\r\r
-\r\r
-// HC word 0\r\r
-#define HC_SPECIAL_RAW_VERSION(w) IS_BIT_SET(w,31)\r\r
-#define HC_MAJOR_RAW_VERSION(w) GET_VALUE_AT(w,0x7f,24)\r\r
-#define HC_MAJOR_RAW_VERSION_OPT(w) GET_VALUE_AT(w,0x7,24)\r\r
-#define HC_MINOR_RAW_VERSION(w) GET_VALUE_AT(w,0x7f,17)\r\r
-#define HC_EXTRA_WORDS(w) GET_VALUE_AT(w,0x7,14)\r\r
-#define HC_DCS_BOARD(w) GET_VALUE_AT(w,0xfff<<20,20)\r\r
-#define HC_SM_NUMBER(w) GET_VALUE_AT(w,0x1f,9)\r\r
-#define HC_LAYER_NUMBER(w) GET_VALUE_AT(w,0x7,6)\r\r
-#define HC_STACK_NUMBER(w) GET_VALUE_AT(w,0x7,3)\r\r
-#define HC_SIDE_NUMBER(w) IS_BIT_SET(w,2)\r\r
-\r\r
-// HC word 1\r\r
-#define HC_NTIMEBINS(w) GET_VALUE_AT(w,0x3f,26)\r\r
-#define HC_BUNCH_CROSS_COUNTER(w) GET_VALUE_AT(w,0xffff,10)\r\r
-#define HC_PRETRIGGER_COUNTER(w) GET_VALUE_AT(w,0xf,6)\r\r
-#define HC_PRETRIGGER_PHASE(w) GET_VALUE_AT(w,0xf,2)\r\r
-\r\r
-// MCM word and ADC mask\r\r
-#define MCM_HEADER_MASK_ERR(w) ( ((w) & (0xf)) == (0xc) ? 0 : 1) // 0 if OK!!!\r\r
-#define MCM_ADCMASK_MASK_ERR(w) ( ((w) & (0xf)) == (0xc) ? 0 : 1) // 0 if OK!!!\r\r
-#define MCM_MCM_NUMBER(w) GET_VALUE_AT(w,0x0f,24)\r\r
-#define MCM_ROB_NUMBER(w) GET_VALUE_AT(w,0x7,28)\r\r
-#define MCM_EVENT_COUNTER(w) GET_VALUE_AT(w,0x00fffff,4)\r\r
-#define MCM_ADCMASK_VAL(w) GET_VALUE_AT(w,0x1fffff,4)\r\r
-#define MCM_ADCMASK_NADC(w) GET_VALUE_AT(w,0x1f,25)\r\r
-\r\r
-#define MCM_DUMMY_ADCMASK_VAL 0x015fffffc  // updated \r\r
-#define ADCDATA_VAL1 0x2  // updated \r\r
-#define ADCDATA_VAL2 0x3  // updated \r\r
-\r\r
-//--------------------------------------------------------\r\r
-#define ADC_WORD_MASK(w) ((w) & 0x3)\r\r
-//--------------------------------------------------------\r\r
-\r\r
-\r\r
-ClassImp(AliTRDrawStream)\r\r
-\r\r
-Bool_t AliTRDrawStream::fgExtraSkip = kFALSE;\r\r
-Bool_t AliTRDrawStream::fgSkipCDH = kFALSE;\r\r
-Bool_t AliTRDrawStream::fgWarnError = kTRUE;\r\r
-Bool_t AliTRDrawStream::fgCleanDataOnly = kFALSE;\r\r
-Bool_t AliTRDrawStream::fgDebugFlag = kTRUE;\r\r
-Bool_t AliTRDrawStream::fgEnableMemoryReset = kTRUE;\r\r
-Bool_t AliTRDrawStream::fgStackNumberChecker = kTRUE;\r\r
-Bool_t AliTRDrawStream::fgStackLinkNumberChecker = kTRUE;\r\r
-Bool_t AliTRDrawStream::fgSkipData = kTRUE;\r\r
-Bool_t AliTRDrawStream::fgEnableDecodeConfigData = kFALSE;\r\r
-Int_t AliTRDrawStream::fgDumpHead = -1;\r\r
-Int_t  AliTRDrawStream::fgCommonAdditive = 0;\r\r
-Int_t AliTRDrawStream::fgEmptySignals[] = \r\r
-  {\r\r
-    -1, -1, -1, -1, -1,  -1, -1, -1, -1, -1,  -1, -1, -1, -1, -1\r\r
-    -1, -1, -1, -1, -1,  -1, -1, -1, -1, -1,  -1, -1, -1, -1, -1\r\r
-  };\r\r
-Short_t AliTRDrawStream::fgMCMordering[] =\r\r
-  {\r\r
-    12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3 \r\r
-  };\r\r
-Short_t AliTRDrawStream::fgROBordering[] =\r\r
-  {\r\r
-    0, 1, 2, 3\r\r
-  };\r\r
-Int_t  AliTRDrawStream::fgLastHC = -1;\r\r
-Int_t  AliTRDrawStream::fgLastROB = -1;\r\r
-Int_t  AliTRDrawStream::fgLastIndex = -1;\r\r
-Bool_t  AliTRDrawStream::fgDumpingEnable = kFALSE;\r\r
-Int_t  AliTRDrawStream::fgDumpingSM = -1;\r\r
-Int_t  AliTRDrawStream::fgDumpingStack = -1;\r\r
-Int_t  AliTRDrawStream::fgDumpingLayer = -1;\r\r
-Int_t  AliTRDrawStream::fgDumpingROB = -1;\r\r
-Int_t  AliTRDrawStream::fgDumpingMCM = -1;\r\r
-\r\r
-\r\r
-AliTRDrawStream::AliTRDrawStream()\r\r
-  : AliTRDrawStreamBase()\r\r
-  , fSM()\r\r
-  , fStack(0)\r\r
-  , fHC(0)\r\r
-  , fMCM(0)\r\r
-  , fADC(0)\r\r
-  , fpPos(0)\r\r
-  , fpBegin(0)\r\r
-  , fpEnd(0)\r\r
-  , fWordLength(0)\r\r
-  , fStackNumber(-1)\r\r
-  , fStackLinkNumber(-1)\r\r
-  , fhcMCMcounter(0)\r\r
-  , fmcmADCcounter(0)\r\r
-  , fLinkTrackletCounter(-1)\r\r
-  , fEndOfTrackletCount(-1)\r\r
-  , fNWordsCounter(-1)\r\r
-  , fMaskADCword(0)\r\r
-  , fTbinADC(0)\r\r
-  , fDecodedADCs(-1)\r\r
-  , fEventCounter(0)\r\r
-  , fLastEventCounter(0)\r\r
-  , fSharedPadsOn(kFALSE)\r\r
-  , fMaxADCgeom(0)\r\r
-  , fBufferRead(0)\r\r
-  , fGeometry(0)\r\r
-  , fRawReader(0)\r\r
-  , fTRDfeeParam(0)\r\r
-{\r\r
-  //\r\r
-  // default constructor\r\r
-  //\r\r
-\r\r
-  if (Init() == kFALSE)\r\r
-    {\r\r
-      AliWarning("Unable to Init.");     \r\r
-    }\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-AliTRDrawStream::AliTRDrawStream(AliRawReader *rawReader)\r\r
-  : AliTRDrawStreamBase(rawReader)\r\r
-  , fSM()\r\r
-  , fStack(0)\r\r
-  , fHC(0)\r\r
-  , fMCM(0)\r\r
-  , fADC(0)\r\r
-  , fpPos(0)\r\r
-  , fpBegin(0)\r\r
-  , fpEnd(0)\r\r
-  , fWordLength(0)\r\r
-  , fStackNumber(-1)\r\r
-  , fStackLinkNumber(-1)\r\r
-  , fhcMCMcounter(0)\r\r
-  , fmcmADCcounter(0)\r\r
-  , fLinkTrackletCounter(-1)\r\r
-  , fEndOfTrackletCount(-1)\r\r
-  , fNWordsCounter(-1)\r\r
-  , fMaskADCword(0)\r\r
-  , fTbinADC(0)\r\r
-  , fDecodedADCs(-1)\r\r
-  , fEventCounter(0)\r\r
-  , fLastEventCounter(0)\r\r
-  , fSharedPadsOn(kFALSE)\r\r
-  , fMaxADCgeom(0)\r\r
-  , fBufferRead(0)\r\r
-  , fGeometry(0)\r\r
-  , fRawReader(rawReader)\r\r
-  , fTRDfeeParam(0)\r\r
-{\r\r
-  //\r\r
-  // default constructor\r\r
-  //\r\r
-  if (fRawReader)\r\r
-    {    \r\r
-      if (Init() == kFALSE)\r\r
-  {\r\r
-    AliWarning("Unable to Init. Try setting up the reader with SetReader or buffer with Init(void *, UInt_t )");         \r\r
-  }\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      AliWarning("Unable to setup reader. Use SetReader(AliRawReader*).");\r\r
-    }\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-\r\r
-AliTRDrawStream::AliTRDrawStream(const AliTRDrawStream& /*st*/)\r\r
-  : AliTRDrawStreamBase()\r\r
-  , fSM()\r\r
-  , fStack(0)\r\r
-  , fHC(0)\r\r
-  , fMCM(0)\r\r
-  , fADC(0)\r\r
-  , fpPos(0)\r\r
-  , fpBegin(0)\r\r
-  , fpEnd(0)\r\r
-  , fWordLength(0)\r\r
-  , fStackNumber(-1)\r\r
-  , fStackLinkNumber(-1)\r\r
-  , fhcMCMcounter(0)\r\r
-  , fmcmADCcounter(0)\r\r
-  , fLinkTrackletCounter(-1)\r\r
-  , fEndOfTrackletCount(-1)\r\r
-  , fNWordsCounter(-1)\r\r
-  , fMaskADCword(0)\r\r
-  , fTbinADC(0)\r\r
-  , fDecodedADCs(-1)\r\r
-  , fEventCounter(0)\r\r
-  , fLastEventCounter(0)\r\r
-  , fSharedPadsOn(kFALSE)\r\r
-  , fMaxADCgeom(0)\r\r
-  , fBufferRead(0)\r\r
-  , fGeometry(0)\r\r
-  , fRawReader(0)\r\r
-  , fTRDfeeParam(0)\r\r
-{\r\r
-  //\r\r
-  // Copy constructor\r\r
-  // \r\r
-  AliError("Not implemeneted.");\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t AliTRDrawStream::SetRawVersion(Int_t fraw)\r\r
-{\r\r
-  //\r\r
-  // function provided for backward compatibility\r\r
-  //\r\r
-  AliWarning("Raw data version is read from raw data stream! No point of setting it in here.");\r\r
-  fraw = 0; // avoid warnings\r\r
-  return kFALSE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-AliTRDrawStream::~AliTRDrawStream()\r\r
-{\r\r
-  //\r\r
-  // destructor\r\r
-  //\r\r
-  delete fGeometry;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-\r\r
-AliTRDrawStream &\r\r
-AliTRDrawStream::operator=(const AliTRDrawStream &)\r\r
-{\r\r
-  //\r\r
-  // we are not using this functionality\r\r
-  //\r\r
-  AliFatal("May not use.");\r\r
-  return *this;\r\r
-}\r\r
-\r\r
-//___________________________________________________________\r\r
-void \r\r
-AliTRDrawStream::SwapOnEndian()\r\r
-{\r\r
-  //\r\r
-  // Check the endian and swap if needed\r\r
-  //\r\r
-  int itemp = 1;\r\r
-  char* ptemp = (char*) &itemp;\r\r
-  if (ptemp[0] != 1)\r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(8, "Swapping.");\r\r
-\r\r
-      fpPos = fpBegin;\r\r
-      UInt_t iutmp = 0;\r\r
-      while (fpPos < fpEnd)\r\r
-  {\r\r
-    fpPos += 1;\r\r
-    iutmp = (((*fpPos & 0x000000ffU) << 24) | ((*fpPos & 0x0000ff00U) <<  8) |\r\r
-      ((*fpPos & 0x00ff0000U) >>  8) | ((*fpPos & 0xff000000U) >> 24));\r\r
-    // here we override the value in the buffer!\r\r
-    *fpPos = iutmp;      \r\r
-  }\r\r
-      fpPos = fpBegin;\r\r
-    }\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t\r\r
-AliTRDrawStream::DumpWords(UInt_t *px, UInt_t iw, UInt_t marker)\r\r
-{\r\r
-    //UInt_t iEnd = iw;\r\r
-    //if ( iw ==0 ) iEnd = (fpEnd - px)/sizeof(UInt_t); // if iw is 0, dump all words\r\r
-\r\r
-  TString tsreturn = Form("\n[ Dump Sequence at 0x%08x ] : ", px);\r\r
-  for (UInt_t i = 0; i < iw; i++)\r\r
-  //for (UInt_t i = 0; i < iEnd; i++)\r\r
-    {\r\r
-      if ( iw != 0 && px + iw > fpEnd) return kFALSE;\r\r
-\r\r
-      if (i % 8 == 0) tsreturn += "\n                              ";\r\r
-      if (marker != 0 && marker == px[i]) tsreturn += Form(" *>0x%08x<* ", px[i]);\r\r
-      else tsreturn += Form("0x%08x ", px[i]);\r\r
-    }\r\r
-  tsreturn += "\n";\r\r
-\r\r
-  AliInfo(tsreturn.Data());\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::SkipWords(UInt_t iw)\r\r
-{\r\r
-  //\r\r
-  // Skip words corresponding to iw\r\r
-  //\r\r
-  if ( fpPos + iw < fpEnd )\r\r
-    {\r\r
-      fpPos += iw;\r\r
-      return kTRUE;\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      if (fgWarnError) AliWarning(Form("Skip %d words failed. %d available", iw, fpEnd - fpPos - 1));\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::SetReader(AliRawReader * reader)\r\r
-{\r\r
-  //\r\r
-  // Set reader pointer\r\r
-  //\r\r
-\r\r
-  if (reader != 0)\r\r
-    {\r\r
-      fRawReader = reader;\r\r
-      if (fRawReader)\r\r
-  {      \r\r
-    return Init();\r\r
-  }\r\r
-      else\r\r
-  {\r\r
-    AliWarning("Unable to setup reader.");\r\r
-    return kFALSE;\r\r
-  }\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      AliWarning("AliRawReader argument is 0.");\r\r
-      fRawReader = 0;\r\r
-    }\r\r
-\r\r
-  return kFALSE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Int_t \r\r
-AliTRDrawStream::NextBuffer()\r\r
-{\r\r
-  //\r\r
-  // return -1 if no more buffers available\r\r
-  // return  0 DecodeSM failed (clean data required for example) but still maybe more data to come\r\r
-  // return  1 DecodeSM OK\r\r
-  // \r\r
-\r\r
-  if (fRawReader != 0)\r\r
-    {\r\r
-      UChar_t *buffer = 0;\r\r
-      UInt_t length = 0;\r\r
-      Bool_t kBufferSet = fRawReader->ReadNextData(buffer);\r\r
-      if (kBufferSet == kTRUE)\r\r
-  {\r\r
-    if (fgDebugFlag)  AliDebug(9, "Buffer is set.");\r\r
-    length = fRawReader->GetDataSize();\r\r
-    if (fgExtraSkip == kTRUE)\r\r
-      {\r\r
-        buffer += EXTRA_LEAD_WORDS * WORD_SIZE;\r\r
-        length -= EXTRA_LEAD_WORDS * WORD_SIZE;\r\r
-      }\r\r
-\r\r
-    if (fgSkipCDH == kTRUE)\r\r
-      {\r\r
-        buffer += CDH_WORDS * WORD_SIZE;\r\r
-        length -= CDH_WORDS * WORD_SIZE;             \r\r
-      }\r\r
-\r\r
-    if (length > 0)\r\r
-      {\r\r
-        if (fgDebugFlag)  AliDebug(9, Form("Buffer length : %d", length));\r\r
-              if (fgEnableMemoryReset) ResetMemory(); //[mj]\r\r
-        if (DecodeSM((void*)buffer, length) == kTRUE)\r\r
-    return 1;\r\r
-        else\r\r
-    return 0;\r\r
-      }\r\r
-  }\r\r
-      else\r\r
-  {\r\r
-    return -1;\r\r
-  }\r\r
-    }\r\r
-\r\r
-  return -1;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-void \r\r
-AliTRDrawStream::ResetCounters()\r\r
-{\r\r
-  //\r\r
-  // reset some global counters\r\r
-  //\r\r
-  fBufferRead = kFALSE; // important to read buffer\r\r
-\r\r
-  fStackNumber = 0;\r\r
-  fStackLinkNumber = 0;\r\r
-  fDecodedADCs = 0;\r\r
-\r\r
-  fSM.fActiveStacks = 0;\r\r
-  fSM.fNexpectedHalfChambers = 0;\r\r
-\r\r
-  fLinkTrackletCounter = 0;\r\r
-  fLastEventCounter = 0;\r\r
-  fEventCounter = 0;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-void \r\r
-AliTRDrawStream::ResetIterators()\r\r
-{\r\r
-  //\r\r
-  // reset data which should be reset every sm\r\r
-  //\r\r
-  fStackNumber = 0;     // reset for Next() function \r\r
-  fStackLinkNumber = 0; // reset for Next() function\r\r
-  fhcMCMcounter = 0;  \r\r
-  fmcmADCcounter = 0;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-void\r\r
-AliTRDrawStream::ResetPerSM()\r\r
-{\r\r
-  //\r\r
-  // reset every SM\r\r
-  //\r\r
-\r\r
-  fSM.fHeaderSize = 0;\r\r
-  fSM.fTrackletEnable = kFALSE;\r\r
-  fSM.fCorrupted = 0;\r\r
-  fSM.fNexpectedHalfChambers = 0;\r\r
-  fSM.fNexpectedHalfChambers = 0;\r\r
-  fSM.fClean = kTRUE;\r\r
-  fSM.fPos = NULL;\r\r
-  for (Int_t i=0; i<5; i++){\r\r
-    fSM.fStackActive[i] = kFALSE;\r\r
-  }\r\r
-}     \r\r
-\r\r
-//------------------------------------------------------------\r\r
-void\r\r
-AliTRDrawStream::ResetPerStack()\r\r
-{\r\r
-  //\r\r
-  // reset every Stack\r\r
-  //\r\r
-\r\r
-  fStack->fHeaderSize = 0;\r\r
-  fStack->fActiveLinks = 0;\r\r
-  fStack->fPos = NULL;\r\r
-  for (Int_t i=0; i<12; i++){\r\r
-    fStack->fLinksActive[i] = kFALSE;\r\r
-    fStack->fLinksDataType[i] = 0;\r\r
-    fStack->fLinksMonitor[i] = 0;\r\r
-    fStack->fLinkMonitorError[i] = 0;\r\r
-  }\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-void \r\r
-AliTRDrawStream::ResetPerHC()\r\r
-{\r\r
-  //\r\r
-  // reset every HC\r\r
-  //\r\r
-  fEventCounter = 0;\r\r
-  fHC->fTrackletError = 0;\r\r
-  fHC->fNTracklets = 0;\r\r
-  fHC->fSpecialRawV = 0;\r\r
-  fHC->fRawVMajor = 0;\r\r
-  fHC->fRawVMajorOpt = 0;\r\r
-  fHC->fRawVMinor = 0;\r\r
-  fHC->fNExtraWords = 0;\r\r
-  fHC->fDCSboard = 0;\r\r
-  fHC->fSM = 0;\r\r
-  fHC->fStack = 0;\r\r
-  fHC->fLayer = 0;\r\r
-  fHC->fSide = 0;\r\r
-  fHC->fTimeBins = 0;\r\r
-  fHC->fBunchCrossCounter = 0;\r\r
-  fHC->fPreTriggerCounter = 0;\r\r
-  fHC->fPreTriggerPhase = 0;\r\r
-  fHC->fDET = 0;\r\r
-  fHC->fROC = 0;\r\r
-  fHC->fRowMax = 0;\r\r
-  fHC->fColMax = 0;\r\r
-  fHC->fMCMmax = 0;\r\r
-\r\r
-  fHC->fH0Corrupted = 0;\r\r
-  fHC->fH1Corrupted = 0;\r\r
-  fHC->fCorrupted = 0;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-void\r\r
-AliTRDrawStream::ResetPerMCM()\r\r
-{\r\r
-  //\r\r
-  // reset every MCM \r\r
-  //\r\r
-  fMCM->fROB = 0;\r\r
-  fMCM->fMCM = 0;\r\r
-  fMCM->fROW = 0;\r\r
-  fMCM->fEvCounter = 0;\r\r
-  fMCM->fADCMask = 0;\r\r
-  fMCM->fADCMaskWord = 0;\r\r
-  fMCM->fADCmax = 0;\r\r
-  fMCM->fADCcount = 0;\r\r
-  fMCM->fMCMADCWords = 0;\r\r
-  fMCM->fSingleADCwords = 0;\r\r
-  fMCM->fMCMhdCorrupted = 0;\r\r
-  fMCM->fADCmaskCorrupted = 0;\r\r
-  fMCM->fCorrupted = 0;\r\r
-  fMCM->fPos = NULL;\r\r
-  fMCM->fAdcDataPos = NULL;\r\r
-  fMCM->fADCcounter = 0;\r\r
-\r\r
-  for (Int_t i=0; i<21; i++){\r\r
-    fMCM->fADCchannel[i] = 0;\r\r
-  }\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-void\r\r
-AliTRDrawStream::ResetPerADC()\r\r
-{\r\r
-  //\r\r
-  // reset every ADC \r\r
-  //\r\r
-  fADC->fPos = NULL;\r\r
-  fADC->fADCnumber = 0;\r\r
-  fADC->fCOL = 0;\r\r
-  fADC->fIsShared = kTRUE;\r\r
-  fADC->fCorrupted = 0;\r\r
-\r\r
-  for (Int_t i=0; i<30; i++){\r\r
-    fADC->fSignals[i] = 0;\r\r
-  }\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-void\r\r
-AliTRDrawStream::ResetMemory()\r\r
-{                 \r\r
-  //              \r\r
-  // initialize all the data members to prevent read data\r\r
-  // from previous buffer\r\r
-  //              \r\r
-  ResetPerSM();\r\r
-  for (Int_t istack=0; istack<5; istack++){\r\r
-    fStack = &fSM.fStacks[istack];\r\r
-    ResetPerStack();\r\r
-    for (Int_t ilink=0; ilink<12; ilink++){\r\r
-        fHC = &fStack->fHalfChambers[ilink];\r\r
-        ResetPerHC();\r\r
-        for (Int_t imcm=0; imcm<12; imcm++){\r\r
-          fMCM = &fHC->fMCMs[imcm];\r\r
-          ResetPerMCM();\r\r
-          for (Int_t iadc=0; iadc<12; iadc++){\r\r
-              fADC = &fMCM->fADCs[iadc];\r\r
-              ResetPerADC();\r\r
-          }\r\r
-        }\r\r
-    }      \r\r
-  }\r\r
-}         \r\r
-\r\r
-//------------------------------------------------------------\r\r
-\r\r
-Bool_t \r\r
-AliTRDrawStream::Next()\r\r
-{\r\r
-  //\r\r
-  // returns with true on next adc read\r\r
-  // returns false on errors and end of buffer\r\r
-  // \r\r
-if (fBufferRead)\r\r
-  {\r\r
-\r\r
-    while (fStackNumber < 5 && fSM.fActiveStacks > 0)\r\r
-      {\r\r
-        if(fSM.fStackActive[fStackNumber] == kTRUE)\r\r
-    {\r\r
-      fStack = &fSM.fStacks[fStackNumber];\r\r
-      while (fStackLinkNumber < 12)\r\r
-        {\r\r
-          if (fStack->fLinksActive[fStackLinkNumber] == kTRUE && fStack->fLinksMonitor[fStackLinkNumber] == 0)\r\r
-      {\r\r
-        fHC = &fStack->fHalfChambers[fStackLinkNumber];\r\r
-        if (!fHC)\r\r
-          {\r\r
-            AliError(Form("HC missing at stack %d link %d", fStackNumber, fStackLinkNumber));\r\r
-            return kFALSE;\r\r
-          }\r\r
-        if (fHC->fCorrupted == 0 && (fHC->fH0Corrupted == 0 && fHC->fH1Corrupted == 0) | !fgSkipData) // if HC data corrupted(in any case), we don't read data at all from this HC \r\r
-          {\r\r
-            while (fhcMCMcounter < fHC->fMCMmax)\r\r
-        {\r\r
-          fMCM = &fHC->fMCMs[fhcMCMcounter];\r\r
-          if (!fMCM)\r\r
-            {\r\r
-              AliError(Form("HC missing at stack %d link %d atMCMslot %d", \r\r
-                fStackNumber, fStackLinkNumber, fhcMCMcounter));\r\r
-              return kFALSE;\r\r
-            }\r\r
-          while(fmcmADCcounter < fMCM->fADCmax)\r\r
-            {\r\r
-              fADC = &fMCM->fADCs[fmcmADCcounter];\r\r
-              if (!fADC)\r\r
-          {\r\r
-            AliError(Form("ADC missing at stack %d link %d MCMslot %d ADCslot %d", \r\r
-              fStackNumber, fStackLinkNumber, fhcMCMcounter, fmcmADCcounter));\r\r
-            return kFALSE;\r\r
-          }\r\r
-              fmcmADCcounter++;\r\r
-              if (fSharedPadsOn)\r\r
-          {\r\r
-            return kTRUE;\r\r
-          }\r\r
-              else\r\r
-          {\r\r
-            if (fADC->fIsShared == kFALSE)\r\r
-              return kTRUE;\r\r
-          }\r\r
-            } //while adc in MCM\r\r
-          fhcMCMcounter++;\r\r
-          // next MCM should go through all active ADCs\r\r
-          fmcmADCcounter = 0;\r\r
-        } // while mcm\r\r
-          } // if HC OK\r\r
-      }// if link active\r\r
-          fStackLinkNumber++;\r\r
-          // next stack link (HC) should go through all active MCMs\r\r
-          fhcMCMcounter = 0;\r\r
-        }// while links\r\r
-    }// if stack active\r\r
-        fStackNumber++;\r\r
-        // next stack should go through all links - start from 0\r\r
-        fStackLinkNumber = 0;\r\r
-      }\r\r
-  } // fBufferRead\r\r
-\r\r
-  // in case rawreader manages the mem buffers, go for the next buffer \r\r
-  if (fRawReader)\r\r
-    {\r\r
-      Int_t nextBuff = NextBuffer();\r\r
-      while (nextBuff != -1)\r\r
-    {\r\r
-      if (nextBuff > 0)\r\r
-              {\r\r
-                fBufferRead = kTRUE;\r\r
-          return Next();                 \r\r
-              }\r\r
-      nextBuff = NextBuffer();\r\r
-    }\r\r
-    }\r\r
-\r\r
-  return kFALSE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Int_t \r\r
-AliTRDrawStream::NextChamber(AliTRDdigitsManager *const digitsManager, UInt_t **trackletContainer) \r\r
-{\r\r
-  //\r\r
-  // Fills single chamber digit array \r\r
-  // Return value is the detector number\r\r
-  //\r\r
-\r\r
-  //AliTRDcalibDB *cal = AliTRDcalibDB::Instance();\r\r
-  AliTRDarrayADC *digits = 0;\r\r
-  AliTRDarrayDictionary *track0 = 0;\r\r
-  AliTRDarrayDictionary *track1 = 0;\r\r
-  AliTRDarrayDictionary *track2 = 0; \r\r
-  AliTRDSignalIndex *indexes = 0;\r\r
-\r\r
-  // Loop through the digits\r\r
-  Int_t lastdet = -1;\r\r
-  Int_t det     = -1;\r\r
-  Int_t lastside = -1; \r\r
-  Int_t side     = -1;\r\r
-  Int_t it = 0;\r\r
-  Int_t ntracklets = 0;\r\r
-\r\r
-  if (trackletContainer){ \r\r
-    for (Int_t i = 0; i < 2; i++) \r\r
-      for (Int_t j = 0; j < MAX_TRACKLETS_PERHC; j++) \r\r
-          trackletContainer[i][j] = 0; \r\r
-  }\r\r
-\r\r
-  while (Next()) \r\r
-    {      \r\r
-      det    = GetDet();\r\r
-      side   = GetSide();\r\r
-\r\r
-      if (trackletContainer)\r\r
-        {\r\r
-        if ((det + side*AliTRDgeometry::kNdet) != (lastdet + lastside*AliTRDgeometry::kNdet))\r\r
-        {\r\r
-          if (det != lastdet)\r\r
-            {\r\r
-              if (lastdet != -1)\r\r
-                {\r\r
-                return lastdet;\r\r
-                }\r\r
-            }\r\r
-          ntracklets = GetNTracklets();\r\r
-          if(ntracklets > 0) memcpy(trackletContainer[side], GetTrackletWords(), sizeof(UInt_t) * ntracklets); //copy tracklet words to trackletContainer array\r\r
-          lastside = side; \r\r
-          } \r\r
-        } \r\r
-\r\r
-      if (det != lastdet) \r\r
-  { \r\r
-    // If new detector found\r\r
-    if (lastdet == -1)\r\r
-      {\r\r
-        lastdet = det;\r\r
-      }\r\r
-    else\r\r
-      {\r\r
-        return lastdet;\r\r
-      }\r\r
-\r\r
-    if (det < 0 || det >= AliTRDgeometry::kNdet)\r\r
-      {\r\r
-        if (fSM.fClean == kTRUE)\r\r
-    {\r\r
-      AliError(Form("Strange Det Number %d BUT event buffer seems to be clean.", det));\r\r
-    }\r\r
-        else\r\r
-    {\r\r
-      AliError(Form("Strange Det Number %d. Event buffer marked NOT clean!", det));\r\r
-    }\r\r
-        continue;\r\r
-      }\r\r
-\r\r
-    // Add a container for the digits of this detector\r\r
-    digits = (AliTRDarrayADC *) digitsManager->GetDigits(det);\r\r
-\r\r
-          if (digitsManager->UsesDictionaries()) \r\r
-            {\r\r
-        track0 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,0);\r\r
-        track1 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,1);\r\r
-        track2 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,2);\r\r
-      }\r\r
-\r\r
-    if (!digits)\r\r
-      {\r\r
-        if (fSM.fClean == kTRUE)\r\r
-    {\r\r
-      AliError(Form("Unable to get digits for det %d BUT event buffer seems to be clean.", det));\r\r
-    }\r\r
-        else\r\r
-    {\r\r
-      AliError(Form("Unable to get digits for det %d. Event buffer is NOT clean!", det));\r\r
-    }\r\r
-        return -1;\r\r
-      }\r\r
-\r\r
-    Int_t rowMax = GetRowMax();\r\r
-    Int_t colMax = GetColMax();\r\r
-    Int_t ntbins = GetNumberOfTimeBins();\r\r
-\r\r
-    // Allocate memory space for the digits buffer\r\r
-    if (digits->GetNtime() == 0) \r\r
-      {\r\r
-        digits->Allocate(rowMax, colMax, ntbins);\r\r
-              if (digitsManager->UsesDictionaries()) \r\r
-                {\r\r
-            track0->Allocate(rowMax, colMax, ntbins);\r\r
-            track1->Allocate(rowMax, colMax, ntbins);\r\r
-            track2->Allocate(rowMax, colMax, ntbins);\r\r
-    }\r\r
-      }\r\r
-\r\r
-    indexes = digitsManager->GetIndexes(det);\r\r
-    indexes->SetSM(GetSM());\r\r
-    indexes->SetStack(GetStack());\r\r
-    indexes->SetLayer(GetLayer());\r\r
-    indexes->SetDetNumber(det);\r\r
-    if (indexes->IsAllocated() == kFALSE)\r\r
-      indexes->Allocate(rowMax, colMax, ntbins);\r\r
-  }\r\r
-\r\r
-      //Char_t padStatus =  cal->GetPadStatus(det, GetCol(), GetRow());\r\r
-\r\r
-      // ntimebins data are ready to read\r\r
-      for (it = 0; it < GetNumberOfTimeBins(); it++)\r\r
-  {\r\r
-    if (GetSignals()[it] > 0)\r\r
-      {\r\r
-        digits->SetData(GetRow(), GetCol(), it, GetSignals()[it]);\r\r
-        /*if(padStatus)\r\r
-         digits->SetPadStatus(GetRow(), GetCol(), it, padStatus);*/\r\r
-                \r\r
-        indexes->AddIndexRC(GetRow(), GetCol());\r\r
-              if (digitsManager->UsesDictionaries()) \r\r
-                {\r\r
-            track0->SetData(GetRow(), GetCol(), it, 0);\r\r
-            track1->SetData(GetRow(), GetCol(), it, 0);\r\r
-            track2->SetData(GetRow(), GetCol(), it, 0);\r\r
-    }\r\r
-      }\r\r
-  } // tbins\r\r
-    }// while Next()\r\r
-\r\r
-  return det;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t\r\r
-AliTRDrawStream::Init()\r\r
-{\r\r
-  //\r\r
-  // Initialize geometry and fee parameters \r\r
-  //\r\r
-\r\r
-  TDirectory *saveDir = gDirectory; \r\r
-  \r\r
-  if (!fGeometry) \r\r
-    {\r\r
-      fGeometry = new AliTRDgeometry();\r\r
-    }\r\r
-  \r\r
-  if (!fGeometry) \r\r
-    {\r\r
-      AliError("Geometry FAILED!");\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  fTRDfeeParam = AliTRDfeeParam::Instance();\r\r
-  if (!fTRDfeeParam)\r\r
-    {\r\r
-      AliError("AliTRDfeeParam FAILED!");\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  fMaxADCgeom = (Int_t)fGeometry->ADCmax();\r\r
-\r\r
-  ResetCounters(); // fBufferRead is set to kFALSE - important\r\r
-\r\r
-  saveDir->cd();\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::InitBuffer(void * const buffer, UInt_t length)\r\r
-{\r\r
-  // \r\r
-  // set initial information about the buffer\r\r
-  //\r\r
-\r\r
-  if (fgDebugFlag)  AliDebug(5, Form("Equipment ID: %d",fRawReader->GetEquipmentId()));\r\r
-  if (fRawReader->GetEquipmentId()<1024 || fRawReader->GetEquipmentId()>1041) //tmp protection\r\r
-    return kFALSE; \r\r
-\r\r
-  ResetCounters();\r\r
-\r\r
-  fpBegin = (UInt_t *)buffer;\r\r
-\r\r
-  if (WORD_SIZE == 0)\r\r
-    {\r\r
-      AliFatal("Strange word size. size of UInt_t == 0");\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  fWordLength = length/WORD_SIZE;\r\r
-  fpEnd = fpBegin + fWordLength;\r\r
-  fpPos = fpBegin;\r\r
-\r\r
-  if (fpBegin == 0 || length <= 0)\r\r
-    {\r\r
-      AliError(Form("Buffer size or pointer is strange. pointer to the buffer is 0x%08x of size %d", fpBegin, length));\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  SwapOnEndian();\r\r
-\r\r
-  if (fgDumpHead >= 0){\r\r
-    if ( fgDumpHead == 0 ){ // dump all words\r\r
-        AliInfo(Form("---------- Dumping all words from the beginnig of the buffer ----------"));\r\r
-        if (DumpWords(fpBegin, fWordLength) == kFALSE) AliError("Dump failed. Not enough data.");\r\r
-    } else {\r\r
-        AliInfo(Form("---------- Dumping %u words from the beginnig of the buffer ----------",fgDumpHead));\r\r
-        if (DumpWords(fpBegin, fgDumpHead) == kFALSE) AliError("Dump failed. Not enough data.");\r\r
-    }\r\r
-    AliInfo(Form("---------- Dumping ended ----------------------------------------------"));\r\r
-  }\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::DecodeGTUheader()\r\r
-{\r\r
-  // Decode Supermodule Index Word\r\r
-  DecodeSMInfo(fpPos, &fSM);\r\r
-\r\r
-  if (fgDebugFlag)  AliDebug(5, DumpSMInfo(&fSM));\r\r
-\r\r
-  fpPos++;\r\r
-  if (fpPos < fpEnd)\r\r
-    {  \r\r
-      // fSM.fHeaderSize represent additional Supermodule header size which contains additional information regarding hardware design.\r\r
-      // For the moment, we skip decoding these words \r\r
-      if (SkipWords(fSM.fHeaderSize) == kTRUE)\r\r
-  {\r\r
-    for (Int_t istack = 0; istack < 5; istack++)\r\r
-      {\r\r
-        if (fSM.fStackActive[istack] == kFALSE)\r\r
-    continue;\r\r
-\r\r
-        fStack = &fSM.fStacks[istack];\r\r
-\r\r
-              // Decode Stack Index Word of given stack\r\r
-        DecodeStackInfo(fpPos, fStack);\r\r
-        fpPos++;\r\r
-\r\r
-        fSM.fNexpectedHalfChambers += fStack->fActiveLinks;\r\r
-        \r\r
-        if (fgDebugFlag)  AliDebug(5, DumpStackInfo(fStack));\r\r
-        \r\r
-        if (SkipWords(fStack->fHeaderSize-6) == kFALSE) // 6 is the 6 stack header words for 12 links \r\r
-    {\r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kDecodeStackInfo, "Stack header words missing");\r\r
-      return kFALSE;\r\r
-    }\r\r
-              for (Int_t iword=0; iword<6; iword++) // decode 6 stack header words\r\r
-                {\r\r
-                  // Decode Stack Header Word of given stack\r\r
-            DecodeStackHeader(fpPos, fStack, iword); \r\r
-            fpPos++;\r\r
-                }\r\r
-      }\r\r
-  }\r\r
-      else\r\r
-  {\r\r
-    return kFALSE;\r\r
-  }\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      if (fgWarnError) AliWarning("No additional sm headers and stack index words present.");\r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kDecodeStackInfo, "Stack info missing");\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  if (fpPos < fpEnd)\r\r
-    {\r\r
-      if (fgDebugFlag)  AliDebug(5, "GTU headers are OK.");\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      if (fgWarnError) AliWarning("No data just after GTU headers.");\r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kMissingData, "Missing sm data");\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  if (fgDebugFlag)  AliDebug(5, Form("Expected half chambers from GTU header: %d", fSM.fNexpectedHalfChambers));\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::DecodeSM(void * const buffer, UInt_t length)\r\r
-{\r\r
-  //\r\r
-  // decode one sm data in buffer\r\r
-  //\r\r
-  \r\r
-  ResetIterators(); \r\r
-\r\r
-  fSM.fClean = kTRUE;\r\r
-  if (InitBuffer(buffer, length) == kFALSE)\r\r
-    {\r\r
-      if (fgWarnError) AliError("InitBuffer failed.");      \r\r
-      fSM.fClean = kFALSE;\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  if (DecodeGTUheader()== kFALSE)\r\r
-    return kFALSE;\r\r
-\r\r
-  for (Int_t istack = 0; istack < 5; istack++)\r\r
-    {\r\r
-      fStackNumber = istack; \r\r
-      if (fSM.fStackActive[istack] == kFALSE)\r\r
-  continue;\r\r
-      \r\r
-      fStack = &fSM.fStacks[istack];\r\r
-\r\r
-      fgLastHC  = -1; // to check rob number odering \r\r
-      for (Int_t ilink = 0; ilink < 12; ilink++)\r\r
-  {\r\r
-    fStackLinkNumber = ilink; \r\r
-    if (fStack->fLinksActive[ilink] == kFALSE)\r\r
-      continue;\r\r
-\r\r
-          // check GTU link monitor \r\r
-          if (!(fStack->fLinksDataType[ilink] == 0 && fStack->fLinksMonitor[ilink] == 0))\r\r
-            {\r\r
-              fStack->fLinkMonitorError[ilink] = 1;\r\r
-              SeekEndOfData(); // skip this HC data if GTU link monitor report error\r\r
-              fStack->fLinkMonitorError[ilink] += fNWordsCounter; // counts words of given hc having link monitor error\r\r
-              continue; \r\r
-            }\r\r
-\r\r
-    if (fpPos >= fpEnd)\r\r
-      {\r\r
-        if (fRawReader) fRawReader->AddMajorErrorLog(kLinkDataMissing, "Link data missing");         \r\r
-              if (fgWarnError) AliError("Link data missing.");      \r\r
-        fSM.fClean = kFALSE;\r\r
-        break;\r\r
-      }\r\r
-\r\r
-    fHC = &fStack->fHalfChambers[ilink];\r\r
-          ResetPerHC();\r\r
-\r\r
-    if (fSM.fTrackletEnable == kTRUE)\r\r
-      {\r\r
-        if (DecodeTracklets() == kFALSE)\r\r
-    {\r\r
-      \r\r
-      fSM.fClean = kFALSE;\r\r
-      SeekEndOfData();\r\r
-\r\r
-      if (fgWarnError) \r\r
-        {\r\r
-          AliError(Form("Tracklet decoding failed stack %d link %d", fStackNumber, fStackLinkNumber));\r\r
-        }\r\r
-      continue;\r\r
-    }\r\r
-      }\r\r
-\r\r
-    if (fpPos >= fpEnd)\r\r
-      {\r\r
-        if (fRawReader) fRawReader->AddMajorErrorLog(kHCdataMissing, "HC data missing");             \r\r
-              if (fgWarnError) AliError("HC data missing.");      \r\r
-        fSM.fClean = kFALSE;\r\r
-        break;\r\r
-      }\r\r
-    \r\r
-          fgLastROB   = -1; // to check mcm number odering \r\r
-          fgLastIndex = -1 ; // to check mcm number odering \r\r
-    if (DecodeHC() == kFALSE)\r\r
-      {\r\r
-        fSM.fClean = kFALSE;\r\r
-              if (fHC->fCorrupted < 16)  SeekEndOfData(); // In case that we meet END_OF_TRACKLET_MARKERNEW \r\r
-                                                          // during ADC data decoding or MCM header decoding\r\r
-                                                          // we don't seek ENDOFRAWDATAMARKER\r\r
-\r\r
-        if (fgWarnError) \r\r
-    {\r\r
-      AliError(Form("Failed HC : %s", DumpHCinfoH0(fHC)));\r\r
-      AliError(Form("Failed HC : %s", DumpHCinfoH1(fHC)));\r\r
-    }\r\r
-                \r\r
-        continue;\r\r
-      }\r\r
-    else\r\r
-      {\r\r
-        SeekEndOfData(); // make sure that finish off with the end of data markers\r\r
-      }\r\r
-\r\r
-  } // ilink\r\r
-    } // istack\r\r
-\r\r
-  ResetIterators(); // need to do it again for Next() function \r\r
-\r\r
-  if (fSM.fClean == kTRUE)\r\r
-    return kTRUE;\r\r
-  \r\r
-  if (fgCleanDataOnly && (fSM.fClean == kFALSE))\r\r
-    {\r\r
-      if (fgWarnError) \r\r
-  {\r\r
-    AliWarning("Buffer with errors. Returning FALSE.");\r\r
-    AliWarning(Form("--- Failed SM : %s ---", DumpSMInfo(&fSM)));\r\r
-  }\r\r
-      fSM.fActiveStacks = 0; // Next() will not give data\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Int_t \r\r
-AliTRDrawStream::DecodeSM()\r\r
-{\r\r
-  //\r\r
-  // decode SM data in case AliRawReader is in use\r\r
-  //    \r\r
-  if (fRawReader)\r\r
-    {      \r\r
-      Int_t nextBuff = NextBuffer();\r\r
-      while (nextBuff != -1)\r\r
-  {\r\r
-    if (nextBuff > 0)\r\r
-      return nextBuff;           \r\r
-    nextBuff = NextBuffer();\r\r
-  }\r\r
-      return -1;\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      AliWarning("AliRawReader not set.");\r\r
-    }\r\r
-  return kFALSE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Int_t \r\r
-AliTRDrawStream::DecodeSM(AliRawReader *reader)\r\r
-{\r\r
-  //\r\r
-  // decode SM with the AliRawReader\r\r
-  //\r\r
-  if (reader != 0)\r\r
-    {\r\r
-      fRawReader = reader;\r\r
-      return DecodeSM();\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      AliWarning("Argument AliRawReader is 0.");\r\r
-    }\r\r
-  return kFALSE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::SeekEndOfData()\r\r
-{\r\r
-  //\r\r
-  // go to end of data marker\r\r
-  //\r\r
-  Int_t fEndOfDataCount = 0;\r\r
-  fNWordsCounter = 0;\r\r
-\r\r
-  while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd )\r\r
-    {\r\r
-      fpPos++;\r\r
-      fNWordsCounter++;\r\r
-    }\r\r
-  while (*fpPos == ENDOFRAWDATAMARKER && fpPos < fpEnd )\r\r
-    {\r\r
-      fEndOfDataCount++;\r\r
-      fpPos++;      \r\r
-    }\r\r
-  \r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t\r\r
-AliTRDrawStream::SkipMCMdata(UInt_t iw)\r\r
-{\r\r
-  //\r\r
-  // skip mcm data words due to corruption \r\r
-  //\r\r
-  if (fgDebugFlag) AliDebug(11,Form("Skip %d words due to MCM header corruption.",iw));\r\r
-  UInt_t iwcounter = 0;  \r\r
-  while ( *fpPos != ENDOFRAWDATAMARKER && iwcounter < iw)\r\r
-    {\r\r
-      if ( *fpPos == END_OF_TRACKLET_MARKERNEW) \r\r
-        {  \r\r
-          if (fgDebugFlag) AliDebug(11,"Met END_OF_TRACKLET_MARKERNEW");\r\r
-          fMCM->fCorrupted += 16;\r\r
-          fHC->fCorrupted += 16;\r\r
-          return kFALSE;\r\r
-        } \r\r
-      fpPos++;\r\r
-      iwcounter++; \r\r
-    }\r\r
-\r\r
-  if (iwcounter == iw)\r\r
-    {\r\r
-      fpPos++;\r\r
-      return kTRUE;\r\r
-    }\r\r
-\r\r
-  if (fgDebugFlag) AliDebug(11,"Met ENDOFRAWDATAMARKER");\r\r
-  return kFALSE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::SeekNextMCMheader()\r\r
-{\r\r
-  //\r\r
-  // go to mcm marker\r\r
-  //\r\r
-\r\r
-  fpPos++;\r\r
-\r\r
-  while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd )\r\r
-    {\r\r
-      if (MCM_HEADER_MASK_ERR(*fpPos) == 0 && MCM_HEADER_MASK_ERR(*(fpPos+1)) == 0)      \r\r
-  {\r\r
-    if (fgDebugFlag) AliDebug(11,Form("^^^ Found : Pos 0x%08x : Val 0x%08x", fpPos, *fpPos));\r\r
-    return kTRUE;\r\r
-  }\r\r
-      if ( *fpPos == END_OF_TRACKLET_MARKERNEW) \r\r
-        {  \r\r
-          fMCM->fCorrupted += 16;\r\r
-          fHC->fCorrupted += 16;\r\r
-          return kFALSE;\r\r
-        } \r\r
-      fpPos++;\r\r
-    }\r\r
-\r\r
-  SeekEndOfData();\r\r
-  return kFALSE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-\r\r
-Bool_t \r\r
-AliTRDrawStream::DecodeTracklets()\r\r
-{\r\r
-  //\r\r
-  // decode tracklets\r\r
-  //\r\r
-\r\r
-  fLinkTrackletCounter = 0;\r\r
-  fEndOfTrackletCount = 0;\r\r
-  fHC->fNTracklets = 0;\r\r
-\r\r
-  for (Int_t i = 0; i < MAX_TRACKLETS_PERHC; i++) \r\r
-  fHC->fTrackletWords[i] = 0; \r\r
-\r\r
-  if (fgDebugFlag)  AliDebug(10, Form("Decode tracklets at 0x%08x : 0x%08x", fpPos, *fpPos));\r\r
-\r\r
-  while ( *fpPos != END_OF_TRACKLET_MARKEROLD && *fpPos != END_OF_TRACKLET_MARKERNEW && fpPos < fpEnd )\r\r
-    {\r\r
-      if (fgDebugFlag)  AliDebug(10, Form("Tracklet found at 0x%08x : 0x%08x", fpPos, *fpPos));\r\r
-\r\r
-      fLinkTrackletCounter++;\r\r
-\r\r
-      if (fLinkTrackletCounter > MAX_TRACKLETS_PERHC)\r\r
-  {\r\r
-    if (fgDebugFlag) AliDebug(11,Form("Max number of tracklets exceeded %d > %d.", \r\r
-        fLinkTrackletCounter, MAX_TRACKLETS_PERHC));\r\r
-    if (fRawReader) fRawReader->AddMajorErrorLog(kTrackletOverflow,"Too many tracklets"); \r\r
-          fHC->fTrackletError = 1;\r\r
-    return kFALSE;\r\r
-  }\r\r
-\r\r
-      fHC->fTrackletWords[fLinkTrackletCounter-1] = UInt_t(*fpPos); //store tracklet words into array  \r\r
-      fHC->fNTracklets = fLinkTrackletCounter;\r\r
-      fpPos++;\r\r
-    }\r\r
-\r\r
-  while ( ( *fpPos == END_OF_TRACKLET_MARKEROLD || *fpPos == END_OF_TRACKLET_MARKERNEW ) && fpPos < fpEnd )\r\r
-    {\r\r
-      if (fgDebugFlag)  AliDebug(10, Form("EoTracklets found at 0x%08x : 0x%08x", fpPos, *fpPos));\r\r
-\r\r
-      fEndOfTrackletCount++;\r\r
-      fpPos++;\r\r
-    }\r\r
-\r\r
-  if ( fEndOfTrackletCount < 2 )\r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(11,"End of tracklets word missing"); \r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kEOTrackeltsMissing, "End of tracklets word missing"); \r\r
-      fHC->fTrackletError += 2;\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::IsRowValid()\r\r
-{\r\r
-  if ( (fHC->fStack == 2 && fMCM->fROW >= fGeometry->RowmaxC0()) ||\r\r
-      (fHC->fStack != 2 && fMCM->fROW >= fGeometry->RowmaxC1()) || fMCM->fROW < 0 ) \r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(11,Form("SM%d L%dS%d: Wrong Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"\r\r
-          , fHC->fSM, fHC->fLayer, fHC->fStack, fMCM->fROW, fMCM->fROB, fHC->fSide, fMCM->fMCM ));\r\r
-      return kFALSE;\r\r
-    }\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::IsMCMheaderOK()\r\r
-{\r\r
-  //\r\r
-  // check the mcm header\r\r
-  //\r\r
-\r\r
-  if (fgLastROB != fMCM->fROB) \r\r
-    {\r\r
-      fgLastIndex = 0;\r\r
-      if (fgLastROB== -1) fgLastROB = fMCM->fROB;\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      Int_t matchingcounter = 0; \r\r
-      for (Int_t i=fgLastIndex+1; i<16; i++)\r\r
-        { \r\r
-          if ( fMCM->fMCM == fgMCMordering[i] )\r\r
-            {\r\r
-              fgLastIndex = i;\r\r
-              matchingcounter++;\r\r
-              break;\r\r
-            }\r\r
-        }\r\r
-      if (matchingcounter == 0)   \r\r
-        {\r\r
-          fMCM->fMCMhdCorrupted += 2;\r\r
-          AliDebug(11,Form("MCM number from last MCM is larger: MCM # from last MCM %d,  MCM # from current MCM %d \n",(fMCM-1)->fMCM, fMCM->fMCM));\r\r
-        }\r\r
-    }\r\r
-\r\r
-  if ( fgLastHC == fHC->fLayer*2 + fHC->fSide )\r\r
-    {\r\r
-      if ( fMCM->fROB < (fMCM-1)->fROB )\r\r
-        {\r\r
-        fMCM->fMCMhdCorrupted += 2;\r\r
-        AliDebug(11,Form("ROB number from last MCM is larger: ROB # from last MCM %d,  ROB # from current MCM %d \n",(fMCM-1)->fROB, fMCM->fROB));\r\r
-        }\r\r
-      else fgLastROB = fMCM->fROB; \r\r
-    }\r\r
-\r\r
-  fgLastHC = fHC->fLayer*2 + fHC->fSide; \r\r
-\r\r
-  /*\r\r
-  // this check will come back later again when we have "patched MCM map"\r\r
-  int expectedROB = -1;\r\r
-  if(!fHC->fSide) expectedROB = int(fHC->fMCMmax/16)*2;\r\r
-  else expectedROB = int(fHC->fMCMmax/16)*2 + 1;\r\r
-  int expectedMCM = 4*(3-int((fHC->fMCMmax%16)/4)) + fHC->fMCMmax%4;\r\r
-\r\r
-  if ( expectedROB != fMCM->fROB || expectedMCM != fMCM->fMCM)\r\r
-    {\r\r
-      fMCM->fMCMhdCorrupted += 2;\r\r
-      AliDebug(11,Form("ROB expected %d ROB read %d,  MCM expected %d MCM read %d\n",expectedROB, fMCM->fROB, expectedMCM, fMCM->fMCM));\r\r
-    }\r\r
-  */\r\r
-\r\r
-  // below two conditions are redundant  \r\r
-  /*\r\r
-  if ( fMCM->fMCM < 0 || fMCM->fMCM > 15 || fMCM->fROB < 0 || fMCM->fROB > 7 ) \r\r
-    {\r\r
-      fMCM->fMCMhdCorrupted += 8;  // need to assign new number\r\r
-      if (fgDebugFlag) AliDebug(11,Form("ROB or MCM number is out of range. %s\n", DumpMCMinfo(fMCM)));\r\r
-    }\r\r
-  if (IsRowValid() == kFALSE)\r\r
-    {\r\r
-      fMCM->fMCMhdCorrupted += 16; // need to assign new number\r\r
-    }\r\r
-  */  \r\r
-    \r\r
-  if (fEventCounter == 0)\r\r
-    {\r\r
-      fEventCounter = fMCM->fEvCounter;\r\r
-    }\r\r
-\r\r
-  if (fEventCounter != fMCM->fEvCounter)\r\r
-    {\r\r
-      fMCM->fMCMhdCorrupted += 4;      if (fgDebugFlag) AliDebug(11,Form("Event number(%d) of current MCM is different from that(%d) of reference MCM %s.\n", fMCM->fEvCounter, fEventCounter, DumpMCMinfo(fMCM)));\r\r
-    }\r\r
-\r\r
-  if (fEventCounter < fLastEventCounter)\r\r
-    {\r\r
-      fMCM->fMCMhdCorrupted += 8;      if (fgDebugFlag) AliDebug(11,Form("Event from the past? Current %d Last %d %s.\n", fEventCounter, fLastEventCounter, DumpMCMinfo(fMCM)));\r\r
-    }\r\r
-\r\r
-  if ( fMCM->fADCmaskCorrupted > 0 )\r\r
-      return kFALSE;\r\r
-\r\r
-  if ( fMCM->fMCMhdCorrupted > 0 )\r\r
-      return kFALSE;\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::DecodeMCMheader()\r\r
-{\r\r
-  //\r\r
-  // decode the mcm header\r\r
-  //\r\r
-\r\r
-  DecodeMCMheader(fpPos, fMCM); \r\r
-\r\r
-  if (fgDumpingEnable) \r\r
-    {\r\r
-      if (fMCM->fMCM == fgDumpingMCM) \r\r
-        {\r\r
-          if (fMCM->fROB == fgDumpingROB && fHC->fLayer == fgDumpingLayer)\r\r
-            {\r\r
-              if (fHC->fSM == fgDumpingSM && fHC->fStack == fgDumpingStack)\r\r
-                { \r\r
-                  if (fgDebugFlag) {\r\r
-                    AliDebug(5,DumpHCinfoH0(fHC));\r\r
-                    AliDebug(5,DumpMCMinfo(fMCM));\r\r
-                  }\r\r
-                  DumpWords(fpPos, 212);\r\r
-                }  \r\r
-            }\r\r
-        }\r\r
-    }\r\r
-\r\r
-  if (fHC->fCorrupted >= 16)\r\r
-    {\r\r
-      fpPos--; \r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  fMCM->fROW = fTRDfeeParam->GetPadRowFromMCM(fMCM->fROB, fMCM->fMCM); \r\r
-\r\r
-  if ((fHC->fRawVMajor > 2 && fHC->fRawVMajor <5) || ((fHC->fRawVMajor & 32) == 32)) //cover old and new version definition of ZS data\r\r
-    {\r\r
-      fpPos++;\r\r
-      if ( fpPos < fpEnd )\r\r
-  {\r\r
-    DecodeMask(fpPos, fMCM); \r\r
-          if (fHC->fCorrupted >= 16)\r\r
-            {\r\r
-              fpPos--; \r\r
-              return kFALSE;\r\r
-            }\r\r
-    MCMADCwordsWithTbins(fHC->fTimeBins, fMCM);\r\r
-    fMCM->fAdcDataPos = fpPos + 1;\r\r
-  }\r\r
-      else\r\r
-  {\r\r
-    if (fgDebugFlag) AliDebug(11,"Expected ADC mask word. Fail due to buffer END.");     \r\r
-    if (fRawReader) fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Missing"); \r\r
-          fHC->fCorrupted += 32;\r\r
-    return kFALSE;\r\r
-  }\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      UInt_t dummyMask = MCM_DUMMY_ADCMASK_VAL;\r\r
-      DecodeMask(&dummyMask, fMCM); \r\r
-      MCMADCwordsWithTbins(fHC->fTimeBins, fMCM);\r\r
-      fMCM->fAdcDataPos = fpPos + 1;\r\r
-    }\r\r
-\r\r
-  if (fgDebugFlag)  \r\r
-    {\r\r
-      AliDebug(6, DumpMCMinfo(fMCM));\r\r
-      AliDebug(7, DumpMCMadcMask(fMCM));\r\r
-    }\r\r
-\r\r
-  if (IsMCMheaderOK() == kFALSE)\r\r
-      return kFALSE;\r\r
-    \r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::IsHCheaderOK()\r\r
-{\r\r
-  //\r\r
-  // check insanity of half chamber header\r\r
-  //\r\r
-\r\r
-  if (fHC->fStack < 0 || fHC->fStack > 4)\r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(11,Form("Wrong Stack %d", fHC->fStack));\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  if (fHC->fLayer < 0 || fHC->fLayer >= AliTRDgeometry::kNlayer)\r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(11,Form("Wrong layer %d", fHC->fLayer));\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  if (fHC->fSide < 0 || fHC->fSide > 1)\r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(11,Form("Wrong Side %d", fHC->fSide));\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  if (fgStackNumberChecker)\r\r
-    {\r\r
-    if (fHC->fStack != fStackNumber) \r\r
-      {\r\r
-        if (fgDebugFlag) AliDebug(11,Form("Missmatch: Stack number between HC header %d and GTU link mask %d", \r\r
-              fHC->fStack, fStackNumber));\r\r
-        fStackNumber = -1;\r\r
-        return kFALSE;\r\r
-    }\r\r
-    }\r\r
-\r\r
-  if (fgStackLinkNumberChecker)\r\r
-    {\r\r
-    //if (fHC->fLayer * 2 + fHC->fSide != fStackLinkNumber) \r\r
-    // let it make flexible to consider known fiber swapping\r\r
-    if ((fHC->fLayer * 2 != fStackLinkNumber) && (fHC->fLayer * 2 != fStackLinkNumber - 1))  \r\r
-      {\r\r
-        if (fgDebugFlag) AliDebug(11,Form("Missmatch: Layer number between HC header %d and GTU link mask %d | %s", \r\r
-                    fHC->fLayer, fStackLinkNumber, DumpStackInfo(fStack)));\r\r
-        fStackLinkNumber = -1;\r\r
-        return kFALSE;      \r\r
-      }\r\r
-    }\r\r
-\r\r
-  // SLOW GEOM : consistancy check with geometry\r\r
-  fHC->fDET = fGeometry->GetDetector(fHC->fLayer, fHC->fStack, fHC->fSM);\r\r
-  if (fHC->fDET < 0 || fHC->fDET >= AliTRDgeometry::kNdet)\r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(11,Form("Wrong detector %d", fHC->fDET));      \r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongDet, "Wrong Det");       \r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  if (fHC->fSM != fGeometry->GetSector(fHC->fDET)\r\r
-      || fHC->fSM <0 || fHC->fSM >= AliTRDgeometry::kNsector)\r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(11,Form("Wrong SM(sector) %d (Geometry says: %d) Stack=%d Layer=%d Det=%d", \r\r
-              fHC->fSM, fGeometry->GetSector(fHC->fDET),\r\r
-              fHC->fStack, fHC->fLayer, fHC->fDET));      \r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongSM, "Wrong SM");       \r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  fHC->fROC    = fGeometry->GetDetectorSec(fHC->fLayer, fHC->fStack);\r\r
-  if (fHC->fROC < 0)\r\r
-    {\r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC");       \r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  fHC->fRowMax = fGeometry->GetRowMax(fHC->fLayer, fHC->fStack, fHC->fSM);\r\r
-  if (fHC->fRowMax < 1)\r\r
-    {\r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC Row Max");       \r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  fHC->fColMax = fGeometry->GetColMax(fHC->fROC);\r\r
-  if (fHC->fColMax < 1)\r\r
-    {\r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC Col Max");       \r\r
-      return kFALSE;\r\r
-    }\r\r
-  \r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::DecodeHCheader()\r\r
-{  \r\r
-  //\r\r
-  // decode the half chamber header\r\r
-  //\r\r
-\r\r
-  if (DecodeHCwordH0(fpPos, fHC) == kFALSE)\r\r
-    return kFALSE;\r\r
-    \r\r
-  if (fHC->fNExtraWords > 0)\r\r
-    {\r\r
-      fpPos++;\r\r
-      if (fpPos < fpEnd)\r\r
-  {\r\r
-    if (DecodeHCwordH1(fpPos, fHC) == kFALSE)\r\r
-            return kFALSE;\r\r
-  }\r\r
-      else\r\r
-  {\r\r
-    if (fgDebugFlag) AliDebug(11,"Expected HC header word 1. Fail due to buffer END.");\r\r
-    if (fRawReader) fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word 1 (count from 0) missing"); \r\r
-    return kFALSE;\r\r
-  }\r\r
-    }\r\r
-\r\r
-  if (fgDebugFlag)  AliDebug(5, DumpHCinfoH0(fHC));\r\r
-  if (fgDebugFlag)  AliDebug(5, DumpHCinfoH1(fHC));\r\r
-\r\r
-  fHC->fDET = -1;\r\r
-  if (IsHCheaderOK() == kFALSE)\r\r
-    {\r\r
-      fHC->fH0Corrupted += 2;\r\r
-      if (fgDebugFlag) AliDebug(11,Form("H0 Header Insane. Word 0x%08x", *fHC->fPos));\r\r
-      return kFALSE;\r\r
-    }\r\r
-  \r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//------------------------------------------------------------\r\r
-Bool_t \r\r
-AliTRDrawStream::DecodeHC()\r\r
-{\r\r
-  //\r\r
-  // decode hc header and data\r\r
-  //\r\r
-\r\r
-  if (DecodeHCheader() == kFALSE)\r\r
-    {\r\r
-      if (fgWarnError) AliWarning(Form("HC Header decode failed. H0 Error: %d H1 Error: %d",fHC->fH0Corrupted,fHC->fH1Corrupted));\r\r
-      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderCorrupt, "HC header corrupted"); \r\r
-      return kFALSE;\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      fpPos++;\r\r
-      if (fpPos >= fpEnd)\r\r
-  {\r\r
-          fHC->fCorrupted += 1;\r\r
-    if (fgDebugFlag) AliDebug(11,"No MCM data? Not enough data in the buffer.");\r\r
-    if (fRawReader) fRawReader->AddMajorErrorLog(kMCMdataMissing, "MCM data missing"); \r\r
-    return kFALSE;\r\r
-  }\r\r
-    }\r\r
-\r\r
-  if ((fHC->fRawVMajor & 64) == 64) // test pattern data\r\r
-    {\r\r
-      AliTRDrawTPStream *tpStream = new AliTRDrawTPStream(fHC->fRawVMajorOpt, fpPos);\r\r
-      if (tpStream->DecodeTPdata() == kFALSE)\r\r
-        {\r\r
-         if (fgWarnError) AliError("failed to decode test pattern data");\r\r
-         return kFALSE; \r\r
-        }\r\r
-      return kTRUE;\r\r
-    } \r\r
-\r\r
-  fHC->fMCMmax = 0;\r\r
-  while (*fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd)\r\r
-    {\r\r
-      if (fHC->fMCMmax > TRD_MAX_MCM)\r\r
-  {\r\r
-          fHC->fCorrupted += 2;\r\r
-    if (fgDebugFlag) AliDebug(11,"More mcm data than expected!");\r\r
-    if (fRawReader) fRawReader->AddMajorErrorLog(kMCMoverflow, "Too many mcms found!"); \r\r
-    return kFALSE;\r\r
-  }\r\r
-\r\r
-      fMCM = &fHC->fMCMs[fHC->fMCMmax];\r\r
-\r\r
-      if (DecodeMCMheader() == kFALSE)\r\r
-  {\r\r
-          if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4\r\r
-    \r\r
-    if (fgSkipData == kTRUE || fHC->fCorrupted >= 16)\r\r
-              return kFALSE; // stop HC data reading\r\r
-          \r\r
-          fHC->fMCMmax++; // increase mcm counter to match with expected rob/mcm number\r\r
-\r\r
-          // in case we decide to keep reading data, skip this mcm data and find next mcm header \r\r
-          if (fMCM->fADCmaskCorrupted < 2) \r\r
-            {  \r\r
-              if (SkipMCMdata(fMCM->fADCcount*fMCM->fSingleADCwords) == kFALSE)\r\r
-            return kFALSE;\r\r
-              continue;\r\r
-            }\r\r
-          else \r\r
-            {\r\r
-              if (SeekNextMCMheader() == kFALSE)\r\r
-            return kFALSE;\r\r
-              continue;\r\r
-            }\r\r
-  }\r\r
-\r\r
-      fHC->fMCMmax++;\r\r
-\r\r
-      if (fMCM->fADCmax > 0)\r\r
-  {\r\r
-    fpPos++;\r\r
-    if (fpPos >= fpEnd)\r\r
-      {\r\r
-              fMCM->fCorrupted += 1;\r\r
-              if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4\r\r
-        if (fgDebugFlag)  AliDebug(9, Form("Buffer short of data. ADC data expected."));         \r\r
-        return kFALSE;\r\r
-      }\r\r
-\r\r
-    for (Int_t iadc = 0; iadc < fMCM->fADCmax; iadc++)\r\r
-      {\r\r
-        fADC = &fMCM->fADCs[iadc];\r\r
-        fADC->fADCnumber = fMCM->fADCchannel[iadc];\r\r
-\r\r
-        if (fgDebugFlag)  AliDebug(9, Form("This is ADC %d of %d. ADC number is %d.", \r\r
-            iadc+1, fMCM->fADCmax, fMCM->fADCchannel[iadc]));\r\r
-\r\r
-        if (fpPos + fMCM->fSingleADCwords >= fpEnd)\r\r
-    {\r\r
-      \r\r
-                  fMCM->fCorrupted += 2;\r\r
-                  if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4\r\r
-      if (fgDebugFlag) AliDebug(11,"ADC (10 words) expected. Not enough data in the buffer.");\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-              if (fHC->fRawVMajor < 64) // normal(real) ADC data\r\r
-                {\r\r
-            if (DecodeADC() == kFALSE)\r\r
-        {\r\r
-                      if (fMCM->fCorrupted < 4) fMCM->fCorrupted += 4; // benchmark mcm data corruption as 4\r\r
-                      if (fHC->fCorrupted < 4) fHC->fCorrupted += 4;   // benchmark hc data corruption as 4\r\r
-          if (fADC->fIsShared && fADC->fCorrupted == 16)   // check if we are out of the det when the pad is shared\r\r
-            {\r\r
-              fADC->fCOL = -1;\r\r
-              fpPos = fADC->fPos + fMCM->fSingleADCwords;\r\r
-            }\r\r
-          else\r\r
-            {\r\r
-              if (fgDebugFlag) AliDebug(11,Form("ADC decode failed."));\r\r
-                    if (fgSkipData == kTRUE || fHC->fCorrupted >= 16) \r\r
-                            return kFALSE; // stop HC data reading\r\r
-            }\r\r
-        }\r\r
-                } \r\r
-              else // test pattern data\r\r
-                {\r\r
-                  if (fgWarnError) AliError("These are test pattern data. You need other reader"); // will be served in other class\r\r
-                }\r\r
-      } \r\r
-  } \r\r
-      else\r\r
-  {\r\r
-    fpPos++;\r\r
-  }\r\r
-    }//while eof data\r\r
-\r\r
-  if (fpPos >= fpEnd)\r\r
-    {\r\r
-      if (fgDebugFlag) AliDebug(11,"We are at the end of buffer. There should be one more word left.");\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-//------------------------------------------------------------\r\r
-\r\r
-Bool_t\r\r
-AliTRDrawStream::DecodeADC()\r\r
-{\r\r
-  //\r\r
-  // decode single ADC channel\r\r
-  //\r\r
-\r\r
-  fADC->fCorrupted = 0;\r\r
-  if(fADC->fADCnumber%2==1) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL1);\r\r
-  if(fADC->fADCnumber%2==0) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL2);\r\r
-\r\r
-  fADC->fPos = fpPos;\r\r
-  fTbinADC = 0;\r\r
-\r\r
-  for (Int_t i = 0; i < TRD_MAX_TBINS; i++)\r\r
-    fADC->fSignals[i] = 0;\r\r
-\r\r
-  for (Int_t iw = 0; iw < fMCM->fSingleADCwords; iw++)\r\r
-    {\r\r
-      if (HC_HEADER_MASK_ERR(*fpPos) == 0 || *fpPos == END_OF_TRACKLET_MARKERNEW)\r\r
-        {\r\r
-          if (fgWarnError) AliError(Form("There should be ADC data. We meet HC header or END_OF_TRACKLET_MARKER 0x%08x",*fpPos));\r\r
-    fADC->fCorrupted += 16;\r\r
-          fHC->fCorrupted += 16; \r\r
-          fpPos--;\r\r
-\r\r
-          return kFALSE;\r\r
-        }\r\r
-      if (fMaskADCword != ADC_WORD_MASK(*fpPos))\r\r
-  {\r\r
-    fADC->fCorrupted += 1;\r\r
-          if (fgDebugFlag) AliDebug(11,Form("Wrong ADC data mask! ADC channel number: %02d [Expected mask: 0x%08x  Current mask: 0x%08x] MCM= %s Error : %d",\r\r
-                                          fADC->fADCnumber, fMaskADCword, ADC_WORD_MASK(*fpPos),DumpMCMinfo(fMCM),fADC->fCorrupted));\r\r
-          fpPos++;\r\r
-    continue;\r\r
-  }\r\r
-\r\r
-      // here we subtract the baseline ( == common additive)\r\r
-      fADC->fSignals[fTbinADC + 0] = ((*fpPos & 0x00000ffc) >>  2) - fgCommonAdditive;\r\r
-      fADC->fSignals[fTbinADC + 1] = ((*fpPos & 0x003ff000) >> 12) - fgCommonAdditive;\r\r
-      fADC->fSignals[fTbinADC + 2] = ((*fpPos & 0xffc00000) >> 22) - fgCommonAdditive;\r\r
-\r\r
-      fTbinADC += 3;\r\r
-      fpPos++;\r\r
-    }\r\r
-\r\r
-  if (fADC->fADCnumber <= 1 || fADC->fADCnumber == fMaxADCgeom - 1)\r\r
-    {\r\r
-      fADC->fIsShared = kTRUE;\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      fADC->fIsShared = kFALSE;\r\r
-    }\r\r
-\r\r
-  if ( fADC->fADCnumber >= fMaxADCgeom - 1)\r\r
-    {\r\r
-      fADC->fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber - 1);\r\r
-      fADC->fCOL--;\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      fADC->fCOL = fTRDfeeParam->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber);\r\r
-    }\r\r
-\r\r
-  if (fADC->fCOL >= fHC->fColMax || fADC->fCOL < 0)\r\r
-    {\r\r
-      if (fADC->fIsShared == kFALSE)\r\r
-  {\r\r
-    fADC->fCorrupted += 32;\r\r
-    if (fgDebugFlag) AliDebug(11,Form("Wrong column! ADCnumber %d MaxIs %d Col %d MaxIs %d MCM= %s", \r\r
-            fADC->fADCnumber, fMaxADCgeom, fADC->fCOL, fHC->fColMax, DumpMCMinfo(fMCM)));\r\r
-  }\r\r
-      //else\r\r
-  //{\r\r
-    // we are out of the det when the pad is shared\r\r
-    //if (fgDebugFlag) AliDebug(11, Form("Column out of the detector! ADCnumber %d MaxIs %d Col %d MaxIs %d MCM= %s", \r\r
-    //                              fADC->fADCnumber, fMaxADCgeom, fADC->fCOL, fHC->fColMax, DumpMCMinfo(fMCM)));\r\r
-    //fADC->fCorrupted += 32;\r\r
-  //}\r\r
-    }\r\r
-\r\r
-  if (fADC->fCorrupted > 0)\r\r
-    {\r\r
-      return kFALSE;\r\r
-    }\r\r
-\r\r
-  fDecodedADCs++;\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-\r\r
-\r\r
-void AliTRDrawStream::DecodeSMInfo(const UInt_t *word, struct AliTRDrawSM *sm) const\r\r
-{\r\r
-  //\r\r
-  // Decode Supermodule Index Word\r\r
-  // The Supermodule Index Word is a 32-Bit word wit following structure\r\r
-  // ssssssss ssssssss vvvv rrrr r d t mmmm\r\r
-  // s: Size of the Supermodule Header, v: Supermodule Header Version, r: Reserved for future use\r\r
-  // d: Track Data Enabled Bit, t: Tracklet Data Enabled Bit, m: Stack Mask \r\r
-  //\r\r
-  sm->fPos = (UInt_t*)word; \r\r
-\r\r
-  UInt_t vword = *word;\r\r
-  sm->fHeaderSize = SM_HEADER_SIZE(vword);\r\r
-    \r\r
-  if (TRACKLETS_ENABLED(vword) > 0)\r\r
-    sm->fTrackletEnable = kTRUE;\r\r
-  else\r\r
-    sm->fTrackletEnable = kFALSE;\r\r
-    \r\r
-  UInt_t stackMask = STACK_MASK(vword);\r\r
-  sm->fActiveStacks = 0;\r\r
-  for (Int_t i = 0; i < 5; i++)\r\r
-    {\r\r
-      if (IS_BIT_SET(stackMask,i) > 0)\r\r
-  {\r\r
-    sm->fStackActive[i] = kTRUE;\r\r
-    sm->fActiveStacks++;\r\r
-  }\r\r
-      else\r\r
-  {\r\r
-    sm->fStackActive[i] = kFALSE;\r\r
-  }\r\r
-    }\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-const char *AliTRDrawStream::DumpSMInfo(const struct AliTRDrawSM *sm)\r\r
-{\r\r
-  //\r\r
-  // Get SM structure into a const char\r\r
-  //\r\r
-  return Form("[ SM Info 0x%08x] : Hsize %d TrackletEnable %d Stacks %d %d %d %d %d",\r\r
-        *sm->fPos,\r\r
-        sm->fHeaderSize, sm->fTrackletEnable,\r\r
-        sm->fStackActive[0], sm->fStackActive[1], sm->fStackActive[2],\r\r
-        sm->fStackActive[3], sm->fStackActive[4]);      \r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-void AliTRDrawStream::DecodeStackInfo(const UInt_t *word, struct AliTRDrawStack *st) const\r\r
-{\r\r
-  //\r\r
-  // Decode Stack #i Index Word\r\r
-  // The Stack #i Index Word is a 32-Bit word wit following structure\r\r
-  // ssssssss ssssssss vvvv mmmm mmmmmmmm\r\r
-  // s: Size of the Stack #i Header, v: Supermodule Header Version, m: Link Mask\r\r
-  //\r\r
-  st->fPos = (UInt_t*)word;\r\r
-      \r\r
-  UInt_t vword = *word;\r\r
-  st->fHeaderSize = STACK_HEADER_SIZE(vword);\r\r
-\r\r
-  UInt_t linkMask = STACK_LINK_WORD(vword);\r\r
-  st->fActiveLinks = 0;\r\r
-  for (Int_t i = 0; i < 12; i++)\r\r
-    {\r\r
-      if (IS_BIT_SET(linkMask,i) > 0)\r\r
-  {\r\r
-    st->fLinksActive[i] = kTRUE;\r\r
-    st->fActiveLinks++;\r\r
-  }\r\r
-      else\r\r
-  {\r\r
-    st->fLinksActive[i] = kFALSE;\r\r
-  }\r\r
-    }\r\r
-}\r\r
-  \r\r
-//--------------------------------------------------------\r\r
-void AliTRDrawStream::DecodeStackHeader(const UInt_t *word, struct AliTRDrawStack *st, Int_t iword) const\r\r
-{\r\r
-  //\r\r
-  // decode gtu header for stack info\r\r
-  //\r\r
-      st->fPos = (UInt_t*)word;\r\r
-      \r\r
-      UInt_t vword = *word;\r\r
-      st->fLinksDataType[2*iword]    = LINK0_DATA_TYPE_FLAG(vword);\r\r
-      st->fLinksMonitor[2*iword]     = LINK0_MONITOR_FLAG(vword);\r\r
-      st->fLinksDataType[2*iword+1]  = LINK1_DATA_TYPE_FLAG(vword);\r\r
-      st->fLinksMonitor[2*iword+1]   = LINK1_MONITOR_FLAG(vword);\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-const char *AliTRDrawStream::DumpStackInfo(const struct AliTRDrawStack *st)\r\r
-{\r\r
-  //\r\r
-  // format the string with the stack info\r\r
-  //\r\r
-\r\r
-  return Form("[ Stack Info 0x%08x ] : Hsize %d Links Active %d %d %d %d %d %d %d %d %d %d %d %d",\r\r
-        *st->fPos,\r\r
-        st->fHeaderSize,\r\r
-        st->fLinksActive[0], st->fLinksActive[1], st->fLinksActive[2], st->fLinksActive[3],\r\r
-        st->fLinksActive[4], st->fLinksActive[5], st->fLinksActive[6], st->fLinksActive[7],\r\r
-        st->fLinksActive[8], st->fLinksActive[9], st->fLinksActive[10], st->fLinksActive[11]);\r\r
-\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-Bool_t AliTRDrawStream::DecodeHCwordH0(const UInt_t *word, struct AliTRDrawHC *hc) const\r\r
-{\r\r
-  //\r\r
-  // decode the hc header word 0\r\r
-  //\r\r
-  UInt_t vword = *word;\r\r
-\r\r
-  hc->fH0Corrupted = HC_HEADER_MASK_ERR(vword);\r\r
-  if (hc->fH0Corrupted > 0)\r\r
-    {\r\r
-    if (fgDebugFlag) AliDebug(11,Form("H0 Header Mask Error. Word 0x%08x", *fHC->fPos));\r\r
-    return kFALSE;\r\r
-    }\r\r
-\r\r
-  hc->fSpecialRawV =  HC_SPECIAL_RAW_VERSION(vword);\r\r
-  hc->fRawVMajor = HC_MAJOR_RAW_VERSION(vword);\r\r
-  hc->fRawVMajorOpt = HC_MAJOR_RAW_VERSION_OPT(vword); \r\r
-  hc->fRawVMinor = HC_MINOR_RAW_VERSION(vword);\r\r
-  hc->fNExtraWords = HC_EXTRA_WORDS(vword);\r\r
-  hc->fDCSboard = HC_DCS_BOARD(vword);\r\r
-  hc->fSM = HC_SM_NUMBER(vword);\r\r
-  hc->fStack = HC_STACK_NUMBER(vword);\r\r
-  hc->fLayer = HC_LAYER_NUMBER(vword);\r\r
-  hc->fSide = HC_SIDE_NUMBER(vword);\r\r
-\r\r
-  hc->fPos[0] = (UInt_t*)word;\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-Bool_t AliTRDrawStream::DecodeHCwordH1(const UInt_t *word, struct AliTRDrawHC *hc) const\r\r
-{\r\r
-  //\r\r
-  // decode the hc header word 1\r\r
-  //\r\r
-\r\r
-  UInt_t vword = *word;\r\r
-\r\r
-  hc->fH1Corrupted = HC_HEADER_MASK_ERR(vword);\r\r
-  if (hc->fH1Corrupted > 0)\r\r
-    { \r\r
-    if (fgDebugFlag) AliDebug(11,Form("H1 Header Mask Error. Word 0x%08x", *fHC->fPos));\r\r
-    return kFALSE;\r\r
-    }\r\r
-\r\r
-  hc->fTimeBins = HC_NTIMEBINS(vword);\r\r
-  hc->fBunchCrossCounter = HC_BUNCH_CROSS_COUNTER(vword);\r\r
-  hc->fPreTriggerCounter = HC_PRETRIGGER_COUNTER(vword);\r\r
-  hc->fPreTriggerPhase = HC_PRETRIGGER_PHASE(vword);\r\r
-\r\r
-  hc->fPos[1] = (UInt_t*)word;\r\r
-\r\r
-  return kTRUE;\r\r
-}\r\r
-  \r\r
-//--------------------------------------------------------\r\r
-const char *AliTRDrawStream::DumpHCinfoH0(const struct AliTRDrawHC *hc)\r\r
-{\r\r
-  //\r\r
-  // dump the hc header word 0\r\r
-  //\r\r
-  if (!hc)\r\r
-    return Form("Unable to dump. Null received as parameter!?!");\r\r
-  else\r\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\r
-    hc->fPos[0], *(hc->fPos[0]), hc->fRawVMajor, hc->fSM, hc->fStack, hc->fLayer, hc->fSide, hc->fDCSboard);\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-const char *AliTRDrawStream::DumpHCinfoH1(const struct AliTRDrawHC *hc)\r\r
-{\r\r
-  //\r\r
-  // dump the hc header word 1\r\r
-  //\r\r
-  if (!hc)\r\r
-    return Form("Unable to dump. Null received as parameter!?!");\r\r
-  else\r\r
-    return Form("[ HC[1] at 0x%08x ] : 0x%08x Info is : TBins %d BCcount %d PreTrigCount %d PreTrigPhase %d",\r\r
-    hc->fPos[1], *(hc->fPos[1]), hc->fTimeBins, hc->fBunchCrossCounter, hc->fPreTriggerCounter, hc->fPreTriggerPhase);\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-void AliTRDrawStream::DecodeMCMheader(const UInt_t *word, struct AliTRDrawMCM *mcm) const\r\r
-{\r\r
-  //\r\r
-  // decode the mcm header\r\r
-  //\r\r
-  UInt_t vword = *word;\r\r
-\r\r
-  if (vword == END_OF_TRACKLET_MARKERNEW) \r\r
-    {\r\r
-      if (fgWarnError) AliError(Form("There should be MCM header. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));\r\r
-      mcm->fMCMhdCorrupted += 16;\r\r
-      fHC->fCorrupted += 16; //to finish data reading of this HC\r\r
-    }\r\r
-\r\r
-  mcm->fMCMhdCorrupted = MCM_HEADER_MASK_ERR(vword); //if MCM header mask has error\r\r
-  if (fgDebugFlag && mcm->fMCMhdCorrupted != 0) AliDebug(11,Form("Wrong MCM header mask 0x%08x.\n", *fpPos));\r\r
-\r\r
-  mcm->fROB = MCM_ROB_NUMBER(vword);\r\r
-  mcm->fMCM = MCM_MCM_NUMBER(vword);\r\r
-  mcm->fEvCounter = MCM_EVENT_COUNTER(vword);\r\r
-  mcm->fPos = (UInt_t*)word;\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-UInt_t AliTRDrawStream::GetMCMadcMask(const UInt_t *word, struct AliTRDrawMCM *mcm) const\r\r
-{\r\r
-  //\r\r
-  // get the adc mask\r\r
-  //\r\r
-  UInt_t vword = *word;\r\r
-\r\r
-  mcm->fADCmax    = 0;\r\r
-  mcm->fADCMask   = 0;\r\r
-  mcm->fADCcount  = 0;\r\r
-  mcm->fADCMaskWord = vword;\r\r
-\r\r
-  if (vword == END_OF_TRACKLET_MARKERNEW)\r\r
-    {\r\r
-      if (fgWarnError) AliError(Form("There should be MCMadcMask. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));\r\r
-      mcm->fADCmaskCorrupted += 16;\r\r
-      fHC->fCorrupted += 16; //to finish data reading of this HC\r\r
-    }\r\r
-\r\r
-  if ( MCM_ADCMASK_MASK_ERR(vword) == 0 )\r\r
-    {\r\r
-      mcm->fADCMask  = MCM_ADCMASK_VAL(vword);\r\r
-      mcm->fADCcount = MCM_ADCMASK_NADC(~vword);\r\r
-    }\r\r
-  else\r\r
-    {\r\r
-      mcm->fADCMask = 0xffffffff;\r\r
-      mcm->fADCmaskCorrupted = 1; // mcm adc mask error\r\r
-      if (fgDebugFlag) AliDebug(11,Form("Wrong ADC Mask word 0x%08x.\n", *fpPos));\r\r
-    }\r\r
-\r\r
-  return mcm->fADCMask;\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-void AliTRDrawStream::DecodeMask(const UInt_t *word, struct AliTRDrawMCM *mcm) const\r\r
-{\r\r
-  //\r\r
-  // decode the adc mask - adcs to be read out\r\r
-  //\r\r
-  mcm->fMCMADCWords = 0;\r\r
-  mcm->fSingleADCwords = 0;\r\r
-  mcm->fADCmax = 0;\r\r
-  mcm->fADCMask = GetMCMadcMask(word, mcm);\r\r
-\r\r
-  if (mcm->fADCMask > 0)\r\r
-    {\r\r
-      for (Int_t i = 0; i < TRD_MAX_ADC; i++)\r\r
-  {\r\r
-    mcm->fADCchannel[mcm->fADCmax] = 0;\r\r
-    if( IS_BIT_SET(mcm->fADCMask,i) )\r\r
-      {\r\r
-        mcm->fADCchannel[mcm->fADCmax] = i;\r\r
-        mcm->fADCmax++;\r\r
-      }\r\r
-  }\r\r
-    }\r\r
-  if (mcm->fADCcount != mcm->fADCmax && fHC->fRawVMajor >= 32) // backward compatibility\r\r
-    {\r\r
-      mcm->fADCmaskCorrupted += 2; \r\r
-      if (fgDebugFlag) AliDebug(11,Form("ADC counts from ADCMask are different %d %d : ADCMask word 0x%08x\n", mcm->fADCcount, mcm->fADCmax, *fMCM->fPos));\r\r
-    }\r\r
-}\r\r
-\r\r
-//--------------------------------------------------------\r\r
-void AliTRDrawStream::MCMADCwordsWithTbins(UInt_t fTbins, struct AliTRDrawMCM *mcm) const\r\r
-{\r\r
-  //\r\r
-  //  count the expected mcm words for a given tbins\r\r
-  //\r\r
-  mcm->fMCMADCWords = ( mcm->fADCmax ) * ( fTbins / 3 );\r\r
-  mcm->fSingleADCwords = 0;\r\r
-  if (mcm->fADCmax > 0)\r\r
-    {\r\r
-      mcm->fSingleADCwords = mcm->fMCMADCWords/mcm->fADCmax;\r\r
-    }\r\r
-}\r\r
-  \r\r
-//--------------------------------------------------------\r\r
-const char *AliTRDrawStream::DumpMCMinfo(const struct AliTRDrawMCM *mcm)\r\r
-{\r\r
-  //\r\r
-  // mcm info in a string\r\r
-  //\r\r
-  if (!mcm)\r\r
-    return Form("Unable to dump. Null received as parameter!?!");\r\r
-  else\r\r
-    return Form("[ MCM 0x%08x ] : ROB %d MCM %d EvCounter %d", *(mcm->fPos), mcm->fROB, mcm->fMCM, mcm->fEvCounter);\r\r
-}\r\r
-  \r\r
-//--------------------------------------------------------\r\r
-const char *AliTRDrawStream::DumpMCMadcMask(const struct AliTRDrawMCM *mcm)\r\r
-{\r\r
-  //\r\r
-  // mcm adc mask in a string\r\r
-  //\r\r
-  if (!mcm)\r\r
-    return Form("Unable to dump. Null received as parameter!?!");\r\r
-\r\r
-  TString tsreturn = Form("[Word] : 0x%08x => [Mask] : 0x%08x : ", mcm->fADCMaskWord, mcm->fADCMask);\r\r
-  for (Int_t i = 0; i < 21; i++)\r\r
-    {\r\r
-      tsreturn += Form("%d ", mcm->fADCchannel[i]);\r\r
-    }\r\r
-  tsreturn += "";\r\r
-  return tsreturn.Data();\r\r
-}\r\r
+/**************************************************************************\r
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
+q*                                                                        *\r
+* Author: The ALICE Off-line Project.                                    *\r
+* Contributors are mentioned in the code where appropriate.              *\r
+*                                                                        *\r
+* Permission to use, copy, modify and distribute this software and its   *\r
+* documentation strictly for non-commercial purposes is hereby granted   *\r
+* without fee, provided that the above copyright notice appears in all   *\r
+* copies and that both the copyright notice and this permission notice   *\r
+* appear in the supporting documentation. The authors make no claims     *\r
+* about the suitability of this software for any purpose. It is          *\r
+* provided "as is" without express or implied warranty.                  *\r
+**************************************************************************/\r
+\r
+/* $Id: AliTRDrawStream.cxx 27797 2008-08-05 14:37:22Z cblume $ */\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+//                                                                           //\r
+// This class provides access to TRD digits in raw data.                     //\r
+//                                                                           //\r
+// It loops over all TRD digits in the raw data given by the AliRawReader.   //\r
+// The Next method goes to the next digit. If there are no digits left       //\r
+// it returns kFALSE.                                                        //\r
+// Several getters provide information about the current digit.              //\r
+//                                                                           //\r
+// Author: M. Ploskon (ploskon@ikf.uni-frankfurt.de)                         //\r
+//                                                                           //\r
+///////////////////////////////////////////////////////////////////////////////\r
+\r
+#include "TString.h"\r
+#include "TFile.h"\r
+#include "TTreeStream.h"\r
+\r
+#include "AliTRDrawStream.h"\r
+#include "AliTRDgeometry.h"\r
+#include "AliTRDfeeParam.h"\r
+#include "AliTRDdigitsManager.h"\r
+#include "AliTRDarrayDictionary.h"\r
+#include "AliTRDarrayADC.h"\r
+#include "AliTRDSignalIndex.h"\r
+//#include "AliTRDcalibDB.h" \r
+//#include "Cal/AliTRDCalPadStatus.h" //is now read in clusterizer\r
+#include "AliTRDrawTPStream.h"\r
+\r
+#include "AliLog.h"\r
+#include "AliRawReader.h"\r
+\r
+#define END_OF_TRACKLET_MARKEROLD 0xaaaaaaaa\r
+#define END_OF_TRACKLET_MARKERNEW 0x10001000\r
+#define ENDOFRAWDATAMARKER 0x00000000\r
+#define WORD_SIZE sizeof(UInt_t)           // size of a word in bytes\r
+#define EXTRA_LEAD_WORDS 24\r
+#define CDH_WORDS 8\r
+\r
+#define IS_BIT_SET(w,b) ( ((w) >> (b)) & 0x1 ) // 1 if bit b is set in word w\r
+#define GET_VALUE_AT(w,m,s) (( (w) >> (s)) & (m) )      // get value of word w rshifted by s and mask with m\r
+\r
+// SM index word masks:\r
+#define SM_HEADER_SIZE(w) GET_VALUE_AT(w,0xffff,16) \r
+#define TRACKLETS_ENABLED(w) IS_BIT_SET(w,5)\r
+#define STACK_MASK(w) ((w) & 0x1f)\r
+\r
+// Stack word masks\r
+#define STACK_HEADER_SIZE(w) GET_VALUE_AT(w,0xffff,16)\r
+#define STACK_LINK_WORD(w) ((w) & 0xfff)\r
+#define LINK0_DATA_TYPE_FLAG(w) (GET_VALUE_AT(w,0x3,4) == (0x0) ? 0 : 1) // 0 if physics data\r
+#define LINK1_DATA_TYPE_FLAG(w) (GET_VALUE_AT(w,0x3,20) == (0x0) ? 0 : 1) // 0 if physics data\r
+#define LINK0_MONITOR_FLAG(w) (GET_VALUE_AT(w,0xf,0) == (0x0) ? 0 : 1) // 0 if OK\r
+#define LINK1_MONITOR_FLAG(w) (GET_VALUE_AT(w,0xf,16) == (0x0) ? 0 : 1) // 0 if OK\r
+\r
+// HC word masks\r
+//#define HC_HEADER_MASK_ERR(w) ( ((w) & (0x80000003)) == (0x80000001) ? 0 : 1) // 0 if OK!!!\r
+#define HC_HEADER_MASK_ERR(w) ( ((w) & (0x3)) == (0x1) ? 0 : 1) // 0 if OK!!!\r
+\r
+// HC word 0\r
+#define HC_SPECIAL_RAW_VERSION(w) IS_BIT_SET(w,31)\r
+#define HC_MAJOR_RAW_VERSION(w) GET_VALUE_AT(w,0x7f,24)\r
+#define HC_MAJOR_RAW_VERSION_OPT(w) GET_VALUE_AT(w,0x7,24)\r
+#define HC_MINOR_RAW_VERSION(w) GET_VALUE_AT(w,0x7f,17)\r
+#define HC_EXTRA_WORDS(w) GET_VALUE_AT(w,0x7,14)\r
+#define HC_DCS_BOARD(w) GET_VALUE_AT(w,0xfff<<20,20)\r
+#define HC_SM_NUMBER(w) GET_VALUE_AT(w,0x1f,9)\r
+#define HC_LAYER_NUMBER(w) GET_VALUE_AT(w,0x7,6)\r
+#define HC_STACK_NUMBER(w) GET_VALUE_AT(w,0x7,3)\r
+#define HC_SIDE_NUMBER(w) IS_BIT_SET(w,2)\r
+\r
+// HC word 1\r
+#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,2)\r
+\r
+// MCM word and ADC mask\r
+#define MCM_HEADER_MASK_ERR(w) ( ((w) & (0xf)) == (0xc) ? 0 : 1) // 0 if OK!!!\r
+#define MCM_ADCMASK_MASK_ERR(w) ( ((w) & (0xf)) == (0xc) ? 0 : 1) // 0 if OK!!!\r
+#define MCM_MCM_NUMBER(w) GET_VALUE_AT(w,0x0f,24)\r
+#define MCM_ROB_NUMBER(w) GET_VALUE_AT(w,0x7,28)\r
+#define MCM_EVENT_COUNTER(w) GET_VALUE_AT(w,0x00fffff,4)\r
+#define MCM_ADCMASK_VAL(w) GET_VALUE_AT(w,0x1fffff,4)\r
+#define MCM_ADCMASK_NADC(w) GET_VALUE_AT(w,0x1f,25)\r
+\r
+#define MCM_DUMMY_ADCMASK_VAL 0x015fffffc  // updated \r
+#define ADCDATA_VAL1 0x2  // updated \r
+#define ADCDATA_VAL2 0x3  // updated \r
+\r
+//--------------------------------------------------------\r
+#define ADC_WORD_MASK(w) ((w) & 0x3)\r
+//--------------------------------------------------------\r
+\r
+\r
+ClassImp(AliTRDrawStream)\r
+\r
+Bool_t AliTRDrawStream::fgExtraSkip = kFALSE;\r
+Bool_t AliTRDrawStream::fgSkipCDH = kFALSE;\r
+Bool_t AliTRDrawStream::fgWarnError = kTRUE;\r
+Bool_t AliTRDrawStream::fgCleanDataOnly = kFALSE;\r
+Bool_t AliTRDrawStream::fgDebugFlag = kTRUE;\r
+Bool_t AliTRDrawStream::fgEnableMemoryReset = kTRUE;\r
+Bool_t AliTRDrawStream::fgStackNumberChecker = kTRUE;\r
+Bool_t AliTRDrawStream::fgStackLinkNumberChecker = kTRUE;\r
+Bool_t AliTRDrawStream::fgSkipData = kTRUE;\r
+Bool_t AliTRDrawStream::fgEnableDecodeConfigData = kFALSE;\r
+Int_t AliTRDrawStream::fgDumpHead = -1;\r
+Int_t  AliTRDrawStream::fgCommonAdditive = 0;\r
+Int_t AliTRDrawStream::fgEmptySignals[] = \r
+  {\r
+    -1, -1, -1, -1, -1,  -1, -1, -1, -1, -1,  -1, -1, -1, -1, -1\r
+    -1, -1, -1, -1, -1,  -1, -1, -1, -1, -1,  -1, -1, -1, -1, -1\r
+  };\r
+Short_t AliTRDrawStream::fgMCMordering[] =\r
+  {\r
+    12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3 \r
+  };\r
+Short_t AliTRDrawStream::fgROBordering[] =\r
+  {\r
+    0, 1, 2, 3\r
+  };\r
+Int_t  AliTRDrawStream::fgLastHC = -1;\r
+Int_t  AliTRDrawStream::fgLastROB = -1;\r
+Int_t  AliTRDrawStream::fgLastIndex = -1;\r
+Bool_t  AliTRDrawStream::fgDumpingEnable = kFALSE;\r
+Int_t  AliTRDrawStream::fgDumpingSM = -1;\r
+Int_t  AliTRDrawStream::fgDumpingStack = -1;\r
+Int_t  AliTRDrawStream::fgDumpingLayer = -1;\r
+Int_t  AliTRDrawStream::fgDumpingROB = -1;\r
+Int_t  AliTRDrawStream::fgDumpingMCM = -1;\r
+\r
+\r
+AliTRDrawStream::AliTRDrawStream()\r
+  : AliTRDrawStreamBase()\r
+  , fSM()\r
+  , fStack(0)\r
+  , fHC(0)\r
+  , fMCM(0)\r
+  , fADC(0)\r
+  , fpPos(0)\r
+  , fpBegin(0)\r
+  , fpEnd(0)\r
+  , fWordLength(0)\r
+  , fStackNumber(-1)\r
+  , fStackLinkNumber(-1)\r
+  , fhcMCMcounter(0)\r
+  , fmcmADCcounter(0)\r
+  , fLinkTrackletCounter(-1)\r
+  , fEndOfTrackletCount(-1)\r
+  , fNWordsCounter(-1)\r
+  , fMaskADCword(0)\r
+  , fTbinADC(0)\r
+  , fDecodedADCs(-1)\r
+  , fEventCounter(0)\r
+  , fLastEventCounter(0)\r
+  , fSharedPadsOn(kFALSE)\r
+  , fMaxADCgeom(0)\r
+  , fBufferRead(0)\r
+  , fGeometry(0)\r
+  , fRawReader(0)\r
+  , fTRDfeeParam(0)\r
+{\r
+  //\r
+  // default constructor\r
+  //\r
+\r
+  if (Init() == kFALSE)\r
+    {\r
+      AliWarning("Unable to Init.");     \r
+    }\r
+}\r
+\r
+//--------------------------------------------------------\r
+AliTRDrawStream::AliTRDrawStream(AliRawReader *rawReader)\r
+  : AliTRDrawStreamBase(rawReader)\r
+  , fSM()\r
+  , fStack(0)\r
+  , fHC(0)\r
+  , fMCM(0)\r
+  , fADC(0)\r
+  , fpPos(0)\r
+  , fpBegin(0)\r
+  , fpEnd(0)\r
+  , fWordLength(0)\r
+  , fStackNumber(-1)\r
+  , fStackLinkNumber(-1)\r
+  , fhcMCMcounter(0)\r
+  , fmcmADCcounter(0)\r
+  , fLinkTrackletCounter(-1)\r
+  , fEndOfTrackletCount(-1)\r
+  , fNWordsCounter(-1)\r
+  , fMaskADCword(0)\r
+  , fTbinADC(0)\r
+  , fDecodedADCs(-1)\r
+  , fEventCounter(0)\r
+  , fLastEventCounter(0)\r
+  , fSharedPadsOn(kFALSE)\r
+  , fMaxADCgeom(0)\r
+  , fBufferRead(0)\r
+  , fGeometry(0)\r
+  , fRawReader(rawReader)\r
+  , fTRDfeeParam(0)\r
+{\r
+  //\r
+  // default constructor\r
+  //\r
+  if (fRawReader)\r
+    {    \r
+      if (Init() == kFALSE)\r
+  {\r
+    AliWarning("Unable to Init. Try setting up the reader with SetReader or buffer with Init(void *, UInt_t )");         \r
+  }\r
+    }\r
+  else\r
+    {\r
+      AliWarning("Unable to setup reader. Use SetReader(AliRawReader*).");\r
+    }\r
+}\r
+\r
+//------------------------------------------------------------\r
+\r
+AliTRDrawStream::AliTRDrawStream(const AliTRDrawStream& /*st*/)\r
+  : AliTRDrawStreamBase()\r
+  , fSM()\r
+  , fStack(0)\r
+  , fHC(0)\r
+  , fMCM(0)\r
+  , fADC(0)\r
+  , fpPos(0)\r
+  , fpBegin(0)\r
+  , fpEnd(0)\r
+  , fWordLength(0)\r
+  , fStackNumber(-1)\r
+  , fStackLinkNumber(-1)\r
+  , fhcMCMcounter(0)\r
+  , fmcmADCcounter(0)\r
+  , fLinkTrackletCounter(-1)\r
+  , fEndOfTrackletCount(-1)\r
+  , fNWordsCounter(-1)\r
+  , fMaskADCword(0)\r
+  , fTbinADC(0)\r
+  , fDecodedADCs(-1)\r
+  , fEventCounter(0)\r
+  , fLastEventCounter(0)\r
+  , fSharedPadsOn(kFALSE)\r
+  , fMaxADCgeom(0)\r
+  , fBufferRead(0)\r
+  , fGeometry(0)\r
+  , fRawReader(0)\r
+  , fTRDfeeParam(0)\r
+{\r
+  //\r
+  // Copy constructor\r
+  // \r
+  AliError("Not implemeneted.");\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t AliTRDrawStream::SetRawVersion(Int_t fraw)\r
+{\r
+  //\r
+  // function provided for backward compatibility\r
+  //\r
+  AliWarning("Raw data version is read from raw data stream! No point of setting it in here.");\r
+  fraw = 0; // avoid warnings\r
+  return kFALSE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+AliTRDrawStream::~AliTRDrawStream()\r
+{\r
+  //\r
+  // destructor\r
+  //\r
+  delete fGeometry;\r
+}\r
+\r
+//------------------------------------------------------------\r
+\r
+AliTRDrawStream &\r
+AliTRDrawStream::operator=(const AliTRDrawStream &)\r
+{\r
+  //\r
+  // we are not using this functionality\r
+  //\r
+  AliFatal("May not use.");\r
+  return *this;\r
+}\r
+\r
+//___________________________________________________________\r
+void \r
+AliTRDrawStream::SwapOnEndian()\r
+{\r
+  //\r
+  // Check the endian and swap if needed\r
+  //\r
+  int itemp = 1;\r
+  char* ptemp = (char*) &itemp;\r
+  if (ptemp[0] != 1)\r
+    {\r
+      if (fgDebugFlag) AliDebug(8, "Swapping.");\r
+\r
+      fpPos = fpBegin;\r
+      UInt_t iutmp = 0;\r
+      while (fpPos < fpEnd)\r
+  {\r
+    fpPos += 1;\r
+    iutmp = (((*fpPos & 0x000000ffU) << 24) | ((*fpPos & 0x0000ff00U) <<  8) |\r
+      ((*fpPos & 0x00ff0000U) >>  8) | ((*fpPos & 0xff000000U) >> 24));\r
+    // here we override the value in the buffer!\r
+    *fpPos = iutmp;      \r
+  }\r
+      fpPos = fpBegin;\r
+    }\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t\r
+AliTRDrawStream::DumpWords(UInt_t *px, UInt_t iw, UInt_t marker)\r
+{\r
+    //UInt_t iEnd = iw;\r
+    //if ( iw ==0 ) iEnd = (fpEnd - px)/sizeof(UInt_t); // if iw is 0, dump all words\r
+\r
+  TString tsreturn = Form("\n[ Dump Sequence at 0x%08x ] : ", px);\r
+  for (UInt_t i = 0; i < iw; i++)\r
+  //for (UInt_t i = 0; i < iEnd; i++)\r
+    {\r
+      if ( iw != 0 && px + iw > fpEnd) return kFALSE;\r
+\r
+      if (i % 8 == 0) tsreturn += "\n                              ";\r
+      if (marker != 0 && marker == px[i]) tsreturn += Form(" *>0x%08x<* ", px[i]);\r
+      else tsreturn += Form("0x%08x ", px[i]);\r
+    }\r
+  tsreturn += "\n";\r
+\r
+  AliInfo(tsreturn.Data());\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::SkipWords(UInt_t iw)\r
+{\r
+  //\r
+  // Skip words corresponding to iw\r
+  //\r
+  if ( fpPos + iw < fpEnd )\r
+    {\r
+      fpPos += iw;\r
+      return kTRUE;\r
+    }\r
+  else\r
+    {\r
+      if (fgWarnError) AliWarning(Form("Skip %d words failed. %d available", iw, fpEnd - fpPos - 1));\r
+      return kFALSE;\r
+    }\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::SetReader(AliRawReader * reader)\r
+{\r
+  //\r
+  // Set reader pointer\r
+  //\r
+\r
+  if (reader != 0)\r
+    {\r
+      fRawReader = reader;\r
+      if (fRawReader)\r
+  {      \r
+    return Init();\r
+  }\r
+      else\r
+  {\r
+    AliWarning("Unable to setup reader.");\r
+    return kFALSE;\r
+  }\r
+    }\r
+  else\r
+    {\r
+      AliWarning("AliRawReader argument is 0.");\r
+      fRawReader = 0;\r
+    }\r
+\r
+  return kFALSE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Int_t \r
+AliTRDrawStream::NextBuffer()\r
+{\r
+  //\r
+  // return -1 if no more buffers available\r
+  // return  0 DecodeSM failed (clean data required for example) but still maybe more data to come\r
+  // return  1 DecodeSM OK\r
+  // \r
+\r
+  if (fRawReader != 0)\r
+    {\r
+      UChar_t *buffer = 0;\r
+      UInt_t length = 0;\r
+      Bool_t kBufferSet = fRawReader->ReadNextData(buffer);\r
+      if (kBufferSet == kTRUE)\r
+  {\r
+    if (fgDebugFlag)  AliDebug(9, "Buffer is set.");\r
+    length = fRawReader->GetDataSize();\r
+    if (fgExtraSkip == kTRUE)\r
+      {\r
+        buffer += EXTRA_LEAD_WORDS * WORD_SIZE;\r
+        length -= EXTRA_LEAD_WORDS * WORD_SIZE;\r
+      }\r
+\r
+    if (fgSkipCDH == kTRUE)\r
+      {\r
+        buffer += CDH_WORDS * WORD_SIZE;\r
+        length -= CDH_WORDS * WORD_SIZE;             \r
+      }\r
+\r
+    if (length > 0)\r
+      {\r
+        if (fgDebugFlag)  AliDebug(9, Form("Buffer length : %d", length));\r
+              if (fgEnableMemoryReset) ResetMemory(); //[mj]\r
+        if (DecodeSM((void*)buffer, length) == kTRUE)\r
+    return 1;\r
+        else\r
+    return 0;\r
+      }\r
+  }\r
+      else\r
+  {\r
+    return -1;\r
+  }\r
+    }\r
+\r
+  return -1;\r
+}\r
+\r
+//------------------------------------------------------------\r
+void \r
+AliTRDrawStream::ResetCounters()\r
+{\r
+  //\r
+  // reset some global counters\r
+  //\r
+  fBufferRead = kFALSE; // important to read buffer\r
+\r
+  fStackNumber = 0;\r
+  fStackLinkNumber = 0;\r
+  fDecodedADCs = 0;\r
+\r
+  fSM.fActiveStacks = 0;\r
+  fSM.fNexpectedHalfChambers = 0;\r
+\r
+  fLinkTrackletCounter = 0;\r
+  fLastEventCounter = 0;\r
+  fEventCounter = 0;\r
+}\r
+\r
+//------------------------------------------------------------\r
+void \r
+AliTRDrawStream::ResetIterators()\r
+{\r
+  //\r
+  // reset data which should be reset every sm\r
+  //\r
+  fStackNumber = 0;     // reset for Next() function \r
+  fStackLinkNumber = 0; // reset for Next() function\r
+  fhcMCMcounter = 0;  \r
+  fmcmADCcounter = 0;\r
+}\r
+\r
+//------------------------------------------------------------\r
+void\r
+AliTRDrawStream::ResetPerSM()\r
+{\r
+  //\r
+  // reset every SM\r
+  //\r
+\r
+  fSM.fHeaderSize = 0;\r
+  fSM.fTrackletEnable = kFALSE;\r
+  fSM.fCorrupted = 0;\r
+  fSM.fNexpectedHalfChambers = 0;\r
+  fSM.fNexpectedHalfChambers = 0;\r
+  fSM.fClean = kTRUE;\r
+  fSM.fPos = NULL;\r
+  for (Int_t i=0; i<5; i++){\r
+    fSM.fStackActive[i] = kFALSE;\r
+  }\r
+}     \r
+\r
+//------------------------------------------------------------\r
+void\r
+AliTRDrawStream::ResetPerStack()\r
+{\r
+  //\r
+  // reset every Stack\r
+  //\r
+\r
+  fStack->fHeaderSize = 0;\r
+  fStack->fActiveLinks = 0;\r
+  fStack->fPos = NULL;\r
+  for (Int_t i=0; i<12; i++){\r
+    fStack->fLinksActive[i] = kFALSE;\r
+    fStack->fLinksDataType[i] = 0;\r
+    fStack->fLinksMonitor[i] = 0;\r
+    fStack->fLinkMonitorError[i] = 0;\r
+  }\r
+}\r
+\r
+//------------------------------------------------------------\r
+void \r
+AliTRDrawStream::ResetPerHC()\r
+{\r
+  //\r
+  // reset every HC\r
+  //\r
+  fEventCounter = 0;\r
+  fHC->fTrackletError = 0;\r
+  fHC->fNTracklets = 0;\r
+  fHC->fSpecialRawV = 0;\r
+  fHC->fRawVMajor = 0;\r
+  fHC->fRawVMajorOpt = 0;\r
+  fHC->fRawVMinor = 0;\r
+  fHC->fNExtraWords = 0;\r
+  fHC->fDCSboard = 0;\r
+  fHC->fSM = 0;\r
+  fHC->fStack = 0;\r
+  fHC->fLayer = 0;\r
+  fHC->fSide = 0;\r
+  fHC->fTimeBins = 0;\r
+  fHC->fBunchCrossCounter = 0;\r
+  fHC->fPreTriggerCounter = 0;\r
+  fHC->fPreTriggerPhase = 0;\r
+  fHC->fDET = 0;\r
+  fHC->fROC = 0;\r
+  fHC->fRowMax = 0;\r
+  fHC->fColMax = 0;\r
+  fHC->fMCMmax = 0;\r
+\r
+  fHC->fH0Corrupted = 0;\r
+  fHC->fH1Corrupted = 0;\r
+  fHC->fCorrupted = 0;\r
+}\r
+\r
+//------------------------------------------------------------\r
+void\r
+AliTRDrawStream::ResetPerMCM()\r
+{\r
+  //\r
+  // reset every MCM \r
+  //\r
+  fMCM->fROB = 0;\r
+  fMCM->fMCM = 0;\r
+  fMCM->fROW = 0;\r
+  fMCM->fEvCounter = 0;\r
+  fMCM->fADCMask = 0;\r
+  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
+  fMCM->fCorrupted = 0;\r
+  fMCM->fPos = NULL;\r
+  fMCM->fAdcDataPos = NULL;\r
+  fMCM->fADCcounter = 0;\r
+\r
+  for (Int_t i=0; i<21; i++){\r
+    fMCM->fADCchannel[i] = 0;\r
+  }\r
+}\r
+\r
+//------------------------------------------------------------\r
+void\r
+AliTRDrawStream::ResetPerADC()\r
+{\r
+  //\r
+  // reset every ADC \r
+  //\r
+  fADC->fPos = NULL;\r
+  fADC->fADCnumber = 0;\r
+  fADC->fCOL = 0;\r
+  fADC->fIsShared = kTRUE;\r
+  fADC->fCorrupted = 0;\r
+\r
+  for (Int_t i=0; i<30; i++){\r
+    fADC->fSignals[i] = 0;\r
+  }\r
+}\r
+\r
+//------------------------------------------------------------\r
+void\r
+AliTRDrawStream::ResetMemory()\r
+{                 \r
+  //              \r
+  // initialize all the data members to prevent read data\r
+  // from previous buffer\r
+  //              \r
+  ResetPerSM();\r
+  for (Int_t istack=0; istack<5; istack++){\r
+    fStack = &fSM.fStacks[istack];\r
+    ResetPerStack();\r
+    for (Int_t ilink=0; ilink<12; ilink++){\r
+        fHC = &fStack->fHalfChambers[ilink];\r
+        ResetPerHC();\r
+        for (Int_t imcm=0; imcm<12; imcm++){\r
+          fMCM = &fHC->fMCMs[imcm];\r
+          ResetPerMCM();\r
+          for (Int_t iadc=0; iadc<12; iadc++){\r
+              fADC = &fMCM->fADCs[iadc];\r
+              ResetPerADC();\r
+          }\r
+        }\r
+    }      \r
+  }\r
+}         \r
+\r
+//------------------------------------------------------------\r
+\r
+Bool_t \r
+AliTRDrawStream::Next()\r
+{\r
+  //\r
+  // returns with true on next adc read\r
+  // returns false on errors and end of buffer\r
+  // \r
+if (fBufferRead)\r
+  {\r
+\r
+    while (fStackNumber < 5 && fSM.fActiveStacks > 0)\r
+      {\r
+        if(fSM.fStackActive[fStackNumber] == kTRUE)\r
+    {\r
+      fStack = &fSM.fStacks[fStackNumber];\r
+      while (fStackLinkNumber < 12)\r
+        {\r
+          if (fStack->fLinksActive[fStackLinkNumber] == kTRUE && fStack->fLinksMonitor[fStackLinkNumber] == 0)\r
+      {\r
+        fHC = &fStack->fHalfChambers[fStackLinkNumber];\r
+        if (!fHC)\r
+          {\r
+            AliError(Form("HC missing at stack %d link %d", fStackNumber, fStackLinkNumber));\r
+            return kFALSE;\r
+          }\r
+        if (fHC->fCorrupted == 0 && (fHC->fH0Corrupted == 0 && fHC->fH1Corrupted == 0) | !fgSkipData) // if HC data corrupted(in any case), we don't read data at all from this HC \r
+          {\r
+            while (fhcMCMcounter < fHC->fMCMmax)\r
+        {\r
+          fMCM = &fHC->fMCMs[fhcMCMcounter];\r
+          if (!fMCM)\r
+            {\r
+              AliError(Form("HC missing at stack %d link %d atMCMslot %d", \r
+                fStackNumber, fStackLinkNumber, fhcMCMcounter));\r
+              return kFALSE;\r
+            }\r
+          while(fmcmADCcounter < fMCM->fADCmax)\r
+            {\r
+              fADC = &fMCM->fADCs[fmcmADCcounter];\r
+              if (!fADC)\r
+          {\r
+            AliError(Form("ADC missing at stack %d link %d MCMslot %d ADCslot %d", \r
+              fStackNumber, fStackLinkNumber, fhcMCMcounter, fmcmADCcounter));\r
+            return kFALSE;\r
+          }\r
+              fmcmADCcounter++;\r
+              if (fSharedPadsOn)\r
+          {\r
+            return kTRUE;\r
+          }\r
+              else\r
+          {\r
+            if (fADC->fIsShared == kFALSE)\r
+              return kTRUE;\r
+          }\r
+            } //while adc in MCM\r
+          fhcMCMcounter++;\r
+          // next MCM should go through all active ADCs\r
+          fmcmADCcounter = 0;\r
+        } // while mcm\r
+          } // if HC OK\r
+      }// if link active\r
+          fStackLinkNumber++;\r
+          // next stack link (HC) should go through all active MCMs\r
+          fhcMCMcounter = 0;\r
+        }// while links\r
+    }// if stack active\r
+        fStackNumber++;\r
+        // next stack should go through all links - start from 0\r
+        fStackLinkNumber = 0;\r
+      }\r
+  } // fBufferRead\r
+\r
+  // in case rawreader manages the mem buffers, go for the next buffer \r
+  if (fRawReader)\r
+    {\r
+      Int_t nextBuff = NextBuffer();\r
+      while (nextBuff != -1)\r
+    {\r
+      if (nextBuff > 0)\r
+              {\r
+                fBufferRead = kTRUE;\r
+          return Next();                 \r
+              }\r
+      nextBuff = NextBuffer();\r
+    }\r
+    }\r
+\r
+  return kFALSE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Int_t \r
+AliTRDrawStream::NextChamber(AliTRDdigitsManager *const digitsManager, UInt_t **trackletContainer) \r
+{\r
+  //\r
+  // Fills single chamber digit array \r
+  // Return value is the detector number\r
+  //\r
+\r
+  //AliTRDcalibDB *cal = AliTRDcalibDB::Instance();\r
+  AliTRDarrayADC *digits = 0;\r
+  AliTRDarrayDictionary *track0 = 0;\r
+  AliTRDarrayDictionary *track1 = 0;\r
+  AliTRDarrayDictionary *track2 = 0; \r
+  AliTRDSignalIndex *indexes = 0;\r
+\r
+  // Loop through the digits\r
+  Int_t lastdet = -1;\r
+  Int_t det     = -1;\r
+  Int_t lastside = -1; \r
+  Int_t side     = -1;\r
+  Int_t it = 0;\r
+  Int_t ntracklets = 0;\r
+\r
+  if (trackletContainer){ \r
+    for (Int_t i = 0; i < 2; i++) \r
+      for (Int_t j = 0; j < MAX_TRACKLETS_PERHC; j++) \r
+          trackletContainer[i][j] = 0; \r
+  }\r
+\r
+  while (Next()) \r
+    {      \r
+      det    = GetDet();\r
+      side   = GetSide();\r
+\r
+      if (trackletContainer)\r
+        {\r
+        if ((det + side*AliTRDgeometry::kNdet) != (lastdet + lastside*AliTRDgeometry::kNdet))\r
+        {\r
+          if (det != lastdet)\r
+            {\r
+              if (lastdet != -1)\r
+                {\r
+                fmcmADCcounter--; \r
+                return lastdet;\r
+                }\r
+            }\r
+          ntracklets = GetNTracklets();\r
+          if(ntracklets > 0) memcpy(trackletContainer[side], GetTrackletWords(), sizeof(UInt_t) * ntracklets); //copy tracklet words to trackletContainer array\r
+          lastside = side; \r
+          } \r
+        } \r
+\r
+      if (det != lastdet) \r
+  { \r
+    // If new detector found\r
+    if (lastdet == -1)\r
+      {\r
+        lastdet = det;\r
+      }\r
+    else\r
+      {\r
+        fmcmADCcounter--; \r
+        return lastdet;\r
+      }\r
+\r
+    if (det < 0 || det >= AliTRDgeometry::kNdet)\r
+      {\r
+        if (fSM.fClean == kTRUE)\r
+    {\r
+      AliError(Form("Strange Det Number %d BUT event buffer seems to be clean.", det));\r
+    }\r
+        else\r
+    {\r
+      AliError(Form("Strange Det Number %d. Event buffer marked NOT clean!", det));\r
+    }\r
+        continue;\r
+      }\r
+\r
+    // Add a container for the digits of this detector\r
+    digits = (AliTRDarrayADC *) digitsManager->GetDigits(det);\r
+\r
+          if (digitsManager->UsesDictionaries()) \r
+            {\r
+        track0 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,0);\r
+        track1 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,1);\r
+        track2 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,2);\r
+      }\r
+\r
+    if (!digits)\r
+      {\r
+        if (fSM.fClean == kTRUE)\r
+    {\r
+      AliError(Form("Unable to get digits for det %d BUT event buffer seems to be clean.", det));\r
+    }\r
+        else\r
+    {\r
+      AliError(Form("Unable to get digits for det %d. Event buffer is NOT clean!", det));\r
+    }\r
+        return -1;\r
+      }\r
+\r
+    Int_t rowMax = GetRowMax();\r
+    Int_t colMax = GetColMax();\r
+    Int_t ntbins = GetNumberOfTimeBins();\r
+\r
+    // Allocate memory space for the digits buffer\r
+    if (digits->GetNtime() == 0) \r
+      {\r
+        digits->Allocate(rowMax, colMax, ntbins);\r
+              if (digitsManager->UsesDictionaries()) \r
+                {\r
+            track0->Allocate(rowMax, colMax, ntbins);\r
+            track1->Allocate(rowMax, colMax, ntbins);\r
+            track2->Allocate(rowMax, colMax, ntbins);\r
+    }\r
+      }\r
+\r
+    indexes = digitsManager->GetIndexes(det);\r
+    indexes->SetSM(GetSM());\r
+    indexes->SetStack(GetStack());\r
+    indexes->SetLayer(GetLayer());\r
+    indexes->SetDetNumber(det);\r
+    if (indexes->IsAllocated() == kFALSE)\r
+      indexes->Allocate(rowMax, colMax, ntbins);\r
+  }\r
+\r
+      //Char_t padStatus =  cal->GetPadStatus(det, GetCol(), GetRow());\r
+\r
+      // ntimebins data are ready to read\r
+      for (it = 0; it < GetNumberOfTimeBins(); it++)\r
+  {\r
+    if (GetSignals()[it] > 0)\r
+      {\r
+        digits->SetData(GetRow(), GetCol(), it, GetSignals()[it]);\r
+        /*if(padStatus)\r
+         digits->SetPadStatus(GetRow(), GetCol(), it, padStatus);*/\r
+                \r
+        indexes->AddIndexRC(GetRow(), GetCol());\r
+              if (digitsManager->UsesDictionaries()) \r
+                {\r
+            track0->SetData(GetRow(), GetCol(), it, 0);\r
+            track1->SetData(GetRow(), GetCol(), it, 0);\r
+            track2->SetData(GetRow(), GetCol(), it, 0);\r
+    }\r
+      }\r
+  } // tbins\r
+    }// while Next()\r
+\r
+  return det;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t\r
+AliTRDrawStream::Init()\r
+{\r
+  //\r
+  // Initialize geometry and fee parameters \r
+  //\r
+\r
+  TDirectory *saveDir = gDirectory; \r
+  \r
+  if (!fGeometry) \r
+    {\r
+      fGeometry = new AliTRDgeometry();\r
+    }\r
+  \r
+  if (!fGeometry) \r
+    {\r
+      AliError("Geometry FAILED!");\r
+      return kFALSE;\r
+    }\r
+\r
+  fTRDfeeParam = AliTRDfeeParam::Instance();\r
+  if (!fTRDfeeParam)\r
+    {\r
+      AliError("AliTRDfeeParam FAILED!");\r
+      return kFALSE;\r
+    }\r
+\r
+  fMaxADCgeom = (Int_t)fGeometry->ADCmax();\r
+\r
+  ResetCounters(); // fBufferRead is set to kFALSE - important\r
+\r
+  saveDir->cd();\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::InitBuffer(void * const buffer, UInt_t length)\r
+{\r
+  // \r
+  // set initial information about the buffer\r
+  //\r
+\r
+  if (fgDebugFlag)  AliDebug(5, Form("Equipment ID: %d",fRawReader->GetEquipmentId()));\r
+  if (fRawReader->GetEquipmentId()<1024 || fRawReader->GetEquipmentId()>1041) //tmp protection\r
+    return kFALSE; \r
+\r
+  ResetCounters();\r
+\r
+  fpBegin = (UInt_t *)buffer;\r
+\r
+  if (WORD_SIZE == 0)\r
+    {\r
+      AliFatal("Strange word size. size of UInt_t == 0");\r
+      return kFALSE;\r
+    }\r
+\r
+  fWordLength = length/WORD_SIZE;\r
+  fpEnd = fpBegin + fWordLength;\r
+  fpPos = fpBegin;\r
+\r
+  if (fpBegin == 0 || length <= 0)\r
+    {\r
+      AliError(Form("Buffer size or pointer is strange. pointer to the buffer is 0x%08x of size %d", fpBegin, length));\r
+      return kFALSE;\r
+    }\r
+\r
+  SwapOnEndian();\r
+\r
+  if (fgDumpHead >= 0){\r
+    if ( fgDumpHead == 0 ){ // dump all words\r
+        AliInfo(Form("---------- Dumping all words from the beginnig of the buffer ----------"));\r
+        if (DumpWords(fpBegin, fWordLength) == kFALSE) AliError("Dump failed. Not enough data.");\r
+    } else {\r
+        AliInfo(Form("---------- Dumping %u words from the beginnig of the buffer ----------",fgDumpHead));\r
+        if (DumpWords(fpBegin, fgDumpHead) == kFALSE) AliError("Dump failed. Not enough data.");\r
+    }\r
+    AliInfo(Form("---------- Dumping ended ----------------------------------------------"));\r
+  }\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::DecodeGTUheader()\r
+{\r
+  // Decode Supermodule Index Word\r
+  DecodeSMInfo(fpPos, &fSM);\r
+\r
+  if (fgDebugFlag)  AliDebug(5, DumpSMInfo(&fSM));\r
+\r
+  fpPos++;\r
+  if (fpPos < fpEnd)\r
+    {  \r
+      // fSM.fHeaderSize represent additional Supermodule header size which contains additional information regarding hardware design.\r
+      // For the moment, we skip decoding these words \r
+      if (SkipWords(fSM.fHeaderSize) == kTRUE)\r
+  {\r
+    for (Int_t istack = 0; istack < 5; istack++)\r
+      {\r
+        if (fSM.fStackActive[istack] == kFALSE)\r
+    continue;\r
+\r
+        fStack = &fSM.fStacks[istack];\r
+\r
+              // Decode Stack Index Word of given stack\r
+        DecodeStackInfo(fpPos, fStack);\r
+        fpPos++;\r
+\r
+        fSM.fNexpectedHalfChambers += fStack->fActiveLinks;\r
+        \r
+        if (fgDebugFlag)  AliDebug(5, DumpStackInfo(fStack));\r
+        \r
+        if (SkipWords(fStack->fHeaderSize-6) == kFALSE) // 6 is the 6 stack header words for 12 links \r
+    {\r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kDecodeStackInfo, "Stack header words missing");\r
+      return kFALSE;\r
+    }\r
+              for (Int_t iword=0; iword<6; iword++) // decode 6 stack header words\r
+                {\r
+                  // Decode Stack Header Word of given stack\r
+            DecodeStackHeader(fpPos, fStack, iword); \r
+            fpPos++;\r
+                }\r
+      }\r
+  }\r
+      else\r
+  {\r
+    return kFALSE;\r
+  }\r
+    }\r
+  else\r
+    {\r
+      if (fgWarnError) AliWarning("No additional sm headers and stack index words present.");\r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kDecodeStackInfo, "Stack info missing");\r
+      return kFALSE;\r
+    }\r
+\r
+  if (fpPos < fpEnd)\r
+    {\r
+      if (fgDebugFlag)  AliDebug(5, "GTU headers are OK.");\r
+    }\r
+  else\r
+    {\r
+      if (fgWarnError) AliWarning("No data just after GTU headers.");\r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kMissingData, "Missing sm data");\r
+      return kFALSE;\r
+    }\r
+\r
+  if (fgDebugFlag)  AliDebug(5, Form("Expected half chambers from GTU header: %d", fSM.fNexpectedHalfChambers));\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::DecodeSM(void * const buffer, UInt_t length)\r
+{\r
+  //\r
+  // decode one sm data in buffer\r
+  //\r
+  \r
+  ResetIterators(); \r
+\r
+  fSM.fClean = kTRUE;\r
+  if (InitBuffer(buffer, length) == kFALSE)\r
+    {\r
+      if (fgWarnError) AliError("InitBuffer failed.");      \r
+      fSM.fClean = kFALSE;\r
+      return kFALSE;\r
+    }\r
+\r
+  if (DecodeGTUheader()== kFALSE)\r
+    return kFALSE;\r
+\r
+  for (Int_t istack = 0; istack < 5; istack++)\r
+    {\r
+      fStackNumber = istack; \r
+      if (fSM.fStackActive[istack] == kFALSE)\r
+  continue;\r
+      \r
+      fStack = &fSM.fStacks[istack];\r
+\r
+      fgLastHC  = -1; // to check rob number odering \r
+      for (Int_t ilink = 0; ilink < 12; ilink++)\r
+  {\r
+    fStackLinkNumber = ilink; \r
+    if (fStack->fLinksActive[ilink] == kFALSE)\r
+      continue;\r
+\r
+          // check GTU link monitor \r
+          if (!(fStack->fLinksDataType[ilink] == 0 && fStack->fLinksMonitor[ilink] == 0))\r
+            {\r
+              fStack->fLinkMonitorError[ilink] = 1;\r
+              SeekEndOfData(); // skip this HC data if GTU link monitor report error\r
+              fStack->fLinkMonitorError[ilink] += fNWordsCounter; // counts words of given hc having link monitor error\r
+              continue; \r
+            }\r
+\r
+    if (fpPos >= fpEnd)\r
+      {\r
+        if (fRawReader) fRawReader->AddMajorErrorLog(kLinkDataMissing, "Link data missing");         \r
+              if (fgWarnError) AliError("Link data missing.");      \r
+        fSM.fClean = kFALSE;\r
+        break;\r
+      }\r
+\r
+    fHC = &fStack->fHalfChambers[ilink];\r
+          ResetPerHC();\r
+\r
+    if (fSM.fTrackletEnable == kTRUE)\r
+      {\r
+        if (DecodeTracklets() == kFALSE)\r
+    {\r
+      \r
+      fSM.fClean = kFALSE;\r
+      SeekEndOfData();\r
+\r
+      if (fgWarnError) \r
+        {\r
+          AliError(Form("Tracklet decoding failed stack %d link %d", fStackNumber, fStackLinkNumber));\r
+        }\r
+      continue;\r
+    }\r
+      }\r
+\r
+    if (fpPos >= fpEnd)\r
+      {\r
+        if (fRawReader) fRawReader->AddMajorErrorLog(kHCdataMissing, "HC data missing");             \r
+              if (fgWarnError) AliError("HC data missing.");      \r
+        fSM.fClean = kFALSE;\r
+        break;\r
+      }\r
+    \r
+          fgLastROB   = -1; // to check mcm number odering \r
+          fgLastIndex = -1 ; // to check mcm number odering \r
+    if (DecodeHC() == kFALSE)\r
+      {\r
+        fSM.fClean = kFALSE;\r
+              if (fHC->fCorrupted < 16)  SeekEndOfData(); // In case that we meet END_OF_TRACKLET_MARKERNEW \r
+                                                          // during ADC data decoding or MCM header decoding\r
+                                                          // we don't seek ENDOFRAWDATAMARKER\r
+\r
+        if (fgWarnError) \r
+    {\r
+      AliError(Form("Failed HC : %s", DumpHCinfoH0(fHC)));\r
+      AliError(Form("Failed HC : %s", DumpHCinfoH1(fHC)));\r
+    }\r
+                \r
+        continue;\r
+      }\r
+    else\r
+      {\r
+        SeekEndOfData(); // make sure that finish off with the end of data markers\r
+      }\r
+\r
+  } // ilink\r
+    } // istack\r
+\r
+  ResetIterators(); // need to do it again for Next() function \r
+\r
+  if (fSM.fClean == kTRUE)\r
+    return kTRUE;\r
+  \r
+  if (fgCleanDataOnly && (fSM.fClean == kFALSE))\r
+    {\r
+      if (fgWarnError) \r
+  {\r
+    AliWarning("Buffer with errors. Returning FALSE.");\r
+    AliWarning(Form("--- Failed SM : %s ---", DumpSMInfo(&fSM)));\r
+  }\r
+      fSM.fActiveStacks = 0; // Next() will not give data\r
+      return kFALSE;\r
+    }\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Int_t \r
+AliTRDrawStream::DecodeSM()\r
+{\r
+  //\r
+  // decode SM data in case AliRawReader is in use\r
+  //    \r
+  if (fRawReader)\r
+    {      \r
+      Int_t nextBuff = NextBuffer();\r
+      while (nextBuff != -1)\r
+  {\r
+    if (nextBuff > 0)\r
+      return nextBuff;           \r
+    nextBuff = NextBuffer();\r
+  }\r
+      return -1;\r
+    }\r
+  else\r
+    {\r
+      AliWarning("AliRawReader not set.");\r
+    }\r
+  return kFALSE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Int_t \r
+AliTRDrawStream::DecodeSM(AliRawReader *reader)\r
+{\r
+  //\r
+  // decode SM with the AliRawReader\r
+  //\r
+  if (reader != 0)\r
+    {\r
+      fRawReader = reader;\r
+      return DecodeSM();\r
+    }\r
+  else\r
+    {\r
+      AliWarning("Argument AliRawReader is 0.");\r
+    }\r
+  return kFALSE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::SeekEndOfData()\r
+{\r
+  //\r
+  // go to end of data marker\r
+  //\r
+  Int_t fEndOfDataCount = 0;\r
+  fNWordsCounter = 0;\r
+\r
+  while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd )\r
+    {\r
+      fpPos++;\r
+      fNWordsCounter++;\r
+    }\r
+  while (*fpPos == ENDOFRAWDATAMARKER && fpPos < fpEnd )\r
+    {\r
+      fEndOfDataCount++;\r
+      fpPos++;      \r
+    }\r
+  \r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t\r
+AliTRDrawStream::SkipMCMdata(UInt_t iw)\r
+{\r
+  //\r
+  // skip mcm data words due to corruption \r
+  //\r
+  if (fgDebugFlag) AliDebug(11,Form("Skip %d words due to MCM header corruption.",iw));\r
+  UInt_t iwcounter = 0;  \r
+  while ( *fpPos != ENDOFRAWDATAMARKER && iwcounter < iw)\r
+    {\r
+      if ( *fpPos == END_OF_TRACKLET_MARKERNEW) \r
+        {  \r
+          if (fgDebugFlag) AliDebug(11,"Met END_OF_TRACKLET_MARKERNEW");\r
+          fMCM->fCorrupted += 16;\r
+          fHC->fCorrupted += 16;\r
+          return kFALSE;\r
+        } \r
+      fpPos++;\r
+      iwcounter++; \r
+    }\r
+\r
+  if (iwcounter == iw)\r
+    {\r
+      fpPos++;\r
+      return kTRUE;\r
+    }\r
+\r
+  if (fgDebugFlag) AliDebug(11,"Met ENDOFRAWDATAMARKER");\r
+  return kFALSE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::SeekNextMCMheader()\r
+{\r
+  //\r
+  // go to mcm marker\r
+  //\r
+\r
+  fpPos++;\r
+\r
+  while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd )\r
+    {\r
+      if (MCM_HEADER_MASK_ERR(*fpPos) == 0 && MCM_HEADER_MASK_ERR(*(fpPos+1)) == 0)      \r
+  {\r
+    if (fgDebugFlag) AliDebug(11,Form("^^^ Found : Pos 0x%08x : Val 0x%08x", fpPos, *fpPos));\r
+    return kTRUE;\r
+  }\r
+      if ( *fpPos == END_OF_TRACKLET_MARKERNEW) \r
+        {  \r
+          fMCM->fCorrupted += 16;\r
+          fHC->fCorrupted += 16;\r
+          return kFALSE;\r
+        } \r
+      fpPos++;\r
+    }\r
+\r
+  SeekEndOfData();\r
+  return kFALSE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+\r
+Bool_t \r
+AliTRDrawStream::DecodeTracklets()\r
+{\r
+  //\r
+  // decode tracklets\r
+  //\r
+\r
+  fLinkTrackletCounter = 0;\r
+  fEndOfTrackletCount = 0;\r
+  fHC->fNTracklets = 0;\r
+\r
+  for (Int_t i = 0; i < MAX_TRACKLETS_PERHC; i++) \r
+  fHC->fTrackletWords[i] = 0; \r
+\r
+  if (fgDebugFlag)  AliDebug(10, Form("Decode tracklets at 0x%08x : 0x%08x", fpPos, *fpPos));\r
+\r
+  while ( *fpPos != END_OF_TRACKLET_MARKEROLD && *fpPos != END_OF_TRACKLET_MARKERNEW && fpPos < fpEnd )\r
+    {\r
+      if (fgDebugFlag)  AliDebug(10, Form("Tracklet found at 0x%08x : 0x%08x", fpPos, *fpPos));\r
+\r
+      fLinkTrackletCounter++;\r
+\r
+      if (fLinkTrackletCounter > MAX_TRACKLETS_PERHC)\r
+  {\r
+    if (fgDebugFlag) AliDebug(11,Form("Max number of tracklets exceeded %d > %d.", \r
+        fLinkTrackletCounter, MAX_TRACKLETS_PERHC));\r
+    if (fRawReader) fRawReader->AddMajorErrorLog(kTrackletOverflow,"Too many tracklets"); \r
+          fHC->fTrackletError = 1;\r
+    return kFALSE;\r
+  }\r
+\r
+      fHC->fTrackletWords[fLinkTrackletCounter-1] = UInt_t(*fpPos); //store tracklet words into array  \r
+      fHC->fNTracklets = fLinkTrackletCounter;\r
+      fpPos++;\r
+    }\r
+\r
+  while ( ( *fpPos == END_OF_TRACKLET_MARKEROLD || *fpPos == END_OF_TRACKLET_MARKERNEW ) && fpPos < fpEnd )\r
+    {\r
+      if (fgDebugFlag)  AliDebug(10, Form("EoTracklets found at 0x%08x : 0x%08x", fpPos, *fpPos));\r
+\r
+      fEndOfTrackletCount++;\r
+      fpPos++;\r
+    }\r
+\r
+  if ( fEndOfTrackletCount < 2 )\r
+    {\r
+      if (fgDebugFlag) AliDebug(11,"End of tracklets word missing"); \r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kEOTrackeltsMissing, "End of tracklets word missing"); \r
+      fHC->fTrackletError += 2;\r
+      return kFALSE;\r
+    }\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::IsRowValid()\r
+{\r
+  if ( (fHC->fStack == 2 && fMCM->fROW >= fGeometry->RowmaxC0()) ||\r
+      (fHC->fStack != 2 && fMCM->fROW >= fGeometry->RowmaxC1()) || fMCM->fROW < 0 ) \r
+    {\r
+      if (fgDebugFlag) AliDebug(11,Form("SM%d L%dS%d: Wrong Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"\r
+          , fHC->fSM, fHC->fLayer, fHC->fStack, fMCM->fROW, fMCM->fROB, fHC->fSide, fMCM->fMCM ));\r
+      return kFALSE;\r
+    }\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::IsMCMheaderOK()\r
+{\r
+  //\r
+  // check the mcm header\r
+  //\r
+\r
+  if (fgLastROB != fMCM->fROB) \r
+    {\r
+      fgLastIndex = 0;\r
+      if (fgLastROB== -1) fgLastROB = fMCM->fROB;\r
+    }\r
+  else\r
+    {\r
+      Int_t matchingcounter = 0; \r
+      for (Int_t i=fgLastIndex+1; i<16; i++)\r
+        { \r
+          if ( fMCM->fMCM == fgMCMordering[i] )\r
+            {\r
+              fgLastIndex = i;\r
+              matchingcounter++;\r
+              break;\r
+            }\r
+        }\r
+      if (matchingcounter == 0)   \r
+        {\r
+          fMCM->fMCMhdCorrupted += 2;\r
+          AliDebug(11,Form("MCM number from last MCM is larger: MCM # from last MCM %d,  MCM # from current MCM %d \n",(fMCM-1)->fMCM, fMCM->fMCM));\r
+        }\r
+    }\r
+\r
+  if ( fgLastHC == fHC->fLayer*2 + fHC->fSide )\r
+    {\r
+      if ( fMCM->fROB < (fMCM-1)->fROB )\r
+        {\r
+        fMCM->fMCMhdCorrupted += 2;\r
+        AliDebug(11,Form("ROB number from last MCM is larger: ROB # from last MCM %d,  ROB # from current MCM %d \n",(fMCM-1)->fROB, fMCM->fROB));\r
+        }\r
+      else fgLastROB = fMCM->fROB; \r
+    }\r
+\r
+  fgLastHC = fHC->fLayer*2 + fHC->fSide; \r
+\r
+  /*\r
+  // this check will come back later again when we have "patched MCM map"\r
+  int expectedROB = -1;\r
+  if(!fHC->fSide) expectedROB = int(fHC->fMCMmax/16)*2;\r
+  else expectedROB = int(fHC->fMCMmax/16)*2 + 1;\r
+  int expectedMCM = 4*(3-int((fHC->fMCMmax%16)/4)) + fHC->fMCMmax%4;\r
+\r
+  if ( expectedROB != fMCM->fROB || expectedMCM != fMCM->fMCM)\r
+    {\r
+      fMCM->fMCMhdCorrupted += 2;\r
+      AliDebug(11,Form("ROB expected %d ROB read %d,  MCM expected %d MCM read %d\n",expectedROB, fMCM->fROB, expectedMCM, fMCM->fMCM));\r
+    }\r
+  */\r
+\r
+  // below two conditions are redundant  \r
+  /*\r
+  if ( fMCM->fMCM < 0 || fMCM->fMCM > 15 || fMCM->fROB < 0 || fMCM->fROB > 7 ) \r
+    {\r
+      fMCM->fMCMhdCorrupted += 8;  // need to assign new number\r
+      if (fgDebugFlag) AliDebug(11,Form("ROB or MCM number is out of range. %s\n", DumpMCMinfo(fMCM)));\r
+    }\r
+  if (IsRowValid() == kFALSE)\r
+    {\r
+      fMCM->fMCMhdCorrupted += 16; // need to assign new number\r
+    }\r
+  */  \r
+    \r
+  if (fEventCounter == 0)\r
+    {\r
+      fEventCounter = fMCM->fEvCounter;\r
+    }\r
+\r
+  if (fEventCounter != fMCM->fEvCounter)\r
+    {\r
+      fMCM->fMCMhdCorrupted += 4;      if (fgDebugFlag) AliDebug(11,Form("Event number(%d) of current MCM is different from that(%d) of reference MCM %s.\n", fMCM->fEvCounter, fEventCounter, DumpMCMinfo(fMCM)));\r
+    }\r
+\r
+  if (fEventCounter < fLastEventCounter)\r
+    {\r
+      fMCM->fMCMhdCorrupted += 8;      if (fgDebugFlag) AliDebug(11,Form("Event from the past? Current %d Last %d %s.\n", fEventCounter, fLastEventCounter, DumpMCMinfo(fMCM)));\r
+    }\r
+\r
+  if ( fMCM->fADCmaskCorrupted > 0 )\r
+      return kFALSE;\r
+\r
+  if ( fMCM->fMCMhdCorrupted > 0 )\r
+      return kFALSE;\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::DecodeMCMheader()\r
+{\r
+  //\r
+  // decode the mcm header\r
+  //\r
+\r
+  DecodeMCMheader(fpPos, fMCM); \r
+\r
+  if (fgDumpingEnable) \r
+    {\r
+      if (fMCM->fMCM == fgDumpingMCM) \r
+        {\r
+          if (fMCM->fROB == fgDumpingROB && fHC->fLayer == fgDumpingLayer)\r
+            {\r
+              if (fHC->fSM == fgDumpingSM && fHC->fStack == fgDumpingStack)\r
+                { \r
+                  if (fgDebugFlag) {\r
+                    AliDebug(5,DumpHCinfoH0(fHC));\r
+                    AliDebug(5,DumpMCMinfo(fMCM));\r
+                  }\r
+                  DumpWords(fpPos, 212);\r
+                }  \r
+            }\r
+        }\r
+    }\r
+\r
+  if (fHC->fCorrupted >= 16)\r
+    {\r
+      fpPos--; \r
+      return kFALSE;\r
+    }\r
+\r
+  fMCM->fROW = fTRDfeeParam->GetPadRowFromMCM(fMCM->fROB, fMCM->fMCM); \r
+\r
+  if ((fHC->fRawVMajor > 2 && fHC->fRawVMajor <5) || ((fHC->fRawVMajor & 32) == 32)) //cover old and new version definition of ZS data\r
+    {\r
+      fpPos++;\r
+      if ( fpPos < fpEnd )\r
+  {\r
+    DecodeMask(fpPos, fMCM); \r
+          if (fHC->fCorrupted >= 16)\r
+            {\r
+              fpPos--; \r
+              return kFALSE;\r
+            }\r
+    MCMADCwordsWithTbins(fHC->fTimeBins, fMCM);\r
+    fMCM->fAdcDataPos = fpPos + 1;\r
+  }\r
+      else\r
+  {\r
+    if (fgDebugFlag) AliDebug(11,"Expected ADC mask word. Fail due to buffer END.");     \r
+    if (fRawReader) fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Missing"); \r
+          fHC->fCorrupted += 32;\r
+    return kFALSE;\r
+  }\r
+    }\r
+  else\r
+    {\r
+      UInt_t dummyMask = MCM_DUMMY_ADCMASK_VAL;\r
+      DecodeMask(&dummyMask, fMCM); \r
+      MCMADCwordsWithTbins(fHC->fTimeBins, fMCM);\r
+      fMCM->fAdcDataPos = fpPos + 1;\r
+    }\r
+\r
+  if (fgDebugFlag)  \r
+    {\r
+      AliDebug(6, DumpMCMinfo(fMCM));\r
+      AliDebug(7, DumpMCMadcMask(fMCM));\r
+    }\r
+\r
+  if (IsMCMheaderOK() == kFALSE)\r
+      return kFALSE;\r
+    \r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::IsHCheaderOK()\r
+{\r
+  //\r
+  // check insanity of half chamber header\r
+  //\r
+\r
+  if (fHC->fStack < 0 || fHC->fStack > 4)\r
+    {\r
+      if (fgDebugFlag) AliDebug(11,Form("Wrong Stack %d", fHC->fStack));\r
+      return kFALSE;\r
+    }\r
+\r
+  if (fHC->fLayer < 0 || fHC->fLayer >= AliTRDgeometry::kNlayer)\r
+    {\r
+      if (fgDebugFlag) AliDebug(11,Form("Wrong layer %d", fHC->fLayer));\r
+      return kFALSE;\r
+    }\r
+\r
+  if (fHC->fSide < 0 || fHC->fSide > 1)\r
+    {\r
+      if (fgDebugFlag) AliDebug(11,Form("Wrong Side %d", fHC->fSide));\r
+      return kFALSE;\r
+    }\r
+\r
+  if (fgStackNumberChecker)\r
+    {\r
+    if (fHC->fStack != fStackNumber) \r
+      {\r
+        if (fgDebugFlag) AliDebug(11,Form("Missmatch: Stack number between HC header %d and GTU link mask %d", \r
+              fHC->fStack, fStackNumber));\r
+        fStackNumber = -1;\r
+        return kFALSE;\r
+    }\r
+    }\r
+\r
+  if (fgStackLinkNumberChecker)\r
+    {\r
+    //if (fHC->fLayer * 2 + fHC->fSide != fStackLinkNumber) \r
+    // let it make flexible to consider known fiber swapping\r
+    if ((fHC->fLayer * 2 != fStackLinkNumber) && (fHC->fLayer * 2 != fStackLinkNumber - 1))  \r
+      {\r
+        if (fgDebugFlag) AliDebug(11,Form("Missmatch: Layer number between HC header %d and GTU link mask %d | %s", \r
+                    fHC->fLayer, fStackLinkNumber, DumpStackInfo(fStack)));\r
+        fStackLinkNumber = -1;\r
+        return kFALSE;      \r
+      }\r
+    }\r
+\r
+  // SLOW GEOM : consistancy check with geometry\r
+  fHC->fDET = fGeometry->GetDetector(fHC->fLayer, fHC->fStack, fHC->fSM);\r
+  if (fHC->fDET < 0 || fHC->fDET >= AliTRDgeometry::kNdet)\r
+    {\r
+      if (fgDebugFlag) AliDebug(11,Form("Wrong detector %d", fHC->fDET));      \r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongDet, "Wrong Det");       \r
+      return kFALSE;\r
+    }\r
+\r
+  if (fHC->fSM != fGeometry->GetSector(fHC->fDET)\r
+      || fHC->fSM <0 || fHC->fSM >= AliTRDgeometry::kNsector)\r
+    {\r
+      if (fgDebugFlag) AliDebug(11,Form("Wrong SM(sector) %d (Geometry says: %d) Stack=%d Layer=%d Det=%d", \r
+              fHC->fSM, fGeometry->GetSector(fHC->fDET),\r
+              fHC->fStack, fHC->fLayer, fHC->fDET));      \r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongSM, "Wrong SM");       \r
+      return kFALSE;\r
+    }\r
+\r
+  fHC->fROC    = fGeometry->GetDetectorSec(fHC->fLayer, fHC->fStack);\r
+  if (fHC->fROC < 0)\r
+    {\r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC");       \r
+      return kFALSE;\r
+    }\r
+\r
+  fHC->fRowMax = fGeometry->GetRowMax(fHC->fLayer, fHC->fStack, fHC->fSM);\r
+  if (fHC->fRowMax < 1)\r
+    {\r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC Row Max");       \r
+      return kFALSE;\r
+    }\r
+\r
+  fHC->fColMax = fGeometry->GetColMax(fHC->fROC);\r
+  if (fHC->fColMax < 1)\r
+    {\r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC Col Max");       \r
+      return kFALSE;\r
+    }\r
+  \r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::DecodeHCheader()\r
+{  \r
+  //\r
+  // decode the half chamber header\r
+  //\r
+\r
+  if (DecodeHCwordH0(fpPos, fHC) == kFALSE)\r
+    return kFALSE;\r
+    \r
+  if (fHC->fNExtraWords > 0)\r
+    {\r
+      fpPos++;\r
+      if (fpPos < fpEnd)\r
+  {\r
+    if (DecodeHCwordH1(fpPos, fHC) == kFALSE)\r
+            return kFALSE;\r
+  }\r
+      else\r
+  {\r
+    if (fgDebugFlag) AliDebug(11,"Expected HC header word 1. Fail due to buffer END.");\r
+    if (fRawReader) fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word 1 (count from 0) missing"); \r
+    return kFALSE;\r
+  }\r
+    }\r
+\r
+  if (fgDebugFlag)  AliDebug(5, DumpHCinfoH0(fHC));\r
+  if (fgDebugFlag)  AliDebug(5, DumpHCinfoH1(fHC));\r
+\r
+  fHC->fDET = -1;\r
+  if (IsHCheaderOK() == kFALSE)\r
+    {\r
+      fHC->fH0Corrupted += 2;\r
+      if (fgDebugFlag) AliDebug(11,Form("H0 Header Insane. Word 0x%08x", *fHC->fPos));\r
+      return kFALSE;\r
+    }\r
+  \r
+  return kTRUE;\r
+}\r
+\r
+//------------------------------------------------------------\r
+Bool_t \r
+AliTRDrawStream::DecodeHC()\r
+{\r
+  //\r
+  // decode hc header and data\r
+  //\r
+\r
+  if (DecodeHCheader() == kFALSE)\r
+    {\r
+      if (fgWarnError) AliWarning(Form("HC Header decode failed. H0 Error: %d H1 Error: %d",fHC->fH0Corrupted,fHC->fH1Corrupted));\r
+      if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderCorrupt, "HC header corrupted"); \r
+      return kFALSE;\r
+    }\r
+  else\r
+    {\r
+      fpPos++;\r
+      if (fpPos >= fpEnd)\r
+  {\r
+          fHC->fCorrupted += 1;\r
+    if (fgDebugFlag) AliDebug(11,"No MCM data? Not enough data in the buffer.");\r
+    if (fRawReader) fRawReader->AddMajorErrorLog(kMCMdataMissing, "MCM data missing"); \r
+    return kFALSE;\r
+  }\r
+    }\r
+\r
+  if ((fHC->fRawVMajor & 64) == 64) // test pattern data\r
+    {\r
+      AliTRDrawTPStream *tpStream = new AliTRDrawTPStream(fHC->fRawVMajorOpt, fpPos);\r
+      if (tpStream->DecodeTPdata() == kFALSE)\r
+        {\r
+         if (fgWarnError) AliError("failed to decode test pattern data");\r
+         return kFALSE; \r
+        }\r
+      return kTRUE;\r
+    } \r
+\r
+  fHC->fMCMmax = 0;\r
+  while (*fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd)\r
+    {\r
+      if (fHC->fMCMmax > TRD_MAX_MCM)\r
+  {\r
+          fHC->fCorrupted += 2;\r
+    if (fgDebugFlag) AliDebug(11,"More mcm data than expected!");\r
+    if (fRawReader) fRawReader->AddMajorErrorLog(kMCMoverflow, "Too many mcms found!"); \r
+    return kFALSE;\r
+  }\r
+\r
+      fMCM = &fHC->fMCMs[fHC->fMCMmax];\r
+\r
+      if (DecodeMCMheader() == kFALSE)\r
+  {\r
+          if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4\r
+    \r
+    if (fgSkipData == kTRUE || fHC->fCorrupted >= 16)\r
+              return kFALSE; // stop HC data reading\r
+          \r
+          fHC->fMCMmax++; // increase mcm counter to match with expected rob/mcm number\r
+\r
+          // in case we decide to keep reading data, skip this mcm data and find next mcm header \r
+          if (fMCM->fADCmaskCorrupted < 2) \r
+            {  \r
+              if (SkipMCMdata(fMCM->fADCcount*fMCM->fSingleADCwords) == kFALSE)\r
+            return kFALSE;\r
+              continue;\r
+            }\r
+          else \r
+            {\r
+              if (SeekNextMCMheader() == kFALSE)\r
+            return kFALSE;\r
+              continue;\r
+            }\r
+  }\r
+\r
+      fHC->fMCMmax++;\r
+\r
+      if (fMCM->fADCmax > 0)\r
+  {\r
+    fpPos++;\r
+    if (fpPos >= fpEnd)\r
+      {\r
+              fMCM->fCorrupted += 1;\r
+              if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4\r
+        if (fgDebugFlag)  AliDebug(9, Form("Buffer short of data. ADC data expected."));         \r
+        return kFALSE;\r
+      }\r
+\r
+    for (Int_t iadc = 0; iadc < fMCM->fADCmax; iadc++)\r
+      {\r
+        fADC = &fMCM->fADCs[iadc];\r
+        fADC->fADCnumber = fMCM->fADCchannel[iadc];\r
+\r
+        if (fgDebugFlag)  AliDebug(9, Form("This is ADC %d of %d. ADC number is %d.", \r
+            iadc+1, fMCM->fADCmax, fMCM->fADCchannel[iadc]));\r
+\r
+        if (fpPos + fMCM->fSingleADCwords >= fpEnd)\r
+    {\r
+      \r
+                  fMCM->fCorrupted += 2;\r
+                  if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4\r
+      if (fgDebugFlag) AliDebug(11,"ADC (10 words) expected. Not enough data in the buffer.");\r
+      return kFALSE;\r
+    }\r
+\r
+              if (fHC->fRawVMajor < 64) // normal(real) ADC data\r
+                {\r
+            if (DecodeADC() == kFALSE)\r
+        {\r
+                      if (fMCM->fCorrupted < 4) fMCM->fCorrupted += 4; // benchmark mcm data corruption as 4\r
+                      if (fHC->fCorrupted < 4) fHC->fCorrupted += 4;   // benchmark hc data corruption as 4\r
+          if (fADC->fIsShared && fADC->fCorrupted == 16)   // check if we are out of the det when the pad is shared\r
+            {\r
+              fADC->fCOL = -1;\r
+              fpPos = fADC->fPos + fMCM->fSingleADCwords;\r
+            }\r
+          else\r
+            {\r
+              if (fgDebugFlag) AliDebug(11,Form("ADC decode failed."));\r
+                    if (fgSkipData == kTRUE || fHC->fCorrupted >= 16) \r
+                            return kFALSE; // stop HC data reading\r
+            }\r
+        }\r
+                } \r
+              else // test pattern data\r
+                {\r
+                  if (fgWarnError) AliError("These are test pattern data. You need other reader"); // will be served in other class\r
+                }\r
+      } \r
+  } \r
+      else\r
+  {\r
+    fpPos++;\r
+  }\r
+    }//while eof data\r
+\r
+  if (fpPos >= fpEnd)\r
+    {\r
+      if (fgDebugFlag) AliDebug(11,"We are at the end of buffer. There should be one more word left.");\r
+      return kFALSE;\r
+    }\r
+\r
+  return kTRUE;\r
+}\r
+//------------------------------------------------------------\r
+\r
+Bool_t\r
+AliTRDrawStream::DecodeADC()\r
+{\r
+  //\r
+  // decode single ADC channel\r
+  //\r
+\r
+  fADC->fCorrupted = 0;\r
+  if(fADC->fADCnumber%2==1) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL1);\r
+  if(fADC->fADCnumber%2==0) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL2);\r
+\r
+  fADC->fPos = fpPos;\r
+  fTbinADC = 0;\r
+\r
+  for (Int_t i = 0; i < TRD_MAX_TBINS; i++)\r
+    fADC->fSignals[i] = 0;\r
+\r
+  for (Int_t iw = 0; iw < fMCM->fSingleADCwords; iw++)\r
+    {\r
+      if (HC_HEADER_MASK_ERR(*fpPos) == 0 || *fpPos == END_OF_TRACKLET_MARKERNEW)\r
+        {\r
+          if (fgWarnError) AliError(Form("There should be ADC data. We meet HC header or END_OF_TRACKLET_MARKER 0x%08x",*fpPos));\r
+    fADC->fCorrupted += 16;\r
+          fHC->fCorrupted += 16; \r
+          fpPos--;\r
+\r
+          return kFALSE;\r
+        }\r
+      if (fMaskADCword != ADC_WORD_MASK(*fpPos))\r
+  {\r
+    fADC->fCorrupted += 1;\r
+          if (fgDebugFlag) AliDebug(11,Form("Wrong ADC data mask! ADC channel number: %02d [Expected mask: 0x%08x  Current mask: 0x%08x] MCM= %s Error : %d",\r
+                                          fADC->fADCnumber, fMaskADCword, ADC_WORD_MASK(*fpPos),DumpMCMinfo(fMCM),fADC->fCorrupted));\r
+          fpPos++;\r
+    continue;\r
+  }\r
+\r
+      // here we subtract the baseline ( == common additive)\r
+      fADC->fSignals[fTbinADC + 0] = ((*fpPos & 0x00000ffc) >>  2) - fgCommonAdditive;\r
+      fADC->fSignals[fTbinADC + 1] = ((*fpPos & 0x003ff000) >> 12) - fgCommonAdditive;\r
+      fADC->fSignals[fTbinADC + 2] = ((*fpPos & 0xffc00000) >> 22) - fgCommonAdditive;\r
+\r
+      fTbinADC += 3;\r
+      fpPos++;\r
+    }\r
+\r
+  if (fADC->fADCnumber <= 1 || fADC->fADCnumber == fMaxADCgeom - 1)\r
+    {\r
+      fADC->fIsShared = kTRUE;\r
+    }\r
+  else\r
+    {\r
+      fADC->fIsShared = kFALSE;\r
+    }\r
+\r
+  if ( fADC->fADCnumber >= fMaxADCgeom - 1)\r
+    {\r
+      fADC->fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber - 1);\r
+      fADC->fCOL--;\r
+    }\r
+  else\r
+    {\r
+      fADC->fCOL = fTRDfeeParam->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber);\r
+    }\r
+\r
+  if (fADC->fCOL >= fHC->fColMax || fADC->fCOL < 0)\r
+    {\r
+      if (fADC->fIsShared == kFALSE)\r
+  {\r
+    fADC->fCorrupted += 32;\r
+    if (fgDebugFlag) AliDebug(11,Form("Wrong column! ADCnumber %d MaxIs %d Col %d MaxIs %d MCM= %s", \r
+            fADC->fADCnumber, fMaxADCgeom, fADC->fCOL, fHC->fColMax, DumpMCMinfo(fMCM)));\r
+  }\r
+      //else\r
+  //{\r
+    // we are out of the det when the pad is shared\r
+    //if (fgDebugFlag) AliDebug(11, Form("Column out of the detector! ADCnumber %d MaxIs %d Col %d MaxIs %d MCM= %s", \r
+    //                              fADC->fADCnumber, fMaxADCgeom, fADC->fCOL, fHC->fColMax, DumpMCMinfo(fMCM)));\r
+    //fADC->fCorrupted += 32;\r
+  //}\r
+    }\r
+\r
+  if (fADC->fCorrupted > 0)\r
+    {\r
+      return kFALSE;\r
+    }\r
+\r
+  fDecodedADCs++;\r
+  return kTRUE;\r
+}\r
+\r
+//--------------------------------------------------------\r
+\r
+\r
+void AliTRDrawStream::DecodeSMInfo(const UInt_t *word, struct AliTRDrawSM *sm) const\r
+{\r
+  //\r
+  // Decode Supermodule Index Word\r
+  // The Supermodule Index Word is a 32-Bit word wit following structure\r
+  // ssssssss ssssssss vvvv rrrr r d t mmmm\r
+  // s: Size of the Supermodule Header, v: Supermodule Header Version, r: Reserved for future use\r
+  // d: Track Data Enabled Bit, t: Tracklet Data Enabled Bit, m: Stack Mask \r
+  //\r
+  sm->fPos = (UInt_t*)word; \r
+\r
+  UInt_t vword = *word;\r
+  sm->fHeaderSize = SM_HEADER_SIZE(vword);\r
+    \r
+  if (TRACKLETS_ENABLED(vword) > 0)\r
+    sm->fTrackletEnable = kTRUE;\r
+  else\r
+    sm->fTrackletEnable = kFALSE;\r
+    \r
+  UInt_t stackMask = STACK_MASK(vword);\r
+  sm->fActiveStacks = 0;\r
+  for (Int_t i = 0; i < 5; i++)\r
+    {\r
+      if (IS_BIT_SET(stackMask,i) > 0)\r
+  {\r
+    sm->fStackActive[i] = kTRUE;\r
+    sm->fActiveStacks++;\r
+  }\r
+      else\r
+  {\r
+    sm->fStackActive[i] = kFALSE;\r
+  }\r
+    }\r
+}\r
+\r
+//--------------------------------------------------------\r
+const char *AliTRDrawStream::DumpSMInfo(const struct AliTRDrawSM *sm)\r
+{\r
+  //\r
+  // Get SM structure into a const char\r
+  //\r
+  return Form("[ SM Info 0x%08x] : Hsize %d TrackletEnable %d Stacks %d %d %d %d %d",\r
+        *sm->fPos,\r
+        sm->fHeaderSize, sm->fTrackletEnable,\r
+        sm->fStackActive[0], sm->fStackActive[1], sm->fStackActive[2],\r
+        sm->fStackActive[3], sm->fStackActive[4]);      \r
+}\r
+\r
+//--------------------------------------------------------\r
+void AliTRDrawStream::DecodeStackInfo(const UInt_t *word, struct AliTRDrawStack *st) const\r
+{\r
+  //\r
+  // Decode Stack #i Index Word\r
+  // The Stack #i Index Word is a 32-Bit word wit following structure\r
+  // ssssssss ssssssss vvvv mmmm mmmmmmmm\r
+  // s: Size of the Stack #i Header, v: Supermodule Header Version, m: Link Mask\r
+  //\r
+  st->fPos = (UInt_t*)word;\r
+      \r
+  UInt_t vword = *word;\r
+  st->fHeaderSize = STACK_HEADER_SIZE(vword);\r
+\r
+  UInt_t linkMask = STACK_LINK_WORD(vword);\r
+  st->fActiveLinks = 0;\r
+  for (Int_t i = 0; i < 12; i++)\r
+    {\r
+      if (IS_BIT_SET(linkMask,i) > 0)\r
+  {\r
+    st->fLinksActive[i] = kTRUE;\r
+    st->fActiveLinks++;\r
+  }\r
+      else\r
+  {\r
+    st->fLinksActive[i] = kFALSE;\r
+  }\r
+    }\r
+}\r
+  \r
+//--------------------------------------------------------\r
+void AliTRDrawStream::DecodeStackHeader(const UInt_t *word, struct AliTRDrawStack *st, Int_t iword) const\r
+{\r
+  //\r
+  // decode gtu header for stack info\r
+  //\r
+      st->fPos = (UInt_t*)word;\r
+      \r
+      UInt_t vword = *word;\r
+      st->fLinksDataType[2*iword]    = LINK0_DATA_TYPE_FLAG(vword);\r
+      st->fLinksMonitor[2*iword]     = LINK0_MONITOR_FLAG(vword);\r
+      st->fLinksDataType[2*iword+1]  = LINK1_DATA_TYPE_FLAG(vword);\r
+      st->fLinksMonitor[2*iword+1]   = LINK1_MONITOR_FLAG(vword);\r
+}\r
+\r
+//--------------------------------------------------------\r
+const char *AliTRDrawStream::DumpStackInfo(const struct AliTRDrawStack *st)\r
+{\r
+  //\r
+  // format the string with the stack info\r
+  //\r
+\r
+  return Form("[ Stack Info 0x%08x ] : Hsize %d Links Active %d %d %d %d %d %d %d %d %d %d %d %d",\r
+        *st->fPos,\r
+        st->fHeaderSize,\r
+        st->fLinksActive[0], st->fLinksActive[1], st->fLinksActive[2], st->fLinksActive[3],\r
+        st->fLinksActive[4], st->fLinksActive[5], st->fLinksActive[6], st->fLinksActive[7],\r
+        st->fLinksActive[8], st->fLinksActive[9], st->fLinksActive[10], st->fLinksActive[11]);\r
+\r
+}\r
+\r
+//--------------------------------------------------------\r
+Bool_t AliTRDrawStream::DecodeHCwordH0(const UInt_t *word, struct AliTRDrawHC *hc) const\r
+{\r
+  //\r
+  // decode the hc header word 0\r
+  //\r
+  UInt_t vword = *word;\r
+\r
+  hc->fH0Corrupted = HC_HEADER_MASK_ERR(vword);\r
+  if (hc->fH0Corrupted > 0)\r
+    {\r
+    if (fgDebugFlag) AliDebug(11,Form("H0 Header Mask Error. Word 0x%08x", *fHC->fPos));\r
+    return kFALSE;\r
+    }\r
+\r
+  hc->fSpecialRawV =  HC_SPECIAL_RAW_VERSION(vword);\r
+  hc->fRawVMajor = HC_MAJOR_RAW_VERSION(vword);\r
+  hc->fRawVMajorOpt = HC_MAJOR_RAW_VERSION_OPT(vword); \r
+  hc->fRawVMinor = HC_MINOR_RAW_VERSION(vword);\r
+  hc->fNExtraWords = HC_EXTRA_WORDS(vword);\r
+  hc->fDCSboard = HC_DCS_BOARD(vword);\r
+  hc->fSM = HC_SM_NUMBER(vword);\r
+  hc->fStack = HC_STACK_NUMBER(vword);\r
+  hc->fLayer = HC_LAYER_NUMBER(vword);\r
+  hc->fSide = HC_SIDE_NUMBER(vword);\r
+\r
+  hc->fPos[0] = (UInt_t*)word;\r
+\r
+  return kTRUE;\r
+}\r
+\r
+//--------------------------------------------------------\r
+Bool_t AliTRDrawStream::DecodeHCwordH1(const UInt_t *word, struct AliTRDrawHC *hc) const\r
+{\r
+  //\r
+  // decode the hc header word 1\r
+  //\r
+\r
+  UInt_t vword = *word;\r
+\r
+  hc->fH1Corrupted = HC_HEADER_MASK_ERR(vword);\r
+  if (hc->fH1Corrupted > 0)\r
+    { \r
+    if (fgDebugFlag) AliDebug(11,Form("H1 Header Mask Error. Word 0x%08x", *fHC->fPos));\r
+    return kFALSE;\r
+    }\r
+\r
+  hc->fTimeBins = HC_NTIMEBINS(vword);\r
+  hc->fBunchCrossCounter = HC_BUNCH_CROSS_COUNTER(vword);\r
+  hc->fPreTriggerCounter = HC_PRETRIGGER_COUNTER(vword);\r
+  hc->fPreTriggerPhase = HC_PRETRIGGER_PHASE(vword);\r
+\r
+  hc->fPos[1] = (UInt_t*)word;\r
+\r
+  return kTRUE;\r
+}\r
+  \r
+//--------------------------------------------------------\r
+const char *AliTRDrawStream::DumpHCinfoH0(const struct AliTRDrawHC *hc)\r
+{\r
+  //\r
+  // dump the hc header word 0\r
+  //\r
+  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
+}\r
+\r
+//--------------------------------------------------------\r
+const char *AliTRDrawStream::DumpHCinfoH1(const struct AliTRDrawHC *hc)\r
+{\r
+  //\r
+  // dump the hc header word 1\r
+  //\r
+  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
+    hc->fPos[1], *(hc->fPos[1]), hc->fTimeBins, hc->fBunchCrossCounter, hc->fPreTriggerCounter, hc->fPreTriggerPhase);\r
+}\r
+\r
+//--------------------------------------------------------\r
+void AliTRDrawStream::DecodeMCMheader(const UInt_t *word, struct AliTRDrawMCM *mcm) const\r
+{\r
+  //\r
+  // decode the mcm header\r
+  //\r
+  UInt_t vword = *word;\r
+\r
+  if (vword == END_OF_TRACKLET_MARKERNEW) \r
+    {\r
+      if (fgWarnError) AliError(Form("There should be MCM header. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));\r
+      mcm->fMCMhdCorrupted += 16;\r
+      fHC->fCorrupted += 16; //to finish data reading of this HC\r
+    }\r
+\r
+  mcm->fMCMhdCorrupted = MCM_HEADER_MASK_ERR(vword); //if MCM header mask has error\r
+  if (fgDebugFlag && mcm->fMCMhdCorrupted != 0) AliDebug(11,Form("Wrong MCM header mask 0x%08x.\n", *fpPos));\r
+\r
+  mcm->fROB = MCM_ROB_NUMBER(vword);\r
+  mcm->fMCM = MCM_MCM_NUMBER(vword);\r
+  mcm->fEvCounter = MCM_EVENT_COUNTER(vword);\r
+  mcm->fPos = (UInt_t*)word;\r
+}\r
+\r
+//--------------------------------------------------------\r
+UInt_t AliTRDrawStream::GetMCMadcMask(const UInt_t *word, struct AliTRDrawMCM *mcm) const\r
+{\r
+  //\r
+  // get the adc mask\r
+  //\r
+  UInt_t vword = *word;\r
+\r
+  mcm->fADCmax    = 0;\r
+  mcm->fADCMask   = 0;\r
+  mcm->fADCcount  = 0;\r
+  mcm->fADCMaskWord = vword;\r
+\r
+  if (vword == END_OF_TRACKLET_MARKERNEW)\r
+    {\r
+      if (fgWarnError) AliError(Form("There should be MCMadcMask. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));\r
+      mcm->fADCmaskCorrupted += 16;\r
+      fHC->fCorrupted += 16; //to finish data reading of this HC\r
+    }\r
+\r
+  if ( MCM_ADCMASK_MASK_ERR(vword) == 0 )\r
+    {\r
+      mcm->fADCMask  = MCM_ADCMASK_VAL(vword);\r
+      mcm->fADCcount = MCM_ADCMASK_NADC(~vword);\r
+    }\r
+  else\r
+    {\r
+      mcm->fADCMask = 0xffffffff;\r
+      mcm->fADCmaskCorrupted = 1; // mcm adc mask error\r
+      if (fgDebugFlag) AliDebug(11,Form("Wrong ADC Mask word 0x%08x.\n", *fpPos));\r
+    }\r
+\r
+  return mcm->fADCMask;\r
+}\r
+\r
+//--------------------------------------------------------\r
+void AliTRDrawStream::DecodeMask(const UInt_t *word, struct AliTRDrawMCM *mcm) const\r
+{\r
+  //\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
+\r
+  if (mcm->fADCMask > 0)\r
+    {\r
+      for (Int_t i = 0; i < TRD_MAX_ADC; i++)\r
+  {\r
+    mcm->fADCchannel[mcm->fADCmax] = 0;\r
+    if( IS_BIT_SET(mcm->fADCMask,i) )\r
+      {\r
+        mcm->fADCchannel[mcm->fADCmax] = i;\r
+        mcm->fADCmax++;\r
+      }\r
+  }\r
+    }\r
+  if (mcm->fADCcount != mcm->fADCmax && fHC->fRawVMajor >= 32) // backward compatibility\r
+    {\r
+      mcm->fADCmaskCorrupted += 2; \r
+      if (fgDebugFlag) AliDebug(11,Form("ADC counts from ADCMask are different %d %d : ADCMask word 0x%08x\n", mcm->fADCcount, mcm->fADCmax, *fMCM->fPos));\r
+    }\r
+}\r
+\r
+//--------------------------------------------------------\r
+void AliTRDrawStream::MCMADCwordsWithTbins(UInt_t fTbins, struct AliTRDrawMCM *mcm) const\r
+{\r
+  //\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
+    {\r
+      mcm->fSingleADCwords = mcm->fMCMADCWords/mcm->fADCmax;\r
+    }\r
+}\r
+  \r
+//--------------------------------------------------------\r
+const char *AliTRDrawStream::DumpMCMinfo(const struct AliTRDrawMCM *mcm)\r
+{\r
+  //\r
+  // mcm info in a string\r
+  //\r
+  if (!mcm)\r
+    return Form("Unable to dump. Null received as parameter!?!");\r
+  else\r
+    return Form("[ MCM 0x%08x ] : ROB %d MCM %d EvCounter %d", *(mcm->fPos), mcm->fROB, mcm->fMCM, mcm->fEvCounter);\r
+}\r
+  \r
+//--------------------------------------------------------\r
+const char *AliTRDrawStream::DumpMCMadcMask(const struct AliTRDrawMCM *mcm)\r
+{\r
+  //\r
+  // mcm adc mask in a string\r
+  //\r
+  if (!mcm)\r
+    return Form("Unable to dump. Null received as parameter!?!");\r
+\r
+  TString tsreturn = Form("[Word] : 0x%08x => [Mask] : 0x%08x : ", mcm->fADCMaskWord, mcm->fADCMask);\r
+  for (Int_t i = 0; i < 21; i++)\r
+    {\r
+      tsreturn += Form("%d ", mcm->fADCchannel[i]);\r
+    }\r
+  tsreturn += "";\r
+  return tsreturn.Data();\r
+}\r