CMS 3D CMS Logo

SequenceVisitors.py
Go to the documentation of this file.
1 from SequenceTypes import *
2 from Modules import OutputModule, EDProducer, EDFilter, EDAnalyzer, Service, ESProducer, ESSource, _Module
3 from Mixins import _Labelable
4 import six
5 
6 # Use this on Tasks in the Schedule
8  def __init__(self):
9  pass
10  def enter(self,visitee):
11  if visitee.isLeaf():
12  if isinstance(visitee, _Labelable):
13  if not visitee.hasLabel_():
14  raise ValueError("A task associated with the Schedule contains a module of type '"+visitee.type_()+"'\nwhich has no assigned label.")
15  elif isinstance(visitee, Service):
16  if not visitee._inProcess:
17  raise ValueError("A task associated with the Schedule contains a service of type '"+visitee.type_()+"'\nwhich is not attached to the process.")
18  def leave(self,visitee):
19  pass
20 
21 # Use this on Paths
22 class PathValidator(object):
23  def __init__(self):
24  self.__label = ''
25  def setLabel(self,label):
26  self.__label = "'"+label+"' "
27  def enter(self,visitee):
28  if isinstance(visitee,OutputModule):
29  raise ValueError("Path "+self.__label+"cannot contain an OutputModule, '"+visitee.type_()+"', with label '"+visitee.label_()+"'")
30  if visitee.isLeaf():
31  if isinstance(visitee, _Labelable):
32  if not visitee.hasLabel_():
33  raise ValueError("Path "+self.__label+"contains a module of type '"+visitee.type_()+"' which has no assigned label.")
34  elif isinstance(visitee, Service):
35  if not visitee._inProcess:
36  raise ValueError("Path "+self.__label+"contains a service of type '"+visitee.type_()+"' which is not attached to the process.\n")
37  def leave(self,visitee):
38  pass
39 
40 # Use this on EndPaths
41 class EndPathValidator(object):
42  _presetFilters = ["TriggerResultsFilter", "HLTPrescaler"]
43  def __init__(self):
45  self.__label = ''
46  self._levelInTasks = 0
47  def setLabel(self,label):
48  self.__label = "'"+label+"' "
49  def enter(self,visitee):
50  if visitee.isLeaf():
51  if isinstance(visitee, _Labelable):
52  if not visitee.hasLabel_():
53  raise ValueError("EndPath "+self.__label+"contains a module of type '"+visitee.type_()+"' which has\nno assigned label.")
54  elif isinstance(visitee, Service):
55  if not visitee._inProcess:
56  raise ValueError("EndPath "+self.__label+"contains a service of type '"+visitee.type_()+"' which is not attached to the process.\n")
57  if isinstance(visitee, Task):
58  self._levelInTasks += 1
59  if self._levelInTasks > 0:
60  return
61  if isinstance(visitee,EDFilter):
62  if (visitee.type_() in self._presetFilters):
63  if (visitee.type_() not in self.filtersOnEndpaths):
64  self.filtersOnEndpaths.append(visitee.type_())
65  def leave(self,visitee):
66  if self._levelInTasks > 0:
67  if isinstance(visitee, Task):
68  self._levelInTasks -= 1
69 
71  """Form sets of all modules, ESProducers, ESSources and Services in visited objects. Can be used
72  to visit Paths, EndPaths, Sequences or Tasks. Includes in sets objects on sub-Sequences and sub-Tasks"""
73  def __init__(self):
74  self.modules = set()
75  self.esProducers = set()
76  self.esSources = set()
77  self.services = set()
78  def enter(self,visitee):
79  if visitee.isLeaf():
80  if isinstance(visitee, _Module):
81  self.modules.add(visitee)
82  elif isinstance(visitee, ESProducer):
83  self.esProducers.add(visitee)
84  elif isinstance(visitee, ESSource):
85  self.esSources.add(visitee)
86  elif isinstance(visitee, Service):
87  self.services.add(visitee)
88  def leave(self,visitee):
89  pass
90 
91 class CompositeVisitor(object):
92  """ Combines 3 different visitor classes in 1 so we only have to visit all the paths and endpaths once"""
93  def __init__(self, validator, node, decorated):
94  self._validator = validator
95  self._node = node
96  self._decorated = decorated
97  def enter(self, visitee):
98  self._validator.enter(visitee)
99  self._node.enter(visitee)
100  self._decorated.enter(visitee)
101  def leave(self, visitee):
102  self._validator.leave(visitee)
103  # The node visitor leave function does nothing
104  #self._node.leave(visitee)
105  self._decorated.leave(visitee)
106 
108  """Fill a list with the names of Event module types in a sequence. The names are determined
109  by using globals() to lookup the variable names assigned to the modules. This
110  allows the determination of the labels before the modules have been attached to a Process."""
111  def __init__(self,globals_,l):
112  self._moduleToName = { v[1]:v[0] for v in six.iteritems(globals_) if isinstance(v[1],_Module) }
113  self._names =l
114  def enter(self,node):
115  if isinstance(node,_Module):
116  self._names.append(self._moduleToName[node])
117  def leave(self,node):
118  return
119 
120 if __name__=="__main__":
121  import unittest
122  class TestModuleCommand(unittest.TestCase):
123  def setUp(self):
124  """Nothing to do """
125  pass
126  def testValidators(self):
127  producer = EDProducer("Producer")
128  analyzer = EDAnalyzer("Analyzer")
129  output = OutputModule("Out")
130  filter = EDFilter("Filter")
131  unlabeled = EDAnalyzer("UnLabeled")
132  producer.setLabel("producer")
133  analyzer.setLabel("analyzer")
134  output.setLabel("output")
135  filter.setLabel("filter")
136  s1 = Sequence(analyzer*producer)
137  s2 = Sequence(output+filter)
138  p1 = Path(s1)
139  p2 = Path(s1*s2)
140  p3 = Path(s1+unlabeled)
141  ep1 = EndPath(producer+output+analyzer)
142  ep2 = EndPath(filter+output)
143  ep3 = EndPath(s2)
144  ep4 = EndPath(unlabeled)
145  pathValidator = PathValidator()
146  endpathValidator = EndPathValidator()
147  p1.visit(pathValidator)
148  self.assertRaises(ValueError, p2.visit, pathValidator)
149  self.assertRaises(ValueError, p3.visit, pathValidator)
150  ep1.visit(endpathValidator)
151  ep2.visit(endpathValidator)
152  ep3.visit(endpathValidator)
153  self.assertRaises(ValueError, ep4.visit, endpathValidator)
154 
155  unittest.main()
156 
def __init__(self, validator, node, decorated)