CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/src/HLTrigger/Configuration/scripts/hltFindDuplicates.py

Go to the documentation of this file.
00001 #! /usr/bin/env python
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   # parse the HLT configuration from standard input or from the given file
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