void* /* event */
#endif
) :
- fRequireHeader(kTRUE),
+ fFile(NULL),
fEvent(NULL),
fSubEvent(NULL),
fEquipment(NULL),
- fIsOwner(kFALSE),
fPosition(NULL),
fEnd(NULL)
{
Int_t /*eventNumber*/
#endif
) :
- fRequireHeader(kTRUE),
+ fFile(NULL),
fEvent(NULL),
fSubEvent(NULL),
fEquipment(NULL),
- fIsOwner(kFALSE),
fPosition(NULL),
fEnd(NULL)
{
// create an object to read digits from the given date event
#ifdef ALI_DATE
- FILE* file = fopen(fileName, "rb");
- if (!file) {
+ fFile = fopen(fileName, "rb");
+ if (!fFile) {
Error("AliRawReaderDate", "could not open file %s", fileName);
return;
}
+ if (eventNumber < 0) return;
+
eventHeaderStruct header;
UInt_t headerSize = sizeof(eventHeaderStruct);
- while (fread(&header, 1, headerSize, file) == headerSize) {
+ while (fread(&header, 1, headerSize, fFile) == headerSize) {
if (eventNumber == 0) {
UChar_t* buffer = new UChar_t[header.eventSize];
- fseek(file, -headerSize, SEEK_CUR);
- if (fread(buffer, 1, header.eventSize, file) != header.eventSize) break;
+ fseek(fFile, -headerSize, SEEK_CUR);
+ if (fread(buffer, 1, header.eventSize, fFile) != header.eventSize) break;
fEvent = (eventHeaderStruct*) buffer;
- fIsOwner = kTRUE;
break;
}
- fseek(file, header.eventSize-headerSize, SEEK_CUR);
+ fseek(fFile, header.eventSize-headerSize, SEEK_CUR);
eventNumber--;
}
- fclose(file);
#else
Fatal("AliRawReaderDate", "this class was compiled without DATE");
AliRawReaderDate::AliRawReaderDate(const AliRawReaderDate& rawReader) :
AliRawReader(rawReader),
- fRequireHeader(rawReader.fRequireHeader),
+ fFile(rawReader.fFile),
fEvent(rawReader.fEvent),
fSubEvent(rawReader.fSubEvent),
fEquipment(rawReader.fEquipment),
- fIsOwner(kFALSE),
fPosition(rawReader.fPosition),
fEnd(rawReader.fEnd)
{
// copy constructor
+ Fatal("AliRawReaderDate", "copy constructor not implemented");
}
AliRawReaderDate& AliRawReaderDate::operator = (const AliRawReaderDate&
- rawReader)
+ /*rawReader*/)
{
// assignment operator
- this->~AliRawReaderDate();
- new(this) AliRawReaderDate(rawReader);
+ Fatal("operator =", "assignment operator not implemented");
return *this;
}
// destructor
#ifdef ALI_DATE
- if (fIsOwner) delete[] fEvent;
+ if (fFile) {
+ delete[] fEvent;
+ fclose(fFile);
+ }
#endif
}
#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
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
#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()
{
fErrorCode = 0;
#ifdef ALI_DATE
+ fHeader = NULL;
if (!fEvent) return kFALSE;
// check whether there are sub events
if (fEvent->eventSize <= fEvent->eventHeadSize) return kFALSE;
// get the first or the next equipment if at the end of an equipment
if (!fEquipment || (fPosition >= fEnd)) {
+ fEquipment = NULL;
// get the first or the next sub event if at the end of a sub event
if (!fSubEvent ||
// 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 {
return kFALSE;
}
+ // continue if no data in the subevent
+ if (fSubEvent->eventSize == fSubEvent->eventHeadSize) {
+ fPosition = fEnd = ((UChar_t*)fSubEvent) + fSubEvent->eventSize;
+ fCount = 0;
+ continue;
+ }
+
fEquipment = (equipmentHeaderStruct*)
(((UChar_t*)fSubEvent) + fSubEvent->eventHeadSize);
fCount = 0;
fPosition = ((UChar_t*)fEquipment) + sizeof(equipmentHeaderStruct);
- fEnd = fPosition + fEquipment->equipmentSize;
+ if (fSubEvent->eventVersion <= 0x00030001) {
+ fEnd = fPosition + fEquipment->equipmentSize;
+ } else {
+ fEnd = ((UChar_t*)fEquipment) + fEquipment->equipmentSize;
+ }
}
// continue with the next sub event if no data left in the payload
if (fPosition >= fEnd) continue;
- fHeader = NULL;
if (fRequireHeader) {
// check that there are enough bytes left for the data header
if (fPosition + sizeof(AliRawDataHeader) > fEnd) {
// "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);
}
fCount = fEnd - fPosition;
}
- } while (!IsSelected());
+ } while (!fEquipment || !IsSelected());
return kTRUE;
#else
#ifdef ALI_DATE
fSubEvent = NULL;
+ fEquipment = NULL;
#endif
fCount = 0;
fPosition = fEnd = NULL;
}
+Bool_t AliRawReaderDate::NextEvent()
+{
+// go to the next event in the date file
+
+#ifdef ALI_DATE
+ if (!fFile) return kFALSE;
+
+ Reset();
+ eventHeaderStruct header;
+ UInt_t headerSize = sizeof(eventHeaderStruct);
+ if (fEvent) delete[] fEvent;
+ fEvent = &header;
+
+ while (fread(&header, 1, headerSize, fFile) == headerSize) {
+ if (!IsEventSelected()) {
+ fseek(fFile, header.eventSize-headerSize, SEEK_CUR);
+ continue;
+ }
+ UChar_t* buffer = new UChar_t[header.eventSize];
+ fseek(fFile, -headerSize, SEEK_CUR);
+ if (fread(buffer, 1, header.eventSize, fFile) != header.eventSize) {
+ Error("NextEvent", "could not read event from file");
+ delete[] buffer;
+ break;
+ }
+ fEvent = (eventHeaderStruct*) buffer;
+ fEventNumber++;
+ return kTRUE;
+ };
+
+ fEvent = NULL;
+#endif
+
+ return kFALSE;
+}
+
+Bool_t AliRawReaderDate::RewindEvents()
+{
+// go back to the beginning of the date file
+
+ if (!fFile) return kFALSE;
+
+ fseek(fFile, 0, SEEK_SET);
+ fEventNumber = -1;
+ return Reset();
+}
+
+
Int_t AliRawReaderDate::CheckData() const
{
// check the consistency of the data
// 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 {
// 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 (fHeader->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