]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFRawStream.cxx
corrected warnings with gcc 4.3
[u/mrichter/AliRoot.git] / TOF / AliTOFRawStream.cxx
index d7b1364bc6989521e8d59483aa9a76310684c2e1..06d975bea13589a46f475c4e61d165d15747959a 100644 (file)
 
 /*
 $Log$
+Revision 1.19.1  2008/09/19  preghenella
+  Decode method updated:
+  it reads the CDH from the rawReader and sends it to the decoder;
+ LoadRawDataBuffers modified:
+     it corrects tof hit infos per ddlBC and deltaBC offsets
+     (in case of the static member fgApplyBCCorrections
+      has been setted to kTRUE);
+ Added static member fgApplyBCCorrections (kTRUE by default)
+ and the related static method ApplyBCCorrections;
+
+Revision 1.19  2007/05/18 13:07:53  decaro
+Error messages stored in the global raw-reader error log (Cvetan, Chiara)
+
+Revision 1.18  2007/05/08 11:53:29  arcelli
+Improved class flexibility for further use (R.Preghenella)
+
 Revision 1.17  2007/05/03 08:53:50  decaro
 Coding convention: RS3 violation -> suppression
 
@@ -83,6 +99,8 @@ Revision 0.01  2005/07/22 A. De Caro
 ////////////////////////////////////////////////////////////////////////
 
 
+#include "Riostream.h"
+
 #include "TClonesArray.h"
 
 #include "AliDAQ.h"
@@ -90,19 +108,44 @@ Revision 0.01  2005/07/22 A. De Caro
 #include "AliRawReader.h"
 
 #include "AliTOFGeometry.h"
-#include "AliTOFGeometryV5.h"
 #include "AliTOFrawData.h"
 #include "AliTOFRawMap.h"
 #include "AliTOFRawStream.h"
+//#include "AliTOFCableLengthMap.h"
 
+#include "AliTOFHitData.h"
 
-ClassImp(AliTOFRawStream)
+#include "AliRawEventHeaderBase.h"
+#include "AliRawDataHeader.h"
 
+ClassImp(AliTOFRawStream)
 
+const Int_t AliTOFRawStream::fgkddlBCshift[72] = 
+{
+  2, 2, -1, -1,
+  2, 2,  0,  0,
+  2, 2,  0,  0,
+  2, 2,  0,  0,
+  2, 2,  0,  0,
+  2, 2,  0,  0,
+  2, 2,  0,  0,
+  2, 2,  0,  0,
+  2, 2,  0,  0,
+  2, 2,  0,  0,
+  2, 2, -1, -1,
+  2, 2, -1, -1,
+  2, 2, -2, -2,
+  2, 2, -2, -2,
+  2, 2, -2, -2,
+  2, 2, -1, -1,
+  2, 2, -1, -1,
+  2, 2, -1, -1
+};
+
+Bool_t AliTOFRawStream::fgApplyBCCorrections = kTRUE;
 //_____________________________________________________________________________
 AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
   fRawReader(rawReader),
-  //  fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
   fTOFrawData(0x0),
   fDecoder(new AliTOFDecoder()),
   fDDL(-1),
@@ -120,7 +163,6 @@ AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
   fStrip(-1),
   fPadX(-1),
   fPadZ(-1),
-  fTOFGeometry(new AliTOFGeometryV5()),
   fPackedDigits(0),
   fWordType(-1),
   fSlotID(-1),
@@ -131,7 +173,14 @@ AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
   fInsideTRM(kFALSE),
   fInsideLTM(kFALSE),
   fInsideTRMchain0(kFALSE),
-  fInsideTRMchain1(kFALSE)
+  fInsideTRMchain1(kFALSE),
+  fLocalEventCounterDRM(-1),
+  fLocalEventCounterLTM(-1),
+  fLocalEventCounterTRM(0x0),
+  fLocalEventCounterChain(0x0),
+  fChainBunchID(0x0),
+  fCableLengthMap(0x0),
+  fEventID(0)
 {
   //
   // create an object to read TOF raw digits
@@ -147,12 +196,29 @@ AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
 
   fRawReader->Reset();
   fRawReader->Select("TOF");
+
+  fLocalEventCounterTRM = new Int_t[13];
+  fLocalEventCounterChain = new Int_t*[13];
+  fChainBunchID = new Int_t*[13];
+  for (Int_t j=0;j<13;j++){
+    fLocalEventCounterTRM[j] = -1;
+    fLocalEventCounterChain[j] = new Int_t[2];
+    fChainBunchID[j] = new Int_t[2];
+    for (Int_t k=0;k<2;k++){
+      fLocalEventCounterChain[j][k] = -1;
+      fChainBunchID[j][k] = -1;
+    }
+  }
+
+  fCableLengthMap = new AliTOFCableLengthMap();
+
+  fEventID = (Int_t)fRawReader->GetBCID(); //bunch crossing
+
 }
 
 //_____________________________________________________________________________
 AliTOFRawStream::AliTOFRawStream():
   fRawReader(0x0), 
-  //  fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
   fTOFrawData(0x0),
   fDecoder(new AliTOFDecoder()),
   fDDL(-1),
@@ -170,7 +236,6 @@ AliTOFRawStream::AliTOFRawStream():
   fStrip(-1),
   fPadX(-1),
   fPadZ(-1),
-  fTOFGeometry(new AliTOFGeometryV5()),
   fPackedDigits(0),
   fWordType(-1),
   fSlotID(-1),
@@ -181,7 +246,14 @@ AliTOFRawStream::AliTOFRawStream():
   fInsideTRM(kFALSE),
   fInsideLTM(kFALSE),
   fInsideTRMchain0(kFALSE),
-  fInsideTRMchain1(kFALSE)
+  fInsideTRMchain1(kFALSE),
+  fLocalEventCounterDRM(-1),
+  fLocalEventCounterLTM(-1),
+  fLocalEventCounterTRM(0x0),
+  fLocalEventCounterChain(0x0),
+  fChainBunchID(0x0),
+  fCableLengthMap(0x0),
+  fEventID(0)
 {
   //
   // default ctr
@@ -193,13 +265,28 @@ AliTOFRawStream::AliTOFRawStream():
 
   fTOFrawData = new TClonesArray("AliTOFrawData",1000);
   fTOFrawData->SetOwner();
+
+  fLocalEventCounterTRM = new Int_t[13];
+  fLocalEventCounterChain = new Int_t*[13];
+  fChainBunchID = new Int_t*[13];
+  for (Int_t j=0;j<13;j++){
+    fLocalEventCounterTRM[j] = -1;
+    fLocalEventCounterChain[j] = new Int_t[2];
+    fChainBunchID[j] = new Int_t[2];
+    for (Int_t k=0;k<2;k++){
+      fLocalEventCounterChain[j][k] = -1;
+      fChainBunchID[j][k] = -1;
+    }
+  }
+
+  fCableLengthMap = new AliTOFCableLengthMap();
+
 }
 
 //_____________________________________________________________________________
 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
   TObject(stream),
   fRawReader(0x0),
-  //  fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
   fTOFrawData(0x0),
   fDecoder(new AliTOFDecoder()),
   fDDL(-1),
@@ -217,7 +304,6 @@ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
   fStrip(-1),
   fPadX(-1),
   fPadZ(-1),
-  fTOFGeometry(new AliTOFGeometryV5()),
   fPackedDigits(0),
   fWordType(-1),
   fSlotID(-1),
@@ -228,7 +314,14 @@ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
   fInsideTRM(kFALSE),
   fInsideLTM(kFALSE),
   fInsideTRMchain0(kFALSE),
-  fInsideTRMchain1(kFALSE)
+  fInsideTRMchain1(kFALSE),
+  fLocalEventCounterDRM(-1),
+  fLocalEventCounterLTM(-1),
+  fLocalEventCounterTRM(0x0),
+  fLocalEventCounterChain(0x0),
+  fChainBunchID(0x0),
+  fCableLengthMap(0x0),
+  fEventID(0)
 {
   //
   // copy constructor
@@ -256,8 +349,6 @@ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
   fPadX = stream.fPadX;
   fPadZ = stream.fPadZ;
 
-  fTOFGeometry = stream.fTOFGeometry;
-
   fPackedDigits = stream.fPackedDigits;
 
   fWordType = stream.fWordType;
@@ -277,7 +368,21 @@ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
   }
 
   fTOFrawData = new TClonesArray(*stream.fTOFrawData);
-  
+
+  fLocalEventCounterDRM = stream.fLocalEventCounterDRM;
+  fLocalEventCounterLTM = stream.fLocalEventCounterLTM;
+  for (Int_t j=0;j<13;j++){
+    fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];
+    for (Int_t k=0;k<2;k++){
+      fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];
+      fChainBunchID[j][k] = stream.fChainBunchID[j][k];
+    }
+  }
+
+  fCableLengthMap = stream.fCableLengthMap;
+
+  fEventID = stream.fEventID;
+
 }
 
 //_____________________________________________________________________________
@@ -308,8 +413,6 @@ AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
   fPadX = stream.fPadX;
   fPadZ = stream.fPadZ;
 
-  fTOFGeometry = stream.fTOFGeometry;
-
   fPackedDigits = stream.fPackedDigits;
 
   fWordType = stream.fWordType;
@@ -329,7 +432,21 @@ AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
   }
   
   fTOFrawData = stream.fTOFrawData;
-  
+
+  fLocalEventCounterDRM = stream.fLocalEventCounterDRM;
+  fLocalEventCounterLTM = stream.fLocalEventCounterLTM;
+  for (Int_t j=0;j<13;j++){
+    fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];
+    for (Int_t k=0;k<2;k++){
+      fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];
+      fChainBunchID[j][k] = stream.fChainBunchID[j][k];
+    }
+  }
+
+  fCableLengthMap = stream.fCableLengthMap;
+
+  fEventID = stream.fEventID;
+
   return *this;
 
 }
@@ -341,8 +458,6 @@ AliTOFRawStream::~AliTOFRawStream()
 
   fPackedDigits = 0;
 
-  delete fTOFGeometry;
   for (Int_t i=0;i<72;i++){ 
     delete fDataBuffer[i];
     delete fPackedDataBuffer[i];
@@ -352,6 +467,14 @@ AliTOFRawStream::~AliTOFRawStream()
 
   fTOFrawData->Clear();
   delete fTOFrawData;
+
+  delete [] fLocalEventCounterTRM;
+  for (Int_t ii=0; ii<2; ii++) {
+    delete [] fLocalEventCounterChain[ii];
+    delete [] fChainBunchID[ii];
+  }
+  delete fCableLengthMap;
+
 }
 
 
@@ -359,15 +482,14 @@ AliTOFRawStream::~AliTOFRawStream()
 
 void AliTOFRawStream::LoadRawData(Int_t indexDDL)
 {
+  //
+  // To load raw data
+  //
+
+  fTOFrawData->Clear();
 
-  /*
-    for (Int_t indexDDL = 0;
-    indexDDL < AliDAQ::NumberOfDdls("TOF");
-    indexDDL++) {
-  */
+  TClonesArray &arrayTofRawData =  *fTOFrawData;
 
-  fTOFrawData = new TClonesArray("AliTOFrawData",1000); //potential memory leak
-    //fTOFrawData->Clear();
   fPackedDigits = 0;
 
   // create raw data map
@@ -376,18 +498,26 @@ void AliTOFRawStream::LoadRawData(Int_t indexDDL)
 
   Int_t slot[4] = {-1, -1, -1, -1};
 
+  fLocalEventCounterDRM = -1;
+  fLocalEventCounterLTM = -1;
+  for (Int_t ii=0; ii<13; ii++)
+    fLocalEventCounterTRM[ii] = -1;
+  for (Int_t ii=0; ii<13; ii++)
+    for (Int_t jj=0; jj<2; jj++)
+      fLocalEventCounterChain[ii][jj] = -1;
+
   fRawReader->Reset();
   fRawReader->Select("TOF", indexDDL, indexDDL);
     
   Bool_t signal = kFALSE;
 
-  
+  AliTOFrawData *rawDigit = NULL;
 
   while(Next()) {
 
     signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
     if (signal) {
-      //printf("  %2i  %1i  %2i  %1i  %2i  \n", fSector, fPlate, fStrip, fPadZ, fPadX);
+      AliDebug(2,Form("  %2i  %1i  %2i  %1i  %2i", fSector, fPlate, fStrip, fPadZ, fPadX));
 
       slot[0] = fTRM;
       slot[1] = fTRMchain;
@@ -396,7 +526,7 @@ void AliTOFRawStream::LoadRawData(Int_t indexDDL)
 
       if (rawMap->TestHit(slot) != kEmpty) {
 
-       AliTOFrawData *rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
+       rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
 
        if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
            fLeadingEdge==-1 && fTrailingEdge!=-1) {
@@ -406,24 +536,19 @@ void AliTOFRawStream::LoadRawData(Int_t indexDDL)
        else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
                   (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
 
-/*     else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
-                  (fTime!=-1 || fLeadingEdge!=-1 || fTrailingEdge!=-1))*/  /*||
-                 (rawDigit->GetLeading()==-1 && rawDigit->GetTrailing()!=-1 &&
-                 fLeadingEdge!=-1 && fTrailingEdge==-1) */)
+                 )
          {
 
-         TClonesArray &arrayTofRawData =  *fTOFrawData;
-         new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
+           new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
 
-       rawMap->SetHit(slot);
+           rawMap->SetHit(slot);
 
-       }
+         }
 
 
       }
       else {
 
-       TClonesArray &arrayTofRawData =  *fTOFrawData;
        new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
 
        rawMap->SetHit(slot);
@@ -434,34 +559,7 @@ void AliTOFRawStream::LoadRawData(Int_t indexDDL)
 
   } // closed -> while (Next())
 
-    /*
-      fDDL  = fRawReader->GetDDLID();
-
-      for (Int_t ii=0; ii<fTOFrawData->GetEntriesFast(); ii++) {
-
-      AliTOFrawData *dummy = (AliTOFrawData*)fTOFrawData->UncheckedAt(ii);
-
-      fTRM = dummy->GetTRM();
-      fTRMchain = dummy->GetTRMchain();
-      fTDC = dummy->GetTDC();
-      fTDCchannel = dummy->GetTDCchannel();
-
-      SetSector();
-      SetPlate();
-      SetStrip();
-      SetPadZ();
-      SetPadX();
-
-      printf("  %2i, %2i %1i, %2i, %1i  -->  %2i, %1i, %2i, %1i, %2i  \n",
-            fDDL, fTRM, fTRMchain, fTDC, fTDCchannel,
-            fSector, fPlate, fStrip, fPadZ, fPadX);
-
-            } // closed loop on TOF raw data TClonesArray
-    */
-
-    //} // closed loop on indexDDL
-
-
+  rawMap->Delete();
 
 }
 
@@ -475,6 +573,8 @@ Bool_t AliTOFRawStream::Next()
 
   UInt_t data;
 
+  Int_t dummy = 0;
+
   if (!fRawReader->ReadNextInt(data)) return kFALSE;
 
   if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
@@ -543,7 +643,6 @@ Bool_t AliTOFRawStream::Next()
 
   case GLOBAL_TRAILER_TYPE: // global trailer
     fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
-    
 
     switch (fSlotID) { // switch global trailer slot ID
 
@@ -551,6 +650,9 @@ Bool_t AliTOFRawStream::Next()
       if (!fInsideDRM) { // unexpected DRM global trailers -> exit
        break;
       }
+      dummy = 0x0000fff0;
+      //AliInfo(Form("  DRM local event counter = %i", GetField(data,dummy,4)));
+      fLocalEventCounterDRM = GetField(data,dummy,4);
       fInsideDRM = kFALSE; // DRM global trailer accepted
       fInsideTRM = kFALSE;
       fInsideLTM = kFALSE;
@@ -579,12 +681,18 @@ Bool_t AliTOFRawStream::Next()
       if (!fInsideLTM) { // unexpected LTM global trailer -> exit
        break;
       }
+      dummy = 0x0fff0000;
+      //AliInfo(Form("  LTM local event counter = %i", GetField(data,dummy,16)));
+      fLocalEventCounterLTM = GetField(data,dummy,16);
       fInsideLTM = kFALSE; // LTM global trailer accepted
       break;
     case 15: //TRM global trailer
       if (!fInsideTRM) { // unexpected TRM global trailers -> exit
        break;
       }
+      dummy = 0x0fff0000;
+      //AliInfo(Form("  TRM local event counter = %i", GetField(data,dummy,16)));
+      fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);
       fInsideTRM = kFALSE; // TRM global trailer accepted
       break;
     default: // unexpected global trailer slot ID
@@ -616,11 +724,17 @@ Bool_t AliTOFRawStream::Next()
        }
        fInsideTRMchain0 = kTRUE;
        fTRMchain = 0;
+        dummy = 0x0000fff0;
+        //AliInfo(Form("  chain bunch ID = %i", GetField(data,dummy,4)));
+        fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
        break;
       case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
        if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
          break;
        }
+        dummy = 0x0fff0000;
+        //AliInfo(Form("  chain local event counter = %i", GetField(data,dummy,16)));
+        fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
        fInsideTRMchain0 = kFALSE;
        fTRMchain = -1;
        break;
@@ -630,11 +744,17 @@ Bool_t AliTOFRawStream::Next()
        }
        fInsideTRMchain1 = kTRUE;
        fTRMchain = 1;
+        dummy = 0x0000fff0;
+        //AliInfo(Form("  chain bunch ID = %i", GetField(data,dummy,4)));
+        fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
        break;
       case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
        if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
          break;
        }
+        dummy = 0x0fff0000;
+        //AliInfo(Form("  chain local event counter = %i", GetField(data,dummy,16)));
+        fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
        fInsideTRMchain1 = kFALSE;
        fTRMchain = -1;
        break;
@@ -665,24 +785,72 @@ Bool_t AliTOFRawStream::Next()
 
       case 0: // packing ok, digit time and TOT
        fToT  = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
-       fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
+       fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
+         /*-
+         fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
+         ;
+       if (fgApplyBCCorrections) {
+         AliDebug(2,"Apply nominal DDL BC time-shift correction");
+         AliDebug(2,"Apply deltaBC time-shift correction");
+         AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
+         fTime +=
+           (Int_t)(fgkddlBCshift[fDDL]*25./AliTOFGeometry::TdcBinWidth()*1.E+03)
+           +
+           (Int_t)((fChainBunchID[fTRM][fTRMchain]-fEventID)*25./AliTOFGeometry::TdcBinWidth()*1.E+03);
+       }
        break;
 
       case 1: // leading edge digit, long digit time, no TOT
        //fToT  = -1;
        //fTime  = -1;
-       fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
+       fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
+         /*-
+         fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
+         ;
+       if (fgApplyBCCorrections) {
+         AliDebug(2,"Apply nominal DDL BC time-shift correction");
+         AliDebug(2,"Apply deltaBC time-shift correction");
+         AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
+         fLeadingEdge +=
+           (Int_t)(fgkddlBCshift[fDDL]*25./AliTOFGeometry::TdcBinWidth()*1.E+03)
+           +
+           (Int_t)((fChainBunchID[fTRM][fTRMchain]-fEventID)*25./AliTOFGeometry::TdcBinWidth()*1.E+03);
+       }
        break;
 
       case 2: // trailing edge digit, long digit time, no TOT
        //fToT  = -1;
        //fTime  = -1;
-       fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
+       fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
+         /*-
+         fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
+         ;
+       if (fgApplyBCCorrections) {
+         AliDebug(2,"Apply nominal DDL BC time-shift correction");
+         AliDebug(2,"Apply deltaBC time-shift correction");
+         AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
+         fTrailingEdge +=
+           (Int_t)(fgkddlBCshift[fDDL]*25./AliTOFGeometry::TdcBinWidth()*1.E+03)
+           +
+           (Int_t)((fChainBunchID[fTRM][fTRMchain]-fEventID)*25./AliTOFGeometry::TdcBinWidth()*1.E+03);
+       }
        break;
 
       case 3: // TOT overflow
        fToT  = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
-       fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
+       fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
+         /*-
+         fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
+         ;
+       if (fgApplyBCCorrections) {
+         AliDebug(2,"Apply nominal DDL BC time-shift correction");
+         AliDebug(2,"Apply deltaBC time-shift correction");
+         AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
+         fTime +=
+           (Int_t)(fgkddlBCshift[fDDL]*25./AliTOFGeometry::TdcBinWidth()*1.E+03)
+           +
+           (Int_t)((fChainBunchID[fTRM][fTRMchain]-fEventID)*25./AliTOFGeometry::TdcBinWidth()*1.E+03);
+       }
        break;
 
       } // end switch PS bits inside TRM chains
@@ -786,6 +954,9 @@ void AliTOFRawStream::SetPadZ()
        iPadZ  = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
     }
 
+  //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
+  //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
+
   fPadZ = iPadZ;
 
 }
@@ -813,6 +984,9 @@ void AliTOFRawStream::SetPadX()
        iPadX  = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
     }
 
+  //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
+  //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
+
   fPadX = iPadX;
 
 }
@@ -828,7 +1002,7 @@ Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPositio
 }
 
 //----------------------------------------------------------------------------
-Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC) const 
+Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
 {
   //
   // Returns the TOF plate number [0;4]
@@ -914,7 +1088,7 @@ Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC) const
 }
 
 //----------------------------------------------------------------------------
-Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC) const 
+Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
 {
   //
   // Returns the TOF strip number per module:
@@ -1010,7 +1184,7 @@ Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC) const
 
 //----------------------------------------------------------------------------
 Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
-                               Int_t iCH) const 
+                                    Int_t iCH)
 {
   //
   // Returns the TOF pad number per strip [0;95]
@@ -1023,10 +1197,17 @@ Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
 
   Int_t iPadAlongTheStrip = -1;
 
-  Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
+  // wrong
+  //Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
+  //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
+  //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
 
-  if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
-  else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
+  // right
+  Int_t iTDClocal = -1;
+  Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3;
+  Int_t iTDClocal12 = 2-nTDC%3 + iChain*3;
+  if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03;
+  else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12);
 
   Int_t iCHlocal = iCH;
   if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
@@ -1034,13 +1215,53 @@ Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
   iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
 
   if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
-      ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX()))
-    AliError("Problems with the padX number!");
-
+      ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
+    std::cerr << "Problems with the padX number!" << endl;
+    //AliWarning("Problems with the padX number!");
+  }
   return iPadAlongTheStrip;
 
 }
 
+//----------------------------------------------------------------------------
+Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC,
+                                     Int_t iCH)
+{
+  //
+  // Returns the TOF padX number [0;47]
+  // corresponding to the TOF equipment ID numbers:
+  //                          iDDL -> DDL number per sector [0;3]
+  //                        iChain -> TRM chain number [0;1]
+  //                          nTDC -> TDC number [0;14]
+  //                           iCH -> TDC channel number [0;7]
+  //
+
+  Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/
+                       (Float_t(AliTOFGeometry::NpadZ())));
+
+  return iPadX;
+
+}
+
+//----------------------------------------------------------------------------
+Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC,
+                                     Int_t iCH)
+{
+  //
+  // Returns the TOF padZ number [0;1]
+  // corresponding to the TOF equipment ID numbers:
+  //                          iDDL -> DDL number per sector [0;3]
+  //                        iChain -> TRM chain number [0;1]
+  //                          nTDC -> TDC number [0;14]
+  //                           iCH -> TDC channel number [0;7]
+  //
+
+  Int_t iPadZ  = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
+
+  return iPadZ;
+
+}
+
 //----------------------------------------------------------------------------
 Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) const
 {
@@ -1099,18 +1320,35 @@ void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
   Int_t iSector = GetSectorNumber(nDDL);
 
   Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
-  if (iPlate==-1) AliError("Problems with the plate number!");
+  if (iPlate==-1) {
+    if (fRawReader)
+      fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
+    AliWarning("Problems with the plate number!");
+  }
 
   Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
-  if (iStrip==-1) AliError("Problems with the strip number!");
+  if (iStrip==-1) {
+    if (fRawReader)
+      fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
+    AliWarning("Problems with the strip number!");
+  }
 
   Int_t iPadAlongTheStrip  = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
-  if (iPadAlongTheStrip==-1)
-    AliError("Problems with the pad number along the strip!");
-
+  if (iPadAlongTheStrip==-1){
+    if (fRawReader)
+      fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
+    AliWarning("Problems with the pad number along the strip!");
+  }
+  
   Int_t iPadX  = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
   Int_t iPadZ  = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
 
+  //Int_t iPadX  = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ())));
+  //Int_t iPadZ  = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
+
+  //Int_t iPadX  = Equip2VolNpadX(iDDL, iChain, nTDC, iCH);
+  //Int_t iPadZ  = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH);
+
   volume[0] = iSector;
   volume[1] = iPlate;
   volume[2] = iStrip;
@@ -1118,82 +1356,41 @@ void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
   volume[4] = iPadZ;
 
 }
-//_____________________________________________________________________________
-
-Int_t AliTOFRawStream::GetIndex(Int_t *detId)
-{
-  //Retrieve calibration channel index
-  const Int_t kSectors = fTOFGeometry->NSectors();
-  const Int_t kPlates = fTOFGeometry->NPlates();
-  const Int_t kStripA = fTOFGeometry->NStripA();
-  const Int_t kStripB = fTOFGeometry->NStripB();
-  const Int_t kStripC = fTOFGeometry->NStripC();
-  const Int_t kPadX = fTOFGeometry->NpadX();
-  const Int_t kPadZ = fTOFGeometry->NpadZ();
-
-
-  Int_t isector = detId[0];
-  if (isector >= kSectors)
-    AliError(Form("Wrong sector number in TOF (%d) !",isector));
-  Int_t iplate = detId[1];
-  if (iplate >= kPlates)
-    AliError(Form("Wrong plate number in TOF (%d) !",iplate));
-  Int_t istrip = detId[2];
-  Int_t ipadz = detId[3];
-  Int_t ipadx = detId[4];
-  Int_t stripOffset = 0;
-  switch (iplate) {
-  case 0:
-    stripOffset = 0;
-    break;
-  case 1:
-    stripOffset = kStripC;
-    break;
-  case 2:
-    stripOffset = kStripC+kStripB;
-    break;
-  case 3:
-    stripOffset = kStripC+kStripB+kStripA;
-    break;
-  case 4:
-    stripOffset = kStripC+kStripB+kStripA+kStripB;
-    break;
-  default:
-    AliError(Form("Wrong plate number in TOF (%d) !",iplate));
-    break;
-  };
-
-  Int_t idet = ((2*(kStripC+kStripB)+kStripA)*kPadZ*kPadX)*isector +
-               (stripOffset*kPadZ*kPadX)+
-               (kPadZ*kPadX)*istrip+
-              (kPadX)*ipadz+
-               ipadx;
-  return idet;
-}
 //-----------------------------------------------------------------------------
-Bool_t AliTOFRawStream::DecodeDDL(Int_t DDLMin, Int_t DDLMax, Int_t verbose = 0){
+Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
+  //
+  // To decode raw data for DDL number in [nDDLmin; nDDLmax]
+  //
+
   //check and fix valid DDL range
-  if (DDLMin < 0){
-    DDLMin = 0;
-    AliError("Wrong DDL range: setting first DDL ID to 0");
+  if (nDDLMin < 0){
+    nDDLMin = 0;
+    fRawReader->AddMinorErrorLog(kDDLMinError);
+    AliWarning("Wrong DDL range: setting first DDL ID to 0");
   }
-  if (DDLMax > 71){
-    DDLMax = 71;
-    AliError("Wrong DDL range: setting last DDL ID to 71");
+  if (nDDLMax > 71){
+    nDDLMax = 71;
+    fRawReader->AddMinorErrorLog(kDDLMaxError);
+    AliWarning("Wrong DDL range: setting last DDL ID to 71");
   }  
 
   //select required DDLs
-  fRawReader->Select("TOF", DDLMin, DDLMax);
+  fRawReader->Select("TOF", nDDLMin, nDDLMax);
 
   if (verbose)
-    AliInfo(Form("Selected TOF DDL range: %d-%d", DDLMin, DDLMax));
+    AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
 
   return(Decode(verbose));
 }
 //-----------------------------------------------------------------------------
-Bool_t AliTOFRawStream::Decode(Int_t verbose = 0){
+Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
+  //
+  // New decoder method
+  //
+
   Int_t currentEquipment;
   Int_t currentDDL;
+  const AliRawDataHeader *currentCDH;
 
   //pointers
   UChar_t *data = 0x0;
@@ -1208,6 +1405,7 @@ Bool_t AliTOFRawStream::Decode(Int_t verbose = 0){
     //get equipment infos
     currentEquipment = fRawReader->GetEquipmentId();
     currentDDL = fRawReader->GetDDLID();
+    currentCDH = fRawReader->GetDataHeader();
     const Int_t kDataSize = fRawReader->GetDataSize();
     const Int_t kDataWords = kDataSize / 4;
     data = new UChar_t[kDataSize];
@@ -1221,8 +1419,9 @@ Bool_t AliTOFRawStream::Decode(Int_t verbose = 0){
     //read equipment payload
     if (!fRawReader->ReadNext(data, kDataSize))
       {
+       fRawReader->AddMajorErrorLog(kDDLdataReading);
        if (verbose)
-         AliError("Error while reading DDL data. Go to next equipment");
+         AliWarning("Error while reading DDL data. Go to next equipment");
        delete [] data;
        data = 0x0;
        continue;
@@ -1238,8 +1437,10 @@ Bool_t AliTOFRawStream::Decode(Int_t verbose = 0){
     fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]);
     
     //start decoding
-    if (fDecoder->Decode((UInt_t *)data, kDataWords) == kTRUE)
-      AliError(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
+    if (fDecoder->Decode((UInt_t *)data, kDataWords, currentCDH) == kTRUE) {
+      fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
+      AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
+    }
     
     delete [] data;
     data = 0x0;
@@ -1283,7 +1484,8 @@ AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
     AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
 
   if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
-    AliError(Form("Error while decoding DDL # %d", indexDDL));
+    fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
+    AliWarning(Form("Error while decoding DDL # %d", indexDDL));
     return kTRUE;
   }
   
@@ -1295,6 +1497,12 @@ AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
   if (verbose > 0)
     AliInfo("Filling TClonesArray ...");
 
+  if (verbose > 0)
+    if (fgApplyBCCorrections) {
+      AliInfo("Apply nominal DDL BC time-shift correction");
+      AliInfo("Apply deltaBC time-shift correction");
+    }
+
   //loop over DDL packed hits
   for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){
     hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data
@@ -1306,8 +1514,15 @@ AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
     Int_t   hitChan = hitData->GetChan();
     Int_t   hitTimeBin = hitData->GetTimeBin();
     Int_t   hitTOTBin = hitData->GetTOTBin();
-    
-    Int_t hitLeading = -1;
+
+    if (fgApplyBCCorrections) {
+      /* DDL BC shift time correction */
+      hitTimeBin += fgkddlBCshift[indexDDL];
+      /* deltaBC shift time correction */
+      hitTimeBin += hitData->GetDeltaBunchID();
+    }
+
+    Int_t hitLeading = hitData->GetTimeBin();
     Int_t hitTrailing = -1;
     Int_t hitError = -1;