CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
earlyDeleteSettings_cff.py
Go to the documentation of this file.
1 # Abstract all early deletion settings here
2 
3 import collections
4 
5 import FWCore.ParameterSet.Config as cms
6 
7 from RecoTracker.Configuration.customiseEarlyDeleteForSeeding import customiseEarlyDeleteForSeeding
8 from CommonTools.ParticleFlow.Isolation.customiseEarlyDeleteForCandIsoDeposits import customiseEarlyDeleteForCandIsoDeposits
9 
10 def _hasInputTagModuleLabel(process, pset, psetModLabel, moduleLabels, result):
11  for name in pset.parameterNames_():
12  value = getattr(pset,name)
13  if isinstance(value, cms.PSet):
14  _hasInputTagModuleLabel(process, value, psetModLabel, moduleLabels, result)
15  elif isinstance(value, cms.VPSet):
16  for ps in value:
17  _hasInputTagModuleLabel(process, ps, psetModLabel, moduleLabels, result)
18  elif isinstance(value, cms.VInputTag):
19  for t in value:
20  t2 = t
21  if not isinstance(t, cms.InputTag):
22  t2 = cms.InputTag(t2)
23  for i,moduleLabel in enumerate(moduleLabels):
24  if result[i]: continue #no need
25  if t2.getModuleLabel() == moduleLabel:
26  result[i]=True
27  elif isinstance(value, cms.InputTag):
28  for i,moduleLabel in enumerate(moduleLabels):
29  if result[i]: continue #no need
30  if value.getModuleLabel() == moduleLabel:
31  result[i]=True
32  elif isinstance(value, cms.string) and name == "refToPSet_":
33  try:
34  ps = getattr(process, value.value())
35  except AttributeError:
36  raise RuntimeError("Module %s has a 'PSet(refToPSet_ = cms.string(\"%s\"))', but the referenced-to PSet does not exist in the Process." % (psetModLabel, value.value()))
37  _hasInputTagModuleLabel(process, ps, psetModLabel, moduleLabels, result)
38 
39 
40 def customiseEarlyDelete(process):
41  # Mapping label -> [branches]
42  # for the producers whose products are to be deleted early
43  products = collections.defaultdict(list)
44 
45  products = customiseEarlyDeleteForSeeding(process, products)
46 
47  products = customiseEarlyDeleteForCandIsoDeposits(process, products)
48 
49  # Set process.options.canDeleteEarly
50  if not hasattr(process.options, "canDeleteEarly"):
51  process.options.canDeleteEarly = cms.untracked.vstring()
52 
53  branchSet = set()
54  for branches in products.values():
55  for branch in branches:
56  branchSet.add(branch)
57  branchList = sorted(branchSet)
58  process.options.canDeleteEarly.extend(branchList)
59 
60  # LogErrorHarvester should not wait for deleted items
61  for prod in process.producers_().values():
62  if prod.type_() == "LogErrorHarvester":
63  if not hasattr(prod,'excludeModules'):
64  prod.excludeModules = cms.untracked.vstring()
65  t = prod.excludeModules.value()
66  t.extend([b.split('_')[1] for b in branchList])
67  prod.excludeModules = t
68 
69  # Find the consumers
70  producers=[]
71  branchesList=[]
72  for producer, branches in products.items():
73  producers.append(producer)
74  branchesList.append(branches)
75 
76  for moduleType in [process.producers_(), process.filters_(), process.analyzers_()]:
77  for name, module in moduleType.items():
78  result=[]
79  for producer in producers:
80  result.append(False)
81 
82  _hasInputTagModuleLabel(process, module, name, producers, result)
83  for i in range(len(result)):
84  if result[i]:
85  #if it exists it might be optional or empty, both evaluate to False
86  if hasattr(module, "mightGet") and module.mightGet:
87  module.mightGet.extend(branchesList[i])
88  else:
89  module.mightGet = cms.untracked.vstring(branchesList[i])
90  return process
91 
92 
93 if __name__=="__main__":
94  import unittest
95 
96  class TestHasInputTagModuleLabel(unittest.TestCase):
97  def setUp(self):
98  """Nothing to do """
99  None
101  p = cms.Process("A")
102  p.pset = cms.PSet(a=cms.InputTag("a"),a2=cms.untracked.InputTag("a2"))
103  p.prod = cms.EDProducer("Producer",
104  foo = cms.InputTag("foo"),
105  foo2 = cms.InputTag("foo2", "instance"),
106  foo3 = cms.InputTag("foo3", "instance", "PROCESS"),
107  foo4 = cms.untracked.InputTag("foo4"),
108  nested = cms.PSet(
109  bar = cms.InputTag("bar"),
110  bar2 = cms.untracked.InputTag("bar2"),
111  ),
112  nested2 = cms.untracked.PSet(
113  bar3 = cms.untracked.InputTag("bar3"),
114  ),
115  flintstones = cms.VPSet(
116  cms.PSet(fred=cms.InputTag("fred")),
117  cms.PSet(wilma=cms.InputTag("wilma"))
118  ),
119  flintstones2 = cms.VPSet(
120  cms.PSet(fred2=cms.untracked.InputTag("fred2")),
121  cms.PSet(wilma2=cms.InputTag("wilma2"))
122  ),
123  ref = cms.PSet(
124  refToPSet_ = cms.string("pset")
125  ),
126  ref2 = cms.untracked.PSet(
127  refToPSet_ = cms.string("pset")
128  ),
129  )
130  p.prod2 = cms.EDProducer("Producer2",
131  foo = cms.PSet(
132  refToPSet_ = cms.string("nonexistent")
133  )
134  )
135 
136  result=[False,False,False,False,False,False,False,False,False,False,False,False,False,False]
137  _hasInputTagModuleLabel(p, p.prod, "prod", ["foo","foo2","foo3","bar","fred","wilma","a","foo4","bar2","bar3","fred2","wilma2","a2","joe"], result)
138  for i in range (0,13):
139  self.assert_(result[i])
140  self.assert_(not result[13])
141 
142  result = [False]
143  self.assertRaises(RuntimeError, _hasInputTagModuleLabel, p, p.prod2, "prod2", ["foo"], result)
144 
145  unittest.main()
const uint16_t range(const Frame &aFrame)