TString currList = fileList;
TString currOutput = "", mergedFiles = "";
- TFileMerger* fileMerger = 0x0;
- TObjArray* dirsToMergeArray = 0x0;
- TList* sourceList = new TList();
- if ( ! dirsToMerge.IsNull() ) {
- dirsToMergeArray = dirsToMerge.Tokenize(" ");
- dirsToMergeArray->SetOwner();
- }
Bool_t showProgressBar = ! gROOT->IsBatch();
for ( Int_t istep = 0; istep < 100; istep++ ) {
+ TFileMerger fileMerger(copyLocal);
+ Int_t mergeType = ( TFileMerger::kRegular | TFileMerger::kAll );
+ if ( ! dirsToMerge.IsNull() ) {
+ fileMerger.AddObjectNames(dirsToMerge.Data());
+ mergeType |= TFileMerger::kOnlyListed;
+ }
TObjArray* array = currList.Tokenize(" ");
- array->SetOwner();
currList = "";
Int_t nFiles = array->GetEntries();
Int_t subStep = -1;
for (Int_t ifile = 0; ifile < nFiles; ifile++ ) {
- if ( ! fileMerger ) fileMerger = new TFileMerger(copyLocal);
TString currFilename = array->At(ifile)->GetName();
- Bool_t isFileAdded = fileMerger->AddFile(currFilename.Data(), showProgressBar);
+ Bool_t isFileAdded = fileMerger.AddFile(currFilename.Data(), showProgressBar);
if ( ! isFileAdded ) continue;
- //printf("New file %s\n", gROOT->GetListOfFiles()->Last()->GetName()); // REMEMBER TO CUT
- if ( dirsToMergeArray ) {
- if ( ! sourceList ) sourceList = new TList();
- sourceList->Add(gROOT->GetListOfFiles()->Last());
- }
- Int_t nFilesToMerge = fileMerger->GetMergeList()->GetEntries();
+ Int_t nFilesToMerge = fileMerger.GetMergeList()->GetEntries();
if ( nFilesToMerge % nFilesPerStep != 0 && ifile < nFiles - 1 )
- continue;
+ continue;
// The following part is executed only at the end of each step
currOutput = outFilename;
if ( nFiles > nFilesPerStep ) {
- subStep++;
- currOutput.ReplaceAll(".root",Form("_%i_%i.root", istep, subStep));
- AddFileList(currOutput, currList, "");
- }
- if ( dirsToMergeArray ) {
- TFile* outFile = new TFile(currOutput.Data(), "recreate");
- for ( Int_t idir=0; idir<dirsToMergeArray->GetEntries(); idir++ ) {
- outFile->cd();
- TDirectory* currDir = outFile->mkdir(dirsToMergeArray->At(idir)->GetName());
- fileMerger->MergeRecursive(currDir, sourceList);
- }
- outFile->Close();
- }
- else {
- fileMerger->OutputFile(currOutput.Data());
- fileMerger->Merge();
+ subStep++;
+ currOutput.ReplaceAll(".root",Form("_%i_%i.root", istep, subStep));
+ AddFileList(currOutput, currList, "");
}
+ fileMerger.OutputFile(currOutput.Data(),kTRUE,1); // needed when merging single files for specific directories
+ fileMerger.PartialMerge(mergeType);
printf("\nMerged in %s:\n", currOutput.Data());
mergedFiles = "";
for ( Int_t ientry=0; ientry<nFilesToMerge; ientry++ )
- mergedFiles += Form("%s ", fileMerger->GetMergeList()->At(ientry)->GetName());
+ mergedFiles += Form("%s ", fileMerger.GetMergeList()->At(ientry)->GetName());
printf("%s\n\n", mergedFiles.Data());
// remove merged files
if ( istep > 0 )
- gSystem->Exec(Form("rm %s", mergedFiles.Data()));
-
- delete fileMerger;
- fileMerger = 0x0;
- if ( dirsToMergeArray ) {
- delete sourceList;
- sourceList = 0x0;
- }
+ gSystem->Exec(Form("rm %s", mergedFiles.Data()));
// Write log file to keep trace of files to be merged
ofstream logFile(logFilename.Data());
TString logString = "";
for ( Int_t jfile = ifile + 1; jfile < nFiles; jfile++ ) {
- logString += Form("%s ", array->At(jfile)->GetName());
+ logString += Form("%s ", array->At(jfile)->GetName());
}
logString.Append(currList.Data());
logString.ReplaceAll(" ", "\n");
logFile.close();
} // loop on files
-
delete array;
printf("Step %i completed!\n", istep);
//___________________________________________________
-void completeProd(TString runListName="runList.txt", TString prodDir = "", TString baseDir="/alice/data/2010/LHC10h", TString outTaskFilename="QAresults.root", Int_t nFilesPerStep = 50, TString dirsToMerge = "MUON_QA MUON.TriggerEfficiencyMap", Bool_t mergeFast = kFALSE, Bool_t overwriteExisting = kFALSE)
+void completeProd(TString runListName="runList.txt", TString prodDir = "", TString baseDir="/alice/data/2010/LHC10h", TString outTaskFilename="QAresults.root", Int_t nFilesPerStep = 50, TString dirsToMerge = "MUON_QA MTR_ChamberEffMap", Bool_t mergeFast = kFALSE, Bool_t overwriteExisting = kFALSE)
{
TString outFilename = "completeFileList.txt";
ofstream outFile(outFilename.Data());
- // if ( outTaskFilename.Contains("QAresults.root") ) {
const Int_t kNlibs = 5; // 1
- //TString loadLibs[kNlibs] = {"libPWGHFbase.so"};
- //TString loadLibs[kNlibs] = {"libANALYSIS.so", "libANALYSISalice.so", "libTENDER.so", "libPWGPP.so", "libPWGHFbase.so"};
- TString loadLibs[kNlibs] = {"libANALYSIS.so", "libOADB.so", "libANALYSISalice.so", "libCORRFW.so", "libPWGHFbase.so"};
+ TString loadLibs[kNlibs] = {"libANALYSIS", "libOADB", "libANALYSISalice", "libCORRFW", "libPWGmuon"};
for ( Int_t ilib=0; ilib<kNlibs; ilib++ ) {
Int_t exitVal = gSystem->Load(loadLibs[ilib].Data());
if ( exitVal < 0 ) {
return;
}
}
- //}
if ( ! gGrid )
TGrid::Connect("alien://");
}
}
- TString tmpFilename = Form("/tmp/mergeListRun%s.txt", currRunString.Data());
- ofstream tmpFile(tmpFilename.Data());
+ TString tmpFilename = Form("%s/tmp_mergeListRun%s.txt", gSystem->pwd(), currRunString.Data());
TString mergeFilename = "";
Int_t nPatterns = ( mergeFast ) ? 1 : 2;
for ( Int_t ipattern=0; ipattern<nPatterns; ipattern++ ) {
- TString command = ( prodDir.Contains("private") ) ? Form("find %s/ *%s/%s%s", baseDir.Data(), currRunString.Data(), filePattern[ipattern].Data(), outTaskFilename.Data()) : Form("find %s/*%s %s/%s%s", baseDir.Data(), currRunString.Data(), prodDir.Data(), filePattern[ipattern].Data(), outTaskFilename.Data());
+ TString command = ( prodDir.Contains("private") ) ? Form("find %s/ *%s/%s%s", baseDir.Data(), currRunString.Data(), filePattern[ipattern].Data(), outTaskFilename.Data()) : Form("find %s/*%s /%s/%s%s", baseDir.Data(), currRunString.Data(), prodDir.Data(), filePattern[ipattern].Data(), outTaskFilename.Data());
printf("%s\n", command.Data());
if ( ! res || res->GetEntries() == 0 ) continue;
+ ofstream tmpFile(tmpFilename.Data());
+
Int_t mergeStage = ( ipattern == 1 ) ? GetLastStage(res) : -1;
stageName = Form("Stage_%i", mergeStage);
mergeFilename = objs->GetString();
if ( mergeStage > 0 && ! mergeFilename.Contains(stageName.Data()) ) continue;
+ if ( mergeFilename.Contains(".resubmit") ) continue; // Avoid double counting for runs where a resubmission was performed
tmpFile << mergeFilename.Data() << endl;
} // loop on grid lfns
mergeFilename.ReplaceAll(".root", Form("_%s.root", currRunString.Data()));
mergeGridFiles(mergeFilename, tmpFilename, "alien://", nFilesPerStep, kTRUE, dirsToMerge);
}
+
+ gSystem->Exec(Form("rm %s", tmpFilename.Data()));
- if ( ! mergeFilename.Contains("alien://") )
- outFile << gSystem->pwd() << "/";
+ if ( ! mergeFilename.Contains("alien://") ) outFile << gSystem->pwd() << "/";
outFile << mergeFilename.Data() << endl;
- gSystem->Exec(Form("rm %s", tmpFilename.Data()));
break;
} // loop on pattern
if ( mergeFilename.IsNull() ) runsWithoutOut += currRunString + " ";