X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RAW%2FAliRawEventHeaderBase.cxx;h=10beea21dc32ee14552e36d0beba1bf3f7d8dd88;hb=c160eaec10b56a1c4f8933d504f870e5354e22b8;hp=007d65bc3744b4e0be69b01598633d801be0d8f7;hpb=11d31ad9ccd99a826913350e3bdd34b4ce24ffe1;p=u%2Fmrichter%2FAliRoot.git diff --git a/RAW/AliRawEventHeaderBase.cxx b/RAW/AliRawEventHeaderBase.cxx index 007d65bc374..10beea21dc3 100644 --- a/RAW/AliRawEventHeaderBase.cxx +++ b/RAW/AliRawEventHeaderBase.cxx @@ -1,5 +1,3 @@ -// Author: Cvetan Cheshkov 10/10/2005 - /************************************************************************** * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. * * * @@ -15,6 +13,10 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ +/* $Id$ */ + +// Author: Cvetan Cheshkov 10/10/2005 + ////////////////////////////////////////////////////////////////////////// // // // AliRawEventHeaderBase // @@ -25,13 +27,16 @@ #include +#include #include #include +#include #include #include "AliLog.h" #include "AliRawEventHeaderBase.h" +#include ClassImp(AliRawEventHeaderBase) @@ -42,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(); @@ -61,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; } //______________________________________________________________________________ @@ -70,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(); @@ -85,10 +102,20 @@ Int_t AliRawEventHeaderBase::HeaderSize() const for(UInt_t i=0;iGetMaxIndex(i)*unitsize; } + const_cast(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. @@ -98,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: @@ -234,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; i0) { - 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); } +//______________________________________________________________________________ +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 { @@ -341,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); + } +}