]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RAW/AliRawReaderFile.cxx
Enlarging window for DCS DPs retrieval for short runs for GRP + Keeping connection...
[u/mrichter/AliRoot.git] / RAW / AliRawReaderFile.cxx
index 560c4f9b50e4c153f992c0b644755e68300d8e09..60ca888962dc27d17835982d6ea42c6a883ca523 100644 (file)
@@ -37,6 +37,7 @@
 #include <TArrayC.h>
 
 
+using std::ios;
 ClassImp(AliRawReaderFile)
 
 
@@ -62,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) :
@@ -88,11 +88,10 @@ AliRawReaderFile::AliRawReaderFile(const char* dirName, Int_t eventNumber) :
 
   fDirectory = OpenDirectory();
   if (!fDirectory) fIsValid = kFALSE;
-  if (!OpenNextFile()) fIsValid = kFALSE;
-  fHeader = new AliRawDataHeader;
+  if (fEventIndex >= 0 && (!OpenNextFile())) fIsValid = kFALSE;
 
   fId[0] = fId[1] = 0;
-  fTriggerPattern[0] = fTriggerPattern[1] = 0;
+  fTriggerPattern[0] = fTriggerPattern[1] = fTriggerPattern[3] = fTriggerPattern[3] = 0;
 }
 
 AliRawReaderFile::~AliRawReaderFile()
@@ -109,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;
 }
@@ -121,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);
@@ -165,7 +165,7 @@ Bool_t AliRawReaderFile::CreateFileIndex()
   fDDLIndex=new TArrayC(0);
   if (!fDDLIndex) return kFALSE;
   TString entry;
-  while (entry = gSystem->GetDirEntry(fDirectory)) {
+  while ((entry = gSystem->GetDirEntry(fDirectory))) {
     const char* filename=entry.Data();
     if (!filename || entry.IsNull()) break;
     if (entry.BeginsWith("run")) {
@@ -251,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;
 }
@@ -372,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!");