From b3c6961a8b6bc3f99a05ff444edbaedcdaa7ef3a Mon Sep 17 00:00:00 2001 From: hristov Date: Tue, 20 May 2014 10:44:52 +0200 Subject: [PATCH 1/1] ALIROOT-5420 Transition to common data header V3 in the raw data. Additional patch by Timo --- RAW/AliRawReaderFile.cxx | 70 ++++++++++++++++++++++++++++---------- RAW/AliRawReaderFile.h | 2 +- RAW/AliRawReaderMemory.cxx | 53 ++++++++++++++++++++--------- 3 files changed, 89 insertions(+), 36 deletions(-) diff --git a/RAW/AliRawReaderFile.cxx b/RAW/AliRawReaderFile.cxx index 92b5d850f47..60ca888962d 100644 --- a/RAW/AliRawReaderFile.cxx +++ b/RAW/AliRawReaderFile.cxx @@ -63,10 +63,9 @@ AliRawReaderFile::AliRawReaderFile(Int_t eventNumber) : fDirectory = OpenDirectory(); if (!fDirectory) fIsValid = kFALSE; if (!OpenNextFile()) fIsValid = kFALSE; - fHeader = new AliRawDataHeader; fId[0] = fId[1] = 0; - fTriggerPattern[0] = fTriggerPattern[1] = 0; + fTriggerPattern[0] = fTriggerPattern[1] = fTriggerPattern[3] = fTriggerPattern[3] = 0; } AliRawReaderFile::AliRawReaderFile(const char* dirName, Int_t eventNumber) : @@ -90,10 +89,9 @@ AliRawReaderFile::AliRawReaderFile(const char* dirName, Int_t eventNumber) : fDirectory = OpenDirectory(); if (!fDirectory) fIsValid = kFALSE; if (fEventIndex >= 0 && (!OpenNextFile())) fIsValid = kFALSE; - fHeader = new AliRawDataHeader; fId[0] = fId[1] = 0; - fTriggerPattern[0] = fTriggerPattern[1] = 0; + fTriggerPattern[0] = fTriggerPattern[1] = fTriggerPattern[3] = fTriggerPattern[3] = 0; } AliRawReaderFile::~AliRawReaderFile() @@ -110,6 +108,8 @@ AliRawReaderFile::~AliRawReaderFile() delete fStream; } if (fHeader) delete fHeader; + if (fHeaderV3) delete fHeaderV3; + if (fBuffer) delete[] fBuffer; if (fDDLIndex) delete fDDLIndex; fDDLIndex=NULL; } @@ -122,10 +122,9 @@ void AliRawReaderFile::RequireHeader(Bool_t required) if (!required) { Warning("AliRawReaderFile","Reading of raw data without raw data header!"); if (fHeader) delete fHeader; + if (fHeaderV3) delete fHeaderV3; fHeader = NULL; - } - else { - if (!fHeader) fHeader = new AliRawDataHeader; + fHeaderV3 = NULL; } AliRawReader::RequireHeader(required); @@ -252,26 +251,46 @@ Bool_t AliRawReaderFile::ReadHeader() if (!fStream && !OpenNextFile()) return kFALSE; do { + UInt_t dataSize=0; + UInt_t headerSize=0; if (fCount > 0) fStream->seekg(Int_t(fStream->tellg()) + fCount); - if (fHeader) { + UInt_t currentPos = fStream->tellg(); + if (fRequireHeader) { + if(! fHeader) fHeader = new AliRawDataHeader; while (!fStream->read((char*) fHeader, sizeof(AliRawDataHeader))) { if (!OpenNextFile()) return kFALSE; + currentPos = fStream->tellg(); + } + dataSize=fHeader->fSize; + headerSize=sizeof(AliRawDataHeader); + if(fHeader->GetVersion() == 3){ + delete fHeader; + fHeader = NULL; + if(! fHeaderV3) fHeaderV3 = new AliRawDataHeaderV3; + //rewind + fStream->seekg(currentPos); + if (!fStream->read((char*) fHeaderV3, sizeof(AliRawDataHeaderV3))) + return kFALSE; + headerSize=sizeof(AliRawDataHeaderV3); + } else if (fHeaderV3) { + delete fHeaderV3; + fHeaderV3 = NULL; } + } else { if (fStream->eof()) if (!OpenNextFile()) return kFALSE; } - if (fHeader && fHeader->fSize != 0xFFFFFFFF) { - fCount = fHeader->fSize - sizeof(AliRawDataHeader); + if ( headerSize && dataSize != 0xFFFFFFFF) { + fCount = dataSize - headerSize; } else { - UInt_t currentPos = fStream->tellg(); + currentPos = fStream->tellg(); fStream->seekg(0, ios::end); fCount = UInt_t(fStream->tellg()) - currentPos; fStream->seekg(currentPos); } - fEquipmentSize = fCount; - if (fHeader) fEquipmentSize += sizeof(AliRawDataHeader); + fEquipmentSize = fCount + headerSize; } while (!IsSelected()); return kTRUE; } @@ -373,11 +392,26 @@ Bool_t AliRawReaderFile::NextEvent() // Read the header of the first payload // in order to fill the 'fake' event header - if (ReadHeader() && fHeader) { - fId[0] = ((fHeader->GetEventID2() >> 20) & 0xf); - fId[1] = (fHeader->GetEventID1() & 0xfff) | ((fHeader->GetEventID2() & 0xfffff) << 12); - fTriggerPattern[0] = (fHeader->GetTriggerClasses() & 0xffffffff); - fTriggerPattern[1] = ((fHeader->GetTriggerClasses() >> 32) & 0x3ffff); + if (ReadHeader() && ( fHeader || fHeaderV3) ) { + UInt_t eid1=0, eid2=0; + ULong64_t trg1=0, trg2=0; + if(fHeader){ + eid1=fHeader->GetEventID1(); + eid2=fHeader->GetEventID2(); + trg1=fHeader->GetTriggerClasses(); + } else { + eid1=fHeaderV3->GetEventID1(); + eid2=fHeaderV3->GetEventID2(); + trg1=fHeaderV3->GetTriggerClasses(); + trg2=fHeaderV3->GetTriggerClassesNext50(); + } + + fId[0] = ((eid2 >> 20) & 0xf); + fId[1] = (eid1 & 0xfff) | ((eid2 & 0xfffff) << 12); + fTriggerPattern[0] = (trg1 & 0xffffffff); + fTriggerPattern[1] = ((trg1 >> 32) & 0x3ffff) | ((trg2 & 0x3fff) << 18); + fTriggerPattern[2] = ((trg2 >> 14) & 0xffffffff); + fTriggerPattern[3] = ((trg2 >> 46) & 0xf); } else { Warning("AliRawReaderFile","Can not read CDH header! The event header fields will be empty!"); diff --git a/RAW/AliRawReaderFile.h b/RAW/AliRawReaderFile.h index d4d2602a8d2..be9d1e13aac 100644 --- a/RAW/AliRawReaderFile.h +++ b/RAW/AliRawReaderFile.h @@ -81,7 +81,7 @@ class AliRawReaderFile: public AliRawReader { UInt_t fType; // event type (no idea from where to get it - put physics_event) UInt_t fRunNb; // run number (no idea from where to get it - put 0) UInt_t fId[2]; // id field (read from the first CDH found, period is not filled) - UInt_t fTriggerPattern[2]; // the trigger class pattern (read from the first CDH found) + UInt_t fTriggerPattern[4]; // the trigger class pattern (read from the first CDH found) UInt_t fDetectorPattern; // the detector pattern (no idea from where to read it) UInt_t fTimestamp; // event timestamp (read from the DDL file creation time) diff --git a/RAW/AliRawReaderMemory.cxx b/RAW/AliRawReaderMemory.cxx index 9ede85b08f7..7076c00e159 100644 --- a/RAW/AliRawReaderMemory.cxx +++ b/RAW/AliRawReaderMemory.cxx @@ -81,33 +81,50 @@ Bool_t AliRawReaderMemory::ReadHeader() // Check if we would not read past the end of the buffer. if ( fPosition+fCount >= fBuffers[fCurrent].GetBufferSize() ) break; - + fHeader = reinterpret_cast(fBuffers[fCurrent].GetBuffer()+fPosition+fCount); + fHeaderV3 = reinterpret_cast(fBuffers[fCurrent].GetBuffer()+fPosition+fCount); + + //Access to version and size is uniform for V2 and V3 + UChar_t version = fHeader->GetVersion(); + UInt_t size = fHeader->fSize; + Int_t headerSize = 0; + + if(version == 3) { + fHeader=NULL; + headerSize = sizeof(AliRawDataHeaderV3); + } else if(version == 2) { + fHeaderV3=NULL; + headerSize = sizeof(AliRawDataHeader); + } else { + Error("ReadHeader", "Wrong raw data header version: %d. Expected: 2 or 3.", version); + return kFALSE; + } // Check that the header is sane, that is the size does not go past the buffer. // Otherwise try again at the next word location. while (1) { - if ( ( (fHeader->fSize == 0) || - ((Int_t)fPosition + fCount + (Int_t)fHeader->fSize > (Int_t)fBuffers[fCurrent].GetBufferSize() ) ) - && fHeader->fSize != 0xFFFFFFFF) { - - if (fPosition + sizeof(UInt_t) <= fBuffers[fCurrent].GetBufferSize()) { - fPosition += sizeof(UInt_t); - continue; + if ( ( (size == 0) || + ((Int_t)fPosition + fCount + (Int_t)size > (Int_t)fBuffers[fCurrent].GetBufferSize() ) ) + && size != 0xFFFFFFFF) { + + if (fPosition + sizeof(UInt_t) <= fBuffers[fCurrent].GetBufferSize()) { + fPosition += sizeof(UInt_t); + continue; + } else { + Error("ReadHeader", "Could not find a valid DDL header!"); + return kFALSE; + } } else { - Error("ReadHeader", "Could not find a valid DDL header!"); - return kFALSE; + fPosition += fCount + headerSize; } - } else { - fPosition += fCount + sizeof(AliRawDataHeader); - } - break; + break; } - if (fHeader->fSize != 0xFFFFFFFF) { - fCount = fHeader->fSize - sizeof(AliRawDataHeader); + if (size != 0xFFFFFFFF) { + fCount = (Int_t)size - headerSize; } else { - fCount = fBuffers[fCurrent].GetBufferSize() - sizeof(AliRawDataHeader); + fCount = fBuffers[fCurrent].GetBufferSize() - headerSize; } } while (!(result=IsSelected()) && OpenNextBuffer()); } while (!result && OpenNextBuffer()); @@ -174,6 +191,7 @@ Bool_t AliRawReaderMemory::Reset() // reset the current position in the buffer to the beginning of the curevent fHeader = NULL; + fHeaderV3 = NULL; fCount = 0; fPosition = 0; fCurrent=0; @@ -212,6 +230,7 @@ Bool_t AliRawReaderMemory::SetMemory( UChar_t* memory, ULong_t size ) fBuffers.push_back(AliRRMBuffer(memory, size, -1)); fCurrent=0; fHeader = NULL; + fHeaderV3 = NULL; fCount = 0; fPosition = 0; return kTRUE; -- 2.43.0