]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HMPID/AliHMPIDRawStream.cxx
Minors
[u/mrichter/AliRoot.git] / HMPID / AliHMPIDRawStream.cxx
index 60718aaaa6c9c03aed62f50fef1b502b0104cb6e..ec7bfff29a7f9ec4d125aac9c2ce4d71ecf173c1 100644 (file)
@@ -24,7 +24,7 @@
 #include "AliHMPIDRawStream.h"
 #include "AliRawReader.h"
 #include "AliLog.h"
-#include "AliDAQ.h"
+
 
 ClassImp(AliHMPIDRawStream)
 
@@ -41,7 +41,16 @@ AliHMPIDRawStream::AliHMPIDRawStream(AliRawReader* rawReader) :
   fRawReader->Reset();
   fRawReader->Select("HMPID");
 }
-
+//-----------------------------------------------------------------------------
+AliHMPIDRawStream::AliHMPIDRawStream() :
+  fDDLNumber(-1),
+  fRawReader(0x0),
+  fData(NULL),
+  fPosition(-1)
+{
+  // Constructor
+  Init();
+}
 //_____________________________________________________________________________
 AliHMPIDRawStream::~AliHMPIDRawStream()
 {
@@ -53,124 +62,233 @@ void AliHMPIDRawStream::Init()
 {
   // Initalize the container
   // with the pad charges
-  for(Int_t i = 0; i < kNRows; i++)
-    for(Int_t j = 0; j < kNDILOGICAdd; j++)
-      for(Int_t k = 0; k < kNPadAdd; k++)
-       fCharge[i][j][k] = -1;
-}
-
+  for(Int_t h = 0; h < kNDDL; h++) {  
+    for(Int_t i = 0; i < kNRows; i++){
+      for(Int_t j = 0; j < kNDILOGICAdd; j++){
+       for(Int_t k = 0; k < kNPadAdd; k++){
+         fCharge[h][i][j][k] = -1;
+         fPad[h][i][j][k]=-1;
+       }
+      }
+    }
+  }
+  fZeroSup=kTRUE;
+}//Init()
 //_____________________________________________________________________________
 void AliHMPIDRawStream::Reset()
 {
   // reset raw stream params
-
   // Reinitalize the containers
   Init();
-
   fDDLNumber = -1;
   fPosition = -1;
   fData = NULL;
-
   if (fRawReader) fRawReader->Reset();
 }
-
 //_____________________________________________________________________________
 Bool_t AliHMPIDRawStream::Next()
 {
-  // read next DDL raw data from the VZERO raw data stream
+  // read next DDL raw data from the HMPID raw data stream
   // return kFALSE in case of error or no data left
-
+  AliDebug(1,"Start.");
   do {
     if (!fRawReader->ReadNextData(fData)) return kFALSE;
   } while (fRawReader->GetDataSize() == 0);
-
-  if (fRawReader->GetDataSize() != 47148) {
-    fRawReader->AddFatalErrorLog(kRawDataSizeErr,Form("size %d != 47148",fRawReader->GetDataSize()));
-    AliWarning(Form("Wrong HMPID raw data size: %d, expected 47148 bytes!",fRawReader->GetDataSize()));
-    return kTRUE;
+  
+  if ( fRawReader->GetDataSize() > 47148) {
+    AliWarning(Form("Raw data event size is larger (%d) than possible for HMPID!!!! ",fRawReader->GetDataSize()));
   }
-  fDDLNumber = fRawReader->GetDDLID();
-  fPosition = 0;
-
-  Init();
-
-  // Look over rows
-  for(Int_t iRow = 1; iRow < kNRows; iRow++) {
-    // Read row marker
-    UInt_t rowMarker = GetNextWord() & 0x1ffffff;
-    if (rowMarker != 0x1ea32a8) {
-      fRawReader->AddMajorErrorLog(kRowMarkerErr);
-      AliWarning(Form("Wrong row marker %x for row %d, expected 0xx1ea32a8!",rowMarker,iRow));
-      return kTRUE;
-    }
-    UInt_t dilogic = 0, row = 0;
-    for(Int_t iDILOGIC = 1; iDILOGIC < kNDILOGICAdd; iDILOGIC++) {
-      // Read pad charges
-      for(Int_t iPad = 0; iPad < kNPadAdd; iPad++) {
-       UInt_t data = GetNextWord();
-       row = (data >> 22) & 0x1f;
-       if (row < 1 || row >= kNRows) {
-         fRawReader->AddMajorErrorLog(kWrongRowErr,Form("row %d",row));
-         AliWarning(Form("Wrong row index: %d, expected (1 -> %d)!",row,kNRows));
-         row = iRow;
+  
+  else if (fRawReader->GetDataSize() == 47148) {
+    fDDLNumber = fRawReader->GetDDLID();
+    fPosition = 0;
+    
+    Init();
+    
+    // Look over rows
+    for(Int_t iRow = 1; iRow <= kNRows; iRow++) {
+      // Read row marker
+      UInt_t rowMarker = GetNextWord() & 0x1ffffff;
+      if (rowMarker != 0x1ea32a8) {
+       fRawReader->AddMajorErrorLog(kRowMarkerErr);
+       AliWarning(Form("Wrong row marker %x for row %d, expected 0x1ea32a8!",rowMarker,iRow));
+       return kTRUE;
+      }//check for row marker
+      UInt_t dilogic = 0, row = 0;
+      for(Int_t iDILOGIC = 1; iDILOGIC <= kNDILOGICAdd; iDILOGIC++) {
+       // Read pad charges
+       for(Int_t iPad = 0; iPad < kNPadAdd; iPad++) {
+         UInt_t data = GetNextWord();
+         row = (data >> 22) & 0x1f;                                                      //row information in raw word is between bits: 22...26
+         if (row < 1 || row > kNRows) {
+           fRawReader->AddMajorErrorLog(kWrongRowErr,Form("row %d",row));
+           AliWarning(Form("Wrong row index: %d, expected (1 -> %d)!",row,kNRows));
+           row = iRow;
+         }
+         dilogic = (data >> 18) & 0xf;                                                   //dilogic info in raw word is between bits: 18...21
+         if (dilogic < 1 || dilogic > kNDILOGICAdd) {
+           fRawReader->AddMajorErrorLog(kWrongDilogicErr,Form("dil %d",dilogic));
+           AliWarning(Form("Wrong DILOGIC index: %d, expected (1 -> %d)!",dilogic,kNDILOGICAdd));
+           dilogic = iDILOGIC;
+         }
+         UInt_t pad = (data >> 12) & 0x3f;                                               //pad info in raw word is between bits: 12...17
+         if (pad >= kNPadAdd) {
+           fRawReader->AddMajorErrorLog(kWrongPadErr,Form("pad %d",pad));
+           AliWarning(Form("Wrong pad index: %d, expected (0 -> %d)!",pad,kNPadAdd));
+           pad = iPad;
+         }
+         fCharge[fDDLNumber][row][dilogic][pad] = data & 0xfff;
        }
-       dilogic = (data >> 18) & 0xf;
-       if (dilogic < 1 || dilogic >= kNDILOGICAdd) {
-         fRawReader->AddMajorErrorLog(kWrongDilogicErr,Form("dil %d",dilogic));
-         AliWarning(Form("Wrong DILOGIC index: %d, expected (1 -> %d)!",dilogic,kNDILOGICAdd));
-         dilogic = iDILOGIC;
+       // Now read the end-of-event word
+       UInt_t eOfEvent = GetNextWord() & 0xfffffff;
+       if (!((eOfEvent >> 27) & 0x1)) {                                                  //check 27th bit in EoE. It must be 1!
+         fRawReader->AddMajorErrorLog(kEoEFlagErr);
+         AliWarning(Form("Missing end-of-event flag! (%x)",eOfEvent));
+         return kTRUE;
        }
-       UInt_t pad = (data >> 12) & 0x3f;
-       if (pad >= kNPadAdd) {
-         fRawReader->AddMajorErrorLog(kWrongPadErr,Form("pad %d",pad));
-         AliWarning(Form("Wrong pad index: %d, expected (0 -> %d)!",pad,kNPadAdd));
-         pad = iPad;
+       UInt_t wc = eOfEvent & 0x7f;
+       if (wc != 48) {
+         fRawReader->AddMajorErrorLog(kEoESizeErr,Form("eoe size=%d",wc));
+         AliWarning(Form("Wrong end-of-event word-count:%d, expected 48!",wc));
+         return kTRUE;
+       }
+       UInt_t da = (eOfEvent >> 18) & 0xf;
+       if (da != dilogic) {
+         fRawReader->AddMajorErrorLog(kEoEDILOGICErr,Form("eoe dil %d != %d",da,dilogic));
+         AliWarning(Form("Wrong DILOGIC address found in end-of-event: %d, expected %d!",da,dilogic));
+         return kTRUE;
+       }
+       UInt_t ca = (eOfEvent >> 22) & 0x1f;
+       if (ca != row) {
+         fRawReader->AddMajorErrorLog(kEoERowErr,Form("eoe row %d != %d",ca,row));
+         AliWarning(Form("Wrong row index found in end-of-event: %d, expected %d!",ca,row));
+         return kTRUE;
+       }
+      }//DILOGIC loop
+      
+      // Read the segment marker
+      // One maker per 8 rows
+      
+      if (iRow%8 == 0) {
+       UInt_t segWord = GetNextWord();
+       if ((segWord >> 8) != 0xab0f59) {
+         fRawReader->AddMajorErrorLog(kBadSegWordErr);
+         AliWarning(Form("Wrong segment word signature: %x, expected 0xab0f59!",(segWord >> 8)));
+         return kTRUE;
+       }
+       
+       if ((segWord & 0xff) != (((UInt_t)iRow + 7) / 8)) {
+         fRawReader->AddMajorErrorLog(kWrongSegErr,Form("seg %d != %d",segWord & 0xff,(iRow + 7) / 8));
+         AliWarning(Form("Segment index (%d) does not correspond to the one expected from row index (%d)!",segWord & 0xff,(iRow + 7) / 8));
+         return kTRUE;
        }
-       fCharge[row][dilogic][pad] = data & 0xfff;
-      }
-      // Now read the end-of-event word
-      UInt_t eOfEvent = GetNextWord() & 0xfffffff;
-      if (!((eOfEvent >> 27) & 0x1)) {
-       fRawReader->AddMajorErrorLog(kEoEFlagErr);
-       AliWarning(Form("Missing end-of-event flag! (%x)",eOfEvent));
-       return kTRUE;
-      }
-      UInt_t wc = eOfEvent & 0x7f;
-      if (wc != 48) {
-       fRawReader->AddMajorErrorLog(kEoESizeErr,Form("eoe size=%d",wc));
-       AliWarning(Form("Wrong end-of-event word-count:%d, expected 48!",wc));
-       return kTRUE;
-      }
-      UInt_t da = (eOfEvent >> 18) & 0xf;
-      if (da != dilogic) {
-       fRawReader->AddMajorErrorLog(kEoEDILOGICErr,Form("eoe dil %d != %d",da,dilogic));
-       AliWarning(Form("Wrong DILOGIC address found in end-of-event: %d, expected %d!",da,dilogic));
-       return kTRUE;
-      }
-      UInt_t ca = (eOfEvent >> 22) & 0x1f;
-      if (ca != row) {
-       fRawReader->AddMajorErrorLog(kEoERowErr,Form("eoe row %d != %d",ca,row));
-       AliWarning(Form("Wrong row index found in end-of-event: %d, expected %d!",ca,row));
-       return kTRUE;
       }
-    }
+    }//loop of Row   
+  }//Pedestal files selected by data lenght
 
-    // Read the segment marker
-    // One maker per 8 rows
-    if (iRow%8 == 0) {
-      UInt_t segWord = GetNextWord();
-      if ((segWord >> 8) != 0xab0f58) {
-       fRawReader->AddMajorErrorLog(kBadSegWordErr);
-       AliWarning(Form("Wrong segment word signature: %x, expected 0xab0f58!",(segWord >> 8)));
-       return kTRUE;
-      }
-      if ((segWord & 0xff) != (((UInt_t)iRow + 7) / 8)) {
-       fRawReader->AddMajorErrorLog(kWrongSegErr,Form("seg %d != %d",segWord & 0xff,(iRow + 7) / 8));
-       AliWarning(Form("Segment index (%d) does not correspond to the one expected from row index (%d)!",segWord & 0xff,(iRow + 7) / 8));
+  else {                                                                  //Raw data size is not 0 and not 47148 (pedestal)
+    fDDLNumber = fRawReader->GetDDLID();
+    fPosition = 0;
+  
+    Init();
+    
+    // Look over rows
+    for(Int_t iRow = 1; iRow <= kNRows; iRow++) {
+      
+      UInt_t rowMarker = GetNextWord();                                 // Read row marker
+      
+      Int_t numRows= rowMarker >> 16 & 0xffffff;
+      
+      if ((rowMarker >> 0 & 0xffff) != 0x32a8) {
+       fRawReader->AddMajorErrorLog(kRowMarkerErr);
+        AliWarning(Form("Wrong row marker %x for row %d, expected 0x32a8!",rowMarker,iRow));
        return kTRUE;
+      }//check for row marker
+      UInt_t dilogic = 0, row = 0;
+      UInt_t cntData=0;
+      UInt_t cntEoE=0;
+      //molnarl: lets read how many rows we have from the marker; 10 dilogic EoE so we can get the number of data words they should be in order
+      for(Int_t iWordInRow=0; iWordInRow<numRows;iWordInRow++) //loop over words 
+       {     
+         UInt_t tmpword=GetNextWord();               
+         UInt_t eOfEvent = tmpword;                     // always assume that it is an EoE. If bit 
+         if (!((eOfEvent >> 27) & 0x1)) {               // if it is not EoE then data!
+           UInt_t data=tmpword;
+           row = (data >> 22) & 0x1f;                                                  //row information in raw word is between bits: 22...26
+           if (row < 1 || row > kNRows) {                                              //select bits from 22 and with 0x1f ask for the next 5 bits 
+             fRawReader->AddMajorErrorLog(kWrongRowErr,Form("row %d",row));
+             AliWarning(Form("Wrong row index: %d, expected (1 -> %d)!",row,kNRows));
+             // row = iRow;
+           }
+           dilogic = (data >> 18) & 0xf;                                              //dilogic info in raw word is between bits: 18...21
+           if (dilogic < 1 || dilogic > kNDILOGICAdd) {
+             fRawReader->AddMajorErrorLog(kWrongDilogicErr,Form("dil %d",dilogic));
+             AliWarning(Form("Wrong DILOGIC index: %d, expected (1 -> %d)!",dilogic,kNDILOGICAdd));
+             //dilogic = iDILOGIC;
+           }
+           UInt_t pad = (data >> 12) & 0x3f;                                                    //pad info in raw word is between bits: 12...17
+           if (pad >= kNPadAdd) {
+             fRawReader->AddMajorErrorLog(kWrongPadErr,Form("pad %d",pad));
+             AliWarning(Form("Wrong pad index: %d, expected (0 -> %d)!",pad,kNPadAdd));
+             //pad = iPad;
+           }
+           fCharge[fDDLNumber][row][dilogic][pad] = data & 0xfff;  cntData++;
+           
+         }//not EoE but data!
+         //if it is EoE
+         else{
+           //Printf("EoE word");
+           if (!((eOfEvent >> 27) & 0x1)) {                                                  //check 27th bit in EoE. It must be 1!
+             fRawReader->AddMajorErrorLog(kEoEFlagErr);
+             AliWarning(Form("Missing end-of-event flag! (%x)",eOfEvent));
+             return kTRUE;
+           }
+           UInt_t wc = eOfEvent & 0x7f;
+           if (wc != cntData) {
+             fRawReader->AddMajorErrorLog(kEoESizeErr,Form("eoe size=%d",wc));
+             AliWarning(Form("Wrong end-of-event word-count:%d, expected 48!",wc));
+             return kTRUE;
+           }
+           UInt_t da = (eOfEvent >> 18) & 0xf;
+           if (cntData!=0 && da != dilogic) {
+             fRawReader->AddMajorErrorLog(kEoEDILOGICErr,Form("eoe dil %d != %d",da,dilogic));
+             AliWarning(Form("Wrong DILOGIC address found in end-of-event: %d, expected %d!",da,dilogic));
+             return kTRUE;
+           }
+           UInt_t ca = (eOfEvent >> 22) & 0x1f;
+           if (cntData!=0 &&  ca != row) {
+             fRawReader->AddMajorErrorLog(kEoERowErr,Form("eoe row %d != %d",ca,row));
+             AliWarning(Form("Wrong row index found in end-of-event: %d, expected %d!",ca,row));
+             return kTRUE;
+           }
+           cntData=0;  cntEoE++;//zero it and wait for new data words
+         } //EoE word
+         
+       } //loop over rows within two markers
+      
+      
+      
+      // Read the segment marker
+      // One maker per 8 rows
+      
+      if (iRow%8 == 0) {
+       UInt_t segWord = GetNextWord();
+       if ((segWord >> 8) != 0xab0f59) {
+         fRawReader->AddMajorErrorLog(kBadSegWordErr);
+         AliWarning(Form("Wrong segment word signature: %x, expected 0xab0f59!",(segWord >> 8)));
+         return kTRUE;
+       }
+       
+       if ((segWord & 0xff) != (((UInt_t)iRow + 7) / 8)) {
+         fRawReader->AddMajorErrorLog(kWrongSegErr,Form("seg %d != %d",segWord & 0xff,(iRow + 7) / 8));
+         AliWarning(Form("Segment index (%d) does not correspond to the one expected from row index (%d)!",segWord & 0xff,(iRow + 7) / 8));
+         return kTRUE;
+       }
       }
-    }
-  }    
+    }//loop of Row   
+  }//REal data files selected by data lenght
+  
+  AliDebug(1,"Stop."); 
   return kTRUE;
 }
 
@@ -182,38 +300,14 @@ UInt_t AliHMPIDRawStream::GetNextWord()
   // The method is supposed to be endian (platform)
   // independent.
   if (!fData || fPosition < 0) AliFatal("Raw data payload buffer is not yet initialized !");
-
+  
   UInt_t word = 0;
   word |= fData[fPosition++];
   word |= fData[fPosition++] << 8;
   word |= fData[fPosition++] << 16;
   word |= fData[fPosition++] << 24;
-
+  
   return word;
 }
 
 //_____________________________________________________________________________
-Short_t AliHMPIDRawStream::GetCharge(Int_t row, Int_t dilogic, Int_t pad) const
-{
-  // The method returns the charge collected
-  // in a particular channel
-  // Return -1 in case the charge from the channels
-  // has not been read or invalid arguments
-
-  if (row < 1 || row >= kNRows) {
-    AliError(Form("Wrong row index %d!",row));
-    return 0;
-  }
-
-  if (dilogic < 1 || dilogic >= kNDILOGICAdd) {
-    AliError(Form("Wrong DILOGIC address %d!",dilogic));
-    return 0;
-  }
-  
-  if (pad >= kNPadAdd) {
-    AliError(Form("Wrong pad index %d!",pad));
-    return 0;
-  }
-
-  return fCharge[row][dilogic][pad];
-}