X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RAW%2FAliRawDB.cxx;h=22515f0efde6d9705b317b9d967b7dbd4982736d;hb=a225d309417ec793c544a0b769e221b841b88238;hp=6c41d5fa9b0cc5e19f9fd4bdd26c6e407c3b14f8;hpb=ee8f2a6c709d23df8d36e1afe7130d53b518b47d;p=u%2Fmrichter%2FAliRoot.git diff --git a/RAW/AliRawDB.cxx b/RAW/AliRawDB.cxx index 6c41d5fa9b0..22515f0efde 100644 --- a/RAW/AliRawDB.cxx +++ b/RAW/AliRawDB.cxx @@ -1,4 +1,4 @@ -// @(#)alimdc:$Name$:$Id$ +// @(#)alimdc:$Name: $:$Id$ // Author: Fons Rademakers 26/11/99 /************************************************************************** @@ -23,13 +23,25 @@ ////////////////////////////////////////////////////////////////////////// #include +#include + +#if ROOT_VERSION_CODE >= ROOT_VERSION(5,15,0) +#include +#else +#include +#endif #include #include -#include "AliESD.h" +#include + +#include "AliESDEvent.h" #include "AliRawEvent.h" +#include "AliRawDataArray.h" #include "AliRawEventHeaderBase.h" +#include "AliRawEquipment.h" +#include "AliRawEquipmentHeader.h" #include "AliStats.h" #include "AliRawDB.h" @@ -37,11 +49,15 @@ ClassImp(AliRawDB) -const char *AliRawDB::fgkAliRootTag = "$Name$"; +const char *AliRawDB::fgkAliRootTag = "$Rev$"; + +// Split TPC into 9 branches in order to avoid problems with big memory +// consumption in case of TPC events w/o zero-suppression +Int_t AliRawDB::fgkDetBranches[AliDAQ::kNDetectors+1] = {1,1,1,18,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //______________________________________________________________________________ AliRawDB::AliRawDB(AliRawEvent *event, - AliESD *esd, + AliESDEvent *esd, Int_t compress, const char* fileName) : fRawDB(NULL), @@ -58,27 +74,35 @@ AliRawDB::AliRawDB(AliRawEvent *event, { // Create a new raw DB + for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) { + fDetRawData[iDet] = new AliRawDataArray*[fgkDetBranches[iDet]]; + Int_t nDDLsPerBranch = AliDAQ::NumberOfDdls(iDet)/fgkDetBranches[iDet]; + for (Int_t iBranch = 0; iBranch < fgkDetBranches[iDet]; iBranch++) + fDetRawData[iDet][iBranch] = new AliRawDataArray(nDDLsPerBranch); + } + + fDetRawData[AliDAQ::kNDetectors] = new AliRawDataArray*[fgkDetBranches[AliDAQ::kNDetectors]]; + for (Int_t iBranch = 0; iBranch < fgkDetBranches[AliDAQ::kNDetectors]; iBranch++) + fDetRawData[AliDAQ::kNDetectors][iBranch] = new AliRawDataArray(100); + if (fileName) { if (!Create(fileName)) MakeZombie(); } } -//______________________________________________________________________________ -AliRawDB::AliRawDB(const AliRawDB& rawDB): TObject(rawDB) -{ -// copy constructor - - Fatal("AliRawDB", "copy constructor not implemented"); -} //______________________________________________________________________________ -AliRawDB& AliRawDB::operator = (const AliRawDB& /*rawDB*/) -{ -// assignment operator +AliRawDB::~AliRawDB() { + // Destructor - Fatal("operator =", "assignment operator not implemented"); - return *this; + if(Close()==-1) Error("~AliRawDB", "cannot close output file!"); + + for (Int_t iDet = 0; iDet < (AliDAQ::kNDetectors + 1); iDet++) { + for (Int_t iBranch = 0; iBranch < fgkDetBranches[iDet]; iBranch++) + delete fDetRawData[iDet][iBranch]; + delete [] fDetRawData[iDet]; + } } //______________________________________________________________________________ @@ -243,7 +267,9 @@ void AliRawDB::MakeTree() // Create ROOT Tree object container. fTree = new TTree("RAW", Form("ALICE raw-data tree (%s)", GetAliRootTag())); - fTree->SetAutoSave(2000000000); // autosave when 2 Gbyte written + fTree->SetAutoSave(21000000000LL); // autosave when 21 Gbyte written + + fTree->BranchRef(); Int_t bufsize = 256000; // splitting 29.6 MB/s, no splitting 35.3 MB/s on P4 2GHz 15k SCSI @@ -251,19 +277,30 @@ void AliRawDB::MakeTree() Int_t split = 0; fTree->Branch("rawevent", "AliRawEvent", &fEvent, bufsize, split); + // Make brach for each sub-detector + for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) { + for (Int_t iBranch = 0; iBranch < fgkDetBranches[iDet]; iBranch++) + fTree->Branch(Form("%s%d",AliDAQ::DetectorName(iDet),iBranch),"AliRawDataArray", + &fDetRawData[iDet][iBranch],bufsize,split); + } + // Make special branch for unrecognized raw-data payloads + for (Int_t iBranch = 0; iBranch < fgkDetBranches[AliDAQ::kNDetectors]; iBranch++) + fTree->Branch(Form("Common%d",iBranch),"AliRawDataArray", + &fDetRawData[AliDAQ::kNDetectors][iBranch],bufsize,split); + // Create tree which will contain the HLT ESD information if (fESD) { fESDTree = new TTree("esdTree", Form("ALICE HLT ESD tree (%s)", GetAliRootTag())); - fESDTree->SetAutoSave(2000000000); // autosave when 2 Gbyte written + fESDTree->SetAutoSave(21000000000LL); // autosave when 21 Gbyte written split = 0; - fESDTree->Branch("ESD", "AliESD", &fESD, bufsize, split); + fESDTree->Branch("ESD", "AliESDEvent", &fESD, bufsize, split); } } //______________________________________________________________________________ -Int_t AliRawDB::Close() +Long64_t AliRawDB::Close() { // Close raw DB. if (!fRawDB) return 0; @@ -283,7 +320,7 @@ Int_t AliRawDB::Close() // Close DB, this also deletes the fTree fRawDB->Close(); - Int_t filesize = fRawDB->GetEND(); + Long64_t filesize = fRawDB->GetEND(); if (fDeleteFiles) { gSystem->Unlink(fRawDB->GetName()); @@ -295,10 +332,6 @@ Int_t AliRawDB::Close() return -1; } - // Create semaphore to say this file is finished - Int_t tfd = ::creat(Form("%s.done", fRawDB->GetName()), 0644); - close(tfd); - delete fRawDB; fRawDB = 0; if(!error) @@ -312,6 +345,30 @@ Int_t AliRawDB::Fill() { // Fill the trees and return the number of written bytes + for (Int_t iDet = 0; iDet < (AliDAQ::kNDetectors + 1); iDet++) + for (Int_t iBranch = 0; iBranch < fgkDetBranches[iDet]; iBranch++) + fDetRawData[iDet][iBranch]->ClearData(); + + // Move the raw-data payloads to the corresponding branches + for(Int_t iSubEvent = 0; iSubEvent < fEvent->GetNSubEvents(); iSubEvent++) { + AliRawEvent *subEvent = fEvent->GetSubEvent(iSubEvent); + for(Int_t iEquipment = 0; iEquipment < subEvent->GetNEquipments(); iEquipment++) { + AliRawEquipment *equipment = subEvent->GetEquipment(iEquipment); + UInt_t eqId = equipment->GetEquipmentHeader()->GetId(); + Int_t ddlIndex; + Int_t iDet = AliDAQ::DetectorIDFromDdlID(eqId,ddlIndex); + Int_t iBranch; + if (iDet < 0 || iDet > AliDAQ::kNDetectors) { + iDet = AliDAQ::kNDetectors; + iBranch = 0; // can we split somehow the unrecognized data??? For the moment - no + } + else { + iBranch = (ddlIndex * fgkDetBranches[iDet])/AliDAQ::NumberOfDdls(iDet); + } + equipment->SetRawDataRef(fDetRawData[iDet][iBranch]); + } + } + Double_t bytes = fRawDB->GetBytesWritten(); Bool_t error = kFALSE; if (fTree->Fill() == -1) @@ -326,10 +383,10 @@ Int_t AliRawDB::Fill() } //______________________________________________________________________________ -Int_t AliRawDB::GetTotalSize() +Long64_t AliRawDB::GetTotalSize() { // Return the total size of the trees - Int_t total = 0; + Long64_t total = 0; { Int_t skey = 0; @@ -338,11 +395,7 @@ Int_t AliRawDB::GetTotalSize() TKey *key = dir->GetKey(fTree->GetName()); if (key) skey = key->GetKeylen(); } - total += skey; - if (fTree->GetZipBytes() > 0) total += fTree->GetTotBytes(); - TBuffer b(TBuffer::kWrite,10000); - TTree::Class()->WriteBuffer(b,fTree); - total += b.Length(); + total += (Long64_t)skey + fTree->GetZipBytes(); } if(fESDTree) @@ -353,11 +406,7 @@ Int_t AliRawDB::GetTotalSize() TKey *key = dir->GetKey(fESDTree->GetName()); if (key) skey = key->GetKeylen(); } - total += skey; - if (fESDTree->GetZipBytes() > 0) total += fESDTree->GetTotBytes(); - TBuffer b(TBuffer::kWrite,10000); - TTree::Class()->WriteBuffer(b,fESDTree); - total += b.Length(); + total += (Long64_t)skey + fESDTree->GetZipBytes(); } return total; @@ -374,7 +423,7 @@ void AliRawDB::WriteStats(AliStats* stats) TDirectory *ds = gDirectory; GetDB()->cd(); stats->SetEvents(GetEvents()); - stats->SetLastId(header.Get("RunNb"), header.GetP("Id")[0]); + stats->SetLastId(header.GetP("Id")[0]); stats->SetFileSize(GetBytesWritten()); stats->SetCompressionFactor(GetCompressionFactor()); stats->SetEndTime(); @@ -414,7 +463,43 @@ const char *AliRawDB::GetAliRootTag() TString version = fgkAliRootTag; version.Remove(TString::kBoth,'$'); - version.ReplaceAll("Name","AliRoot version"); + version.ReplaceAll("Rev","AliRoot version"); return version.Data(); } + +//______________________________________________________________________________ +Bool_t AliRawDB::WriteGuidFile(TString &guidFileFolder) +{ + // Write the guid file + // in the specified folder or + // in the folder where the raw data + // file is. + + TString guidFileName; + if (!guidFileFolder.IsNull()) { + guidFileName = guidFileFolder; + + TString pathStr = fRawDB->GetName(); + TObjArray *pathArr = pathStr.Tokenize('/'); + guidFileName.Append("/"); + guidFileName.Append(((TObjString *)pathArr->Last())->String()); + pathArr->Delete(); + delete pathArr; + } + else + guidFileName = fRawDB->GetName(); + + guidFileName += ".guid"; + + ofstream fguid(guidFileName.Data()); + if (!fguid.is_open()) { + Error("WriteGuidFile", "failure to open guid file %s", guidFileName.Data()); + return kFALSE; + } + TString guid = fRawDB->GetUUID().AsString(); + fguid << "guid: \t" << guid.Data(); + fguid.close(); + + return kTRUE; +}