ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

//////////////////////////////////////////////////////////////////////////
//  marian.ivanov@cern.ch
//  Utilities for file merging.
//  Additional functionality on top of the standard TFileMerger:
//
//  1. Possibility to Set the reject/accept list.
//     1.a)  Only entries selected in accept list are merged. By default all entries are selected
//           use AddAccept 0 to specify your desired entry
//     1.b)  Entries selected in reject list are not merged. By default the reject list is empty.
//
//  2. syswatch.log is created diring mergin procedure. 
//     Memeory consumption - for reading and for merging can be monitored

//  RS: Changed merger to respect the structure of files being merged (directories, collections...)
//      Additional option: SetNoTrees (default false) to not merge any tree
//      The code mostly taken from root's hadd.cxx
/*
  Usage:
  // Libraries for all classes to be merged should be loaded before using the class
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSIScalib");
  gSystem->Load("libTPCcalib"); 
  TH1::AddDirectory(0);

  //Example usage starting from the input data list in text file:
  //
  AliFileMerger merger;
  merger.AddReject("esdFriend");
  merger.IterTXT("calib.list","CalibObjects.root",kFALSE);
  //

*/
//////////////////////////////////////////////////////////////////////////
 

#include <fstream>
#include <THashList.h>
#include <TChain.h>
#include <TKey.h>
#include <TH1.h>
#include <THStack.h>
#include "TSystem.h"
#include "TFile.h"
#include "TGrid.h"
#include "TGridResult.h"
#include "TObjString.h"
#include "TObjArray.h"
#include "TMethodCall.h"
#include "Riostream.h"
#include "AliSysInfo.h"
#include "AliFileMerger.h"
#include "AliLog.h"

using std::cerr;
using std::endl;
using std::cout;
using std::ifstream;
ClassImp(AliFileMerger)

ProcInfo_t procInfo;//TMP

////////////////////////////////////////////////////////////////////////

AliFileMerger::AliFileMerger():
  TNamed(),
  fRejectMask(0),
  fAcceptMask(0),
  fMaxFilesOpen(800),
  fNoTrees(kFALSE)
{
  //
  // Default constructor
  //
}

//______________________________________________________________________
AliFileMerger::AliFileMerger(const char* name):
  TNamed(name,name),
  fRejectMask(0),
  fAcceptMask(0),
  fMaxFilesOpen(800),
  fNoTrees(kFALSE)
{
  //
  // 
  //
}

//______________________________________________________________________
AliFileMerger::~AliFileMerger()
{
  // d-tor
  delete fRejectMask;
  delete fAcceptMask;
}

void AliFileMerger::IterAlien(const char* outputDir, const char* outputFileName, const char* pattern, Bool_t dontOverwrite){

  //
  // Merge the files coming out of the calibration job
  // 
  TString command;
  // looking for files to be merged in the output directory
  command = Form("find %s/ *%s", outputDir, pattern);
  printf("command: %s\n", command.Data());
  TGrid::Connect("alien://");
  TGridResult *res = gGrid->Command(command);
  if (!res) return;
  TIter nextmap(res);
  TMap *map = 0;
  // loop over the results
  TList sourcelist;  
  sourcelist.SetOwner(kTRUE);
  //
  while((map=(TMap*)nextmap())) {
    // getting the turl
    TObjString *objs = dynamic_cast<TObjString*>(map->GetValue("turl"));
    if (!objs || !objs->GetString().Length()) {
      // Nothing found - skip this output
      delete res;
      break;
    } 
    printf("looking for file %s\n",(objs->GetString()).Data());
    AddFile(&sourcelist, (objs->GetString()).Data());;
  }
  //
  IterList(&sourcelist, outputFileName, dontOverwrite);
  delete res;
}

void AliFileMerger::IterList(const TList* namesList, const char* outputFileName, Bool_t dontOverwrite)
{
  // merge in steps or in one go
  //
  gSystem->GetProcInfo(&procInfo);
  AliInfo(Form(">> memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
  //
  TString outputFile(outputFileName);
  gSystem->ExpandPathName(outputFile);
  //
  int nFiles = namesList->GetEntries();
  int maxSrcOpen = fMaxFilesOpen - 1;
  TList filesList;
  filesList.SetOwner(kTRUE);
  //
  TString tmpDest[2] = {outputFile,outputFile}; // names for tmp files
  int npl = outputFile.Last('.');
  if (npl<0) npl  = outputFile.Length();
  for (int i=0;i<2;i++) tmpDest[i].Insert(npl,Form("_TMPMERGE%d_",i));
  //
  int nsteps = 0, currTmp = 0, start = 0;
  for (int ifl=0;ifl<nFiles;ifl++) {
    int st = ifl%maxSrcOpen;
    if (st==0 && ifl) { // new chunk should be started, merge what was already accumulated
      OpenNextChunks(namesList,&filesList,start,ifl-1);
      start = ifl; // remember where to start next step
      if (nsteps++) { // if not 1st one, merge the privous chunk with this one
	filesList.AddFirst(TFile::Open(tmpDest[currTmp].Data()));
	currTmp = (currTmp==0) ? 1:0;         // swap tmp files
      }
      // open temp target
      TFile* targetTmp = TFile::Open( tmpDest[currTmp].Data(), "RECREATE");
      if (!targetTmp || targetTmp->IsZombie()) {
	printf("Error opening temporary file %s\n",tmpDest[currTmp].Data());
	return;
      }
      MergeRootfile(targetTmp, &filesList);
      targetTmp->Close();
      delete targetTmp;
      filesList.Clear(); // close all open files
    }
    // nothing to do until needed amount of files is accumulated
  }
  // merge last step
  TFile* target = TFile::Open( outputFile.Data(), (dontOverwrite ? "CREATE":"RECREATE") );
  if (!target || target->IsZombie()) {
    cerr << "Error opening target file (does " << outputFileName << " exist?)." << endl;
    cerr << "Use force = kTRUE to re-creation of output file." << endl;
    return;
  }
  OpenNextChunks(namesList,&filesList,start,nFiles-1);
  // add result of previous merges
  if (nsteps) filesList.AddFirst(TFile::Open(tmpDest[currTmp].Data()));
  MergeRootfile( target, &filesList);
  target->Close();
  delete target;
  filesList.Clear();
  // 
  for (int i=0;i<2;i++) gSystem->Exec(Form("if [ -e %s ]; then \nrm %s\nfi",tmpDest[i].Data(),tmpDest[i].Data()));
  //
  printf("Merged %d files in %d steps\n",nFiles,++nsteps);
  //  
  gSystem->GetProcInfo(&procInfo);
  AliInfo(Form("<< memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
}

void AliFileMerger::IterTXT( const char * fileList,  const char* outputFileName, Bool_t dontOverwrite){
  
  // Merge the files indicated in the list - fileList
  // ASCII file option example: 
  // find `pwd`/ | grep AliESDfriends_v1.root > calib.list
  
  // Open the input stream
  ifstream in;
  in.open(fileList);
  // Read the input list of files 
  TString objfile;
  Int_t counter=0;
  TList sourcelist;  
  sourcelist.SetOwner(kTRUE);
  while(in.good()) {
    in >> objfile;
    if (!objfile.Contains(".root")) continue; // protection
    gSystem->ExpandPathName(objfile);
    printf("Add file:Counter\t%d\tMerging file %s\n",counter++,objfile.Data());
    AddFile(&sourcelist, objfile.Data());
  }
  //
  IterList(&sourcelist, outputFileName, dontOverwrite);
  //
}

void AliFileMerger::StoreResults(TObjArray * array, const char* outputFileName){
  //
  // Storing the results in one single file
  //
  TFile *f = new TFile(outputFileName,"recreate");
  for (Int_t i=0; i<array->GetEntries(); i++){
    TObject *object0 = array->At(i);
    if (!object0) continue;
    object0->Write();
  }
  f->Close();
  delete f;
}


void AliFileMerger::StoreSeparateResults(TObjArray * array, const char* outputFileName){
  //
  // Store the results in separate files (one per object)
  //
  for (Int_t i=0; i<array->GetEntries(); i++){
    TObject *object0 = array->At(i);
    if (!object0) continue;
    TFile *f = new TFile(Form("%s_%s.root",outputFileName,object0->GetName()),"recreate");
    object0->Write();
    f->Close();
    delete f;
  }
}

void AliFileMerger::Merge(TFile* fileIn, TObjArray * array){
  //
  // Merging procedure
  //
  if (!array) return;
  static Int_t counter=-1;
  counter++;
  TObjArray *carray = new TObjArray;   //array of the objects inside current file
  carray->SetOwner(kTRUE);
  
  // load all objects to  memory
  
  TList *farr = fileIn->GetListOfKeys();
  if (!farr) { 
    delete carray;
    return;
  }
  for (Int_t ical=0; ical<farr->GetEntries(); ical++){
    if (!farr->At(ical)) continue;
    TString name(farr->At(ical)->GetName());
    if (!IsAccepted(name)) continue;                        // skip not accepted entries
    TObject *obj = fileIn->Get(name.Data());
    if (obj) carray->AddLast(obj);
    AliSysInfo::AddStamp(name.Data(),1,ical,counter);  
  }
  
  if (carray->GetEntries()==0)  { 
    delete carray;
    return;
  }
  TMethodCall callEnv;
  Int_t entries =carray->GetEntriesFast();
  for (Int_t i=0; i<entries; i++){
    
    TObjArray *templist = new TObjArray(1);
    templist->SetOwner(kFALSE);
    TObject *currentObject = carray->At(i);
    if (!currentObject) { 
      delete templist;
      continue;
    }
    printf("%s\n",currentObject->GetName());
    callEnv.InitWithPrototype(currentObject->IsA(), "Merge", "TCollection*");
    if (!callEnv.IsValid()) {
      delete templist; 
      continue;
    }
    TString oname=currentObject->GetName();
    TObject *mergedObject = array->FindObject(currentObject->GetName());
    if (!mergedObject) {
      array->AddLast(currentObject);
      carray->RemoveAt(i);
      delete templist; 
      continue;
    }
    templist->AddLast(currentObject);
    callEnv.SetParam((Long_t) templist);
    callEnv.Execute(mergedObject);
    AliSysInfo::AddStamp(currentObject->GetName(),2,i,counter);  
    delete templist;
  }
  carray->Delete();
  delete carray;
}

Bool_t AliFileMerger::IsAccepted(TString name){
  //
  // Accept/reject logic
  // name - name of the entry
  //
  //  if fAcceptMask specified   - entry has to be in list of selected
  //  if fRejectMask speciefied  - entry with name speciief in the list are rejected 
  //
  Bool_t accept=kTRUE;
  if (fAcceptMask){
    //
    accept=kFALSE;
    for (Int_t iaccept=0; iaccept<fAcceptMask->GetEntries(); iaccept++){
      if (name.Contains(fAcceptMask->At(iaccept)->GetName())) accept=kTRUE;   // entry was selected
    }
  }
  if (!accept) return kFALSE;

  if (fRejectMask){
    //
    for (Int_t ireject=0; ireject<fRejectMask->GetEntries(); ireject++){
      if (name.Contains(fRejectMask->At(ireject)->GetName())) accept=kFALSE;   // entry was rejected
    }
  }
  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;
}



void AliFileMerger::AddReject(const char *reject)
{
  //
  // add reject string to the list of entries to be rejected for merging
  //
  if (!fRejectMask) {
    fRejectMask = new TObjArray();
    fRejectMask->SetOwner(kTRUE);
  }
  fRejectMask->AddLast(new TObjString(reject));
}

void AliFileMerger::AddAccept(const char *accept)
{
  //
  // add reject string to the list of entries to be rejected for merging
  //
  if (!fAcceptMask) {
    fAcceptMask = new TObjArray();
    fAcceptMask->SetOwner(kTRUE);
  }
  fAcceptMask->AddLast(new TObjString(accept));
}

//___________________________________________________________________________
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 status = 0;
  cout << "Target path: " << target->GetPath() << endl;
  TString path( (char*)strstr( target->GetPath(), ":" ) );
  path.Remove( 0, 2 );
  //
  // find 1st valid file
  TDirectory *first_source = (TDirectory*)sourcelist->First();
  //
  Int_t nguess = sourcelist->GetSize()+1000;
  THashList allNames(nguess);
  allNames.SetOwner(kTRUE);
  ((THashList*)target->GetList())->Rehash(nguess);
  ((THashList*)target->GetListOfKeys())->Rehash(nguess);
  TList listH;
  TString listHargs;
  listHargs.Form("((TCollection*)0x%lx)", (ULong_t)&listH);
  //
  while(first_source) {
    //
    TDirectory *current_sourcedir = first_source->GetDirectory(path);
    if (!current_sourcedir) {
      first_source = (TDirectory*)sourcelist->After(first_source);
      continue;
    }
    // loop over all keys in this directory
    TChain *globChain = 0;
    TIter nextkey( current_sourcedir->GetListOfKeys() );
    TKey *key, *oldkey=0;
    //gain time, do not add the objects in the list in memory
    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) && nameFiltering) || (!nameFiltering && IsRejected(nameK))) {
	if (!counterF) printf("Object %s is in rejection list, skipping...\n",nameK.Data());
	continue;
      }
      //
      //keep only the highest cycle number for each key
      if (oldkey && !strcmp(oldkey->GetName(),key->GetName())) continue;
      if (!strcmp(key->GetClassName(),"TProcessID")) {key->ReadObj(); continue;}
      if (allNames.FindObject(key->GetName())) continue;
      TClass *cl = TClass::GetClass(key->GetClassName());
      if (!cl || !cl->InheritsFrom(TObject::Class())) {
	cout << "Cannot merge object type, name: "
	     << 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++); 
      // read object from first source file
      //current_sourcedir->cd();

      TDirectory* currDir = gDirectory;
      key->GetMotherDir()->cd();
      TObject *obj = key->ReadObj();
      currDir->cd();
      if (!obj) {
	AliError(Form("Failed to get the object with key %s from %s",key->GetName(),current_sourcedir->GetFile()->GetName()));
	continue;
      }

      if ( obj->IsA()->InheritsFrom( TTree::Class() ) ) {
	
	// loop over all source files create a chain of Trees "globChain"
	if (!fNoTrees) { // 
	  TString obj_name;
	  if (path.Length()) {
	    obj_name = path + "/" + obj->GetName();
	  } else {
	    obj_name = obj->GetName();
	  }
	  globChain = new TChain(obj_name);
	  globChain->Add(first_source->GetName());
	  TFile *nextsource = (TFile*)sourcelist->After( first_source );
	  while ( nextsource ) {
	    //do not add to the list a file that does not contain this Tree
	    TFile *curf = TFile::Open(nextsource->GetName());
	    if (curf) {
	      Bool_t mustAdd = kFALSE;
	      if (curf->FindKey(obj_name)) {
		mustAdd = kTRUE;
	      } else {
		//we could be more clever here. No need to import the object
		//we are missing a function in TDirectory
		TObject *aobj = curf->Get(obj_name);
		if (aobj) { mustAdd = kTRUE; delete aobj;}
	      }
	      if (mustAdd) {
		globChain->Add(nextsource->GetName());
	      }
	    }
	    delete curf;
	    nextsource = (TFile*)sourcelist->After( nextsource );
	  }
	}
      } else if ( obj->IsA()->InheritsFrom( TDirectory::Class() ) ) {
	// it's a subdirectory
	
	cout << "Found subdirectory " << obj->GetName() << endl;
	// create a new subdir of same name and title in the target file
	target->cd();
	TDirectory *newdir = target->mkdir( obj->GetName(), obj->GetTitle() );
	
	// 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, kFALSE);
	if (status) return status;
	
      } else if ( obj->InheritsFrom(TObject::Class())
		  && obj->IsA()->GetMethodWithPrototype("Merge", "TCollection*") ) {
	// object implements Merge(TCollection*)
	
	// loop over all source files and merge same-name object
	TFile *nextsource = (TFile*)sourcelist->After( first_source );
	while ( nextsource ) {
	  // make sure we are at the correct directory level by cd'ing to path
	  TDirectory *ndir = nextsource->GetDirectory(path);
	  if (ndir) {
	    ndir->cd();
	    TKey *key2 = (TKey*)gDirectory->GetListOfKeys()->FindObject(key->GetName());
	    if (key2) {
	      TObject *hobj = key2->ReadObj();
	      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;
	      }
	      //
	      hobj->ResetBit(kMustCleanup);
	      listH.Add(hobj);
	      Int_t error = 0;
	      obj->Execute("Merge", listHargs.Data(), &error); // RS Probleme here
	      if (error) {
		cerr << "Error calling Merge() on " << obj->GetName()
		     << " 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 );
	}
      } else if ( obj->IsA()->InheritsFrom( THStack::Class() ) ) {
	THStack *hstack1 = (THStack*) obj;
	TList* l = new TList();
	
	// loop over all source files and merge the histos of the
	// corresponding THStacks with the one pointed to by "hstack1"
	TFile *nextsource = (TFile*)sourcelist->After( first_source );
	while ( nextsource ) {
	  // make sure we are at the correct directory level by cd'ing to path
	  TDirectory *ndir = nextsource->GetDirectory(path);
	  if (ndir) {
	    ndir->cd();
	    TKey *key2 = (TKey*)gDirectory->GetListOfKeys()->FindObject(hstack1->GetName());
	    if (key2) {
	      THStack *hstack2 = (THStack*) key2->ReadObj();
	      l->Add(hstack2->GetHists()->Clone());
	      delete hstack2;
	      AliSysInfo::AddStamp(nameK.Data(),1,counterK,counterF++); 
	    }
	  }
	  
	  nextsource = (TFile*)sourcelist->After( nextsource );
	}
	hstack1->GetHists()->Merge(l);
	l->Delete();
	delete l;
      } else {
	// object is of no type that we can merge
	cout << "Cannot merge object type, name: "
	     << obj->GetName() << " title: " << obj->GetTitle() << endl;
	
	// loop over all source files and write similar objects directly to the output file
	TFile *nextsource = (TFile*)sourcelist->After( first_source );
	while ( nextsource ) {
	  // make sure we are at the correct directory level by cd'ing to path
	  TDirectory *ndir = nextsource->GetDirectory(path);
	  if (ndir) {
	    ndir->cd();
	    TKey *key2 = (TKey*)gDirectory->GetListOfKeys()->FindObject(key->GetName());
	    if (key2) {
	      TObject *nobj = key2->ReadObj();
	      nobj->ResetBit(kMustCleanup);
	      int nbytes1 = target->WriteTObject(nobj, key2->GetName(), "SingleKey" );
	      if (nbytes1 <= 0) status = -1;
	      delete nobj;
	    }
	  }
	  nextsource = (TFile*)sourcelist->After( nextsource );
	}
      }
      
      // now write the merged histogram (which is "in" obj) to the target file
      // note that this will just store obj in the current directory level,
      // which is not persistent until the complete directory itself is stored
      // by "target->Write()" below
      target->cd();
      
      //!!if the object is a tree, it is stored in globChain...
      if(obj->IsA()->InheritsFrom( TDirectory::Class() )) {
	//printf("cas d'une directory\n");
      } else if(obj->IsA()->InheritsFrom( TTree::Class() )) {
	if (!fNoTrees) {
	  globChain->ls();
	  globChain->Merge(target->GetFile(),0,"keep fast");
	  delete globChain;
	}
      } else {
	int nbytes2 = obj->Write( key->GetName(), TObject::kSingleKey );
	if (nbytes2 <= 0) status = -1;
      }
      oldkey = key;
      delete obj;
    } // while ( ( TKey *key = (TKey*)nextkey() ) )
    first_source = (TDirectory*)sourcelist->After(first_source);
  }
  // save modifications to target file
  target->SaveSelf(kTRUE);
  //
  gSystem->GetProcInfo(&procInfo);
  AliInfo(Form("<< memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));

  return status;
}

//___________________________________________________________________________
int AliFileMerger::OpenNextChunks(const TList* namesList, TList* filesList, Int_t from, Int_t to)
{
  gSystem->GetProcInfo(&procInfo);
  AliInfo(Form(">> memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));

  filesList->Clear();
  int nEnt = namesList->GetEntries();
  from = from<nEnt ? from : nEnt;
  to   = to<nEnt ? to : nEnt;
  int count = 0;
  for (int i=from;i<=to;i++) {
    TNamed* fnam = (TNamed*)namesList->At(i);
    if (!fnam) continue;
    TString fnamS(fnam->GetName());
    gSystem->ExpandPathName(fnamS);
    if (fnamS.BeginsWith("alien://") && !gGrid) TGrid::Connect("alien");
    TFile* source = TFile::Open(fnam->GetName());
    if( source==0 ) { printf("Failed to open file %s, will skip\n",fnam->GetName()); continue; }
    filesList->Add(source);
    printf("Opened file %s\n",fnam->GetName());
    count++;
  }
  gSystem->GetProcInfo(&procInfo);
  AliInfo(Form("<< memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));

  return count;
}


//___________________________________________________________________________
int AliFileMerger::AddFile(TList* namesList, std::string entry)
{
  // add a new file to the list of files
  //  static int count(0);
  if( entry.empty() ) return 0;
  size_t j =entry.find_first_not_of(' ');
  if( j==std::string::npos ) return 0;
  entry = entry.substr(j);
  if( entry.substr(0,1)=="@") {
    std::ifstream indirect_file(entry.substr(1).c_str() );
    if( ! indirect_file.is_open() ) {
      std::cerr<< "Could not open indirect file " << entry.substr(1) << std::endl;
      return 1;
    }
    while( indirect_file ){
      std::string line;
      std::getline(indirect_file, line);
      if( AddFile(namesList, line)!=0 ) return 1;;
    }
    return 0;
  }
  //  cout << "Source file " << (++count) << ": " << entry << endl;
  namesList->Add(new TNamed(entry,""));
  return 0;
}
 AliFileMerger.cxx:1
 AliFileMerger.cxx:2
 AliFileMerger.cxx:3
 AliFileMerger.cxx:4
 AliFileMerger.cxx:5
 AliFileMerger.cxx:6
 AliFileMerger.cxx:7
 AliFileMerger.cxx:8
 AliFileMerger.cxx:9
 AliFileMerger.cxx:10
 AliFileMerger.cxx:11
 AliFileMerger.cxx:12
 AliFileMerger.cxx:13
 AliFileMerger.cxx:14
 AliFileMerger.cxx:15
 AliFileMerger.cxx:16
 AliFileMerger.cxx:17
 AliFileMerger.cxx:18
 AliFileMerger.cxx:19
 AliFileMerger.cxx:20
 AliFileMerger.cxx:21
 AliFileMerger.cxx:22
 AliFileMerger.cxx:23
 AliFileMerger.cxx:24
 AliFileMerger.cxx:25
 AliFileMerger.cxx:26
 AliFileMerger.cxx:27
 AliFileMerger.cxx:28
 AliFileMerger.cxx:29
 AliFileMerger.cxx:30
 AliFileMerger.cxx:31
 AliFileMerger.cxx:32
 AliFileMerger.cxx:33
 AliFileMerger.cxx:34
 AliFileMerger.cxx:35
 AliFileMerger.cxx:36
 AliFileMerger.cxx:37
 AliFileMerger.cxx:38
 AliFileMerger.cxx:39
 AliFileMerger.cxx:40
 AliFileMerger.cxx:41
 AliFileMerger.cxx:42
 AliFileMerger.cxx:43
 AliFileMerger.cxx:44
 AliFileMerger.cxx:45
 AliFileMerger.cxx:46
 AliFileMerger.cxx:47
 AliFileMerger.cxx:48
 AliFileMerger.cxx:49
 AliFileMerger.cxx:50
 AliFileMerger.cxx:51
 AliFileMerger.cxx:52
 AliFileMerger.cxx:53
 AliFileMerger.cxx:54
 AliFileMerger.cxx:55
 AliFileMerger.cxx:56
 AliFileMerger.cxx:57
 AliFileMerger.cxx:58
 AliFileMerger.cxx:59
 AliFileMerger.cxx:60
 AliFileMerger.cxx:61
 AliFileMerger.cxx:62
 AliFileMerger.cxx:63
 AliFileMerger.cxx:64
 AliFileMerger.cxx:65
 AliFileMerger.cxx:66
 AliFileMerger.cxx:67
 AliFileMerger.cxx:68
 AliFileMerger.cxx:69
 AliFileMerger.cxx:70
 AliFileMerger.cxx:71
 AliFileMerger.cxx:72
 AliFileMerger.cxx:73
 AliFileMerger.cxx:74
 AliFileMerger.cxx:75
 AliFileMerger.cxx:76
 AliFileMerger.cxx:77
 AliFileMerger.cxx:78
 AliFileMerger.cxx:79
 AliFileMerger.cxx:80
 AliFileMerger.cxx:81
 AliFileMerger.cxx:82
 AliFileMerger.cxx:83
 AliFileMerger.cxx:84
 AliFileMerger.cxx:85
 AliFileMerger.cxx:86
 AliFileMerger.cxx:87
 AliFileMerger.cxx:88
 AliFileMerger.cxx:89
 AliFileMerger.cxx:90
 AliFileMerger.cxx:91
 AliFileMerger.cxx:92
 AliFileMerger.cxx:93
 AliFileMerger.cxx:94
 AliFileMerger.cxx:95
 AliFileMerger.cxx:96
 AliFileMerger.cxx:97
 AliFileMerger.cxx:98
 AliFileMerger.cxx:99
 AliFileMerger.cxx:100
 AliFileMerger.cxx:101
 AliFileMerger.cxx:102
 AliFileMerger.cxx:103
 AliFileMerger.cxx:104
 AliFileMerger.cxx:105
 AliFileMerger.cxx:106
 AliFileMerger.cxx:107
 AliFileMerger.cxx:108
 AliFileMerger.cxx:109
 AliFileMerger.cxx:110
 AliFileMerger.cxx:111
 AliFileMerger.cxx:112
 AliFileMerger.cxx:113
 AliFileMerger.cxx:114
 AliFileMerger.cxx:115
 AliFileMerger.cxx:116
 AliFileMerger.cxx:117
 AliFileMerger.cxx:118
 AliFileMerger.cxx:119
 AliFileMerger.cxx:120
 AliFileMerger.cxx:121
 AliFileMerger.cxx:122
 AliFileMerger.cxx:123
 AliFileMerger.cxx:124
 AliFileMerger.cxx:125
 AliFileMerger.cxx:126
 AliFileMerger.cxx:127
 AliFileMerger.cxx:128
 AliFileMerger.cxx:129
 AliFileMerger.cxx:130
 AliFileMerger.cxx:131
 AliFileMerger.cxx:132
 AliFileMerger.cxx:133
 AliFileMerger.cxx:134
 AliFileMerger.cxx:135
 AliFileMerger.cxx:136
 AliFileMerger.cxx:137
 AliFileMerger.cxx:138
 AliFileMerger.cxx:139
 AliFileMerger.cxx:140
 AliFileMerger.cxx:141
 AliFileMerger.cxx:142
 AliFileMerger.cxx:143
 AliFileMerger.cxx:144
 AliFileMerger.cxx:145
 AliFileMerger.cxx:146
 AliFileMerger.cxx:147
 AliFileMerger.cxx:148
 AliFileMerger.cxx:149
 AliFileMerger.cxx:150
 AliFileMerger.cxx:151
 AliFileMerger.cxx:152
 AliFileMerger.cxx:153
 AliFileMerger.cxx:154
 AliFileMerger.cxx:155
 AliFileMerger.cxx:156
 AliFileMerger.cxx:157
 AliFileMerger.cxx:158
 AliFileMerger.cxx:159
 AliFileMerger.cxx:160
 AliFileMerger.cxx:161
 AliFileMerger.cxx:162
 AliFileMerger.cxx:163
 AliFileMerger.cxx:164
 AliFileMerger.cxx:165
 AliFileMerger.cxx:166
 AliFileMerger.cxx:167
 AliFileMerger.cxx:168
 AliFileMerger.cxx:169
 AliFileMerger.cxx:170
 AliFileMerger.cxx:171
 AliFileMerger.cxx:172
 AliFileMerger.cxx:173
 AliFileMerger.cxx:174
 AliFileMerger.cxx:175
 AliFileMerger.cxx:176
 AliFileMerger.cxx:177
 AliFileMerger.cxx:178
 AliFileMerger.cxx:179
 AliFileMerger.cxx:180
 AliFileMerger.cxx:181
 AliFileMerger.cxx:182
 AliFileMerger.cxx:183
 AliFileMerger.cxx:184
 AliFileMerger.cxx:185
 AliFileMerger.cxx:186
 AliFileMerger.cxx:187
 AliFileMerger.cxx:188
 AliFileMerger.cxx:189
 AliFileMerger.cxx:190
 AliFileMerger.cxx:191
 AliFileMerger.cxx:192
 AliFileMerger.cxx:193
 AliFileMerger.cxx:194
 AliFileMerger.cxx:195
 AliFileMerger.cxx:196
 AliFileMerger.cxx:197
 AliFileMerger.cxx:198
 AliFileMerger.cxx:199
 AliFileMerger.cxx:200
 AliFileMerger.cxx:201
 AliFileMerger.cxx:202
 AliFileMerger.cxx:203
 AliFileMerger.cxx:204
 AliFileMerger.cxx:205
 AliFileMerger.cxx:206
 AliFileMerger.cxx:207
 AliFileMerger.cxx:208
 AliFileMerger.cxx:209
 AliFileMerger.cxx:210
 AliFileMerger.cxx:211
 AliFileMerger.cxx:212
 AliFileMerger.cxx:213
 AliFileMerger.cxx:214
 AliFileMerger.cxx:215
 AliFileMerger.cxx:216
 AliFileMerger.cxx:217
 AliFileMerger.cxx:218
 AliFileMerger.cxx:219
 AliFileMerger.cxx:220
 AliFileMerger.cxx:221
 AliFileMerger.cxx:222
 AliFileMerger.cxx:223
 AliFileMerger.cxx:224
 AliFileMerger.cxx:225
 AliFileMerger.cxx:226
 AliFileMerger.cxx:227
 AliFileMerger.cxx:228
 AliFileMerger.cxx:229
 AliFileMerger.cxx:230
 AliFileMerger.cxx:231
 AliFileMerger.cxx:232
 AliFileMerger.cxx:233
 AliFileMerger.cxx:234
 AliFileMerger.cxx:235
 AliFileMerger.cxx:236
 AliFileMerger.cxx:237
 AliFileMerger.cxx:238
 AliFileMerger.cxx:239
 AliFileMerger.cxx:240
 AliFileMerger.cxx:241
 AliFileMerger.cxx:242
 AliFileMerger.cxx:243
 AliFileMerger.cxx:244
 AliFileMerger.cxx:245
 AliFileMerger.cxx:246
 AliFileMerger.cxx:247
 AliFileMerger.cxx:248
 AliFileMerger.cxx:249
 AliFileMerger.cxx:250
 AliFileMerger.cxx:251
 AliFileMerger.cxx:252
 AliFileMerger.cxx:253
 AliFileMerger.cxx:254
 AliFileMerger.cxx:255
 AliFileMerger.cxx:256
 AliFileMerger.cxx:257
 AliFileMerger.cxx:258
 AliFileMerger.cxx:259
 AliFileMerger.cxx:260
 AliFileMerger.cxx:261
 AliFileMerger.cxx:262
 AliFileMerger.cxx:263
 AliFileMerger.cxx:264
 AliFileMerger.cxx:265
 AliFileMerger.cxx:266
 AliFileMerger.cxx:267
 AliFileMerger.cxx:268
 AliFileMerger.cxx:269
 AliFileMerger.cxx:270
 AliFileMerger.cxx:271
 AliFileMerger.cxx:272
 AliFileMerger.cxx:273
 AliFileMerger.cxx:274
 AliFileMerger.cxx:275
 AliFileMerger.cxx:276
 AliFileMerger.cxx:277
 AliFileMerger.cxx:278
 AliFileMerger.cxx:279
 AliFileMerger.cxx:280
 AliFileMerger.cxx:281
 AliFileMerger.cxx:282
 AliFileMerger.cxx:283
 AliFileMerger.cxx:284
 AliFileMerger.cxx:285
 AliFileMerger.cxx:286
 AliFileMerger.cxx:287
 AliFileMerger.cxx:288
 AliFileMerger.cxx:289
 AliFileMerger.cxx:290
 AliFileMerger.cxx:291
 AliFileMerger.cxx:292
 AliFileMerger.cxx:293
 AliFileMerger.cxx:294
 AliFileMerger.cxx:295
 AliFileMerger.cxx:296
 AliFileMerger.cxx:297
 AliFileMerger.cxx:298
 AliFileMerger.cxx:299
 AliFileMerger.cxx:300
 AliFileMerger.cxx:301
 AliFileMerger.cxx:302
 AliFileMerger.cxx:303
 AliFileMerger.cxx:304
 AliFileMerger.cxx:305
 AliFileMerger.cxx:306
 AliFileMerger.cxx:307
 AliFileMerger.cxx:308
 AliFileMerger.cxx:309
 AliFileMerger.cxx:310
 AliFileMerger.cxx:311
 AliFileMerger.cxx:312
 AliFileMerger.cxx:313
 AliFileMerger.cxx:314
 AliFileMerger.cxx:315
 AliFileMerger.cxx:316
 AliFileMerger.cxx:317
 AliFileMerger.cxx:318
 AliFileMerger.cxx:319
 AliFileMerger.cxx:320
 AliFileMerger.cxx:321
 AliFileMerger.cxx:322
 AliFileMerger.cxx:323
 AliFileMerger.cxx:324
 AliFileMerger.cxx:325
 AliFileMerger.cxx:326
 AliFileMerger.cxx:327
 AliFileMerger.cxx:328
 AliFileMerger.cxx:329
 AliFileMerger.cxx:330
 AliFileMerger.cxx:331
 AliFileMerger.cxx:332
 AliFileMerger.cxx:333
 AliFileMerger.cxx:334
 AliFileMerger.cxx:335
 AliFileMerger.cxx:336
 AliFileMerger.cxx:337
 AliFileMerger.cxx:338
 AliFileMerger.cxx:339
 AliFileMerger.cxx:340
 AliFileMerger.cxx:341
 AliFileMerger.cxx:342
 AliFileMerger.cxx:343
 AliFileMerger.cxx:344
 AliFileMerger.cxx:345
 AliFileMerger.cxx:346
 AliFileMerger.cxx:347
 AliFileMerger.cxx:348
 AliFileMerger.cxx:349
 AliFileMerger.cxx:350
 AliFileMerger.cxx:351
 AliFileMerger.cxx:352
 AliFileMerger.cxx:353
 AliFileMerger.cxx:354
 AliFileMerger.cxx:355
 AliFileMerger.cxx:356
 AliFileMerger.cxx:357
 AliFileMerger.cxx:358
 AliFileMerger.cxx:359
 AliFileMerger.cxx:360
 AliFileMerger.cxx:361
 AliFileMerger.cxx:362
 AliFileMerger.cxx:363
 AliFileMerger.cxx:364
 AliFileMerger.cxx:365
 AliFileMerger.cxx:366
 AliFileMerger.cxx:367
 AliFileMerger.cxx:368
 AliFileMerger.cxx:369
 AliFileMerger.cxx:370
 AliFileMerger.cxx:371
 AliFileMerger.cxx:372
 AliFileMerger.cxx:373
 AliFileMerger.cxx:374
 AliFileMerger.cxx:375
 AliFileMerger.cxx:376
 AliFileMerger.cxx:377
 AliFileMerger.cxx:378
 AliFileMerger.cxx:379
 AliFileMerger.cxx:380
 AliFileMerger.cxx:381
 AliFileMerger.cxx:382
 AliFileMerger.cxx:383
 AliFileMerger.cxx:384
 AliFileMerger.cxx:385
 AliFileMerger.cxx:386
 AliFileMerger.cxx:387
 AliFileMerger.cxx:388
 AliFileMerger.cxx:389
 AliFileMerger.cxx:390
 AliFileMerger.cxx:391
 AliFileMerger.cxx:392
 AliFileMerger.cxx:393
 AliFileMerger.cxx:394
 AliFileMerger.cxx:395
 AliFileMerger.cxx:396
 AliFileMerger.cxx:397
 AliFileMerger.cxx:398
 AliFileMerger.cxx:399
 AliFileMerger.cxx:400
 AliFileMerger.cxx:401
 AliFileMerger.cxx:402
 AliFileMerger.cxx:403
 AliFileMerger.cxx:404
 AliFileMerger.cxx:405
 AliFileMerger.cxx:406
 AliFileMerger.cxx:407
 AliFileMerger.cxx:408
 AliFileMerger.cxx:409
 AliFileMerger.cxx:410
 AliFileMerger.cxx:411
 AliFileMerger.cxx:412
 AliFileMerger.cxx:413
 AliFileMerger.cxx:414
 AliFileMerger.cxx:415
 AliFileMerger.cxx:416
 AliFileMerger.cxx:417
 AliFileMerger.cxx:418
 AliFileMerger.cxx:419
 AliFileMerger.cxx:420
 AliFileMerger.cxx:421
 AliFileMerger.cxx:422
 AliFileMerger.cxx:423
 AliFileMerger.cxx:424
 AliFileMerger.cxx:425
 AliFileMerger.cxx:426
 AliFileMerger.cxx:427
 AliFileMerger.cxx:428
 AliFileMerger.cxx:429
 AliFileMerger.cxx:430
 AliFileMerger.cxx:431
 AliFileMerger.cxx:432
 AliFileMerger.cxx:433
 AliFileMerger.cxx:434
 AliFileMerger.cxx:435
 AliFileMerger.cxx:436
 AliFileMerger.cxx:437
 AliFileMerger.cxx:438
 AliFileMerger.cxx:439
 AliFileMerger.cxx:440
 AliFileMerger.cxx:441
 AliFileMerger.cxx:442
 AliFileMerger.cxx:443
 AliFileMerger.cxx:444
 AliFileMerger.cxx:445
 AliFileMerger.cxx:446
 AliFileMerger.cxx:447
 AliFileMerger.cxx:448
 AliFileMerger.cxx:449
 AliFileMerger.cxx:450
 AliFileMerger.cxx:451
 AliFileMerger.cxx:452
 AliFileMerger.cxx:453
 AliFileMerger.cxx:454
 AliFileMerger.cxx:455
 AliFileMerger.cxx:456
 AliFileMerger.cxx:457
 AliFileMerger.cxx:458
 AliFileMerger.cxx:459
 AliFileMerger.cxx:460
 AliFileMerger.cxx:461
 AliFileMerger.cxx:462
 AliFileMerger.cxx:463
 AliFileMerger.cxx:464
 AliFileMerger.cxx:465
 AliFileMerger.cxx:466
 AliFileMerger.cxx:467
 AliFileMerger.cxx:468
 AliFileMerger.cxx:469
 AliFileMerger.cxx:470
 AliFileMerger.cxx:471
 AliFileMerger.cxx:472
 AliFileMerger.cxx:473
 AliFileMerger.cxx:474
 AliFileMerger.cxx:475
 AliFileMerger.cxx:476
 AliFileMerger.cxx:477
 AliFileMerger.cxx:478
 AliFileMerger.cxx:479
 AliFileMerger.cxx:480
 AliFileMerger.cxx:481
 AliFileMerger.cxx:482
 AliFileMerger.cxx:483
 AliFileMerger.cxx:484
 AliFileMerger.cxx:485
 AliFileMerger.cxx:486
 AliFileMerger.cxx:487
 AliFileMerger.cxx:488
 AliFileMerger.cxx:489
 AliFileMerger.cxx:490
 AliFileMerger.cxx:491
 AliFileMerger.cxx:492
 AliFileMerger.cxx:493
 AliFileMerger.cxx:494
 AliFileMerger.cxx:495
 AliFileMerger.cxx:496
 AliFileMerger.cxx:497
 AliFileMerger.cxx:498
 AliFileMerger.cxx:499
 AliFileMerger.cxx:500
 AliFileMerger.cxx:501
 AliFileMerger.cxx:502
 AliFileMerger.cxx:503
 AliFileMerger.cxx:504
 AliFileMerger.cxx:505
 AliFileMerger.cxx:506
 AliFileMerger.cxx:507
 AliFileMerger.cxx:508
 AliFileMerger.cxx:509
 AliFileMerger.cxx:510
 AliFileMerger.cxx:511
 AliFileMerger.cxx:512
 AliFileMerger.cxx:513
 AliFileMerger.cxx:514
 AliFileMerger.cxx:515
 AliFileMerger.cxx:516
 AliFileMerger.cxx:517
 AliFileMerger.cxx:518
 AliFileMerger.cxx:519
 AliFileMerger.cxx:520
 AliFileMerger.cxx:521
 AliFileMerger.cxx:522
 AliFileMerger.cxx:523
 AliFileMerger.cxx:524
 AliFileMerger.cxx:525
 AliFileMerger.cxx:526
 AliFileMerger.cxx:527
 AliFileMerger.cxx:528
 AliFileMerger.cxx:529
 AliFileMerger.cxx:530
 AliFileMerger.cxx:531
 AliFileMerger.cxx:532
 AliFileMerger.cxx:533
 AliFileMerger.cxx:534
 AliFileMerger.cxx:535
 AliFileMerger.cxx:536
 AliFileMerger.cxx:537
 AliFileMerger.cxx:538
 AliFileMerger.cxx:539
 AliFileMerger.cxx:540
 AliFileMerger.cxx:541
 AliFileMerger.cxx:542
 AliFileMerger.cxx:543
 AliFileMerger.cxx:544
 AliFileMerger.cxx:545
 AliFileMerger.cxx:546
 AliFileMerger.cxx:547
 AliFileMerger.cxx:548
 AliFileMerger.cxx:549
 AliFileMerger.cxx:550
 AliFileMerger.cxx:551
 AliFileMerger.cxx:552
 AliFileMerger.cxx:553
 AliFileMerger.cxx:554
 AliFileMerger.cxx:555
 AliFileMerger.cxx:556
 AliFileMerger.cxx:557
 AliFileMerger.cxx:558
 AliFileMerger.cxx:559
 AliFileMerger.cxx:560
 AliFileMerger.cxx:561
 AliFileMerger.cxx:562
 AliFileMerger.cxx:563
 AliFileMerger.cxx:564
 AliFileMerger.cxx:565
 AliFileMerger.cxx:566
 AliFileMerger.cxx:567
 AliFileMerger.cxx:568
 AliFileMerger.cxx:569
 AliFileMerger.cxx:570
 AliFileMerger.cxx:571
 AliFileMerger.cxx:572
 AliFileMerger.cxx:573
 AliFileMerger.cxx:574
 AliFileMerger.cxx:575
 AliFileMerger.cxx:576
 AliFileMerger.cxx:577
 AliFileMerger.cxx:578
 AliFileMerger.cxx:579
 AliFileMerger.cxx:580
 AliFileMerger.cxx:581
 AliFileMerger.cxx:582
 AliFileMerger.cxx:583
 AliFileMerger.cxx:584
 AliFileMerger.cxx:585
 AliFileMerger.cxx:586
 AliFileMerger.cxx:587
 AliFileMerger.cxx:588
 AliFileMerger.cxx:589
 AliFileMerger.cxx:590
 AliFileMerger.cxx:591
 AliFileMerger.cxx:592
 AliFileMerger.cxx:593
 AliFileMerger.cxx:594
 AliFileMerger.cxx:595
 AliFileMerger.cxx:596
 AliFileMerger.cxx:597
 AliFileMerger.cxx:598
 AliFileMerger.cxx:599
 AliFileMerger.cxx:600
 AliFileMerger.cxx:601
 AliFileMerger.cxx:602
 AliFileMerger.cxx:603
 AliFileMerger.cxx:604
 AliFileMerger.cxx:605
 AliFileMerger.cxx:606
 AliFileMerger.cxx:607
 AliFileMerger.cxx:608
 AliFileMerger.cxx:609
 AliFileMerger.cxx:610
 AliFileMerger.cxx:611
 AliFileMerger.cxx:612
 AliFileMerger.cxx:613
 AliFileMerger.cxx:614
 AliFileMerger.cxx:615
 AliFileMerger.cxx:616
 AliFileMerger.cxx:617
 AliFileMerger.cxx:618
 AliFileMerger.cxx:619
 AliFileMerger.cxx:620
 AliFileMerger.cxx:621
 AliFileMerger.cxx:622
 AliFileMerger.cxx:623
 AliFileMerger.cxx:624
 AliFileMerger.cxx:625
 AliFileMerger.cxx:626
 AliFileMerger.cxx:627
 AliFileMerger.cxx:628
 AliFileMerger.cxx:629
 AliFileMerger.cxx:630
 AliFileMerger.cxx:631
 AliFileMerger.cxx:632
 AliFileMerger.cxx:633
 AliFileMerger.cxx:634
 AliFileMerger.cxx:635
 AliFileMerger.cxx:636
 AliFileMerger.cxx:637
 AliFileMerger.cxx:638
 AliFileMerger.cxx:639
 AliFileMerger.cxx:640
 AliFileMerger.cxx:641
 AliFileMerger.cxx:642
 AliFileMerger.cxx:643
 AliFileMerger.cxx:644
 AliFileMerger.cxx:645
 AliFileMerger.cxx:646
 AliFileMerger.cxx:647
 AliFileMerger.cxx:648
 AliFileMerger.cxx:649
 AliFileMerger.cxx:650
 AliFileMerger.cxx:651
 AliFileMerger.cxx:652
 AliFileMerger.cxx:653
 AliFileMerger.cxx:654
 AliFileMerger.cxx:655
 AliFileMerger.cxx:656
 AliFileMerger.cxx:657
 AliFileMerger.cxx:658
 AliFileMerger.cxx:659
 AliFileMerger.cxx:660
 AliFileMerger.cxx:661
 AliFileMerger.cxx:662
 AliFileMerger.cxx:663
 AliFileMerger.cxx:664
 AliFileMerger.cxx:665
 AliFileMerger.cxx:666
 AliFileMerger.cxx:667
 AliFileMerger.cxx:668
 AliFileMerger.cxx:669
 AliFileMerger.cxx:670
 AliFileMerger.cxx:671
 AliFileMerger.cxx:672
 AliFileMerger.cxx:673
 AliFileMerger.cxx:674
 AliFileMerger.cxx:675
 AliFileMerger.cxx:676
 AliFileMerger.cxx:677
 AliFileMerger.cxx:678
 AliFileMerger.cxx:679
 AliFileMerger.cxx:680
 AliFileMerger.cxx:681
 AliFileMerger.cxx:682
 AliFileMerger.cxx:683
 AliFileMerger.cxx:684
 AliFileMerger.cxx:685
 AliFileMerger.cxx:686
 AliFileMerger.cxx:687
 AliFileMerger.cxx:688
 AliFileMerger.cxx:689
 AliFileMerger.cxx:690
 AliFileMerger.cxx:691
 AliFileMerger.cxx:692
 AliFileMerger.cxx:693
 AliFileMerger.cxx:694
 AliFileMerger.cxx:695
 AliFileMerger.cxx:696
 AliFileMerger.cxx:697
 AliFileMerger.cxx:698
 AliFileMerger.cxx:699
 AliFileMerger.cxx:700
 AliFileMerger.cxx:701
 AliFileMerger.cxx:702
 AliFileMerger.cxx:703
 AliFileMerger.cxx:704
 AliFileMerger.cxx:705
 AliFileMerger.cxx:706
 AliFileMerger.cxx:707
 AliFileMerger.cxx:708