#include "AliFileMerger.h"
#include "AliLog.h"
+using std::cerr;
+using std::endl;
+using std::cout;
+using std::ifstream;
ClassImp(AliFileMerger)
ProcInfo_t procInfo;//TMP
TNamed(),
fRejectMask(0),
fAcceptMask(0),
- fMaxFilesOpen(500),
+ fMaxFilesOpen(800),
fNoTrees(kFALSE)
{
//
TNamed(name,name),
fRejectMask(0),
fAcceptMask(0),
- fMaxFilesOpen(500),
+ fMaxFilesOpen(800),
fNoTrees(kFALSE)
{
//
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;
+}
}
//___________________________________________________________________________
-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(), ":" ) );
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);
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;
}
<< 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;
}
// 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())
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;
}
//
<< " 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 );
THStack *hstack2 = (THStack*) key2->ReadObj();
l->Add(hstack2->GetHists()->Clone());
delete hstack2;
+ AliSysInfo::AddStamp(nameK.Data(),1,counterK,counterF++);
}
}