X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RAW%2FAliRawEventHeaderBase.cxx;h=675d339e4f21b0089d4fbcf5e9ae803dcce9c4b6;hb=ce7adfe97756b995eead59a54101c6cc320dd5d7;hp=12b852ffca133079204ff2d12e15914418dc7b70;hpb=e653e3e1877b27fe831125877986308d3327d57c;p=u%2Fmrichter%2FAliRoot.git diff --git a/RAW/AliRawEventHeaderBase.cxx b/RAW/AliRawEventHeaderBase.cxx index 12b852ffca1..675d339e4f2 100644 --- a/RAW/AliRawEventHeaderBase.cxx +++ b/RAW/AliRawEventHeaderBase.cxx @@ -36,6 +36,7 @@ #include "AliLog.h" #include "AliRawEventHeaderBase.h" +#include ClassImp(AliRawEventHeaderBase) @@ -46,18 +47,25 @@ fMagic(0), 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(); @@ -65,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(this)->fHeaderBegin = ptr; + + return ptr; } //______________________________________________________________________________ @@ -74,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(); @@ -89,6 +102,8 @@ Int_t AliRawEventHeaderBase::HeaderSize() const for(UInt_t i=0;iGetMaxIndex(i)*unitsize; } + const_cast(this)->fHeaderSize = size; + return size; } @@ -118,12 +133,22 @@ void AliRawEventHeaderBase::Swap() } //______________________________________________________________________________ -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: @@ -246,10 +271,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 +303,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 { @@ -310,7 +369,7 @@ 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) { @@ -343,7 +402,7 @@ const UInt_t* AliRawEventHeaderBase::GetP(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) { @@ -365,3 +424,65 @@ 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; +} + +//_____________________________________________________________________________ +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); + } +}