]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFDecoderV2.cxx
updates on TOF software:
[u/mrichter/AliRoot.git] / TOF / AliTOFDecoderV2.cxx
diff --git a/TOF/AliTOFDecoderV2.cxx b/TOF/AliTOFDecoderV2.cxx
new file mode 100644 (file)
index 0000000..386e011
--- /dev/null
@@ -0,0 +1,1401 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+***************************************************************************/
+
+/*
+$Log: AliTOFDecoder.cxx,v $
+Revision 1.4  2007/05/18 13:08:57  decaro
+Coding convention: RS1 violation -> suppression
+
+Revision 1.3  2007/05/08 11:56:05  arcelli
+improved verbosity in verbose mode (R.Preghenella)
+
+Revision 1.2  2007/05/03 11:34:43  decaro
+Coding convention: RS1 violation -> suppression
+
+Revision 1.1  2007/04/27 11:00:32  arcelli
+TOF Raw Data decoder
+
+  author: Roberto Preghenella (R+), preghenella@bo.infn.it
+*/
+
+
+//////////////////////////////////////////////////////////////////////
+//                                                                  //
+//                                                                  //
+//   Class for raw data decoding                                    //
+//                                                                  //
+//                                                                  //
+//////////////////////////////////////////////////////////////////////
+                               
+
+#include "AliLog.h"
+#include "AliTOFDecoderV2.h"
+#include "AliTOFTDCHit.h"
+
+ClassImp(AliTOFDecoderV2)
+
+//_________________________________________________________________
+
+AliTOFDecoderV2::AliTOFDecoderV2(AliRawReader *reader) :
+  TObject(),
+  fRawReader(reader),
+  fVerbose(kFALSE),
+  fLogErrors(kTRUE),
+  fV2718Patch(kFALSE),
+  fRecoverError(kTRUE),
+  fRecoverErrorThr(0),
+  fSpider(kTRUE),
+  fRunNumber(0),
+  fEventNumber(0),
+  fEquipmentID(0),
+  fDecoderSummaryData(0x0),
+  fDRMSummaryData(0x0),
+  fLTMSummaryData(0x0),
+  fTRMSummaryData(0x0),
+  fChainSummaryData(0x0),
+  fTDCHitBuffer(0x0),
+  fTDCPackedHitBuffer(0x0),
+  fTDCErrorBuffer(0x0),
+  fDRMGlobalHeader(0x0),
+  fDRMGlobalTrailer(0x0),
+  fDRMStatusHeader1(0x0),
+  fDRMStatusHeader2(0x0),
+  fDRMStatusHeader3(0x0),
+  fDRMStatusHeader4(0x0),
+  fDRMEventCRC(0x0),
+  fLTMGlobalHeader(0x0),
+  fLTMGlobalTrailer(0x0),
+  fLTMPDLData(0x0),
+  fLTMADCData(0x0),
+  fLTMORData(0x0),
+  fTRMGlobalHeader(0x0),
+  fTRMGlobalTrailer(0x0),
+  fTRMChainHeader(0x0),
+  fTRMChainTrailer(0x0),
+  fTDCPackedHit(0x0),
+  fTDCUnpackedHit(0x0),
+  fTRMTDCError(0x0),
+  fTRMDiagnosticErrorWord1(0x0),
+  fTRMDiagnosticErrorWord2(0x0),
+  fSpiderTDCID(-1),
+  fSpiderTDCPackedHitBuffer(0x0)
+{
+  //default constructor
+  if (fRawReader)
+    fRawReader->Select("TOF", 0, 71);
+
+  fDecoderSummaryData = new AliTOFDecoderSummaryData();
+
+  for (Int_t iChan = 0; iChan < N_CHANNEL; iChan++)
+    fSpiderBufferFull[iChan] = kFALSE;
+}
+
+//_________________________________________________________________
+
+AliTOFDecoderV2::AliTOFDecoderV2(const AliTOFDecoderV2 &source) : 
+  TObject(),
+  fRawReader(source.fRawReader),
+  fVerbose(source.fVerbose),
+  fLogErrors(source.fLogErrors),
+  fV2718Patch(source.fV2718Patch),
+  fRecoverError(source.fRecoverError),
+  fRecoverErrorThr(source.fRecoverErrorThr),
+  fSpider(source.fSpider),
+  fRunNumber(source.fRunNumber),
+  fEventNumber(source.fEventNumber),
+  fEquipmentID(source.fEquipmentID),
+  fDecoderSummaryData(0x0),
+  fDRMSummaryData(0x0),
+  fLTMSummaryData(0x0),
+  fTRMSummaryData(0x0),
+  fChainSummaryData(0x0),
+  fTDCHitBuffer(0x0),
+  fTDCPackedHitBuffer(0x0),
+  fTDCErrorBuffer(0x0),
+  fDRMGlobalHeader(0x0),
+  fDRMGlobalTrailer(0x0),
+  fDRMStatusHeader1(0x0),
+  fDRMStatusHeader2(0x0),
+  fDRMStatusHeader3(0x0),
+  fDRMStatusHeader4(0x0),
+  fDRMEventCRC(0x0),
+  fLTMGlobalHeader(0x0),
+  fLTMGlobalTrailer(0x0),
+  fLTMPDLData(0x0),
+  fLTMADCData(0x0),
+  fLTMORData(0x0),
+  fTRMGlobalHeader(0x0),
+  fTRMGlobalTrailer(0x0),
+  fTRMChainHeader(0x0),
+  fTRMChainTrailer(0x0),
+  fTDCPackedHit(0x0),
+  fTDCUnpackedHit(0x0),
+  fTRMTDCError(0x0),
+  fTRMDiagnosticErrorWord1(0x0),
+  fTRMDiagnosticErrorWord2(0x0),
+  fSpiderTDCID(-1),
+  fSpiderTDCPackedHitBuffer(0x0)
+{
+  //copy constructor
+  fDecoderSummaryData = new AliTOFDecoderSummaryData(*source.fDecoderSummaryData);
+  
+  for (Int_t iChan = 0; iChan < N_CHANNEL; iChan++)
+    fSpiderBufferFull[iChan] = kFALSE;
+}
+
+//_________________________________________________________________
+
+AliTOFDecoderV2 &
+AliTOFDecoderV2::operator = (const AliTOFDecoderV2 &source)
+{
+  //operator =
+  fRawReader = source.fRawReader;
+  fVerbose = source.fVerbose;
+  fLogErrors = source.fLogErrors;
+  fV2718Patch = source.fV2718Patch;
+  fRecoverError = source.fRecoverError;
+  fRecoverErrorThr = source.fRecoverErrorThr;
+  fSpider = source.fSpider;
+  fRunNumber = source.fRunNumber;
+  fEventNumber = source.fEventNumber;
+  fEquipmentID = source.fEquipmentID;
+  *fDecoderSummaryData = *source.fDecoderSummaryData;
+  return *this;
+}
+
+AliTOFDecoderV2::~AliTOFDecoderV2()
+{
+  delete fDecoderSummaryData;
+}
+
+//_________________________________________________________________
+
+Bool_t
+AliTOFDecoderV2::Decode(UInt_t *rawData, UInt_t nWords)
+{
+  /* main decoding routine.
+   * it loops over nWords 32-bit words 
+   * starting at *rawData and decodes them.
+   * it also fills some buffers in order to
+   * have the decoded data available for other
+   * classes.
+   */
+
+  //reset decoder summary data
+  fDecoderSummaryData->Reset();
+
+  //fill decoder summary data
+  fDecoderSummaryData->SetRunNumber(fRunNumber);
+  fDecoderSummaryData->SetEventNumber(fEventNumber);
+  fDecoderSummaryData->SetEquipmentID(fEquipmentID);
+  fDecoderSummaryData->SetInputWords(nWords);
+  fDecoderSummaryData->SetRecoverError(fRecoverError);
+  fDecoderSummaryData->SetSpider(fSpider);
+
+  AliTOFTDCHit hit;
+  AliTOFTDCError error;
+
+  //decoder status
+  UShort_t decoderStatus = 0x0;
+
+  //CRC variables
+  UInt_t DRMCRC = 0x0;
+  UInt_t LTMCRC = 0x0;
+  UInt_t TRMCRC = 0x0;
+
+  // error warning counter
+  Int_t errorWarning = 0;
+  
+  if (fRecoverError && fVerbose)
+    AliInfo("Recover error option enabled: potentially dangerous!");
+
+  /*** V2718 patch ***/
+  if (fV2718Patch){
+    decoderStatus = decoderStatus | DRM_BIT;
+    fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+    fDecoderSummaryData->SetCurrentDRMID(0x0);
+    fDecoderSummaryData->SetV2718Patch(kTRUE);
+    fDRMSummaryData = fDecoderSummaryData->GetDRMSummaryData();
+    fDRMSummaryData->SetHeader(kTRUE);
+    fDRMSummaryData->SetDRMID(0x0);
+    if (fVerbose)
+      AliInfo("DRM not present: - V2718 patch decoding -");
+  }
+  /*** V2718 patch ***/
+
+  if (fVerbose)
+    AliInfo("Start decoding");
+  
+  if (fVerbose)
+    AliInfo("Loop over the data and decode");
+  
+  if (fVerbose)
+    AliInfo("  St    Hex Word \t   Decoded Word");
+  
+  //loop over raw data
+  for (UInt_t iWord = 0; 
+       iWord < nWords; 
+       iWord++, rawData++, fDecoderSummaryData->SetDecodedWords(iWord)){
+    
+    //try to recover error
+    if (fDecoderSummaryData->GetRecoveringError() && fVerbose)
+      AliInfo(Form("  %02x - 0x%08x",decoderStatus,*rawData));
+    
+    //compute CRC with current data
+    DRMCRC ^= *rawData;
+    LTMCRC ^= *rawData;
+    TRMCRC ^= *rawData;
+
+    //switch word type
+    switch (*rawData & WORD_TYPE_MASK){
+      
+    case GLOBAL_HEADER:
+      
+      //switch slot ID
+      switch (*rawData & SLOT_ID_MASK){
+       
+       //DRM global header (slotID=1)
+      case 1:
+       //try to recover error
+       if (fDecoderSummaryData->GetRecoveringError())
+         continue;
+       //check decode status
+       if ( decoderStatus != DRM_HEADER_STATUS ){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected DRM global header (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+         fDecoderSummaryData->SetErrorDetected(kTRUE);
+         fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+         return(fDecoderSummaryData->GetErrorDetected());
+       }
+       //decode status ok
+       errorWarning = 0;
+       //set DRM global header
+       fDRMGlobalHeader = (AliTOFDRMGlobalHeader *)rawData;
+       //reset DRM CRC
+       DRMCRC = 0x0;
+       //fill decoder summary data
+       fDecoderSummaryData->SetCurrentDRMID(fDRMGlobalHeader->GetDRMID());
+       fDecoderSummaryData->SetCurrentSlotID(fDRMGlobalHeader->GetSlotID());
+       //get DRM summary data
+       fDRMSummaryData = fDecoderSummaryData->GetDRMSummaryData();
+       //reset DRM summary data
+       fDRMSummaryData->Reset();
+       //fill DRM summary data
+       FillDRMSummaryData(fDRMGlobalHeader);
+       //print verbose
+       if (fVerbose)
+         AliInfo(Form("  %02x - 0x%08x \t  DRM global header",decoderStatus,*rawData));
+       //change decode status
+       decoderStatus = decoderStatus | DRM_BIT;
+       fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+       //decode DRM status headers
+       for (Int_t i = 0; i < DRM_STATUS_HEADER_WORDS; i++){
+         iWord++;
+         rawData++;
+         DRMCRC ^= *rawData;
+
+         switch (i){
+         case 0: //DRM status header 1
+           fDRMStatusHeader1 = (AliTOFDRMStatusHeader1 *)rawData;
+           FillDRMSummaryData(fDRMStatusHeader1);
+           if (fVerbose)
+             AliInfo(Form("  %02x - 0x%08x \t  DRM status header 1",decoderStatus,*rawData));
+           break;
+         case 1: //DRM status header 2
+           fDRMStatusHeader2 = (AliTOFDRMStatusHeader2 *)rawData;
+           FillDRMSummaryData(fDRMStatusHeader2);
+           if (fVerbose)
+             AliInfo(Form("  %02x - 0x%08x \t  DRM status header 2",decoderStatus,*rawData));
+           break;
+         case 2: //DRM status header 3
+           fDRMStatusHeader3 = (AliTOFDRMStatusHeader3 *)rawData;
+           FillDRMSummaryData(fDRMStatusHeader3);
+           if (fVerbose)
+             AliInfo(Form("  %02x - 0x%08x \t  DRM status header 3",decoderStatus,*rawData));
+           break;
+         case 3: //DRM status header 4
+           fDRMStatusHeader4 = (AliTOFDRMStatusHeader4 *)rawData;
+           FillDRMSummaryData(fDRMStatusHeader4);
+           if (fVerbose)
+             AliInfo(Form("  %02x - 0x%08x \t  DRM status header 4",decoderStatus,*rawData));
+           break;
+         }
+       }
+       //decode DRM event CRC
+       iWord++;
+       rawData++;
+       DRMCRC ^= *rawData;
+       //remove DRM event CRC from DRM CRC
+       DRMCRC ^= *rawData;
+       fDRMEventCRC = (AliTOFDRMEventCRC *)rawData;
+       FillDRMSummaryData(fDRMEventCRC);
+       if (fVerbose)
+         AliInfo(Form("  %02x - 0x%08x \t  DRM event CRC",decoderStatus,*rawData));
+       break;
+       
+       //LTM global header (slotID=2)
+      case 2:
+       //recover error
+       if (fDecoderSummaryData->GetRecoveringError()){
+         //change decode status
+         decoderStatus = LTM_HEADER_STATUS;
+         fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+         fDecoderSummaryData->SetRecoveringError(kFALSE);
+         if (fVerbose)
+           AliInfo("LTM global header found: error probably recovered");
+       }
+       //check decode status
+       if ( decoderStatus != LTM_HEADER_STATUS ){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected LTM global header (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+         fDecoderSummaryData->SetErrorDetected(kTRUE);
+         fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+         return(fDecoderSummaryData->GetErrorDetected());
+       }
+       //decode status ok
+       errorWarning = 0;
+       //set LTM global header
+       fLTMGlobalHeader = (AliTOFLTMGlobalHeader *)rawData;
+       //reset LTM CRC
+       LTMCRC = 0x0;
+       //fill decoder summary data
+       fDecoderSummaryData->SetCurrentSlotID(fLTMGlobalHeader->GetSlotID());
+       //get LTM summary data
+       fLTMSummaryData = fDRMSummaryData->GetLTMSummaryData();
+       //reset LTM summary data
+       fLTMSummaryData->Reset();
+       //fill LTM summary data
+       FillLTMSummaryData(fLTMGlobalHeader);
+       //set DRM slot enable mask bit
+       fDRMSummaryData->SetDecoderSlotEnableMaskBit(fLTMGlobalHeader->GetSlotID() - 2);
+       //print verbose
+       if (fVerbose)
+         AliInfo(Form("  %02x - 0x%08x \t  LTM global header",decoderStatus,*rawData));
+       //change decode status
+       decoderStatus = decoderStatus | LTM_BIT;
+       fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+       
+       //decode LTM PDL data
+       for (Int_t iPDLWord = 0; iPDLWord < LTM_PDL_DATA_WORDS; iPDLWord++){
+         iWord++;
+         rawData++;
+         DRMCRC ^= *rawData;
+         LTMCRC ^= *rawData;
+         //set LTM PDL data
+         fLTMPDLData = (AliTOFLTMPDLData *)rawData;
+         //fill LTM summary data
+         FillLTMSummaryData(fLTMPDLData, iPDLWord);
+         //print verbose
+         if (fVerbose)
+           AliInfo(Form("  %02x - 0x%08x \t  LTM PDL data \t\t PDL1=%03d PDL2=%03d PDL3=%03d PDL4=%03d",decoderStatus,*rawData,fLTMPDLData->GetPDLValue1(),fLTMPDLData->GetPDLValue2(),fLTMPDLData->GetPDLValue3(),fLTMPDLData->GetPDLValue4()));
+       }
+       //decode LTM ADC data
+       for (Int_t iADCWord = 0; iADCWord < LTM_ADC_DATA_WORDS; iADCWord++){
+         iWord++;
+         rawData++;
+         DRMCRC ^= *rawData;
+         LTMCRC ^= *rawData;
+         //set LTM ADC data
+         fLTMADCData = (AliTOFLTMADCData *)rawData;
+         //fill LTM summary data
+         FillLTMSummaryData(fLTMADCData, iADCWord);
+         //print verbose
+         if (fVerbose)
+           AliInfo(Form("  %02x - 0x%08x \t  LTM ADC data \t\t ADC1=%04d ADC2=%04d ADC3=%04d",decoderStatus,*rawData,fLTMADCData->GetADCValue1(),fLTMADCData->GetADCValue2(),fLTMADCData->GetADCValue3()));
+       }
+       //decode LTM OR data
+       for (Int_t iORWord = 0; iORWord < LTM_OR_DATA_WORDS; iORWord++){
+         iWord++;
+         rawData++;
+         DRMCRC ^= *rawData;
+         LTMCRC ^= *rawData;
+         //set LTM OR data
+         fLTMORData = (AliTOFLTMORData *)rawData;
+         //fill LTM summary data
+         FillLTMSummaryData(fLTMORData, iORWord);
+         //print verbose
+         if (fVerbose)
+           AliInfo(Form("  %02x - 0x%08x \t  LTM OR data \t\t ADC1=%04d ADC2=%04d ADC3=%04d",decoderStatus,*rawData,fLTMORData->GetORValue1(),fLTMORData->GetORValue2(),fLTMORData->GetORValue3()));
+       }
+       break;
+       
+       //TRM global header (slotID=3-12)
+      case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12:
+       //recover error
+       if (fDecoderSummaryData->GetRecoveringError()){
+         //change decode status
+         decoderStatus = TRM_HEADER_STATUS;
+         fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+         fDecoderSummaryData->SetRecoveringError(kFALSE);
+         if (fVerbose)
+           AliInfo("TRM global header found: error probably recovered");
+       }
+       //check decode status
+       if ( decoderStatus != TRM_HEADER_STATUS ){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected TRM global header (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+         fDecoderSummaryData->SetErrorDetected(kTRUE);
+         fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+         return(fDecoderSummaryData->GetErrorDetected());
+       }
+       //decode status ok
+       errorWarning = 0;
+       //set TRM global header
+       fTRMGlobalHeader = (AliTOFTRMGlobalHeader *)rawData;    
+       //reset TRM CRC
+       TRMCRC = 0x0;
+       //fill decoder summary data
+       fDecoderSummaryData->SetCurrentSlotID(fTRMGlobalHeader->GetSlotID());
+       //get TRM summary data
+       fTRMSummaryData = fDRMSummaryData->GetTRMSummaryData(fTRMGlobalHeader->GetSlotID() - TRM_FIRST_SLOT_ID);
+       //reset TRM summary data
+       fTRMSummaryData->Reset();
+       //fill TRM summary data
+       FillTRMSummaryData(fTRMGlobalHeader);
+       //set DRM slot enable mask bit
+       fDRMSummaryData->SetDecoderSlotEnableMaskBit(fTRMGlobalHeader->GetSlotID() - 2);
+       //print verbose
+       if (fVerbose)
+         AliInfo(Form("  %02x - 0x%08x \t  TRM global header \t slotID=%02d ACQ=%01d L=%01d",decoderStatus,*rawData,fTRMGlobalHeader->GetSlotID(),fTRMGlobalHeader->GetACQBits(),fTRMGlobalHeader->GetLBit()));
+       //change decode status
+       decoderStatus = decoderStatus | TRM_BIT;
+       fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+       break;
+       
+      default:
+       if (fLogErrors)
+         AliError(Form("  %02x - 0x%08x [ERROR] Not valid slotID in global header (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+       fDecoderSummaryData->SetErrorDetected(kTRUE);
+       fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+       return(fDecoderSummaryData->GetErrorDetected());
+       break;
+       
+      }
+      //end switch slotID
+      break;
+      
+    case GLOBAL_TRAILER:
+   
+   //switch slot ID
+   switch (*rawData & SLOT_ID_MASK){
+     
+     //DRM global trailer (slotID=1)
+   case 1:
+     //recover error
+     if (fDecoderSummaryData->GetRecoveringError()){
+       //change decode status
+       decoderStatus = DRM_TRAILER_STATUS;
+       fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+       fDecoderSummaryData->SetRecoveringError(kFALSE);
+       if (fVerbose)
+        AliInfo("DRM global trailer found: error probably recovered");
+     }
+     //check decode status
+     if ( decoderStatus != DRM_TRAILER_STATUS ){
+       if (fLogErrors)
+        AliError(Form("  %02x - 0x%08x [ERROR] Unexpected DRM global trailer (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+       fDecoderSummaryData->SetErrorDetected(kTRUE);
+       fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+         return(fDecoderSummaryData->GetErrorDetected());
+       }
+       //decode status ok
+       errorWarning = 0;
+       //set DRM global trailer
+       fDRMGlobalTrailer = (AliTOFDRMGlobalTrailer *)rawData;
+       //remove global trailer from DRM CRC
+       DRMCRC ^= *rawData;
+       //fill DRM summary data
+       FillDRMSummaryData(fDRMGlobalTrailer);
+       fDRMSummaryData->SetDecoderCRC(COMPUTE_DRM_CRC(DRMCRC));
+       //print verbose
+       if (fVerbose)
+         AliInfo(Form("  %02x - 0x%08x \t  DRM global trailer",decoderStatus,*rawData));
+       //change decode status
+       decoderStatus = decoderStatus & ~DRM_BIT;
+       fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+       break;
+       
+       //LTM global trailer (slotID=2)
+      case 2:
+       //try to recover error
+       if (fDecoderSummaryData->GetRecoveringError())
+         continue;
+       //check decode status
+       if ( decoderStatus != LTM_TRAILER_STATUS ){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected LTM global trailer (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+         fDecoderSummaryData->SetErrorDetected(kTRUE);
+         fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+         return(fDecoderSummaryData->GetErrorDetected());
+       }
+       //decode status ok
+       errorWarning = 0;
+       //set LTM global trailer
+       fLTMGlobalTrailer = (AliTOFLTMGlobalTrailer *)rawData;
+       //remove global trailer from LTM CRC
+       LTMCRC ^= *rawData;
+       //fill LTM summary data
+       FillLTMSummaryData(fLTMGlobalTrailer);
+       fLTMSummaryData->SetDecoderCRC(COMPUTE_LTM_CRC(LTMCRC));
+       //print verbose
+       if (fVerbose)
+         AliInfo(Form("  %02x - 0x%08x \t  LTM global trailer",decoderStatus,*rawData));
+       //change decode status
+       decoderStatus = decoderStatus & ~LTM_BIT;
+       fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+       break;
+       
+       //TRM global trailer (slotID=15)
+      case 15:
+       //try to recover error
+       if (fDecoderSummaryData->GetRecoveringError())
+         continue;
+       //check decode status
+       if ( decoderStatus != TRM_TRAILER_STATUS ){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected TRM global trailer (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+         fDecoderSummaryData->SetErrorDetected(kTRUE);
+         fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+         return(fDecoderSummaryData->GetErrorDetected());
+       }
+       //decode status ok
+       errorWarning = 0;
+       //set TRM global trailer
+       fTRMGlobalTrailer = (AliTOFTRMGlobalTrailer *)rawData;  
+       //remove global trailer from TRM CRC
+       TRMCRC ^= *rawData;
+       //fill TRM summary data
+       FillTRMSummaryData(fTRMGlobalTrailer);
+       fTRMSummaryData->SetDecoderCRC(COMPUTE_TRM_CRC(TRMCRC));
+       //print verbose
+       if (fVerbose)
+         AliInfo(Form("  %02x - 0x%08x \t  TRM global trailer \t CRC=%04d eventCounter=%04d",decoderStatus,*rawData,fTRMGlobalTrailer->GetEventCRC(),fTRMGlobalTrailer->GetEventCounter()));
+       //change decode status
+       decoderStatus = decoderStatus & ~TRM_BIT;
+       fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+       break; 
+       
+      default:
+       //try to recover error
+       if (fDecoderSummaryData->GetRecoveringError())
+         continue;
+       if (fLogErrors)
+         AliError(Form("  %02x - 0x%08x [ERROR] Not valid slotID/pattern in global trailer (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+       fDecoderSummaryData->SetErrorDetected(kTRUE);
+       fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+       //try to recover error
+       if (fRecoverError){
+         if (fVerbose)
+           AliInfo("Trying to recover the error: searching for the next header");
+         fDecoderSummaryData->SetRecoveringError(kTRUE);
+         continue;
+       }
+       return(fDecoderSummaryData->GetErrorDetected());
+       break;
+      }
+      break;
+      
+    case CHAIN_A_HEADER:
+
+      //try to recover error
+      if (fDecoderSummaryData->GetRecoveringError())
+       continue;
+      //check decode status
+      if ( decoderStatus != CHAIN_A_HEADER_STATUS  && !fDecoderSummaryData->GetRecoveringError() ){
+       if (fLogErrors)
+         AliError(Form("  %02x - 0x%08x [ERROR] Unexpected TRM chain A header (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+       fDecoderSummaryData->SetErrorDetected(kTRUE);
+       fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+       return(fDecoderSummaryData->GetErrorDetected());
+      }
+      //decode status ok
+       errorWarning = 0;
+      //set TRM chain header
+      fTRMChainHeader = (AliTOFTRMChainHeader *)rawData;
+      //fill decoder summary data
+      fDecoderSummaryData->SetCurrentChain(0);
+      //get chain summary data
+      fChainSummaryData = fTRMSummaryData->GetChainSummaryData(0);
+      //reset chain summary data
+      fChainSummaryData->Reset();
+      //fill chain summary data
+      FillChainSummaryData(fTRMChainHeader);
+      //get tdc hit buffer
+      fTDCHitBuffer = fChainSummaryData->GetTDCHitBuffer();
+      //reset tdc hit buffer
+      fTDCHitBuffer->Reset();
+      //get tdc packed hit buffer
+      fTDCPackedHitBuffer = fChainSummaryData->GetTDCPackedHitBuffer();
+      //reset tdc packed hit buffer
+      fTDCPackedHitBuffer->Reset();
+      //get tdc error buffer
+      fTDCErrorBuffer = fChainSummaryData->GetTDCErrorBuffer();
+      //reset tdc error buffer
+      fTDCErrorBuffer->Reset();
+      //print verbose
+      if (fVerbose)
+       AliInfo(Form("  %02x - 0x%08x \t  TRM chain A header \t chain=%01d bunchID=%04d",decoderStatus,*rawData,0,fTRMChainHeader->GetBunchID()));
+      //change decode status
+      decoderStatus = decoderStatus | CHAIN_A_BIT;
+      fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+      //reset spider
+      if (fSpider)
+       ResetSpider();
+      break;
+      
+    case CHAIN_A_TRAILER:
+
+      //try to recover error
+      if (fDecoderSummaryData->GetRecoveringError())
+       continue;
+      //check decode status
+      if ( decoderStatus != CHAIN_A_TRAILER_STATUS  && !fDecoderSummaryData->GetRecoveringError()){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected TRM chain A trailer (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+       fDecoderSummaryData->SetErrorDetected(kTRUE);
+       fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+       return(fDecoderSummaryData->GetErrorDetected());
+      }
+      //decode status ok
+       errorWarning = 0;
+      //set TRM chain trailer
+      fTRMChainTrailer = (AliTOFTRMChainTrailer *)rawData;
+      //fill chain summary data
+      FillChainSummaryData(fTRMChainTrailer);
+      //print verbose
+      if (fVerbose)
+       AliInfo(Form("  %02x - 0x%08x \t  TRM chain A trailer",decoderStatus,*rawData));
+      //change decode status
+      decoderStatus = decoderStatus & ~CHAIN_A_BIT;
+      fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+      break;
+      
+    case CHAIN_B_HEADER:
+
+      //try to recover error
+      if (fDecoderSummaryData->GetRecoveringError())
+       continue;
+      //check decode status
+      if ( decoderStatus != CHAIN_B_HEADER_STATUS  && !fDecoderSummaryData->GetRecoveringError()){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected TRM chain B header (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+       fDecoderSummaryData->SetErrorDetected(kTRUE);
+       fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+       return(fDecoderSummaryData->GetErrorDetected());
+      }
+      //decode status ok
+       errorWarning = 0;
+      //set TRM chain header
+      fTRMChainHeader = (AliTOFTRMChainHeader *)rawData;
+      //fill decoder summary data
+      fDecoderSummaryData->SetCurrentChain(1);
+      //get chain summary data
+      fChainSummaryData = fTRMSummaryData->GetChainSummaryData(1);
+      //reset chain summary data
+      fChainSummaryData->Reset();
+      //fill chain summary data
+      FillChainSummaryData(fTRMChainHeader);
+      //get tdc hit buffer
+      fTDCHitBuffer = fChainSummaryData->GetTDCHitBuffer();
+      //reset tdc hit buffer
+      fTDCHitBuffer->Reset();
+      //get tdc packed hit buffer
+      fTDCPackedHitBuffer = fChainSummaryData->GetTDCPackedHitBuffer();
+      //reset tdc packed hit buffer
+      fTDCPackedHitBuffer->Reset();
+      //get tdc error buffer
+      fTDCErrorBuffer = fChainSummaryData->GetTDCErrorBuffer();
+      //reset tdc error buffer
+      fTDCErrorBuffer->Reset();
+      //print verbose
+      if (fVerbose)
+       AliInfo(Form("  %02x - 0x%08x \t  TRM chain B header \t chain=%01d bunchID=%04d",decoderStatus,*rawData,1,fTRMChainHeader->GetBunchID()));
+      //change decode status
+      decoderStatus = decoderStatus | CHAIN_B_BIT;
+      fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+      //reset spider
+      if (fSpider)
+       ResetSpider();
+      break;
+      
+    case CHAIN_B_TRAILER:
+
+      //try to recover error
+      if (fDecoderSummaryData->GetRecoveringError())
+       continue;
+      //check decode status
+      if ( decoderStatus != CHAIN_B_TRAILER_STATUS  && !fDecoderSummaryData->GetRecoveringError()){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected TRM chain B trailer (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+       fDecoderSummaryData->SetErrorDetected(kTRUE);
+       fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+       return(fDecoderSummaryData->GetErrorDetected());
+      }
+      //decode status ok
+       errorWarning = 0;
+      //set TRM chain trailer
+      fTRMChainTrailer = (AliTOFTRMChainTrailer *)rawData;
+      //fill chain summary data
+      FillChainSummaryData(fTRMChainTrailer);
+      //print verbose
+      if (fVerbose)
+       AliInfo(Form("  %02x - 0x%08x \t  TRM chain B trailer",decoderStatus,*rawData));
+      //change decode status
+      decoderStatus = decoderStatus & ~CHAIN_B_BIT;
+      fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+      break;
+      
+    case ERROR:
+
+      //try to recover error
+      if (fDecoderSummaryData->GetRecoveringError())
+       continue;
+      //decode TRM TDC error
+      fTRMTDCError = (AliTOFTRMTDCError *)rawData;
+      //check diagnostic word
+      if (fTRMTDCError->GetTDCID() == 15) {
+       if (fVerbose)
+         AliInfo(Form("  %02x - 0x%08x \t  Diagnostic error word",decoderStatus,*rawData));
+       break;
+      }
+      //set error data
+      error.SetErrorFlags(fTRMTDCError->GetErrorFlags());
+      error.SetTDCID(fTRMTDCError->GetTDCID());
+      //fill TDC error buffer
+      fTDCErrorBuffer->Add(error);
+      if (fVerbose)
+       AliInfo(Form("  %02x - 0x%08x \t  TDC error",decoderStatus,*rawData));
+      break;
+      
+    case FILLER:
+
+      //try to recover error
+      if (fDecoderSummaryData->GetRecoveringError())
+       continue;
+      if (fVerbose)
+       AliInfo(Form("  %02x - 0x%08x \t  Filler",decoderStatus,*rawData));
+      break;
+      
+    default:
+
+      //try to recover error
+      if (fDecoderSummaryData->GetRecoveringError())
+       continue;
+      //check decode status
+      if ( decoderStatus != CHAIN_A_TDC_HIT_STATUS &&
+          decoderStatus != CHAIN_B_TDC_HIT_STATUS  && !fDecoderSummaryData->GetRecoveringError()){
+         if (fLogErrors)
+           AliError(Form("  %02x - 0x%08x [ERROR] Unexpected or unknown word (curslot=%d)",decoderStatus,*rawData,fDecoderSummaryData->GetCurrentSlotID()));
+       fDecoderSummaryData->SetErrorDetected(kTRUE);
+       fDecoderSummaryData->SetErrorSlotID(fDecoderSummaryData->GetCurrentSlotID());
+         errorWarning++;
+         //try to recover error
+         if (fRecoverError){
+           if (errorWarning > fRecoverErrorThr) {
+             if (fVerbose)
+               AliInfo("Trying to recover the error: searching for the next header");
+             fDecoderSummaryData->SetRecoveringError(kTRUE);
+             continue;
+           }
+           else {
+             if (fVerbose)
+               AliInfo("Do not try to recover error yet, go on with decoding process");
+             continue;
+           }
+         }
+       return(fDecoderSummaryData->GetErrorDetected());
+      }
+      //decode status ok
+       errorWarning = 0;
+      
+      //switch TRM ACQ
+      switch (fTRMSummaryData->GetACQBits()){
+       
+      case PACKING_ENABLED_ACQ:
+       //decode TDC packed/unpacked hit
+       fTDCPackedHit = (AliTOFTDCPackedHit *)rawData;
+       fTDCUnpackedHit = (AliTOFTDCUnpackedHit *)rawData;
+       //set hit data
+       hit.SetChan(fTDCUnpackedHit->GetChan());
+       hit.SetTDCID(fTDCUnpackedHit->GetTDCID());
+       hit.SetEBit(fTDCUnpackedHit->GetEBit());
+       hit.SetPSBits(fTDCUnpackedHit->GetPSBits());
+       //switch PS bits
+       switch (hit.GetPSBits()){
+         //packed hit or overflow hit
+       case PACKED_HIT_PS: case TOT_OVF_HIT_PS:
+         hit.SetHitTime(fTDCPackedHit->GetHitTime());
+         hit.SetTOTWidth(fTDCPackedHit->GetTOTWidth());
+         //add hit
+         fTDCHitBuffer->Add(hit);
+         fTDCPackedHitBuffer->Add(hit);
+         break; 
+         //orphane leading
+       case LEADING_HIT_PS:
+         hit.SetHitTime(fTDCUnpackedHit->GetHitTime());
+         hit.SetTOTWidth(0);
+         //add hit
+         fTDCHitBuffer->Add(hit);
+         fTDCPackedHitBuffer->Add(hit);
+         break;
+         //orphane trailing
+       case TRAILING_HIT_PS:
+         hit.SetHitTime(fTDCUnpackedHit->GetHitTime());
+         hit.SetTOTWidth(0);
+         //add hit
+         fTDCHitBuffer->Add(hit);
+         break;
+       }
+       //end switch PS bits
+       //print verbose
+       if (fVerbose)
+         switch (hit.GetPSBits()){
+         case PACKED_HIT_PS:
+           AliInfo(Form("  %02x - 0x%08x \t  TDC hit [packed] \t PS=%1d TDC=%1d chan=%1d TOT=%3d time=%4d (%7.1f ns)",decoderStatus,*rawData,hit.GetPSBits(),hit.GetTDCID(),hit.GetChan(),hit.GetTOTWidth(),hit.GetHitTime(),hit.GetHitTime()*TIME_BIN_WIDTH));
+           break;
+         case LEADING_HIT_PS:
+           AliInfo(Form("  %02x - 0x%08x \t  TDC hit [orp.lead] \t PS=%1d TDC=%1d chan=%1d time=%4d (%7.1f ns)",decoderStatus,*rawData,hit.GetPSBits(),hit.GetTDCID(),hit.GetChan(),hit.GetHitTime(),hit.GetHitTime()*TIME_BIN_WIDTH));
+           break;
+         case TRAILING_HIT_PS:
+           AliInfo(Form("  %02x - 0x%08x \t  TDC hit [orp.trai] \t PS=%1d TDC=%1d chan=%1d time=%4d (%7.1f ns)",decoderStatus,*rawData,hit.GetPSBits(),hit.GetTDCID(),hit.GetChan(),hit.GetHitTime(),hit.GetHitTime()*TIME_BIN_WIDTH));
+           break;
+         case TOT_OVF_HIT_PS:
+           AliInfo(Form("  %02x - 0x%08x \t  TDC hit [TOT ovfl] \t PS=%1d TDC=%1d chan=%1d TOT=%3d time=%4d (%7.1f ns)",decoderStatus,*rawData,hit.GetPSBits(),hit.GetTDCID(),hit.GetChan(),hit.GetTOTWidth(),hit.GetHitTime(),hit.GetHitTime()*TIME_BIN_WIDTH));
+           break;
+         }
+       break;
+       
+      case LEADING_ONLY_ACQ: case TRAILING_ONLY_ACQ:
+       //decode TDC unpacked hit
+       fTDCUnpackedHit = (AliTOFTDCUnpackedHit *)rawData;
+       //set hit data
+       hit.SetChan(fTDCUnpackedHit->GetChan());
+       hit.SetTDCID(fTDCUnpackedHit->GetTDCID());
+       hit.SetEBit(fTDCUnpackedHit->GetEBit());
+       hit.SetPSBits(fTDCUnpackedHit->GetPSBits());
+       hit.SetHitTime(fTDCUnpackedHit->GetHitTime());
+       hit.SetTOTWidth(0);
+       //add hit
+       fTDCHitBuffer->Add(hit);
+       //print verbose
+       if (fVerbose)
+         switch (hit.GetPSBits()){
+         case LEADING_HIT_PS:
+           AliInfo(Form("  %02x - 0x%08x \t  TDC hit [leading] \t PS=%1d TDC=%1d chan=%1d time=%4d (%7.1f ns)",decoderStatus,*rawData,hit.GetPSBits(),hit.GetTDCID(),hit.GetChan(),hit.GetHitTime(),hit.GetHitTime()*TIME_BIN_WIDTH));
+           break;
+         case TRAILING_HIT_PS:
+           AliInfo(Form("  %02x - 0x%08x \t  TDC hit [trailing] \t PS=%1d TDC=%1d chan=%1d time=%4d (%7.1f ns)",decoderStatus,*rawData,hit.GetPSBits(),hit.GetTDCID(),hit.GetChan(),hit.GetHitTime(),hit.GetHitTime()*TIME_BIN_WIDTH));
+         }
+       break;
+       
+      case PACKING_DISABLED_ACQ:
+       //decode TDC unpacked hit
+       fTDCUnpackedHit = (AliTOFTDCUnpackedHit *)rawData;
+       //set hit data
+       hit.SetChan(fTDCUnpackedHit->GetChan());
+       hit.SetTDCID(fTDCUnpackedHit->GetTDCID());
+       hit.SetEBit(fTDCUnpackedHit->GetEBit());
+       hit.SetPSBits(fTDCUnpackedHit->GetPSBits());
+       hit.SetHitTime(fTDCUnpackedHit->GetHitTime());
+       hit.SetTOTWidth(0);
+       //add hit
+       fTDCHitBuffer->Add(hit);
+       //print verbose
+       if (fVerbose)
+         switch (hit.GetPSBits()){
+         case LEADING_HIT_PS:
+           AliInfo(Form("  %02x - 0x%08x \t  TDC hit [leading] \t PS=%1d TDC=%1d chan=%1d time=%4d (%7.1f ns)",decoderStatus,*rawData,hit.GetPSBits(),hit.GetTDCID(),hit.GetChan(),hit.GetHitTime(),hit.GetHitTime()*TIME_BIN_WIDTH));
+           break;
+         case TRAILING_HIT_PS:
+           AliInfo(Form("  %02x - 0x%08x \t  TDC hit [trailing] \t PS=%1d TDC=%1d chan=%1d time=%4d (%7.1f ns)",decoderStatus,*rawData,hit.GetPSBits(),hit.GetTDCID(),hit.GetChan(),hit.GetHitTime(),hit.GetHitTime()*TIME_BIN_WIDTH));
+         } //print verbose
+       //spider
+       if (fSpider)
+         Spider(hit);
+
+       break;
+      }
+      //end switch TRM ACQ
+
+      break;
+      
+    }
+    
+  }
+  //end equipment data loop
+  
+  if (fVerbose)
+    AliInfo("End of data loop");
+
+  //reset spider
+  if (fSpider)
+    ResetSpider();
+  
+  /*** V2718 patch ***/
+  if (fV2718Patch){
+    decoderStatus = decoderStatus & ~DRM_BIT;
+    fDecoderSummaryData->SetDecoderStatus(decoderStatus);
+    fDRMSummaryData->SetTrailer(kTRUE);
+    fDRMSummaryData->SetSlotEnableMask(fDRMSummaryData->GetDecoderSlotEnableMask());
+    fDRMSummaryData->SetCBit(1);
+    fDRMSummaryData->SetLocalEventCounter(fTRMSummaryData->GetEventCounter());
+    if (fVerbose)
+      AliInfo("DRM was not present: - V2718 end patch decoding -");
+  }
+  /*** V2718 patch ***/
+  if (fVerbose)
+    AliInfo("Decoder is exiting succesfully.");
+
+  return(fDecoderSummaryData->GetErrorDetected());  
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillDRMSummaryData(AliTOFDRMGlobalHeader *DRMGlobalHeader)
+{
+  fDRMSummaryData->SetHeader(kTRUE);
+  fDRMSummaryData->SetSlotID(DRMGlobalHeader->GetSlotID());
+  fDRMSummaryData->SetEventWords(DRMGlobalHeader->GetEventWords());
+  fDRMSummaryData->SetDRMID(DRMGlobalHeader->GetDRMID());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillDRMSummaryData(AliTOFDRMGlobalTrailer *DRMGlobalTrailer)
+{
+  fDRMSummaryData->SetTrailer(kTRUE);
+  fDRMSummaryData->SetLocalEventCounter(DRMGlobalTrailer->GetLocalEventCounter());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillDRMSummaryData(AliTOFDRMStatusHeader1 *DRMStatusHeader1)
+{
+  fDRMSummaryData->SetPartecipatingSlotID(DRMStatusHeader1->GetPartecipatingSlotID());
+  fDRMSummaryData->SetCBit(DRMStatusHeader1->GetCBit());
+  fDRMSummaryData->SetVersID(DRMStatusHeader1->GetVersID());
+  fDRMSummaryData->SetDRMhSize(DRMStatusHeader1->GetDRMhSize());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillDRMSummaryData(AliTOFDRMStatusHeader2 *DRMStatusHeader2)
+{
+  fDRMSummaryData->SetSlotEnableMask(DRMStatusHeader2->GetSlotEnableMask());
+  fDRMSummaryData->SetFaultID(DRMStatusHeader2->GetFaultID());
+  fDRMSummaryData->SetRTOBit(DRMStatusHeader2->GetRTOBit());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillDRMSummaryData(AliTOFDRMStatusHeader3 *DRMStatusHeader3)
+{
+  fDRMSummaryData->SetL0BCID(DRMStatusHeader3->GetL0BCID());
+  fDRMSummaryData->SetRunTimeInfo(DRMStatusHeader3->GetRunTimeInfo());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillDRMSummaryData(AliTOFDRMStatusHeader4 *DRMStatusHeader4)
+{
+  fDRMSummaryData->SetTemperature(DRMStatusHeader4->GetTemperature());
+  fDRMSummaryData->SetACKBit(DRMStatusHeader4->GetACKBit());
+  fDRMSummaryData->SetSensAD(DRMStatusHeader4->GetSensAD());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillDRMSummaryData(AliTOFDRMEventCRC *DRMEventCRC)
+{
+  fDRMSummaryData->SetEventCRC(DRMEventCRC->GetEventCRC());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillLTMSummaryData(AliTOFLTMGlobalHeader *LTMGlobalHeader)
+{
+  fLTMSummaryData->SetHeader(kTRUE);
+  fLTMSummaryData->SetSlotID(LTMGlobalHeader->GetSlotID());
+  fLTMSummaryData->SetEventWords(LTMGlobalHeader->GetEventWords());
+  fLTMSummaryData->SetCBit(LTMGlobalHeader->GetCBit());
+  fLTMSummaryData->SetFault(LTMGlobalHeader->GetFault());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillLTMSummaryData(AliTOFLTMGlobalTrailer *LTMGlobalTrailer)
+{
+  fLTMSummaryData->SetTrailer(kTRUE);
+  fLTMSummaryData->SetEventCRC(LTMGlobalTrailer->GetEventCRC());
+  fLTMSummaryData->SetEventNumber(LTMGlobalTrailer->GetEventNumber());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillLTMSummaryData(AliTOFLTMPDLData *LTMPDLData, Int_t PDLWord)
+{
+  fLTMSummaryData->SetPDL(4 * PDLWord + 0, LTMPDLData->GetPDLValue1());
+  fLTMSummaryData->SetPDL(4 * PDLWord + 1, LTMPDLData->GetPDLValue2());
+  fLTMSummaryData->SetPDL(4 * PDLWord + 2, LTMPDLData->GetPDLValue3());
+  fLTMSummaryData->SetPDL(4 * PDLWord + 3, LTMPDLData->GetPDLValue4());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillLTMSummaryData(AliTOFLTMADCData *LTMADCData, Int_t ADCWord)
+{
+  fLTMSummaryData->SetADC(3 * ADCWord + 0, LTMADCData->GetADCValue1());
+  fLTMSummaryData->SetADC(3 * ADCWord + 1, LTMADCData->GetADCValue2());
+  fLTMSummaryData->SetADC(3 * ADCWord + 2, LTMADCData->GetADCValue3());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillLTMSummaryData(AliTOFLTMORData *LTMORData, Int_t ORWord)
+{
+  fLTMSummaryData->SetOR(3 * ORWord + 0, LTMORData->GetORValue1());
+  fLTMSummaryData->SetOR(3 * ORWord + 1, LTMORData->GetORValue2());
+  fLTMSummaryData->SetOR(3 * ORWord + 2, LTMORData->GetORValue3());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillTRMSummaryData(AliTOFTRMGlobalHeader *TRMGlobalHeader)
+{
+  fTRMSummaryData->SetHeader(kTRUE);
+  fTRMSummaryData->SetSlotID(TRMGlobalHeader->GetSlotID());
+  fTRMSummaryData->SetEventWords(TRMGlobalHeader->GetEventWords());
+  fTRMSummaryData->SetACQBits(TRMGlobalHeader->GetACQBits());
+  fTRMSummaryData->SetLBit(TRMGlobalHeader->GetLBit());
+  fTRMSummaryData->SetEBit(TRMGlobalHeader->GetEBit());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillTRMSummaryData(AliTOFTRMGlobalTrailer *TRMGlobalTrailer)
+{
+  fTRMSummaryData->SetTrailer(kTRUE);
+  fTRMSummaryData->SetEventCRC(TRMGlobalTrailer->GetEventCRC());
+  fTRMSummaryData->SetEventCounter(TRMGlobalTrailer->GetEventCounter());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillChainSummaryData(AliTOFTRMChainHeader *TRMChainHeader)
+{
+  fChainSummaryData->SetHeader(kTRUE);
+  switch (*(UInt_t *)TRMChainHeader & WORD_TYPE_MASK){
+  case CHAIN_A_HEADER:
+    fChainSummaryData->SetChain(0);
+    break;
+  case CHAIN_B_HEADER:
+    fChainSummaryData->SetChain(1);
+    break;
+  }
+  fChainSummaryData->SetBunchID(TRMChainHeader->GetBunchID());
+  fChainSummaryData->SetPB24Temp(TRMChainHeader->GetPB24Temp());
+  fChainSummaryData->SetPB24ID(TRMChainHeader->GetPB24ID());
+  fChainSummaryData->SetTSBit(TRMChainHeader->GetTSBit());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::FillChainSummaryData(AliTOFTRMChainTrailer *TRMChainTrailer)
+{
+  fChainSummaryData->SetTrailer(kTRUE);
+  fChainSummaryData->SetStatus(TRMChainTrailer->GetStatus());
+  fChainSummaryData->SetEventCounter(TRMChainTrailer->GetEventCounter());
+}
+
+//_________________________________________________________________
+
+void
+AliTOFDecoderV2::ResetSpider()
+{                    
+  //reset condition
+  if (fVerbose)
+    AliInfo("Reset signal received, empty and reset buffer");
+  for (Int_t iChan = 0; iChan < N_CHANNEL; iChan++){
+    if (fSpiderBufferFull[iChan]) {
+      if (fVerbose)
+       AliInfo(Form("Spider buffer is full for channel %d", iChan));
+      fSpiderTDCPackedHitBuffer->Add(fSpiderBuffer[iChan]);
+    }
+    fSpiderBufferFull[iChan] = kFALSE;
+  }
+  fSpiderTDCID = -1;
+  return;
+}
+
+void
+AliTOFDecoderV2::Spider(AliTOFTDCHit &hit){
+  
+  if (fVerbose)
+    AliInfo("Hit has been received from decode main routine");
+
+  //check new TDC
+  if (fSpiderTDCID != hit.GetTDCID()){
+    if (fVerbose)
+      AliInfo("Data coming from a new TDC, empty and reset buffer");
+    for (Int_t iChan = 0; iChan < N_CHANNEL; iChan++){
+      if (fSpiderBufferFull[iChan])
+       fSpiderTDCPackedHitBuffer->Add(fSpiderBuffer[iChan]);
+      fSpiderBufferFull[iChan] = kFALSE;
+    }
+    fSpiderTDCPackedHitBuffer = fTDCPackedHitBuffer;
+    fSpiderTDCID = hit.GetTDCID();
+  }          
+
+  //switch PS bits
+  switch(hit.GetPSBits()){
+    //leading hit
+  case LEADING_HIT_PS:
+    //check buffer status
+    if (fSpiderBufferFull[hit.GetChan()]){ //buffer full
+      fSpiderTDCPackedHitBuffer->Add(fSpiderBuffer[hit.GetChan()]); //buffered hit is orphane
+      fSpiderBuffer[hit.GetChan()] = hit; //current hit into buffer
+      if (fVerbose)
+       AliInfo("Leading hit and buffer full, buffered hit is a orphane leading hit");
+    } 
+    else{ //buffer empty
+      fSpiderBuffer[hit.GetChan()] = hit; //current hit into buffer
+      fSpiderBufferFull[hit.GetChan()] = kTRUE; //set buffer full
+    }
+    break;
+    //trailing hit
+  case TRAILING_HIT_PS:
+    //check buffer status
+    if (fSpiderBufferFull[hit.GetChan()]){ //buffer full
+      fSpiderTDCPackedHitBuffer->Add(fSpiderBuffer[hit.GetChan()] << hit); //pack hits (Leading << Trailing) and save
+      fSpiderBufferFull[hit.GetChan()] = kFALSE; //unset buffer full
+      if (fVerbose)
+       AliInfo("Trailing hit and buffer full, pack leading and trailing hit");
+    } 
+    else{ //buffer empty
+      ; //do nothing
+      if (fVerbose)
+       AliInfo("Trailing hit and buffer empty, trow trailing hit away");
+    }
+    break;
+  } //switch PS bits
+
+}
+
+//_________________________________________________________________
+
+Bool_t 
+AliTOFDecoderV2::DecodeNext()
+{
+  /* decode next */
+
+  if (!fRawReader || !fRawReader->ReadHeader())
+    return kFALSE;
+
+  const Int_t size = fRawReader->GetDataSize(); 
+  UChar_t *data = new UChar_t[size];
+  if (fRawReader->ReadNext(data, size) != 1) {
+    delete [] data;
+    return kFALSE;
+  }
+      
+  /* decode equipment data */
+  SetEquipmentID(fRawReader->GetEquipmentId());
+  Decode((UInt_t *)data, size / 4);
+
+  delete [] data;
+  return kTRUE;
+}