#include "AliLog.h"
#include "AliRawEventHeaderBase.h"
+#include <Riostream.h>
ClassImp(AliRawEventHeaderBase)
fHeadSize(0),
fVersion(0),
fExtendedDataSize(0),
+fExtendedAllocSize(0),
fExtendedData(NULL),
-fIsSwapped(kFALSE)
+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();
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;
}
//______________________________________________________________________________
// 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();
for(UInt_t i=0;i<ndim;i++) size += member->GetMaxIndex(i)*unitsize;
}
+ const_cast<AliRawEventHeaderBase*>(this)->fHeaderSize = size;
+
return size;
}
}
//______________________________________________________________________________
-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:
}
else {
if (extsize > 0) {
- hdr->SetExtendedDataSize(extsize);
- char *extdata = new char[extsize];
- memset(extdata,0,extsize);
- hdr->SetExtendedData(extdata);
+ hdr->AllocateExtendedData(extsize);
}
}
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
{
// in front
char buf[256] = "f";
- strcat(buf,datamember);
+ strncat(buf,datamember,sizeof(buf)-2);
TDataMember *member = IsA()->GetDataMember(buf);
if (!member) {
// in front
char buf[256] = "f";
- strcat(buf,datamember);
+ strncat(buf,datamember,sizeof(buf)-2);
TDataMember *member = IsA()->GetDataMember(buf);
if (!member) {
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);
+ }
+}