]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/CalibMacros/CPass0/merge.C
Updating steering macros according to latest changes in alien:
[u/mrichter/AliRoot.git] / PWGPP / CalibMacros / CPass0 / merge.C
CommitLineData
27eb9bff 1/*
2 merge output calib objects on Alien
3 using AliFileMerger functionality
4
5 Directory with runCalibTrain output: outputDir
6 pattern: AliESDfriends_v1.root
7 Output file name: CalibObjects.root
8
9 Example:
10 .L $ALICE_ROOT/ANALYSIS/CalibMacros/MergeCalibration/merge.C
11 merge("alien:///alice/cern.ch/user/j/jotwinow/CalibTrain/output","AliESDfriends_v1.root");
12*/
13void mergeInChunksTXT(const char* mlist, const char* dest, int maxFiles=700);
14
15
2d016b20 16void merge(const char* outputDir, const char* pattern, Bool_t copyLocal=kFALSE, const char* outputFileName="CalibObjects.root")
27eb9bff 17{
18 //
19 // load libraries
20 //
21 printf("Merging with chunks copying turned %s\n",copyLocal ? "ON":"OFF");
cd9dc5c7 22 gROOT->Macro("$ALICE_ROOT/PWGPP/CalibMacros/CPass0/LoadLibraries.C");
c74e2828 23
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());
4d2581eb 31 if (!outputDirFailure && (flags==0))
c74e2828 32 {
33 printf("### processing local fileList: %s\n",outputDir);
34 listFileName=outputDir;
35 }
36 else
37 {
38 cpTimeOut(outputDir, pattern, 10, copyLocal);
39 listFileName="calib.list";
40 }
41
27eb9bff 42 //
43 // local
2d016b20 44 mergeInChunksTXT(listFileName.Data(),outputFileName);
27eb9bff 45 // AliFileMerger merger;
46 // merger.AddReject("esdFriend"); // do not merge
47 // merger.SetMaxFilesOpen(700);
48 // merger.IterTXT("calib.list","CalibObjects.root",kFALSE);
49
50 // alien
51 //merger.IterAlien(outputDir, "CalibObjects.root", pattern);
52
53 return;
54}
55
56void cpTimeOut(const char * searchdir, const char* pattern, Int_t timeOut=10, Bool_t copyLocal)
57{
58
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);
64
65 TGrid::Connect("alien");
66
67 TString filelist;
68 TString command;
69 command = Form("find %s/ %s", searchdir, pattern);
70 cerr<<"command: "<<command<<endl;
71 TGridResult *res = gGrid->Command(command);
72 if (!res) return;
73 res->Print();
74 TIter nextmap(res);
75 TMap *map = 0;
76
77 ofstream outputFile;
78 outputFile.open(Form("calib.list"));
79 Int_t counter=0;
80
81 while((map=(TMap*)nextmap()))
82 {
83 TObjString *objs = dynamic_cast<TObjString*>(map->GetValue("turl"));
84 if (!objs || !objs->GetString().Length())
85 {
86 delete res;
87 break;
88 }
89
90 TString src=Form("%s",objs->GetString().Data());
91 TString dst=src;
92 Bool_t result = kTRUE;
93 if (copyLocal) {
94 dst.ReplaceAll("alien:///","");
95 dst.ReplaceAll("/","_");
96 TTimeStamp s1;
97 result = TFile::Cp(src.Data(),dst.Data(),kTRUE);
98 TTimeStamp s2;
99 AliSysInfo::AddStamp(dst.Data(),counter, result);
100 }
101 if (result) {
102 counter++;
103 outputFile << dst.Data()<< endl;
104 }
105 }
106 if (copyLocal) cout<<counter<<" files copied!"<<endl;
107 else cout<<counter<<" files registerd!"<<endl;
108 outputFile.close();
109 gSystem->Exec("mv syswatch.log syswatch_copy.log");
110 return;
111}
112
113void mergeInChunksTXT(const char* mlist, const char* dest, int maxFiles)
114{
115 TH1::AddDirectory(0);
116 AliFileMerger merger;
7b58b4ed 117 merger.SetNoTrees(kFALSE);
27eb9bff 118 // merger.SetMaxFilesOpen(999);
119 merger.AddReject("esdFriend"); // do not merge
e6844064 120 merger.AddReject("syswatchRec"); // do not merge
121 merger.AddReject("syswatchCalib"); // do not merge
27eb9bff 122 //
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"};
128 //
129 gSystem->ExpandPathName(filesToMerge);
130 ofstream outfile;
131 ifstream infile(filesToMerge.Data());
132 if (!infile) {printf("No %s file\n",filesToMerge.Data()); return;}
133 //
134 int currTmp = 0, nfiles = 0, nparts = 0; // counter for number of merging operations
135 string line;
136 TString lineS;
137 while ( !infile.eof() ) {
138 getline(infile, line);
139 lineS = 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
144 outfile.close();
145 merger.IterTXT(tmpMerge[2], tmpMerge[currTmp] ,kFALSE);
146 printf("Merging to %s | %d files at step %d\n",tmpMerge[currTmp], nfiles,nparts);
147 }
148 outfile.open(tmpMerge[2], ios::out); // start list for new chunk
149 if (nparts++) {
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
152 }
153 currTmp = (currTmp==0) ? 1:0; // swap tmp files
154 }
155 outfile << line << endl;
156 nfiles++;
157 }
158 // merge the rest
159 merger.IterTXT(tmpMerge[2], dest ,kFALSE);
160 outfile.close();
161 infile.close();
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);
164 //
165}
166