+void mergeInChunksTXT(const char* mlist, const char* dest, int maxFiles)
+{
+ TH1::AddDirectory(0);
+ AliFileMerger merger;
+ // merger.SetMaxFilesOpen(999);
+ merger.AddReject("esdFriend"); // do not merge
+ //
+ if (maxFiles<2) maxFiles = 2;
+ TString filesToMerge = mlist, fileDest = dest;
+ if (filesToMerge.IsNull()) {printf("List to merge is not provided\n"); return;}
+ if (fileDest.IsNull()) {printf("Merging destination is not provided\n"); return;}
+ const char* tmpMerge[3]={"__merge_part0.root","__merge_part1.root","__part_of_calib.list"};
+ //
+ gSystem->ExpandPathName(filesToMerge);
+ ofstream outfile;
+ ifstream infile(filesToMerge.Data());
+ if (!infile) {printf("No %s file\n",filesToMerge.Data()); return;}
+ //
+ int currTmp = 0, nfiles = 0, nparts = 0; // counter for number of merging operations
+ string line;
+ TString lineS;
+ while ( !infile.eof() ) {
+ getline(infile, line);
+ lineS = line;
+ if (lineS.IsNull() || lineS.BeginsWith("#")) continue;
+ int st = nfiles%maxFiles;
+ if (st==0) { // new chunk should be started
+ if (nfiles) { // merge prev. chunk
+ outfile.close();
+ merger.IterTXT(tmpMerge[2], tmpMerge[currTmp] ,kFALSE);
+ printf("Merging to %s | %d files at step %d\n",tmpMerge[currTmp], nfiles,nparts);
+ }
+ outfile.open(tmpMerge[2], ios::out); // start list for new chunk
+ if (nparts++) {
+ printf("Adding previous result %s | %d files %d at part\n",tmpMerge[currTmp], nfiles,nparts);
+ outfile << tmpMerge[currTmp] << endl; // result of previous merge goes 1st
+ }
+ currTmp = (currTmp==0) ? 1:0; // swap tmp files
+ }
+ outfile << line << endl;
+ nfiles++;
+ }
+ // merge the rest
+ merger.IterTXT(tmpMerge[2], dest ,kFALSE);
+ outfile.close();
+ infile.close();
+ for (int i=0;i<3;i++) gSystem->Exec(Form("if [ -e %s ]; then \nrm %s\nfi",tmpMerge[i],tmpMerge[i]));
+ printf("Merged %d files in %d steps\n",nfiles, nparts);
+ //
+}
+