ATLAS Offline Software
Loading...
Searching...
No Matches
D3PDObject.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3#
4# @file D3PDMakerCoreComps/python/D3PDObject.py
5# @author scott snyder <snyder@bnl.gov>
6# @date Aug, 2009
7# @brief D3PD object creator class.
8#
9
10
11from .Block import Block
12from AthenaCommon.Logging import logging
13from .StackedDict import StackedDict
14from AthenaConfiguration.ComponentFactory import CompFactory
15
16D3PD = CompFactory.D3PD
17
18
19def _make_name (name, prefix, name_prefix, parent_prefix, default_prefix):
20 """Helper to form the name for object filler tools."""
21 if name is None:
22 pref = prefix + name_prefix
23 if len (pref) == 0: pref = default_prefix
24 if len (pref) == 0:
25 pref = 'Unnamed_'
26 name = parent_prefix + pref + 'Filler'
27 return name
28
29
30def _testLOD (lod, reqlev, args, hookargs):
31 """Helper to perform LOD test.
32
33 lod: The level-of-detail to test. Either an integer or a callable.
34 reqlev: Requested level of detail for this object. An integer.
35 args: Arguments to be passed to the block.
36 hookargs: Arguments passed to the D3PD object, to be passed
37 on to LOD functions.
38"""
39 # Decide whether to include this block.
40 # If the block's LOD is callable, call it.
41 # Otherwise, just compare.
42 if callable (lod):
43 # Allow for an optional third hookargs argument.
44 try:
45 doblock = lod (reqlev, args, hookargs)
46 except TypeError as exc:
47 if (len(exc.args) > 0 and
48 (exc.args[0].find ('takes exactly 2 arguments') >= 0 or
49 exc.args[0].find ('takes 2 positional') >= 0)):
50 doblock = lod (reqlev, args)
51 else:
52 raise
53 else:
54 doblock = (lod <= reqlev)
55
56 return doblock
57
58
60 """Defer evaluating a block argument until the D3PDObject is instantiated.
61
62 Sometimes you want to pass an argument to a block function that isn't
63 known at the time the D3PDObject is defined, for example the
64 StoreGate key to use. You could do this with a hook function
65 or a LOD function, but that's a bit cumbersome. Instead, you can
66 use DeferArg. DeferArg stores a string. If a block argument
67 has a value that's an instance of DeferArg, then this string
68 is evaluated at the time the D3PDObject is instantiated.
69 The arguments passed to the D3PDObject will be available
70 in the context in which the string is evaluated.
71 A global dictionary may be provided as an optional argument;
72 any additional keyword arguments will be merged into this
73 dictionary.
74
75 Example:
76
77 FooD3PDObject.defineBlock (1, 'SomeBlock', SomeTool,
78 Name = DeferArg ('"name_" + sgkey'))
79
80 If FooD3PDObject is then instantiated with a StoreGate key of `Bar',
81 then the Name argument of this block will be set to `name_Bar'.
82"""
83 def __init__ (self, str, gdict = globals(), **kw): # noqa: B008 (globals is already a global ref.)
84 self.str = str
85 self.gdict = gdict
86 self.kw = kw
87 return
88
89
90 def __call__ (self, hookargs = {}, **kw):
91 gdict = self.gdict.copy()
92 gdict.update (self.kw)
93 hookargs = hookargs.copy()
94 hookargs.update (kw)
95 return eval (self.str, gdict, hookargs)
96
97
98
100 """D3PD object creator class.
101
102 For each type of object written to the D3PD, create
103 an instance of this class. The arguments to the constructor
104 are a function to create the Configurable for the object filler
105 tool and a default value for the variable name prefix
106 for this block.
107
108 After creating the instance, one calls defineBlock to define
109 the blocks of variables that can be written for this object.
110
111 Finally, one calls the object in order to create the
112 configurable.
113
114 So, a typical usage might look like this.
115
116 def makeElectronD3PDObject (name, prefix,
117 getter = None,
118 sgkey = 'ElectronAODCollection')
119 if not getter:
120 getter = CompFactory.D3PD.SGDataVectorGetterTool \
121 (name + '_Getter',
122 TypeName = 'ElectronContainer',
123 SGKey = sgkey)
124
125 return CompFactory.D3PD.VectorFillerTool (name,
126 Prefix = prefix,
127 Getter = getter)
128
129 ElectronD3PDObject = D3PDObject (makeElectronD3PDObject, 'el_')
130
131 ElectronD3PDObject.defineBlock (0, 'Kinematics',
132 EventCommonD3PDMaker.FourMomFillerTool)
133
134 alg = ...
135 alg += ElectronD3PDObject (level)
136"""
137
138 _hookArgsStore = {}
139
140
141 def __init__ (self, maker, default_prefix = '', default_object_name = '',
142 default_name = None, allow_args = [], **kw):
143 """Constructor.
144
145 Arguments:
146 maker: A function to create the IObjFillerTool Configurable
147 for this object. It is called with two fixed arguments,
148 the tool name and the variable name prefix. Any other
149 arguments provided to the call will be passed through.
150 default_prefix: Default variable name prefix for objects
151 of this type.
152 default_object_name: Default D3PDObject name, something like
153 'EventInfoD3PDObject'
154 default_name: If specified, the default tool name to use
155 for these objects.
156 allow_args: Additional arguments that may be passed in when
157 instantiating the D3PDObject, but which are not
158 to be passed to the maker function. This can be
159 used to allow for additional arguments to hook
160 or level-of-detail functions.
161
162 Any additional arguments are passed into any hook functions.
163
164"""
165 self._maker = maker
166 self._default_object_name = default_object_name
167 self._blocks = []
168 self._hooks = []
170 self._default_prefix = default_prefix
171 self._default_name = default_name
172 self._hookArgs = kw
173 self._parent = None
174 self._allow_args = allow_args
175 return
176
177
178 def defineBlock (self, lod, name, func, prefix = None, **kw):
179 """Define a new block of variables for this object type.
180
181 Arguments:
182 lod: Level of detail of this block. See below.
183 name: Name of this block.
184 func: Function to create the block Configurable.
185 prefix: Variable name prefix for this block.
186 kw: Arguments to pass to the creation function.
187
188 The creation function will be called like this:
189
190 b.func (name, BlockName = blockname, **b.kw)
191
192 where name is the name for the tool.
193
194 However, if b.func is a class deriving from D3PDObject, then the creation
195 function will instead be called like this:
196
197 b.func (level, name, parent_prefix, **b.kw)
198
199 LOD is used to control whether this block should be included.
200
201 In the simple case, this is an integer, and the block is included
202 if the block's level of detail is less than or equal to the
203 requested level of detail (unless the block was explicitly
204 included or excluded).
205
206 In the general case, LOD may be a function. The first two arguments
207 passed to the function will be the requested level of detail
208 and the block filler
209 arguments. The requested level of detail will be an integer;
210 it will be 999 if the block was explicitly included, and -999
211 if the block was explicitly excluded. The block filler arguments
212 is a dictionary of keyword arguments. The LOD function should
213 return a boolean value saying whether or not the block should
214 be included. It may also alter the dictionary of arguments
215 (this overrides all other argument settings).
216 The LOD function may optionally take a third argument; if present,
217 this is a dictionary of the arguments passed to the D3PDObject
218 (the same arguments that are passed to hook functions).
219"""
220 if prefix is not None:
221 kw = kw.copy()
222 kw['Prefix'] = prefix
223
224 # Record this block name.
225 # Also recursively record any blocks that it contains.
226 # This will check that the names are unique.
227 self._add_blockname (name)
228 if isinstance (func, D3PDObject):
229 for n in func.allBlocknames():
230 self._add_blockname (n)
231 func._parent = self
232 func._allow_args = self._allow_args
233
234 self._blocks.append (Block (name, lod, func, kw))
235 return self._blocks[-1]
236
237
238 def removeBlock (self, name, allowMissing = False):
239 """Remove the block NAME from this object."""
240 bb = None
241 for b in self._blocks:
242 if isinstance (b.func, D3PDObject):
243 if b.func.removeBlock (name, True):
244 return True
245 if b.name == name:
246 bb = b
247 break
248
249 if not bb:
250 if allowMissing:
251 return False
252 raise ValueError ('Unknown block name: ', name)
253
254 self._blocks.remove (bb)
255 self._remove_blockname (name)
256 if isinstance (bb.func, D3PDObject):
257 for n in bb.func.allBlocknames():
258 self._remove_blockname (n)
259
260 return True
261
262
263 def defineHook (self, hook):
264 """Define a new hook function for this D3PD object.
265
266 HOOK is a function that will be called for each instance
267 of this D3PD object after all block filler tools have been
268 added.
269
270 The arguments to the hook function are the object filler tool,
271 followed by the arguments that were passed to __call__.
272"""
273 self._hooks.append (hook)
274
275
276 def _add_blockname (self, n, warnonly = False):
277 """Add a new block name N to the list of all names.
278 Raises an exception if a block name is duplicated.
279"""
280 if n in self._all_blocknames:
281 if warnonly:
282 log = logging.getLogger ('D3PDObject')
283 log.warn ('Duplicate block name: %s (%s %s %s)',
284 n,
285 self._default_prefix,
286 self._default_name,
288 else:
289 raise ValueError ('Duplicate block name: %s (%s %s %s)' %
290 (n,
291 self._default_prefix,
292 self._default_name,
294 self._all_blocknames[n] = 1
295 if self._parent:
296 self._parent._add_blockname (n, True)
297 return
298
299
300 def _remove_blockname (self, n):
301 """Remove block name N."""
302 del self._all_blocknames[n]
303 if self._parent:
304 self._parent._remove_blockname (n)
305 return
306
307
308 def allBlocknames (self):
309 """Return a dictionary the keys of which are the names of all blocks
310 defined for this object. This list will include any blocks defined
311 recursively.
312"""
313 return self._all_blocknames
314
315
316 def __call__ (self,
317 level,
318 name = None,
319 prefix = None,
320 name_prefix = '',
321 parent_prefix = '',
322 object_name = None,
323 include = [],
324 exclude = [],
325 blockargs = {},
326 parent_hookargs = None,
327 *args, **kw):
328 """Create a Configurable to fill an object of this type.
329
330 Arguments:
331 level: Requested level of detail for this object. An integer.
332 name: Tool name. If omitted, one will be constructed.
333 prefix: Variable name prefix for this object.
334 name_prefix: If name wasn't specified, this is a prefix
335 to add to the tool name.
336 parent_prefix: Variable name prefix for any parent tool.
337 object_name: Name of the D3PDObject, like 'EventInfoD3PDObject'
338 include: List of block names to include, regardless
339 of level of detail.
340 exclude: List of block names to exclude, regardless
341 of level of detail.
342 blockargs: Extra arguments to pass to block filler tools.
343 The keys are block names.
344 Values are dictionaries of keyword arguments.
345 These override anything specified in defineBlock.
346 parent_hookargs: [Not to be used by user code.]
347 Dictionary of hook args from the parent,
348 to be merged into our hook arg dictionary.
349 args, kw: Additional arguments to pass to the maker function.
350 However, any entries in KW that have the form
351 BLOCK_parm, where BLOCK is a known block name,
352 will instead be interpreted as arguments to pass
353 to a block filler tool. These override entries
354 in BLOCKARGS.
355"""
356
357 # Prefix defaults to that given to the constructor.
358 if prefix is None:
359 prefix = self._default_prefix
360
361 # Object name defaults to that given in the constructor
362 if object_name is None:
363 object_name = self._default_object_name
364
365 # The tool name.
366 if name is None:
367 name = self._default_name
368 name = _make_name (name, prefix, name_prefix, parent_prefix,
369 self._default_prefix)
370
371 # Copy blockargs and kw.
372 blockargs = dict ([(k, v.copy()) for (k, v) in blockargs.items()])
373 kw = kw.copy()
374
375 # Move any block filler args from kw to blockargs.
376 for k in list (kw.keys()):
377 # It is possible for block names themselves to contain
378 # underscores. So in the case we have more than one underscore
379 # in the name, try all prefixes we can make, stopping at
380 # the first (shortest) match.
381 kk = k.split('_')
382 for i in range(1, len(kk)):
383 this_key = '_'.join (kk[:i])
384 if this_key in self._all_blocknames:
385 this_var = '_'.join (kk[i:])
386 blockargs.setdefault(this_key,{})[this_var] = kw[k]
387 del kw[k]
388 break
389
390 # Don't pass extra args listed in allow_args to the maker function.
391 kw2 = kw.copy()
392 for k in self._allow_args:
393 if k in kw2: del kw2[k]
394
395 # Call the maker function.
396 try:
397 c = self._maker (name=name, prefix=prefix, object_name=object_name,
398 *args, **kw2) # noqa: B026 (star-arg unpacking after keyword OK here
399 # because we are handling failures below)
400 except TypeError as exc:
401 if (len(exc.args) > 0 and
402 exc.args[0].find ("unexpected keyword argument 'object_name'") >= 0):
403 log = logging.getLogger ('D3PDObject')
404 log.warn ("Maker function missing `object_name' formal arg: %s", self._maker)
405 c = self._maker (name=name, prefix=prefix, *args, **kw2) # noqa: B026 (see above)
406 else:
407 raise
408
409 # Construct arguments to pass to hooks.
410 # Use a StackedDict: that allows any additions that a LOD function
411 # makes to hookargs to be visible in the rest of the D3PDObject.
412 if parent_hookargs is None:
413 parent_hookargs = {}
414 local_hookargs = {}
415 hookargs = StackedDict (local_hookargs, kw,
416 self._hookArgs, parent_hookargs)
417 local_hookargs['level'] = level
418 local_hookargs['name'] = name
419 local_hookargs['prefix'] = prefix
420 local_hookargs['name_prefix'] = name_prefix
421 local_hookargs['parent_prefix'] = parent_prefix
422 local_hookargs['include'] = include
423 local_hookargs['exclude'] = exclude
424 local_hookargs['blockargs'] = blockargs
425 local_hookargs['d3pdo'] = self
426
427 # Create block filler tools.
428 self._makeBlockFillers (c, level, parent_prefix + prefix,
429 include, exclude, blockargs, hookargs)
430
431 # We used to run the hooks from here.
432 # But in that case, we don't have access to the containing
433 # algorithm --- too early for that.
434 # So we break out the running of the hooks to a separate method
435 # that gets called after the tool gets added to the algorithm.
436 # A catch, though, is that we have to remember the arguments
437 # that we pass to the hook functions. We can't attach it
438 # to the configurable, since it doesn't have a dictionary.
439 # Instead, we need to keep a dictionary here of the tools
440 # and the corresponding hook args.
441 D3PDObject._hookArgsStore[c.getName()] = (self._hooks, args, hookargs)
442 return c
443
444
445 @staticmethod
446 def runHooks (c, flags, acc):
447 """Run creation hooks for configurable C.
448
449Should be run by the D3PD maker algorithm; not for general use.
450"""
451 info = D3PDObject._hookArgsStore.get (c.getName())
452 if info:
453 (hooks, args, hookargs) = info
454 for h in hooks:
455 h (c,
456 flags,
457 acc,
458 *args,
459 **dict(hookargs)
460 )
461 return
462
463
464 def blockFillers (self,
465 level,
466 parent_name,
467 parent_prefix = '',
468 include = [],
469 exclude = [],
470 blockargs = {},
471 hookargs = {}):
472 """Return a list of block filler tool configurables.
473
474 Arguments:
475 level: Requested level of detail for this object. An integer.
476 parent_name: Name of the parent component.
477 parent_prefix: Variable name prefix for any parent tool.
478 include: List of block names to include, regardless
479 of level of detail.
480 exclude: List of block names to exclude, regardless
481 of level of detail.
482 blockargs: Extra arguments to pass to block filler tools.
483 The keys are block names.
484 Values are dictionaries of keyword arguments.
485 These override anything specified in defineBlock.
486 hookargs: Arguments passed to the D3PD object, to be passed
487 on to LOD functions.
488 """
489 out = []
490 for b in self._blocks:
491 # Find the requested level.
492 if b.name in include:
493 # Always request inclusion.
494 reqlev = 999
495 elif b.name in exclude:
496 # Always request exclusion.
497 reqlev = -999
498 else:
499 # Request level passed in.
500 reqlev = level
501
502 # Block filler arguments.
503 args = b.kw.copy()
504 args.update (blockargs.get (b.name, {}))
505
506 # Need to copy lists in arguments; otherwise, += operations
507 # can modify the saved value.
508 # Also evaluate deferred arguments here: need to do it before
509 # calling the LOD function, as that should have the final
510 # say about any changes in the argument list.
511 for k, v in args.items():
512 if isinstance(v, list):
513 args[k] = v[:]
514 if isinstance(v, DeferArg):
515 args[k] = v(hookargs)
516
517 if _testLOD (b.lod, reqlev, args, hookargs):
518 fillername = parent_name + '_' + b.name
519 if isinstance (b.func, D3PDObject): # ugly!
520 for k in self._allow_args:
521 if k in hookargs:
522 args[k] = hookargs[k]
523 bf = b.func (level, fillername,
524 parent_prefix = parent_prefix,
525 include = include,
526 exclude = exclude,
527 blockargs = blockargs,
528 parent_hookargs = hookargs,
529 **args)
530 else:
531 bf = b.func (fillername, **args)
532
533 out += [bf]
534 if b._hooks:
535 D3PDObject._hookArgsStore[bf.getName()] = (b._hooks, args, hookargs)
536
537 return out
538
539
541 c,
542 level,
543 parent_prefix,
544 include,
545 exclude,
546 blockargs,
547 hookargs):
548 """Create block filler tools for object C, for the specified
549 level of detail.
550
551 Arguments:
552 c: Object for which to create the block fillers.
553 level: Requested level of detail for this object. An integer.
554 parent_prefix: Variable name prefix for any parent tool.
555 include: List of block names to include, regardless
556 of level of detail.
557 exclude: List of block names to exclude, regardless
558 of level of detail.
559 blockargs: Extra arguments to pass to block filler tools.
560 The keys are block names.
561 Values are dictionaries of keyword arguments.
562 These override anything specified in defineBlock.
563 hookargs: Arguments passed to the D3PD object, to be passed
564 on to LOD functions.
565"""
566 for bf in self.blockFillers (level, c.getName(), parent_prefix,
567 include, exclude, blockargs,
568 hookargs):
569 c.BlockFillers += [bf]
570 return
571
572
573
574 def copy (self,
575 default_prefix = None,
576 default_object_name = None,
577 default_name = None,
578 **kw_in):
579 """Return a copy of this D3PD object, possibly changing parameters."""
580 if default_prefix is None:
581 default_prefix = self._default_prefix
582 if default_object_name is None:
583 default_object_name = self._default_object_name
584 if default_name is None:
585 default_name = self._default_name
586 kw = self._hookArgs.copy()
587 kw.update (kw_in)
588
589 c = D3PDObject (self._maker,
590 default_prefix,
591 default_object_name,
592 default_name,
593 **kw)
594
595 #def defineBlock (self, lod, name, func, prefix = None, **kw):
596 for b in self._blocks:
597 func = b.func
598 if isinstance (func, D3PDObject):
599 func = func.copy()
600 c.defineBlock (b.lod, b.name, func, **b.kw)
601
602 for h in self._hooks:
603 c.defineHook (h)
604
605 return c
606
607
608def make_Void_D3PDObject (default_prefix = '',
609 default_object_name = '',
610 default_name = None,
611 allow_args = []):
612 """Helper to make a D3PDObject for the case where no explicit
613input object is being used.
614
615 Arguments:
616 default_prefix: The default prefix to put in front of variables.
617 default_object_name: The name of the D3PDObject which is created,
618 like 'EventInfoD3PDObject'
619 default_name: If specified, the default tool name to use
620 for these objects.
621 allow_args: Additional arguments that may be passed in when
622 instantiating the D3PDObject, but which are not
623 to be passed to the maker function. This can be
624 used to allow for additional arguments to hook
625 or level-of-detail functions.
626
627 Typical usage would be something like this:
628
629 METD3PDObject = \
630 make_Void_D3PDObject ('trig_', 'METD3PDObject')
631
632"""
633 def make_obj (name, prefix, object_name):
634 from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
635 return D3PD.VoidObjFillerTool (name,
636 Prefix = prefix,
637 ObjectName = object_name,
638 SaveMetadata = \
639 D3PDMakerFlags.SaveObjectMetadata)
640 return D3PDObject (make_obj, default_prefix, default_object_name,
641 default_name = default_name,
642 allow_args = allow_args)
643
644
645
646def make_SG_D3PDObject (default_typeName,
647 default_sgkey,
648 default_prefix,
649 default_object_name = None,
650 default_allowMissing = False,
651 default_getterClass = D3PD.SGObjGetterTool,
652 allow_args = []):
653 """Helper to make a D3PDObject for the common case where the default
654input source is a single object from StoreGate.
655
656 Arguments:
657 default_typeName: The default name of the type being
658 fetched from StoreGate.
659 default_sgkey: The default value for the StoreGate key.
660 default_prefix: The default prefix to put in front of variables.
661 default_object_name: The name of the D3PDObject which is created,
662 like 'EventInfoD3PDObject'
663 default_allowMissing: The default value for the AllowMissing
664 property (defaults to False).
665 default_getterClass: Default value to use for the getter class,
666 when we create the getter. Defaults to SGObjGetterTool.
667 allow_args: Additional arguments that may be passed in when
668 instantiating the D3PDObject, but which are not
669 to be passed to the maker function. This can be
670 used to allow for additional arguments to hook
671 or level-of-detail functions.
672
673 Typical usage would be something like this:
674
675 METD3PDObject = \
676 make_SG_D3PDObject ('MissingET',
677 D3PDMakerFlags.MissingETSGKey,
678 'met_', 'METD3PDObject')
679
680"""
681 def make_obj (name, prefix, object_name,
682 getter = None,
683 sgkey = None,
684 allowMissing = default_allowMissing,
685 typeName = default_typeName,
686 getterClass = default_getterClass):
687 if sgkey is None: sgkey = default_sgkey
688 if not getter:
689 getter = getterClass (name + '_Getter',
690 TypeName = typeName,
691 SGKey = sgkey)
692 from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
693 return D3PD.ObjFillerTool (name,
694 Prefix = prefix,
695 Getter = getter,
696 ObjectName = object_name,
697 AllowMissing=allowMissing,
698 SaveMetadata = \
699 D3PDMakerFlags.SaveObjectMetadata)
700
701 if default_object_name is None:
702 default_object_name = default_typeName
703 default_object_name = default_object_name.split('::')[-1]
704
705 return D3PDObject (make_obj, default_prefix, default_object_name,
706 sgkey = default_sgkey,
707 typeName = default_typeName,
708 allow_args = allow_args)
709
710
711
712def make_SGDataVector_D3PDObject (default_typeName,
713 default_sgkey,
714 default_prefix,
715 default_object_name = None,
716 default_allowMissing = False,
717 default_getterFilter = None,
718 default_label = None,
719 default_getterClass = \
720 D3PD.SGDataVectorGetterTool,
721 allow_args = [],
722 **other_defaults):
723 """Helper to make a D3PDObject for the common case where the default
724input source is a DataVector container from StoreGate.
725
726 Arguments:
727 default_typeName: The default name of the type being
728 fetched from StoreGate.
729 default_sgkey: The default value for the StoreGate key.
730 default_prefix: The default prefix to put in front of variables.
731 default_object_name: The name of the D3PDObject which is created,
732 like 'EventInfoD3PDObject'
733 default_allowMissing: The default value for the AllowMissing
734 property (defaults to False).
735 default_label: The default value to use for the collection label
736 (default to the prefix).
737 default_getterFilter: A collection getter filter to wrap
738 around the primary getter (defaults to no filter).
739 If this is a string, then it is interpreted as the
740 StoreGate key of a SelectedParticles object to use
741 to do the filtering.
742 default_getterClass: Default value to use for the getter class,
743 when we create the getter. Defaults to SGDataVectorGetterTool,
744 which is appropriate for iterating over a DataVector.
745 allow_args: Additional arguments that may be passed in when
746 instantiating the D3PDObject, but which are not
747 to be passed to the maker function. This can be
748 used to allow for additional arguments to hook
749 or level-of-detail functions.
750
751 Typical usage would be something like this:
752
753 JetD3PDObject = \
754 make_SGDataVector_D3PDObject ('JetCollection',
755 D3PDMakerFlags.JetSGKey,
756 'jet_', 'JetD3PDObject')
757
758 In addition, each object has automatically defined a
759 ContainerFlagFillerTool block named `SelectionFlags'.
760 This means that you can pass in an argument like
761
762 SelectionFlags_FlagNames [ 'selected@MyContainerType/mine:Objects in mine' ]
763
764 This will create a flag variable `selected' which will be true if
765 the object contained in the SG container MyContainerType/mine.
766 The string after the colon is used for documentation.
767"""
768 def make_obj (name, prefix, object_name,
769 getter = None,
770 sgkey = None,
771 label = default_label,
772 allowMissing = default_allowMissing,
773 getterFilter = default_getterFilter,
774 typeName = default_typeName,
775 getterClass = default_getterClass,
776 **kw):
777 if sgkey is None: sgkey = default_sgkey
778 if label is None: label = prefix
779 if not getter:
780 getter = getterClass (name + '_Getter',
781 TypeName = typeName,
782 SGKey = sgkey,
783 Label = label)
784 if getterFilter:
785 if isinstance(getterFilter, str):
786 selgetter = D3PD.SGObjGetterTool \
787 (name + '_SelectionGetter',
788 TypeName = 'SelectedParticles',
789 SGKey = getterFilter)
791 (name + '_GetterFilter',
792 Getter = getter,
793 SelectionGetter = selgetter)
794 else:
795 getter = getterFilter (name + '_GetterFilter',
796 Getter = getter)
797 defs = other_defaults.copy()
798 defs.update (kw)
799 from D3PDMakerConfig.D3PDMakerFlags import D3PDMakerFlags
800 return D3PD.VectorFillerTool (name,
801 Prefix = prefix,
802 Getter = getter,
803 ObjectName = object_name,
804 AllowMissing=allowMissing,
805 SaveMetadata = \
806 D3PDMakerFlags.SaveObjectMetadata,
807 **defs)
808
809 if default_object_name is None:
810 default_object_name = default_typeName
811 if default_object_name.endswith ('Collection'):
812 default_object_name = default_object_name[:-10]
813 if default_object_name.endswith ('Container'):
814 default_object_name = default_object_name[:-9]
815 default_object_name = default_object_name.split('::')[-1]
816
817 ret = D3PDObject (make_obj, default_prefix, default_object_name,
818 sgkey = default_sgkey,
819 typeName = default_typeName,
820 allow_args = allow_args)
821
822 # Automatically add SelectionFlags to each object.
823 # It won't actually create any variables unless the Flags property is set.
824 ret.defineBlock (0, 'SelectionFlags',
826
827 return ret
828
Flag objects that are present in other containers.
Object filler tool for a single object.
Getter tool to retrieve single objects from StoreGate.
A collection getter that filters the results of another based on the contents of a SelectedParticles ...
Object filler tool for a collection of objects, saved as vectors.
Object filler tool for tools taking no input.
defineBlock(self, lod, name, func, prefix=None, **kw)
copy(self, default_prefix=None, default_object_name=None, default_name=None, **kw_in)
_makeBlockFillers(self, c, level, parent_prefix, include, exclude, blockargs, hookargs)
__call__(self, level, name=None, prefix=None, name_prefix='', parent_prefix='', object_name=None, include=[], exclude=[], blockargs={}, parent_hookargs=None, *args, **kw)
removeBlock(self, name, allowMissing=False)
__init__(self, maker, default_prefix='', default_object_name='', default_name=None, allow_args=[], **kw)
blockFillers(self, level, parent_name, parent_prefix='', include=[], exclude=[], blockargs={}, hookargs={})
_add_blockname(self, n, warnonly=False)
__call__(self, hookargs={}, **kw)
Definition D3PDObject.py:90
__init__(self, str, gdict=globals(), **kw)
Definition D3PDObject.py:83
make_SG_D3PDObject(default_typeName, default_sgkey, default_prefix, default_object_name=None, default_allowMissing=False, default_getterClass=D3PD.SGObjGetterTool, allow_args=[])
_testLOD(lod, reqlev, args, hookargs)
Definition D3PDObject.py:30
_make_name(name, prefix, name_prefix, parent_prefix, default_prefix)
Definition D3PDObject.py:19
make_SGDataVector_D3PDObject(default_typeName, default_sgkey, default_prefix, default_object_name=None, default_allowMissing=False, default_getterFilter=None, default_label=None, default_getterClass=\ D3PD.SGDataVectorGetterTool, allow_args=[], **other_defaults)
make_Void_D3PDObject(default_prefix='', default_object_name='', default_name=None, allow_args=[])