#include <TArrayC.h>
+using std::ios;
ClassImp(AliRawReaderFile)
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) :
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()
delete fStream;
}
if (fHeader) delete fHeader;
+ if (fHeaderV3) delete fHeaderV3;
+
if (fBuffer) delete[] fBuffer;
if (fDDLIndex) delete fDDLIndex; fDDLIndex=NULL;
}
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);
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")) {
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;
}
// 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!");