Warning, /HLTrigger/Configuration/scripts/hltFindDuplicates is written in an unsupported language. File is not indexed.
0001 #! /usr/bin/env python3
0002
0003 from __future__ import print_function
0004 import sys, imp, re, itertools
0005 from HLTrigger.Configuration.Tools.frozendict import frozendict
0006 import FWCore.ParameterSet.Config as cms
0007
0008 debug = True
0009
0010 whitelist_types = [
0011 'HLTPrescaler',
0012 'HLTBool',
0013 ]
0014
0015 whitelist_labels = [
0016 'hltPreExpressSmart',
0017 'hltPreEventDisplaySmart',
0018 'hltPreHLTDQMOutputSmart',
0019 'hltPreHLTMONOutputSmart',
0020 ]
0021
0022 def whitelist(module):
0023 return module.label in whitelist_labels or module.type in whitelist_types
0024
0025
0026 def freeze(arg):
0027 if type(arg) == dict:
0028 return frozendict((k, freeze(v)) for (k, v) in arg.iteritems())
0029 elif '__iter__' in dir(arg):
0030 return tuple( freeze(v) for v in arg )
0031 else:
0032 return arg
0033
0034 def unfreeze(arg):
0035 if type(arg) == frozendict:
0036 return dict((k, unfreeze(v)) for (k, v) in arg.iteritems())
0037 elif '__iter__' in dir(arg):
0038 return list( unfreeze(v) for v in arg )
0039 else:
0040 return arg
0041
0042 def pythonize(arg):
0043 if 'parameters_' in dir(arg):
0044 arg = arg.parameters_()
0045
0046 if 'value' in dir(arg):
0047 arg = arg.value()
0048
0049 if type(arg) == dict:
0050 return frozendict((k, pythonize(v)) for (k, v) in arg.iteritems())
0051 elif '__iter__' in dir(arg):
0052 return tuple( pythonize(v) for v in arg )
0053 else:
0054 return arg
0055
0056
0057 class Module(object):
0058 type = ''
0059 label = ''
0060 params = frozendict()
0061 hash = 0
0062
0063 def __init__(self, module):
0064 self.label = module.label_()
0065 self.type = module.type_()
0066 self.params = pythonize(module.parameters_())
0067 self.__rehash()
0068
0069
0070 def key(self):
0071 return self.hash
0072
0073 def __rehash(self):
0074 self.hash = (hash(self.type) << 4) + hash(self.params)
0075
0076 def __check(self, value, group):
0077 return type(value) is str and bool(group.match(value))
0078
0079 def __sub(self, value, group, label):
0080 if type(value) is str:
0081 return group.sub(r'%s\2' % label, value)
0082 else:
0083 return value
0084
0085 def apply_rename(self, groups):
0086 modified = False
0087 newparams = unfreeze(self.params)
0088 for label, (group, check) in groups.iteritems():
0089 for k, p in newparams.iteritems():
0090 if '__iter__' in dir(p):
0091 if any(self.__check(v, check) for v in p):
0092 newparams[k] = tuple(self.__sub(v, check, label) for v in p)
0093 modified = True
0094 else:
0095 if self.__check(p, check):
0096 newparams[k] = self.__sub(p, check, label)
0097 modified = True
0098
0099 if modified:
0100 self.params = frozendict(newparams)
0101 self.__rehash()
0102
0103
0104
0105
0106 class ModuleList(object):
0107 modules = []
0108
0109 def append(self, module):
0110 m = Module(module)
0111 if not whitelist(m):
0112 self.modules.append(m)
0113
0114 def extend(self, modules):
0115 for module in modules:
0116 self.append(module)
0117
0118 def __init__(self, *args):
0119 for arg in args:
0120 if '__iter__' in dir(arg):
0121 self.extend(arg)
0122 else:
0123 self.append(arg)
0124
0125 def sort(self):
0126 self.modules.sort(key = Module.key)
0127
0128 def group(self):
0129 groups = dict()
0130 self.sort()
0131 i = 0
0132 for v, g in itertools.groupby(self.modules, Module.key):
0133 group = list(g)
0134 if len(group) > 1:
0135 i = i + 1
0136 g = [ m.label for m in group ]
0137 g.sort()
0138 l = 'hltGroup%d' %i
0139 r = re.compile(r'^(%s)($|:)' % r'|'.join(g))
0140 groups[l] = (g, r)
0141 return groups
0142
0143 def apply_rename(self, groups):
0144 for module in self.modules:
0145 module.apply_rename(groups)
0146
0147 def dump(self):
0148 for m in self.modules:
0149 print("%s = (%s) {" % (m.label, m.type))
0150 for k, v in m.params.iteritems():
0151 print("\t%s = %s" % (k, v))
0152 print('}')
0153 print()
0154
0155
0156
0157 def findDuplicates(process):
0158 modules = ModuleList(
0159 process._Process__analyzers.itervalues(),
0160 process._Process__producers.itervalues(),
0161 process._Process__filters.itervalues()
0162 )
0163
0164 oldups = 0
0165 groups = modules.group()
0166 dups = sum(len(g[0]) for g in groups.itervalues()) - len(groups)
0167
0168 index = 1
0169 while(dups != oldups):
0170 if debug:
0171 dump = open('step%d.sed' % index, 'w')
0172 for target, (group, regexp) in groups.iteritems():
0173 dump.write('s#\\<\\(%s\\)\\>#%s#g\n' % ('\\|'.join(group), target))
0174 dump.close()
0175 dump = open('step%d.txt' % index, 'w')
0176 for target, (group, regexp) in groups.iteritems():
0177 dump.write('#%s\n%s\n\n' % ( target, '\n'.join(group)))
0178 dump.close()
0179 print("found %3d duplicates in %3d groups" % (dups, len(groups)))
0180 oldups = dups
0181 modules.apply_rename(groups)
0182 groups = modules.group()
0183 dups = sum(len(g[0]) for g in groups.itervalues()) - len(groups)
0184 index = index + 1
0185
0186 dump = open('groups.sed', 'w')
0187 for target, (group, regexp) in groups.iteritems():
0188 dump.write('s#\\<\\(%s\\)\\>#%s#\n' % ('\\|'.join(group), target))
0189 dump.close()
0190
0191 dump = open('groups.txt', 'w')
0192 for target, (group, regexp) in groups.iteritems():
0193 dump.write('#%s\n%s\n\n' % ( target, '\n'.join(group)))
0194 dump.close()
0195
0196
0197
0198 def main():
0199 # parse the HLT configuration from standard input or from the given file
0200 hlt = imp.new_module('hlt')
0201 try:
0202 configname = sys.argv[1]
0203 except:
0204 config = sys.stdin
0205 else:
0206 config = open(configname)
0207 exec(config, globals(), hlt.__dict__)
0208 config.close()
0209 findDuplicates(hlt.process)
0210
0211
0212 if __name__ == "__main__":
0213 main()
0214