ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/RateMonShiftTool_dev/MenuAnalyzer.py
Revision: 1.1
Committed: Thu Jul 12 16:04:24 2012 UTC (12 years, 9 months ago) by amott
Content type: text/x-python
Branch: MAIN
Log Message:
initial versions of tools to check menu consistencies

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    
9     try: ## set is builtin in python 2.6.4 and sets is deprecated
10     set
11     except NameError:
12     from sets import Set
13    
14     class MenuAnalyzer:
15     def __init__(self,name):
16     ##default ranges
17     self.maxModuleNameLength = 300
18     self.maxModulesPerPath = 50
19     self.maxPaths = 500
20     self.maxEndPaths = 30
21    
22     ##required streams
23     self.requiredStreamsAndPDs = { 'Calibration' : ['TestEnablesEcalHcalDT'],'EcalCalibration' : ['EcalLaser'],
24     'TrackerCalibration' : ['TestEnablesTracker']}
25     self.ExpressStreamName = 'Express'
26     self.expressPDs = { 'ExpressPhysics' : 'Collisions',
27     'ExpressCosmics' : 'Cosmics' }
28    
29     self.expressType = ''
30    
31     self.menuName = name
32     self.endPathList = set()
33     self.perPathModuleList={}
34     self.perModuleTypeList={}
35     self.perStreamPDList={}
36     self.perPDPathList={}
37     self.Results={}
38     self.ModuleList=[]
39     self.AnalysisList=[]
40    
41    
42     ## statically define the analysis map: new analyses must be registered here
43     self.AnalysisMap = {
44     'moduleLength' : self.checkModuleLength,
45     'numberOfPaths' : self.checkNumPaths,
46     'numberOfEndPaths' : self.checkNumEndPaths,
47     'reqStreamsAndPDs' : self.reqStreamsAndPDs,
48     'checkExpress' : self.checkExpress,
49     'checkNameFormats' :self.checkNameFormats
50     }
51    
52     self.T0REGEXP = { ## These are the regexps that T0 uses to access things
53     # Regexp for save file name paths. We don't process anything else.
54     'RXSAFEPATH' : re.compile("^[-A-Za-z0-9_]+$"),
55     # Regexp for valid dataset names.
56     'RXDATASET' : re.compile("^[-A-Za-z0-9_]+$"),
57     # Regexp for valid RelVal dataset names.
58     'RXRELVALMC' : re.compile("^/RelVal[^/]+/(CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)[-_].*$"),
59     'RXRELVALDATA' : re.compile("^/[^/]+/(CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)[-_].*$"),
60     # Regexp for online DQM files.
61     'RXONLINE' : re.compile("^(?:.*/)?DQM_V(\d+)(_[A-Za-z0-9]+)?_R(\d+)\.root$"),
62     # Regexp for offline DQM files.
63     'RXOFFLINE' : re.compile("^(?:.*/)?DQM_V(\d+)_R(\d+)((?:__[-A-Za-z0-9_]+){3})\.root$"),
64     # Regexp for acquisition era part of the processed dataset name.
65     'RXERA' : re.compile("^([A-Za-z]+\d+|CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)")
66     }
67    
68     def AddAnalysis(self,name):
69     self.AnalysisList.append(name)
70    
71     def AddAllAnalyses(self):
72     for name in self.AnalysisMap.iterkeys():
73     self.AddAnalysis(name)
74    
75     def Analyze(self):
76     cursor = ConnectDB('hlt')
77     self.GetModules(cursor)
78     self.GetStreamsPathsPDs(cursor)
79     for analysis in self.AnalysisList:
80     if not self.AnalysisMap.has_key(analysis):
81     print "ERROR: Analysis %s not defined" % (analysis,)
82     continue
83     self.AnalysisMap[analysis]()
84    
85    
86    
87     def checkModuleLength(self):
88     self.Results['moduleLength'] = []
89     for modName,type in self.perModuleTypeList.iteritems():
90     if len(modName) > self.maxModuleNameLength: self.Results['moduleLength'].append(modName)
91    
92     def checkNumPaths(self):
93     if len(self.perPathModuleList) > self.maxPaths:
94     self.Results['numberOfPaths'] = len(self.perPathModuleList)
95     else:
96     self.Results['numberOfPaths'] = 0
97     def checkNumEndPaths(self):
98     if len(self.endPathList) > self.maxEndPaths:
99     self.Results['numberOfEndPaths'] = len(self.endPathList)
100     else:
101     self.Results['numberOfEndPaths'] = 0
102     def reqStreamsAndPDs(self):
103     self.Results['reqStreamsAndPDs'] = []
104     for stream,PDList in self.requiredStreamsAndPDs.iteritems():
105     if not self.perStreamPDList.has_key(stream): self.Results['reqStreamsAndPDs'].append(stream)
106     for PD in PDList:
107     if not PD in self.requiredStreamsAndPDs[stream]: self.Results['reqStreamsAndPDs'].append(stream+'::'+PD)
108    
109     def checkExpress(self):
110     self.Results['checkExpress'] = []
111     if not self.perStreamPDList.has_key(self.ExpressStreamName):
112     self.Results['checkExpress'].append(self.ExpressStreamName)
113     return
114    
115     if len(self.perStreamPDList[self.ExpressStreamName]) >1:
116     self.Results['checkExpress'].append("MULTIPLE_PDS")
117     if len(self.perStreamPDList[self.ExpressStreamName]) <1:
118     self.Results['checkExpress'].append("NO_PDS")
119    
120     for PD in self.perStreamPDList[self.ExpressStreamName]:
121     if not self.expressPDs.has_key(PD):
122     self.Results['checkExpress'].append(self.ExpressStreamName+"::"+PD)
123     else:
124     self.expressType = self.expressPDs[PD]
125    
126    
127    
128     def checkNameFormats(self):
129     self.Results['checkNameFormats']=[]
130     for PD in self.perPDPathList.iterkeys():
131     if not self.T0REGEXP['RXDATASET'].match(PD):
132     self.Results['checkNameFormats'].append(PD)
133     for path in self.perPathModuleList.iterkeys():
134     if not self.T0REGEXP['RXSAFEPATH'].match(path):
135     self.Results['checkNameFormats'].append(path)
136    
137     def GetModules(self,cursor):
138     sqlquery ="""
139     SELECT I.NAME,E.NAME,D.NAME,I.ISENDPATH
140     FROM
141     CMS_HLT.PARAMETERS B,
142     CMS_HLT.SUPERIDPARAMETERASSOC C,
143     CMS_HLT.MODULETEMPLATES D,
144     CMS_HLT.MODULES E,
145     CMS_HLT.PATHMODULEASSOC F,
146     CMS_HLT.CONFIGURATIONPATHASSOC G,
147     CMS_HLT.CONFIGURATIONS H,
148     CMS_HLT.PATHS I
149     WHERE
150     B.PARAMID = C.PARAMID AND
151     C.SUPERID = F.MODULEID AND
152     E.TEMPLATEID = D.SUPERID AND
153     F.MODULEID = E.SUPERID AND
154     F.PATHID=G.PATHID AND
155     I.PATHID=G.PATHID AND
156     G.CONFIGID=H.CONFIGID AND
157     H.CONFIGDESCRIPTOR='%s'
158     """ % (self.menuName,)
159    
160     cursor.execute(sqlquery)
161     for PathName,ModuleName,ModuleType,endPath in cursor.fetchall():
162     if not self.perPathModuleList.has_key(PathName): self.perPathModuleList[PathName] = []
163     self.perPathModuleList[PathName].append(ModuleName)
164     self.perModuleTypeList[ModuleName] = ModuleType
165     if endPath: self.endPathList.add(PathName)
166    
167    
168     def GetStreamsPathsPDs(self,cursor):
169     sqlquery= """
170     SELECT A.STREAMLABEL,E.NAME,F.DATASETLABEL
171     FROM
172     CMS_HLT.STREAMS A,
173     CMS_HLT.CONFIGURATIONS B,
174     CMS_HLT.CONFIGURATIONPATHASSOC C,
175     CMS_HLT.PATHSTREAMDATASETASSOC D,
176     CMS_HLT.PATHS E,
177     CMS_HLT.PRIMARYDATASETS F
178     WHERE
179     B.CONFIGDESCRIPTOR='%s' AND
180     C.CONFIGID=B.CONFIGID AND
181     D.PATHID=C.PATHID AND
182     A.STREAMID=D.STREAMID AND
183     E.PATHID = C.PATHID AND
184     F.DATASETID = D.DATASETID
185     """ % (self.menuName,)
186    
187     cursor.execute(sqlquery)
188     for StreamName,PathName,PDName in cursor.fetchall():
189     if not self.perStreamPDList.has_key(StreamName): self.perStreamPDList[StreamName] = []
190     if not PDName in self.perStreamPDList[StreamName]: self.perStreamPDList[StreamName].append(PDName)
191     if not self.perPDPathList.has_key(PDName): self.perPDPathList[PDName] = []
192     self.perPDPathList[PDName].append(PathName)
193