Updated version of the Test TPC toolkits (Marian)
[u/mrichter/AliRoot.git] / TPC / macros / testTPC / AlienToolkit.cxx
1 #include "TGrid.h"
2 #include "TGridCollection.h"
3 #include "TSystem.h"
4 #include "TString.h"
5 #include "TFile.h"
6 #include "TMap.h"
7 #include "TGridResult.h"
8 #include "TAlien.h"
9 #include "TAlienResult.h"
10 #include <fstream>
11
12
13
14
15  
16 /*
17   gSystem->Load("libXrdClient.so");
18   gSystem->Load("libNetx.so");
19   .L $ALICE_ROOT/TPC/macros/testTPC/AlienToolkit.cxx+
20   //Reconstructed data example  
21   char *mask = "v14*";
22   char *path = "/alice/cern.ch/user/m/miranov/test2007/"
23   // raw data
24   char *mask = "0000191*RecPo*.root";
25   char *path = "/alice/data/2008/LHC08a_TPC/"
26  
27   AlienToolkit toolkit;
28   toolkit.MakeCollection(path,mask);
29
30   //
31   toolkit.MakeJobList("job.list","", "", "rec");
32
33 */
34
35
36
37 class AlienToolkit: public TObject{
38 public:
39   AlienToolkit();
40   TGridCollection* MakeCollection(const char *path,  char *mask);
41   void             Stage();
42   void             LocalCopy(const char* destination);
43   void             RemoteCopy(const char* destination="root://gsiaf.gsi.de:1094/", Int_t maxfiles=20);
44   void             PrintPFN();
45   void             MakeJobList(const  char * outname, const char *outputPrefix,  const char *action, const char *suffix);
46   static Bool_t    IsDir(const char * name);
47   static Bool_t    IsFile(const char * name);
48   static Bool_t    ResubmitJobs();
49
50 public:
51   TGridCollection *fCollection;
52   TObjArray        fInfoArray;
53   ClassDef(AlienToolkit,1)
54 };
55
56 ClassImp(AlienToolkit)
57
58 AlienToolkit::AlienToolkit():
59   fCollection(0)
60 {
61   if (!gGrid)
62     TGrid::Connect("alien://",0,0,"t");
63 }
64
65
66
67
68 Bool_t AlienToolkit::IsDir(const char * name){
69   //
70   // Check if it is directory
71   // 
72   void *dir = gSystem->OpenDirectory(name);
73   return (dir!=0);
74 }
75
76
77 Bool_t AlienToolkit::IsFile(const  char *name ){
78   //
79   // Check if is it file
80   //
81   Long_t id, size, flags, modtime ;
82   Int_t ret = gSystem->GetPathInfo(name,&id, &size, &flags, &modtime);
83   if (ret==0) return kFALSE;
84   if ((flags&2)>0) return kFALSE;
85   return kTRUE;
86 }
87
88
89 TGridCollection* AlienToolkit::MakeCollection(const char *path,  char *mask){
90   //
91   /*char *mask = "root_archive.zip";
92     char *path = "/alice/cern.ch/user/m/miranov/test2007/"
93   */
94   //
95   TGridResult* query = gGrid->Query(path,mask);  
96   TGridCollection* collection=gGrid->OpenCollectionQuery(query);
97   //  collection->SelectFile(mask,1,20); // select files 0-100
98   collection->LookupSUrls();
99   //collection->CheckIfOnline();
100   collection->Reset();
101   fCollection = collection;
102   //
103   collection->Reset();
104   Int_t counter=0;
105   Int_t counterm=0;
106   Int_t counterf=0;
107   TMap *filemap;
108   while ( (filemap = collection->Next())) { 
109     TIterator *nextfile = filemap->MakeIterator();
110     TMap *attributes;
111     while ((attributes = (TMap *) nextfile->Next())) {
112       printf("%d\t%d\t%d\n",counter, counterm,counterf); 
113       TMap * map = new TMap;
114       fInfoArray.AddLast(map);
115
116       TObjString *surl = new TObjString(collection->GetSURL(attributes->GetName()));
117       TObjString *turl =  new TObjString(collection->GetTURL(attributes->GetName()));
118       TObjString *lfn =  new TObjString(collection->GetLFN(attributes->GetName()));
119       map->Add(new TObjString("alienLFN"),lfn);
120       map->Add(new TObjString("alienSURL"),surl);
121       map->Add(new TObjString("alienTURL"),turl);
122      
123
124       Int_t   isOnline = collection->IsOnline(attributes->GetName());
125       printf("Base Name:\t%s\n",attributes->GetName());
126       printf("Size:\t%d\n",(Int_t)collection->GetSize());
127       printf("IsOnline:\t%d\n",collection->IsOnline());
128       printf("IsSelected:\t%d\n",collection->IsSelected());
129       printf("IsOnline:\t%d\n",isOnline);
130       printf("LFN  Name:\t%s\n",lfn->String().Data());
131       printf("TURL Name:\t%s\n",turl->String().Data());
132       printf("SURL Name:\t%s\n",surl->String().Data());
133       counter++;
134       counterf++;
135       
136     }
137     counterf=0;
138     counterm++;
139   }
140 }
141
142
143 void AlienToolkit::Stage(){
144   //
145   // Stage selected alien files
146   //
147   Int_t entries = fInfoArray.GetEntries();
148   ofstream aout("stage.txt");
149   for (Int_t i=0; i<entries;i++){
150     TMap &map = *((TMap*)fInfoArray.At(i));
151     TObjString *lfn = (TObjString*)map("alienLFN");
152     if (!lfn) continue;
153     printf("Staging submitfor\t%s\n",lfn->String().Data());
154     aout<<"stage "<<lfn->String().Data()<<endl;
155   }
156   aout.close();
157   gSystem->Exec("aliensh file:stage.txt");
158 }
159
160 void AlienToolkit::LocalCopy(const char *destination){
161   //
162   // Copy selected files to the destination directory
163   // the LFN path name translated to the directory name replacing
164   // separtor - the flat structure is created 
165
166   Int_t entries = fInfoArray.GetEntries();
167   ofstream aout("stage.txt");
168   for (Int_t i=0; i<entries;i++){
169     TMap &map = *((TMap*)fInfoArray.At(i));
170     TObjString *lfn = (TObjString*)map("alienLFN");
171     if (!lfn) continue;
172     printf("Staging submitfor\t%s\n",lfn->String().Data());
173     TString dnames=lfn->String().Data();
174     dnames.ReplaceAll(".root_dir","");
175     dnames.ReplaceAll("/","_");
176     TString dname=destination;
177     dname+=dnames;
178     aout<<"cp  "<<lfn->String().Data()<<" "<<dname.Data()<<endl;
179   }
180   aout.close();
181   gSystem->Exec("aliensh file:stage.txt");
182 }
183
184
185 void              AlienToolkit::PrintPFN(){
186   //
187   //
188   // 
189   Int_t entries = fInfoArray.GetEntries();
190   for (Int_t i=0; i<entries;i++){
191     TMap &map = *((TMap*)fInfoArray.At(i));
192     TObjString *lfn = (TObjString*)map("alienLFN");
193     TObjString *pfn = (TObjString*)map("alienSURL");
194     if (!lfn) continue;
195     if (!pfn) continue;
196     printf("%s\n",pfn->String().Data());
197   }
198 }
199
200 void   AlienToolkit::MakeJobList(const  char * outname, const char *outputPrefix, const char *action, const char *suffix){
201   //
202   //
203   //
204    Int_t entries = fInfoArray.GetEntries();
205   ofstream aout(outname);
206   for (Int_t i=0; i<entries;i++){
207     TMap &map = *((TMap*)fInfoArray.At(i));
208     TObjString *lfn = (TObjString*)map("alienLFN");
209     TObjString *pfn = (TObjString*)map("alienSURL");
210     if (!lfn) continue;
211     if (!pfn) continue;
212      if (lfn->String().Contains(".tag.")) continue;
213     printf("Job info\t%s\n",lfn->String().Data());
214     TString jobID=lfn->String().Data();
215     jobID.ReplaceAll("/","_");
216     //
217     //
218     //
219     //
220     TString outputDir=outputPrefix;
221     outputDir+=lfn->String().Data();
222     
223     aout<<jobID<<" "<<pfn->String().Data()<<"  "<<outputDir.Data()<<" "<<action;
224     if (suffix)  aout<<" "<<suffix<<"\n";
225     aout<<endl;
226   }
227   aout.close();
228   //
229 }
230
231
232 void AlienToolkit::RemoteCopy(const char *destination,Int_t maxfiles){
233   //
234   // Copy selected files to the destination directory
235   // the LFN path name translated to the directory name replacing
236   // separtor - the flat structure is created 
237
238   Int_t entries = fInfoArray.GetEntries();
239   ofstream *aout=0;
240   for (Int_t i=0; i<entries;i++){
241     if (i%maxfiles==0){
242       if (aout) aout->close();
243       aout = new ofstream(Form("stage_%d.sh",i/maxfiles));
244       (*aout)<<"!/bin/bash\n";
245       (*aout)<<"source ~/.balice\n";
246     }
247     TMap &map = *((TMap*)fInfoArray.At(i));
248     TObjString *pfn = (TObjString*)map("alienSURL");
249     TObjString *lfn = (TObjString*)map("alienLFN");
250     if (!pfn) continue;
251     if (!lfn) continue;
252     TString dnames=lfn->String().Data();
253     TString dname=destination;
254     dname+=dnames;
255     (*aout)<<"xrdcp -d 1 "<<pfn->String().Data()<<" "<<dname.Data()<<endl;
256   }
257   aout->close();
258   //gSystem->Exec("aliensh file:stage.txt");
259 }
260
261 Bool_t AlienToolkit::ResubmitJobs(){
262   //
263   // Resubmit the processes finished in error state
264   //
265   //gSystem->Exec("alien_ps | grep EE > ps.txt")
266   gSystem->Exec("alien_ps | grep EE |gawk '{print $2}' > psEE.txt");
267   gSystem->Exec("alien_ps | grep EXPIRED |gawk '{print $2}' > psEXPIRED.txt");
268   //
269   ifstream in;
270   in.open("psEXPIRED.txt");
271   TString line;
272   TString result;
273   while(in.good()) {
274     in >> line;
275     //    line.ReplaceAll("-","");
276     printf("Resubmiting %s\n",line.Data());
277     Int_t pos = line.First("-");
278     printf("%s\n",Form("alien_resubmit %s",&line.Data()[pos+1]));
279     gSystem->Exec(Form("alien_resubmit %s",&line.Data()[pos+1]));
280   }
281   in.close();
282 }
283
284
285
286
287
288 /*
289   Problems:
290 1. ????  fCollection.IsOnline("")
291
292   #12 0x04e9a03f in XrdClientAdmin::IsFileOnline (this=0x94a91b0, vs=@0xbfe07f60, vb=@0xbfe07f80) at ../../src/XrdClient/XrdClientVector.hh:55
293 #13 0x0423a975 in TXNetSystem::IsOnline (this=0x9652800,
294     path=0x9661488 "root://voalice04.cern.ch:1094//castor/cern.ch/alice/2005_castor2/15/23612/9e787bec-b010-11dc-a80c-000e0c3e6d91")
295     at netx/src/TXNetSystem.cxx:476
296 #14 0x04237c6e in TXNetFileStager::IsStaged (this=0x96526b8,
297     path=0x9661400 "root://voalice04.cern.ch:1094//castor/cern.ch/alice/2005_castor2/15/23612/9e787bec-b010-11dc-a80c-000e0c3e6d91")
298     at netx/src/TXNetFileStager.cxx:63
299 #15 0x00551117 in TFileStager::GetStaged (this=0x96526b8, pathlist=0x9649820) at net/src/TFileStager.cxx:58
300 #16 0x010e5d96 in TAlienCollection::CheckIfOnline (this=0x95da8d8, bulk=true) at alien/src/TAlienCollection.cxx:1143
301
302
303 2. id xrootd on voalice04.cern.ch ?
304    "root://voalice04.cern.ch:1094//castor/cern.ch/alice/2005_castor2/15/23612/9e787bec-b010-11dc-a80c-000e0c3e6d91"
305
306 3. How to check if the file exist in redirector ?
307    
308 4. Ho
309
310 */
311