]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFRawStream.cxx
Moved signal shape routines from AliEMCAL to separate class AliEMCALRawUtils to strea...
[u/mrichter/AliRoot.git] / TOF / AliTOFRawStream.cxx
index 3efeb6e5b4497e068f11ef903cc40497965b4f1f..7fc828efaa76979541ca862557c16b8d6bb4caf7 100644 (file)
 
 /*
 $Log$
+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)
 
@@ -55,11 +67,17 @@ 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"
 
 
@@ -248,6 +266,13 @@ TRM DATA FORMAT
 #define TRM_PS_BITS_MASK 0x60000000
 #define TRM_PS_BITS_POSITION 29
 
+#define TRM_FIRST_SLOT_ID 3
+
+//define hptdc time bin width
+#define TIME_BIN_WIDTH 24.4e-3 //ns
+
+//define hptdc tot bin width
+#define TOT_BIN_WIDTH 48.4e-3 //ns
 
 //TRM errors
 
@@ -362,184 +387,134 @@ ClassImp(AliTOFRawStream)
 
 //_____________________________________________________________________________
 AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
-  fRawReader(0x0),
+  fRawReader(rawReader),
+  fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
   fDDL(-1),
   fTRM(-1),
-  fTDC(-1),
   fTRMchain(-1),
+  fTDC(-1),
   fTDCchannel(-1),
-  fTof(-1),
+  fTime(-1),
   fToT(-1),
+  fLeadingEdge(-1),
+  fTrailingEdge(-1),
   fErrorFlag(-1),
-
   fSector(-1),
   fPlate(-1),
   fStrip(-1),
   fPadX(-1),
   fPadZ(-1),
   fTOFGeometry(new AliTOFGeometryV5()),
+  fPackedDigits(0),
   fWordType(-1),
   fSlotID(-1),
   fACQ(-1),
   fPSbit(-1),
-  fTime(-1),
   fTDCerrorFlag(-1),
   fInsideDRM(kFALSE),
   fInsideTRM(kFALSE),
   fInsideLTM(kFALSE),
   fInsideTRMchain0(kFALSE),
-  fInsideTRMchain1(kFALSE),
-  fLeadingOrphane(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;
-  fTOFGeometry = new AliTOFGeometryV5();
-  */
+  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():
   fRawReader(0x0),
+  fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
   fDDL(-1),
   fTRM(-1),
-  fTDC(-1),
   fTRMchain(-1),
+  fTDC(-1),
   fTDCchannel(-1),
-  fTof(-1),
+  fTime(-1),
   fToT(-1),
+  fLeadingEdge(-1),
+  fTrailingEdge(-1),
   fErrorFlag(-1),
-
   fSector(-1),
   fPlate(-1),
   fStrip(-1),
   fPadX(-1),
   fPadZ(-1),
   fTOFGeometry(new AliTOFGeometryV5()),
+  fPackedDigits(0),
   fWordType(-1),
   fSlotID(-1),
   fACQ(-1),
   fPSbit(-1),
-  fTime(-1),
   fTDCerrorFlag(-1),
   fInsideDRM(kFALSE),
   fInsideTRM(kFALSE),
   fInsideLTM(kFALSE),
   fInsideTRMchain0(kFALSE),
-  fInsideTRMchain1(kFALSE),
-  fLeadingOrphane(kFALSE)
+  fInsideTRMchain1(kFALSE)
 {
   //
   // default ctr
   //
-  /*
-  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;
-  */
+
 }
 
 //_____________________________________________________________________________
 AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
   TObject(stream),
   fRawReader(0x0),
+  fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
   fDDL(-1),
   fTRM(-1),
-  fTDC(-1),
   fTRMchain(-1),
+  fTDC(-1),
   fTDCchannel(-1),
-  fTof(-1),
+  fTime(-1),
   fToT(-1),
+  fLeadingEdge(-1),
+  fTrailingEdge(-1),
   fErrorFlag(-1),
-
   fSector(-1),
   fPlate(-1),
   fStrip(-1),
   fPadX(-1),
   fPadZ(-1),
   fTOFGeometry(new AliTOFGeometryV5()),
+  fPackedDigits(0),
   fWordType(-1),
   fSlotID(-1),
   fACQ(-1),
   fPSbit(-1),
-  fTime(-1),
   fTDCerrorFlag(-1),
   fInsideDRM(kFALSE),
   fInsideTRM(kFALSE),
   fInsideLTM(kFALSE),
   fInsideTRMchain0(kFALSE),
-  fInsideTRMchain1(kFALSE),
-  fLeadingOrphane(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;
@@ -550,18 +525,18 @@ AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
 
   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;
 
 }
 
@@ -573,13 +548,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;
@@ -590,18 +570,18 @@ AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
 
   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;
 
   return *this;
 
@@ -612,11 +592,120 @@ AliTOFRawStream::~AliTOFRawStream()
 {
 // destructor
 
-  fTOFGeometry = 0;
+  fPackedDigits = 0;
+
+  delete fTOFGeometry;
+
+  //delete fTOFrawData;
 
 }
 
 
+//_____________________________________________________________________________
+
+void AliTOFRawStream::LoadRawData(Int_t indexDDL)
+{
+
+  /*
+    for (Int_t indexDDL = 0;
+    indexDDL < AliDAQ::NumberOfDdls("TOF");
+    indexDDL++) {
+  */
+
+  fTOFrawData->Clear();
+  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;
+
+  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);
+
+      slot[0] = fTRM;
+      slot[1] = fTRMchain;
+      slot[2] = fTDC;
+      slot[3] = fTDCchannel;
+
+      if (rawMap->TestHit(slot) != kEmpty) {
+
+       AliTOFrawData *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) )
+
+/*     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);
+
+       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);
+
+      } // else if (rawMap->TestHit(slot) == kEmpty)
+
+    } // if (signal)
+
+  } // 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
+
+}
+
 //_____________________________________________________________________________
 Bool_t AliTOFRawStream::Next()
 {
@@ -631,18 +720,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={0,0,0,0,0,0,0};
-
   fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
 
   switch (fWordType) { // switch word type
@@ -708,23 +797,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
@@ -748,7 +837,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;
 
@@ -800,84 +889,50 @@ 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;
 
 }
@@ -890,7 +945,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]
   //
@@ -912,7 +967,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]
   //
@@ -934,7 +989,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]
   //
@@ -957,7 +1012,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]
   //
@@ -984,7 +1039,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]
   //
@@ -1299,3 +1354,55 @@ 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;
+}