X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RAW%2FAliRawReaderRoot.cxx;h=18976b54b33a30949e091b168c03fff21684bf8c;hb=14520bfae1559eedb7c476fef080c3f77bdf0999;hp=93d4da7b6e324cf874227f5cd3f2e9a21b3b1b84;hpb=bea6b2a48b987c82a6e6c8efd8bc0ac1cac9aa0a;p=u%2Fmrichter%2FAliRoot.git diff --git a/RAW/AliRawReaderRoot.cxx b/RAW/AliRawReaderRoot.cxx index 93d4da7b6e3..18976b54b33 100644 --- a/RAW/AliRawReaderRoot.cxx +++ b/RAW/AliRawReaderRoot.cxx @@ -32,7 +32,8 @@ #include #include "AliRawReaderRoot.h" #include "AliRawEvent.h" -#include "AliRawEventHeader.h" +#include "AliRawEventHeaderBase.h" +#include "AliRawEquipment.h" #include "AliRawEquipmentHeader.h" #include "AliRawData.h" @@ -40,12 +41,22 @@ ClassImp(AliRawReaderRoot) -AliRawReaderRoot::AliRawReaderRoot(const char* fileName, Int_t eventNumber) +AliRawReaderRoot::AliRawReaderRoot(const char* fileName, Int_t eventNumber) : + fFile(NULL), + fBranch(NULL), + fEventIndex(eventNumber), + fEvent(NULL), + fSubEventIndex(0), + fSubEvent(NULL), + fEquipmentIndex(0), + fEquipment(NULL), + fRawData(NULL), + fPosition(NULL), + fEnd(NULL) { // create an object to read digits from the given input file for the // event with the given number - fEvent = NULL; TDirectory* dir = gDirectory; fFile = TFile::Open(fileName); dir->cd(); @@ -58,60 +69,100 @@ AliRawReaderRoot::AliRawReaderRoot(const char* fileName, Int_t eventNumber) Error("AliRawReaderRoot", "no raw data tree found"); return; } - TBranch* branch = tree->GetBranch("rawevent"); - if (!branch) { + fBranch = tree->GetBranch("rawevent"); + if (!fBranch) { Error("AliRawReaderRoot", "no raw data branch found"); return; } fEvent = new AliRawEvent; - branch->SetAddress(&fEvent); - if (branch->GetEntry(eventNumber) <= 0) { - Error("AliRawReaderRoot", "no event with number %d found", eventNumber); - return; + fBranch->SetAddress(&fEvent); + if (fEventIndex >= 0) { + if (fBranch->GetEntry(fEventIndex) <= 0) { + Error("AliRawReaderRoot", "no event with number %d found", fEventIndex); + return; + } } - - fSubEventIndex = 0; - fSubEvent = NULL; - fRawData = NULL; - fHeader = NULL; - - fCount = 0; - fPosition = fEnd = NULL; } -AliRawReaderRoot::AliRawReaderRoot(AliRawEvent* event) +AliRawReaderRoot::AliRawReaderRoot(AliRawEvent* event) : + fFile(NULL), + fBranch(NULL), + fEventIndex(-1), + fEvent(event), + fSubEventIndex(0), + fSubEvent(NULL), + fEquipmentIndex(0), + fEquipment(NULL), + fRawData(NULL), + fPosition(NULL), + fEnd(NULL) { // create an object to read digits from the given raw event - fFile = NULL; - fEvent = event; - - fSubEventIndex = 0; - fSubEvent = NULL; - fRawData = NULL; - fHeader = NULL; - - fCount = 0; - fPosition = fEnd = NULL; } AliRawReaderRoot::AliRawReaderRoot(const AliRawReaderRoot& rawReader) : - AliRawReader(rawReader) + AliRawReader(rawReader), + fFile(NULL), + fBranch(NULL), + fEventIndex(rawReader.fEventIndex), + fEvent(NULL), + fSubEventIndex(rawReader.fSubEventIndex), + fSubEvent(NULL), + fEquipmentIndex(rawReader.fEquipmentIndex), + fEquipment(NULL), + fRawData(NULL), + fPosition(NULL), + fEnd(NULL) { // copy constructor - fFile = NULL; - fEvent = rawReader.fEvent; - - fSubEventIndex = rawReader.fSubEventIndex; - fSubEvent = rawReader.fSubEvent; - fRawData = rawReader.fRawData; - fHeader = rawReader.fHeader; - - fCount = rawReader.fCount; - fPosition = rawReader.fPosition; - fEnd = rawReader.fEnd; + if (rawReader.fFile) { + TDirectory* dir = gDirectory; + fFile = TFile::Open(rawReader.fFile->GetName()); + dir->cd(); + if (!fFile || !fFile->IsOpen()) { + Error("AliRawReaderRoot", "could not open file %s", + rawReader.fFile->GetName()); + return; + } + TTree* tree = (TTree*) fFile->Get("RAW"); + if (!tree) { + Error("AliRawReaderRoot", "no raw data tree found"); + return; + } + fBranch = tree->GetBranch("rawevent"); + if (!fBranch) { + Error("AliRawReaderRoot", "no raw data branch found"); + return; + } + + fEvent = new AliRawEvent; + fBranch->SetAddress(&fEvent); + if (fEventIndex >= 0) { + if (fBranch->GetEntry(fEventIndex) <= 0) { + Error("AliRawReaderRoot", "no event with number %d found", + fEventIndex); + return; + } + } + } else { + fEvent = rawReader.fEvent; + } + + if (fSubEventIndex > 0) { + fSubEvent = fEvent->GetSubEvent(fSubEventIndex-1); + fEquipment = fSubEvent->GetEquipment(fEquipmentIndex); + fRawData = fEquipment->GetRawData(); + fCount = 0; + fHeader = (AliRawDataHeader*) ((UChar_t*) fRawData->GetBuffer() + + ((UChar_t*) rawReader.fHeader - + (UChar_t*) rawReader.fRawData->GetBuffer())); + fPosition = (UChar_t*) fRawData->GetBuffer() + + (rawReader.fPosition - (UChar_t*) rawReader.fRawData->GetBuffer()); + fEnd = ((UChar_t*) fRawData->GetBuffer()) + fRawData->GetSize(); + } } AliRawReaderRoot& AliRawReaderRoot::operator = (const AliRawReaderRoot& @@ -135,13 +186,20 @@ AliRawReaderRoot::~AliRawReaderRoot() } } +const AliRawEventHeaderBase* AliRawReaderRoot::GetEventHeader() const +{ + // Get the even header + // Return NULL in case of failure + if (!fEvent) return NULL; + return fEvent->GetHeader(); +} UInt_t AliRawReaderRoot::GetType() const { // get the type from the event header if (!fEvent) return 0; - return fEvent->GetHeader()->GetType(); + return fEvent->GetHeader()->Get("Type"); } UInt_t AliRawReaderRoot::GetRunNumber() const @@ -149,7 +207,7 @@ UInt_t AliRawReaderRoot::GetRunNumber() const // get the run number from the event header if (!fEvent) return 0; - return fEvent->GetHeader()->GetRunNumber(); + return fEvent->GetHeader()->Get("RunNb"); } const UInt_t* AliRawReaderRoot::GetEventId() const @@ -157,7 +215,7 @@ const UInt_t* AliRawReaderRoot::GetEventId() const // get the event id from the event header if (!fEvent) return NULL; - return fEvent->GetHeader()->GetId(); + return fEvent->GetHeader()->GetP("Id"); } const UInt_t* AliRawReaderRoot::GetTriggerPattern() const @@ -165,7 +223,7 @@ const UInt_t* AliRawReaderRoot::GetTriggerPattern() const // get the trigger pattern from the event header if (!fEvent) return NULL; - return fEvent->GetHeader()->GetTriggerPattern(); + return fEvent->GetHeader()->GetP("TriggerPattern"); } const UInt_t* AliRawReaderRoot::GetDetectorPattern() const @@ -173,7 +231,7 @@ const UInt_t* AliRawReaderRoot::GetDetectorPattern() const // get the detector pattern from the event header if (!fEvent) return NULL; - return fEvent->GetHeader()->GetDetectorPattern(); + return fEvent->GetHeader()->GetP("DetectorPattern"); } const UInt_t* AliRawReaderRoot::GetAttributes() const @@ -181,15 +239,23 @@ const UInt_t* AliRawReaderRoot::GetAttributes() const // get the type attributes from the event header if (!fEvent) return NULL; - return fEvent->GetHeader()->GetTypeAttribute(); + return fEvent->GetHeader()->GetP("TypeAttribute"); +} + +const UInt_t* AliRawReaderRoot::GetSubEventAttributes() const +{ +// get the type attributes from the sub event header + + if (!fSubEvent) return NULL; + return fSubEvent->GetHeader()->GetP("TypeAttribute"); } UInt_t AliRawReaderRoot::GetLDCId() const { // get the LDC Id from the event header - if (!fEvent || !fEvent->GetSubEvent(fSubEventIndex)) return 0; - return fEvent->GetSubEvent(fSubEventIndex)->GetHeader()->GetLDCId(); + if (!fEvent || !fSubEvent) return 0; + return fSubEvent->GetHeader()->Get("LdcId"); } UInt_t AliRawReaderRoot::GetGDCId() const @@ -197,50 +263,84 @@ UInt_t AliRawReaderRoot::GetGDCId() const // get the GDC Id from the event header if (!fEvent) return 0; - return fEvent->GetHeader()->GetGDCId(); + return fEvent->GetHeader()->Get("GdcId"); } +UInt_t AliRawReaderRoot::GetTimestamp() const +{ + if (!fEvent) return 0; + return fEvent->GetHeader()->Get("Timestamp"); +} Int_t AliRawReaderRoot::GetEquipmentSize() const { // get the size of the equipment - if (!fEvent || !fEvent->GetEquipmentHeader()) return 0; - return fEvent->GetEquipmentHeader()->GetEquipmentSize(); + if (!fEvent || !fEquipment || !fEquipment->GetEquipmentHeader()) return 0; + return fEquipment->GetEquipmentHeader()->GetEquipmentSize(); } Int_t AliRawReaderRoot::GetEquipmentType() const { // get the type from the equipment header - if (!fEvent || !fEvent->GetEquipmentHeader()) return -1; - return fEvent->GetEquipmentHeader()->GetEquipmentType(); + if (!fEvent || !fEquipment || !fEquipment->GetEquipmentHeader()) return -1; + return fEquipment->GetEquipmentHeader()->GetEquipmentType(); } Int_t AliRawReaderRoot::GetEquipmentId() const { // get the ID from the equipment header - if (!fEvent || !fEvent->GetEquipmentHeader()) return -1; - return fEvent->GetEquipmentHeader()->GetId(); + if (!fEvent || !fEquipment || !fEquipment->GetEquipmentHeader()) return -1; + return fEquipment->GetEquipmentHeader()->GetId(); } const UInt_t* AliRawReaderRoot::GetEquipmentAttributes() const { // get the attributes from the equipment header - if (!fEvent || !fEvent->GetEquipmentHeader()) return NULL; - return fEvent->GetEquipmentHeader()->GetTypeAttribute(); + if (!fEvent || !fEquipment || !fEquipment->GetEquipmentHeader()) return NULL; + return fEquipment->GetEquipmentHeader()->GetTypeAttribute(); } Int_t AliRawReaderRoot::GetEquipmentElementSize() const { // get the basic element size from the equipment header - if (!fEvent || !fEvent->GetEquipmentHeader()) return 0; - return fEvent->GetEquipmentHeader()->GetBasicSizeType(); + if (!fEvent || !fEquipment || !fEquipment->GetEquipmentHeader()) return 0; + return fEquipment->GetEquipmentHeader()->GetBasicSizeType(); +} + +Int_t AliRawReaderRoot::GetEquipmentHeaderSize() const +{ +// get the size of the equipment header (28 bytes by default) + + if (!fEvent || !fEquipment || !fEquipment->GetEquipmentHeader()) return 0; + return fEquipment->GetEquipmentHeader()->HeaderSize(); } +// _________________________________________________________________________ +UInt_t AliRawReaderRoot::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 AliRawReaderRoot::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 0) fPosition += fCount; - // get the first or the next sub event if at the end of a sub event - if (!fSubEvent || (fPosition >= fEnd)) { + // get the first or the next equipment if at the end of an equipment + if (!fEquipment || (fPosition >= fEnd)) { - // check for end of event data - if (fSubEventIndex >= fEvent->GetNSubEvents()) return kFALSE; - fSubEvent = fEvent->GetSubEvent(fSubEventIndex++); + // get the first or the next sub event if at the end of a sub event + if (!fSubEvent || (fEquipmentIndex >= fSubEvent->GetNEquipments())) { - // check the magic word of the sub event - if (!fSubEvent->GetHeader()->IsValid()) { - Error("ReadHeader", "wrong magic number in sub event!"); - fSubEvent->GetHeader()->Dump(); - fErrorCode = kErrMagic; - return kFALSE; + // check for end of event data + if (fSubEventIndex >= fEvent->GetNSubEvents()) return kFALSE; + fSubEvent = fEvent->GetSubEvent(fSubEventIndex++); + + // check the magic word of the sub event + if (!fSubEvent->GetHeader()->IsValid()) { + Error("ReadHeader", "wrong magic number in sub event!"); + fSubEvent->GetHeader()->Dump(); + fErrorCode = kErrMagic; + return kFALSE; + } + + fEquipmentIndex = 0; + fEquipment = NULL; + fRawData = NULL; } - fRawData = fSubEvent->GetRawData(); + // get the next equipment and raw data fCount = 0; + fEquipment = fSubEvent->GetEquipment(fEquipmentIndex++); + if (!fEquipment) continue; + if (!IsSelected()) { + fPosition = fEnd; + continue; + } + fRawData = fEquipment->GetRawData(); + if (!fRawData) { + fPosition = fEnd; + continue; + } fPosition = (UChar_t*) fRawData->GetBuffer(); fEnd = ((UChar_t*) fRawData->GetBuffer()) + fRawData->GetSize(); } - // continue with the next sub event if no data left in the payload + // continue with the next equipment if no data left in the payload if (fPosition >= fEnd) continue; - // check that there are enough bytes left for the data header - if (fPosition + sizeof(AliRawDataHeader) > fEnd) { - Error("ReadHeader", "could not read data header!"); - Warning("ReadHeader", "skipping %d bytes", fEnd - fPosition); - fSubEvent->GetHeader()->Dump(); - fCount = 0; - fPosition = fEnd; - fErrorCode = kErrNoDataHeader; - continue; + if (fRequireHeader) { + // check that there are enough bytes left for the data header + if (fPosition + sizeof(AliRawDataHeader) > fEnd) { + Error("ReadHeader", "could not read data header!"); + Warning("ReadHeader", "skipping %d bytes", fEnd - fPosition); + fEquipment->GetEquipmentHeader()->Dump(); + fCount = 0; + fPosition = fEnd; + fErrorCode = kErrNoDataHeader; + continue; + } + + // "read" the data header + fHeader = (AliRawDataHeader*) fPosition; +#ifndef R__BYTESWAP + SwapData((void*) fHeader, (void*) fHeaderSwapped, sizeof(AliRawDataHeader)); + fHeader=fHeaderSwapped; +#endif + if ((fPosition + fHeader->fSize) != fEnd) { + Warning("ReadHeader", + "Equipment %d : raw data size found in the header is wrong (%d != %d)! Using the equipment size instead !", + fEquipment->GetEquipmentHeader()->GetId(),fHeader->fSize, fEnd - fPosition); + fHeader->fSize = fEnd - fPosition; + } + fPosition += sizeof(AliRawDataHeader); } - // "read" the data header - fHeader = (AliRawDataHeader*) fPosition; - fPosition += sizeof(AliRawDataHeader); - if (fHeader->fSize != 0xFFFFFFFF) { + if (fHeader && (fHeader->fSize != 0xFFFFFFFF)) { fCount = fHeader->fSize - sizeof(AliRawDataHeader); + + // check consistency of data size in the header and in the sub event + if (fPosition + fCount > fEnd) { + Error("ReadHeader", "size in data header exceeds event size!"); + Warning("ReadHeader", "skipping %d bytes", fEnd - fPosition); + fEquipment->GetEquipmentHeader()->Dump(); + fCount = 0; + fPosition = fEnd; + fErrorCode = kErrSize; + continue; + } + } else { fCount = fEnd - fPosition; } - // check consistency of data size in the header and in the sub event - if (fPosition + fCount > fEnd) { - Error("ReadHeader", "size in data header exceeds event size!"); - Warning("ReadHeader", "skipping %d bytes", fEnd - fPosition); - fSubEvent->GetHeader()->Dump(); - fCount = 0; - fPosition = fEnd; - fErrorCode = kErrSize; - continue; - } - } while (!IsSelected()); return kTRUE; @@ -353,6 +486,8 @@ Bool_t AliRawReaderRoot::Reset() fSubEventIndex = 0; fSubEvent = NULL; + fEquipmentIndex = 0; + fEquipment = NULL; fRawData = NULL; fHeader = NULL; @@ -362,6 +497,39 @@ Bool_t AliRawReaderRoot::Reset() } +Bool_t AliRawReaderRoot::NextEvent() +{ +// go to the next event in the root file + + if (!fBranch) return kFALSE; + + do { + delete fEvent; + fEvent = new AliRawEvent; + fBranch->SetAddress(&fEvent); + if (fBranch->GetEntry(fEventIndex+1) <= 0) + return kFALSE; + fEventIndex++; + } while (!IsEventSelected()); + fEventNumber++; + return Reset(); +} + +Bool_t AliRawReaderRoot::RewindEvents() +{ +// go back to the beginning of the root file + + if (!fBranch) return kFALSE; + + fEventIndex = -1; + delete fEvent; + fEvent = new AliRawEvent; + fBranch->SetAddress(&fEvent); + fEventNumber = -1; + return Reset(); +} + + Int_t AliRawReaderRoot::CheckData() const { // check the consistency of the data @@ -370,13 +538,15 @@ Int_t AliRawReaderRoot::CheckData() const AliRawEvent* subEvent = NULL; Int_t subEventIndex = 0; + AliRawEquipment* equipment = NULL; + Int_t equipmentIndex = 0; UChar_t* position = 0; UChar_t* end = 0; Int_t result = 0; while (kTRUE) { - // get the first or the next sub event if at the end of a sub event - if (!subEvent || (position >= end)) { + // get the first or the next sub event if at the end of an equipment + if (!subEvent || (equipmentIndex >= subEvent->GetNEquipments())) { // check for end of event data if (subEventIndex >= fEvent->GetNSubEvents()) return result; @@ -388,33 +558,38 @@ Int_t AliRawReaderRoot::CheckData() const return result; } - AliRawData* rawData = subEvent->GetRawData(); - position = (UChar_t*) rawData->GetBuffer(); - end = ((UChar_t*) rawData->GetBuffer()) + rawData->GetSize(); + equipmentIndex = 0; } + // get the next equipment and raw data + equipment = subEvent->GetEquipment(equipmentIndex++); + if (!equipment) continue; + AliRawData* rawData = equipment->GetRawData(); + if (!rawData) continue; + position = (UChar_t*) rawData->GetBuffer(); + end = ((UChar_t*) rawData->GetBuffer()) + rawData->GetSize(); + // continue with the next sub event if no data left in the payload if (position >= end) continue; + if (fRequireHeader) { // check that there are enough bytes left for the data header - if (position + sizeof(AliRawDataHeader) > end) { - result |= kErrNoDataHeader; - position = end; - continue; - } + if (position + sizeof(AliRawDataHeader) > end) { + result |= kErrNoDataHeader; + continue; + } - // check consistency of data size in the header and in the sub event - AliRawDataHeader* header = (AliRawDataHeader*) position; - if (fHeader->fSize != 0xFFFFFFFF) { - if (position + header->fSize > end) { + // check consistency of data size in the header and in the equipment + AliRawDataHeader* header = (AliRawDataHeader*) position; + if ((position + header->fSize) != end) { + Warning("ReadHeader", + "Equipment %d : raw data size found in the header is wrong (%d != %d)! Using the equipment size instead !", + equipment->GetEquipmentHeader()->GetId(),header->fSize, end - position); + header->fSize = end - position; result |= kErrSize; - position = end; - } else { - position += header->fSize; } - } else { - position = end; } + position = end; }; return result;