Back to home page

Project CMSSW displayed by LXR

 
 

    


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