]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RAW/AliRawEventHeaderBase.cxx
load libPWG3vertexingHF
[u/mrichter/AliRoot.git] / RAW / AliRawEventHeaderBase.cxx
index 12b852ffca133079204ff2d12e15914418dc7b70..742d0623c404be7bc99eec3260ab0144b947dd56 100644 (file)
@@ -36,6 +36,7 @@
 #include "AliLog.h"
 #include "AliRawEventHeaderBase.h"
 
+#include <Riostream.h>
 
 ClassImp(AliRawEventHeaderBase)
 
@@ -46,6 +47,7 @@ fMagic(0),
 fHeadSize(0),
 fVersion(0),
 fExtendedDataSize(0),
+fExtendedAllocSize(0),
 fExtendedData(NULL),
 fIsSwapped(kFALSE)
 {
@@ -118,7 +120,7 @@ void AliRawEventHeaderBase::Swap()
 }
 
 //______________________________________________________________________________
-const char *AliRawEventHeaderBase::GetTypeName()
+const char *AliRawEventHeaderBase::GetTypeName() const
 {
    // Get event type as a string.
    // Will fail in case data header
@@ -246,10 +248,7 @@ AliRawEventHeaderBase* AliRawEventHeaderBase::Create(char*& data)
   }
   else {
     if (extsize > 0) {
-      hdr->SetExtendedDataSize(extsize);
-      char *extdata = new char[extsize];
-      memset(extdata,0,extsize);
-      hdr->SetExtendedData(extdata);
+      hdr->AllocateExtendedData(extsize);
     }
   }
 
@@ -281,25 +280,62 @@ Int_t AliRawEventHeaderBase::ReadHeader(char*& data)
     data += HeaderBaseSize();
     SwapData(data, HeaderBegin(), HeaderSize());
     data += HeaderSize();
-    if(GetExtendedDataSize()>0) {
-      SwapData(data, GetExtendedData(), GetExtendedDataSize());
-      data += GetExtendedDataSize();
-    }
   }
   else {
     memcpy(HeaderBaseBegin(), data, HeaderBaseSize());
     data += HeaderBaseSize();
     memcpy(HeaderBegin(), data, HeaderSize());
     data += HeaderSize();
-    if(GetExtendedDataSize()>0) {
-      memcpy(GetExtendedData(), data, GetExtendedDataSize());
-      data += GetExtendedDataSize();
-    }
   }
+  data += ReadExtendedData(data);
 
   return (Int_t)((Long_t)data - start);
 }
 
+//______________________________________________________________________________
+void AliRawEventHeaderBase::AllocateExtendedData(Int_t extsize)
+{
+  // Allocate the space for the header
+  // extended data
+  if (fExtendedData) delete [] fExtendedData;
+  
+  fExtendedDataSize = fExtendedAllocSize = extsize;
+  fExtendedData = new char[fExtendedAllocSize];
+  memset(fExtendedData,0,fExtendedAllocSize);
+}
+
+//______________________________________________________________________________
+Int_t AliRawEventHeaderBase::ReadExtendedData(char*& data)
+{
+  // Read extended header data
+  // Reallocates memory if the present
+  // buffer is insufficient
+  Int_t extsize = (Int_t)GetHeadSize() - (HeaderBaseSize() + HeaderSize());
+
+  if (extsize == 0) {
+    fExtendedDataSize = 0;
+    return 0;
+  }
+
+  if (extsize < 0) {
+    AliFatal(Form("Invalid header size (%d < %d +%d)!",
+                 GetHeadSize(),HeaderBaseSize(),HeaderSize()));
+    // try recovery... how?
+    return 0;
+  }
+
+  fExtendedDataSize = extsize;
+  if (fExtendedDataSize > fExtendedAllocSize)
+    AllocateExtendedData(fExtendedDataSize);
+
+  if (DataIsSwapped())
+    SwapData(data, fExtendedData, fExtendedDataSize);
+  else
+    memcpy(fExtendedData, data, fExtendedDataSize);
+
+  return fExtendedDataSize;
+}
+
 //______________________________________________________________________________
 UInt_t AliRawEventHeaderBase::Get(const char *datamember) const
 {
@@ -365,3 +401,22 @@ const UInt_t* AliRawEventHeaderBase::GetP(const char *datamember) const
 
   return (const UInt_t*)pointer;
 }
+
+//_____________________________________________________________________________
+void AliRawEventHeaderBase::Print( const Option_t* opt ) const
+{
+  // Dumps the event or sub-event
+  // header fields
+
+  cout << opt << "  Event size: " << GetEventSize() << endl;
+  cout << opt << "  Event header size: " << GetHeadSize() << endl;
+  cout << opt << "  Event header version: " << GetMajorVersion() << "." << GetMinorVersion() << endl;
+  cout << opt << "  Event type: " << Get("Type") << "( " << GetTypeName() << " )" << endl;
+  cout << opt << "  Run Number: " << Get("RunNb") << endl;
+  const UInt_t *id = GetP("Id");
+  cout << opt << "  Period: " << (((id)[0]>>4)&0x0fffffff) << " Orbit: " << ((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff)) << " Bunch-crossing: " << ((id)[1]&0x00000fff) << endl;
+  cout << opt << "  Trigger pattern: " << GetP("TriggerPattern")[0] << "-" << GetP("TriggerPattern")[1] << endl;
+  cout << opt << "  Detector pattern: " << Get("DetectorPattern") << endl;
+  cout << opt << "  Type attribute: " << GetP("TypeAttribute")[0] << "-" << GetP("TypeAttribute")[1] << "-" << GetP("TypeAttribute")[2] << endl;
+  cout << opt << "  GDC: " << Get("GdcId") << " LDC: " << Get("LdcId") << endl;
+}