CMS 3D CMS Logo

SequenceVisitors.py
Go to the documentation of this file.
1 from __future__ import absolute_import
2 from .SequenceTypes import *
3 from .Modules import OutputModule, EDProducer, EDFilter, EDAnalyzer, Service, ESProducer, ESSource, _Module
4 from .Mixins import _Labelable
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:str):
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:str):
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 
70 # Use this on EndPaths
72  def __init__(self):
73  self.__label = ''
74  self._levelInTasks = 0
76  def setLabel(self,label:str):
77  self.__label = "'"+label+"' "
78  def enter(self,visitee):
79  if visitee.isLeaf():
80  if isinstance(visitee, _Labelable):
81  if not visitee.hasLabel_():
82  raise ValueError("FinalPath "+self.__label+"contains a module of type '"+visitee.type_()+"' which has\nno assigned label.")
83  elif isinstance(visitee, Service):
84  if not visitee._inProcess:
85  raise ValueError("FinalPath "+self.__label+"contains a service of type '"+visitee.type_()+"' which is not attached to the process.\n")
86  if isinstance(visitee, Task):
87  self._levelInTasks += 1
88  if self._levelInTasks > 0:
89  return
90  if isinstance(visitee,(EDAnalyzer,EDProducer,EDFilter)):
91  self.invalidModulesOnFinalpaths.append(visitee.type_())
92  def leave(self,visitee):
93  if self._levelInTasks > 0:
94  if isinstance(visitee, Task):
95  self._levelInTasks -= 1
96 
98  """Form sets of all modules, ESProducers, ESSources and Services in visited objects. Can be used
99  to visit Paths, EndPaths, Sequences or Tasks. Includes in sets objects on sub-Sequences and sub-Tasks"""
100  def __init__(self):
101  self.modules = set()
102  self.esProducers = set()
103  self.esSources = set()
104  self.services = set()
105  def enter(self,visitee):
106  if visitee.isLeaf():
107  if isinstance(visitee, _Module):
108  self.modules.add(visitee)
109  elif isinstance(visitee, ESProducer):
110  self.esProducers.add(visitee)
111  elif isinstance(visitee, ESSource):
112  self.esSources.add(visitee)
113  elif isinstance(visitee, Service):
114  self.services.add(visitee)
115  def leave(self,visitee):
116  pass
117 
118 class CompositeVisitor(object):
119  """ Combines 3 different visitor classes in 1 so we only have to visit all the paths and endpaths once"""
120  def __init__(self, validator, node, decorated, optional=None):
121  self._validator = validator
122  self._node = node
123  self._decorated = decorated
124  self._optional = optional
125  def enter(self, visitee):
126  self._validator.enter(visitee)
127  self._node.enter(visitee)
128  self._decorated.enter(visitee)
129  if self._optional:
130  self._optional.enter(visitee)
131  def leave(self, visitee):
132  self._validator.leave(visitee)
133  # The node visitor leave function does nothing
134  #self._node.leave(visitee)
135  self._decorated.leave(visitee)
136  if self._optional:
137  self._optional.leave(visitee)
138 
140  """Fill a list with the names of Event module types in a sequence. The names are determined
141  by using globals() to lookup the variable names assigned to the modules. This
142  allows the determination of the labels before the modules have been attached to a Process."""
143  def __init__(self,globals_,l):
144  self._moduleToName = { v[1]:v[0] for v in globals_.items() if isinstance(v[1],_Module) }
145  self._names =l
146  def enter(self,node):
147  if isinstance(node,_Module):
148  self._names.append(self._moduleToName[node])
149  def leave(self,node):
150  return
151 
152 if __name__=="__main__":
153  import unittest
154  class TestModuleCommand(unittest.TestCase):
155  def setUp(self):
156  """Nothing to do """
157  pass
158  def testValidators(self):
159  producer = EDProducer("Producer")
160  analyzer = EDAnalyzer("Analyzer")
161  output = OutputModule("Out")
162  filter = EDFilter("Filter")
163  unlabeled = EDAnalyzer("UnLabeled")
164  producer.setLabel("producer")
165  analyzer.setLabel("analyzer")
166  output.setLabel("output")
167  filter.setLabel("filter")
168  s1 = Sequence(analyzer*producer)
169  s2 = Sequence(output+filter)
170  p1 = Path(s1)
171  p2 = Path(s1*s2)
172  p3 = Path(s1+unlabeled)
173  ep1 = EndPath(producer+output+analyzer)
174  ep2 = EndPath(filter+output)
175  ep3 = EndPath(s2)
176  ep4 = EndPath(unlabeled)
177  pathValidator = PathValidator()
178  endpathValidator = EndPathValidator()
179  p1.visit(pathValidator)
180  self.assertRaises(ValueError, p2.visit, pathValidator)
181  self.assertRaises(ValueError, p3.visit, pathValidator)
182  ep1.visit(endpathValidator)
183  ep2.visit(endpathValidator)
184  ep3.visit(endpathValidator)
185  self.assertRaises(ValueError, ep4.visit, endpathValidator)
186 
187  unittest.main()
188 
void add(std::map< std::string, TH1 *> &h, TH1 *hist)
def __init__(self, validator, node, decorated, optional=None)