]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RAW/AliRawEventHeaderBase.cxx
Updates for the ROOT trunk
[u/mrichter/AliRoot.git] / RAW / AliRawEventHeaderBase.cxx
index a4ba528a88243d113a08f8fffd95970e16608c20..675d339e4f21b0089d4fbcf5e9ae803dcce9c4b6 100644 (file)
@@ -1,5 +1,3 @@
-// Author: Cvetan Cheshkov  10/10/2005
-
 /**************************************************************************
  * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
+/* $Id$ */
+
+// Author: Cvetan Cheshkov  10/10/2005
+
 //////////////////////////////////////////////////////////////////////////
 //                                                                      //
 // AliRawEventHeaderBase                                                //
 
 #include <unistd.h>
 
+#include <Bytes.h>
 #include <TClass.h>
 #include <TDataMember.h>
+#include <TList.h>
 #include <TMethodCall.h>
 
 #include "AliLog.h"
 #include "AliRawEventHeaderBase.h"
 
+#include <Riostream.h>
 
 ClassImp(AliRawEventHeaderBase)
 
+//______________________________________________________________________________
+AliRawEventHeaderBase::AliRawEventHeaderBase():
+fSize(0),
+fMagic(0),
+fHeadSize(0),
+fVersion(0),
+fExtendedDataSize(0),
+fExtendedAllocSize(0),
+fExtendedData(NULL),
+fIsSwapped(kFALSE),
+fHeaderSize(0),
+fHeaderBegin(NULL),
+fFirstEqIndex(-1),
+fLastEqIndex(-1)
+{
+  // Default constructor
+}
 
 //______________________________________________________________________________
-void *AliRawEventHeaderBase::HeaderBegin()
+void *AliRawEventHeaderBase::HeaderBegin() const
 {
   // Returns the pointer to the first data member
   // beyond the base class data members
 
+  if (fHeaderBegin) return fHeaderBegin;
+
   TList *datalist = IsA()->GetListOfDataMembers();
   TIter next(datalist);                           
   TDataMember *member = (TDataMember *)next();
@@ -49,7 +73,10 @@ void *AliRawEventHeaderBase::HeaderBegin()
   if(!strcmp(member->GetTypeName(),"TClass"))
     member = (TDataMember *)next();
 
-  return (void *)((char *)this+member->GetOffset());
+  void *ptr = (void *)((char *)this+member->GetOffset());
+  const_cast<AliRawEventHeaderBase*>(this)->fHeaderBegin = ptr;
+
+  return ptr;
 }
 
 //______________________________________________________________________________
@@ -58,6 +85,8 @@ Int_t AliRawEventHeaderBase::HeaderSize() const
   // Returns the size of the data members list
   // beyond the base class data members
 
+  if (fHeaderSize) return fHeaderSize;
+
   Int_t size = 0;
 
   TList *datalist = IsA()->GetListOfDataMembers();
@@ -73,10 +102,20 @@ Int_t AliRawEventHeaderBase::HeaderSize() const
       for(UInt_t i=0;i<ndim;i++) size += member->GetMaxIndex(i)*unitsize;
   }
 
+  const_cast<AliRawEventHeaderBase*>(this)->fHeaderSize = size;
+
   return size;
 }
 
 //______________________________________________________________________________
+UInt_t AliRawEventHeaderBase::SwapWord(UInt_t x) const
+{
+   // Swap the endianess of the integer value 'x'
+
+   return (((x & 0x000000ffU) << 24) | ((x & 0x0000ff00U) <<  8) |
+           ((x & 0x00ff0000U) >>  8) | ((x & 0xff000000U) >> 24));
+}
+
 void AliRawEventHeaderBase::Swap()
 {
    // Swap base header data.
@@ -86,20 +125,30 @@ void AliRawEventHeaderBase::Swap()
 
    if (IsSwapped()) {
       fIsSwapped    = kTRUE;
-      fSize         = net2host(fSize);
-      fMagic        = net2host(fMagic);
-      fHeadSize     = net2host(fHeadSize);
-      fVersion      = net2host(fVersion);
+      fSize         = SwapWord(fSize);
+      fMagic        = SwapWord(fMagic);
+      fHeadSize     = SwapWord(fHeadSize);
+      fVersion      = SwapWord(fVersion);
    }
 }
 
 //______________________________________________________________________________
-const char *AliRawEventHeaderBase::GetTypeName()
+const char *AliRawEventHeaderBase::GetTypeName() const
 {
    // Get event type as a string.
    // Will fail in case data header
    // does not contain eventType field
-   Int_t eventType = Get("Type");
+   UInt_t eventType = Get("Type");
+
+   return GetTypeName(eventType);
+}
+
+//______________________________________________________________________________
+const char *AliRawEventHeaderBase::GetTypeName(UInt_t eventType)
+{
+  // Get event type as a string.
+  // Static method that could be used
+  // from everywhere inside aliroot
 
    switch (eventType) {
       case kStartOfRun:
@@ -222,16 +271,25 @@ 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);
     }
   }
 
   return hdr;
 }
 
+void AliRawEventHeaderBase::SwapData(const void* inbuf, const void* outbuf, UInt_t size) {
+  // The method swaps the contents of the
+  // raw-data event header
+  UInt_t  intCount = size/sizeof(UInt_t);
+
+  UInt_t* buf = (UInt_t*) inbuf;    // temporary integers buffer
+  for (UInt_t i=0; i<intCount; i++, buf++) {
+      UInt_t value = SwapWord(*buf);
+      memcpy((UInt_t*)outbuf+i, &value, sizeof(UInt_t)); 
+  }
+}
+
 //______________________________________________________________________________
 Int_t AliRawEventHeaderBase::ReadHeader(char*& data)
 {
@@ -241,31 +299,68 @@ Int_t AliRawEventHeaderBase::ReadHeader(char*& data)
   Long_t start = (Long_t)data;
   // Swap header data if needed
   if (DataIsSwapped()) {
-    swab(data,HeaderBaseBegin(), HeaderBaseSize());
+    SwapData(data, HeaderBaseBegin(), HeaderBaseSize());
     data += HeaderBaseSize();
-    swab(data, HeaderBegin(), HeaderSize());
+    SwapData(data, HeaderBegin(), HeaderSize());
     data += HeaderSize();
-    if(GetExtendedDataSize()>0) {
-      swab(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);
 }
 
 //______________________________________________________________________________
-UInt_t AliRawEventHeaderBase::Get(const char *datamember)
+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
 {
   // The method to get a data member from the header object
   // Except for the data members of the base class, all the
@@ -274,7 +369,7 @@ UInt_t AliRawEventHeaderBase::Get(const char *datamember)
   // in front
 
   char buf[256] = "f";
-  strcat(buf,datamember);
+  strncat(buf,datamember,sizeof(buf)-2);
 
   TDataMember *member = IsA()->GetDataMember(buf);
   if (!member) {
@@ -298,7 +393,7 @@ UInt_t AliRawEventHeaderBase::Get(const char *datamember)
 }
 
 //______________________________________________________________________________
-const UInt_t* AliRawEventHeaderBase::GetP(const char *datamember)
+const UInt_t* AliRawEventHeaderBase::GetP(const char *datamember) const
 {
   // The method to get a data member from the header object
   // Except for the data members of the base class, all the
@@ -307,7 +402,7 @@ const UInt_t* AliRawEventHeaderBase::GetP(const char *datamember)
   // in front
 
   char buf[256] = "f";
-  strcat(buf,datamember);
+  strncat(buf,datamember,sizeof(buf)-2);
 
   TDataMember *member = IsA()->GetDataMember(buf);
   if (!member) {
@@ -329,3 +424,65 @@ const UInt_t* AliRawEventHeaderBase::GetP(const char *datamember)
 
   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;
+}
+
+//_____________________________________________________________________________
+void AliRawEventHeaderBase::AddEqIndex(Int_t index)
+{
+  // Adds an equipment by changing properly
+  // the first and last equipment indexes
+  if (fFirstEqIndex < 0) fFirstEqIndex = index; 
+  if (index > fLastEqIndex) fLastEqIndex = index;
+}
+
+//_____________________________________________________________________________
+void AliRawEventHeaderBase::Reset()
+{
+  fFirstEqIndex = fLastEqIndex = -1;
+}
+
+//______________________________________________________________________________
+void AliRawEventHeaderBase::Streamer(TBuffer &R__b)
+{
+   // Stream an object of class AliRawEventHeaderBase.
+
+   if (R__b.IsReading()) {
+      UInt_t R__s, R__c;
+      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
+      if (R__v > 3) {
+       R__b.ReadClassBuffer(AliRawEventHeaderBase::Class(),this,R__v,R__s,R__c);
+       return;
+      }
+      TObject::Streamer(R__b);
+      R__b >> fSize;
+      R__b >> fMagic;
+      R__b >> fHeadSize;
+      R__b >> fVersion;
+      R__b >> fExtendedDataSize;
+      delete [] fExtendedData;
+      fExtendedData = new char[fExtendedDataSize];
+      R__b.ReadFastArray(fExtendedData,fExtendedDataSize);
+      R__b >> fIsSwapped;
+      R__b.CheckByteCount(R__s, R__c, AliRawEventHeaderBase::IsA());
+   } else {
+      R__b.WriteClassBuffer(AliRawEventHeaderBase::Class(),this);
+   }
+}