CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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(),
34  self._paramReplace.getProcessName())
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(),
49  self._paramReplace.getProcessName()))
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 
93 class MassSearchParamVisitor(object):
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.op.src="b"
177  p.op.vsrc=cms.VInputTag("b")
178  p.s = cms.Sequence(p.a*p.b*p.c*p.sp*p.op)
179  massSearchReplaceAnyInputTag(p.s, cms.InputTag("b"), cms.InputTag("new"))
180  self.assertNotEqual(cms.InputTag("new"), p.b.src)
181  self.assertEqual(cms.InputTag("new"), p.c.src)
182  self.assertEqual(cms.InputTag("new"), p.c.usrc)
183  self.assertEqual(cms.InputTag("new"), p.c.nested.src)
184  self.assertEqual(cms.InputTag("new"), p.c.nested.usrc)
185  self.assertFalse(p.c.nested.usrc.isTracked())
186  self.assertNotEqual(cms.InputTag("new"), p.c.nested.src2)
187  self.assertEqual(cms.InputTag("new"), p.c.nestedv[0].src)
188  self.assertNotEqual(cms.InputTag("new"), p.c.nestedv[1].src)
189  self.assertEqual(cms.InputTag("new"), p.c.unestedv[0].src)
190  self.assertNotEqual(cms.InputTag("new"), p.c.unestedv[1].src)
191  self.assertNotEqual(cms.InputTag("new"), p.c.vec[0])
192  self.assertEqual(cms.InputTag("new"), p.c.vec[1])
193  self.assertNotEqual(cms.InputTag("new"), p.c.vec[2])
194  self.assertNotEqual(cms.InputTag("new"), p.c.vec[3])
195  self.assertNotEqual(cms.InputTag("new"), p.c.uvec[0])
196  self.assertEqual(cms.InputTag("new"), p.c.uvec[1])
197  self.assertNotEqual(cms.InputTag("new"), p.c.uvec[2])
198  self.assertNotEqual(cms.InputTag("new"), p.c.uvec[3])
199  self.assertFalse(p.c.uvec[0].isTracked())
200  self.assertFalse(p.c.uvec[1].isTracked())
201  self.assertFalse(p.c.uvec[2].isTracked())
202  self.assertFalse(p.c.uvec[3].isTracked())
203  self.assertEqual(cms.InputTag("new"), p.sp.test1.src)
204  self.assertEqual(cms.InputTag("new"), p.sp.test1.nested.src)
205  self.assertEqual(cms.InputTag("c"), p.sp.test1.nested.src2)
206  self.assertEqual(cms.untracked.InputTag("new"), p.sp.test1.nested.usrc)
207  self.assertEqual(cms.InputTag("c"), p.sp.test2.src)
208  self.assertEqual(cms.InputTag("new"), p.sp.test2.nested.src)
209  self.assertEqual(cms.InputTag("c"), p.sp.test2.nested.src2)
210  self.assertEqual(cms.untracked.InputTag("new"), p.sp.test2.nested.usrc)
211  self.assertEqual(cms.InputTag("new"), p.op.src)
212  self.assertEqual(cms.InputTag("new"), p.op.vsrc[0])
213 
215  process1 = cms.Process("test")
216  massReplaceInputTag(process1, "a", "b", False, False, False)
217  self.assertEqual(process1.dumpPython(), cms.Process('test').dumpPython())
218  p = cms.Process("test")
219  p.a = cms.EDProducer("a", src=cms.InputTag("gen"))
220  p.b = cms.EDProducer("ab", src=cms.InputTag("a"))
221  p.c = cms.EDProducer("ac", src=cms.InputTag("b"),
222  nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("a")),
223  nestedv = cms.VPSet(cms.PSet(src = cms.InputTag("a")), cms.PSet(src = cms.InputTag("d"))),
224  unestedv = cms.untracked.VPSet(cms.untracked.PSet(src = cms.InputTag("a")), cms.untracked.PSet(src = cms.InputTag("d"))),
225  vec = cms.VInputTag(cms.InputTag("a"), cms.InputTag("b"), cms.InputTag("c"), cms.InputTag("d")),
226  uvec = cms.untracked.VInputTag(cms.untracked.InputTag("a"), cms.untracked.InputTag("b"), cms.untracked.InputTag("c"), cms.InputTag("d")),
227  )
228  p.d = cms.EDProducer("ab", src=cms.InputTag("a"))
229  p.e = cms.EDProducer("ab", src=cms.InputTag("a"))
230  p.f = cms.EDProducer("ab", src=cms.InputTag("a"))
231  p.g = cms.EDProducer("ab", src=cms.InputTag("a"))
232  p.h = cms.EDProducer("ab", src=cms.InputTag("a"))
233  p.i = cms.EDProducer("ab", src=cms.InputTag("a"))
234  p.sp = SwitchProducerTest(
235  test1 = cms.EDProducer("a", src = cms.InputTag("a"),
236  nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("a"))
237  ),
238  test2 = cms.EDProducer("b", src = cms.InputTag("c"),
239  nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("a"))
240  ),
241  )
242  p.s1 = cms.Sequence(p.a*p.b*p.c*p.sp)
243  p.path1 = cms.Path(p.s1)
244  p.s2 = cms.Sequence(p.d)
245  p.path2 = cms.Path(p.e)
246  p.s3 = cms.Sequence(p.f)
247  p.endpath1 = cms.EndPath(p.s3)
248  p.endpath2 = cms.EndPath(p.g)
249  p.t1 = cms.Task(p.h)
250  p.t2 = cms.Task(p.i)
251  p.schedule = cms.Schedule()
252  p.schedule.associate(p.t1, p.t2)
253  massReplaceInputTag(p, "a", "b", False, False, False)
254  self.assertEqual(cms.InputTag("b"), p.b.src)
255  self.assertEqual(cms.InputTag("b"), p.c.nested.src)
256  self.assertEqual(cms.InputTag("b"), p.c.nested.usrc)
257  self.assertFalse(p.c.nested.usrc.isTracked())
258  self.assertEqual(cms.InputTag("b"), p.c.nestedv[0].src)
259  self.assertEqual(cms.InputTag("b"), p.c.unestedv[0].src)
260  self.assertEqual(cms.InputTag("b"), p.c.vec[0])
261  self.assertEqual(cms.InputTag("c"), p.c.vec[2])
262  self.assertEqual(cms.InputTag("b"), p.c.uvec[0])
263  self.assertEqual(cms.InputTag("c"), p.c.uvec[2])
264  self.assertFalse(p.c.uvec[0].isTracked())
265  self.assertFalse(p.c.uvec[1].isTracked())
266  self.assertFalse(p.c.uvec[2].isTracked())
267  self.assertEqual(cms.InputTag("a"), p.d.src)
268  self.assertEqual(cms.InputTag("b"), p.e.src)
269  self.assertEqual(cms.InputTag("b"), p.f.src)
270  self.assertEqual(cms.InputTag("b"), p.g.src)
271  self.assertEqual(cms.InputTag("b"), p.h.src)
272  self.assertEqual(cms.InputTag("b"), p.i.src)
273  self.assertEqual(cms.InputTag("b"), p.sp.test1.src)
274  self.assertEqual(cms.InputTag("b"), p.sp.test1.nested.src)
275  self.assertEqual(cms.InputTag("c"), p.sp.test1.nested.src2)
276  self.assertEqual(cms.untracked.InputTag("b"), p.sp.test1.nested.usrc)
277  self.assertEqual(cms.InputTag("c"), p.sp.test2.src)
278  self.assertEqual(cms.InputTag("b"), p.sp.test2.nested.src)
279  self.assertEqual(cms.InputTag("c"), p.sp.test2.nested.src2)
280  self.assertEqual(cms.untracked.InputTag("b"), p.sp.test2.nested.usrc)
281 
283  p = cms.Process("test")
284  p.a = cms.EDProducer("a", src=cms.InputTag("gen"))
285  p.b = cms.EDProducer("ab", src=cms.InputTag("a"))
286  p.c = cms.EDProducer("ac", src=cms.InputTag("b"),
287  nested = cms.PSet(src = cms.InputTag("c"), src2 = cms.InputTag("b"))
288  )
289  p.d = cms.EDProducer("ac", src=cms.untracked.InputTag("b"),
290  nested = cms.PSet(src = cms.InputTag("c"), src2 = cms.InputTag("b"))
291  )
292  p.sp = SwitchProducerTest(
293  test1 = cms.EDProducer("a", src = cms.InputTag("b"),
294  nested = cms.PSet(src = cms.InputTag("b"))
295  ),
296  test2 = cms.EDProducer("b", src = cms.InputTag("b")),
297  )
298  p.s = cms.Sequence(p.a*p.b*p.c*p.d*p.sp)
299  massSearchReplaceParam(p.s,"src",cms.InputTag("b"),"a")
300  self.assertEqual(cms.InputTag("a"),p.c.src)
301  self.assertEqual(cms.InputTag("c"),p.c.nested.src)
302  self.assertEqual(cms.InputTag("b"),p.c.nested.src2)
303  self.assertEqual(cms.untracked.InputTag("a"),p.d.src)
304  self.assertEqual(cms.InputTag("c"),p.d.nested.src)
305  self.assertEqual(cms.InputTag("b"),p.d.nested.src2)
306  self.assertEqual(cms.InputTag("a"),p.sp.test1.src)
307  self.assertEqual(cms.InputTag("b"),p.sp.test1.nested.src)
308  self.assertEqual(cms.InputTag("a"),p.sp.test2.src)
309 
311  process1 = cms.Process("test")
312  massReplaceParameter(process1, "src", cms.InputTag("a"), "b", False)
313  self.assertEqual(process1.dumpPython(), cms.Process("test").dumpPython())
314  p = cms.Process("test")
315  p.a = cms.EDProducer("a", src=cms.InputTag("gen"))
316  p.b = cms.EDProducer("ab", src=cms.InputTag("a"))
317  p.c = cms.EDProducer("ac", src=cms.InputTag("b"),
318  nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c")),
319  nestedv = cms.VPSet(cms.PSet(src = cms.InputTag("a")), cms.PSet(src = cms.InputTag("d"))),
320  vec = cms.VInputTag(cms.InputTag("a"), cms.InputTag("b"), cms.InputTag("c"), cms.InputTag("d"))
321  )
322  p.d = cms.EDProducer("ab", src=cms.InputTag("a"))
323  p.e = cms.EDProducer("ab", src=cms.InputTag("a"))
324  p.f = cms.EDProducer("ab", src=cms.InputTag("a"))
325  p.g = cms.EDProducer("ab", src=cms.InputTag("a"))
326  p.h = cms.EDProducer("ab", src=cms.InputTag("a"))
327  p.i = cms.EDProducer("ab", src=cms.InputTag("a"))
328  p.j = cms.EDProducer("ab", src=cms.untracked.InputTag("a"))
329  p.sp = SwitchProducerTest(
330  test1 = cms.EDProducer("a", src = cms.InputTag("a"),
331  nested = cms.PSet(src = cms.InputTag("a"))
332  ),
333  test2 = cms.EDProducer("b", src = cms.InputTag("a")),
334  )
335  p.s1 = cms.Sequence(p.a*p.b*p.c*p.sp)
336  p.path1 = cms.Path(p.s1)
337  p.s2 = cms.Sequence(p.d)
338  p.path2 = cms.Path(p.e)
339  p.s3 = cms.Sequence(p.f)
340  p.endpath1 = cms.EndPath(p.s3)
341  p.endpath2 = cms.EndPath(p.g)
342  p.t1 = cms.Task(p.h)
343  p.t2 = cms.Task(p.i, p.j)
344  p.schedule = cms.Schedule()
345  p.schedule.associate(p.t1, p.t2)
346  massReplaceParameter(p, "src",cms.InputTag("a"), "b", False)
347  self.assertEqual(cms.InputTag("gen"), p.a.src)
348  self.assertEqual(cms.InputTag("b"), p.b.src)
349  self.assertEqual(cms.InputTag("a"), p.c.vec[0])
350  self.assertEqual(cms.InputTag("c"), p.c.vec[2])
351  self.assertEqual(cms.InputTag("a"), p.d.src)
352  self.assertEqual(cms.InputTag("b"), p.e.src)
353  self.assertEqual(cms.InputTag("b"), p.f.src)
354  self.assertEqual(cms.InputTag("b"), p.g.src)
355  self.assertEqual(cms.InputTag("b"), p.h.src)
356  self.assertEqual(cms.InputTag("b"), p.i.src)
357  self.assertEqual(cms.untracked.InputTag("b"), p.j.src)
358  self.assertEqual(cms.InputTag("b"),p.sp.test1.src)
359  self.assertEqual(cms.InputTag("a"),p.sp.test1.nested.src)
360  self.assertEqual(cms.InputTag("b"),p.sp.test2.src)
361  unittest.main()
def massReplaceInputTag
Definition: MassReplace.py:83
def massReplaceParameter
Definition: MassReplace.py:132
def massSearchReplaceParam
Definition: MassReplace.py:129
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def massSearchReplaceAnyInputTag
Definition: MassReplace.py:79
#define str(s)