ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/RateMonShiftTool_dev/MenuAnalyzer.py
Revision: 1.9
Committed: Sat Sep 29 20:25:59 2012 UTC (12 years, 7 months ago) by amott
Content type: text/x-python
Branch: MAIN
Changes since 1.8: +1 -0 lines
Log Message:
Added LogMonitor veto to DQM checker

File Contents

# User Rev Content
1 amott 1.1 #!/usr/bin/env python
2    
3     import os
4     import sys
5     from DatabaseParser import ConnectDB
6     import re
7     import cx_Oracle
8 amott 1.5 import eventContent
9 amott 1.1
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     class MenuAnalyzer:
16     def __init__(self,name):
17     ##default ranges
18     self.maxModuleNameLength = 300
19     self.maxModulesPerPath = 50
20     self.maxPaths = 500
21     self.maxEndPaths = 30
22    
23     ##required streams
24     self.requiredStreamsAndPDs = { 'Calibration' : ['TestEnablesEcalHcalDT'],'EcalCalibration' : ['EcalLaser'],
25 amott 1.3 'TrackerCalibration' : ['TestEnablesTracker'], 'DQM' : 'OnlineMonitor'}
26 amott 1.1 self.ExpressStreamName = 'Express'
27     self.expressPDs = { 'ExpressPhysics' : 'Collisions',
28     'ExpressCosmics' : 'Cosmics' }
29    
30     self.expressType = ''
31    
32     self.menuName = name
33     self.endPathList = set()
34     self.perPathModuleList={}
35     self.perModuleTypeList={}
36     self.perStreamPDList={}
37     self.perPDPathList={}
38     self.Results={}
39     self.ModuleList=[]
40 amott 1.6 self.ESModuleList=[]
41 amott 1.5 self.eventContent={}
42 amott 1.8 self.ParkingTriggers=[]
43     self.NotParkingTriggers=[]
44 amott 1.5
45 amott 1.1 self.AnalysisList=[]
46    
47    
48     ## statically define the analysis map: new analyses must be registered here
49     self.AnalysisMap = {
50     'moduleLength' : self.checkModuleLength,
51     'numberOfPaths' : self.checkNumPaths,
52     'numberOfEndPaths' : self.checkNumEndPaths,
53     'reqStreamsAndPDs' : self.reqStreamsAndPDs,
54     'checkExpress' : self.checkExpress,
55 amott 1.5 'checkNameFormats' :self.checkNameFormats,
56 amott 1.6 'checkEventContent':self.checkEventContent,
57 amott 1.8 'checkL1Unmask':self.checkL1Unmask,
58     'checkDQMStream':self.checkDQMStream,
59     'checkStreamB':self.checkStreamB
60 amott 1.1 }
61 amott 1.2 self.ProblemDescriptions = {
62     'moduleLength':'Modules too long',
63     'numberOfPaths':'Too many paths',
64     'numberOfEndPaths':'Too many endpaths',
65     'reqStreamsAndPDs':'Missing required stream/PD',
66     'checkExpress' : 'Invalid or missing express stream/PD',
67 amott 1.5 'checkNameFormats' : 'Invalid PD or path name format',
68 amott 1.6 'checkEventContent' : 'Invalid Event Content',
69 amott 1.8 'checkL1Unmask' : 'L1 Unmask Module in Menu',
70     'checkDQMStream' : 'Check that the DQM stream contains correct trigger',
71     'checkStreamB' : 'Check all parking triggers in stream B'
72 amott 1.2 }
73 amott 1.1
74     self.T0REGEXP = { ## These are the regexps that T0 uses to access things
75     # Regexp for save file name paths. We don't process anything else.
76     'RXSAFEPATH' : re.compile("^[-A-Za-z0-9_]+$"),
77     # Regexp for valid dataset names.
78     'RXDATASET' : re.compile("^[-A-Za-z0-9_]+$"),
79     # Regexp for valid RelVal dataset names.
80     'RXRELVALMC' : re.compile("^/RelVal[^/]+/(CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)[-_].*$"),
81     'RXRELVALDATA' : re.compile("^/[^/]+/(CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)[-_].*$"),
82     # Regexp for online DQM files.
83     'RXONLINE' : re.compile("^(?:.*/)?DQM_V(\d+)(_[A-Za-z0-9]+)?_R(\d+)\.root$"),
84     # Regexp for offline DQM files.
85     'RXOFFLINE' : re.compile("^(?:.*/)?DQM_V(\d+)_R(\d+)((?:__[-A-Za-z0-9_]+){3})\.root$"),
86     # Regexp for acquisition era part of the processed dataset name.
87     'RXERA' : re.compile("^([A-Za-z]+\d+|CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)")
88     }
89    
90     def AddAnalysis(self,name):
91     self.AnalysisList.append(name)
92    
93     def AddAllAnalyses(self):
94     for name in self.AnalysisMap.iterkeys():
95     self.AddAnalysis(name)
96    
97     def Analyze(self):
98     cursor = ConnectDB('hlt')
99     self.GetModules(cursor)
100 amott 1.6 self.GetESModules(cursor)
101 amott 1.1 self.GetStreamsPathsPDs(cursor)
102 amott 1.5 self.GetEventContent(cursor)
103 amott 1.8 self.findParkingTriggers()
104 amott 1.1 for analysis in self.AnalysisList:
105     if not self.AnalysisMap.has_key(analysis):
106     print "ERROR: Analysis %s not defined" % (analysis,)
107     continue
108     self.AnalysisMap[analysis]()
109    
110    
111     def checkModuleLength(self):
112     self.Results['moduleLength'] = []
113     for modName,type in self.perModuleTypeList.iteritems():
114     if len(modName) > self.maxModuleNameLength: self.Results['moduleLength'].append(modName)
115    
116     def checkNumPaths(self):
117     if len(self.perPathModuleList) > self.maxPaths:
118     self.Results['numberOfPaths'] = len(self.perPathModuleList)
119     else:
120     self.Results['numberOfPaths'] = 0
121     def checkNumEndPaths(self):
122     if len(self.endPathList) > self.maxEndPaths:
123     self.Results['numberOfEndPaths'] = len(self.endPathList)
124     else:
125     self.Results['numberOfEndPaths'] = 0
126     def reqStreamsAndPDs(self):
127     self.Results['reqStreamsAndPDs'] = []
128     for stream,PDList in self.requiredStreamsAndPDs.iteritems():
129     if not self.perStreamPDList.has_key(stream): self.Results['reqStreamsAndPDs'].append(stream)
130     for PD in PDList:
131     if not PD in self.requiredStreamsAndPDs[stream]: self.Results['reqStreamsAndPDs'].append(stream+'::'+PD)
132    
133     def checkExpress(self):
134     self.Results['checkExpress'] = []
135     if not self.perStreamPDList.has_key(self.ExpressStreamName):
136     self.Results['checkExpress'].append(self.ExpressStreamName)
137     return
138    
139     if len(self.perStreamPDList[self.ExpressStreamName]) >1:
140     self.Results['checkExpress'].append("MULTIPLE_PDS")
141     if len(self.perStreamPDList[self.ExpressStreamName]) <1:
142     self.Results['checkExpress'].append("NO_PDS")
143    
144     for PD in self.perStreamPDList[self.ExpressStreamName]:
145     if not self.expressPDs.has_key(PD):
146     self.Results['checkExpress'].append(self.ExpressStreamName+"::"+PD)
147     else:
148     self.expressType = self.expressPDs[PD]
149    
150    
151    
152     def checkNameFormats(self):
153     self.Results['checkNameFormats']=[]
154     for PD in self.perPDPathList.iterkeys():
155     if not self.T0REGEXP['RXDATASET'].match(PD):
156 amott 1.7 for k,v in self.perStreamPDList.iteritems():
157     if PD in v:
158     self.Results['checkNameFormats'].append(k+"::"+PD)
159     break
160    
161     self.Results['checkNameFormats'].append('NO STREAM::'+PD)
162 amott 1.1 for path in self.perPathModuleList.iterkeys():
163     if not self.T0REGEXP['RXSAFEPATH'].match(path):
164     self.Results['checkNameFormats'].append(path)
165 amott 1.5
166     def checkEventContent(self):
167     self.Results['checkEventContent']=[]
168     for stream,content in self.eventContent.iteritems():
169     #first check for a drop statement
170     if not ('drop *' in content or 'drop *_hlt*_*_*' in content):
171     self.Results['checkEventContent'].append(stream+'::drop *')
172     if not eventContent.requiredEventContent.has_key(stream): continue
173     requiredContent = eventContent.requiredEventContent[stream]
174     for entry in requiredContent:
175     if not entry in content:
176     self.Results['checkEventContent'].append(stream+'::'+entry)
177 amott 1.6
178     def checkL1Unmask(self):
179     self.Results['checkL1Unmask']=[]
180     if 'L1GtTriggerMaskAlgoTrigTrivialProducer' in self.ESModuleList:
181     self.Results['checkL1Unmask'].append('L1GtTriggerMaskAlgoTrigTrivialProducer')
182     if 'L1GtTriggerMaskTechTrigTrivialProducer' in self.ESModuleList:
183     self.Results['checkL1Unmask'].append('L1GtTriggerMaskTechTrigTrivialProducer')
184    
185 amott 1.8
186     def findParkingPDs(self):
187     ParkingPDs=[]
188     NotParkingPDs=[]
189     for PD in self.perStreamPDList["A"]: # look at PDs only in stream A
190     if PD.find("Parked")!=-1: #look for PDs with Parked in the name
191     ParkingPDs.append(PD)
192     else:
193     NotParkingPDs.append(PD)
194     return (ParkingPDs,NotParkingPDs)
195    
196     def findParkingTriggers(self):
197     ParkingPDs,NotParkingPDs = self.findParkingPDs()
198     for PD in NotParkingPDs:
199     for trig in self.perPDPathList[PD]: self.NotParkingTriggers.append(trig) # first append ALL triggers from the not in parking PDs
200     for PD in ParkingPDs:
201     for trig in self.perPDPathList[PD]:
202     if not trig in self.NotParkingTriggers: self.ParkingTriggers.append(trig) # get triggers that don't show up in the non-parking PDs
203    
204    
205     def checkDQMStream(self):
206     self.Results['checkDQMStream']=[]
207     for trig in self.NotParkingTriggers:
208 amott 1.9 if trig.find("LogMonitor")!=-1: continue
209 amott 1.8 if not trig in self.perPDPathList["OnlineMonitor"]: self.Results['checkDQMStream'].append("NotInDQM::%s"%trig)
210     for trig in self.ParkingTriggers:
211     if trig in self.perPDPathList["OnlineMonitor"]: self.Results['checkDQMStream'].append("ParkingTriggerInDQM::%s"%trig)
212    
213     def checkStreamB(self):
214     self.Results['checkStreamB']=[]
215     for trig in self.ParkingTriggers:
216     if not trig in self.perPDPathList["ParkingMonitor"]: self.Results['checkStreamB'].append("ParkingTriggerNotInStreamB::%s" %trig)
217    
218 amott 1.1 def GetModules(self,cursor):
219     sqlquery ="""
220     SELECT I.NAME,E.NAME,D.NAME,I.ISENDPATH
221     FROM
222     CMS_HLT.PARAMETERS B,
223     CMS_HLT.SUPERIDPARAMETERASSOC C,
224     CMS_HLT.MODULETEMPLATES D,
225     CMS_HLT.MODULES E,
226     CMS_HLT.PATHMODULEASSOC F,
227     CMS_HLT.CONFIGURATIONPATHASSOC G,
228     CMS_HLT.CONFIGURATIONS H,
229     CMS_HLT.PATHS I
230     WHERE
231     B.PARAMID = C.PARAMID AND
232     C.SUPERID = F.MODULEID AND
233     E.TEMPLATEID = D.SUPERID AND
234     F.MODULEID = E.SUPERID AND
235     F.PATHID=G.PATHID AND
236     I.PATHID=G.PATHID AND
237     G.CONFIGID=H.CONFIGID AND
238     H.CONFIGDESCRIPTOR='%s'
239     """ % (self.menuName,)
240    
241     cursor.execute(sqlquery)
242     for PathName,ModuleName,ModuleType,endPath in cursor.fetchall():
243     if not self.perPathModuleList.has_key(PathName): self.perPathModuleList[PathName] = []
244     self.perPathModuleList[PathName].append(ModuleName)
245     self.perModuleTypeList[ModuleName] = ModuleType
246 amott 1.6 if not ModuleName in self.ModuleList: self.ModuleList.append(ModuleName)
247 amott 1.1 if endPath: self.endPathList.add(PathName)
248    
249    
250     def GetStreamsPathsPDs(self,cursor):
251     sqlquery= """
252     SELECT A.STREAMLABEL,E.NAME,F.DATASETLABEL
253     FROM
254     CMS_HLT.STREAMS A,
255     CMS_HLT.CONFIGURATIONS B,
256     CMS_HLT.CONFIGURATIONPATHASSOC C,
257     CMS_HLT.PATHSTREAMDATASETASSOC D,
258     CMS_HLT.PATHS E,
259     CMS_HLT.PRIMARYDATASETS F
260     WHERE
261     B.CONFIGDESCRIPTOR='%s' AND
262     C.CONFIGID=B.CONFIGID AND
263     D.PATHID=C.PATHID AND
264     A.STREAMID=D.STREAMID AND
265     E.PATHID = C.PATHID AND
266     F.DATASETID = D.DATASETID
267     """ % (self.menuName,)
268    
269     cursor.execute(sqlquery)
270     for StreamName,PathName,PDName in cursor.fetchall():
271     if not self.perStreamPDList.has_key(StreamName): self.perStreamPDList[StreamName] = []
272     if not PDName in self.perStreamPDList[StreamName]: self.perStreamPDList[StreamName].append(PDName)
273     if not self.perPDPathList.has_key(PDName): self.perPDPathList[PDName] = []
274     self.perPDPathList[PDName].append(PathName)
275    
276 amott 1.6 def GetESModules(self,cursor):
277     sqlquery = """
278     SELECT UNIQUE(F.NAME)
279     FROM
280     CMS_HLT.ESMODULES F,
281     CMS_HLT.CONFIGURATIONESMODULEASSOC G,
282     CMS_HLT.CONFIGURATIONS H
283     WHERE
284     G.ESMODULEID = F.SUPERID AND
285     G.CONFIGID=H.CONFIGID AND
286     H.CONFIGDESCRIPTOR='%s'
287     """ % (self.menuName,)
288    
289     cursor.execute(sqlquery)
290     for ModuleName, in cursor.fetchall():
291     if not ModuleName in self.ESModuleList: self.ESModuleList.append(ModuleName)
292    
293 amott 1.4 def GetEventContent(self,cursor):
294 amott 1.5 sqlquery = """
295     SELECT A.STREAMLABEL,H.STATEMENTTYPE,H.CLASSN,H.MODULEL,H.EXTRAN,H.PROCESSN
296 amott 1.4 FROM
297     CMS_HLT.STREAMS A,
298     CMS_HLT.CONFIGURATIONS B,
299 amott 1.5 CMS_HLT.CONFIGURATIONPATHASSOC C,
300     CMS_HLT.PATHSTREAMDATASETASSOC D,
301     CMS_HLT.PATHS E,
302     CMS_HLT.ECSTREAMASSOC F,
303     CMS_HLT.ECSTATEMENTASSOC G,
304     CMS_HLT.EVENTCONTENTSTATEMENTS H
305 amott 1.4 WHERE
306     B.CONFIGDESCRIPTOR='%s' AND
307     C.CONFIGID=B.CONFIGID AND
308     D.PATHID=C.PATHID AND
309     A.STREAMID=D.STREAMID AND
310     E.PATHID = C.PATHID AND
311 amott 1.5 F.STREAMID = D.STREAMID AND
312     G.EVENTCONTENTID=F.EVENTCONTENTID AND
313     H.STATEMENTID=G.STATEMENTID
314 amott 1.4 """ % (self.menuName,)
315 amott 1.5
316     cursor.execute(sqlquery)
317     for stream,keep,Class,module,extra,process in cursor.fetchall():
318     if not self.eventContent.has_key(stream): self.eventContent[stream]=[]
319     statement = "%s_%s_%s_%s" % (Class,module,extra,process,)
320     if statement == "*_*_*_*": statement = "*"
321     if keep == 1: statement = "keep "+statement
322     else: statement = "drop "+statement
323     if not statement in self.eventContent[stream]:
324     self.eventContent[stream].append( statement )