ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/RateMonShiftTool_dev/DatabaseParser.py
Revision: 1.58
Committed: Mon Dec 3 17:24:51 2012 UTC (12 years, 4 months ago) by awoodard
Content type: text/x-python
Branch: MAIN
CVS Tags: V00-02-06, HEAD
Changes since 1.57: +4 -5 lines
Log Message:
Fixing bug using --RefRun argument with DoL1 enabled

File Contents

# Content
1 #!/usr/bin/python
2 import cx_Oracle
3 import cPickle as pickle
4 import os
5 import sys
6 import time
7 import re
8 from colors import *
9
10 try: ## set is builtin in python 2.6.4 and sets is deprecated
11 set
12 except NameError:
13 from sets import Set
14
15
16 class DatabaseParser:
17
18 def __init__(self):
19
20 self.curs = ConnectDB()
21 ##-- Defined in ParsePage1 --##
22 self.RunNumber = 0
23
24 ##-- Defined in ParseRunPage --##
25 self.Date=''
26 self.L1_HLT_Key=''
27 self.HLT_Key=''
28 self.GTRS_Key=''
29 self.TSC_Key=''
30 self.GT_Key=''
31 self.ConfigId=0
32
33 ##-- Defined in ParseHLTSummaryPage --##
34 self.HLTRatesByLS = {}
35 self.HLTPSByLS = {}
36
37 self.nAlgoBits=0
38 self.L1PrescaleTable=[]
39 self.AvgL1Prescales=[] ## contains the average L1 prescales for the current LS range range
40 self.HLTList=[]
41 self.AvgTotalPrescales={}
42 self.HLTPrescaleTable=[] ## can't fill this yet
43 self.UnprescaledRates={}
44 self.PrescaledRates={}
45 ##-- Defined in ParseLumiPage --##
46 self.LastLSParsed=-1
47 self.InstLumiByLS = {}
48 self.DeliveredLumiByLS = {}
49 self.LiveLumiByLS = {}
50 self.PSColumnByLS = {}
51 self.AvInstLumi = 0
52 self.AvDeliveredLumi = 0
53 self.AvLiveLumi = 0
54 self.AvDeadTime = 0
55 self.LumiInfo = {} ##Returns
56 self.DeadTime = {}
57 self.Physics = {}
58 self.Active = {}
59
60
61 self.B1Pres = {}
62 self.B2Pres = {}
63 self.B1Stab = {}
64 self.B2Stab = {}
65 self.EBP = {}
66 self.EBM = {}
67 self.EEP = {}
68 self.EEM = {}
69 self.HBHEA = {}
70 self.HBHEB = {}
71 self.HBHEC = {}
72 self.HF = {}
73 self.RPC = {}
74 self.DT0 = {}
75 self.DTP = {}
76 self.DTM = {}
77 self.CSCP = {}
78 self.CSCM = {}
79 self.TOB = {}
80 self.TIBTID= {}
81 self.TECP = {}
82 self.TECM = {}
83 self.BPIX = {}
84 self.FPIX = {}
85 self.ESP = {}
86 self.ESM = {}
87
88 self.DeadTimeBeamActive = {}
89
90
91 ##-- Defined in ParsePSColumnPage (not currently used) --##
92 self.PSColumnChanges=[] ##Returns
93
94 ##-- Defined in ParseTriggerModePage --##
95 self.L1TriggerMode={} ##
96 self.HLTTriggerMode={} ##
97 self.HLTSeed={}
98 self.HLTSequenceMap=[]
99 self.TriggerInfo = [] ##Returns
100
101 ##-- Defined in AssemblePrescaleValues --##
102 self.L1Prescale={}
103 self.L1IndexNameMap={}
104 self.HLTPrescale=[]
105 self.MissingPrescale=[]
106 self.PrescaleValues=[] ##Returns
107
108 ##-- Defined in ComputeTotalPrescales --##
109 self.TotalPSInfo = [] ##Returns # #collection
110
111 ##-- Defined in CorrectForPrescaleChange --##
112 self.CorrectedPSInfo = [] ##Returns
113 self.HLTPrescaleTable={}
114
115 ##-- In the current Parser.py philosophy, only RunNumber is set globally
116 ## - LS range is set from the outside for each individual function
117 #self.FirstLS = -1
118 #self.LastLS = -1
119
120 def GetRunInfo(self):
121 ## This query gets the L1_HLT Key (A), the associated HLT Key (B) and the Config number for that key (C)
122 KeyQuery = """
123 SELECT A.TRIGGERMODE, B.HLT_KEY, B.GT_RS_KEY, B.TSC_KEY, C.CONFIGID, D.GT_KEY FROM
124 CMS_WBM.RUNSUMMARY A, CMS_L1_HLT.L1_HLT_CONF B, CMS_HLT.CONFIGURATIONS C, CMS_TRG_L1_CONF.TRIGGERSUP_CONF D WHERE
125 B.ID = A.TRIGGERMODE AND C.CONFIGDESCRIPTOR = B.HLT_KEY AND D.TS_Key = B.TSC_Key AND A.RUNNUMBER=%d
126 """ % (self.RunNumber,)
127 try:
128 self.curs.execute(KeyQuery)
129 self.L1_HLT_Key,self.HLT_Key,self.GTRS_Key,self.TSC_Key,self.ConfigId,self.GT_Key = self.curs.fetchone()
130 except:
131 ##print "Unable to get L1 and HLT keys for this run"
132 pass
133
134
135 def UpdateRateTable(self): # lets not rebuild the rate table every time, rather just append new LSs
136 pass
137
138 def GetHLTRates(self,LSRange):
139 self.GetHLTPrescaleMatrix()
140
141 sqlquery = """SELECT SUM(A.L1PASS),SUM(A.PSPASS),SUM(A.PACCEPT)
142 ,SUM(A.PEXCEPT), A.LSNUMBER, (SELECT L.NAME FROM CMS_HLT.PATHS L WHERE L.PATHID=A.PATHID) PATHNAME
143 FROM CMS_RUNINFO.HLT_SUPERVISOR_TRIGGERPATHS A WHERE RUNNUMBER=%s AND A.LSNUMBER IN %s
144 GROUP BY A.LSNUMBER,A.PATHID"""
145
146 LSRangeSTR = str(LSRange)
147 LSRangeSTR = LSRangeSTR.replace("[","(")
148 LSRangeSTR = LSRangeSTR.replace("]",")")
149
150 StartLS = LSRange[0]
151 EndLS = LSRange[-1]
152 LSUsed={}
153 for lumisection in LSRange:
154 LSUsed[lumisection]=False
155
156 AvgL1Prescales = [0]*self.nAlgoBits
157
158 #print "Getting HLT Rates for LS from %d to %d" % (LSRange[0],LSRange[-1],)
159
160 query = sqlquery % (self.RunNumber,LSRangeSTR)
161 self.curs.execute(query)
162
163 TriggerRates = {}
164 for L1Pass,PSPass,HLTPass,HLTExcept,LS ,name in self.curs.fetchall():
165 if not self.HLTSeed.has_key(name):
166 continue
167
168 rate = HLTPass/23.3
169 hltps = 0
170
171 if not TriggerRates.has_key(name):
172 try:
173 psi = self.PSColumnByLS[LS]
174 except:
175 print "HLT in: Cannot figure out PSI for LS "+str(StartLS)+" setting to 0"
176 print "The value of LSRange[0] is:"
177 print str(LS)
178 psi = 0
179 if psi is None:
180 psi=0
181 if self.HLTPrescaleTable.has_key(name):
182 hltps = self.HLTPrescaleTable[name][psi]
183 else:
184 if PSPass:
185 hltps = float(L1Pass)/PSPass
186 if self.L1IndexNameMap.has_key(self.HLTSeed[name]):
187 l1ps = self.L1PrescaleTable[self.L1IndexNameMap[self.HLTSeed[name]]][psi]
188 else:
189 AvL1Prescales = self.CalculateAvL1Prescales([LS])
190 l1ps = self.UnwindORSeed(self.HLTSeed[name],AvL1Prescales)
191
192 ps = l1ps*hltps
193
194 ###if ps < 1: ### want PS=0 too!
195 #print "Oops! somehow ps for "+str(name)+" = "+str(ps)+", where L1 PS = "+str(l1ps)+" and HLT PS = "+str(hltps)
196 # ps = 1
197 psrate = ps*rate
198 TriggerRates[name]= [ps,rate,psrate,1]
199 LSUsed[LS]=True
200
201 else:
202 [ops,orate,opsrate,on] = TriggerRates[name]
203 try:
204 psi = self.PSColumnByLS[LSRange[on]]
205 except:
206 print "HLT out: Cannot figure out PSI for index "+str(on)+" setting to 0"
207 print "The value of LSRange[on] is:"
208 print str(LS)
209 psi = 0
210 if psi is None:
211 psi=3
212 if self.HLTPrescaleTable.has_key(name):
213 hltps = self.HLTPrescaleTable[name][psi]
214 else:
215 if PSPass:
216 hltps = float(L1Pass)/PSPass
217 if self.L1IndexNameMap.has_key(self.HLTSeed[name]):
218 l1ps = self.L1PrescaleTable[self.L1IndexNameMap[self.HLTSeed[name]]][psi]
219 else:
220 AvL1Prescales = self.CalculateAvL1Prescales([LS])
221 l1ps = self.UnwindORSeed(self.HLTSeed[name],AvL1Prescales)
222
223 ps = l1ps*hltps
224 #if ps < 1: ###want PS=0 too!
225 ##print "Oops! somehow ps for "+str(name)+" = "+str(ps)+", where L1 PS = "+str(l1ps)+" and HLT PS = "+str(hltps)
226 # ps = 1
227 psrate = ps*rate
228 TriggerRates[name]= [ops+ps,orate+rate,opsrate+psrate,on+1]
229 LSUsed[LS]=True
230
231
232
233
234 ###check if LS is used above, if not and deadtime is 100% add extra lumi for calculation
235 lumirange_one=[]
236 for key in LSUsed.iterkeys():
237 lumirange_one=[key]##set LSRange equal to one LS so can get deadtime
238 if LSUsed[key]:
239 continue
240 if self.GetDeadTimeBeamActive(lumirange_one)<=0.9999:
241 ##print "LS",key,"gottcha", LSUsed[key]
242 LSUsed[key]=True
243 print "Some strange error LS",key, "has deadtime ", self.GetDeadTimeBeamActive(lumirange_one)
244 else:
245 print "increasing # LS by one, LS", key, "has 100% deadtime"
246 for name,val in TriggerRates.iteritems():
247 [ops,orate,opsrate,on] = TriggerRates[name]
248 TriggerRates[name]= [ops,orate,opsrate,on+1]
249
250 for name,val in TriggerRates.iteritems():
251 [ps,rate,psrate,n] = val
252 avps = ps/n
253 try:
254 ps = psrate/rate
255 except:
256 #print "Rate = 0 for "+str(name)+", setting ps to 1"
257 ps = avps
258
259 TriggerRates[name] = [avps,ps,rate/n,psrate/n]
260
261 return TriggerRates
262
263 def GetAvgTrigRateInLSRange(self,triggerName,LSRange):
264 sqlquery = """SELECT A.PACCEPT
265 FROM CMS_RUNINFO.HLT_SUPERVISOR_TRIGGERPATHS A, CMS_HLT.PATHS B
266 WHERE RUNNUMBER=%s AND B.NAME = \'%s\' AND A.PATHID = B.PATHID AND A.LSNUMBER IN %s
267 """
268
269 LSRangeSTR = str(LSRange)
270 LSRangeSTR = LSRangeSTR.replace("[","(")
271 LSRangeSTR = LSRangeSTR.replace("]",")")
272
273 query = sqlquery % (self.RunNumber,triggerName,LSRangeSTR)
274 self.curs.execute(query)
275 avg_rate = sum([counts[0] for counts in self.curs.fetchall()])/ (23.3 * len(LSRange))
276
277 return avg_rate
278
279 def GetTrigRatesInLSRange(self,triggerName,LSRange):
280 sqlquery = """SELECT A.LSNUMBER, A.PACCEPT
281 FROM CMS_RUNINFO.HLT_SUPERVISOR_TRIGGERPATHS A, CMS_HLT.PATHS B
282 WHERE RUNNUMBER=%s AND B.NAME = \'%s\' AND A.PATHID = B.PATHID AND A.LSNUMBER IN %s
283 ORDER BY A.LSNUMBER
284 """
285
286 LSRangeSTR = str(LSRange)
287 LSRangeSTR = LSRangeSTR.replace("[","(")
288 LSRangeSTR = LSRangeSTR.replace("]",")")
289
290 query = sqlquery % (self.RunNumber,triggerName,LSRangeSTR)
291 self.curs.execute(query)
292 r={}
293 for ls,accept in self.curs.fetchall():
294 r[ls] = accept/23.3
295 return r
296
297 def GetTriggerRatesByLS(self,triggerName):
298 sqlquery = """SELECT A.LSNUMBER, A.PACCEPT
299 FROM CMS_RUNINFO.HLT_SUPERVISOR_TRIGGERPATHS A, CMS_HLT.PATHS B
300 WHERE RUNNUMBER=%s AND B.NAME = \'%s\' AND A.PATHID = B.PATHID
301 """ % (self.RunNumber,triggerName,)
302
303 self.curs.execute(sqlquery)
304 r={}
305 for ls,accept in self.curs.fetchall():
306 r[ls] = accept/23.3
307 return r
308
309 def GetAllTriggerRatesByLS(self):
310 for hltName in self.HLTSeed:
311 self.HLTRatesByLS[hltName] = self.GetTriggerRatesByLS(hltName)
312
313 def GetPSColumnsInLSRange(self,LSRange):
314 sqlquery="""SELECT LUMI_SECTION,PRESCALE_INDEX FROM
315 CMS_GT_MON.LUMI_SECTIONS B WHERE B.RUN_NUMBER=%s AND B.LUMI_SECTION IN %s"""
316
317 LSRangeSTR = str(LSRange)
318 LSRangeSTR = LSRangeSTR.replace("[","(")
319 LSRangeSTR = LSRangeSTR.replace("]",")")
320 query = sqlquery % (self.RunNumber,LSRangeSTR)
321 self.curs.execute(query)
322
323 ps_columns={}
324 for ls, ps_index in self.curs.fetchall():
325 ps_columns[ls] = ps_index
326
327 return ps_columns
328
329 def GetAvDeliveredLumi(self,LSRange):
330 sqlquery="""SELECT DELIVLUMI FROM
331 CMS_RUNTIME_LOGGER.LUMI_SECTIONS A WHERE A.RUNNUMBER=%s AND A.LUMISECTION IN %s"""
332
333 LSRangeSTR = str(LSRange)
334 LSRangeSTR = LSRangeSTR.replace("[","(")
335 LSRangeSTR = LSRangeSTR.replace("]",")")
336 query = sqlquery % (self.RunNumber,LSRangeSTR)
337 self.curs.execute(query)
338
339 delivered = [val[0] for val in self.curs.fetchall()]
340 avg_delivered = sum(delivered)/len(LSRange)
341
342 return avg_delivered
343
344 def GetLumiInfo(self):
345
346 sqlquery="""SELECT RUNNUMBER,LUMISECTION,PRESCALE_INDEX,INSTLUMI,LIVELUMI,DELIVLUMI,DEADTIME
347 ,DCSSTATUS,PHYSICS_FLAG,CMS_ACTIVE
348 FROM CMS_RUNTIME_LOGGER.LUMI_SECTIONS A,CMS_GT_MON.LUMI_SECTIONS B WHERE A.RUNNUMBER=%s
349 AND B.RUN_NUMBER(+)=A.RUNNUMBER AND B.LUMI_SECTION(+)=A.LUMISECTION AND A.LUMISECTION > %d
350 ORDER BY A.RUNNUMBER,A.LUMISECTION"""
351
352 ## Get the lumi information for the run, just update the table, don't rebuild it every time
353 query = sqlquery % (self.RunNumber,self.LastLSParsed)
354 self.curs.execute(query)
355
356 pastLSCol=-1
357 for run,ls,psi,inst,live,dlive,dt,dcs,phys,active in self.curs.fetchall():
358 if psi is None:
359 psi = GetLastKnownPSIndex(self.PSColumnByLS)
360
361 self.PSColumnByLS[ls]=psi
362 self.InstLumiByLS[ls]=inst
363 self.LiveLumiByLS[ls]=live
364 self.DeliveredLumiByLS[ls]=dlive
365 self.DeadTime[ls]=dt
366 self.Physics[ls]=phys
367 self.Active[ls]=active
368
369 if pastLSCol!=-1 and ls!=pastLSCol:
370 self.PSColumnChanges.append([ls,psi])
371 pastLSCol=ls
372 if ls>self.LastLSParsed:
373 self.LastLSParsed=ls
374
375 self.LumiInfo = [self.PSColumnByLS, self.InstLumiByLS, self.DeliveredLumiByLS, self.LiveLumiByLS, self.DeadTime, self.Physics, self.Active]
376
377 return self.LumiInfo
378
379 def GetMoreLumiInfo(self):
380 sqlquery="""SELECT RUNNUMBER,LUMISECTION,BEAM1_PRESENT, BEAM2_PRESENT, BEAM1_STABLE, BEAM2_STABLE, EBP_READY,EBM_READY,EEP_READY,EEM_READY,HBHEA_READY,HBHEB_READY,HBHEC_READY,HF_READY,RPC_READY,DT0_READY,DTP_READY,DTM_READY,CSCP_READY,CSCM_READY,TOB_READY,TIBTID_READY,TECP_READY,TECM_READY,BPIX_READY,FPIX_READY,ESP_READY,ESM_READY
381 FROM CMS_RUNTIME_LOGGER.LUMI_SECTIONS A,CMS_GT_MON.LUMI_SECTIONS B WHERE A.RUNNUMBER=%s
382 AND B.RUN_NUMBER(+)=A.RUNNUMBER AND B.LUMI_SECTION(+)=A.LUMISECTION AND A.LUMISECTION > %d
383 ORDER BY A.RUNNUMBER,A.LUMISECTION"""
384
385 ## Get the lumi information for the run, just update the table, don't rebuild it every time
386 query = sqlquery % (self.RunNumber,self.LastLSParsed)
387 self.curs.execute(query)
388 pastLSCol=-1
389 for run,ls,b1pres,b2pres,b1stab,b2stab,ebp,ebm,eep,eem,hbhea,hbheb,hbhec,hf,rpc,dt0,dtp,dtm,cscp,cscm,tob,tibtid,tecp,tecm,bpix,fpix,esp,esm in self.curs.fetchall():
390
391 self.B1Pres[ls]=b1pres
392 self.B2Pres[ls]=b2pres
393 self.B1Stab[ls]=b1stab
394 self.B2Stab[ls]=b2stab
395 self.EBP[ls]= ebp
396 self.EBM[ls] = ebm
397 self.EEP[ls] = eep
398 self.EEM[ls] = eem
399 self.HBHEA[ls] = hbhea
400 self.HBHEB[ls] = hbheb
401 self.HBHEC[ls] = hbhec
402 self.HF[ls] = hf
403 self.RPC[ls] = rpc
404 self.DT0[ls] = dt0
405 self.DTP[ls] = dtp
406 self.DTM[ls] = dtm
407 self.CSCP[ls] = cscp
408 self.CSCM[ls] = cscm
409 self.TOB[ls] = tob
410 self.TIBTID[ls]= tibtid
411 self.TECP[ls] = tecp
412 self.TECM[ls] = tecm
413 self.BPIX[ls] = bpix
414 self.FPIX[ls] = fpix
415 self.ESP[ls] = esp
416 self.ESM[ls] = esm
417
418
419 pastLSCol=ls
420 if ls>self.LastLSParsed:
421 self.LastLSParsed=ls
422
423
424
425 self.MoreLumiInfo ={'b1pres':self.B1Pres,'b2pres':self.B2Pres,'b1stab':self.B1Stab,'b2stab':self.B2Stab,'ebp':self.EBP,'ebm':self.EBM,'eep':self.EEP,'eem':self.EEM,'hbhea':self.HBHEA,'hbheb':self.HBHEB,'hbhec':self.HBHEC,'hf':self.HF,'rpc':self.RPC,'dt0':self.DT0,'dtp':self.DTP,'dtm':self.DTM,'cscp':self.CSCP,'cscm':self.CSCM,'tob':self.TOB,'tibtid':self.TIBTID,'tecp':self.TECP,'tecm':self.TECM,'bpix':self.BPIX,'fpix':self.FPIX,'esp':self.ESP,'esm':self.ESM}
426
427 return self.MoreLumiInfo
428
429
430 def GetL1HLTseeds(self):
431 #print self.HLTSeed
432 L1HLTseeds={}
433 for HLTkey in self.HLTSeed.iterkeys():
434 #print HLTkey, self.HLTSeed[HLTkey]
435
436 dummy=str(self.HLTSeed[HLTkey])
437
438 if dummy.find(" OR ") == -1:
439 dummylist=[]
440 dummylist.append(dummy)
441 L1HLTseeds[StripVersion(HLTkey)]=dummylist
442 continue # Not an OR of seeds
443 seedList = dummy.split(" OR ")
444 #print seedList
445 L1HLTseeds[StripVersion(HLTkey)]=seedList
446 if len(seedList)==1:
447 print "error: zero length L1 seed"
448 continue #shouldn't get here
449 #print L1HLTseeds
450
451 return L1HLTseeds
452
453 def GetDeadTimeBeamActive(self,LSRange):
454 sqlquery=""" select FRACTION
455 from
456 CMS_GT_MON.V_SCALERS_TCS_DEADTIME
457 where
458 RUN_NUMBER=%s and
459 LUMI_SECTION in %s and
460 SCALER_NAME='DeadtimeBeamActive'"""
461
462
463 LSRangeSTR = str(LSRange)
464 LSRangeSTR = LSRangeSTR.replace("[","(")
465 LSRangeSTR = LSRangeSTR.replace("]",")")
466
467 query=sqlquery %(self.RunNumber,LSRangeSTR)
468 #print query
469 self.curs.execute(query)
470
471 deadtimeba_sum=0
472 ii=0
473 for deadtimebeamactive in self.curs.fetchall():
474 try:
475 deadtimeba_sum=deadtimeba_sum+deadtimebeamactive[0]
476 except:
477 ##print "no dtba for run ",self.RunNumber, ", ls ",LSRange[ii], "using dt"
478 deadtimeba_sum=deadtimeba_sum+self.GetDeadTime(LSRange[ii])
479 ii=ii+1
480 deadtimeba_av=deadtimeba_sum/len(LSRange)
481
482 return deadtimeba_av
483
484
485
486 def GetDeadTime(self,LS):
487 sqlquery=""" select FRACTION
488 from
489 CMS_GT_MON.V_SCALERS_TCS_DEADTIME
490 where
491 RUN_NUMBER=%s and
492 LUMI_SECTION=%s and
493 SCALER_NAME='Deadtime'"""
494
495 query=sqlquery %(self.RunNumber,LS)
496 #print query
497 self.curs.execute(query)
498 dt=1.0
499 for deadtime in self.curs.fetchall():
500 try:
501 dt=deadtime[0]
502 #print "dt=",dt
503 except:
504 print "no dt for run ",self.RunNumber, ", ls ",LS
505 dt=1.0
506
507
508 return dt
509
510 def GetAvLumiInfo(self,LSRange):
511 nLS=0;
512 AvInstLumi=0
513 try:
514 StartLS = LSRange[0]
515 EndLS = LSRange[-1]
516
517 #print "startls=",StartLS, "endls=",EndLS
518 try: ## Cosmics won't have lumi info
519 maxlive = self.LiveLumiByLS[EndLS]
520 maxdelivered = self.DeliveredLumiByLS[EndLS]
521 for iterator in LSRange:
522 if self.LiveLumiByLS[iterator] > maxlive:
523 maxlive = self.LiveLumiByLS[iterator]
524 if self.DeliveredLumiByLS[iterator] > maxdelivered:
525 maxdelivered = self.DeliveredLumiByLS[iterator]
526 AvLiveLumi=maxlive-self.LiveLumiByLS[StartLS]
527 AvDeliveredLumi=maxdelivered-self.DeliveredLumiByLS[StartLS]
528 except:
529 AvLiveLumi=0
530 AvDeliveredLumi=0
531
532 if AvDeliveredLumi > 0:
533 AvDeadTime = 1 - AvLiveLumi/AvDeliveredLumi
534 else:
535 if AvLiveLumi > 0:
536 print "Live Lumi > 0 but Delivered <= 0: problem"
537 AvDeadTime = 0.0
538 PSCols=[]
539 for ls in LSRange:
540 try:
541 try:
542 AvInstLumi+=self.InstLumiByLS[ls]
543 except:
544 pass
545 PSCols.append(self.PSColumnByLS[ls])
546 nLS+=1
547 except:
548 print "ERROR: Lumi section "+str(ls)+" not in bounds"
549 return [0.,0.,0.,0.,[]]
550 return [AvInstLumi/nLS,(1000.0/23.3)*AvLiveLumi/(EndLS-StartLS),(1000.0/23.3)*AvDeliveredLumi/(EndLS-StartLS), AvDeadTime,PSCols]
551 except:
552 if LSRange[0] == LSRange[-1]:
553 AvInstLumi = self.InstLumiByLS[StartLS]
554 try:
555 AvLiveLumi = self.LiveLumiByLS[StartLS]-self.LiveLumiByLS[StartLS-1]
556 AvDeliveredLumi = self.DeliveredLumiByLS[StartLS]-self.DeliveredLumiByLS[StartLS-1]
557
558 except:
559 try:
560 AvLiveLumi = self.LiveLumiByLS[StartLS+1]-self.LiveLumiByLS[StartLS]
561 AvDeliveredLumi = self.DeliveredLumiByLS[StartLS+1]-self.DeliveredLumiByLS[StartLS]
562 except:
563 print "missing live/delivered run ",self.RunNumber, "ls ",LSRange
564 AvLiveLumi = 0
565 AvDeliveredLumi = 0
566 if AvDeliveredLumi > 0:
567 AvDeadTime = 1 - AvLiveLumi/AvDeliveredLumi
568
569 elif AvLiveLumi > 0:
570 print "Live Lumi > 0 but Delivered <= 0: problem run ",self.RunNumber, " ls ",LSRange
571 AvDeadTime = 1.0
572 else:
573 AvDeadTime=1.0
574 PSCols = [self.PSColumnByLS[StartLS]]
575 return [AvInstLumi,(1000.0/23.3)*AvLiveLumi,(1000.0/23.3)*AvDeliveredLumi,AvDeadTime,PSCols]
576 else:
577 return [0.,0.,0.,0.,[]]
578
579 def ParsePSColumnPage(self): ## this is now done automatically when we read the db
580 pass
581
582 def GetL1NameIndexAssoc(self):
583 ## get the L1 algo names associated with each algo bit
584 AlgoNameQuery = """SELECT ALGO_INDEX, ALIAS FROM CMS_GT.L1T_MENU_ALGO_VIEW
585 WHERE MENU_IMPLEMENTATION IN (SELECT L1T_MENU_FK FROM CMS_GT.GT_SETUP WHERE ID='%s')
586 ORDER BY ALGO_INDEX""" % (self.GT_Key,)
587 self.curs.execute(AlgoNameQuery)
588 for index,name in self.curs.fetchall():
589 self.L1IndexNameMap[name] = index
590
591 def GetL1AlgoPrescales(self):
592 L1PrescalesQuery= """
593 SELECT
594 PRESCALE_FACTOR_ALGO_000,PRESCALE_FACTOR_ALGO_001,PRESCALE_FACTOR_ALGO_002,PRESCALE_FACTOR_ALGO_003,PRESCALE_FACTOR_ALGO_004,PRESCALE_FACTOR_ALGO_005,
595 PRESCALE_FACTOR_ALGO_006,PRESCALE_FACTOR_ALGO_007,PRESCALE_FACTOR_ALGO_008,PRESCALE_FACTOR_ALGO_009,PRESCALE_FACTOR_ALGO_010,PRESCALE_FACTOR_ALGO_011,
596 PRESCALE_FACTOR_ALGO_012,PRESCALE_FACTOR_ALGO_013,PRESCALE_FACTOR_ALGO_014,PRESCALE_FACTOR_ALGO_015,PRESCALE_FACTOR_ALGO_016,PRESCALE_FACTOR_ALGO_017,
597 PRESCALE_FACTOR_ALGO_018,PRESCALE_FACTOR_ALGO_019,PRESCALE_FACTOR_ALGO_020,PRESCALE_FACTOR_ALGO_021,PRESCALE_FACTOR_ALGO_022,PRESCALE_FACTOR_ALGO_023,
598 PRESCALE_FACTOR_ALGO_024,PRESCALE_FACTOR_ALGO_025,PRESCALE_FACTOR_ALGO_026,PRESCALE_FACTOR_ALGO_027,PRESCALE_FACTOR_ALGO_028,PRESCALE_FACTOR_ALGO_029,
599 PRESCALE_FACTOR_ALGO_030,PRESCALE_FACTOR_ALGO_031,PRESCALE_FACTOR_ALGO_032,PRESCALE_FACTOR_ALGO_033,PRESCALE_FACTOR_ALGO_034,PRESCALE_FACTOR_ALGO_035,
600 PRESCALE_FACTOR_ALGO_036,PRESCALE_FACTOR_ALGO_037,PRESCALE_FACTOR_ALGO_038,PRESCALE_FACTOR_ALGO_039,PRESCALE_FACTOR_ALGO_040,PRESCALE_FACTOR_ALGO_041,
601 PRESCALE_FACTOR_ALGO_042,PRESCALE_FACTOR_ALGO_043,PRESCALE_FACTOR_ALGO_044,PRESCALE_FACTOR_ALGO_045,PRESCALE_FACTOR_ALGO_046,PRESCALE_FACTOR_ALGO_047,
602 PRESCALE_FACTOR_ALGO_048,PRESCALE_FACTOR_ALGO_049,PRESCALE_FACTOR_ALGO_050,PRESCALE_FACTOR_ALGO_051,PRESCALE_FACTOR_ALGO_052,PRESCALE_FACTOR_ALGO_053,
603 PRESCALE_FACTOR_ALGO_054,PRESCALE_FACTOR_ALGO_055,PRESCALE_FACTOR_ALGO_056,PRESCALE_FACTOR_ALGO_057,PRESCALE_FACTOR_ALGO_058,PRESCALE_FACTOR_ALGO_059,
604 PRESCALE_FACTOR_ALGO_060,PRESCALE_FACTOR_ALGO_061,PRESCALE_FACTOR_ALGO_062,PRESCALE_FACTOR_ALGO_063,PRESCALE_FACTOR_ALGO_064,PRESCALE_FACTOR_ALGO_065,
605 PRESCALE_FACTOR_ALGO_066,PRESCALE_FACTOR_ALGO_067,PRESCALE_FACTOR_ALGO_068,PRESCALE_FACTOR_ALGO_069,PRESCALE_FACTOR_ALGO_070,PRESCALE_FACTOR_ALGO_071,
606 PRESCALE_FACTOR_ALGO_072,PRESCALE_FACTOR_ALGO_073,PRESCALE_FACTOR_ALGO_074,PRESCALE_FACTOR_ALGO_075,PRESCALE_FACTOR_ALGO_076,PRESCALE_FACTOR_ALGO_077,
607 PRESCALE_FACTOR_ALGO_078,PRESCALE_FACTOR_ALGO_079,PRESCALE_FACTOR_ALGO_080,PRESCALE_FACTOR_ALGO_081,PRESCALE_FACTOR_ALGO_082,PRESCALE_FACTOR_ALGO_083,
608 PRESCALE_FACTOR_ALGO_084,PRESCALE_FACTOR_ALGO_085,PRESCALE_FACTOR_ALGO_086,PRESCALE_FACTOR_ALGO_087,PRESCALE_FACTOR_ALGO_088,PRESCALE_FACTOR_ALGO_089,
609 PRESCALE_FACTOR_ALGO_090,PRESCALE_FACTOR_ALGO_091,PRESCALE_FACTOR_ALGO_092,PRESCALE_FACTOR_ALGO_093,PRESCALE_FACTOR_ALGO_094,PRESCALE_FACTOR_ALGO_095,
610 PRESCALE_FACTOR_ALGO_096,PRESCALE_FACTOR_ALGO_097,PRESCALE_FACTOR_ALGO_098,PRESCALE_FACTOR_ALGO_099,PRESCALE_FACTOR_ALGO_100,PRESCALE_FACTOR_ALGO_101,
611 PRESCALE_FACTOR_ALGO_102,PRESCALE_FACTOR_ALGO_103,PRESCALE_FACTOR_ALGO_104,PRESCALE_FACTOR_ALGO_105,PRESCALE_FACTOR_ALGO_106,PRESCALE_FACTOR_ALGO_107,
612 PRESCALE_FACTOR_ALGO_108,PRESCALE_FACTOR_ALGO_109,PRESCALE_FACTOR_ALGO_110,PRESCALE_FACTOR_ALGO_111,PRESCALE_FACTOR_ALGO_112,PRESCALE_FACTOR_ALGO_113,
613 PRESCALE_FACTOR_ALGO_114,PRESCALE_FACTOR_ALGO_115,PRESCALE_FACTOR_ALGO_116,PRESCALE_FACTOR_ALGO_117,PRESCALE_FACTOR_ALGO_118,PRESCALE_FACTOR_ALGO_119,
614 PRESCALE_FACTOR_ALGO_120,PRESCALE_FACTOR_ALGO_121,PRESCALE_FACTOR_ALGO_122,PRESCALE_FACTOR_ALGO_123,PRESCALE_FACTOR_ALGO_124,PRESCALE_FACTOR_ALGO_125,
615 PRESCALE_FACTOR_ALGO_126,PRESCALE_FACTOR_ALGO_127
616 FROM CMS_GT.GT_FDL_PRESCALE_FACTORS_ALGO A, CMS_GT.GT_RUN_SETTINGS_PRESC_VIEW B
617 WHERE A.ID=B.PRESCALE_FACTORS_ALGO_FK AND B.ID='%s'
618 """ % (self.GTRS_Key,)
619 self.curs.execute(L1PrescalesQuery)
620 ## This is pretty horrible, but this how you get them!!
621 tmp = self.curs.fetchall()
622 self.L1PrescaleTable = []
623 for ps in tmp[0]: #build the prescale table initially
624 self.L1PrescaleTable.append([ps])
625 for line in tmp[1:]: # now fill it
626 for ps,index in zip(line,range(len(line))):
627 self.L1PrescaleTable[index].append(ps)
628 self.nAlgoBits=128
629
630 def GetHLTIndex(self,name):
631 for i,n in enumerate(self.HLTList):
632 if n.find(name)!=-1:
633 return i
634 #print name
635 return -1
636
637 def GetHLTPrescaleMatrix(self):
638 tmp_curs = ConnectDB('hlt')
639 configIDQuery = "SELECT CONFIGID FROM CMS_HLT.CONFIGURATIONS WHERE CONFIGDESCRIPTOR='%s'" % (self.HLT_Key)
640 tmp_curs.execute(configIDQuery)
641 ConfigId, = tmp_curs.fetchone()
642
643 SequencePathQuery ="""
644 SELECT F.SEQUENCENB,J.VALUE TRIGGERNAME
645 FROM CMS_HLT.CONFIGURATIONSERVICEASSOC A
646 , CMS_HLT.SERVICES B
647 , CMS_HLT.SERVICETEMPLATES C
648 , CMS_HLT.SUPERIDVECPARAMSETASSOC D
649 , CMS_HLT.VECPARAMETERSETS E
650 , CMS_HLT.SUPERIDPARAMSETASSOC F
651 , CMS_HLT.PARAMETERSETS G
652 , CMS_HLT.SUPERIDPARAMETERASSOC H
653 , CMS_HLT.PARAMETERS I
654 , CMS_HLT.STRINGPARAMVALUES J
655 WHERE A.CONFIGID=%d
656 AND A.SERVICEID=B.SUPERID
657 AND B.TEMPLATEID=C.SUPERID
658 AND C.NAME='PrescaleService'
659 AND B.SUPERID=D.SUPERID
660 AND D.VPSETID=E.SUPERID
661 AND E.NAME='prescaleTable'
662 AND D.VPSETID=F.SUPERID
663 AND F.PSETID=G.SUPERID
664 AND G.SUPERID=H.SUPERID
665 AND I.PARAMID=H.PARAMID
666 AND I.NAME='pathName'
667 AND J.PARAMID=H.PARAMID
668 ORDER BY F.SEQUENCENB
669 """ % (ConfigId,)
670
671 tmp_curs.execute(SequencePathQuery)
672 HLTSequenceMap = {}
673 for seq,name in tmp_curs.fetchall():
674 name = name.lstrip('"').rstrip('"')
675 HLTSequenceMap[seq]=name
676
677 SequencePrescaleQuery="""
678 SELECT F.SEQUENCENB,J.SEQUENCENB,J.VALUE
679 FROM CMS_HLT.CONFIGURATIONSERVICEASSOC A
680 , CMS_HLT.SERVICES B
681 , CMS_HLT.SERVICETEMPLATES C
682 , CMS_HLT.SUPERIDVECPARAMSETASSOC D
683 , CMS_HLT.VECPARAMETERSETS E
684 , CMS_HLT.SUPERIDPARAMSETASSOC F
685 , CMS_HLT.PARAMETERSETS G
686 , CMS_HLT.SUPERIDPARAMETERASSOC H
687 , CMS_HLT.PARAMETERS I
688 , CMS_HLT.VUINT32PARAMVALUES J
689 WHERE A.CONFIGID=%d
690 AND A.SERVICEID=B.SUPERID
691 AND B.TEMPLATEID=C.SUPERID
692 AND C.NAME='PrescaleService'
693 AND B.SUPERID=D.SUPERID
694 AND D.VPSETID=E.SUPERID
695 AND E.NAME='prescaleTable'
696 AND D.VPSETID=F.SUPERID
697 AND F.PSETID=G.SUPERID
698 AND G.SUPERID=H.SUPERID
699 AND I.PARAMID=H.PARAMID
700 AND I.NAME='prescales'
701 AND J.PARAMID=H.PARAMID
702 ORDER BY F.SEQUENCENB,J.SEQUENCENB
703 """ % (ConfigId,)
704
705 tmp_curs.execute(SequencePrescaleQuery)
706 lastIndex=-1
707 lastSeq=-1
708 row = []
709 for seq,index,val in tmp_curs.fetchall():
710 if lastIndex!=index-1:
711 self.HLTPrescaleTable[HLTSequenceMap[seq-1]] = row
712 row=[]
713 lastSeq=seq
714 lastIndex=index
715 row.append(val)
716
717
718 def GetHLTSeeds(self):
719 ## This is a rather delicate query, but it works!
720 ## Essentially get a list of paths associated with the config, then find the module of type HLTLevel1GTSeed associated with the path
721 ## Then find the parameter with field name L1SeedsLogicalExpression and look at the value
722 ##
723 ## NEED TO BE LOGGED IN AS CMS_HLT_R
724 tmpcurs = ConnectDB('hlt')
725 sqlquery ="""
726 SELECT I.NAME,A.VALUE
727 FROM
728 CMS_HLT.STRINGPARAMVALUES A,
729 CMS_HLT.PARAMETERS B,
730 CMS_HLT.SUPERIDPARAMETERASSOC C,
731 CMS_HLT.MODULETEMPLATES D,
732 CMS_HLT.MODULES E,
733 CMS_HLT.PATHMODULEASSOC F,
734 CMS_HLT.CONFIGURATIONPATHASSOC G,
735 CMS_HLT.CONFIGURATIONS H,
736 CMS_HLT.PATHS I
737 WHERE
738 A.PARAMID = C.PARAMID AND
739 B.PARAMID = C.PARAMID AND
740 B.NAME = 'L1SeedsLogicalExpression' AND
741 C.SUPERID = F.MODULEID AND
742 D.NAME = 'HLTLevel1GTSeed' AND
743 E.TEMPLATEID = D.SUPERID AND
744 F.MODULEID = E.SUPERID AND
745 F.PATHID=G.PATHID AND
746 I.PATHID=G.PATHID AND
747 G.CONFIGID=H.CONFIGID AND
748 H.CONFIGDESCRIPTOR='%s'
749 ORDER BY A.VALUE
750 """ % (self.HLT_Key,)
751 tmpcurs.execute(sqlquery)
752 for HLTPath,L1Seed in tmpcurs.fetchall():
753 if not self.HLTSeed.has_key(HLTPath): ## this should protect us from L1_SingleMuOpen
754 self.HLTSeed[HLTPath] = L1Seed.lstrip('"').rstrip('"')
755 #self.GetHLTPrescaleMatrix(tmpcurs)
756
757 def ParseRunSetup(self):
758 #queries that need to be run only once per run
759 self.GetRunInfo()
760 self.GetL1NameIndexAssoc()
761 self.GetL1AlgoPrescales()
762 self.GetHLTSeeds()
763 self.GetLumiInfo()
764 self.LastLSParsed=-1
765 self.GetMoreLumiInfo()
766 self.LastLsParsed=-1
767 #self.GetDeadTimeBeamActive()
768
769 def UpdateRun(self,LSRange):
770 self.GetLumiInfo()
771 TriggerRates = self.GetHLTRates(LSRange)
772 #L1Prescales = self.CalculateAvL1Prescales(LSRange)
773 #TotalPrescales = self.CalculateTotalPrescales(TriggerRates,L1Prescales)
774 #UnprescaledRates = self.UnprescaleRates(TriggerRates,TotalPrescales)
775
776 #return [UnprescaledRates, TotalPrescales, L1Prescales, TriggerRates]
777 return TriggerRates
778
779 def GetLSRange(self,StartLS, NLS,reqPhysics=True):
780 """
781 returns an array of valid LumiSections
782 if NLS < 0, count backwards from StartLS
783 """
784 self.GetLumiInfo()
785 LS=[]
786 curLS=StartLS
787 step = NLS/abs(NLS)
788 NLS=abs(NLS)
789
790 while len(LS)<NLS:
791 if (curLS<0 and step<0) or (curLS>=self.LastLSParsed and step>0):
792 break
793 if curLS>=0 and curLS<self.LastLSParsed-1:
794 if (not self.Physics.has_key(curLS) or not self.Active.has_key(curLS)) and reqPhysics:
795 break
796
797 if not reqPhysics or (self.Physics[curLS] and self.Active[curLS]):
798 if step>0:
799 LS.append(curLS)
800 else:
801 LS.insert(0,curLS)
802 curLS += step
803 return LS
804
805 def GetLastLS(self,phys=False):
806 self.GetLumiInfo()
807
808 try:
809 if not phys:
810 maxLS=-1
811 for ls, active in self.Active.iteritems():
812 if active and ls>maxLS:
813 maxLS=ls
814 if maxLS==-1:
815 return 0
816 else:
817 return maxLS
818
819 else:
820 maxLS=-1
821 for ls,phys in self.Physics.iteritems():
822 if phys and self.Active[ls] and ls > maxLS:
823 maxLS=ls
824 if maxLS==-1:
825 return 0
826 else:
827 return maxLS
828 except:
829 return 0
830
831 def CalculateAvL1Prescales(self,LSRange):
832 AvgL1Prescales = [0]*self.nAlgoBits
833 for index in LSRange:
834 psi = self.PSColumnByLS[index]
835 if not psi:
836 #print "L1: Cannot figure out PSI for LS "+str(index)+" setting to 0"
837 psi = 0
838 for algo in range(self.nAlgoBits):
839 AvgL1Prescales[algo]+=self.L1PrescaleTable[algo][psi]
840 for i in range(len(AvgL1Prescales)):
841 try:
842 AvgL1Prescales[i] = AvgL1Prescales[i]/len(LSRange)
843 except:
844 AvgL1Prescales[i] = AvgL1Prescales[i]
845 return AvgL1Prescales
846
847 def CalculateTotalPrescales(self,TriggerRates, L1Prescales):
848 AvgTotalPrescales={}
849 for hltName,v in TriggerRates.iteritems():
850 if not self.HLTSeed.has_key(hltName):
851 continue
852 hltPS=0
853 if len(v)>0:
854 hltPS = v[0]
855 l1Index=-1
856 if self.L1IndexNameMap.has_key(self.HLTSeed[hltName]):
857 l1Index = self.L1IndexNameMap[self.HLTSeed[hltName]]
858
859 l1PS=0
860 if l1Index==-1:
861 l1PS = self.UnwindORSeed(self.HLTSeed[hltName],L1Prescales)
862 else:
863 l1PS = L1Prescales[l1Index]
864 AvgTotalPrescales[hltName]=l1PS*hltPS
865 return AvgTotalPrescales
866
867 def UnwindORSeed(self,expression,L1Prescales):
868 """
869 Figures out the effective prescale for the OR of several seeds
870 we take this to be the *LOWEST* prescale of the included seeds
871 """
872 if expression.find(" OR ") == -1:
873 return -1 # Not an OR of seeds
874 seedList = expression.split(" OR ")
875 if len(seedList)==1:
876 return -1 # Not an OR of seeds, really shouldn't get here...
877 minPS = 99999999999
878 for seed in seedList:
879 if not self.L1IndexNameMap.has_key(seed):
880 continue
881 ps = L1Prescales[self.L1IndexNameMap[seed]]
882 if ps:
883 minPS = min(ps,minPS)
884 if minPS==99999999999:
885 return 0
886 else:
887 return minPS
888
889 def UnprescaleRates(self,TriggerRates,TotalPrescales):
890 UnprescaledRates = {}
891 for hltName,v in TriggerRates.iteritems():
892 if TotalPrescales.has_key(hltName):
893 ps = TotalPrescales[hltName]
894 if ps:
895 UnprescaledRates[hltName] = v[1]*ps
896 else:
897 UnprescaledRates[hltName] = v[1]
898 else:
899 UnprescaledRates[hltName] = v[1]
900 return UnprescaledRates
901
902 def GetTotalL1Rates(self):
903 query = "SELECT RUNNUMBER, LUMISEGMENTNR, L1ASPHYSICS/23.3 FROM CMS_WBM.LEVEL1_TRIGGER_CONDITIONS WHERE RUNNUMBER=%s" % self.RunNumber
904 self.curs.execute(query)
905 L1Rate = {}
906 for LS,rate in self.curs.fetchall():
907 psi = self.PSColumnByLS.get(LS,0)
908 lumi = self.InstLumiByLS.get(LS,0)
909 L1Rate[LS] = [rate,psi,lumi]
910 return L1Rate
911
912 def GetL1RatesALL(self,LSRange):
913 ##ANCIENT COMMANDS THAT DO WHO KNOWS WHAT
914 ##sqlquery = "SELECT RUN_NUMBER, LUMI_SECTION, RATE_HZ, SCALER_INDEX FROM CMS_GT_MON.V_SCALERS_TCS_TRIGGER WHERE RUN_NUMBER=%s AND LUMI_SECTION IN %s and SCALER_INDEX=9"
915 ##sqlquery = "SELECT RUN_NUMBER, LUMI_SECTION, RATE_HZ, SCALER_INDEX FROM CMS_GT_MON.V_SCALERS_FDL_ALGO WHERE RUN_NUMBER=%s AND LUMI_SECTION IN %s and SCALER_INDEX IN (9,13, 71)"
916 ##OLD VERSION THAT GETS PRE-DT RATE (used before 16/11/2012)
917 ##sqlquery = "SELECT RUN_NUMBER, LUMI_SECTION, RATE_HZ, SCALER_INDEX FROM CMS_GT_MON.V_SCALERS_FDL_ALGO WHERE RUN_NUMBER=%s AND LUMI_SECTION IN %s"
918
919 ##NEW VERSION THAT GETS POST-DT RATE (implemented 16/11/2012)
920 sqlquery = "SELECT RUN_NUMBER, LUMI_SECTION, COUNT/23.3, BIT FROM (SELECT MOD(ROWNUM - 1, 128) BIT , TO_CHAR(A.MODIFICATIONTIME, 'YYYY.MM.DD HH24:MI:SS') TIME, C.COLUMN_VALUE COUNT, A.RUNNUMBER RUN_NUMBER, A.LSNUMBER LUMI_SECTION FROM CMS_RUNINFO.HLT_SUPERVISOR_L1_SCALARS A ,TABLE(A.DECISION_ARRAY) C WHERE A.RUNNUMBER = %s AND A.LSNUMBER IN %s )"
921
922 LSRangeSTR = str(LSRange)
923 LSRangeSTR = LSRangeSTR.replace("[","(")
924 LSRangeSTR = LSRangeSTR.replace("]",")")
925
926 query= sqlquery %(self.RunNumber,LSRangeSTR)
927 self.curs.execute(query)
928 L1RateAll=self.curs.fetchall()
929 L1RatesBits={}
930 ###initialize dict of L1 bits
931 for L1seed in sorted(self.L1IndexNameMap.iterkeys()):
932 L1RatesBits[self.L1IndexNameMap[L1seed]]=0
933
934 ###sum dict of L1 bits
935 for line in L1RateAll:
936 #if line[3] in self.L1IndexNameMap: ##do not fill if empty L1 key
937 try:
938 L1RatesBits[line[3]]=line[2]+L1RatesBits[line[3]]
939 except:
940 pass
941 #print "not filling bit",line[3]
942 ###divide by number of LS
943 for name in self.L1IndexNameMap.iterkeys():
944 L1RatesBits[self.L1IndexNameMap[name]]=L1RatesBits[self.L1IndexNameMap[name]]/len(LSRange)
945
946 ###total L1 PS table
947 L1PSdict={}
948 counter=0
949 for line in self.L1PrescaleTable:
950 L1PSdict[counter]=line
951 counter=counter+1
952
953 ###av ps dict
954 L1PSbits={}
955 for bit in L1PSdict.iterkeys():
956 L1PSbits[bit]=0
957 for bit in L1PSdict.iterkeys():
958 for LS in LSRange:
959 L1PSbits[bit]=L1PSbits[bit]+L1PSdict[bit][self.PSColumnByLS[LS]]
960 for bit in L1PSbits.iterkeys():
961 L1PSbits[bit]=L1PSbits[bit]/len(LSRange)
962
963
964 ###convert dict of L1 bits to dict of L1 names
965 L1RatesNames={}
966 for name in self.L1IndexNameMap.iterkeys():
967 dummy=[]
968 dummy.append(L1PSbits[self.L1IndexNameMap[name]])
969 dummy.append(L1PSbits[self.L1IndexNameMap[name]])
970 dummy.append(L1RatesBits[self.L1IndexNameMap[name]])
971 dummy.append(L1RatesBits[self.L1IndexNameMap[name]]*L1PSbits[self.L1IndexNameMap[name]])
972 L1RatesNames[name+'_v1']=dummy
973
974 return L1RatesNames
975
976
977 def GetL1PSbyseed(self):
978 #for name in self.L1IndexNameMap.iterkeys():
979 # print name, self.L1IndexNameMap[name], self.L1PrescaleTable[self.L1IndexNameMap[name]]
980 #self.HLTSeed[name]
981
982 #for name in self.HLTSeed:
983 # print name, self.HLTSeed[name]
984 #self.L1PrescaleTable[self.L1IndexNameMap[self.HLTSeed[name]]][psi]
985 L1HLTSeeds=self.GetL1HLTseeds()
986 HLTL1PS={}
987 for HLTkey in L1HLTSeeds.iterkeys():
988 #print HLTkey, L1HLTSeeds[HLTkey]
989 dict={}
990 for L1seed in L1HLTSeeds[HLTkey]:
991
992 #try:
993 # print L1seed, L1HLTSeeds[HLTkey], self.L1PrescaleTable[self.L1IndexNameMap[L1seed]]
994 #except:
995 # print 'fail'
996
997 try:
998 dict[L1seed]=self.L1PrescaleTable[self.L1IndexNameMap[L1seed]]
999
1000 except:
1001
1002 dummylist=[]
1003 for i in range(0,len(self.L1PrescaleTable[0])):
1004 dummylist.append(1)
1005 dict[L1seed]=dummylist
1006
1007 #exit(2)
1008 #print HLTkey, dict
1009
1010 HLTL1PS[HLTkey]=dict
1011 #for HLTkey in HLTL1PS.iterkeys():
1012 # print HLTkey, HLTL1PS[HLTkey]
1013 return HLTL1PS
1014
1015 def GetL1Rates(self,LSRange):
1016
1017 sqlquery = "SELECT RUN_NUMBER, LUMI_SECTION, SCALER_NAME, RATE_HZ FROM CMS_GT_MON.V_SCALERS_TCS_TRIGGER WHERE RUN_NUMBER=%s and SCALER_NAME='L1AsPhysics' and LUMI_SECTION in %s"
1018
1019 LSRangeSTR = str(LSRange)
1020 LSRangeSTR = LSRangeSTR.replace("[","(")
1021 LSRangeSTR = LSRangeSTR.replace("]",")")
1022
1023 query=sqlquery %(self.RunNumber, LSRangeSTR)
1024
1025 #print query
1026 self.curs.execute(query)
1027
1028 L1Rate=self.curs.fetchall()
1029
1030 for line in L1Rate:
1031 #print line
1032 pass
1033
1034
1035
1036 return L1Rate
1037
1038 def AssemblePrescaleValues(self): ##Depends on output from ParseLumiPage and ParseTriggerModePage
1039 return ## WHAT DOES THIS FUNCTION DO???
1040 MissingName = "Nemo"
1041 for key in self.L1TriggerMode:
1042 self.L1Prescale[key] = {}
1043 for n in range(min(self.LSByLS),max(self.LSByLS)+1): #"range()" excludes the last element
1044 try:
1045 self.L1Prescale[key][n] = self.L1TriggerMode[key][self.PSColumnByLS[n]]
1046 except:
1047 if not key == MissingName:
1048 self.MissingPrescale.append(key)
1049 MissingName = key
1050 if not n < 2:
1051 print "LS "+str(n)+" of key "+str(key)+" is missing from the LumiSections page"
1052
1053 for key in self.HLTTriggerMode:
1054 self.HLTPrescale[key] = {}
1055 for n in range(min(self.LSByLS),max(self.LSByLS)+1): #"range" excludes the last element
1056 try:
1057 self.HLTPrescale[key][n] = self.HLTTriggerMode[key][self.PSColumnByLS[n]]
1058 except:
1059 if not key == MissingName:
1060 self.MissingPrescale.append(key)
1061 MissingName = key
1062 if not n < 2:
1063 print "LS "+str(n)+" of key "+str(key)+" is missing from the LumiSections page"
1064
1065 self.PrescaleValues = [self.L1Prescale,self.HLTPrescale,self.MissingPrescale]
1066 return self.PrescaleValues
1067
1068 def ComputeTotalPrescales(self,StartLS,EndLS):
1069 return ## WHAT DOES THIS FUNCTION DO??
1070 IdealHLTPrescale = {}
1071 IdealPrescale = {}
1072 L1_zero = {}
1073 HLT_zero = {}
1074 n1 = {}
1075 n2 = {}
1076 L1 = {}
1077 L2 = {}
1078 H1 = {}
1079 H2 = {}
1080 InitialColumnIndex = self.PSColumnByLS[int(StartLS)]
1081
1082 for key in self.HLTTriggerMode:
1083 try:
1084 DoesThisPathHaveAValidL1SeedWithPrescale = self.L1Prescale[self.HLTSeed[key]][StartLS]
1085 except:
1086 L1_zero[key] = True
1087 HLT_zero[key] = False
1088 continue
1089
1090 IdealHLTPrescale[key] = 0.0
1091 IdealPrescale[key] = 0.0
1092 n1[key] = 0
1093 L1_zero[key] = False
1094 HLT_zero[key] = False
1095
1096 for LSIterator in range(StartLS,EndLS+1): #"range" excludes the last element
1097 if self.L1Prescale[self.HLTSeed[key]][LSIterator] > 0 and self.HLTPrescale[key][LSIterator] > 0:
1098 IdealPrescale[key]+=1.0/(self.L1Prescale[self.HLTSeed[key]][LSIterator]*self.HLTPrescale[key][LSIterator])
1099 else:
1100 IdealPrescale[key]+=1.0 ##To prevent a divide by 0 error later
1101 if self.L1Prescale[self.HLTSeed[key]][LSIterator] < 0.1:
1102 L1_zero[key] = True
1103 if self.HLTPrescale[key][LSIterator] < 0.1:
1104 HLT_zero[key] = True
1105 if self.PSColumnByLS[LSIterator] == InitialColumnIndex:
1106 n1[key]+=1
1107
1108 if L1_zero[key] == True or HLT_zero[key] == True:
1109 continue
1110
1111 IdealPrescale[key] = (EndLS + 1 - StartLS)/IdealPrescale[key]
1112
1113 n2[key] = float(EndLS + 1 - StartLS - n1[key])
1114 L1[key] = float(self.L1Prescale[self.HLTSeed[key]][StartLS])
1115 L2[key] = float(self.L1Prescale[self.HLTSeed[key]][EndLS])
1116 H1[key] = float(self.HLTPrescale[key][StartLS])
1117 H2[key] = float(self.HLTPrescale[key][EndLS])
1118
1119 IdealHLTPrescale[key] = ((n1[key]/L1[key])+(n2[key]/L2[key]))/((n1[key]/(L1[key]*H1[key]))+(n2[key]/(L2[key]*H2[key])))
1120
1121 self.TotalPSInfo = [L1_zero,HLT_zero,IdealPrescale,IdealHLTPrescale,n1,n2,L1,L2,H1,H2]
1122
1123 return self.TotalPSInfo
1124
1125
1126 def CorrectForPrescaleChange(self,StartLS,EndLS):
1127 [L1_zero,HLT_zero,IdealPrescale,IdealHLTPrescale,n1,n2,L1,L2,H1,H2] = self.TotalPSInfo
1128 xLS = {}
1129 RealPrescale = {}
1130
1131 for key in self.HLTTriggerMode:
1132 if L1_zero[key] == True or HLT_zero[key] == True:
1133 continue
1134 [TriggerRate,L1Pass,PSPass,PS,Seed,StartLS,EndLS] = self.TriggerRates[key]
1135 if PS > 0.95 * IdealHLTPrescale[key] and PS < 1.05 * IdealHLTPrescale[key]:
1136 RealPrescale[key] = IdealPrescale[key]
1137 continue
1138
1139 if H1[key] == H2[key] and L1[key] == L2[key] and not EndLS > max(self.LSByLS) - 1: ##Look for prescale change into the next LS
1140 H2[key] = float(self.HLTPrescale[key][EndLS+1])
1141 L2[key] = float(self.L1Prescale[self.HLTSeed[key]][EndLS+1])
1142 if H1[key] == H2[key] and L1[key] == L2[key] and not StartLS < 3:
1143 H1[key] = float(self.HLTPrescale[key][StartLS-1])
1144 L1[key] = float(self.L1Prescale[self.HLTSeed[key]][StartLS-1])
1145 if H1[key] == H2[key]:
1146 xLS[key] = 0
1147 else:
1148 xLS[key] = ((-(PS/IdealHLTPrescale[key])*(L2[key]*n1[key]+L1[key]*n2[key])*(H2[key]*L2[key]*n1[key]+H1[key]*L1[key]*n2[key]))+((H2[key]*L2[key]*n1[key]+H1[key]*L1[key]*n2[key])*(L2[key]*n1[key]+L1[key]*n2[key])))/(((PS/IdealHLTPrescale[key])*(L2[key]*n1[key]+L1[key]*n2[key])*(H1[key]*L1[key]-H2[key]*L2[key]))+((H2[key]*L2[key]*n1[key]+H1[key]*L1[key]*n2[key])*(L2[key]-L1[key])))
1149
1150 if xLS[key] > 1:
1151 xLS[key] = 1
1152 if xLS[key] < -1:
1153 xLS[key] = -1
1154 RealPrescale[key] = (n1[key] + n2[key])/(((n1[key] - xLS[key])/(H1[key]*L1[key]))+(n2[key]+xLS[key])/(H2[key]*L2[key]))
1155
1156 self.CorrectedPSInfo = [RealPrescale,xLS,L1,L2,H1,H2]
1157
1158 return self.CorrectedPSInfo
1159
1160 def GetAvLumiPerRange(self, NMergeLumis=10):
1161 """
1162 This function returns a per-LS table of the average lumi of the previous NMergeLumis LS
1163 """
1164 AvLumiRange = []
1165 AvLumiTable = {}
1166 for ls,lumi in self.InstLumiByLS.iteritems():
1167 try:
1168 AvLumiRange.append(int(lumi))
1169 except:
1170 continue
1171 if len(AvLumiRange) == NMergeLumis:
1172 AvLumiRange = AvLumiRange[1:]
1173 AvLumiTable[ls] = sum(AvLumiRange)/NMergeLumis
1174 return AvLumiTable
1175
1176 def GetTriggerVersion(self,triggerName):
1177 for key in self.HLTSeed.iterkeys():
1178 if StripVersion(key)==triggerName:
1179 return key
1180 return ""
1181
1182 def Save(self, fileName):
1183 dir = os.path.dirname(fileName)
1184 if not os.path.exists(dir):
1185 os.makedirs(dir)
1186 pickle.dump( self, open( fileName, 'w' ) )
1187
1188 def Load(self, fileName):
1189 self = pickle.load( open( fileName ) )
1190
1191 def ConnectDB(user='trg'):
1192 try:
1193 host = os.uname()[1]
1194 #offline = 1 if host.startswith('lxplus') else 0
1195 if host.startswith('lxplus'):
1196 offline=1
1197 else:
1198 offline=0
1199 except:
1200 print "Please setup database parsing:\nsource set.sh"
1201 ##print offline
1202 trg = ['~centraltspro/secure/cms_trg_r.txt','~/secure/cms_trg_r.txt']
1203 hlt = ['~hltpro/secure/cms_hlt_r.txt','~/secure/cms_hlt_r.txt']
1204
1205 if user == 'trg':
1206 cmd = 'cat %s' % (trg[offline],)
1207 elif user == 'hlt':
1208 cmd='cat %s' % (hlt[offline],)
1209
1210 try:
1211 line=os.popen(cmd).readlines()
1212 except:
1213 print "ERROR Getting the database password!"
1214 print "They should be in %s and %s" % (trg[offline],hlt[offline],)
1215 print "You may need to copy them from the online machines"
1216 sys.exit(0)
1217 magic = line[0].rstrip("\n\r")
1218 connect = 'cms_%s_r/%s@cms_omds_lb' % (user,magic,)
1219 orcl = cx_Oracle.connect(connect)
1220 return orcl.cursor()
1221
1222
1223 def GetLatestRunNumber(runNo=9999999,newRun=False):
1224
1225 curs = ConnectDB()
1226
1227 if runNo==9999999:
1228
1229 ##
1230 ##SELECT MAX(RUNNUMBER) FROM CMS_RUNINFO.RUNNUMBERTBL
1231 ##SELECT MAX(RUNNUMBER) CMS_WBM.RUNSUMMARY WHERE TRIGGERS>0
1232 ## RunNoQuery="""
1233 ## SELECT MAX(A.RUNNUMBER) FROM CMS_RUNINFO.RUNNUMBERTBL A, CMS_WBM.RUNSUMMARY B WHERE A.RUNNUMBER=B.RUNNUMBER AND B.TRIGGERS>0
1234 ## """
1235
1236 RunNoQuery="""SELECT MAX(A.RUNNUMBER)
1237 FROM CMS_RUNINFO.RUNNUMBERTBL A, CMS_RUNTIME_LOGGER.LUMI_SECTIONS B WHERE B.RUNNUMBER=A.RUNNUMBER AND B.LUMISECTION > 0
1238 """
1239 try:
1240 curs.execute(RunNoQuery)
1241 r, = curs.fetchone()
1242 ##print "\nr=",r
1243 except:
1244 print "not able to get run"
1245
1246 ## RunNoQuery="""SELECT MAX(RUNNUMBER) FROM CMS_RUNINFO.RUNNUMBERTBL"""
1247 ## try:
1248 ## curs.execute(RunNoQuery)
1249 ## ra, = curs.fetchone()
1250 ## print "ra=",ra
1251 ## except:
1252 ## print "not able to get ra"
1253
1254
1255 ## RunNoQuery="""SELECT TIER0_TRANSFER FROM CMS_WBM.RUNSUMMARY WHERE TRIGGERS>0 AND RUNUMBER=MAX(RUNNUMBER)"""
1256 ## try:
1257 ## curs.execute(RunNoQuery)
1258 ## rb, = curs.fetchone()
1259 ## print "rb=",rb
1260 ## except:
1261 ## print "not able to get rb"
1262
1263 ## RunNoQuery="""SELECT MAX(RUNNUMBER) FROM CMS_RUNTIME_LOGGER.LUMI_SECTIONS WHERE LUMISECTION > 0 """
1264 ## try:
1265 ## curs.execute(RunNoQuery)
1266 ## rc, = curs.fetchone()
1267 ## print "rc=",rc
1268 ## except:
1269 ## print "not able to get rc"
1270
1271 else:
1272 r = runNo
1273 isCol=0
1274
1275 TrigModeQuery = """
1276 SELECT TRIGGERMODE FROM CMS_WBM.RUNSUMMARY WHERE RUNNUMBER = %d
1277 """ % r
1278 curs.execute(TrigModeQuery)
1279 try:
1280 trigm, = curs.fetchone()
1281 except:
1282 print "unable to get trigm from query for run ",r
1283 isCol=0
1284 isGood=1
1285
1286
1287 try:
1288 if trigm is None:
1289 isGood=0
1290 elif trigm.find('l1_hlt_collisions')!=-1:
1291 isCol=1
1292 except:
1293 isGood=0
1294
1295 Tier0xferQuery = """
1296 SELECT TIER0_TRANSFER TIER0 FROM CMS_WBM.RUNSUMMARY WHERE RUNNUMBER = %d
1297 """ % r
1298 curs.execute(Tier0xferQuery)
1299 tier0=1
1300 try:
1301 tier0, = curs.fetchone()
1302
1303 except:
1304 print "unable to get tier0 from query for run ",r
1305
1306 if isCol and not tier0:
1307 #write(bcolors.FAIL)
1308 print "WARNING tier0 transfer is off"
1309 #write(bcolors.ENDC+"\n")
1310 elif not tier0:
1311 #write(bcolors.WARINING)
1312 print "Please check if tier0 transfer is supposed to be off"
1313 #write(bcolors.ENDC+"\n")
1314
1315
1316
1317 return (r,isCol,isGood,)
1318
1319 def ClosestIndex(value,table):
1320 diff = 999999999;
1321 index = 0
1322 for i,thisVal in table.iteritems():
1323 if abs(thisVal-value)<diff:
1324 diff = abs(thisVal-value)
1325 index =i
1326 return index
1327
1328
1329 def StripVersion(name):
1330 if re.match('.*_v[0-9]+',name):
1331 name = name[:name.rfind('_')]
1332 return name
1333
1334 def GetLastKnownPSIndex(psindex_dict):
1335 psi = 3
1336 for ls in reversed(psindex_dict.keys()):
1337 if psindex_dict[ls] is not None:
1338 psi = psindex_dict[ls]
1339 break
1340 return psi