CMS 3D CMS Logo

MassReplace.py
Go to the documentation of this file.
1 from __future__ import print_function
2 import FWCore.ParameterSet.Config as cms
3 
5  """Visitor that travels within a cms.Sequence, looks for a parameter and replace its value
6  It will climb down within PSets, VPSets and VInputTags to find its target"""
7  def __init__(self,paramSearch,paramReplace,verbose=False,moduleLabelOnly=False,skipLabelTest=False):
8  self._paramSearch = self.standardizeInputTagFmt(paramSearch)
9  self._paramReplace = self.standardizeInputTagFmt(paramReplace)
10  self._moduleName = ''
11  self._verbose=verbose
12  self._moduleLabelOnly=moduleLabelOnly
13  self._skipLabelTest=skipLabelTest
14  def doIt(self,pset,base):
15  if isinstance(pset, cms._Parameterizable):
16  for name in pset.parameterNames_():
17  # if I use pset.parameters_().items() I get copies of the parameter values
18  # so I can't modify the nested pset
19  value = getattr(pset,name)
20  if isinstance(value, cms.PSet) or isinstance(value, cms.EDProducer) or isinstance(value, cms.EDAlias):
21  # EDProducer and EDAlias to support SwitchProducer
22  self.doIt(value,base+"."+name)
23  elif value.isCompatibleCMSType(cms.VPSet):
24  for (i,ps) in enumerate(value): self.doIt(ps, "%s.%s[%d]"%(base,name,i) )
25  elif value.isCompatibleCMSType(cms.VInputTag) and value:
26  for (i,n) in enumerate(value):
27  # VInputTag can be declared as a list of strings, so ensure that n is formatted correctly
28  n = self.standardizeInputTagFmt(n)
29  if (n == self._paramSearch):
30  if self._verbose:print("Replace %s.%s[%d] %s ==> %s " % (base, name, i, self._paramSearch, self._paramReplace))
31  if not value.isTracked():
32  value[i] = cms.untracked.InputTag(self._paramReplace.getModuleLabel(),
33  self._paramReplace.getProductInstanceLabel(),
35  else:
36  value[i] = self._paramReplace
37  elif self._moduleLabelOnly and n.moduleLabel == self._paramSearch.moduleLabel:
38  nrep = n; nrep.moduleLabel = self._paramReplace.moduleLabel
39  if self._verbose:print("Replace %s.%s[%d] %s ==> %s " % (base, name, i, n, nrep))
40  value[i] = nrep
41  elif value.isCompatibleCMSType(cms.InputTag) and value:
42  if value == self._paramSearch:
43  if self._verbose:print("Replace %s.%s %s ==> %s " % (base, name, self._paramSearch, self._paramReplace))
44  from copy import deepcopy
45  if not value.isTracked():
46  # the existing value should stay untracked even if the given parameter is tracked
47  setattr(pset, name, cms.untracked.InputTag(self._paramReplace.getModuleLabel(),
48  self._paramReplace.getProductInstanceLabel(),
50  else:
51  setattr(pset, name, deepcopy(self._paramReplace) )
52  elif self._moduleLabelOnly and value.moduleLabel == self._paramSearch.moduleLabel:
53  from copy import deepcopy
54  repl = deepcopy(getattr(pset, name))
55  repl.moduleLabel = self._paramReplace.moduleLabel
56  setattr(pset, name, repl)
57  if self._verbose:print("Replace %s.%s %s ==> %s " % (base, name, value, repl))
58 
59 
60  @staticmethod
61  def standardizeInputTagFmt(inputTag):
62  ''' helper function to ensure that the InputTag is defined as cms.InputTag(str) and not as a plain str '''
63  if not isinstance(inputTag, cms.InputTag):
64  return cms.InputTag(inputTag)
65  return inputTag
66 
67  def enter(self,visitee):
68  label = ''
69  if (not self._skipLabelTest):
70  if hasattr(visitee,"hasLabel_") and visitee.hasLabel_():
71  label = visitee.label_()
72  else: label = '<Module not in a Process>'
73  else:
74  label = '<Module label not tested>'
75  self.doIt(visitee, label)
76  def leave(self,visitee):
77  pass
78 
79 def massSearchReplaceAnyInputTag(sequence, oldInputTag, newInputTag,verbose=False,moduleLabelOnly=False,skipLabelTest=False) :
80  """Replace InputTag oldInputTag with newInputTag, at any level of nesting within PSets, VPSets, VInputTags..."""
81  sequence.visit(MassSearchReplaceAnyInputTagVisitor(oldInputTag,newInputTag,verbose=verbose,moduleLabelOnly=moduleLabelOnly,skipLabelTest=skipLabelTest))
82 
83 def massReplaceInputTag(process,old="rawDataCollector",new="rawDataRepacker",verbose=False,moduleLabelOnly=False,skipLabelTest=False):
84  for s in process.paths_().keys():
85  massSearchReplaceAnyInputTag(getattr(process,s), old, new, verbose, moduleLabelOnly, skipLabelTest)
86  for s in process.endpaths_().keys():
87  massSearchReplaceAnyInputTag(getattr(process,s), old, new, verbose, moduleLabelOnly, skipLabelTest)
88  if process.schedule_() is not None:
89  for task in process.schedule_()._tasks:
90  massSearchReplaceAnyInputTag(task, old, new, verbose, moduleLabelOnly, skipLabelTest)
91  return(process)
92 
94  """Visitor that travels within a cms.Sequence, looks for a parameter and returns a list of modules that have it"""
95  def __init__(self,paramName,paramSearch):
96  self._paramName = paramName
97  self._paramSearch = paramSearch
98  self._modules = []
99  def enter(self,visitee):
100  if (hasattr(visitee,self._paramName)):
101  if getattr(visitee,self._paramName) == self._paramSearch:
102  self._modules.append(visitee)
103  def leave(self,visitee):
104  pass
105  def modules(self):
106  return self._modules
107 
109  """Visitor that travels within a cms.Sequence, looks for a parameter and replaces its value"""
110  def __init__(self,paramName,paramSearch,paramValue,verbose=False):
111  self._paramName = paramName
112  self._paramValue = paramValue
113  self._paramSearch = paramSearch
114  self._verbose = verbose
115  def enter(self,visitee):
116  if isinstance(visitee, cms.SwitchProducer):
117  for modName in visitee.parameterNames_():
118  self.doIt(getattr(visitee, modName), "%s.%s"%(str(visitee), modName))
119  else:
120  self.doIt(visitee, str(visitee))
121  def doIt(self, mod, name):
122  if (hasattr(mod,self._paramName)):
123  if getattr(mod,self._paramName) == self._paramSearch:
124  if self._verbose:print("Replaced %s.%s: %s => %s" % (name,self._paramName,getattr(mod,self._paramName),self._paramValue))
125  setattr(mod,self._paramName,self._paramValue)
126  def leave(self,visitee):
127  pass
128 
129 def massSearchReplaceParam(sequence,paramName,paramOldValue,paramValue,verbose=False):
130  sequence.visit(MassSearchReplaceParamVisitor(paramName,paramOldValue,paramValue,verbose))
131 
132 def massReplaceParameter(process,name="label",old="rawDataCollector",new="rawDataRepacker",verbose=False):
133  for s in process.paths_().keys():
134  massSearchReplaceParam(getattr(process,s),name,old,new,verbose)
135  for s in process.endpaths_().keys():
136  massSearchReplaceParam(getattr(process,s),name,old,new,verbose)
137  if process.schedule_() is not None:
138  for task in process.schedule_()._tasks:
139  massSearchReplaceParam(task, name, old, new, verbose)
140  return(process)
141 
142 if __name__=="__main__":
143  import unittest
144  class SwitchProducerTest(cms.SwitchProducer):
145  def __init__(self, **kargs):
146  super(SwitchProducerTest,self).__init__(
147  dict(
148  test1 = lambda: (True, -10),
149  test2 = lambda: (True, -9),
150  test3 = lambda: (True, -8),
151  test4 = lambda: (True, -7)
152  ), **kargs)
153 
154  class TestModuleCommand(unittest.TestCase):
155 
157  p = cms.Process("test")
158  p.a = cms.EDProducer("a", src=cms.InputTag("gen"))
159  p.b = cms.EDProducer("ab", src=cms.InputTag("a"))
160  p.c = cms.EDProducer("ac", src=cms.InputTag("b"), usrc=cms.untracked.InputTag("b"),
161  nested = cms.PSet(src = cms.InputTag("b"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("b")),
162  nestedv = cms.VPSet(cms.PSet(src = cms.InputTag("b")), cms.PSet(src = cms.InputTag("d"))),
163  unestedv = cms.untracked.VPSet(cms.untracked.PSet(src = cms.InputTag("b")), cms.untracked.PSet(src = cms.InputTag("d"))),
164  vec = cms.VInputTag(cms.InputTag("a"), cms.InputTag("b"), cms.InputTag("c"), cms.InputTag("d")),
165  uvec = cms.untracked.VInputTag(cms.untracked.InputTag("a"), cms.untracked.InputTag("b"), cms.untracked.InputTag("c"), cms.untracked.InputTag("d")),
166  )
167  p.sp = SwitchProducerTest(
168  test1 = cms.EDProducer("a", src = cms.InputTag("b"),
169  nested = cms.PSet(src = cms.InputTag("b"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("b"))
170  ),
171  test2 = cms.EDProducer("b", src = cms.InputTag("c"),
172  nested = cms.PSet(src = cms.InputTag("b"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("b"))
173  ),
174  )
175  p.op = cms.EDProducer("op", src = cms.optional.InputTag, unset = cms.optional.InputTag, vsrc = cms.optional.VInputTag, vunset = cms.optional.VInputTag)
176  p.op2 = cms.EDProducer("op2", src = cms.optional.InputTag, unset = cms.optional.InputTag, vsrc = cms.optional.VInputTag, vunset = cms.optional.VInputTag)
177  p.op.src="b"
178  p.op.vsrc = ["b"]
179  p.op2.src=cms.InputTag("b")
180  p.op2.vsrc = cms.VInputTag("b")
181  p.s = cms.Sequence(p.a*p.b*p.c*p.sp*p.op*p.op2)
182  massSearchReplaceAnyInputTag(p.s, cms.InputTag("b"), cms.InputTag("new"))
183  self.assertNotEqual(cms.InputTag("new"), p.b.src)
184  self.assertEqual(cms.InputTag("new"), p.c.src)
185  self.assertEqual(cms.InputTag("new"), p.c.usrc)
186  self.assertEqual(cms.InputTag("new"), p.c.nested.src)
187  self.assertEqual(cms.InputTag("new"), p.c.nested.usrc)
188  self.assertFalse(p.c.nested.usrc.isTracked())
189  self.assertNotEqual(cms.InputTag("new"), p.c.nested.src2)
190  self.assertEqual(cms.InputTag("new"), p.c.nestedv[0].src)
191  self.assertNotEqual(cms.InputTag("new"), p.c.nestedv[1].src)
192  self.assertEqual(cms.InputTag("new"), p.c.unestedv[0].src)
193  self.assertNotEqual(cms.InputTag("new"), p.c.unestedv[1].src)
194  self.assertNotEqual(cms.InputTag("new"), p.c.vec[0])
195  self.assertEqual(cms.InputTag("new"), p.c.vec[1])
196  self.assertNotEqual(cms.InputTag("new"), p.c.vec[2])
197  self.assertNotEqual(cms.InputTag("new"), p.c.vec[3])
198  self.assertNotEqual(cms.InputTag("new"), p.c.uvec[0])
199  self.assertEqual(cms.InputTag("new"), p.c.uvec[1])
200  self.assertNotEqual(cms.InputTag("new"), p.c.uvec[2])
201  self.assertNotEqual(cms.InputTag("new"), p.c.uvec[3])
202  self.assertFalse(p.c.uvec[0].isTracked())
203  self.assertFalse(p.c.uvec[1].isTracked())
204  self.assertFalse(p.c.uvec[2].isTracked())
205  self.assertFalse(p.c.uvec[3].isTracked())
206  self.assertEqual(cms.InputTag("new"), p.sp.test1.src)
207  self.assertEqual(cms.InputTag("new"), p.sp.test1.nested.src)
208  self.assertEqual(cms.InputTag("c"), p.sp.test1.nested.src2)
209  self.assertEqual(cms.untracked.InputTag("new"), p.sp.test1.nested.usrc)
210  self.assertEqual(cms.InputTag("c"), p.sp.test2.src)
211  self.assertEqual(cms.InputTag("new"), p.sp.test2.nested.src)
212  self.assertEqual(cms.InputTag("c"), p.sp.test2.nested.src2)
213  self.assertEqual(cms.untracked.InputTag("new"), p.sp.test2.nested.usrc)
214  self.assertEqual(cms.InputTag("new"), p.op.src)
215  self.assertEqual(cms.InputTag("new"), p.op.vsrc[0])
216  self.assertEqual(cms.InputTag("new"), p.op2.src)
217  self.assertEqual(cms.InputTag("new"), p.op2.vsrc[0])
218 
220  process1 = cms.Process("test")
221  massReplaceInputTag(process1, "a", "b", False, False, False)
222  self.assertEqual(process1.dumpPython(), cms.Process('test').dumpPython())
223  p = cms.Process("test")
224  p.a = cms.EDProducer("a", src=cms.InputTag("gen"))
225  p.b = cms.EDProducer("ab", src=cms.InputTag("a"))
226  p.c = cms.EDProducer("ac", src=cms.InputTag("b"),
227  nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("a")),
228  nestedv = cms.VPSet(cms.PSet(src = cms.InputTag("a")), cms.PSet(src = cms.InputTag("d"))),
229  unestedv = cms.untracked.VPSet(cms.untracked.PSet(src = cms.InputTag("a")), cms.untracked.PSet(src = cms.InputTag("d"))),
230  vec = cms.VInputTag(cms.InputTag("a"), cms.InputTag("b"), cms.InputTag("c"), cms.InputTag("d")),
231  uvec = cms.untracked.VInputTag(cms.untracked.InputTag("a"), cms.untracked.InputTag("b"), cms.untracked.InputTag("c"), cms.InputTag("d")),
232  )
233  p.d = cms.EDProducer("ab", src=cms.InputTag("a"))
234  p.e = cms.EDProducer("ab", src=cms.InputTag("a"))
235  p.f = cms.EDProducer("ab", src=cms.InputTag("a"))
236  p.g = cms.EDProducer("ab", src=cms.InputTag("a"))
237  p.h = cms.EDProducer("ab", src=cms.InputTag("a"))
238  p.i = cms.EDProducer("ab", src=cms.InputTag("a"))
239  p.sp = SwitchProducerTest(
240  test1 = cms.EDProducer("a", src = cms.InputTag("a"),
241  nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("a"))
242  ),
243  test2 = cms.EDProducer("b", src = cms.InputTag("c"),
244  nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("a"))
245  ),
246  )
247  p.s1 = cms.Sequence(p.a*p.b*p.c*p.sp)
248  p.path1 = cms.Path(p.s1)
249  p.s2 = cms.Sequence(p.d)
250  p.path2 = cms.Path(p.e)
251  p.s3 = cms.Sequence(p.f)
252  p.endpath1 = cms.EndPath(p.s3)
253  p.endpath2 = cms.EndPath(p.g)
254  p.t1 = cms.Task(p.h)
255  p.t2 = cms.Task(p.i)
256  p.schedule = cms.Schedule()
257  p.schedule.associate(p.t1, p.t2)
258  massReplaceInputTag(p, "a", "b", False, False, False)
259  self.assertEqual(cms.InputTag("b"), p.b.src)
260  self.assertEqual(cms.InputTag("b"), p.c.nested.src)
261  self.assertEqual(cms.InputTag("b"), p.c.nested.usrc)
262  self.assertFalse(p.c.nested.usrc.isTracked())
263  self.assertEqual(cms.InputTag("b"), p.c.nestedv[0].src)
264  self.assertEqual(cms.InputTag("b"), p.c.unestedv[0].src)
265  self.assertEqual(cms.InputTag("b"), p.c.vec[0])
266  self.assertEqual(cms.InputTag("c"), p.c.vec[2])
267  self.assertEqual(cms.InputTag("b"), p.c.uvec[0])
268  self.assertEqual(cms.InputTag("c"), p.c.uvec[2])
269  self.assertFalse(p.c.uvec[0].isTracked())
270  self.assertFalse(p.c.uvec[1].isTracked())
271  self.assertFalse(p.c.uvec[2].isTracked())
272  self.assertEqual(cms.InputTag("a"), p.d.src)
273  self.assertEqual(cms.InputTag("b"), p.e.src)
274  self.assertEqual(cms.InputTag("b"), p.f.src)
275  self.assertEqual(cms.InputTag("b"), p.g.src)
276  self.assertEqual(cms.InputTag("b"), p.h.src)
277  self.assertEqual(cms.InputTag("b"), p.i.src)
278  self.assertEqual(cms.InputTag("b"), p.sp.test1.src)
279  self.assertEqual(cms.InputTag("b"), p.sp.test1.nested.src)
280  self.assertEqual(cms.InputTag("c"), p.sp.test1.nested.src2)
281  self.assertEqual(cms.untracked.InputTag("b"), p.sp.test1.nested.usrc)
282  self.assertEqual(cms.InputTag("c"), p.sp.test2.src)
283  self.assertEqual(cms.InputTag("b"), p.sp.test2.nested.src)
284  self.assertEqual(cms.InputTag("c"), p.sp.test2.nested.src2)
285  self.assertEqual(cms.untracked.InputTag("b"), p.sp.test2.nested.usrc)
286 
288  p = cms.Process("test")
289  p.a = cms.EDProducer("a", src=cms.InputTag("gen"))
290  p.b = cms.EDProducer("ab", src=cms.InputTag("a"))
291  p.c = cms.EDProducer("ac", src=cms.InputTag("b"),
292  nested = cms.PSet(src = cms.InputTag("c"), src2 = cms.InputTag("b"))
293  )
294  p.d = cms.EDProducer("ac", src=cms.untracked.InputTag("b"),
295  nested = cms.PSet(src = cms.InputTag("c"), src2 = cms.InputTag("b"))
296  )
297  p.sp = SwitchProducerTest(
298  test1 = cms.EDProducer("a", src = cms.InputTag("b"),
299  nested = cms.PSet(src = cms.InputTag("b"))
300  ),
301  test2 = cms.EDProducer("b", src = cms.InputTag("b")),
302  )
303  p.s = cms.Sequence(p.a*p.b*p.c*p.d*p.sp)
304  massSearchReplaceParam(p.s,"src",cms.InputTag("b"),"a")
305  self.assertEqual(cms.InputTag("a"),p.c.src)
306  self.assertEqual(cms.InputTag("c"),p.c.nested.src)
307  self.assertEqual(cms.InputTag("b"),p.c.nested.src2)
308  self.assertEqual(cms.untracked.InputTag("a"),p.d.src)
309  self.assertEqual(cms.InputTag("c"),p.d.nested.src)
310  self.assertEqual(cms.InputTag("b"),p.d.nested.src2)
311  self.assertEqual(cms.InputTag("a"),p.sp.test1.src)
312  self.assertEqual(cms.InputTag("b"),p.sp.test1.nested.src)
313  self.assertEqual(cms.InputTag("a"),p.sp.test2.src)
314 
316  process1 = cms.Process("test")
317  massReplaceParameter(process1, "src", cms.InputTag("a"), "b", False)
318  self.assertEqual(process1.dumpPython(), cms.Process("test").dumpPython())
319  p = cms.Process("test")
320  p.a = cms.EDProducer("a", src=cms.InputTag("gen"))
321  p.b = cms.EDProducer("ab", src=cms.InputTag("a"))
322  p.c = cms.EDProducer("ac", src=cms.InputTag("b"),
323  nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c")),
324  nestedv = cms.VPSet(cms.PSet(src = cms.InputTag("a")), cms.PSet(src = cms.InputTag("d"))),
325  vec = cms.VInputTag(cms.InputTag("a"), cms.InputTag("b"), cms.InputTag("c"), cms.InputTag("d"))
326  )
327  p.d = cms.EDProducer("ab", src=cms.InputTag("a"))
328  p.e = cms.EDProducer("ab", src=cms.InputTag("a"))
329  p.f = cms.EDProducer("ab", src=cms.InputTag("a"))
330  p.g = cms.EDProducer("ab", src=cms.InputTag("a"))
331  p.h = cms.EDProducer("ab", src=cms.InputTag("a"))
332  p.i = cms.EDProducer("ab", src=cms.InputTag("a"))
333  p.j = cms.EDProducer("ab", src=cms.untracked.InputTag("a"))
334  p.sp = SwitchProducerTest(
335  test1 = cms.EDProducer("a", src = cms.InputTag("a"),
336  nested = cms.PSet(src = cms.InputTag("a"))
337  ),
338  test2 = cms.EDProducer("b", src = cms.InputTag("a")),
339  )
340  p.s1 = cms.Sequence(p.a*p.b*p.c*p.sp)
341  p.path1 = cms.Path(p.s1)
342  p.s2 = cms.Sequence(p.d)
343  p.path2 = cms.Path(p.e)
344  p.s3 = cms.Sequence(p.f)
345  p.endpath1 = cms.EndPath(p.s3)
346  p.endpath2 = cms.EndPath(p.g)
347  p.t1 = cms.Task(p.h)
348  p.t2 = cms.Task(p.i, p.j)
349  p.schedule = cms.Schedule()
350  p.schedule.associate(p.t1, p.t2)
351  massReplaceParameter(p, "src",cms.InputTag("a"), "b", False)
352  self.assertEqual(cms.InputTag("gen"), p.a.src)
353  self.assertEqual(cms.InputTag("b"), p.b.src)
354  self.assertEqual(cms.InputTag("a"), p.c.vec[0])
355  self.assertEqual(cms.InputTag("c"), p.c.vec[2])
356  self.assertEqual(cms.InputTag("a"), p.d.src)
357  self.assertEqual(cms.InputTag("b"), p.e.src)
358  self.assertEqual(cms.InputTag("b"), p.f.src)
359  self.assertEqual(cms.InputTag("b"), p.g.src)
360  self.assertEqual(cms.InputTag("b"), p.h.src)
361  self.assertEqual(cms.InputTag("b"), p.i.src)
362  self.assertEqual(cms.untracked.InputTag("b"), p.j.src)
363  self.assertEqual(cms.InputTag("b"),p.sp.test1.src)
364  self.assertEqual(cms.InputTag("a"),p.sp.test1.nested.src)
365  self.assertEqual(cms.InputTag("b"),p.sp.test2.src)
366  unittest.main()
def __init__(self, paramName, paramSearch, paramValue, verbose=False)
Definition: MassReplace.py:110
def massSearchReplaceAnyInputTag(sequence, oldInputTag, newInputTag, verbose=False, moduleLabelOnly=False, skipLabelTest=False)
Definition: MassReplace.py:79
return((rh ^ lh) &mask)
def massSearchReplaceParam(sequence, paramName, paramOldValue, paramValue, verbose=False)
Definition: MassReplace.py:129
def testMassSearchReplaceAnyInputTag(self)
Definition: MassReplace.py:156
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def massReplaceInputTag(process, old="rawDataCollector", new="rawDataRepacker", verbose=False, moduleLabelOnly=False, skipLabelTest=False)
Definition: MassReplace.py:83
def __init__(self, paramName, paramSearch)
Definition: MassReplace.py:95
def getProcessName(pdgGen, requiredNumberOfGeneratedObjects)
def dumpPython(process, name)
def massReplaceParameter(process, name="label", old="rawDataCollector", new="rawDataRepacker", verbose=False)
Definition: MassReplace.py:132
def __init__(self, paramSearch, paramReplace, verbose=False, moduleLabelOnly=False, skipLabelTest=False)
Definition: MassReplace.py:7
#define str(s)