1 |
#!/usr/bin/env python
|
2 |
import os
|
3 |
import cPickle as pickle
|
4 |
import math
|
5 |
from DatabaseParser import *
|
6 |
|
7 |
class RateMonConfig:
|
8 |
|
9 |
def __init__(self,path='./'):
|
10 |
self.CFGfile=path+"/defaults.cfg"
|
11 |
self.BasePath=path
|
12 |
self.ReferenceRun=""
|
13 |
self.DefAllowRatePercDiff=0.0
|
14 |
self.DefAllowRateSigmaDiff=0.0
|
15 |
self.DefAllowIgnoreThresh=0.0
|
16 |
self.ExcludeList=[]
|
17 |
self.MonitorList=[]
|
18 |
self.MonitorIntercept=[]
|
19 |
self.MonitorSlope=[]
|
20 |
self.MonitorQuad=[]
|
21 |
self.L1Predictions=[]
|
22 |
self.AllTriggers=0
|
23 |
self.MonTargetLumi=0
|
24 |
self.LSWindow=-1
|
25 |
self.CompareReference=0
|
26 |
self.ShifterMode=0
|
27 |
self.NoVersion=0
|
28 |
self.MaxExpressRate=999
|
29 |
self.ForbiddenCols=[]
|
30 |
self.CirculatingBeamsColumn=9
|
31 |
self.MaxLogMonRate=10
|
32 |
self.DefWarnOnSigmaDiff=1
|
33 |
self.DefShowSigmaAndPercDiff=0
|
34 |
self.DoL1=0
|
35 |
self.DefaultMaxBadRatesToShow=500
|
36 |
self.L1SeedChangeFit=0
|
37 |
self.ShowAllBadRates=0
|
38 |
|
39 |
def ReadList(self,filename):
|
40 |
filename=self.BasePath+'/'+filename
|
41 |
list = []
|
42 |
if not os.path.exists(filename):
|
43 |
return list
|
44 |
f = open(filename)
|
45 |
for line in f:
|
46 |
if line.startswith('#'):
|
47 |
continue
|
48 |
if len(line)<3 or line=='\n':
|
49 |
continue
|
50 |
line = ((line.rstrip('\n')).rstrip(' '))
|
51 |
if line.find(':')==-1: # exclude list, no rate estimates
|
52 |
list.append( line )
|
53 |
else:
|
54 |
split = line.split(':')
|
55 |
list.append(split[0])
|
56 |
##list.append([split[0],split[1],split[2],split[3]])
|
57 |
f.close()
|
58 |
return list
|
59 |
|
60 |
def ReadCFG(self):
|
61 |
f=open(self.CFGfile)
|
62 |
for line in f:
|
63 |
if line.startswith('#'):
|
64 |
continue
|
65 |
if len(line)<1:
|
66 |
continue
|
67 |
|
68 |
strippedLine = line.split('#')[0]
|
69 |
strippedLine = strippedLine.rstrip('\n').rstrip(' ')
|
70 |
if strippedLine=='':
|
71 |
continue
|
72 |
tok = strippedLine.split('=')
|
73 |
par = tok[0].rstrip(' ').lstrip(' ')
|
74 |
if len(tok)>=2:
|
75 |
arg=tok[1].rstrip('\n').rstrip(' ').lstrip(' ')
|
76 |
else:
|
77 |
arg=''
|
78 |
|
79 |
if par=="ReferenceRun":
|
80 |
self.ReferenceRun=arg
|
81 |
elif par=="ShowSigmaAndPercDiff":
|
82 |
self.DefShowSigmaAndPercDiff=float(arg)
|
83 |
elif par=="DefaultAllowedRatePercDiff":
|
84 |
self.DefAllowRatePercDiff=float(arg)
|
85 |
elif par=="DefaultAllowedRateSigmaDiff":
|
86 |
self.DefAllowRateSigmaDiff=float(arg)
|
87 |
elif par=="DefaultIgnoreThreshold":
|
88 |
self.DefAllowIgnoreThresh=float(arg)
|
89 |
elif par=="ExcludeTriggerList":
|
90 |
self.ExcludeList=self.ReadList(arg)
|
91 |
elif par=="TriggerToMonitorList":
|
92 |
tmp=self.ReadList(arg)
|
93 |
for line in tmp:
|
94 |
self.MonitorList.append(line)
|
95 |
#self.MonitorIntercept.append(float(line[1]))
|
96 |
#self.MonitorSlope.append(float(line[2]))
|
97 |
#self.MonitorQuad.append(float(line[3]))
|
98 |
elif par=="ForbiddenColumns":
|
99 |
tmp=arg.split(',')
|
100 |
for line in tmp:
|
101 |
try:
|
102 |
self.ForbiddenCols.append(int(line))
|
103 |
except:
|
104 |
print "Cannot parse Forbidden Cols parameter"
|
105 |
elif par =="AllTriggers":
|
106 |
self.AllTriggers=int(arg)
|
107 |
elif par=="LSSlidingWindow":
|
108 |
self.LSWindow=int(arg)
|
109 |
elif par=="CompareReference":
|
110 |
self.CompareReference=int(arg)
|
111 |
elif par=="ShifterMode":
|
112 |
self.ShifterMode=arg
|
113 |
elif par=="MaxExpressRate":
|
114 |
self.MaxExpressRate=float(arg)
|
115 |
elif par=="MaxStreamARate":
|
116 |
self.MaxStreamARate=float(arg)
|
117 |
elif par=="FitFileName":
|
118 |
self.FitFileName=arg
|
119 |
elif par=="NoVersion":
|
120 |
self.NoVersion=int(arg)
|
121 |
elif par=="CirculatingBeamsColumn":
|
122 |
self.CircBeamCol=int(arg)
|
123 |
elif par=="MaxLogMonRate":
|
124 |
self.MaxLogMonRate=float(arg)
|
125 |
elif par=="WarnOnSigmaDiff":
|
126 |
self.DefWarnOnSigmaDiff=float(arg)
|
127 |
elif par=="DoL1":
|
128 |
self.DoL1=int(arg)
|
129 |
elif par=="DefaultMaxBadRatesToShow":
|
130 |
self.DefaultMaxBadRatesToShow=int(arg)
|
131 |
elif par=="L1SeedChangeFit":
|
132 |
self.L1SeedChangeFit=int(arg)
|
133 |
elif par=="ShowAllBadRates":
|
134 |
self.ShowAllBadRates=int(arg)
|
135 |
else:
|
136 |
print "Invalid Option : "+strippedLine
|
137 |
|
138 |
f.close()
|
139 |
|
140 |
def AnalyzeTrigger(self,TrigName): ## Have to pass this a version number stripped Trigger
|
141 |
if TrigName in self.ExcludeList:
|
142 |
return False
|
143 |
if self.MonitorOnly and not TrigName in self.MonitorList:
|
144 |
return False
|
145 |
return True
|
146 |
|
147 |
def GetExpectedRate(self,TrigName,Input,InputPS,live,delivered,deadtime,L1SeedChangeFit,HeadLumiRange,PSColumnByLS):
|
148 |
#replaced live/delivered with deadtimebeamactive
|
149 |
if self.NoVersion:
|
150 |
TrigName=StripVersion(TrigName)
|
151 |
if TrigName not in Input.keys():
|
152 |
return [0.0,0.0,"No prediction (fit missing)"]
|
153 |
|
154 |
if not L1SeedChangeFit:
|
155 |
try:
|
156 |
sigma = Input[TrigName][5]
|
157 |
except:
|
158 |
if Input[TrigName][0] == "fit failed":
|
159 |
return [0.0,0.0,"No prediction (fit missing)"]
|
160 |
else:
|
161 |
return [0.0,0.0,"Exception error"]
|
162 |
|
163 |
try:
|
164 |
if Input[TrigName][0] == "line" or Input[TrigName][0] == "quad" or Input[TrigName][0] == "cube":
|
165 |
return [(1-deadtime)*(Input[TrigName][1]+Input[TrigName][2]*delivered+Input[TrigName][3]*delivered*delivered+Input[TrigName][4]*delivered*delivered*delivered), sigma,""]
|
166 |
elif Input[TrigName][0] == "expo":
|
167 |
return [(1-deadtime)*(Input[TrigName][1]+Input[TrigName][2]*math.exp(Input[TrigName][3]+Input[TrigName][4]*delivered)), sigma,""]
|
168 |
except:
|
169 |
return [0.0,0.0,"Exception error"]
|
170 |
|
171 |
###L1SeedChangeFit
|
172 |
else:
|
173 |
firstLS=min(HeadLumiRange)
|
174 |
psi=PSColumnByLS[firstLS]
|
175 |
|
176 |
try:
|
177 |
sigma = InputPS[psi][TrigName][5]
|
178 |
except:
|
179 |
#print psi, TrigName
|
180 |
|
181 |
#if InputPS[psi][TrigName][0] == "fit failed":
|
182 |
# return [0.0,0.0,"No prediction (fit missing)"]
|
183 |
#else:
|
184 |
return [0.0,0.0,"Exception error"]
|
185 |
|
186 |
try:
|
187 |
if InputPS[psi][TrigName][0] == "line" or InputPS[psi][TrigName][0] == "quad" or InputPS[psi][TrigName][0] == "cube":
|
188 |
return [(1-deadtime)*(InputPS[psi][TrigName][1]+InputPS[psi][TrigName][2]*delivered+InputPS[psi][TrigName][3]*delivered*delivered+InputPS[psi][TrigName][4]*delivered*delivered*delivered), sigma,""]
|
189 |
elif InputPS[psi][TrigName][0] == "expo":
|
190 |
return [(1-deadtime)*(InputPS[psi][TrigName][1]+InputPS[psi][TrigName][2]*math.exp(InputPS[psi][TrigName][3]+InputPS[psi][TrigName][4]*delivered)), sigma,""]
|
191 |
except:
|
192 |
return [0.0,0.0,"Exception error"]
|
193 |
|
194 |
return -1
|
195 |
|
196 |
|
197 |
## def GetExpectedL1Rates(self,lumi):
|
198 |
## if not lumi:
|
199 |
## return {}
|
200 |
## expectedRates = {}
|
201 |
## for col,inter,slope,quad in self.L1Predictions:
|
202 |
## try:
|
203 |
## expectedRates[int(col)] = lumi*(float(inter)+float(slope)*lumi+float(quad)*lumi*lumi)
|
204 |
## except:
|
205 |
## return {}
|
206 |
## return expectedRates
|
207 |
|
208 |
|