ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/DATATRANSFER/loadLFN/loadLFN.py
Revision: 1.3
Committed: Fri Jul 8 17:16:34 2011 UTC (13 years, 9 months ago) by fmoscato
Content type: text/x-python
Branch: MAIN
Changes since 1.2: +6 -4 lines
Log Message:
improvments

File Contents

# User Rev Content
1 fmoscato 1.1 #!/bin/env python
2     from ConfigParser import ConfigParser
3     import string
4     import html as h
5     import os
6     import os.path
7    
8     Usage = """
9     loadLFN.py
10     Options:
11     --file file that does contain list of lFNs
12     --out_dir output directory
13 fmoscato 1.2 --verbose verbose
14     --skip string that has to be skipped (can have multiple values comma separeted)
15 fmoscato 1.1 --help help
16     """
17    
18    
19     class LfnType:
20     def __init__(self):
21     self.info_data={}
22     self.info_mc={}
23     self.info_relval={}
24     self.info_user={}
25     self.info_group={}
26     self.info_results={}
27     self.tmp_list=[]
28     self.dqm_list=[]
29     self.lumi_list=[]
30     self.info_err={}
31    
32     class ConfigFile(ConfigParser):
33     def __init__(self, path=None):
34     ConfigParser.__init__(self)
35     self.read(path)
36    
37    
38    
39 fmoscato 1.2 def loadData(lfn_list,lfn,cfg,values_toskip=None):
40 fmoscato 1.1
41    
42     data=loadList(cfg.get('DATA','data'))
43     tiers=loadList(cfg.get('TIER','tiers'))
44     PD_categories=loadDict(cfg.get('TIER','PD_categories'))
45     data_categories=loadDict(cfg.get('TIER','data_categories'))
46     msg_err={'generic':[],'type':[],'root_file':[],'file':[]}
47    
48     for file in lfn_list:
49 fmoscato 1.2
50     value_toskip=False
51     if values_toskip:
52     for v in values_toskip:
53     if file.find(v) != -1:
54     value_toskip=True
55     break
56     if value_toskip:continue
57    
58    
59 fmoscato 1.1
60     err=False
61     #removing the final \n
62     file=file[:-1]
63     lst=file.split('/')
64     if len(lst) <6 :
65     msg_err['generic'].append("malformed file (too short %i): %s"%(len(lst),file))
66     continue
67     if '' in lst:lst.remove('')
68     type=lst[1]
69    
70    
71     if lst[0] !="store":
72     msg_err['type'].append("malformed file (doesn't contain store): %s"%(file))
73     continue
74    
75     if type not in data:
76     if type not in lfn.info_err.keys():
77     lfn.info_err[type]={}
78     err=True
79    
80    
81     if lst[len(lst)-1][-4:] != 'root':
82     msg_err['root_file'].append("malformed file (not a root file) :%s"%file)
83    
84    
85     if type == 'lumi':
86     lfn.lumi_list.append(file)
87     elif type == 'dqm':
88     lfn.dqm_list.append(file)
89     elif type == 'temp':
90     lfn.tmp_list.append(file)
91     elif type in ('group','results'):
92     groupname=lst[2]
93     if type == 'group':
94     if groupname not in lfn.info_group.keys():
95     lfn.info_group[groupname]=[]
96     lfn.info_group[groupname].append(file)
97     elif type == 'result':
98     if groupname not in lfn.info_results.keys():
99     lfn.info_results[groupname]=[]
100     lfn.info_results[groupname].append(file)
101     elif type == 'user':
102     usrname=lst[2]
103     if usrname not in lfn.info_user:
104     lfn.info_user[usrname]=[]
105     lfn.info_user[usrname].append(file)
106     elif type in ('data', 'relval','mc'):
107     data_tier=(lst[4]).strip()
108     if data_tier not in tiers:
109     msg_err['file'].append("malformed file (not valid data tier %s): %s" %(data_tier,file))
110     continue
111    
112     #extract the acquisition era
113     acq_era_lst=lst[2].split('-')
114     if len(acq_era_lst) < 2 : acq_era_lst=lst[2].split('_')
115    
116     era=acq_era_lst[0]
117    
118     for pd in PD_categories.keys():
119    
120     if era in PD_categories[pd]:
121     era=pd
122     else:
123     for i in PD_categories[pd]:
124     if era.startswith(i):
125     era=pd
126    
127     #data tier
128     for dt in sorted(data_categories.keys()):
129     if data_tier in data_categories[dt]:
130     data_tier=dt
131    
132     g_lfn='/%s'%'/'.join(lst[0:6])
133    
134     if type == 'data' :
135    
136     if era not in lfn.info_data:
137     lfn.info_data[era]={}
138    
139    
140     if data_tier not in lfn.info_data[era]:
141     lfn.info_data[era][data_tier]={}
142    
143     if g_lfn not in lfn.info_data[era][data_tier]:
144     lfn.info_data[era][data_tier][g_lfn]=[]
145    
146     lfn.info_data[era][data_tier][g_lfn].append(file)
147    
148    
149     elif type == 'mc':
150    
151     if era not in lfn.info_mc:
152     lfn.info_mc[era]={}
153    
154     if data_tier not in lfn.info_mc[era]:
155     lfn.info_mc[era][data_tier]={}
156    
157     if g_lfn not in lfn.info_mc[era][data_tier]:
158     lfn.info_mc[era][data_tier][g_lfn]=[]
159    
160     lfn.info_mc[era][data_tier][g_lfn].append(file)
161    
162     elif type == 'relval':
163    
164     if era not in lfn.info_relval:
165     lfn.info_relval[era]={}
166    
167     if data_tier not in lfn.info_relval[era]:
168     lfn.info_relval[era][data_tier]={}
169    
170     if g_lfn not in lfn.info_relval[era][data_tier]:
171     lfn.info_relval[era][data_tier][g_lfn]=[]
172    
173     lfn.info_relval[era][data_tier][g_lfn].append(file)
174    
175     elif err:
176     key='/%s'%'/'.join(lst[0:len(lst)-2])
177     if key not in lfn.info_err[type].keys():
178     lfn.info_err[type][key]=[]
179     lfn.info_err[type][key].append(file)
180    
181    
182    
183     return msg_err
184    
185    
186     def printdata(cfg,lfn,dir,verbose):
187    
188     printMultipleDict(cfg,lfn.info_data,dir+"/data.html",'/store/data',verbose)
189     printMultipleDict(cfg,lfn.info_mc,dir+"/mc.html",'/store/mc',verbose)
190 fmoscato 1.2 printMultipleDict(cfg,lfn.info_relval,dir+"/relval.html",'/store/relval',verbose)
191 fmoscato 1.1 printDict(lfn.info_group,dir+"/group.html",'/store/group',verbose)
192     printDict(lfn.info_results,dir+"/result.html",'/store/result',verbose)
193     printDict(lfn.info_user,dir+"/user.html",'/store/user',verbose)
194     if len(lfn.tmp_list): printList(lfn.tmp_list,dir+"/temp.txt","/store/temp")
195     if len(lfn.dqm_list): printList(lfn.dqm_list,dir+"/dqm.txt","/store/dqm")
196     if len(lfn.lumi_list):printList(lfn.lumi_list,dir+"/lumi.txt","/store/lumi")
197    
198     dir_err=dir+"/err"
199     for i,k in lfn.info_err.iteritems():
200     printDict(k,"%s/%s.html"%(dir_err,i),'/store/%s'%i,verbose)
201    
202    
203    
204     def printList(lst,file,title):
205    
206     fd=open(file,'w')
207    
208     fd.write(title+'\n')
209    
210     for item in lst:
211    
212     fd.write(item+'\n')
213    
214     fd.close()
215    
216     def printDict(info,file,title,verbose=None):
217    
218     if len(info.keys()):
219    
220 fmoscato 1.3 fd=open(file,'w')
221 fmoscato 1.1 fd.write( h.head)
222     fd.write(h.body)
223     fd.write(title)
224     fd.write(h.table)
225     tot_lst=[len(item) for item in info.keys()]
226    
227     for item in sorted(info.keys()):
228     fd.write(h.tr)
229     fd.write( h.td%item)
230     fd.write('<td>')
231     if verbose:
232     fd.write( h.inner_table)
233     for i in info[item]:
234     fd.write(h.tr)
235 fmoscato 1.2 fd.write('<td nowrap>%s</td>'%i)
236 fmoscato 1.1 fd.write( h.end_tr)
237     fd.write( h.end_table)
238     else:
239     el="%i"%len(info[item])
240     fd.write(h.td%el)
241     fd.write('</td>')
242    
243     fd.write(h.end_tr)
244     fd.write(h.tr)
245     fd.write(h.td%'TOT')
246     fd.write(h.td%'&nbsp;')
247     el='%i'%sum(tot_lst)
248     fd.write(h.td%el)
249    
250     fd.write(h.end_tr)
251     fd.write(h.end_table)
252     fd.write(h.end_body)
253 fmoscato 1.3 fd.close()
254    
255 fmoscato 1.1
256     def printMultipleDict(cfg,info,file,title,verbose=None) :
257    
258     sorted_data_categories=loadList(cfg.get('TIER','sorted_datacategories'))
259    
260 fmoscato 1.3 if len(info.keys()):
261 fmoscato 1.1
262 fmoscato 1.3 fd=open(file,'w')
263 fmoscato 1.1 fd.write( h.head)
264     fd.write(h.body)
265     fd.write(title)
266     fd.write(h.table)
267     fd.write(h.th%'&nbsp;')
268     for i in sorted_data_categories:
269     fd.write( h.th%i)
270     fd.write(h.th%'TOT')
271     for k in info.iterkeys():
272    
273     item=info[k]
274     tot=0
275     complete_item=[item.setdefault(l,{'':[]}) for l in sorted_data_categories]
276    
277     fd.write(h.tr)
278     fd.write( h.td%k)
279     for inner_dict in complete_item:
280     fd.write('<td>')
281     if verbose:
282     fd.write( h.inner_table)
283     for k,v in inner_dict.iteritems():
284     fd.write(h.tr)
285     el='<b>%i</b> %s'%(len(v),k)
286     # tot=tot+len(v)
287 fmoscato 1.2 fd.write('<td nowrap>%s</td>'%el)
288 fmoscato 1.1 fd.write( h.end_tr)
289     fd.write( h.end_table)
290     else:
291     fd.write('<b>%i</b>'% sum([len(v) for k,v in inner_dict.iteritems()]))
292     tot=tot+ sum([len(v) for k,v in inner_dict.iteritems()])
293     fd.write('</td>')
294    
295     fd.write(h.td%('%i'%tot))
296     fd.write( h.end_tr)
297    
298    
299    
300     fd.write(h.end_table)
301     fd.write(h.end_body)
302 fmoscato 1.3 fd.close()
303 fmoscato 1.1
304    
305    
306     def loadList(lst):
307    
308     if lst!=None:
309     # convert it to a list
310     tmp = string.split(lst,",")
311     lsts = []
312     for el in tmp:
313     sel = string.strip(el)
314     if sel!="":
315     lsts.append(sel)
316    
317     return lsts
318    
319    
320     def loadDict(lst):
321     dict={}
322    
323     if lst!=None:
324     dict = eval(lst)
325    
326     return dict
327    
328     def main(opts, args):
329    
330     input_file=None
331     verbose=False
332     out_dir=None
333 fmoscato 1.2 values_toskip=None
334 fmoscato 1.1
335     for opt, val in opts:
336     if opt=='--help':
337     print Usage
338     sys.exit(1)
339     if opt=='--file':
340     input_file = val
341     if opt=='--verbose':
342     verbose=True
343     if opt=='--out_dir':
344     out_dir =val
345 fmoscato 1.2 if opt=='--skip':
346     values_toskip=val.split(",")
347 fmoscato 1.1
348     if not input_file or not out_dir:
349     print Usage
350     sys.exit(1)
351    
352     if not os.path.exists(out_dir):
353     print "%s doesn't exist" %out_dir
354     sys.exit(1)
355    
356     if not os.path.exists(out_dir+'/err'):
357     os.makedirs(out_dir+'/err')
358     print "created %s/err" %out_dir
359    
360     cfg = ConfigFile( path = 'lfn.cfg')
361    
362     if input_file.startswith('~'): input_file= os.path.expanduser(input_file)
363     if out_dir.startswith('~'): out_dir= os.path.expanduser(out_dir)
364    
365     fs=open(input_file,"r")
366     lines =fs.readlines()
367     fs.close()
368    
369     lfn=LfnType()
370    
371 fmoscato 1.2 msg_err=loadData(lines,lfn,cfg,values_toskip)
372 fmoscato 1.1
373     for type,errLst in msg_err.iteritems() :
374     if len(errLst):
375     fd=open("%s/err/%s.err"%(out_dir,type),'w')
376     for err in errLst:
377     fd.write(err+'\n')
378     fd.close()
379    
380     printdata(cfg,lfn,out_dir,verbose)
381    
382    
383     if __name__ == '__main__':
384     import sys
385     import getopt
386    
387     try:
388 fmoscato 1.2 opts, args = getopt.getopt(sys.argv[1:], "", ["out_dir=","file=","verbose","skip=", "help"])
389 fmoscato 1.1 except getopt.GetoptError, msg:
390     print
391     print msg
392     print
393     print Usage
394     sys.exit(1)
395    
396     if len(opts) <1 :
397     print
398     print Usage
399     sys.exit(1)
400    
401    
402     main( opts, args)