test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RandomServiceHelper.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 
4 from FWCore.ParameterSet.Config import Service
5 import FWCore.ParameterSet.Types as CfgTypes
6 
7 
9  """
10  _RandomNumberServiceHelper_
11 
12  Helper class to hold and handle the Random number generator service.
13 
14  Provide both user level and WM APIs.
15 
16  Author: Dave Evans
17  Modified: Eric Vaandering
18  """
19 
20  def __init__(self,randService):
21  self._randService = randService
22  self._lockedSeeds = []
23 
24 
25  def __containsSeed(self,psetInstance):
26  """
27  _keeper_
28 
29  True/False if the psetInstance has seeds in it
30 
31  """
32  if psetInstance is None:
33  return False
34  if not isinstance(psetInstance,CfgTypes.PSet):
35  return False
36  seedList = getattr(psetInstance, "initialSeedSet", None)
37  if seedList != None:
38  return True
39  seedVal = getattr(psetInstance, "initialSeed", None)
40  if seedVal != None:
41  return True
42  return False
43 
44 
45  def __psetsWithSeeds(self):
46  """
47  _psetsWithSeeds_
48 
49  *private method*
50 
51  return the list of PSet instances with seeds in them
52 
53  """
54  svcAttrs = [getattr(self._randService, item, None)
55  for item in self._randService.parameters_()
56  if item not in self._lockedSeeds]
57 
58  #print svcAttrs
59 
60  return filter(self.__containsSeed, svcAttrs)
61 
62 
63  def countSeeds(self):
64  """
65  _countSeeds_
66 
67  Count the number of seeds required by this service by
68  summing up the initialSeed and initialSeedSet entries
69  in all PSets in the service that contain those parameters.
70 
71  """
72  count = 0
73 
74  for itemRef in self.__psetsWithSeeds():
75  # //
76  # // PSet has list of seeds
77  #//
78  seedSet = getattr(itemRef, "initialSeedSet", None)
79  if seedSet != None:
80  count += len( seedSet.value())
81  continue
82  # //
83  # // PSet has single seed
84  #//
85  seedVal = getattr(itemRef, "initialSeed", None)
86  if seedVal != None:
87  count += 1
88 
89  # //
90  # // PSet has no recognisable seed, therfore do nothing
91  #// with it
92  return count
93 
94 
95  def setNamedSeed(self, psetName, *seeds):
96  """
97  _setNamedSeed_
98 
99  If a specific set of seeds is needed for a PSet in this
100  service, they can be set by name using this method.
101 
102  - *psetName* : Name of the pset containing the seeds
103 
104  - *seeds* : list of seeds to be added, should be a single seed
105  for initialSeed values.
106 
107  """
108  pset = getattr(self._randService, psetName, None)
109  if pset == None:
110  msg = "No PSet named %s belongs to this instance of the" % (
111  psetName,)
112  msg += "Random Seed Service"
113  raise RuntimeError(msg)
114 
115  seedVal = getattr(pset, "initialSeed", None)
116  if seedVal != None:
117  pset.initialSeed = CfgTypes.untracked(
118  CfgTypes.uint32(seeds[0])
119  )
120 
121  return
122  seedSet = getattr(pset, "initialSeedSet", None)
123  if seedSet != None:
124  # //
125  # // Do we want to check the number of seeds??
126  #//
127  #if len(seeds) != len( seedSet.value()): pass
128  pset.initialSeedSet = CfgTypes.untracked(
129  CfgTypes.vuint32(*seeds))
130  return
131  # //
132  # // No seeds for that PSet
133  #// Error throw?
134  return
135 
136 
137  def getNamedSeed(self, psetName):
138  """
139  _getNamedSeed_
140 
141  This method returns the seeds in a PSet in this service. Returned
142 
143  - *psetName* : Name of the pset containing the seeds
144 
145  """
146  pset = getattr(self._randService, psetName, None)
147  if pset == None:
148  msg = "No PSet named %s belongs to this instance of the" % (
149  psetName,)
150  msg += "Random Seed Service"
151  raise RuntimeError(msg)
152 
153  seedVal = getattr(pset, "initialSeed", None)
154  if seedVal != None:
155  return [pset.initialSeed.value()]
156 
157  seedSet = getattr(pset, "initialSeedSet", None)
158  if seedSet != None:
159  return pset.initialSeedSet
160 
161 
162  def insertSeeds(self, *seeds):
163  """
164  _insertSeeds_
165 
166  Given some list of specific seeds, insert them into the
167  service.
168 
169  Length of seed list is required to be same as the seed count for
170  the service.
171 
172  Usage: WM Tools.
173 
174  """
175  seeds = list(seeds)
176  if len(seeds) < self.countSeeds():
177  msg = "Not enough seeds provided\n"
178  msg += "Service requires %s seeds, only %s provided\n"
179  msg += "to RandomeService.insertSeeds method\n"
180  raise RuntimeError(msg)
181 
182  for item in self.__psetsWithSeeds():
183  seedSet = getattr(item, "initialSeedSet", None)
184  if seedSet != None:
185  numSeeds = len(seedSet.value())
186  useSeeds = seeds[:numSeeds]
187  seeds = seeds[numSeeds:]
188  item.initialSeedSet = CfgTypes.untracked(
189  CfgTypes.vuint32(*useSeeds))
190  continue
191  useSeed = seeds[0]
192  seeds = seeds[1:]
193  item.initialSeed = CfgTypes.untracked(
194  CfgTypes.uint32(useSeed)
195  )
196  continue
197  return
198 
199 
200  def populate(self, *excludePSets):
201  """
202  _populate_
203 
204  generate a bunch of seeds and stick them into this service
205  This is the lazy user method.
206 
207  Optional args are names of PSets to *NOT* alter seeds.
208 
209  Eg:
210  populate() will set all seeds
211  populate("pset1", "pset2") will set all seeds but not those in
212  psets named pset1 and pset2
213 
214  """
215 
216  import random
217  from random import SystemRandom
218  _inst = SystemRandom()
219  _MAXINT = 900000000
220 
221  # //
222  # // count seeds and create the required number of seeds
223  #//
224  newSeeds = [ _inst.randint(1, _MAXINT)
225  for i in range(self.countSeeds())]
226 
227 
228  self._lockedSeeds = list(excludePSets)
229  self.insertSeeds(*newSeeds)
230  self._lockedSeeds = []
231  return
232 
233 
234  def resetSeeds(self, value):
235  """
236  _resetSeeds_
237 
238  reset all seeds to given value
239 
240  """
241  newSeeds = [ value for i in range(self.countSeeds())]
242  self.insertSeeds(*newSeeds)
243  return
244 
245 
246 
247 if __name__ == '__main__':
248  # //
249  # // Setup a test service and populate it
250  #//
251  randSvc = Service("RandomNumberGeneratorService")
252  randHelper = RandomNumberServiceHelper(randSvc)
253 
254  randSvc.i1 = CfgTypes.untracked(CfgTypes.uint32(1))
255  randSvc.t1 = CfgTypes.PSet()
256  randSvc.t2 = CfgTypes.PSet()
257  randSvc.t3 = CfgTypes.PSet()
258 
259  randSvc.t1.initialSeed = CfgTypes.untracked(
260  CfgTypes.uint32(123455678)
261  )
262 
263  randSvc.t2.initialSeedSet = CfgTypes.untracked(
264  CfgTypes.vuint32(12345,234567,345677)
265  )
266 
267 
268  randSvc.t3.initialSeed = CfgTypes.untracked(
269  CfgTypes.uint32(987654321)
270  )
271 
272  print "Inital PSet"
273  print randSvc
274 
275 
276  # //
277  # // Autofill seeds
278  #//
279  print "Totally Random PSet"
280  randHelper.populate()
281  print randSvc
282 
283 
284  # //
285  # // Set all seeds with reset method
286  #//
287  print "All seeds 9999"
288  randHelper.resetSeeds(9999)
289  print randSvc
290 
291  # //
292  # // test setting named seeds
293  #//
294  print "t1,t3 9998"
295  randHelper.setNamedSeed("t1", 9998)
296  randHelper.setNamedSeed("t3", 9998, 9998)
297  print randSvc
298 
299  print "t1 seed(s)",randHelper.getNamedSeed("t1")
300  print "t2 seed(s)",randHelper.getNamedSeed("t2")
301 
302 
303  # //
304  # // Autofill seeds with exclusion list
305  #//
306  randHelper.populate("t1", "t3")
307  print "t2 randomized"
308  print randSvc
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run