]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RAW/AliRawReaderFile.cxx
Moving fourier decomposition analysis code
[u/mrichter/AliRoot.git] / RAW / AliRawReaderFile.cxx
index c1e16cc4e49f7cbca530d6e216affcf187b68ee5..c379c0a6a978d1974d4456cdc1b11e8ee014e039 100644 (file)
@@ -50,14 +50,22 @@ AliRawReaderFile::AliRawReaderFile(Int_t eventNumber) :
   fBufferSize(0),
   fEquipmentSize(0),
   fDDLIndex(NULL),
-  fDDLCurrent(-1)
+  fDDLCurrent(-1),
+  fType(7),
+  fRunNb(0),
+  fDetectorPattern(0),
+  fTimestamp(0)
 {
 // create an object to read digits from the given event
 // in the current directory
 
   fDirectory = OpenDirectory();
-  OpenNextFile();
+  if (!fDirectory) fIsValid = kFALSE;
+  if (!OpenNextFile()) fIsValid = kFALSE;
   fHeader = new AliRawDataHeader;
+
+  fId[0] = fId[1] = 0;
+  fTriggerPattern[0] = fTriggerPattern[1] = 0;
 }
 
 AliRawReaderFile::AliRawReaderFile(const char* dirName, Int_t eventNumber) :
@@ -70,13 +78,21 @@ AliRawReaderFile::AliRawReaderFile(const char* dirName, Int_t eventNumber) :
   fBufferSize(0),
   fEquipmentSize(0),
   fDDLIndex(NULL),
-  fDDLCurrent(-1)
+  fDDLCurrent(-1),
+  fType(7),
+  fRunNb(0),
+  fDetectorPattern(0),
+  fTimestamp(0)
 {
 // create an object to read digits from the given directory
 
   fDirectory = OpenDirectory();
-  OpenNextFile();
+  if (!fDirectory) fIsValid = kFALSE;
+  if (fEventIndex >= 0 && (!OpenNextFile())) fIsValid = kFALSE;
   fHeader = new AliRawDataHeader;
+
+  fId[0] = fId[1] = 0;
+  fTriggerPattern[0] = fTriggerPattern[1] = 0;
 }
 
 AliRawReaderFile::~AliRawReaderFile()
@@ -149,14 +165,21 @@ 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")) {
+      entry.ReplaceAll("run","");
+      fRunNb = entry.Atoi();
+      continue;
+    }
     if (!entry.EndsWith(".ddl")) continue;
     result=kTRUE;
     entry.Remove(0, entry.Last('_')+1);
     entry.Remove(entry.Length()-4);
     Int_t equipmentId = atoi(entry.Data());
+    Int_t ddlIndex = -1;
+    fDetectorPattern |= (1 << AliDAQ::DetectorIDFromDdlID(equipmentId,ddlIndex));
     if (fDDLIndex->GetSize()<=equipmentId) {
       fDDLIndex->Set(equipmentId+1);
     }
@@ -197,6 +220,11 @@ Bool_t AliRawReaderFile::OpenNextFile()
     entry.Form("%s_%d.ddl", AliDAQ::DetectorNameFromDdlID(fDDLCurrent, dummy), fDDLCurrent);
     char* fileName = gSystem->ConcatFileName(GetDirName(), entry);
     if (!fileName) continue;
+    // read the timestamp
+    FileStat_t buf;
+    if (gSystem->GetPathInfo(fileName,buf) == 0) {
+      fTimestamp = buf.fMtime;
+    }
 #ifndef __DECCXX 
     fStream = new fstream(fileName, ios::binary|ios::in);
 #else
@@ -229,6 +257,10 @@ Bool_t AliRawReaderFile::ReadHeader()
        if (!OpenNextFile()) return kFALSE;
       }
     }
+    else {
+      if (fStream->eof())
+       if (!OpenNextFile()) return kFALSE;
+    }
     if (fHeader && fHeader->fSize != 0xFFFFFFFF) {
       fCount = fHeader->fSize - sizeof(AliRawDataHeader);
     } else {
@@ -324,6 +356,7 @@ Bool_t AliRawReaderFile::NextEvent()
 
   if (fDDLIndex) delete fDDLIndex;
   fDDLIndex=NULL;
+  fDetectorPattern = 0;
   if (fEventIndex < -1) return kFALSE;
 
   do {
@@ -337,6 +370,19 @@ Bool_t AliRawReaderFile::NextEvent()
     Reset();
   } while (!IsEventSelected());
 
+  // 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);
+  }
+  else {
+    Warning("AliRawReaderFile","Can not read CDH header! The event header fields will be empty!");
+  }
+  Reset();
+
   fEventNumber++;
 
   return kTRUE;