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 (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()
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);
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!");
// 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());
// reset the current position in the buffer to the beginning of the curevent
fHeader = NULL;
+ fHeaderV3 = NULL;
fCount = 0;
fPosition = 0;
fCurrent=0;
fBuffers.push_back(AliRRMBuffer(memory, size, -1));
fCurrent=0;
fHeader = NULL;
+ fHeaderV3 = NULL;
fCount = 0;
fPosition = 0;
return kTRUE;