X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RAW%2FAliRawReaderDate.cxx;h=89732d1fe8c8c71942531c63def2a86b5ea32b87;hb=ade5466ca8f8dcb5c64e308d89bb5fd2c898947f;hp=f770de02d9d078db1b27a60755feede89958d936;hpb=bba5b21bba593705be4d5a38980d0a5db7dde4a3;p=u%2Fmrichter%2FAliRoot.git diff --git a/RAW/AliRawReaderDate.cxx b/RAW/AliRawReaderDate.cxx index f770de02d9d..89732d1fe8c 100644 --- a/RAW/AliRawReaderDate.cxx +++ b/RAW/AliRawReaderDate.cxx @@ -39,7 +39,6 @@ AliRawReaderDate::AliRawReaderDate( void* /* event */ #endif ) : - fRequireHeader(kTRUE), fFile(NULL), fEvent(NULL), fSubEvent(NULL), @@ -64,7 +63,6 @@ AliRawReaderDate::AliRawReaderDate( Int_t /*eventNumber*/ #endif ) : - fRequireHeader(kTRUE), fFile(NULL), fEvent(NULL), fSubEvent(NULL), @@ -103,7 +101,6 @@ AliRawReaderDate::AliRawReaderDate( AliRawReaderDate::AliRawReaderDate(const AliRawReaderDate& rawReader) : AliRawReader(rawReader), - fRequireHeader(rawReader.fRequireHeader), fFile(rawReader.fFile), fEvent(rawReader.fEvent), fSubEvent(rawReader.fSubEvent), @@ -211,6 +208,18 @@ const UInt_t* AliRawReaderDate::GetAttributes() const #endif } +const UInt_t* AliRawReaderDate::GetSubEventAttributes() const +{ +// get the type attributes from the sub event header + +#ifdef ALI_DATE + if (!fSubEvent) return NULL; + return fSubEvent->eventTypeAttribute; +#else + return NULL; +#endif +} + UInt_t AliRawReaderDate::GetLDCId() const { // get the LDC Id from the event header @@ -238,11 +247,15 @@ UInt_t AliRawReaderDate::GetGDCId() const Int_t AliRawReaderDate::GetEquipmentSize() const { -// get the size of the equipment +// get the size of the equipment (including the header) #ifdef ALI_DATE if (!fEquipment) return 0; - return fEquipment->equipmentSize; + if (fSubEvent->eventVersion <= 0x00030001) { + return fEquipment->equipmentSize + sizeof(equipmentHeaderStruct); + } else { + return fEquipment->equipmentSize; + } #else return 0; #endif @@ -296,6 +309,16 @@ Int_t AliRawReaderDate::GetEquipmentElementSize() const #endif } +Int_t AliRawReaderDate::GetEquipmentHeaderSize() const +{ + // Get the equipment header size + // 28 bytes by default +#ifdef ALI_DATE + return sizeof(equipmentHeaderStruct); +#else + return 0; +#endif +} Bool_t AliRawReaderDate::ReadHeader() { @@ -324,7 +347,10 @@ Bool_t AliRawReaderDate::ReadHeader() // check for end of event data if (fPosition >= ((UChar_t*)fEvent)+fEvent->eventSize) return kFALSE; - if (fSubEvent) { + if (!TEST_SYSTEM_ATTRIBUTE(fEvent->eventTypeAttribute, + ATTR_SUPER_EVENT)) { + fSubEvent = fEvent; // no super event + } else if (fSubEvent) { fSubEvent = (eventHeaderStruct*) (((UChar_t*)fSubEvent) + fSubEvent->eventSize); } else { @@ -359,7 +385,7 @@ Bool_t AliRawReaderDate::ReadHeader() fCount = 0; fPosition = ((UChar_t*)fEquipment) + sizeof(equipmentHeaderStruct); - if (fSubEvent->eventVersion <= 0x00030002) { + if (fSubEvent->eventVersion <= 0x00030001) { fEnd = fPosition + fEquipment->equipmentSize; } else { fEnd = ((UChar_t*)fEquipment) + fEquipment->equipmentSize; @@ -386,6 +412,12 @@ Bool_t AliRawReaderDate::ReadHeader() // "read" the data header fHeader = (AliRawDataHeader*) fPosition; + if ((fPosition + fHeader->fSize) != fEnd) { + Warning("ReadHeader", + "raw data size found in the header is wrong (%d != %d)! Using the equipment size instead !", + fHeader->fSize, fEnd - fPosition); + fHeader->fSize = fEnd - fPosition; + } fPosition += sizeof(AliRawDataHeader); } @@ -457,6 +489,7 @@ Bool_t AliRawReaderDate::Reset() #ifdef ALI_DATE fSubEvent = NULL; + fEquipment = NULL; #endif fCount = 0; fPosition = fEnd = NULL; @@ -471,6 +504,7 @@ Bool_t AliRawReaderDate::NextEvent() #ifdef ALI_DATE if (!fFile) return kFALSE; + Reset(); eventHeaderStruct header; UInt_t headerSize = sizeof(eventHeaderStruct); if (fEvent) delete[] fEvent; @@ -489,6 +523,7 @@ Bool_t AliRawReaderDate::NextEvent() break; } fEvent = (eventHeaderStruct*) buffer; + fEventNumber++; return kTRUE; }; @@ -505,6 +540,7 @@ Bool_t AliRawReaderDate::RewindEvents() if (!fFile) return kFALSE; fseek(fFile, 0, SEEK_SET); + fEventNumber = -1; return Reset(); } @@ -529,7 +565,10 @@ Int_t AliRawReaderDate::CheckData() const // check for end of event data if (position >= ((UChar_t*)fEvent)+fEvent->eventSize) return result; - if (subEvent) { + if (!TEST_SYSTEM_ATTRIBUTE(fEvent->eventTypeAttribute, + ATTR_SUPER_EVENT)) { + subEvent = fEvent; // no super event + } else if (subEvent) { subEvent = (eventHeaderStruct*) (((UChar_t*)subEvent) + subEvent->eventSize); } else { @@ -551,25 +590,25 @@ Int_t AliRawReaderDate::CheckData() const // continue with the next sub event if no data left in the payload if (position >= end) continue; + if (fRequireHeader) { // check that there are enough bytes left for the data header - if (position + sizeof(AliRawDataHeader) > end) { - result |= kErrNoDataHeader; - position = end; - continue; - } + if (position + sizeof(AliRawDataHeader) > end) { + result |= kErrNoDataHeader; + position = end; + continue; + } - // check consistency of data size in the data header and in the sub event - AliRawDataHeader* header = (AliRawDataHeader*) position; - if (header->fSize != 0xFFFFFFFF) { - if (position + header->fSize > end) { + // check consistency of data size in the data header and in the sub event + AliRawDataHeader* header = (AliRawDataHeader*) position; + if ((position + header->fSize) != end) { + Warning("ReadHeader", + "raw data size found in the header is wrong (%d != %d)! Using the equipment size instead !", + header->fSize, end - position); + header->fSize = end - position; result |= kErrSize; - position = end; - } else { - position += header->fSize; } - } else { - position = end; } + position = end; }; #endif