check of data consistency
authortkuhr <tkuhr@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 22 Jan 2004 17:18:01 +0000 (17:18 +0000)
committertkuhr <tkuhr@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 22 Jan 2004 17:18:01 +0000 (17:18 +0000)
RAW/AliRawReader.cxx
RAW/AliRawReader.h
RAW/AliRawReaderDate.cxx
RAW/AliRawReaderDate.h
RAW/AliRawReaderRoot.cxx
RAW/AliRawReaderRoot.h

index e830b26..7ff1781 100644 (file)
@@ -51,6 +51,8 @@ AliRawReader::AliRawReader()
   fSelectDetectorID = -1;
   fSelectMinDDLID = -1;
   fSelectMaxDDLID = -1;
+
+  fErrorCode = 0;
 }
 
 AliRawReader::AliRawReader(const AliRawReader& rawReader) :
@@ -64,6 +66,8 @@ AliRawReader::AliRawReader(const AliRawReader& rawReader) :
   fSelectDetectorID = rawReader.fSelectDetectorID;
   fSelectMinDDLID = rawReader.fSelectMinDDLID;
   fSelectMaxDDLID = rawReader.fSelectMaxDDLID;
+
+  fErrorCode = 0;
 }
 
 AliRawReader& AliRawReader::operator = (const AliRawReader& rawReader)
@@ -77,6 +81,8 @@ AliRawReader& AliRawReader::operator = (const AliRawReader& rawReader)
   fSelectMinDDLID = rawReader.fSelectMinDDLID;
   fSelectMaxDDLID = rawReader.fSelectMaxDDLID;
 
+  fErrorCode = rawReader.fErrorCode;
+
   return *this;
 }
 
@@ -107,14 +113,14 @@ Bool_t AliRawReader::IsSelected() const
 }
 
 
-Bool_t AliRawReader::CheckMiniHeader() const
+Bool_t AliRawReader::CheckMiniHeader(AliMiniHeader* miniHeader) const
 {
 // check the magic number of the mini header
 
-  if ((fMiniHeader->fMagicWord[2] != 0x12) ||
-      (fMiniHeader->fMagicWord[1] != 0x34) ||
-      (fMiniHeader->fMagicWord[0] != 0x56)) {
-    Error("CheckMiniHeader", "wrong magic word!");
+  if (!miniHeader) miniHeader = fMiniHeader;
+  if ((miniHeader->fMagicWord[2] != 0x12) ||
+      (miniHeader->fMagicWord[1] != 0x34) ||
+      (miniHeader->fMagicWord[0] != 0x56)) {
     return kFALSE;
   }
   return kTRUE;
@@ -175,3 +181,12 @@ Bool_t AliRawReader::ReadNextChar(UChar_t& data)
   return kTRUE;
 }
 
+
+Int_t AliRawReader::CheckData() const
+{
+// check the consistency of the data
+// derived classes should overwrite the default method which returns 0 (no err)
+
+  return 0;
+}
+
index 7467532..2666781 100644 (file)
@@ -39,10 +39,15 @@ class AliRawReader: public TObject {
 
     virtual Bool_t   Reset() = 0;
 
+    enum {kErrMagic=1, kErrNoMiniHeader=2, kErrMiniMagic=3, 
+         kErrSize=4, kErrOutOfBounds=5};
+    virtual Int_t    CheckData() const;
+    Int_t            GetErrorCode() {return fErrorCode;};
+
   protected :
     Bool_t           IsSelected() const;
 
-    Bool_t           CheckMiniHeader() const;
+    Bool_t           CheckMiniHeader(AliMiniHeader* miniHeader = NULL) const;
     virtual Bool_t   ReadNext(UChar_t* data, Int_t size) = 0;
 
     AliMiniHeader*   fMiniHeader;  // current mini header
@@ -52,6 +57,8 @@ class AliRawReader: public TObject {
     Int_t            fSelectMinDDLID;    // minimal index of selected DDLs (<0 = no selection)
     Int_t            fSelectMaxDDLID;    // maximal index of selected DDLs (<0 = no selection)
 
+    Int_t            fErrorCode;         // code of last error
+
     ClassDef(AliRawReader, 0) // base class for reading raw digits
 };
 
index f2f915a..235877c 100644 (file)
@@ -159,33 +159,69 @@ Bool_t AliRawReaderDate::ReadMiniHeader()
 // read a mini header at the current position
 // returns kFALSE if the mini header could not be read
 
+  fErrorCode = 0;
+
 #ifdef ALI_DATE
   if (!fEvent) return kFALSE;
+  // check whether there are sub events
+  if (fEvent->eventSize <= fEvent->eventHeadSize) return kFALSE;
+
   do {
-    if (fCount > 0) fPosition += fCount;      // skip payload if event was not selected
-    if (!fSubEvent || (fPosition >= fEnd)) {  // new sub event
-      if (fPosition >= ((UChar_t*)fEvent)+fEvent->eventSize) return kFALSE;  // end of data
+    // skip payload (if event was not selected)
+    if (fCount > 0) fPosition += fCount;
+
+    // get the first or the next sub event if at the end of a sub event
+    if (!fSubEvent || (fPosition >= fEnd)) {
+
+      // check for end of event data
+      if (fPosition >= ((UChar_t*)fEvent)+fEvent->eventSize) return kFALSE;
       if (fSubEvent) {
        fSubEvent = (eventHeaderStruct*) (((UChar_t*)fSubEvent) + 
                                          fSubEvent->eventSize);
       } else {
-       if (fEvent->eventSize <= fEvent->eventHeadSize) return kFALSE; // no sub events
        fSubEvent = (eventHeaderStruct*) (((UChar_t*)fEvent) + 
                                          fEvent->eventHeadSize);
       }
+
+      // check the magic word of the sub event
+      if (fSubEvent->eventMagic != EVENT_MAGIC_NUMBER) {
+       Error("ReadMiniHeader", "wrong magic number in sub event!\n"
+             " run: %d  event: %d %d  LDC: %d  GDC: %d\n", 
+             fSubEvent->eventRunNb, 
+             fSubEvent->eventId[0], fSubEvent->eventId[1],
+             fSubEvent->eventLdcId, fSubEvent->eventGdcId);
+       fErrorCode = kErrMagic;
+       return kFALSE;
+      }
+
       fCount = 0;
       fPosition = ((UChar_t*)fSubEvent) + fSubEvent->eventHeadSize + 
        sizeof(equipmentHeaderStruct);
       fEnd = ((UChar_t*)fSubEvent) + fSubEvent->eventSize;
     }
-    if (fPosition >= fEnd) continue;          // no data left in the payload
+
+    // continue with the next sub event if no data left in the payload
+    if (fPosition >= fEnd) continue;
+
+    // check that there are enough bytes left for the mini header
     if (fPosition + sizeof(AliMiniHeader) > fEnd) {
-      Error("ReadMiniHeader", "could not read data!");
-      return kFALSE;
+      Error("ReadMiniHeader", "could not read mini header data!");
+      Warning("ReadMiniHeader", "skipping %d bytes\n"
+             " run: %d  event: %d %d  LDC: %d  GDC: %d\n", 
+             fEnd - fPosition, fSubEvent->eventRunNb, 
+             fSubEvent->eventId[0], fSubEvent->eventId[1],
+             fSubEvent->eventLdcId, fSubEvent->eventGdcId);
+      fCount = 0;
+      fPosition = fEnd;
+      fErrorCode = kErrNoMiniHeader;
+      continue;
     }
+
+    // "read" and check the mini header
     fMiniHeader = (AliMiniHeader*) fPosition;
     fPosition += sizeof(AliMiniHeader);
     if (!CheckMiniHeader()) {
+      Error("ReadMiniHeader", "wrong magic word in mini header!");
       Warning("ReadMiniHeader", "skipping %d bytes\n"
              " run: %d  event: %d %d  LDC: %d  GDC: %d\n", 
              fEnd - fPosition, fSubEvent->eventRunNb, 
@@ -193,10 +229,13 @@ Bool_t AliRawReaderDate::ReadMiniHeader()
              fSubEvent->eventLdcId, fSubEvent->eventGdcId);
       fCount = 0;
       fPosition = fEnd;
+      fErrorCode = kErrMiniMagic;
       continue;
     }
     fCount = fMiniHeader->fSize;
-    if (fPosition + fCount > fEnd) {  // check data size in mini header and sub event
+
+    // check consistency of data size in the mini header and in the sub event
+    if (fPosition + fCount > fEnd) {
       Error("ReadMiniHeader", "size in mini header exceeds event size!");
       Warning("ReadMiniHeader", "skipping %d bytes\n"
              " run: %d  event: %d %d  LDC: %d  GDC: %d\n", 
@@ -205,9 +244,12 @@ Bool_t AliRawReaderDate::ReadMiniHeader()
              fSubEvent->eventLdcId, fSubEvent->eventGdcId);
       fCount = 0;
       fPosition = fEnd;
+      fErrorCode = kErrSize;
       continue;
     }
+
   } while (!IsSelected());
+
   return kTRUE;
 #else
   return kFALSE;
@@ -219,6 +261,7 @@ Bool_t AliRawReaderDate::ReadNextData(UChar_t*& data)
 // reads the next payload at the current position
 // returns kFALSE if the data could not be read
 
+  fErrorCode = 0;
   while (fCount == 0) {
     if (!ReadMiniHeader()) return kFALSE;
   }
@@ -233,8 +276,10 @@ Bool_t AliRawReaderDate::ReadNext(UChar_t* data, Int_t size)
 // reads the next block of data at the current position
 // returns kFALSE if the data could not be read
 
+  fErrorCode = 0;
   if (fPosition + size > fEnd) {
     Error("ReadNext", "could not read data!");
+    fErrorCode = kErrOutOfBounds;
     return kFALSE;
   }
   memcpy(data, fPosition, size);
@@ -255,3 +300,59 @@ Bool_t AliRawReaderDate::Reset()
   fPosition = fEnd = NULL;
   return kTRUE;
 }
+
+
+Int_t AliRawReaderDate::CheckData() const
+{
+// check the consistency of the data
+
+#ifdef ALI_DATE
+  if (!fEvent) return 0;
+  // check whether there are sub events
+  if (fEvent->eventSize <= fEvent->eventHeadSize) return 0;
+
+  eventHeaderStruct* subEvent = NULL;
+  UChar_t* position = 0;
+  UChar_t* end = 0;
+
+  while (kTRUE) {
+    // get the first or the next sub event if at the end of a sub event
+    if (!subEvent || (position >= end)) {
+
+      // check for end of event data
+      if (position >= ((UChar_t*)fEvent)+fEvent->eventSize) return 0;
+      if (subEvent) {
+       subEvent = (eventHeaderStruct*) (((UChar_t*)subEvent) + 
+                                        subEvent->eventSize);
+      } else {
+       subEvent = (eventHeaderStruct*) (((UChar_t*)fEvent) + 
+                                        fEvent->eventHeadSize);
+      }
+
+      // check the magic word of the sub event
+      if (subEvent->eventMagic != EVENT_MAGIC_NUMBER) return kErrMagic;
+
+      position = ((UChar_t*)subEvent) + subEvent->eventHeadSize + 
+       sizeof(equipmentHeaderStruct);
+      end = ((UChar_t*)subEvent) + subEvent->eventSize;
+    }
+
+    // continue with the next sub event if no data left in the payload
+    if (position >= end) continue;
+
+    // check that there are enough bytes left for the mini header
+    if (position + sizeof(AliMiniHeader) > end) return kErrNoMiniHeader;
+
+    // "read" and check the mini header
+    AliMiniHeader* miniHeader = (AliMiniHeader*) position;
+    position += sizeof(AliMiniHeader);
+    if (!CheckMiniHeader(miniHeader)) return kErrMiniMagic;
+
+    // check consistency of data size in the mini header and in the sub event
+    if (position + miniHeader->fSize > end) return kErrSize;
+    position += miniHeader->fSize;
+  };
+
+#endif
+  return 0;
+}
index 57932d6..2119261 100644 (file)
@@ -28,6 +28,8 @@ class AliRawReaderDate: public AliRawReader {
 
     virtual Bool_t   Reset();
 
+    virtual Int_t    CheckData() const;
+
   protected :
     virtual Bool_t   ReadNext(UChar_t* data, Int_t size);
 
index 75eda6b..d5d9214 100644 (file)
@@ -184,41 +184,75 @@ Bool_t AliRawReaderRoot::ReadMiniHeader()
 // read a mini header at the current position
 // returns kFALSE if the mini header could not be read
 
+  fErrorCode = 0;
   if (!fEvent) return kFALSE;
+
   do {
-    if (fCount > 0) fPosition += fCount;      // skip payload if event was not selected
-    if (!fSubEvent || (fPosition >= fEnd)) {  // new sub event
+    // skip payload (if event was not selected)
+    if (fCount > 0) fPosition += fCount;
+
+    // get the first or the next sub event if at the end of a sub event
+    if (!fSubEvent || (fPosition >= fEnd)) {
+
+      // check for end of event data
       if (fSubEventIndex >= fEvent->GetNSubEvents()) return kFALSE;
       fSubEvent = fEvent->GetSubEvent(fSubEventIndex++);
+
+      // check the magic word of the sub event
+      if (!fSubEvent->GetHeader()->IsValid()) {
+       Error("ReadMiniHeader", "wrong magic number in sub event!");
+       fSubEvent->GetHeader()->Dump();
+       fErrorCode = kErrMagic;
+       return kFALSE;
+      }
+
       fRawData = fSubEvent->GetRawData();
       fCount = 0;
       fPosition = (UChar_t*) fRawData->GetBuffer();
       fEnd = ((UChar_t*) fRawData->GetBuffer()) + fRawData->GetSize();
     }
-    if (fPosition >= fEnd) continue;          // no data left in the payload
+
+    // continue with the next sub event if no data left in the payload
+    if (fPosition >= fEnd) continue;
+
+    // check that there are enough bytes left for the mini header
     if (fPosition + sizeof(AliMiniHeader) > fEnd) {
-      Error("ReadMiniHeader", "could not read data!");
-      return kFALSE;
+      Error("ReadMiniHeader", "could not read mini header data!");
+      Warning("ReadMiniHeader", "skipping %d bytes", fEnd - fPosition);
+      fSubEvent->GetHeader()->Dump();
+      fCount = 0;
+      fPosition = fEnd;
+      fErrorCode = kErrNoMiniHeader;
+      continue;
     }
+
+    // "read" and check the mini header
     fMiniHeader = (AliMiniHeader*) fPosition;
     fPosition += sizeof(AliMiniHeader);
     if (!CheckMiniHeader()) {
+      Error("ReadMiniHeader", "wrong magic word in mini header!");
       Warning("ReadMiniHeader", "skipping %d bytes", fEnd - fPosition);
       fSubEvent->GetHeader()->Dump();
       fCount = 0;
       fPosition = fEnd;
+      fErrorCode = kErrMiniMagic;
       continue;
     }
     fCount = fMiniHeader->fSize;
-    if (fPosition + fCount > fEnd) {  // check data size in mini header and sub event
+
+    // check consistency of data size in the mini header and in the sub event
+    if (fPosition + fCount > fEnd) {  
       Error("ReadMiniHeader", "size in mini header exceeds event size!");
       Warning("ReadMiniHeader", "skipping %d bytes", fEnd - fPosition);
       fSubEvent->GetHeader()->Dump();
       fCount = 0;
       fPosition = fEnd;
+      fErrorCode = kErrSize;
       continue;
     }
+
   } while (!IsSelected());
+
   return kTRUE;
 }
 
@@ -227,6 +261,7 @@ Bool_t AliRawReaderRoot::ReadNextData(UChar_t*& data)
 // reads the next payload at the current position
 // returns kFALSE if the data could not be read
 
+  fErrorCode = 0;
   while (fCount == 0) {
     if (!ReadMiniHeader()) return kFALSE;
   }
@@ -241,8 +276,10 @@ Bool_t AliRawReaderRoot::ReadNext(UChar_t* data, Int_t size)
 // reads the next block of data at the current position
 // returns kFALSE if the data could not be read
 
+  fErrorCode = 0;
   if (fPosition + size > fEnd) {
     Error("ReadNext", "could not read data!");
+    fErrorCode = kErrOutOfBounds;
     return kFALSE;
   }
   memcpy(data, fPosition, size);
@@ -266,3 +303,47 @@ Bool_t AliRawReaderRoot::Reset()
   return kTRUE;
 }
 
+
+Int_t AliRawReaderRoot::CheckData() const
+{
+// check the consistency of the data
+
+  if (!fEvent) return 0;
+
+  AliRawEvent* subEvent = NULL;
+  Int_t subEventIndex = 0;
+  UChar_t* position = 0;
+  UChar_t* end = 0;
+
+  while (kTRUE) {
+    // get the first or the next sub event if at the end of a sub event
+    if (!subEvent || (position >= end)) {
+
+      // check for end of event data
+      if (subEventIndex >= fEvent->GetNSubEvents()) return 0;
+      subEvent = fEvent->GetSubEvent(subEventIndex++);
+
+      // check the magic word of the sub event
+      if (!fSubEvent->GetHeader()->IsValid()) return kErrMagic;
+
+      AliRawData* rawData = subEvent->GetRawData();
+      position = (UChar_t*) rawData->GetBuffer();
+      end = ((UChar_t*) rawData->GetBuffer()) + rawData->GetSize();
+    }
+
+    // continue with the next sub event if no data left in the payload
+    if (position >= end) continue;
+
+    // check that there are enough bytes left for the mini header
+    if (position + sizeof(AliMiniHeader) > end) return kErrNoMiniHeader;
+
+    // "read" and check the mini header
+    AliMiniHeader* miniHeader = (AliMiniHeader*) position;
+    position += sizeof(AliMiniHeader);
+    if (!CheckMiniHeader(miniHeader)) return kErrMiniMagic;
+
+    // check consistency of data size in the mini header and in the sub event
+    if (position + miniHeader->fSize > end) return kErrSize;
+    position += miniHeader->fSize;
+  };
+}
index ab98a43..4705ea0 100644 (file)
@@ -31,6 +31,8 @@ class AliRawReaderRoot: public AliRawReader {
 
     virtual Bool_t   Reset();
 
+    virtual Int_t    CheckData() const;
+
   protected :
     virtual Bool_t   ReadNext(UChar_t* data, Int_t size);