ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/HiggsAnalysis/EarlyDataStudy/scripts/runregparse.py
Revision: 1.1
Committed: Thu May 6 15:14:20 2010 UTC (14 years, 11 months ago) by mangano
Content type: text/x-python
Branch: MAIN
CVS Tags: V00-02-00, V00-01-03, V00-01-02, V00-01-01, V00-01-00, V00-00-01, V00-00-00, HEAD
Log Message:
first commit

File Contents

# User Rev Content
1 mangano 1.1 #!/usr/bin/env python
2    
3     # LM: version date: 01/02/2010 --> fixed dataset search and added json output file (optional)
4     # LM: updated 03/04/2010 --> adapted to new runreg api (and dcs status info)
5    
6     # include XML-RPC client library
7     # RR API uses XML-RPC webservices interface for data access
8     import xmlrpclib,sys,ConfigParser,os,string,commands,time,re
9     # for json support
10     try: # FUTURE: Python 2.6, prior to 2.6 requires simplejson
11     import json
12     except:
13     try:
14     import simplejson as json
15     except:
16     print "Please set a crab environment in order to get the proper JSON lib"
17     sys.exit(1)
18    
19     global QF_Req,ls_temp_data,QF_ALL_SYS,EXCEPTION,EXRUN
20     EXCEPTION=False
21     EXRUN=-1
22    
23     def invert_intervals(intervals,min_val=1,max_val=9999):
24     # first order and merge in case
25     if not intervals:
26     return []
27     intervals=merge_intervals(intervals)
28     intervals = sorted(intervals, key = lambda x: x[0])
29     result = []
30     if min_val==-1:
31     # defin min and max
32     (a,b)=intervals[0]
33     min_val=a
34     if max_val==-1:
35     (a,b)=intervals[len(intervals)-1]
36     max_val=b
37    
38     curr_min=min_val
39     for (x,y) in intervals:
40     if x>curr_min:
41     result.append((curr_min,x-1))
42     curr_min=y+1
43     if curr_min<max_val:
44     result.append((curr_min,max_val))
45    
46     # print min_val,max_val
47     return result
48    
49     def merge_intervals(intervals):
50     if not intervals:
51     return []
52     intervals = sorted(intervals, key = lambda x: x[0])
53     result = []
54     (a, b) = intervals[0]
55     for (x, y) in intervals[1:]:
56     if x <= b:
57     b = max(b, y)
58     else:
59     result.append((a, b))
60     (a, b) = (x, y)
61     result.append((a, b))
62     return result
63    
64     def remove_html_tags(data):
65     p = re.compile(r'<.*?>')
66     newdata=p.sub('', data)
67     newdata=newdata.replace("&nbsp;","")
68     return newdata
69    
70     def remove_extra_spaces(data):
71     result= re.sub(r'\s', '', data)
72     return result
73    
74     def searchrun(runno):
75     global QF_Req,ls_temp_data,QF_ALL_SYS,EXCEPTION,EXRUN
76     intervallist=[]
77     selectls=""
78    
79     for line in ls_temp_data.split("\n"):
80     if runno in line:
81     # print line
82     try:
83     if "%%%BAD LS INFO BEGIN%%%" in line:
84     selectls=line.split("%%%BAD LS INFO BEGIN%%%")[1]
85     selectls=selectls.split("%%%BAD LS INFO END%%%")[0]
86     selectls=remove_html_tags(selectls)
87     selectls=remove_extra_spaces(selectls)
88     # print selectls
89     for tag in QF_ALL_SYS:
90     selectls=selectls.replace(tag+":","\n"+tag+":")
91     # print selectls
92    
93     for line in selectls.split("\n"):
94     try:
95     tag=line.split(":")[0]
96     intervals=line.split(":")[1]
97     except:
98     continue
99     if tag in QF_Req.keys():
100     if QF_Req[tag]=="GOOD":
101     for interval in intervals.split(","):
102     if "ALL" in interval:
103     lmin=1
104     lmax=9999
105     else:
106     strmin=interval.split('-')[0]
107     strmax=interval.split('-')[1]
108     lmin=int(strmin)
109     if "END" in strmax:
110     lmax=9999
111     else:
112     lmax=int(strmax)
113     intervallist.append((lmin,lmax))
114     except:
115     EXCEPTION=True
116     EXRUN=int(runno)
117     intervallist=merge_intervals(intervallist)
118     # print runno, intervallist
119     return intervallist
120    
121    
122    
123     #main starts here#
124    
125     QF_Req={}
126     GOODRUN={}
127     compactList = {}
128    
129     QF_ALL_SYS=["Hcal","Track","Strip","Egam","Es","Dt","Csc","Pix","Muon","Rpc","Castor","Jmet","Ecal","L1t","Hlt","NONE"]
130     QF_ALL_STAT=["GOOD","BAD","EXCL","NONE"]
131     DCS_ALL=['Bpix','Fpix','Tibtid','TecM','TecP','Tob','Ebminus','Ebplus','EeMinus','EePlus','EsMinus','EsPlus','HbheA','HbheB','HbheC','H0','Hf','Dtminus','Dtplus','Dt0','CscMinus','CscPlus','Rpc','Castor',"NONE"]
132    
133     # reading config file
134     CONFIGFILE='runreg.cfg'
135     CONFIG = ConfigParser.ConfigParser()
136     print 'Reading configuration file from ',CONFIGFILE
137     CONFIG.read(CONFIGFILE)
138    
139     DATASET=CONFIG.get('Common','Dataset')
140     GROUP=CONFIG.get('Common','Group')
141     ADDRESS=CONFIG.get('Common','RunReg')
142     RUNMIN=CONFIG.get('Common','Runmin')
143     RUNMAX=CONFIG.get('Common','Runmax')
144     QFLAGS=CONFIG.get('Common','QFLAGS')
145     LSPARSE=CONFIG.get('Common','LSCOMMENT')
146     DCSSTAT=CONFIG.get('Common','DCS')
147     DCSLIST=string.split(DCSSTAT,',')
148    
149     LSCOMMENT=True
150     if "TRUE" in LSPARSE.upper() or "1" in LSPARSE.upper() or "YES" in LSPARSE.upper():
151     LSCOMMENT=True
152     elif "FALSE" in LSPARSE.upper() or "0" in LSPARSE.upper() or "NO" in LSPARSE.upper():
153     LSCOMMENT=False
154     else:
155     print "Error in parsing LSCOMMENT cfg parameter: LSPARSE"
156     sys.exit(1)
157    
158     QFlist=string.split(QFLAGS,',')
159     for QF in QFlist:
160     syst=string.split(QF,":")[0]
161     value=string.split(QF,":")[1]
162     if syst not in QF_ALL_SYS or value not in QF_ALL_STAT:
163     print "QFLAG not valid:",syst,value
164     sys.exit(1)
165     QF_Req[syst]=value
166    
167     for dcs in DCSLIST:
168     if dcs not in DCS_ALL:
169     print "DCS not valid:",dcs
170     sys.exit(1)
171    
172    
173     CFGLIST=CONFIG.items('Common')
174     JSONFILE=CONFIG.get('Common','JSONFILE')
175    
176     # report the request
177    
178     print "You asked for the runreg info in the run range:"+RUNMIN+"-"+RUNMAX
179     print "for dataset: "+DATASET
180     print "with the following quality flags:"
181     for SS in QF_Req.keys():
182     print SS, QF_Req[SS]
183     print "and with the following DCS status:"
184     for dcs in DCSLIST:
185     print dcs
186     print "Manual bad LS in comment column:",LSCOMMENT
187     #sys.exit(1)
188    
189     # get handler to RR XML-RPC server
190     FULLADDRESS=ADDRESS+"/xmlrpc"
191     print "RunRegistry from: ",FULLADDRESS
192     server = xmlrpclib.ServerProxy(FULLADDRESS)
193    
194     # build up selection in RUN table
195     sel_runtable="{groupName} ='"+GROUP+"' and {runNumber} >= "+RUNMIN+" and {runNumber} <= "+RUNMAX+" and {datasetName} LIKE '"+DATASET+"'"
196    
197     # the lumisection selection is on the Express dataset:
198     sel_dstable="{groupName} ='"+GROUP+"' and {runNumber} >= "+RUNMIN+" and {runNumber} <= "+RUNMAX+" and {datasetName} LIKE '%Express%'"
199    
200     for key in QF_Req.keys():
201     if key != "NONE" and QF_Req[key]!="NONE":
202     sel_runtable+=" and {cmp"+key+"} = '"+QF_Req[key]+"'"
203     sel_dstable+=" and {cmp"+key+"} = '"+QF_Req[key]+"'"
204     #print sel_runtable
205    
206     # build up selection in RUNLUMISECTION table
207     sel_dcstable="{groupName} ='"+GROUP+"' and {runNumber} >= "+RUNMIN+" and {runNumber} <= "+RUNMAX
208     for dcs in DCSLIST:
209     if dcs !="NONE":
210     sel_dcstable+=" and {parDcs"+dcs+"} = 1"
211     # = 'True'"
212     # print sel_dcstable
213    
214     Tries=0
215     print " "
216     while Tries<10:
217     try:
218     print "Accessing run registry...."
219     dcs_data = server.DataExporter.export('RUNLUMISECTION', 'GLOBAL', 'json', sel_dcstable)
220     run_data = server.DataExporter.export('RUN', 'GLOBAL', 'csv_runs', sel_runtable)
221     ls_temp_data = server.DataExporter.export('RUN', 'GLOBAL', 'csv_datasets', sel_dstable)
222     break
223     except:
224     print "Something wrong in accessing runregistry, retrying in 3s...."
225     Tries=Tries+1
226     time.sleep(3)
227     if Tries==10:
228     print "Run registry unaccessible.....exiting now"
229     sys.exit(1)
230    
231     #print dcs_data
232     #print run_data
233     #print ls_temp_data
234     # find LS info in comment
235    
236    
237    
238     LISTOFRUN=[]
239     for line in run_data.split("\n"):
240     run=line.split(',')[0]
241     if run.isdigit():
242     LISTOFRUN.append(run)
243    
244    
245     selected_dcs={}
246     jsonlist=json.loads(dcs_data)
247    
248    
249     for element in jsonlist:
250     if element in LISTOFRUN:
251     # first search manual ls certification
252     if LSCOMMENT:
253     # using LS intervals in comment
254     manualbad_int=searchrun(element)
255     # make a badlumi list
256     dcsbad_int=invert_intervals(jsonlist[element])
257     combined=[]
258     for interval in manualbad_int:
259     combined.append(interval)
260     for interval in dcsbad_int:
261     combined.append(interval)
262     combined=merge_intervals(combined)
263     combined=invert_intervals(combined)
264     selected_dcs[element]=combined
265     else:
266     # using only DCS info
267     selected_dcs[element]=jsonlist[element]
268     # combined include bith manual LS and DCS LS
269    
270     #JSONOUT=json.dumps(selected_dcs)
271     # WARNING: Don't use selected_dcs before dumping into file, it gets screwed up (don't know why!!)
272     if JSONFILE != "NONE":
273     lumiSummary = open(JSONFILE, 'w')
274     json.dump(selected_dcs, lumiSummary)
275     lumiSummary.close()
276     print " "
277     print "-------------------------------------------"
278     print "Json file: ",JSONFILE," written."
279    
280    
281     # buildup cms snippet
282     selectlumi="process.source.lumisToProcess = cms.untracked.VLuminosityBlockRange(\n"
283     ranges = []
284     runs_to_print = selected_dcs.keys()
285     runs_to_print.sort()
286     for run in runs_to_print:
287     blocks = selected_dcs[run]
288     blocks.sort()
289     prevblock = [-2,-2]
290     for lsrange in blocks:
291     if lsrange[0] == prevblock[1]+1:
292     print "Run: ",run,"- This lumi starts at ", lsrange[0], " previous ended at ", prevblock[1]+1, " so I should merge"
293     prevblock[1] = lsrange[1]
294     ranges[-1] = "\t'%s:%d-%s:%d',\n" % (run, prevblock[0],
295     run, prevblock[1])
296     else:
297     ranges.append("\t'%s:%d-%s:%d',\n" % (run, lsrange[0],
298     run, lsrange[1]))
299     prevblock = lsrange
300     selectlumi += "".join(ranges)
301     selectlumi += ")"
302    
303    
304     print "-------------------------------------------"
305     print " "
306     print "CFG snippet to select:"
307     print selectlumi
308    
309     if EXCEPTION:
310     print "WARNING: Something wrong in manual lumisection selection tag for run: "+str(EXRUN)