X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RAW%2FAliRawDB.cxx;h=b0abd58e8e60da408e895e164b4c228346a93ff7;hb=f8a2dcfb71921ada3e96d35df7925775e2269593;hp=00d2d204c952e3c42da6ea4f629091a417836edb;hpb=e6694ae08b34084b0a84a68b70bcfa05b3aca54c;p=u%2Fmrichter%2FAliRoot.git diff --git a/RAW/AliRawDB.cxx b/RAW/AliRawDB.cxx index 00d2d204c95..b0abd58e8e6 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 /************************************************************************** @@ -34,9 +34,14 @@ #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" @@ -44,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,10,1}; //______________________________________________________________________________ AliRawDB::AliRawDB(AliRawEvent *event, - AliESD *esd, + AliESDEvent *esd, Int_t compress, const char* fileName) : fRawDB(NULL), @@ -65,12 +74,37 @@ 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() { + // Destructor + + 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]; + } +} + //______________________________________________________________________________ Bool_t AliRawDB::FSHasSpace(const char *fs) const { @@ -233,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 @@ -241,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; @@ -273,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()); @@ -285,14 +332,6 @@ Int_t AliRawDB::Close() return -1; } - // Write a text file with file GUID - TString guidFileName = fRawDB->GetName(); - guidFileName += ".guid"; - ofstream fguid(guidFileName.Data()); - TString guid = fRawDB->GetUUID().AsString(); - fguid << "guid: \t" << guid.Data(); - fguid.close(); - delete fRawDB; fRawDB = 0; if(!error) @@ -306,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); + Int_t iDet = AliDAQ::kNDetectors; + Int_t iBranch = 0; // can we split somehow the unrecognized data??? For the moment - no + if(equipment->GetEquipmentHeader()->GetEquipmentSize()) { + UInt_t eqId = equipment->GetEquipmentHeader()->GetId(); + Int_t ddlIndex = -1; + iDet = AliDAQ::DetectorIDFromDdlID(eqId,ddlIndex); + if (iDet < 0 || iDet >= AliDAQ::kNDetectors) + iDet = AliDAQ::kNDetectors; + 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) @@ -320,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; @@ -332,15 +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(); -#if ROOT_VERSION_CODE >= ROOT_VERSION(5,15,0) - TBufferFile b(TBuffer::kWrite,10000); -#else - TBuffer b(TBuffer::kWrite,10000); -#endif - TTree::Class()->WriteBuffer(b,fTree); - total += b.Length(); + total += (Long64_t)skey + fTree->GetZipBytes(); } if(fESDTree) @@ -351,20 +406,25 @@ Int_t AliRawDB::GetTotalSize() TKey *key = dir->GetKey(fESDTree->GetName()); if (key) skey = key->GetKeylen(); } - total += skey; - if (fESDTree->GetZipBytes() > 0) total += fESDTree->GetTotBytes(); -#if ROOT_VERSION_CODE >= ROOT_VERSION(5,15,0) - TBufferFile b(TBuffer::kWrite,10000); -#else - TBuffer b(TBuffer::kWrite,10000); -#endif - TTree::Class()->WriteBuffer(b,fESDTree); - total += b.Length(); + total += (Long64_t)skey + fESDTree->GetZipBytes(); } return total; } +//______________________________________________________________________________ +Long64_t AliRawDB::AutoSave() +{ + // Auto-save the raw-data and + // esd (if any) trees + + Long64_t nbytes = fTree->AutoSave(); + + if (fESDTree) nbytes += fESDTree->AutoSave(); + + return nbytes; +} + //______________________________________________________________________________ void AliRawDB::WriteStats(AliStats* stats) { @@ -414,9 +474,45 @@ const char *AliRawDB::GetAliRootTag() // used to generate the raw data file. // Stored in the raw-data file title. - TString version = fgkAliRootTag; + static 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; +}