00001
00002
00003 import sys, imp, re, itertools
00004 from HLTrigger.Configuration.Tools.frozendict import frozendict
00005 import FWCore.ParameterSet.Config as cms
00006
00007 debug = False
00008
00009 whitelist_types = [
00010 'HLTPrescaler',
00011 'HLTBool',
00012 ]
00013
00014 whitelist_labels = [
00015 'hltPreExpressSmart',
00016 'hltPreEventDisplaySmart',
00017 ]
00018
00019 def whitelist(module):
00020 return module.label in whitelist_labels or module.type in whitelist_types
00021
00022
00023 def freeze(arg):
00024 if type(arg) == dict:
00025 return frozendict((k, freeze(v)) for (k, v) in arg.iteritems())
00026 elif '__iter__' in dir(arg):
00027 return tuple( freeze(v) for v in arg )
00028 else:
00029 return arg
00030
00031 def unfreeze(arg):
00032 if type(arg) == frozendict:
00033 return dict((k, unfreeze(v)) for (k, v) in arg.iteritems())
00034 elif '__iter__' in dir(arg):
00035 return list( unfreeze(v) for v in arg )
00036 else:
00037 return arg
00038
00039 def pythonize(arg):
00040 if 'parameters_' in dir(arg):
00041 arg = arg.parameters_()
00042
00043 if 'value' in dir(arg):
00044 arg = arg.value()
00045
00046 if type(arg) == dict:
00047 return frozendict((k, pythonize(v)) for (k, v) in arg.iteritems())
00048 elif '__iter__' in dir(arg):
00049 return tuple( pythonize(v) for v in arg )
00050 else:
00051 return arg
00052
00053
00054 class Module(object):
00055 type = ''
00056 label = ''
00057 params = frozendict()
00058 hash = 0
00059
00060 def __init__(self, module):
00061 self.label = module.label_()
00062 self.type = module.type_()
00063 self.params = pythonize(module.parameters_())
00064 self.__rehash()
00065
00066
00067 def key(self):
00068 return self.hash
00069
00070 def __rehash(self):
00071 self.hash = (hash(self.type) << 4) + hash(self.params)
00072
00073 def __check(self, value, group):
00074 return type(value) is str and bool(group.match(value))
00075
00076 def __sub(self, value, group, label):
00077 if type(value) is str:
00078 return group.sub(r'%s\2' % label, value)
00079 else:
00080 return value
00081
00082 def apply_rename(self, groups):
00083 modified = False
00084 newparams = unfreeze(self.params)
00085 for label, (group, check) in groups.iteritems():
00086 for k, p in newparams.iteritems():
00087 if '__iter__' in dir(p):
00088 if any(self.__check(v, check) for v in p):
00089 newparams[k] = tuple(self.__sub(v, check, label) for v in p)
00090 modified = True
00091 else:
00092 if self.__check(p, check):
00093 newparams[k] = self.__sub(p, check, label)
00094 modified = True
00095
00096 if modified:
00097 self.params = frozendict(newparams)
00098 self.__rehash()
00099
00100
00101
00102
00103 class ModuleList(object):
00104 modules = []
00105
00106 def append(self, module):
00107 m = Module(module)
00108 if not whitelist(m):
00109 self.modules.append(m)
00110
00111 def extend(self, modules):
00112 for module in modules:
00113 self.append(module)
00114
00115 def __init__(self, *args):
00116 for arg in args:
00117 if '__iter__' in dir(arg):
00118 self.extend(arg)
00119 else:
00120 self.append(arg)
00121
00122 def sort(self):
00123 self.modules.sort(key = Module.key)
00124
00125 def group(self):
00126 groups = dict()
00127 self.sort()
00128 i = 0
00129 for v, g in itertools.groupby(self.modules, Module.key):
00130 group = list(g)
00131 if len(group) > 1:
00132 i = i + 1
00133 g = [ m.label for m in group ]
00134 g.sort()
00135 l = 'hltGroup%d' %i
00136 r = re.compile(r'^(%s)($|:)' % r'|'.join(g))
00137 groups[l] = (g, r)
00138 return groups
00139
00140 def apply_rename(self, groups):
00141 for module in self.modules:
00142 module.apply_rename(groups)
00143
00144 def dump(self):
00145 for m in self.modules:
00146 print "%s = (%s) {" % (m.label, m.type)
00147 for k, v in m.params.iteritems():
00148 print "\t%s = %s" % (k, v)
00149 print '}'
00150 print
00151
00152
00153
00154 def findDuplicates(process):
00155 modules = ModuleList(
00156 process._Process__analyzers.itervalues(),
00157 process._Process__producers.itervalues(),
00158 process._Process__filters.itervalues()
00159 )
00160
00161 oldups = 0
00162 groups = modules.group()
00163 dups = sum(len(g[0]) for g in groups.itervalues()) - len(groups)
00164
00165 index = 1
00166 while(dups != oldups):
00167 if debug:
00168 dump = open('step%d.sed' % index, 'w')
00169 for target, (group, regexp) in groups.iteritems():
00170 dump.write('s#\\<\\(%s\\)\\>#%s#\n' % ('\\|'.join(group), target))
00171 dump.close()
00172 print "found %d duplicates" % dups
00173 oldups = dups
00174 modules.apply_rename(groups)
00175 groups = modules.group()
00176 dups = sum(len(g[0]) for g in groups.itervalues()) - len(groups)
00177 index = index + 1
00178
00179 dump = open('groups.sed', 'w')
00180 for target, (group, regexp) in groups.iteritems():
00181 dump.write('s#\\<\\(%s\\)\\>#%s#\n' % ('\\|'.join(group), target))
00182 dump.close()
00183
00184 dump = open('groups.txt', 'w')
00185 for target, (group, regexp) in groups.iteritems():
00186 dump.write('#%s\n%s\n\n' % ( target, '\n'.join(group)))
00187 dump.close()
00188
00189
00190
00191 def main():
00192
00193 hlt = imp.new_module('hlt')
00194 try:
00195 configname = sys.argv[1]
00196 except:
00197 config = sys.stdin
00198 else:
00199 config = open(configname)
00200 exec config in globals(), hlt.__dict__
00201 config.close()
00202 findDuplicates(hlt.process)
00203
00204
00205 if __name__ == "__main__":
00206 main()
00207