X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RAW%2FAliMDC.cxx;h=e8734c1b6c14949d82f270b43f662e707ac1b7f3;hb=6b64254e24f5d6fff31c103320fd1b04fb3a861b;hp=b7b1f65d5bb738331c01aa27e927c435bccbd639;hpb=e10815f1d81dbd131a43ebba6708937ffb71a740;p=u%2Fmrichter%2FAliRoot.git diff --git a/RAW/AliMDC.cxx b/RAW/AliMDC.cxx index b7b1f65d5bb..e8734c1b6c1 100644 --- a/RAW/AliMDC.cxx +++ b/RAW/AliMDC.cxx @@ -61,7 +61,7 @@ #include #include "AliRawEvent.h" -#include "AliRawEventHeader.h" +#include "AliRawEventHeaderBase.h" #include "AliRawEquipment.h" #include "AliRawEquipmentHeader.h" #include "AliRawData.h" @@ -77,7 +77,6 @@ #include "AliMDC.h" - ClassImp(AliMDC) @@ -99,7 +98,10 @@ AliMDC::AliMDC(Int_t compress, Bool_t deleteFiles, EFilterMode filterMode, fDeleteFiles(deleteFiles), fFilterMode(filterMode), fFilters(), - fStop(kFALSE) + fStop(kFALSE), + fIsTagDBCreated(kFALSE), + fMaxSizeTagDB(maxSizeTagDB), + fFileNameTagDB(fileNameTagDB) { // Create MDC processor object. // compress is the file compression mode. @@ -124,16 +126,18 @@ AliMDC::AliMDC(Int_t compress, Bool_t deleteFiles, EFilterMode filterMode, fESD = new AliESD; } - if (fileNameTagDB) { - if (maxSizeTagDB > 0) { - fTagDB = new AliTagDB(fEvent->GetHeader(), NULL); - fTagDB->SetMaxSize(maxSizeTagDB); - fTagDB->SetFS(fileNameTagDB); - fTagDB->Create(); - } else { - fTagDB = new AliTagDB(fEvent->GetHeader(), fileNameTagDB); - } - } +// Tag DB is now created at the point where the header version is +// already known +// if (fileNameTagDB) { +// if (maxSizeTagDB > 0) { +// fTagDB = new AliTagDB(fEvent->GetHeader(), NULL); +// fTagDB->SetMaxSize(maxSizeTagDB); +// fTagDB->SetFS(fileNameTagDB); +// fTagDB->Create(); +// } else { +// fTagDB = new AliTagDB(fEvent->GetHeader(), fileNameTagDB); +// } +// } // install SIGUSR1 handler to allow clean interrupts gSystem->AddSignalHandler(new AliMDCInterruptHandler(this)); @@ -162,7 +166,7 @@ AliMDC::~AliMDC() // destructor fFilters.Delete(); - delete fTagDB; + if(fTagDB) delete fTagDB; delete fRunDB; delete fRawDB; delete fStats; @@ -208,7 +212,7 @@ Int_t AliMDC::Open(EWriteMode mode, const char* fileName) if (fRawDB->IsZombie()) { delete fRawDB; fRawDB = NULL; - return 1; + return -1; } Info("Open", "Filling raw DB %s\n", fRawDB->GetDBName()); @@ -227,36 +231,44 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray) // or, if isIovecArray is kTRUE, a pointer to an array of iovecs with one // iovec per subevent (used by the event builder). // The return value is the number of written bytes or an error code + const UInt_t kFileSizeErrorLevel = 1900000000; + + UInt_t currentFileSize = GetTotalSize(); + if(currentFileSize > kFileSizeErrorLevel) { + Error("ProcessEvent", "file size (%u) exceeds the limit " + , currentFileSize); + return kErrFileSize; + } Int_t status; char* data = (char*) event; if (isIovecArray) data = (char*) ((iovec*) event)[0].iov_base; // Shortcut for easy header access - AliRawEventHeader &header = *fEvent->GetHeader(); + AliRawEventHeaderBase *header = fEvent->GetHeader(data); // Read event header - if ((status = ReadHeader(header, data)) != header.HeaderSize()) { + if ((status = header->ReadHeader(data)) != (Int_t)header->GetHeadSize()) { return kErrHeader; } - if (AliDebugLevel() > 2) ToAliDebug(3, header.Dump();); + if (AliDebugLevel() > 2) ToAliDebug(3, header->Dump();); // Check event type and skip "Start of Run", "End of Run", // "Start of Run Files" and "End of Run Files" - Int_t size = header.GetEventSize() - header.HeaderSize(); - switch (header.GetType()) { - case AliRawEventHeader::kStartOfRun: - case AliRawEventHeader::kEndOfRun: - case AliRawEventHeader::kStartOfRunFiles: - case AliRawEventHeader::kEndOfRunFiles: + Int_t size = header->GetEventSize() - header->GetHeadSize(); + switch (header->Get("Type")) { + case AliRawEventHeaderBase::kStartOfRun: + case AliRawEventHeaderBase::kEndOfRun: + case AliRawEventHeaderBase::kStartOfRunFiles: + case AliRawEventHeaderBase::kEndOfRunFiles: { - AliDebug(1, Form("Skipping %s (%d bytes)", header.GetTypeName(), size)); + AliDebug(1, Form("Skipping %s (%d bytes)", header->GetTypeName(), size)); return kErrStartEndRun; } default: { - AliDebug(1, Form("Processing %s (%d bytes)", header.GetTypeName(), size)); + AliDebug(1, Form("Processing %s (%d bytes)", header->GetTypeName(), size)); } } @@ -265,10 +277,10 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray) // If there is less data for this event than the next sub-event // header, something is wrong. Skip to next event... - if (toRead < header.HeaderSize()) { + if (toRead < (Int_t)header->GetHeadSize()) { Error("ProcessEvent", "header size (%d) exceeds number of bytes " - "to read (%d)", header.HeaderSize(), toRead); - if (AliDebugLevel() > 0) ToAliDebug(1, header.Dump();); + "to read (%d)", header->GetHeadSize(), toRead); + if (AliDebugLevel() > 0) ToAliDebug(1, header->Dump();); return kErrHeaderSize; } @@ -282,34 +294,34 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray) AliRawEvent *subEvent = fEvent->NextSubEvent(); // Read sub-event header - AliRawEventHeader &subHeader = *subEvent->GetHeader(); - if ((status = ReadHeader(subHeader, data)) != subHeader.HeaderSize()) { + AliRawEventHeaderBase *subHeader = subEvent->GetHeader(data); + if ((status = subHeader->ReadHeader(data)) != (Int_t)subHeader->GetHeadSize()) { return kErrSubHeader; } - if (AliDebugLevel() > 2) ToAliDebug(3, subHeader.Dump();); + if (AliDebugLevel() > 2) ToAliDebug(3, subHeader->Dump();); - toRead -= subHeader.HeaderSize(); + toRead -= subHeader->GetHeadSize(); - Int_t rawSize = subHeader.GetEventSize() - subHeader.HeaderSize(); + Int_t rawSize = subHeader->GetEventSize() - subHeader->GetHeadSize(); // Make sure raw data less than left over bytes for current event if (rawSize > toRead) { Warning("ProcessEvent", "raw data size (%d) exceeds number of " "bytes to read (%d)\n", rawSize, toRead); - if (AliDebugLevel() > 0) ToAliDebug(1, subHeader.Dump();); + if (AliDebugLevel() > 0) ToAliDebug(1, subHeader->Dump();); return kErrDataSize; } // Read Equipment Headers (in case of physics or calibration event) - if (header.GetType() == AliRawEventHeader::kPhysicsEvent || - header.GetType() == AliRawEventHeader::kCalibrationEvent) { + if (header->Get("Type") == AliRawEventHeaderBase::kPhysicsEvent || + header->Get("Type") == AliRawEventHeaderBase::kCalibrationEvent) { while (rawSize > 0) { AliRawEquipment &equipment = *subEvent->NextEquipment(); AliRawEquipmentHeader &equipmentHeader = *equipment.GetEquipmentHeader(); Int_t equipHeaderSize = equipmentHeader.HeaderSize(); - if ((status = ReadEquipmentHeader(equipmentHeader, header.DataIsSwapped(), + if ((status = ReadEquipmentHeader(equipmentHeader, header->DataIsSwapped(), data)) != equipHeaderSize) { return kErrEquipmentHeader; } @@ -343,8 +355,8 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray) // High Level Event Filter if (fFilterMode != kFilterOff) { - if (header.GetType() == AliRawEventHeader::kPhysicsEvent || - header.GetType() == AliRawEventHeader::kCalibrationEvent) { + if (header->Get("Type") == AliRawEventHeaderBase::kPhysicsEvent || + header->Get("Type") == AliRawEventHeaderBase::kCalibrationEvent) { Bool_t result = kFALSE; for (Int_t iFilter = 0; iFilter < fFilters.GetEntriesFast(); iFilter++) { AliFilter* filter = (AliFilter*) fFilters[iFilter]; @@ -357,15 +369,49 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray) // Set stat info for first event of this file if (fRawDB->GetEvents() == 0) - fStats->SetFirstId(header.GetRunNumber(), header.GetEventInRun()); + fStats->SetFirstId(header->Get("RunNb"), header->GetP("Id")[0]); // Store raw event in tree Int_t nBytes = fRawDB->Fill(); + // Create Tag DB here only after the raw data header + // version was already identified + if (!fIsTagDBCreated) { + if (fFileNameTagDB) { + if (fMaxSizeTagDB > 0) { + fTagDB = new AliTagDB(fEvent->GetHeader(), NULL); + fTagDB->SetMaxSize(fMaxSizeTagDB); + fTagDB->SetFS(fFileNameTagDB); + fTagDB->Create(); + } else { + fTagDB = new AliTagDB(fEvent->GetHeader(), fFileNameTagDB); + } + } + fIsTagDBCreated = kTRUE; + } + // Store header in tree if (fTagDB) fTagDB->Fill(); - return nBytes; + // Make top event object ready for next event data + fEvent->Reset(); + // Clean up HLT ESD for the next event + if (fESD) fESD->Reset(); + + if(nBytes >= 0) + return nBytes; + else + return kErrWriting; +} + +//______________________________________________________________________________ +Int_t AliMDC::GetTotalSize() +{ +// return the total current raw DB file size + + if (!fRawDB) return -1; + + return fRawDB->GetTotalSize(); } //______________________________________________________________________________ @@ -373,15 +419,16 @@ Int_t AliMDC::Close() { // close the current raw DB file - if (!fRawDB) return 1; + if (!fRawDB) return -1; fRawDB->WriteStats(fStats); fRunDB->Update(fStats); + Int_t filesize = fRawDB->Close(); delete fRawDB; fRawDB = NULL; delete fStats; fStats = NULL; - return 0; + return filesize; } //______________________________________________________________________________ @@ -458,6 +505,8 @@ Int_t AliMDC::Run(const char* inputFile, Bool_t loop, UInt_t eventSize = 0; Int_t numEvents = 0; + AliRawEventHeaderBase header; + while (kTRUE) { // If we were in looping mode stop directly after a SIGUSR1 signal @@ -488,40 +537,71 @@ Int_t AliMDC::Run(const char* inputFile, Bool_t loop, #endif } else { // get data from a file - AliRawEventHeader header; + { + Int_t nrecv; + if ((nrecv = Read(fd, header.HeaderBaseBegin(), header.HeaderBaseSize())) != + header.HeaderBaseSize()) { + if (nrecv == 0) { // eof + if (loop) { + ::lseek(fd, 0, SEEK_SET); + continue; + } else { + break; + } + } else { + Error("Run", "error reading base header"); + Close(); + delete[] event; + return 1; + } + } + } + char *data = (char *)header.HeaderBaseBegin(); + AliRawEventHeaderBase *hdr = AliRawEventHeaderBase::Create(data); Int_t nrecv; - if ((nrecv = Read(fd, header.HeaderBegin(), header.HeaderSize())) != - header.HeaderSize()) { + if ((nrecv = Read(fd, hdr->HeaderBegin(), hdr->HeaderSize())) != + hdr->HeaderSize()) { if (nrecv == 0) { // eof if (loop) { ::lseek(fd, 0, SEEK_SET); + delete hdr; continue; } else { + delete hdr; break; } } else { Error("Run", "error reading header"); Close(); delete[] event; + delete hdr; return 1; } } - if (eventSize < header.GetEventSize()) { + if (eventSize < hdr->GetEventSize()) { delete[] event; - eventSize = 2 * header.GetEventSize(); + eventSize = 2 * hdr->GetEventSize(); event = new char[eventSize]; } - memcpy(event, header.HeaderBegin(), header.HeaderSize()); - Int_t size = header.GetEventSize() - header.HeaderSize(); - if (Read(fd, event + header.HeaderSize(), size) != size) { + memcpy(event, hdr->HeaderBaseBegin(), hdr->HeaderBaseSize()); + memcpy(event+hdr->HeaderBaseSize(), hdr->HeaderBegin(), hdr->HeaderSize()); + if (hdr->GetExtendedDataSize() != 0) + memcpy(event+hdr->HeaderBaseSize()+hdr->HeaderSize(), + hdr->GetExtendedData(), hdr->GetExtendedDataSize()); + Int_t size = hdr->GetEventSize() - hdr->GetHeadSize(); + if (Read(fd, event + hdr->GetHeadSize(), size) != size) { Error("Run", "error reading data"); Close(); delete[] event; + delete hdr; return 1; } + delete hdr; } Int_t result = ProcessEvent(event, !inputFile); + if(result < -1) + Error("Run", "error writing data. Error code: %d",result); if (result >= 0) { numEvents++; @@ -581,9 +661,9 @@ Int_t AliMDC::Run(const char* inputFile, Bool_t loop, // Make top event object ready for next event data //printf("Event %d has %d sub-events\n", numEvents, fEvent->GetNSubEvents()); - fEvent->Reset(); + // fEvent->Reset(); // Clean up HLT ESD for the next event - if (fESD) fESD->Reset(); + // if (fESD) fESD->Reset(); if (!inputFile) { #ifdef USE_EB @@ -611,6 +691,7 @@ Int_t AliMDC::Run(const char* inputFile, Bool_t loop, } else { // Close input source close(fd); + delete [] event; } return 0; @@ -641,34 +722,6 @@ Int_t AliMDC::Read(Int_t fd, void *buffer, Int_t length) return n; } -//______________________________________________________________________________ -Int_t AliMDC::ReadHeader(AliRawEventHeader &header, char*& data) -{ - // Read header info from DATE data stream. Returns bytes read (i.e. - // AliRawEventHeader::HeaderSize()), -1 in case of error and 0 for EOF. - - memcpy(header.HeaderBegin(), data, header.HeaderSize()); - data += header.HeaderSize(); - - // Swap header data if needed - if (header.IsSwapped()) - header.Swap(); - - // Is header valid... - if (!header.IsValid()) { - Error("ReadHeader", "invalid header format"); - // try recovery... how? - return -1; - } - if (header.GetEventSize() < (UInt_t)header.HeaderSize()) { - Error("ReadHeader", "invalid header size"); - // try recovery... how? - return -1; - } - - return header.HeaderSize(); -} - //______________________________________________________________________________ Int_t AliMDC::ReadEquipmentHeader(AliRawEquipmentHeader &header, Bool_t isSwapped, char*& data)