X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RAW%2FAliRawReaderFile.cxx;h=e126d1010e4488e59e5373605d67202f957e4d94;hb=743433955b34814ecb81f73dd43441c684bbe223;hp=fe33f776157d003f77ea0b4fab3ac75d1564f1d9;hpb=38cf12f36447209b467f01fdaf1b40e0b75686c6;p=u%2Fmrichter%2FAliRoot.git diff --git a/RAW/AliRawReaderFile.cxx b/RAW/AliRawReaderFile.cxx index fe33f776157..e126d1010e4 100644 --- a/RAW/AliRawReaderFile.cxx +++ b/RAW/AliRawReaderFile.cxx @@ -30,8 +30,11 @@ /// /////////////////////////////////////////////////////////////////////////////// +#include #include "AliRawReaderFile.h" +#include "AliDAQ.h" #include +#include ClassImp(AliRawReaderFile) @@ -44,14 +47,25 @@ AliRawReaderFile::AliRawReaderFile(Int_t eventNumber) : fStream(NULL), fEquipmentId(-1), fBuffer(NULL), - fBufferSize(0) + fBufferSize(0), + fEquipmentSize(0), + fDDLIndex(NULL), + 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) : @@ -61,13 +75,24 @@ AliRawReaderFile::AliRawReaderFile(const char* dirName, Int_t eventNumber) : fStream(NULL), fEquipmentId(-1), fBuffer(NULL), - fBufferSize(0) + fBufferSize(0), + fEquipmentSize(0), + fDDLIndex(NULL), + 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() @@ -83,8 +108,9 @@ AliRawReaderFile::~AliRawReaderFile() #endif delete fStream; } - delete fHeader; + if (fHeader) delete fHeader; if (fBuffer) delete[] fBuffer; + if (fDDLIndex) delete fDDLIndex; fDDLIndex=NULL; } void AliRawReaderFile::RequireHeader(Bool_t required) @@ -92,8 +118,14 @@ void AliRawReaderFile::RequireHeader(Bool_t required) // Reading of raw data in case of missing // raw data header is not implemented for // this class - if (!required) - Fatal("AliRawReaderFile","Reading of raw data without raw data header is not implemented !"); + if (!required) { + Warning("AliRawReaderFile","Reading of raw data without raw data header!"); + if (fHeader) delete fHeader; + fHeader = NULL; + } + else { + if (!fHeader) fHeader = new AliRawDataHeader; + } AliRawReader::RequireHeader(required); } @@ -122,11 +154,51 @@ void* AliRawReaderFile::OpenDirectory() return directory; } +Bool_t AliRawReaderFile::CreateFileIndex() +{ +// scan the files of the directory and create index of all DDL files +// returns kFALSE if no DDL files available + Bool_t result=kFALSE; + fDDLCurrent=-1; + if (fDDLIndex) return fDDLIndex->GetSize()>0; + if (!fDirectory) return kFALSE; + fDDLIndex=new TArrayC(0); + if (!fDDLIndex) return kFALSE; + TString entry; + 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); + } + char* array=(char*)fDDLIndex->GetArray(); + array[equipmentId]=1; + } + + return result; +} + Bool_t AliRawReaderFile::OpenNextFile() { // open the next file // returns kFALSE if the current file is the last one + if (!fDDLIndex && !CreateFileIndex()) return kFALSE; + if (fSelectMinEquipmentId>=0 && fSelectMinEquipmentId>fEquipmentId) + fDDLCurrent=fSelectMinEquipmentId-1; + if (fStream) { #if defined(__HP_aCC) || defined(__DECCXX) if (fStream->rdbuf()->is_open()) fStream->close(); @@ -136,26 +208,34 @@ Bool_t AliRawReaderFile::OpenNextFile() delete fStream; fStream = NULL; fEquipmentId = -1; + fEquipmentSize = 0; } if (!fDirectory) return kFALSE; - TString entry; - while (entry = gSystem->GetDirEntry(fDirectory)) { - if (entry.IsNull()) return kFALSE; - if (!entry.EndsWith(".ddl")) continue; + while (++fDDLCurrent<(fDDLIndex->GetSize()) && + (fDDLCurrent<=fSelectMaxEquipmentId || fSelectMaxEquipmentId<0)) { + if (fDDLIndex->At(fDDLCurrent)==0) continue; + Int_t dummy=0; + TString entry; + 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 fStream = new fstream(fileName, ios::in); #endif + delete [] fileName; break; } if (!fStream) return kFALSE; - entry.Remove(0, entry.Last('_')+1); - entry.Remove(entry.Length()-4); - fEquipmentId = atoi(entry.Data()); + fEquipmentId = fDDLCurrent; #if defined(__HP_aCC) || defined(__DECCXX) return (fStream->rdbuf()->is_open()); #else @@ -169,13 +249,19 @@ Bool_t AliRawReaderFile::ReadHeader() // read a data header at the current stream position // returns kFALSE if the mini header could not be read - if (!fStream) return kFALSE; + if (!fStream && !OpenNextFile()) return kFALSE; do { if (fCount > 0) fStream->seekg(Int_t(fStream->tellg()) + fCount); - while (!fStream->read((char*) fHeader, sizeof(AliRawDataHeader))) { - if (!OpenNextFile()) return kFALSE; + if (fHeader) { + while (!fStream->read((char*) fHeader, sizeof(AliRawDataHeader))) { + if (!OpenNextFile()) return kFALSE; + } + } + else { + if (fStream->eof()) + if (!OpenNextFile()) return kFALSE; } - if (fHeader->fSize != 0xFFFFFFFF) { + if (fHeader && fHeader->fSize != 0xFFFFFFFF) { fCount = fHeader->fSize - sizeof(AliRawDataHeader); } else { UInt_t currentPos = fStream->tellg(); @@ -183,6 +269,8 @@ Bool_t AliRawReaderFile::ReadHeader() fCount = UInt_t(fStream->tellg()) - currentPos; fStream->seekg(currentPos); } + fEquipmentSize = fCount; + if (fHeader) fEquipmentSize += sizeof(AliRawDataHeader); } while (!IsSelected()); return kTRUE; } @@ -244,7 +332,20 @@ Bool_t AliRawReaderFile::Reset() if (fDirectory) gSystem->FreeDirectory(fDirectory); fDirectory = directory; + // Matthias 05.06.2008 + // do not open the next file. That might collide with a subsequent + // SelectEquipment call as the 'file pointer' is already set. + // This is important for the indexing of the DDL files. + // --------------------------------------------------------- + // All ReadNext functions first require the fCount member to be + // non zero or call ReadHeader. That allows to postpone the call + // to OpenNextFile to the next invocation of ReadHeader. + // ReadHeader has been mofified according to that. + /* OpenNextFile(); + */ + fEquipmentId=-1; + fDDLCurrent=-1; fCount = 0; return kTRUE; } @@ -253,6 +354,9 @@ Bool_t AliRawReaderFile::NextEvent() { // go to the next event directory + if (fDDLIndex) delete fDDLIndex; + fDDLIndex=NULL; + fDetectorPattern = 0; if (fEventIndex < -1) return kFALSE; do { @@ -266,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;