ALIROOT-5420 Transition to common data header V3 in the raw data. Additional patch...
authorhristov <Peter.Hristov@cern.ch>
Tue, 20 May 2014 08:44:52 +0000 (10:44 +0200)
committerhristov <Peter.Hristov@cern.ch>
Tue, 20 May 2014 08:44:52 +0000 (10:44 +0200)
RAW/AliRawReaderFile.cxx
RAW/AliRawReaderFile.h
RAW/AliRawReaderMemory.cxx

index 92b5d85..60ca888 100644 (file)
@@ -63,10 +63,9 @@ AliRawReaderFile::AliRawReaderFile(Int_t eventNumber) :
   fDirectory = OpenDirectory();
   if (!fDirectory) fIsValid = kFALSE;
   if (!OpenNextFile()) fIsValid = kFALSE;
-  fHeader = new AliRawDataHeader;
 
   fId[0] = fId[1] = 0;
-  fTriggerPattern[0] = fTriggerPattern[1] = 0;
+  fTriggerPattern[0] = fTriggerPattern[1] = fTriggerPattern[3] = fTriggerPattern[3] = 0;
 }
 
 AliRawReaderFile::AliRawReaderFile(const char* dirName, Int_t eventNumber) :
@@ -90,10 +89,9 @@ AliRawReaderFile::AliRawReaderFile(const char* dirName, Int_t eventNumber) :
   fDirectory = OpenDirectory();
   if (!fDirectory) fIsValid = kFALSE;
   if (fEventIndex >= 0 && (!OpenNextFile())) fIsValid = kFALSE;
-  fHeader = new AliRawDataHeader;
 
   fId[0] = fId[1] = 0;
-  fTriggerPattern[0] = fTriggerPattern[1] = 0;
+  fTriggerPattern[0] = fTriggerPattern[1] = fTriggerPattern[3] = fTriggerPattern[3] = 0;
 }
 
 AliRawReaderFile::~AliRawReaderFile()
@@ -110,6 +108,8 @@ AliRawReaderFile::~AliRawReaderFile()
     delete fStream;
   }
   if (fHeader) delete fHeader;
+  if (fHeaderV3) delete fHeaderV3;
+
   if (fBuffer) delete[] fBuffer;
   if (fDDLIndex) delete fDDLIndex; fDDLIndex=NULL;
 }
@@ -122,10 +122,9 @@ void AliRawReaderFile::RequireHeader(Bool_t required)
   if (!required) {
     Warning("AliRawReaderFile","Reading of raw data without raw data header!");
     if (fHeader) delete fHeader;
+    if (fHeaderV3) delete fHeaderV3;
     fHeader = NULL;
-  }
-  else {
-    if (!fHeader) fHeader = new AliRawDataHeader;
+    fHeaderV3 = NULL;
   }
 
   AliRawReader::RequireHeader(required);
@@ -252,26 +251,46 @@ Bool_t AliRawReaderFile::ReadHeader()
 
   if (!fStream && !OpenNextFile()) return kFALSE;
   do {
+    UInt_t dataSize=0;
+    UInt_t headerSize=0;
     if (fCount > 0) fStream->seekg(Int_t(fStream->tellg()) + fCount);
-    if (fHeader) {
+    UInt_t currentPos = fStream->tellg();
+    if (fRequireHeader) {
+      if(! fHeader) fHeader = new AliRawDataHeader;
       while (!fStream->read((char*) fHeader, sizeof(AliRawDataHeader))) {
        if (!OpenNextFile()) return kFALSE;
+       currentPos = fStream->tellg();
+      }
+      dataSize=fHeader->fSize;
+      headerSize=sizeof(AliRawDataHeader);
+      if(fHeader->GetVersion() == 3){
+       delete fHeader;
+       fHeader = NULL;
+       if(! fHeaderV3) fHeaderV3 = new AliRawDataHeaderV3;
+       //rewind
+       fStream->seekg(currentPos);
+       if (!fStream->read((char*) fHeaderV3, sizeof(AliRawDataHeaderV3)))
+         return kFALSE;
+       headerSize=sizeof(AliRawDataHeaderV3);
+      } else if (fHeaderV3) {
+       delete fHeaderV3;
+       fHeaderV3 = NULL;
       }
+      
     }
     else {
       if (fStream->eof())
        if (!OpenNextFile()) return kFALSE;
     }
-    if (fHeader && fHeader->fSize != 0xFFFFFFFF) {
-      fCount = fHeader->fSize - sizeof(AliRawDataHeader);
+    if ( headerSize && dataSize != 0xFFFFFFFF) {
+      fCount = dataSize - headerSize;
     } else {
-      UInt_t currentPos = fStream->tellg();
+      currentPos = fStream->tellg();
       fStream->seekg(0, ios::end);
       fCount = UInt_t(fStream->tellg()) - currentPos;
       fStream->seekg(currentPos);
     }
-    fEquipmentSize = fCount;
-    if (fHeader) fEquipmentSize += sizeof(AliRawDataHeader);
+    fEquipmentSize = fCount + headerSize;
   } while (!IsSelected());
   return kTRUE;
 }
@@ -373,11 +392,26 @@ Bool_t AliRawReaderFile::NextEvent()
 
   // Read the header of the first payload
   // in order to fill the 'fake' event header
-  if (ReadHeader() && fHeader) {
-    fId[0] = ((fHeader->GetEventID2() >> 20) & 0xf);
-    fId[1] = (fHeader->GetEventID1() & 0xfff) | ((fHeader->GetEventID2() & 0xfffff) << 12);
-    fTriggerPattern[0] = (fHeader->GetTriggerClasses() & 0xffffffff);
-    fTriggerPattern[1] = ((fHeader->GetTriggerClasses() >> 32) & 0x3ffff);
+  if (ReadHeader() && ( fHeader || fHeaderV3) ) {
+    UInt_t eid1=0, eid2=0;
+    ULong64_t trg1=0, trg2=0;
+    if(fHeader){
+      eid1=fHeader->GetEventID1();
+      eid2=fHeader->GetEventID2();
+      trg1=fHeader->GetTriggerClasses();
+    } else {
+      eid1=fHeaderV3->GetEventID1();
+      eid2=fHeaderV3->GetEventID2();
+      trg1=fHeaderV3->GetTriggerClasses();
+      trg2=fHeaderV3->GetTriggerClassesNext50();
+    }
+
+    fId[0] = ((eid2 >> 20) & 0xf);
+    fId[1] = (eid1 & 0xfff) | ((eid2 & 0xfffff) << 12);
+    fTriggerPattern[0] = (trg1 & 0xffffffff);
+    fTriggerPattern[1] = ((trg1 >> 32) & 0x3ffff) | ((trg2 & 0x3fff) << 18);
+    fTriggerPattern[2] = ((trg2 >> 14) & 0xffffffff);
+    fTriggerPattern[3] = ((trg2 >> 46) & 0xf);
   }
   else {
     Warning("AliRawReaderFile","Can not read CDH header! The event header fields will be empty!");
index d4d2602..be9d1e1 100644 (file)
@@ -81,7 +81,7 @@ class AliRawReaderFile: public AliRawReader {
     UInt_t           fType;        // event type (no idea from where to get it - put physics_event)
     UInt_t           fRunNb;       // run number (no idea from where to get it - put 0)
     UInt_t           fId[2];       // id field (read from the first CDH found, period is not filled)
-    UInt_t           fTriggerPattern[2]; // the trigger class pattern (read from the first CDH found)
+    UInt_t           fTriggerPattern[4]; // the trigger class pattern (read from the first CDH found)
     UInt_t           fDetectorPattern;   // the detector pattern (no idea from where to read it)
     UInt_t           fTimestamp;   // event timestamp (read from the DDL file creation time)
 
index 9ede85b..7076c00 100644 (file)
@@ -81,33 +81,50 @@ Bool_t AliRawReaderMemory::ReadHeader()
 
     // Check if we would not read past the end of the buffer.
     if ( fPosition+fCount >= fBuffers[fCurrent].GetBufferSize() ) break;
-    
+
     fHeader = reinterpret_cast<AliRawDataHeader*>(fBuffers[fCurrent].GetBuffer()+fPosition+fCount);
+    fHeaderV3 = reinterpret_cast<AliRawDataHeaderV3*>(fBuffers[fCurrent].GetBuffer()+fPosition+fCount);
+
+    //Access to version and size is uniform for V2 and V3 
+    UChar_t version = fHeader->GetVersion();
+    UInt_t size = fHeader->fSize;
+    Int_t headerSize = 0;
+
+    if(version == 3) {
+      fHeader=NULL;
+      headerSize = sizeof(AliRawDataHeaderV3);
+    } else if(version == 2) {
+      fHeaderV3=NULL;
+      headerSize = sizeof(AliRawDataHeader);
+    } else {
+      Error("ReadHeader", "Wrong raw data header version: %d. Expected: 2 or 3.", version);
+      return kFALSE;
+    }
     
     // Check that the header is sane, that is the size does not go past the buffer.
     // Otherwise try again at the next word location.
     while (1) {
-    if ( ( (fHeader->fSize == 0) || 
-          ((Int_t)fPosition + fCount + (Int_t)fHeader->fSize > (Int_t)fBuffers[fCurrent].GetBufferSize() ) ) 
-        && fHeader->fSize != 0xFFFFFFFF) {
-
-      if (fPosition + sizeof(UInt_t) <= fBuffers[fCurrent].GetBufferSize()) {
-        fPosition += sizeof(UInt_t);
-        continue;
+      if ( ( (size == 0) ||
+          ((Int_t)fPosition + fCount + (Int_t)size > (Int_t)fBuffers[fCurrent].GetBufferSize() ) )
+         && size != 0xFFFFFFFF) {
+
+       if (fPosition + sizeof(UInt_t) <= fBuffers[fCurrent].GetBufferSize()) {
+         fPosition += sizeof(UInt_t);
+         continue;
+       } else {
+         Error("ReadHeader", "Could not find a valid DDL header!");
+         return kFALSE;
+       }
       } else {
-        Error("ReadHeader", "Could not find a valid DDL header!");
-        return kFALSE;
+       fPosition += fCount + headerSize;
       }
-    } else {
-      fPosition += fCount + sizeof(AliRawDataHeader);
-    }
-    break;
+      break;
     }
 
-    if (fHeader->fSize != 0xFFFFFFFF) {
-      fCount = fHeader->fSize - sizeof(AliRawDataHeader);
+    if (size != 0xFFFFFFFF) {
+      fCount = (Int_t)size - headerSize;
     } else {
-      fCount = fBuffers[fCurrent].GetBufferSize() - sizeof(AliRawDataHeader);
+      fCount = fBuffers[fCurrent].GetBufferSize() - headerSize;
     }
   } while (!(result=IsSelected()) && OpenNextBuffer());
   } while (!result && OpenNextBuffer());
@@ -174,6 +191,7 @@ Bool_t AliRawReaderMemory::Reset()
 // reset the current position in the buffer to the beginning of the curevent
 
   fHeader = NULL;
+  fHeaderV3 = NULL;
   fCount = 0;
   fPosition = 0;
   fCurrent=0;
@@ -212,6 +230,7 @@ Bool_t AliRawReaderMemory::SetMemory( UChar_t* memory, ULong_t size )
   fBuffers.push_back(AliRRMBuffer(memory, size, -1));
   fCurrent=0;
   fHeader = NULL;
+  fHeaderV3 = NULL;
   fCount = 0;
   fPosition = 0;
   return kTRUE;