]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGPP/MUON/lite/mergeGridFiles.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGPP / MUON / lite / mergeGridFiles.C
index 84d063f05d03f4b205fac595319b951ba621af87..4eef859f724534102e01f1175e1cb49dfd34701e 100644 (file)
@@ -36,78 +36,52 @@ void mergeGridFiles(TString outFilename, TString inFileList, TString addPrefix =
 
   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");
@@ -115,7 +89,6 @@ void mergeGridFiles(TString outFilename, TString inFileList, TString addPrefix =
       logFile.close();
     } // loop on files
 
-
     delete array;
     printf("Step %i completed!\n", istep);
 
@@ -160,7 +133,7 @@ void ReadListFromFile(TString filename, TString& fileList, TString addPrefix)
 
 
 //___________________________________________________
-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";
 
@@ -190,11 +163,8 @@ void completeProd(TString runListName="runList.txt", TString prodDir = "", TStri
 
   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 ) {
@@ -202,7 +172,6 @@ void completeProd(TString runListName="runList.txt", TString prodDir = "", TStri
       return;
     }
   }
-  //}
 
   if ( ! gGrid )
     TGrid::Connect("alien://");
@@ -227,14 +196,13 @@ void completeProd(TString runListName="runList.txt", TString prodDir = "", TStri
       }
     }
 
-    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());
 
@@ -242,6 +210,8 @@ void completeProd(TString runListName="runList.txt", TString prodDir = "", TStri
 
       if ( ! res || res->GetEntries() == 0 ) continue;
 
+      ofstream tmpFile(tmpFilename.Data());
+      
       Int_t mergeStage = ( ipattern == 1 ) ? GetLastStage(res)  : -1;
       stageName = Form("Stage_%i", mergeStage);
 
@@ -255,6 +225,7 @@ void completeProd(TString runListName="runList.txt", TString prodDir = "", TStri
         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
@@ -271,11 +242,11 @@ void completeProd(TString runListName="runList.txt", TString prodDir = "", TStri
         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 + " ";