2 merge output calib objects on Alien
3 using AliFileMerger functionality
5 Directory with runCalibTrain output: outputDir
6 pattern: AliESDfriends_v1.root
7 Output file name: CalibObjects.root
10 .L $ALICE_ROOT/ANALYSIS/CalibMacros/MergeCalibration/merge.C
11 merge("alien:///alice/cern.ch/user/j/jotwinow/CalibTrain/output","AliESDfriends_v1.root");
13 void mergeInChunksTXT(const char* mlist, const char* dest, int maxFiles=700);
16 void merge(const char* outputDir, const char* pattern, Bool_t copyLocal=kFALSE, const char* outputFileName="mergedAnalysisResults.root")
21 printf("Merging with chunks copying turned %s\n",copyLocal ? "ON":"OFF");
22 gROOT->Macro("$ALICE_ROOT/PWGCF/FLOW/macros/LoadLibraries.C");
24 //if pattern is empty and outputDir is a local file assume it contains the list of files to merge
25 //otherwise fall back to old behaviour: search alien and process those files
26 TString listFileName("file.list");
27 TString patternStr(pattern);
28 Long_t id, size, flags, modtime;
29 Bool_t outputDirFailure = gSystem->GetPathInfo(outputDir, &id, &size, &flags, &modtime);
30 printf("st: %i, flags: %i, patt: %s\n",outputDirFailure,flags,patternStr.Data());
31 if (!outputDirFailure && (flags==0))
33 printf("### processing local fileList: %s\n",outputDir);
34 listFileName=outputDir;
38 cpTimeOut(outputDir, pattern, 10, copyLocal);
39 listFileName="calib.list";
44 mergeInChunksTXT(listFileName.Data(),outputFileName);
45 // AliFileMerger merger;
46 // merger.AddReject("esdFriend"); // do not merge
47 // merger.SetMaxFilesOpen(700);
48 // merger.IterTXT("calib.list","CalibObjects.root",kFALSE);
51 //merger.IterAlien(outputDir, "CalibObjects.root", pattern);
56 void cpTimeOut(const char * searchdir, const char* pattern, Int_t timeOut=10, Bool_t copyLocal)
59 gSystem->Setenv("XRDCLIENTMAXWAIT",Form("%d",timeOut));
60 gEnv->SetValue("XNet.RequestTimeout", timeOut);
61 gEnv->SetValue("XNet.ConnectTimeout", timeOut);
62 gEnv->SetValue("XNet.TransactionTimeout", timeOut);
63 TFile::SetOpenTimeout(timeOut);
65 TGrid::Connect("alien");
69 command = Form("find %s/ %s", searchdir, pattern);
70 cerr<<"command: "<<command<<endl;
71 TGridResult *res = gGrid->Command(command);
78 outputFile.open(Form("calib.list"));
81 while((map=(TMap*)nextmap()))
83 TObjString *objs = dynamic_cast<TObjString*>(map->GetValue("turl"));
84 if (!objs || !objs->GetString().Length())
90 TString src=Form("%s",objs->GetString().Data());
92 Bool_t result = kTRUE;
94 dst.ReplaceAll("alien:///","");
95 dst.ReplaceAll("/","_");
97 result = TFile::Cp(src.Data(),dst.Data(),kTRUE);
99 AliSysInfo::AddStamp(dst.Data(),counter, result);
103 outputFile << dst.Data()<< endl;
106 if (copyLocal) cout<<counter<<" files copied!"<<endl;
107 else cout<<counter<<" files registerd!"<<endl;
109 gSystem->Exec("mv syswatch.log syswatch_copy.log");
113 void mergeInChunksTXT(const char* mlist, const char* dest, int maxFiles)
115 TH1::AddDirectory(0);
116 AliFileMerger merger;
117 merger.SetNoTrees(kFALSE);
118 // merger.SetMaxFilesOpen(999);
119 merger.AddReject("esdFriend"); // do not merge
120 merger.AddReject("syswatchRec"); // do not merge
121 merger.AddReject("syswatchCalib"); // do not merge
123 if (maxFiles<2) maxFiles = 2;
124 TString filesToMerge = mlist, fileDest = dest;
125 if (filesToMerge.IsNull()) {printf("List to merge is not provided\n"); return;}
126 if (fileDest.IsNull()) {printf("Merging destination is not provided\n"); return;}
127 const char* tmpMerge[3]={"__merge_part0.root","__merge_part1.root","__part_of_calib.list"};
129 gSystem->ExpandPathName(filesToMerge);
131 ifstream infile(filesToMerge.Data());
132 if (!infile) {printf("No %s file\n",filesToMerge.Data()); return;}
134 int currTmp = 0, nfiles = 0, nparts = 0; // counter for number of merging operations
137 while ( !infile.eof() ) {
138 getline(infile, line);
140 if (lineS.IsNull() || lineS.BeginsWith("#")) continue;
141 int st = nfiles%maxFiles;
142 if (st==0) { // new chunk should be started
143 if (nfiles) { // merge prev. chunk
145 merger.IterTXT(tmpMerge[2], tmpMerge[currTmp] ,kFALSE);
146 printf("Merging to %s | %d files at step %d\n",tmpMerge[currTmp], nfiles,nparts);
148 outfile.open(tmpMerge[2], ios::out); // start list for new chunk
150 printf("Adding previous result %s | %d files %d at part\n",tmpMerge[currTmp], nfiles,nparts);
151 outfile << tmpMerge[currTmp] << endl; // result of previous merge goes 1st
153 currTmp = (currTmp==0) ? 1:0; // swap tmp files
155 outfile << line << endl;
159 merger.IterTXT(tmpMerge[2], dest ,kFALSE);
162 for (int i=0;i<3;i++) gSystem->Exec(Form("if [ -e %s ]; then \nrm %s\nfi",tmpMerge[i],tmpMerge[i]));
163 printf("Merged %d files in %d steps\n",nfiles, nparts);