ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/RateMonShiftTool_dev/RateMonitorShifterFunction.py
Revision: 1.1
Committed: Tue Nov 1 16:28:06 2011 UTC (13 years, 5 months ago) by grchrist
Content type: text/x-python
Branch: MAIN
CVS Tags: V00-02-06, V00-02-05, V00-02-04, V00-02-03, V00-02-01, V00-01-10, V-00-01-10, V00-01-09, V00-01-08, V00-01-07, V00-01-06, V00-01-05, V00-01-04, V00-01-03, V00-01-02, V00-01-01, V00-00-34, V00-00-33, MenuAnalyzer_V00-00-02, MenuAnalyzer_V00-00-01, MenuAnalyzer_V1, V00-00-32, V00-00-31, V00-00-30, V00-00-29, V00-00-28, V00-00-27, V00-00-26, V00-00-24, V00-00-23, V00-00-22, V00-00-21, V00-00-20, V00-00-19, V00-00-18, V00-00-17, V00-00-16, V00-00-15, V00-00-14, V00-00-13, V00-00-12, V00-00-11, V00-00-10, V00-00-09, V00-00-08, V00-00-07, V00-00-05, V00-00-04, V00-00-03, V00-00-02, V00-00-01, HEAD
Branch point for: V00-00-06
Log Message:
development code for rate monitoring script

File Contents

# Content
1 #!/usr/bin/env python
2
3 from Page1Parser import Page1Parser
4 from GetRun import GetRun
5 import sys
6 import os
7 import cPickle as pickle
8 import getopt
9 import time
10 from ReadConfig import RateMonConfig
11 from colors import *
12
13 WBMPageTemplate = "http://cmswbm/cmsdb/servlet/RunSummary?RUN=%s&DB=cms_omds_lb"
14 WBMRunInfoPage = "https://cmswbm/cmsdb/runSummary/RunSummary_1.html"
15
16 RefRunNameTemplate = "RefRuns/Run_%s.pk"
17
18 def RateMon(InputRun,BeginningLS):
19
20 Config = RateMonConfig(os.path.abspath(os.path.dirname(sys.argv[0])))
21
22 Config.ReadCFG()
23
24 IgnoreVersion = False
25 ZerosOnly = False
26 ListIgnoredPaths = False
27 AllowedRateDiff = Config.DefAllowRateDiff
28 IgnoreThreshold = Config.DefAllowIgnoreThresh
29 CompareRunNum = InputRun
30 FindL1Zeros = Config.FindL1Zeros
31 FirstLS = BeginningLS
32 EndEndLS = 111111
33 LastLS = FirstLS+10
34 RefRunNum = int(Config.ReferenceRun)
35
36 if Config.LSWindow > 0 and FirstLS == 999999:
37 FirstLS = -1*Config.LSWindow
38
39 FirstTime = 0
40 try:
41 if FirstTime == 0:
42 ### Get the most recent run
43 SaveRun=False
44 if CompareRunNum=="": # if no run # specified on the CL, get the most recent run
45 RunListParser = Page1Parser()
46
47 RunListParser._Parse(WBMRunInfoPage) # this is the page that lists all the runs in the last 24 hours with at least 1 trigger
48 RunListPage = RunListParser.ParsePage1()
49 if RunListPage == '': # this will be '' if the mode of the most recent run is not l1_hlt_collisions/v*
50 print "Most Recent run is NOT collisions"
51 sys.exit(0) # maybe we should walk back and try to find a collisions run, but for now just exit
52 CompareRunNum = RunListParser.RunNumber
53 print "Most Recent run is "+CompareRunNum
54 else:
55 SaveRun=False
56 HeadRunFile = RefRunNameTemplate % CompareRunNum
57 RefRunFile = RefRunNameTemplate % str(RefRunNum)
58
59 if not os.path.exists(RefRunFile[:RefRunFile.rfind('/')]): # folder for ref run file must exist
60 print "Reference run folder does not exist, please create" # should probably create programmatically, but for now force user to create
61 print RefRunFile[:RefRunFile.rfind('/')]
62 sys.exit(0)
63
64 if not os.path.exists(RefRunFile) and RefRunNum != 0: # if the reference run is not saved, get it from wbm
65 print "Updated reference run file"
66 RefParser = GetRun(RefRunNum, RefRunFile, True)
67 else: # otherwise load it from the file
68 if RefRunNum != 0:
69 RefParser = pickle.load( open( RefRunFile ) )
70
71
72 if os.path.exists(HeadRunFile): # check if a run file for the run we want to compare already exists, it probably won't but just in case we don't have to interrogate WBM
73 HeadParser = pickle.load( open( HeadRunFile ) )
74 else:
75 HeadParser = GetRun(CompareRunNum,HeadRunFile,SaveRun,FirstLS,EndEndLS)
76
77 if HeadParser.FirstLS==-1:
78 print bcolors.OKBLUE+">> Stable Beams NOT yet declared, be patient..."+bcolors.ENDC
79 sys.exit(0)
80
81 HeadRates = HeadParser.TriggerRates
82
83 write=sys.stdout.write
84
85 write ('\nCalculation using FirstLS = %s to LastLS = %s\n' % (HeadParser.FirstLS, HeadParser.LastLS))
86
87 write("The average lumi of these lumi sections is: ")
88 if HeadParser.AvLiveLumi==0:
89 write(bcolors.FAIL)
90 elif HeadParser.AvLiveLumi<100:
91 write(bcolors.WARNING)
92 else:
93 write(bcolors.OKBLUE)
94 write(str(round(HeadParser.AvLiveLumi,1))+"e30")
95 write(bcolors.ENDC+"\n\n")
96
97 #print "Printing all PS columns"
98 #print HeadParser.PrescaleColumn
99 print "Using prescale column %s" % HeadParser.PrescaleColumn[-2]
100
101 #print HeadParser.PrescaleColumn
102 if HeadParser.PrescaleColumn[-2]==0:
103 write(bcolors.FAIL)
104 write("WARNING: You are using prescale column 0 in Lumi Section %s! This is the emergency column and should only be used if there is no other way to take data\n" % (HeadParser.LastLS) )
105 write("If this is a mistake FIX IT NOW \nif not, the TFM and HLT DOC must be informed\n\n")
106
107 write("\n\n")
108 write(bcolors.ENDC)
109
110 nameBufLen=60
111 RateBuffLen=10
112 write('*'*(nameBufLen+3*RateBuffLen+2)+'\n')
113 write('* Trigger Name'+' '*(nameBufLen-17)+'* Actual * Expected * % Diff *\n')
114 write('*'*(nameBufLen+3*RateBuffLen+2)+'\n')
115
116 IgnoredRates=[]
117 LargeRateDifference=False
118 for headTrigN,headTrigRate,headTrigPS,headL1 in HeadRates:
119 headTrigNNoVersion = headTrigN[:headTrigN.rfind('_')]
120 if not Config.AnalyzeTrigger(headTrigNNoVersion): ## SKIP triggers in the skip list
121 continue
122 ExpectedRate = round(Config.GetExpectedRate(headTrigNNoVersion,HeadParser.AvLiveLumi),1)
123 PerDiff=0
124 if ExpectedRate>0:
125 PerDiff = int(round( (headTrigRate-ExpectedRate)/ExpectedRate,2 )*100)
126 ##Write Line ##
127 if headTrigRate==0:
128 write(bcolors.FAIL)
129 elif abs(PerDiff) > AllowedRateDiff:
130 write(bcolors.FAIL)
131 else:
132 write(bcolors.OKGREEN)
133 write('* '+headTrigN+' '*(nameBufLen-len(headTrigN)-5)+'*')
134 write(' '*(RateBuffLen-len(str(headTrigRate))-1)+str(headTrigRate)+' *')
135 write(' '*(RateBuffLen-len(str(ExpectedRate))-1)+str(ExpectedRate)+' *')
136 if ExpectedRate>0:
137 if abs(PerDiff) > AllowedRateDiff/2:
138 write(' '+' '*(RateBuffLen-len(str(PerDiff))-2)+str(PerDiff)+'%')
139 else:
140 write(' good ')
141 else:
142 write(' ')
143 write(' *')
144 if headTrigRate==0:
145 write(" << TRIGGER RATE IS ZERO! check shift instructions")
146 elif abs(PerDiff) > AllowedRateDiff:
147 write(" << LARGE RATE DIFFERENCE: check shift instructions")
148 LargeRateDifference=True # this means we automatically check the reference run
149 write(bcolors.ENDC+'\n')
150
151 CallDOC=False
152 if ( LargeRateDifference or Config.CompareReference ) and RefRunNum != 0:
153 if LargeRateDifference:
154 write(bcolors.WARNING)
155 print """
156 \n\n
157 ********************************************************************
158 A trigger in this run has a substantial difference from expectations.\n
159 Comparing the current run to a reference run
160 ********************************************************************
161 """
162 write(bcolors.ENDC)
163 else:
164 print "\n\n Comparing to reference Run:\n\n"
165
166 write('*'*(nameBufLen+3*RateBuffLen+2)+'\n')
167 write('* Trigger Name'+' '*(nameBufLen-17)+'* Actual * Expected * % Diff *\n')
168 write('*'*(nameBufLen+3*RateBuffLen+2)+'\n')
169
170 NotFound=[]
171 for headTrigN,headTrigRate,headTrigPS,headL1 in HeadRates:
172 headTrigNNoVersion = headTrigN[:headTrigN.rfind('_')]
173 if not Config.AnalyzeTrigger(headTrigNNoVersion): ## SKIP triggers in the skip list
174 continue
175 ExpectedRate=-1
176 for refTrigN,refTrigRate,refTrigPS,refLa in RefParser.TriggerRates:
177 refTrigNNoVersion = refTrigN[:refTrigN.rfind('_')]
178 if refTrigNNoVersion == headTrigNNoVersion:
179 ExpectedRate = round(refTrigRate * HeadParser.AvLiveLumi/RefParser.AvLiveLumi,2)
180 break
181 if ExpectedRate==-1:
182 NotFound.append(headTrigNNoVersion)
183 continue
184 PerDiff=0
185 if ExpectedRate>0:
186 PerDiff = int(round( (headTrigRate-ExpectedRate)/ExpectedRate,2 )*100)
187 ##Write Line ##
188 if headTrigRate==0:
189 write(bcolors.FAIL)
190 elif abs(PerDiff) >AllowedRateDiff:
191 write(bcolors.FAIL)
192 else:
193 write(bcolors.OKGREEN)
194 write('* '+headTrigN+' '*(nameBufLen-len(headTrigN)-5)+'*')
195 write(' '*(RateBuffLen-len(str(headTrigRate))-1)+str(headTrigRate)+' *')
196 write(' '*(RateBuffLen-len(str(ExpectedRate))-1)+str(ExpectedRate)+' *')
197 if ExpectedRate>0:
198 if abs(PerDiff) > AllowedRateDiff/2:
199 write(' '+' '*(RateBuffLen-len(str(PerDiff))-2)+str(PerDiff)+'%')
200 else:
201 write(' good ')
202 else:
203 write(' ')
204 write(' *')
205 if headTrigRate==0:
206 write(" << TRIGGER RATE IS ZERO! CALL HLT DOC")
207 CallDOC=True
208 elif abs(PerDiff) > AllowedRateDiff:
209 write(" << LARGE RATE DIFFERENCE WITH REFERENCE RUN")
210 CallDOC=True
211 write(bcolors.ENDC+'\n')
212
213 if CallDOC:
214 write(bcolors.FAIL)
215 print "\nSomething looks very wrong in this run"
216 print "If there is no obvious reason for this (subdetector out, etc.): **inform the SHIFT LEADER and call the HLT DOC!**"
217 raw_input("Press Enter to continue ... ")
218 write(bcolors.ENDC)
219
220 if FindL1Zeros:
221 L1Zeros=[]
222 IgnoreBits = ["L1_PreCollisions","L1_InterBunch_Bsc","L1_BeamHalo","L1_BeamGas_Hf"]
223 for trigN,L1Pass,PSPass,PAccept,SeedName in HeadParser.Nevts:
224 ## Skip events in the skip list
225 trigNNoVersion = trigN[:trigN.rfind('_')]
226 if Config.AnalyzeTrigger(trigNNoVersion):
227 continue
228 ## if no events pass the L1, add it to the L1Zeros list if not already there
229 if SeedName in IgnoreBits:
230 continue
231 if L1Pass==0 and not SeedName in L1Zeros and SeedName.find("BeamGas")==-1 and SeedName.find('L1_SingleMuOpen')==-1:
232 L1Zeros.append(SeedName)
233 if len(L1Zeros) == 0:
234 pass
235 #print bcolors.OKGREEN+">>> L1 Seeds are fine"+bcolors.ENDC
236
237 # end if find l1 zeros
238
239 FirstTime+=1
240 # End of if FirstTime
241 #end of try
242 except KeyboardInterrupt:
243 print "Quitting the program"