ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/RateMonShiftTool_dev/MenuAnalyzer.py
Revision: 1.8
Committed: Sat Sep 29 20:18:50 2012 UTC (12 years, 7 months ago) by amott
Content type: text/x-python
Branch: MAIN
Changes since 1.7: +41 -4 lines
Log Message:
added DQM and stream B monitoring

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     if not trig in self.perPDPathList["OnlineMonitor"]: self.Results['checkDQMStream'].append("NotInDQM::%s"%trig)
209     for trig in self.ParkingTriggers:
210     if trig in self.perPDPathList["OnlineMonitor"]: self.Results['checkDQMStream'].append("ParkingTriggerInDQM::%s"%trig)
211    
212     def checkStreamB(self):
213     self.Results['checkStreamB']=[]
214     for trig in self.ParkingTriggers:
215     if not trig in self.perPDPathList["ParkingMonitor"]: self.Results['checkStreamB'].append("ParkingTriggerNotInStreamB::%s" %trig)
216    
217 amott 1.1 def GetModules(self,cursor):
218     sqlquery ="""
219     SELECT I.NAME,E.NAME,D.NAME,I.ISENDPATH
220     FROM
221     CMS_HLT.PARAMETERS B,
222     CMS_HLT.SUPERIDPARAMETERASSOC C,
223     CMS_HLT.MODULETEMPLATES D,
224     CMS_HLT.MODULES E,
225     CMS_HLT.PATHMODULEASSOC F,
226     CMS_HLT.CONFIGURATIONPATHASSOC G,
227     CMS_HLT.CONFIGURATIONS H,
228     CMS_HLT.PATHS I
229     WHERE
230     B.PARAMID = C.PARAMID AND
231     C.SUPERID = F.MODULEID AND
232     E.TEMPLATEID = D.SUPERID AND
233     F.MODULEID = E.SUPERID AND
234     F.PATHID=G.PATHID AND
235     I.PATHID=G.PATHID AND
236     G.CONFIGID=H.CONFIGID AND
237     H.CONFIGDESCRIPTOR='%s'
238     """ % (self.menuName,)
239    
240     cursor.execute(sqlquery)
241     for PathName,ModuleName,ModuleType,endPath in cursor.fetchall():
242     if not self.perPathModuleList.has_key(PathName): self.perPathModuleList[PathName] = []
243     self.perPathModuleList[PathName].append(ModuleName)
244     self.perModuleTypeList[ModuleName] = ModuleType
245 amott 1.6 if not ModuleName in self.ModuleList: self.ModuleList.append(ModuleName)
246 amott 1.1 if endPath: self.endPathList.add(PathName)
247    
248    
249     def GetStreamsPathsPDs(self,cursor):
250     sqlquery= """
251     SELECT A.STREAMLABEL,E.NAME,F.DATASETLABEL
252     FROM
253     CMS_HLT.STREAMS A,
254     CMS_HLT.CONFIGURATIONS B,
255     CMS_HLT.CONFIGURATIONPATHASSOC C,
256     CMS_HLT.PATHSTREAMDATASETASSOC D,
257     CMS_HLT.PATHS E,
258     CMS_HLT.PRIMARYDATASETS F
259     WHERE
260     B.CONFIGDESCRIPTOR='%s' AND
261     C.CONFIGID=B.CONFIGID AND
262     D.PATHID=C.PATHID AND
263     A.STREAMID=D.STREAMID AND
264     E.PATHID = C.PATHID AND
265     F.DATASETID = D.DATASETID
266     """ % (self.menuName,)
267    
268     cursor.execute(sqlquery)
269     for StreamName,PathName,PDName in cursor.fetchall():
270     if not self.perStreamPDList.has_key(StreamName): self.perStreamPDList[StreamName] = []
271     if not PDName in self.perStreamPDList[StreamName]: self.perStreamPDList[StreamName].append(PDName)
272     if not self.perPDPathList.has_key(PDName): self.perPDPathList[PDName] = []
273     self.perPDPathList[PDName].append(PathName)
274    
275 amott 1.6 def GetESModules(self,cursor):
276     sqlquery = """
277     SELECT UNIQUE(F.NAME)
278     FROM
279     CMS_HLT.ESMODULES F,
280     CMS_HLT.CONFIGURATIONESMODULEASSOC G,
281     CMS_HLT.CONFIGURATIONS H
282     WHERE
283     G.ESMODULEID = F.SUPERID AND
284     G.CONFIGID=H.CONFIGID AND
285     H.CONFIGDESCRIPTOR='%s'
286     """ % (self.menuName,)
287    
288     cursor.execute(sqlquery)
289     for ModuleName, in cursor.fetchall():
290     if not ModuleName in self.ESModuleList: self.ESModuleList.append(ModuleName)
291    
292 amott 1.4 def GetEventContent(self,cursor):
293 amott 1.5 sqlquery = """
294     SELECT A.STREAMLABEL,H.STATEMENTTYPE,H.CLASSN,H.MODULEL,H.EXTRAN,H.PROCESSN
295 amott 1.4 FROM
296     CMS_HLT.STREAMS A,
297     CMS_HLT.CONFIGURATIONS B,
298 amott 1.5 CMS_HLT.CONFIGURATIONPATHASSOC C,
299     CMS_HLT.PATHSTREAMDATASETASSOC D,
300     CMS_HLT.PATHS E,
301     CMS_HLT.ECSTREAMASSOC F,
302     CMS_HLT.ECSTATEMENTASSOC G,
303     CMS_HLT.EVENTCONTENTSTATEMENTS H
304 amott 1.4 WHERE
305     B.CONFIGDESCRIPTOR='%s' AND
306     C.CONFIGID=B.CONFIGID AND
307     D.PATHID=C.PATHID AND
308     A.STREAMID=D.STREAMID AND
309     E.PATHID = C.PATHID AND
310 amott 1.5 F.STREAMID = D.STREAMID AND
311     G.EVENTCONTENTID=F.EVENTCONTENTID AND
312     H.STATEMENTID=G.STATEMENTID
313 amott 1.4 """ % (self.menuName,)
314 amott 1.5
315     cursor.execute(sqlquery)
316     for stream,keep,Class,module,extra,process in cursor.fetchall():
317     if not self.eventContent.has_key(stream): self.eventContent[stream]=[]
318     statement = "%s_%s_%s_%s" % (Class,module,extra,process,)
319     if statement == "*_*_*_*": statement = "*"
320     if keep == 1: statement = "keep "+statement
321     else: statement = "drop "+statement
322     if not statement in self.eventContent[stream]:
323     self.eventContent[stream].append( statement )