]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliFileMerger.cxx
TRD nSigma OADB related new codes and modifications and OADB root file -- Xianguo Lu
[u/mrichter/AliRoot.git] / ANALYSIS / AliFileMerger.cxx
index e78e97f664ff5bdd294957d1851a94085a75dd80..3c07be87cc871000dbf22d81a8b640bff1eab23f 100644 (file)
 #include "AliFileMerger.h"
 #include "AliLog.h"
 
+using std::cerr;
+using std::endl;
+using std::cout;
+using std::ifstream;
 ClassImp(AliFileMerger)
 
 ProcInfo_t procInfo;//TMP
@@ -78,7 +82,7 @@ AliFileMerger::AliFileMerger():
   TNamed(),
   fRejectMask(0),
   fAcceptMask(0),
-  fMaxFilesOpen(500),
+  fMaxFilesOpen(800),
   fNoTrees(kFALSE)
 {
   //
@@ -92,7 +96,7 @@ AliFileMerger::AliFileMerger(const char* name):
   TNamed(name,name),
   fRejectMask(0),
   fAcceptMask(0),
-  fMaxFilesOpen(500),
+  fMaxFilesOpen(800),
   fNoTrees(kFALSE)
 {
   //
@@ -348,6 +352,20 @@ Bool_t AliFileMerger::IsAccepted(TString name){
   return accept;
 }
 
+Bool_t AliFileMerger::IsRejected(TString name){
+  //
+  // check is the name is explicitly in the rejection list
+  //  if fRejectMask speciefied  - entry with name speciief in the list are rejected 
+  //
+  Bool_t reject=kFALSE;
+  if (fRejectMask){
+    //
+    for (Int_t ireject=0; ireject<fRejectMask->GetEntries(); ireject++){
+      if (name.Contains(fRejectMask->At(ireject)->GetName())) {reject=kTRUE; break;}   // entry was rejected
+    }
+  }
+  return reject;
+}
 
 
 
@@ -369,15 +387,13 @@ void AliFileMerger::AddAccept(const char *accept){
 }
 
 //___________________________________________________________________________
-int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist)
+int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist, Bool_t nameFiltering)
 {
   // Merge all objects in a directory
   // modified version of root's hadd.cxx
   gSystem->GetProcInfo(&procInfo);
   AliInfo(Form(">> memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
-
-
-  Int_t counterF = -1;
+  //
   int status = 0;
   cout << "Target path: " << target->GetPath() << endl;
   TString path( (char*)strstr( target->GetPath(), ":" ) );
@@ -395,7 +411,7 @@ int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist)
   listHargs.Form("((TCollection*)0x%lx)", (ULong_t)&listH);
   //
   while(first_source) {
-    counterF++;
+    //
     TDirectory *current_sourcedir = first_source->GetDirectory(path);
     if (!current_sourcedir) {
       first_source = (TDirectory*)sourcelist->After(first_source);
@@ -409,13 +425,14 @@ int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist)
     TH1::AddDirectory(kFALSE);
     //
     int counterK = 0;
+    int counterF=0;
     //
     while ( (key = (TKey*)nextkey())) {
       if (current_sourcedir == target) break;
       //
       // check if we don't reject this name
       TString nameK(key->GetName());
-      if (!IsAccepted(nameK)) {
+      if ((!IsAccepted(nameK) && nameFiltering) || (!nameFiltering && IsRejected(nameK))) {
        if (!counterF) printf("Object %s is in rejection list, skipping...\n",nameK.Data());
        continue;
       }
@@ -430,15 +447,18 @@ int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist)
             << key->GetName() << " title: " << key->GetTitle() << endl;
        continue;
       }
+      printf("Merging object %s, anchor directory: %s\n",key->GetName(),key->GetMotherDir()->GetPath());
       allNames.Add(new TObjString(key->GetName()));
-      AliSysInfo::AddStamp(nameK.Data(),1,counterK++,counterF-1); 
+      AliSysInfo::AddStamp(nameK.Data(),1,++counterK,counterF++); 
       // read object from first source file
       //current_sourcedir->cd();
 
+      TDirectory* currDir = gDirectory;
+      key->GetMotherDir()->cd();
       TObject *obj = key->ReadObj();
+      currDir->cd();
       if (!obj) {
-       cout << "Failed to get the object with key " << key->GetName() << " from " << 
-         current_sourcedir->GetFile()->GetName() << "/" << current_sourcedir->GetName() << endl;
+       AliError(Form("Failed to get the object with key %s from %s",key->GetName(),current_sourcedir->GetFile()->GetName()));
        continue;
       }
 
@@ -487,7 +507,7 @@ int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist)
        // newdir is now the starting point of another round of merging
        // newdir still knows its depth within the target file via
        // GetPath(), so we can still figure out where we are in the recursion
-       status = MergeRootfile( newdir, sourcelist);
+       status = MergeRootfile( newdir, sourcelist, kFALSE);
        if (status) return status;
        
       } else if ( obj->InheritsFrom(TObject::Class())
@@ -507,6 +527,7 @@ int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist)
              if (!hobj) {
                cout << "Failed to get the object with key " << key2->GetName() << " from " << 
                  ndir->GetFile()->GetName() << "/" << ndir->GetName() << endl;
+               nextsource = (TFile*)sourcelist->After( nextsource );
                continue;
              }
              //
@@ -519,6 +540,14 @@ int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist)
                     << " with the corresponding object in " << nextsource->GetName() << endl;
              }
              listH.Delete();
+        // get the number of processed entries to be put in the syswatch.log
+        Double_t numberOfEntries = -1;
+        if (obj->IsA()->GetMethodAllAny("GetEntries"))
+        {
+          TMethodCall getEntries(obj->IsA(), "GetEntries", "");
+          getEntries.Execute(obj, numberOfEntries);
+        }
+             AliSysInfo::AddStamp(nameK.Data(),1,counterK,counterF++,numberOfEntries); 
            }
          }
          nextsource = (TFile*)sourcelist->After( nextsource );
@@ -540,6 +569,7 @@ int AliFileMerger::MergeRootfile( TDirectory *target, TList *sourcelist)
              THStack *hstack2 = (THStack*) key2->ReadObj();
              l->Add(hstack2->GetHists()->Clone());
              delete hstack2;
+             AliSysInfo::AddStamp(nameK.Data(),1,counterK,counterF++); 
            }
          }