Bugfix in raw data reader classes. The bug affected the determination of the raw...
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 29 May 2006 12:37:04 +0000 (12:37 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 29 May 2006 12:37:04 +0000 (12:37 +0000)
12 files changed:
RAW/AliAltroRawStreamOld.cxx
RAW/AliRawReader.h
RAW/AliRawReaderDate.cxx
RAW/AliRawReaderDate.h
RAW/AliRawReaderDateV3.cxx
RAW/AliRawReaderDateV3.h
RAW/AliRawReaderFile.cxx
RAW/AliRawReaderFile.h
RAW/AliRawReaderMemory.cxx
RAW/AliRawReaderMemory.h
RAW/AliRawReaderRoot.cxx
RAW/AliRawReaderRoot.h

index 6a6b904..13d264b 100644 (file)
@@ -50,11 +50,6 @@ AliAltroRawStreamOld::AliAltroRawStreamOld(AliRawReader* rawReader) :
 {
 // create an object to read Altro raw digits
   fSegmentation[0] = fSegmentation[1] = fSegmentation[2] = -1;
-
-  // Invalid Common Data Header is used
-  // --> therefore skip the header and read
-  // only the payload
-  rawReader->RequireHeader(kFALSE);
 }
 
 //_____________________________________________________________________________
@@ -274,24 +269,20 @@ Int_t AliAltroRawStreamOld::GetPosition()
 
   // Get the payload size from the RCU trailer
   // The trailer is actually one 32-bit word
-  Int_t position = (fData[fRawReader->GetDataSize()-29]) << 24;
-  position |= (fData[fRawReader->GetDataSize()-30]) << 16;
-  position |= (fData[fRawReader->GetDataSize()-31]) << 8;
-  position |= (fData[fRawReader->GetDataSize()-32]);
+  Int_t position = (fData[fRawReader->GetDataSize()-1]) << 24;
+  position |= (fData[fRawReader->GetDataSize()-2]) << 16;
+  position |= (fData[fRawReader->GetDataSize()-3]) << 8;
+  position |= (fData[fRawReader->GetDataSize()-4]);
   // The size is specified in a number of 40bits
   // Therefore we need to transform it to number of bytes
   position *= 5;
 
   // Check the consistency of the header and trailer
-  if ((fRawReader->GetDataSize() - 64) != position)
-    AliFatal(Form("Inconsistent raw data size ! Expected %d bytes (from the header), found %d words (in the RCU trailer)!",
-                 fRawReader->GetDataSize()-64,
+  if ((fRawReader->GetDataSize() - 4) != position)
+    AliFatal(Form("Inconsistent raw data size ! Expected %d bytes (from the header), found %d bytes (in the RCU trailer)!",
+                 fRawReader->GetDataSize()-4,
                  position));
 
-  // Skip the Common Data Header which contains
-  // only 7 (!) words
-  fData += 32;
-
   // Return the position in units of 10-bit words
   return position*8/10;
 }
index d07e910..13411b7 100644 (file)
@@ -30,7 +30,7 @@ class AliRawReader: public TObject {
     void             SkipInvalid(Bool_t skip = kTRUE)
       {fSkipInvalid = skip;};
     void             SelectEvents(Int_t type);
-    void             RequireHeader(Bool_t required = kTRUE)
+    virtual void     RequireHeader(Bool_t required)
       {fRequireHeader = required;};
 
     virtual UInt_t   GetType() const = 0;
@@ -48,6 +48,7 @@ class AliRawReader: public TObject {
     virtual Int_t    GetEquipmentId() const = 0;
     virtual const UInt_t* GetEquipmentAttributes() const = 0;
     virtual Int_t    GetEquipmentElementSize() const = 0;
+    virtual Int_t    GetEquipmentHeaderSize() const = 0;
 
     Int_t            GetDetectorID() const 
       {if (GetEquipmentId() >= 0) return (GetEquipmentId() >> 8); else return -1;};
@@ -57,8 +58,8 @@ class AliRawReader: public TObject {
     Int_t            GetDataSize() const 
       {if (fHeader) {
        if (fHeader->fSize != 0xFFFFFFFF) return fHeader->fSize - sizeof(AliRawDataHeader); 
-       else return GetEquipmentSize() - sizeof(AliRawDataHeader);
-      } else return GetEquipmentSize();};
+       else return GetEquipmentSize() - GetEquipmentHeaderSize() - sizeof(AliRawDataHeader);
+      } else return GetEquipmentSize() - GetEquipmentHeaderSize();};
 
     Int_t            GetVersion() const 
       {if (fHeader) return fHeader->fVersion; else return -1;};
index 64e7603..cce49d5 100644 (file)
@@ -247,14 +247,14 @@ UInt_t AliRawReaderDate::GetGDCId() const
 
 Int_t AliRawReaderDate::GetEquipmentSize() const
 {
-// get the size of the equipment (without header)
+// get the size of the equipment (including the header)
 
 #ifdef ALI_DATE
   if (!fEquipment) return 0;
   if (fSubEvent->eventVersion <= 0x00030001) {
-    return fEquipment->equipmentSize;
+    return fEquipment->equipmentSize + sizeof(equipmentHeaderStruct);
   } else {
-    return fEquipment->equipmentSize - sizeof(equipmentHeaderStruct);
+    return fEquipment->equipmentSize;
   }
 #else
   return 0;
@@ -309,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()
 {
@@ -402,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);
     }
 
@@ -582,8 +598,12 @@ Int_t AliRawReaderDate::CheckData() const
 
       // 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) result |= kErrSize;
+      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;
index 232d311..5a67e2c 100644 (file)
@@ -38,6 +38,7 @@ class AliRawReaderDate: public AliRawReader {
     virtual Int_t    GetEquipmentId() const;
     virtual const UInt_t* GetEquipmentAttributes() const;
     virtual Int_t    GetEquipmentElementSize() const;
+    virtual Int_t    GetEquipmentHeaderSize() const;
 
     virtual Bool_t   ReadHeader();
     virtual Bool_t   ReadNextData(UChar_t*& data);
index 1efebe3..3bc53c8 100644 (file)
@@ -236,6 +236,12 @@ Int_t AliRawReaderDateV3::GetEquipmentElementSize() const
   return 0;
 }
 
+Int_t AliRawReaderDateV3::GetEquipmentHeaderSize() const
+{
+// get the size of the equipment header
+
+  return 0;
+}
 
 Bool_t AliRawReaderDateV3::ReadHeader()
 {
@@ -303,6 +309,12 @@ Bool_t AliRawReaderDateV3::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);
     }
 
@@ -465,8 +477,12 @@ Int_t AliRawReaderDateV3::CheckData() const
 
       // 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) result |= kErrSize;
+      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;
index 3cec6e1..2573998 100644 (file)
@@ -37,6 +37,7 @@ class AliRawReaderDateV3: public AliRawReader {
     virtual Int_t    GetEquipmentId() const;
     virtual const UInt_t* GetEquipmentAttributes() const;
     virtual Int_t    GetEquipmentElementSize() const;
+    virtual Int_t    GetEquipmentHeaderSize() const;
 
     virtual Bool_t   ReadHeader();
     virtual Bool_t   ReadNextData(UChar_t*& data);
index ebc97d5..cab31b8 100644 (file)
@@ -100,6 +100,16 @@ AliRawReaderFile::~AliRawReaderFile()
   if (fBuffer) delete[] fBuffer;
 }
 
+void AliRawReaderFile::RequireHeader(Bool_t required)
+{
+  // Reading of raw data in case of missing
+  // raw data header is not implemented for
+  // this class
+  if (!required)
+    Fatal("AliRawReaderFile","Reading of raw data without raw data header is not implemented !");
+
+  AliRawReader::RequireHeader(required);
+}
 
 TString AliRawReaderFile::GetDirName() const
 {
index 33ebbc1..a3e2519 100644 (file)
@@ -28,6 +28,8 @@ class AliRawReaderFile: public AliRawReader {
     AliRawReaderFile& operator = (const AliRawReaderFile& rawReader);
     virtual ~AliRawReaderFile();
 
+    virtual void     RequireHeader(Bool_t required);
+
     virtual UInt_t   GetType() const {return 0;};
     virtual UInt_t   GetRunNumber() const {return 0;};
     virtual const UInt_t* GetEventId() const {return 0;};
@@ -43,6 +45,7 @@ class AliRawReaderFile: public AliRawReader {
     virtual Int_t    GetEquipmentId() const {return fEquipmentId;};
     virtual const UInt_t* GetEquipmentAttributes() const {return NULL;};
     virtual Int_t    GetEquipmentElementSize() const {return 0;};
+    virtual Int_t    GetEquipmentHeaderSize() const {return 0;};
 
     virtual Bool_t   ReadHeader();
     virtual Bool_t   ReadNextData(UChar_t*& data);
index e80789a..392517b 100644 (file)
@@ -70,6 +70,17 @@ AliRawReaderMemory& AliRawReaderMemory::operator = (const AliRawReaderMemory&
   return *this;
 }
 
+void AliRawReaderMemory::RequireHeader(Bool_t required)
+{
+  // Reading of raw data in case of missing
+  // raw data header is not implemented for
+  // this class
+  if (!required)
+    Fatal("AliRawReaderMemory","Reading of raw data without raw data header is not implemented !");
+
+  AliRawReader::RequireHeader(required);
+}
+
 Bool_t AliRawReaderMemory::ReadHeader()
 {
 // read a data header at the current buffer position
@@ -80,7 +91,13 @@ Bool_t AliRawReaderMemory::ReadHeader()
     if ( fPosition+fCount+sizeof(AliRawDataHeader) > fBufferSize ) return kFALSE;
 
     memcpy( fHeader, fBuffer+fPosition+fCount, sizeof(AliRawDataHeader) );
-    fPosition += fCount+sizeof(AliRawDataHeader);
+    if (fHeader->fSize == 0) {
+      Warning("ReadHeader",
+             "Missing raw data header! Using the size of the memory buffer instead (%d) !",
+             fBufferSize - fPosition - fCount);
+       fHeader->fSize = fBufferSize - fPosition - fCount;
+      }
+    fPosition += fCount + sizeof(AliRawDataHeader);
 
     if (fHeader->fSize != 0xFFFFFFFF) {
       // Check for fHeader->fSize < sizeof(AliRawDataHeader) ????
index 50e8d96..a0a5ebd 100644 (file)
@@ -28,6 +28,8 @@ class AliRawReaderMemory: public AliRawReader {
 /*     AliRawReaderMemory& operator = (const AliRawReaderMemory& rawReader); */
     virtual ~AliRawReaderMemory();
 
+    virtual void     RequireHeader(Bool_t required);
+
     virtual UInt_t   GetType() const {return 0;};
     virtual UInt_t   GetRunNumber() const {return 0;};
     virtual const UInt_t* GetEventId() const {return 0;};
@@ -43,6 +45,7 @@ class AliRawReaderMemory: public AliRawReader {
     virtual Int_t    GetEquipmentId() const {return fEquipmentId;};
     virtual const UInt_t* GetEquipmentAttributes() const {return NULL;};
     virtual Int_t    GetEquipmentElementSize() const {return 0;};
+    virtual Int_t    GetEquipmentHeaderSize() const {return 0;};
 
     virtual Bool_t   ReadHeader();
     virtual Bool_t   ReadNextData(UChar_t*& data);
index a32bafc..6d1799f 100644 (file)
@@ -300,6 +300,14 @@ Int_t AliRawReaderRoot::GetEquipmentElementSize() const
   return fEquipment->GetEquipmentHeader()->GetBasicSizeType();
 }
 
+Int_t AliRawReaderRoot::GetEquipmentHeaderSize() const
+{
+// get the size of the equipment header (28 bytes by default)
+
+  if (!fEvent || !fEquipment || !fEquipment->GetEquipmentHeader()) return 0;
+  return fEquipment->GetEquipmentHeader()->HeaderSize();
+}
+
 
 Bool_t AliRawReaderRoot::ReadHeader()
 {
@@ -366,6 +374,12 @@ Bool_t AliRawReaderRoot::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);
     }
 
@@ -525,10 +539,15 @@ Int_t AliRawReaderRoot::CheckData() const
 
       // check consistency of data size in the header and in the equipment
       AliRawDataHeader* header = (AliRawDataHeader*) position;
-      if (header->fSize != 0xFFFFFFFF) {
-       if (position + header->fSize > end) result |= kErrSize;
+      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;
   };
 
   return result;
index 1a9ed00..a6ca802 100644 (file)
@@ -43,6 +43,7 @@ class AliRawReaderRoot: public AliRawReader {
     virtual Int_t    GetEquipmentId() const;
     virtual const UInt_t* GetEquipmentAttributes() const;
     virtual Int_t    GetEquipmentElementSize() const;
+    virtual Int_t    GetEquipmentHeaderSize() const;
 
     virtual Bool_t   ReadHeader();
     virtual Bool_t   ReadNextData(UChar_t*& data);