]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFRawStream.cxx
Adding the track fit residuals as a consequence of the ExB distortions (Marian)
[u/mrichter/AliRoot.git] / TOF / AliTOFRawStream.cxx
index a85f4190f98b5cef6999bb69d56142615e0adc6f..7648a59b017b9467894986570efbcd24d98dbcdd 100644 (file)
 
 /*
 $Log$
+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
+
+Revision 1.16  2007/05/03 08:22:22  decaro
+Coding convention: RN17 violation -> suppression
+
+Revision 1.15  2007/04/30 15:22:06  arcelli
+Change TOF digit Time, Tot etc to int type
+
+Revision 1.14  2007/04/27 11:11:53  arcelli
+updates for the new decoder
+
+Revision 1.13  2007/03/16 11:46:35  decaro
+Coding convention: RN17 rule violation -> suppression
+
+Revision 1.12  2007/02/22 09:43:45  decaro
+Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli)
+
+Revision 1.11  2007/02/20 15:57:00  decaro
+Raw data update: to read the TOF raw data defined in UNPACKED mode
+
+Revision 1.10  2006/12/15 14:01:38  cvetan
+Memory leak fixed
+
+Revision 1.9  2006/10/13 11:22:27  arcelli
+remove warnings due to uninitialized AliTOFtdcDigit data members
+
+Revision 1.8  2006/08/22 13:30:17  arcelli
+removal of effective c++ warnings (C.Zampolli)
+
+Revision 1.7  2006/08/10 14:46:54  decaro
+TOF raw data format: updated version
+
 Revision 1.6.1  2006/06/28 A. De Caro, R. Preghenella:
         Update TOF raw data format
         according to the final version
@@ -49,409 +88,166 @@ Revision 0.01  2005/07/22 A. De Caro
 //                                                                    //
 ////////////////////////////////////////////////////////////////////////
 
+
+#include "TClonesArray.h"
+
+#include "AliDAQ.h"
 #include "AliLog.h"
 #include "AliRawReader.h"
 
 #include "AliTOFGeometry.h"
-#include "AliTOFGeometryV5.h"
+#include "AliTOFrawData.h"
+#include "AliTOFRawMap.h"
 #include "AliTOFRawStream.h"
 
-
-/******************************************
-GENERAL DATA FORMAT                    
-******************************************/
-
-//filler
-#define FILLER 0x70000000
-
-//word type mask/position
-#define WORD_TYPE_MASK 0xf0000000
-#define WORD_TYPE_POSITION 28
-
-//global header word required bit pattern
-#define GLOBAL_HEADER 0x40000000
-
-//global trailer word required bit pattern
-#define GLOBAL_TRAILER 0x50000000
-
-//error word required bit pattern
-#define ERROR 0x30000000
-
-//header slot ID mask/position
-#define HEADER_SLOT_ID_MASK 0x0000000f
-#define HEADER_SLOT_ID_POSITION 0
-
-//word types
-#define GLOBAL_HEADER_TYPE 4
-#define GLOBAL_TRAILER_TYPE 5
-#define ERROR_TYPE 6
-#define FILLER_TYPE 7
-#define TRM_CHAIN0_HEADER_TYPE 0
-#define TRM_CHAIN0_TRAILER_TYPE 1
-#define TRM_CHAIN1_HEADER_TYPE 2
-#define TRM_CHAIN1_TRAILER_TYPE 3
-
-//slot types
-#define DRM_ID_NUMBER 1
-#define LTM_ID_NUMBER 2
-
-
-/******************************************
-DRM DATA FORMAT                        
-******************************************/
-
-//DRM global header word required bit pattern
-#define DRM_GLOBAL_HEADER 0x40000001
-
-//DRM event words mask/position
-#define DRM_EVENT_WORDS_MASK 0x001ffff0
-#define DRM_EVENT_WORDS_POSITION 4
-
-//DRM DRM ID mask/position
-#define DRM_DRM_ID_MASK 0x0fe00000
-#define DRM_DRM_ID_POSITION 21
-
-//DRM status header 1 word required bit pattern
-#define DRM_STATUS_HEADER_1 0x40000001
-
-//DRM slot ID mask/position
-#define DRM_SLOT_ID_MASK 0x00007ff0
-#define DRM_SLOT_ID_POSITION 4
-
-//DRM C-bit mask/position
-#define DRM_C_BIT_MASK 0x00008000
-#define DRM_C_BIT_POSITION 15
-
-//DRM status header 2 word required bit pattern
-#define DRM_STATUS_HEADER_2 0x40000001
-
-//DRM enable ID mask/position
-#define DRM_ENABLE_ID_MASK 0x00007ff0
-#define DRM_ENABLE_ID_POSITION 4
-
-//DRM fault ID mask/position
-#define DRM_FAULT_ID_MASK 0x07ff0000
-#define DRM_FAULT_ID_POSITION 16
-
-//DRM status header 3 word required bit pattern
-#define DRM_STATUS_HEADER_3 0x40000001
-
-//DRM TTC event counter mask/position
-#define DRM_TTC_EVENT_COUNTER_MASK 0x0ffffff0
-#define DRM_TTC_EVENT_COUNTER_POSITION 4
-
-//DRM event CRC mask/position
-//#define DRM_EVENT_CRC_MASK 0x001ffff0
-#define DRM_EVENT_CRC_MASK 0x000ffff0
-#define DRM_EVENT_CRC_POSITION 4
-
-//DRM global trailer word required bit pattern
-#define DRM_GLOBAL_TRAILER 0x50000001
-
-//DRM local event counter mask/position
-#define DRM_LOCAL_EVENT_COUNTER_MASK 0x0000fff0
-#define DRM_LOCAL_EVENT_COUNTER_POSITION 4
-
-
-/******************************************
-TRM DATA FORMAT                        
-******************************************/
-
-//TRM global header word required bit pattern
-#define TRM_GLOBAL_HEADER 0x40000000
-
-//TRM slot ID mask/position
-#define TRM_SLOT_ID_MASK 0x0000000f
-#define TRM_SLOT_ID_POSITION 0
-
-//TRM event words mask/position
-#define TRM_EVENT_WORDS_MASK 0x0001fff0
-#define TRM_EVENT_WORDS_POSITION 4
-
-//TRM ACQ-bits mask/position
-#define TRM_ACQ_BITS_MASK 0x00060000
-#define TRM_ACQ_BITS_POSITION 17
-
-//TRM L-bit mask/position
-#define TRM_L_BIT_MASK 0x00080000
-#define TRM_L_BIT_POSITION 19
-
-//TRM chain-0 header word required bit pattern
-#define TRM_CHAIN_0_HEADER 0x00000000
-
-//TRM chain-1 header word required bit pattern
-#define TRM_CHAIN_1_HEADER 0x20000000
-
-//TRM bunch ID mask/position
-#define TRM_BUNCH_ID_MASK 0x0000fff0
-#define TRM_BUNCH_ID_POSITION 4
-
-//TRM PB24 temp mask/position
-#define TRM_PB24_TEMP_MASK 0x00ff0000
-#define TRM_PB24_TEMP_POSITION 16
-
-//TRM PB24 ID mask/position
-#define TRM_PB24_ID_MASK 0x07000000
-#define TRM_PB24_ID_POSITION 24
-
-//TRM TS-bit mask/position
-#define TRM_TS_BIT_MASK 0x08000000
-#define TRM_TS_BIT_POSITION 27
-
-//TRM chain-0 trailer word required bit pattern
-#define TRM_CHAIN_0_TRAILER 0x10000000
-
-//TRM chain-1 trailer word required bit pattern
-#define TRM_CHAIN_1_TRAILER 0x30000000
-
-//TRM status mask/position
-#define TRM_STATUS_MASK 0x0000000f
-#define TRM_STATUS_POSITION 0
-
-
-//TDC digit
-
-//TRM TDC digit word required bit pattern
-#define TRM_TDC_DIGIT 0x8000000
-
-//TRM digit time mask/position
-#define TRM_DIGIT_TIME_MASK 0x00001fff
-#define TRM_DIGIT_TIME_POSITION 0
-
-//TRM long digit time mask/position
-#define TRM_LONG_DIGIT_TIME_MASK 0x001fffff
-#define TRM_LONG_DIGIT_TIME_POSITION 0
-
-//TRM TOT width mask/position
-#define TRM_TOT_WIDTH_MASK 0x001fe000
-#define TRM_TOT_WIDTH_POSITION 13
-
-//TRM chan mask/position
-#define TRM_CHAN_MASK 0x00e00000
-#define TRM_CHAN_POSITION 21
-
-//TRM TDC ID mask/position
-#define TRM_TDC_ID_MASK 0x0f000000
-#define TRM_TDC_ID_POSITION 24
-
-//TRM E-bit mask/position
-#define TRM_E_BIT_MASK 0x10000000
-#define TRM_E_BIT_POSITION 28
-
-//TRM PS-bits mask/position
-#define TRM_PS_BITS_MASK 0x60000000
-#define TRM_PS_BITS_POSITION 29
-
-
-//TRM errors
-
-//TRM TDC error word required bit pattern
-#define TRM_TDC_ERROR 0x6000000
-
-//TRM TDC diagnostic error word required bit pattern
-#define TRM_TDC_DIAGNOSTIC_ERROR 0x6f00000
-
-//TRM TDC error flags mask/position
-#define TRM_TDC_ERROR_FLAGS_MASK 0x00007fff
-#define TRM_TDC_ERROR_FLAGS_POSITION 0
-
-//TRM TDC error TDC ID mask/position
-#define TRM_TDC_ERROR_TDC_ID_MASK 0x0f00000
-#define TRM_TDC_ERROR_TDC_ID_POSITION 24
-
-//TRM TDC fault chip flag ID mask/position
-#define TRM_TDC_ERROR_FAULT_CHIP_FLAG_ID_MASK 0x00007fff
-#define TRM_TDC_ERROR_FAULT_CHIP_FLAG_ID_POSITION 0
-
-//TRM TDC error C-bit mask/position
-#define TRM_TDC_ERROR_C_BIT_MASK 0x00008000
-#define TRM_TDC_ERROR_C_BIT_POSITION 15
-
-//TRM TDC JTAG error code mask/position
-#define TRM_TDC_ERROR_JTAG_ERROR_CODE_MASK 0x000007ff
-#define TRM_TDC_ERROR_JTAG_ERROR_CODE_POSITION 0
-
-//TRM TDC disgnostic error TDC ID mask/position
-#define TRM_TDC_DIAGNOSTIC_ERROR_TDC_ID_MASK 0x00007800
-#define TRM_TDC_DIAGNOSTIC_ERROR_TDC_ID_POSITION 11 
-
-//TRM global trailer word required bit pattern
-//#define TRM_GLOBAL_TRAILER 0x50000000
-#define TRM_GLOBAL_TRAILER 0x5000000f
-
-//TRM event CRC mask/position
-#define TRM_EVENT_CRC_MASK 0x0000fff0
-#define TRM_EVENT_CRC_POSITION 4
-
-//TRM event counter mask/position
-#define TRM_EVENT_COUNTER_MASK 0x0fff0000
-#define TRM_EVENT_COUNTER_POSITION 16
-
-
-/******************************************
-LTM DATA FORMAT                        
-******************************************/
-
-//LTM global header word required bit pattern
-#define LTM_GLOBAL_HEADER 0x40000002
-
-//LTM event words mask/position
-#define LTM_EVENT_WORDS_MASK 0x0001fff0
-#define LTM_EVENT_WORDS_POSITION 4
-
-//LTM C-bit mask/position
-#define LTM_C_BIT_MASK 0x00020000
-#define LTM_C_BIT_POSITION 17
-
-//LTM fault mask/position
-#define LTM_FAULT_MASK 0x00fc0000
-#define LTM_FAULT_POSITION 18
-
-//PDL data 
-
-//PDL value 1 mask/position
-#define LTM_PDL_VALUE_1_MASK 0x000000ff
-#define LTM_PDL_VALUE_1_POSITION 0
-
-//PDL value 2 mask/position
-#define LTM_PDL_VALUE_2_MASK 0x0000ff00
-#define LTM_PDL_VALUE_2_POSITION 8
-
-//PDL value 3 mask/position
-#define LTM_PDL_VALUE_3_MASK 0x00ff0000
-#define LTM_PDL_VALUE_3_POSITION 16
-
-//PDL value 4 mask/position
-#define LTM_PDL_VALUE_4_MASK 0xff000000
-#define LTM_PDL_VALUE_4_POSITION 24
-
-//ADC data 
-
-//ADC value 1 mask/position
-#define LTM_ADC_VALUE_1_MASK 0x000003ff
-#define LTM_ADC_VALUE_1_POSITION 0
-
-//ADC value 2 mask/position
-#define LTM_ADC_VALUE_2_MASK 0x000ffc00
-#define LTM_ADC_VALUE_2_POSITION 10
-
-//ADC value 3 mask/position
-#define LTM_ADC_VALUE_3_MASK 0x3ff00000
-#define LTM_ADC_VALUE_3_POSITION 20
-
-//LTM global trailer word required bit pattern
-#define LTM_GLOBAL_TRAILER 0x50000002
-
-//LTM event CRC mask/position
-#define LTM_EVENT_CRC_MASK 0x0000fff0
-#define LTM_EVENT_CRC_POSITION 4
-
-//LTM event number mask/position
-#define LTM_EVENT_NUMBER_MASK 0x0fff0000
-#define LTM_EVENT_NUMBER_POSITION 16
-
+#include "AliTOFHitData.h"
 
 ClassImp(AliTOFRawStream)
 
 
 //_____________________________________________________________________________
-AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader)
+AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
+  fRawReader(rawReader),
+  fTOFrawData(0x0),
+  fDecoder(new AliTOFDecoder()),
+  fDDL(-1),
+  fTRM(-1),
+  fTRMchain(-1),
+  fTDC(-1),
+  fTDCchannel(-1),
+  fTime(-1),
+  fToT(-1),
+  fLeadingEdge(-1),
+  fTrailingEdge(-1),
+  fErrorFlag(-1),
+  fSector(-1),
+  fPlate(-1),
+  fStrip(-1),
+  fPadX(-1),
+  fPadZ(-1),
+  fPackedDigits(0),
+  fWordType(-1),
+  fSlotID(-1),
+  fACQ(-1),
+  fPSbit(-1),
+  fTDCerrorFlag(-1),
+  fInsideDRM(kFALSE),
+  fInsideTRM(kFALSE),
+  fInsideLTM(kFALSE),
+  fInsideTRMchain0(kFALSE),
+  fInsideTRMchain1(kFALSE)
 {
   //
   // create an object to read TOF raw digits
   //
 
-  fRawReader = rawReader;
-  fDDL = -1;
-  fTRM = -1;
-  fTDC = -1;
-  fTRMchain = -1;
-  fTDCchannel = -1;
-  fTof = -1;
-  fToT = -1;
-  fErrorFlag = -1;
-
-  fSector = -1;
-  fPlate = -1;
-  fStrip = -1;
-  fPadX = -1;
-  fPadZ = -1;
+  for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
+    fDataBuffer[i]=new AliTOFHitDataBuffer();
+    fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
+  }
 
-  fTOFGeometry = new AliTOFGeometryV5();
+  fTOFrawData = new TClonesArray("AliTOFrawData",1000);
+  fTOFrawData->SetOwner();
 
+  fRawReader->Reset();
   fRawReader->Select("TOF");
-
-  fWordType = -1;
-  fSlotID = -1;
-  fACQ = -1;
-  fPSbit = -1;
-  fTime = -1;
-  fTDCerrorFlag = -1;
-  fInsideDRM = kFALSE;
-  fInsideTRM = kFALSE;
-  fInsideLTM = kFALSE;
-  fInsideTRMchain0 = kFALSE;
-  fInsideTRMchain1 = kFALSE;
-  fLeadingOrphane = kFALSE;
-
 }
 
 //_____________________________________________________________________________
-AliTOFRawStream::AliTOFRawStream()
+AliTOFRawStream::AliTOFRawStream():
+  fRawReader(0x0), 
+  fTOFrawData(0x0),
+  fDecoder(new AliTOFDecoder()),
+  fDDL(-1),
+  fTRM(-1),
+  fTRMchain(-1),
+  fTDC(-1),
+  fTDCchannel(-1),
+  fTime(-1),
+  fToT(-1),
+  fLeadingEdge(-1),
+  fTrailingEdge(-1),
+  fErrorFlag(-1),
+  fSector(-1),
+  fPlate(-1),
+  fStrip(-1),
+  fPadX(-1),
+  fPadZ(-1),
+  fPackedDigits(0),
+  fWordType(-1),
+  fSlotID(-1),
+  fACQ(-1),
+  fPSbit(-1),
+  fTDCerrorFlag(-1),
+  fInsideDRM(kFALSE),
+  fInsideTRM(kFALSE),
+  fInsideLTM(kFALSE),
+  fInsideTRMchain0(kFALSE),
+  fInsideTRMchain1(kFALSE)
 {
   //
   // default ctr
   //
+  for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
+    fDataBuffer[i]=new AliTOFHitDataBuffer();
+    fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
+  }
 
-  fRawReader = 0x0;
-  fDDL = -1;
-  fTRM = -1;
-  fTDC = -1;
-  fTRMchain = -1;
-  fTDCchannel = -1;
-  fTof = -1;
-  fToT = -1;
-  fErrorFlag = -1;
-
-  fSector = -1;
-  fPlate = -1;
-  fStrip = -1;
-  fPadX = -1;
-  fPadZ = -1;
-
-  fTOFGeometry = new AliTOFGeometryV5();
-
-  fWordType = -1;
-  fSlotID = -1;
-  fACQ = -1;
-  fPSbit = -1;
-  fTime = -1;
-  fTDCerrorFlag = -1;
-  fInsideDRM = kFALSE;
-  fInsideTRM = kFALSE;
-  fInsideLTM = kFALSE;
-  fInsideTRMchain0 = kFALSE;
-  fInsideTRMchain1 = kFALSE;
-  fLeadingOrphane = kFALSE;
-
+  fTOFrawData = new TClonesArray("AliTOFrawData",1000);
+  fTOFrawData->SetOwner();
 }
 
 //_____________________________________________________________________________
 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
-  TObject(stream)
+  TObject(stream),
+  fRawReader(0x0),
+  fTOFrawData(0x0),
+  fDecoder(new AliTOFDecoder()),
+  fDDL(-1),
+  fTRM(-1),
+  fTRMchain(-1),
+  fTDC(-1),
+  fTDCchannel(-1),
+  fTime(-1),
+  fToT(-1),
+  fLeadingEdge(-1),
+  fTrailingEdge(-1),
+  fErrorFlag(-1),
+  fSector(-1),
+  fPlate(-1),
+  fStrip(-1),
+  fPadX(-1),
+  fPadZ(-1),
+  fPackedDigits(0),
+  fWordType(-1),
+  fSlotID(-1),
+  fACQ(-1),
+  fPSbit(-1),
+  fTDCerrorFlag(-1),
+  fInsideDRM(kFALSE),
+  fInsideTRM(kFALSE),
+  fInsideLTM(kFALSE),
+  fInsideTRMchain0(kFALSE),
+  fInsideTRMchain1(kFALSE)
 {
   //
   // copy constructor
   //
 
   fRawReader = stream.fRawReader;
+
+  fTOFrawData = stream.fTOFrawData;
+
   fDDL = stream.fDDL;
   fTRM = stream.fTRM;
-  fTDC = stream.fTDC;
   fTRMchain = stream.fTRMchain;
+  fTDC = stream.fTDC;
   fTDCchannel = stream.fTDCchannel;
-  fTof = stream.fTof;
+  fTime = stream.fTime;
   fToT = stream.fToT;
+  fLeadingEdge = stream.fLeadingEdge;
+  fTrailingEdge = stream.fTrailingEdge;
+
   fErrorFlag = stream.fErrorFlag;
 
   fSector = stream.fSector;
@@ -460,21 +256,26 @@ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
   fPadX = stream.fPadX;
   fPadZ = stream.fPadZ;
 
-  fTOFGeometry = stream.fTOFGeometry;
+  fPackedDigits = stream.fPackedDigits;
 
   fWordType = stream.fWordType;
   fSlotID = stream.fSlotID;
   fACQ = stream.fACQ;
   fPSbit = stream.fPSbit;
-  fTime = stream.fTime;
   fTDCerrorFlag = stream.fTDCerrorFlag;
   fInsideDRM = stream.fInsideDRM;
   fInsideTRM = stream.fInsideTRM;
   fInsideLTM = stream.fInsideLTM;
   fInsideTRMchain0 = stream.fInsideTRMchain0;
   fInsideTRMchain1 = stream.fInsideTRMchain1;
-  fLeadingOrphane = stream.fLeadingOrphane;
 
+  for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
+    fDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fDataBuffer[i]);
+    fPackedDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fPackedDataBuffer[i]);
+  }
+
+  fTOFrawData = new TClonesArray(*stream.fTOFrawData);
+  
 }
 
 //_____________________________________________________________________________
@@ -485,13 +286,18 @@ AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
   //
 
   fRawReader = stream.fRawReader;
+
+  fTOFrawData = stream.fTOFrawData;
+
   fDDL = stream.fDDL;
   fTRM = stream.fTRM;
-  fTDC = stream.fTDC;
   fTRMchain = stream.fTRMchain;
+  fTDC = stream.fTDC;
   fTDCchannel = stream.fTDCchannel;
-  fTof = stream.fTof;
+  fTime = stream.fTime;
   fToT = stream.fToT;
+  fLeadingEdge = stream.fLeadingEdge;
+  fTrailingEdge = stream.fTrailingEdge;
   fErrorFlag = stream.fErrorFlag;
 
   fSector = stream.fSector;
@@ -500,21 +306,26 @@ AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
   fPadX = stream.fPadX;
   fPadZ = stream.fPadZ;
 
-  fTOFGeometry = stream.fTOFGeometry;
+  fPackedDigits = stream.fPackedDigits;
 
   fWordType = stream.fWordType;
   fSlotID = stream.fSlotID;
   fACQ = stream.fACQ;
   fPSbit = stream.fPSbit;
-  fTime = stream.fTime;
   fTDCerrorFlag = stream.fTDCerrorFlag;
   fInsideDRM = stream.fInsideDRM;
   fInsideTRM = stream.fInsideTRM;
   fInsideLTM = stream.fInsideLTM;
   fInsideTRMchain0 = stream.fInsideTRMchain0;
   fInsideTRMchain1 = stream.fInsideTRMchain1;
-  fLeadingOrphane = stream.fLeadingOrphane;
-
+  
+  for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){ 
+    fDataBuffer[i] = stream.fDataBuffer[i];
+    fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
+  }
+  
+  fTOFrawData = stream.fTOFrawData;
+  
   return *this;
 
 }
@@ -524,11 +335,97 @@ AliTOFRawStream::~AliTOFRawStream()
 {
 // destructor
 
-  fTOFGeometry = 0;
+  fPackedDigits = 0;
+
+  for (Int_t i=0;i<72;i++){ 
+    delete fDataBuffer[i];
+    delete fPackedDataBuffer[i];
+  }
 
+  delete fDecoder;
+
+  fTOFrawData->Clear();
+  delete fTOFrawData;
 }
 
 
+//_____________________________________________________________________________
+
+void AliTOFRawStream::LoadRawData(Int_t indexDDL)
+{
+  //
+  // To load raw data
+  //
+
+  fTOFrawData->Clear();
+
+  TClonesArray &arrayTofRawData =  *fTOFrawData;
+
+  fPackedDigits = 0;
+
+  // create raw data map
+  AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData);
+  rawMap->Clear();
+
+  Int_t slot[4] = {-1, -1, -1, -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) {
+      AliDebug(2,Form("  %2i  %1i  %2i  %1i  %2i  \n", fSector, fPlate, fStrip, fPadZ, fPadX));
+
+      slot[0] = fTRM;
+      slot[1] = fTRMchain;
+      slot[2] = fTDC;
+      slot[3] = fTDCchannel;
+
+      if (rawMap->TestHit(slot) != kEmpty) {
+
+       rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
+
+       if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
+           fLeadingEdge==-1 && fTrailingEdge!=-1) {
+
+         rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
+       }
+       else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
+                  (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
+
+                 )
+         {
+
+           new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
+
+           rawMap->SetHit(slot);
+
+         }
+
+
+      }
+      else {
+
+       new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
+
+       rawMap->SetHit(slot);
+
+      } // else if (rawMap->TestHit(slot) == kEmpty)
+
+    } // if (signal)
+
+  } // closed -> while (Next())
+
+  rawMap->Delete();
+
+}
+
 //_____________________________________________________________________________
 Bool_t AliTOFRawStream::Next()
 {
@@ -543,18 +440,18 @@ Bool_t AliTOFRawStream::Next()
 
   if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
     fSector = -1;
-    fPlate = -1;
-    fStrip = -1;
-    fPadZ = -1;
-    fPadX = -1;
+    fPlate  = -1;
+    fStrip  = -1;
+    fPadZ   = -1;
+    fPadX   = -1;
+    fTime   = -1;
+    fToT    = -1;
+    fLeadingEdge  = -1;
+    fTrailingEdge = -1;
   }
 
-
   fDDL  = fRawReader->GetDDLID();
 
-  // orphane digits
-  AliTOFtdcDigit orphaneLeadingDigit;
-
   fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
 
   switch (fWordType) { // switch word type
@@ -620,23 +517,23 @@ Bool_t AliTOFRawStream::Next()
       fInsideLTM = kFALSE;
       fInsideTRMchain0 = kFALSE;
       fInsideTRMchain1 = kFALSE;
-      fLeadingOrphane = kFALSE;
       fSector = -1;
-      fPlate = -1;
-      fStrip = -1;
-      fPadZ = -1;
-      fPadX = -1;
-      fDDL = -1;
-      fTRM = -1;
-      fTDC = -1;
-      fTRMchain = -1;
+      fPlate  = -1;
+      fStrip  = -1;
+      fPadZ   = -1;
+      fPadX   = -1;
+      fDDL        = -1;
+      fTRM        = -1;
+      fTDC        = -1;
+      fTRMchain   = -1;
       fTDCchannel = -1;
-      fTof = -1;
-      fToT = -1;
+      fTime = -1;
+      fToT  = -1;
+      fLeadingEdge  = -1;
+      fTrailingEdge = -1;
       fErrorFlag = -1;
-      fACQ = -1;
+      fACQ   = -1;
       fPSbit = -1;
-      fTime = -1;
       fTDCerrorFlag = -1;
       break;
     case LTM_ID_NUMBER: // LTM global trailer
@@ -660,7 +557,7 @@ Bool_t AliTOFRawStream::Next()
 
 
   case ERROR_TYPE: // TDC error
-    fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
+    fTDC          = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
     fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
     break;
 
@@ -712,86 +609,52 @@ Bool_t AliTOFRawStream::Next()
        && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
        && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
        ){ // inside TRM chains
-      fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
-      fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
+
+      fPSbit      = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
+      fTDC        = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
       fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
+      fErrorFlag  = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
+
+      SetSector();
+      SetPlate();
+      SetStrip();
+      SetPadZ();
+      SetPadX();
+
 
       switch (fPSbit) { // switch fPSbit bits inside TRM chains
-      case 0: // packing ok, digit time and tot
-       fToT = GetField(data,TRM_TOT_WIDTH_MASK,TRM_TOT_WIDTH_POSITION);
+
+      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);
-       fTof = fTime;
-       SetSector();
-       SetPlate();
-       SetStrip();
-       SetPadZ();
-       SetPadX();
        break;
 
       case 1: // leading edge digit, long digit time, no TOT
-       fToT = -1;
-       fTime = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
-       fTof = fTime;
-       SetSector();
-       SetPlate();
-       SetStrip();
-       SetPadZ();
-       SetPadX();
-       // always set it as orphane leading
-       fLeadingOrphane=1;
-       orphaneLeadingDigit.fSlotID = fSlotID;
-       orphaneLeadingDigit.fChain = fTRMchain;
-       orphaneLeadingDigit.fPS = fPSbit;
-       orphaneLeadingDigit.fTDC = fTDC;
-       orphaneLeadingDigit.fChannel = fTDCchannel;
-       orphaneLeadingDigit.fTOT = fToT;
-       orphaneLeadingDigit.fTime = fTime;
+       //fToT  = -1;
+       //fTime  = -1;
+       fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
        break;
 
       case 2: // trailing edge digit, long digit time, no TOT
-       fToT = -1;
-       fTime = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
-       fTof = fTime;
-       SetSector();
-       SetPlate();
-       SetStrip();
-       SetPadZ();
-       SetPadX();
-       if (fACQ!=3) // check if packing is disabled
-         break;
-       if (!fLeadingOrphane) // check for a orphane leading edge
-         break;
-       if (orphaneLeadingDigit.fSlotID != fSlotID ||
-           orphaneLeadingDigit.fChain != fTRMchain ||
-           orphaneLeadingDigit.fTDC != fTDC ||
-           orphaneLeadingDigit.fChannel != fTDCchannel) // check leading edge compatibility (fSlotID, fTRMchain, fTDC, fTDCchannel)
-         break;
-       fLeadingOrphane = 0; // orphane leading is no longer orphane
-       SetSector();
-       SetPlate();
-       SetStrip();
-       SetPadZ();
-       SetPadX();
+       //fToT  = -1;
+       //fTime  = -1;
+       fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
        break;
+
       case 3: // TOT overflow
-       fToT = GetField(data,TRM_TOT_WIDTH_MASK,TRM_TOT_WIDTH_POSITION);
+       fToT  = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
        fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
-       fTof = fTime;
-       SetSector();
-       SetPlate();
-       SetStrip();
-       SetPadZ();
-       SetPadX();
        break;
-      } // end switch fPSbit bits inside TRM chains
 
+      } // end switch PS bits inside TRM chains
 
     } // end if is inside TRM chains
 
   } // end switch on fWordType
 
-  return kTRUE;
 
+  return kTRUE;
+  
 }
 //_____________________________________________________________________________
 
@@ -802,7 +665,7 @@ void AliTOFRawStream::SetSector()
   // corresponding to the TOF equipment IDs:
   //                                  fDDL        -> [ 0;71]
   //                                  fTRM        -> [ 3;12]
-  //                                  fTRMchain   -> [0;  1]
+  //                                  fTRMchain   -> [ 0; 1]
   //                                  fTDC        -> [ 0;14]
   //                                  fTDCchannel -> [ 0; 7]
   //
@@ -824,7 +687,7 @@ void AliTOFRawStream::SetPlate()
   // corresponding to the TOF equipment IDs:
   //                                  fDDL        -> [ 0;71]
   //                                  fTRM        -> [ 3;12]
-  //                                  fTRMchain   -> [0;  1]
+  //                                  fTRMchain   -> [ 0; 1]
   //                                  fTDC        -> [ 0;14]
   //                                  fTDCchannel -> [ 0; 7]
   //
@@ -846,7 +709,7 @@ void AliTOFRawStream::SetStrip()
   // corresponding to the TOF equipment IDs:
   //                                  fDDL        -> [ 0;71]
   //                                  fTRM        -> [ 3;12]
-  //                                  fTRMchain   -> [0;  1]
+  //                                  fTRMchain   -> [ 0; 1]
   //                                  fTDC        -> [ 0;14]
   //                                  fTDCchannel -> [ 0; 7]
   //
@@ -869,7 +732,7 @@ void AliTOFRawStream::SetPadZ()
   // corresponding to the TOF equipment IDs:
   //                                  fDDL        -> [ 0;71]
   //                                  fTRM        -> [ 3;12]
-  //                                  fTRMchain   -> [0;  1]
+  //                                  fTRMchain   -> [ 0; 1]
   //                                  fTDC        -> [ 0;14]
   //                                  fTDCchannel -> [ 0; 7]
   //
@@ -896,7 +759,7 @@ void AliTOFRawStream::SetPadX()
   // corresponding to the TOF equipment IDs:
   //                                  fDDL        -> [ 0;71]
   //                                  fTRM        -> [ 3;12]
-  //                                  fTRMchain   -> [0;  1]
+  //                                  fTRMchain   -> [ 0; 1]
   //                                  fTDC        -> [ 0;14]
   //                                  fTDCchannel -> [ 0; 7]
   //
@@ -1132,9 +995,10 @@ 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())) {
+    fRawReader->AddMajorErrorLog(kPadXError);
+    AliWarning("Problems with the padX number!");
+  }
   return iPadAlongTheStrip;
 
 }
@@ -1166,6 +1030,11 @@ Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL) const
 
 }
 
+//----------------------------------------------------------------------------
+void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
+{
+  EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
+}
 //----------------------------------------------------------------------------
 void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
                                        Int_t nTDC, Int_t iCH,
@@ -1192,14 +1061,22 @@ 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) {
+    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) {
+    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){
+    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();
@@ -1211,3 +1088,177 @@ void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
   volume[4] = iPadZ;
 
 }
+//-----------------------------------------------------------------------------
+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 (nDDLMin < 0){
+    nDDLMin = 0;
+    fRawReader->AddMinorErrorLog(kDDLMinError);
+    AliWarning("Wrong DDL range: setting first DDL ID to 0");
+  }
+  if (nDDLMax > 71){
+    nDDLMax = 71;
+    fRawReader->AddMinorErrorLog(kDDLMaxError);
+    AliWarning("Wrong DDL range: setting last DDL ID to 71");
+  }  
+
+  //select required DDLs
+  fRawReader->Select("TOF", nDDLMin, nDDLMax);
+
+  if (verbose)
+    AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
+
+  return(Decode(verbose));
+}
+//-----------------------------------------------------------------------------
+Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
+  //
+  // New decoder method
+  //
+
+  Int_t currentEquipment;
+  Int_t currentDDL;
+
+  //pointers
+  UChar_t *data = 0x0;
+  
+  //loop and read DDL headers 
+  while(fRawReader->ReadHeader()){
+
+    //memory leak prevention (actually data should be always 0x0 here)
+    if (data != 0x0)
+      delete [] data;
+
+    //get equipment infos
+    currentEquipment = fRawReader->GetEquipmentId();
+    currentDDL = fRawReader->GetDDLID();
+    const Int_t kDataSize = fRawReader->GetDataSize();
+    const Int_t kDataWords = kDataSize / 4;
+    data = new UChar_t[kDataSize];
+    
+    if (verbose)
+      AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
+    
+    if (verbose)
+      AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
+    
+    //read equipment payload
+    if (!fRawReader->ReadNext(data, kDataSize))
+      {
+       fRawReader->AddMajorErrorLog(kDDLdataReading);
+       if (verbose)
+         AliWarning("Error while reading DDL data. Go to next equipment");
+       delete [] data;
+       data = 0x0;
+       continue;
+      }
+    
+    if (verbose)
+      AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
+    
+    
+    //set up the decoder
+    fDecoder->SetVerbose(verbose);
+    fDecoder->SetDataBuffer(fDataBuffer[currentDDL]);
+    fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]);
+    
+    //start decoding
+    if (fDecoder->Decode((UInt_t *)data, kDataWords) == kTRUE) {
+      fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
+      AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
+    }
+    
+    delete [] data;
+    data = 0x0;
+  }
+  
+  //reset reader
+  fRawReader->Reset();
+
+  if (verbose)
+    AliInfo("All done");
+    
+  return kFALSE;
+  
+}
+//---------------------------------------------------------------------------
+void
+AliTOFRawStream::ResetBuffers()
+{
+  //
+  // To reset the buffers
+  //
+
+  for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
+    ResetDataBuffer(iDDL);
+    ResetPackedDataBuffer(iDDL);
+  }
+}
+  
+//---------------------------------------------------------------------------
+Bool_t
+AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
+{
+  //
+  // To load the buffers
+  //
+
+  fTOFrawData->Clear();
+  fPackedDigits = 0;
+  
+  if (verbose > 0)
+    AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
+
+  if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
+    fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
+    AliWarning(Form("Error while decoding DDL # %d", indexDDL));
+    return kTRUE;
+  }
+  
+  if (verbose > 0)
+    AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL]->GetEntries(), fPackedDataBuffer[indexDDL]->GetEntries() > 1 ? "hits have" : "hit has"));
+  
+  AliTOFHitData *hitData; //hit data pointer
+  
+  if (verbose > 0)
+    AliInfo("Filling TClonesArray ...");
+
+  //loop over DDL packed hits
+  for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){
+    hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data
+    Int_t   hitACQ = hitData->GetACQ();
+    Int_t   hitPS = hitData->GetPS();
+    Int_t   hitSlotID = hitData->GetSlotID();
+    Int_t   hitChain = hitData->GetChain();
+    Int_t   hitTDC = hitData->GetTDC();
+    Int_t   hitChan = hitData->GetChan();
+    Int_t   hitTimeBin = hitData->GetTimeBin();
+    Int_t   hitTOTBin = hitData->GetTOTBin();
+    
+    Int_t hitLeading = hitData->GetTimeBin();//-1; // adc
+    Int_t hitTrailing = -1;
+    Int_t hitError = -1;
+    
+    TClonesArray &arrayTofRawData =  *fTOFrawData;
+    new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError);
+  }
+
+  if (verbose > 0)
+    AliInfo("Done.");
+
+  if (verbose > 0)
+    AliInfo("Resetting buffers ...");
+
+  fDataBuffer[indexDDL]->Reset();
+  fPackedDataBuffer[indexDDL]->Reset();
+
+  if (verbose > 0)
+    AliInfo("Done.");
+
+  return kFALSE;
+}
+