The Gaudi Framework  v37r1 (a7f61348)
GaudiKernel.Configurable.ConfigurableUser Class Reference
Inheritance diagram for GaudiKernel.Configurable.ConfigurableUser:
Collaboration diagram for GaudiKernel.Configurable.ConfigurableUser:

Public Member Functions

def __init__ (self, name=Configurable.DefaultName, _enabled=True, **kwargs)
 
def getGaudiType (cls)
 
def getDlls (self)
 
def getHandle (self)
 
def __detach_used__ (self)
 
def propagateProperty (self, name, others=None, force=True)
 
def propagateProperties (self, names=None, others=None, force=True)
 
def __apply_configuration__ (self)
 
def applyConf (self)
 
def getUsedInstance (self, name)
 
def isApplicable (self)
 
- Public Member Functions inherited from GaudiKernel.Configurable.Configurable
def __new__ (cls, *args, **kwargs)
 
def __init__ (self, name=DefaultName)
 
def __getstate__ (self)
 
def __getnewargs__ (self)
 
def __setstate__ (self, dict)
 
def __len__ (self)
 
def __iter__ (self)
 
def __deepcopy__ (self, memo)
 
def __iadd__ (self, configs, descr=None)
 
def __getattr__ (self, attr)
 
def __setattr__ (self, name, value)
 
def __delattr__ (self, attr)
 
def __bool__ (self)
 
def remove (self, items)
 
def removeAll (self)
 
def copyChild (self, child)
 
def setParent (self, parentName)
 
def getParent (self)
 
def hasParent (self, parent)
 
def copyChildAndSetParent (self, cfg, parent)
 
def getChildren (self)
 
def getTools (self)
 
def children (self)
 
def getAllChildren (self)
 
def getSequence (self)
 
def setup (self)
 
def getProperties (self)
 
def getPropertiesWithDescription (self)
 
def getValuedProperties (self)
 
def properties (self)
 
def getDefaultProperties (cls)
 
def getDefaultProperty (cls, name)
 
def getProp (self, name)
 
def setProp (self, name, value)
 
def isPropertySet (self, name)
 
def getType (cls)
 
def getName (self)
 
def name (self)
 
def getJobOptName (self)
 
def isPublic (self)
 
def jobOptName (self)
 
def getFullName (self)
 
def getFullJobOptName (self)
 
def getPrintTitle (self)
 
def getTitleName (self)
 
def setDefaults (cls, handle)
 
def clone (self, name=None, **kwargs)
 
def splitName (self)
 
def addTool (self, tool, name=None)
 
def __repr__ (self)
 
def __str__ (self, indent=0, headerLastIndentUnit=indentUnit)
 
- Public Member Functions inherited from GaudiKernel.ConfigurableMeta.ConfigurableMeta
def __new__ (self, name, bases, dct)
 
def __call__ (cls, *args, **kwargs)
 

Private Member Functions

def __addActiveUseOf (self, other)
 
def __addPassiveUseOf (self, other)
 
def _instanceName (self, cls)
 

Private Attributes

 _enabled
 
 __users__
 
 _applied
 
 __used_instances__
 

Static Private Attributes

 __slots__
 
 __used_configurables__
 
 __queried_configurables__
 

Additional Inherited Members

- Static Public Attributes inherited from GaudiKernel.Configurable.Configurable
 propertyNoValue
 
 indentUnit
 
 printHeaderWidth
 
 printHeaderPre
 
 allConfigurables
 
 configurableServices
 

Detailed Description

Definition at line 1357 of file Configurable.py.

Constructor & Destructor Documentation

◆ __init__()

def GaudiKernel.Configurable.ConfigurableUser.__init__ (   self,
  name = Configurable.DefaultName,
  _enabled = True,
**  kwargs 
)

Definition at line 1377 of file Configurable.py.

1377  def __init__(self, name=Configurable.DefaultName, _enabled=True, **kwargs):
1378  super(ConfigurableUser, self).__init__(name)
1379  for n, v in kwargs.items():
1380  setattr(self, n, v)
1381  self._enabled = _enabled
1382  self.__users__ = []
1383  self._applied = False
1384 
1385  # Needed to retrieve the actual class if the declaration in __used_configurables__
1386  # and __queried_configurables__ is done with strings.
1387  from GaudiKernel.ConfigurableDb import getConfigurable as confDbGetConfigurable
1388 
1389  # Set the list of users of the used configurables
1390  #
1391  self.__used_instances__ = []
1392  for used in self.__used_configurables__:
1393  # By default we want to use the default name of the instances
1394  # for the used configurables
1395  used_name = Configurable.DefaultName
1396  # If the entry in the list is a tuple, we need a named instance
1397  if type(used) is tuple:
1398  used, used_name = used # we re-set used to re-use the code below
1399  if not used_name:
1400  used_name = self._instanceName(used)
1401  # Check is 'used' is a string or not
1402  if type(used) is str:
1403  used_class = confDbGetConfigurable(used)
1404  else:
1405  used_class = used
1406  # Instantiate the configurable that we are going to use
1407  try:
1408  inst = used_class(name=used_name, _enabled=False)
1409  except AttributeError:
1410  # This cover the case where the used configurable is not a
1411  # ConfigurableUser instance, i.e. id doesn't have the attribute
1412  # '_enabled'.
1413  inst = used_class(name=used_name)
1414  self.__addActiveUseOf(inst)
1415  for queried in self.__queried_configurables__:
1416  try:
1417  if type(queried) is str:
1418  queried = confDbGetConfigurable(queried)
1419  inst = queried(_enabled=False)
1420  except AttributeError:
1421  inst = queried()
1422  self.__addPassiveUseOf(inst)
1423 

Member Function Documentation

◆ __addActiveUseOf()

def GaudiKernel.Configurable.ConfigurableUser.__addActiveUseOf (   self,
  other 
)
private
Declare that we are going to modify the Configurable 'other' in our
__apply_configuration__.

Definition at line 1424 of file Configurable.py.

1424  def __addActiveUseOf(self, other):
1425  """
1426  Declare that we are going to modify the Configurable 'other' in our
1427  __apply_configuration__.
1428  """
1429  self.__used_instances__.append(other)
1430  if hasattr(other, "__users__"): # allow usage of plain Configurables
1431  other.__users__.append(self)
1432 

◆ __addPassiveUseOf()

def GaudiKernel.Configurable.ConfigurableUser.__addPassiveUseOf (   self,
  other 
)
private
Declare that we are going to retrieve property values from the
ConfigurableUser 'other' in our __apply_configuration__.

Definition at line 1433 of file Configurable.py.

1433  def __addPassiveUseOf(self, other):
1434  """
1435  Declare that we are going to retrieve property values from the
1436  ConfigurableUser 'other' in our __apply_configuration__.
1437  """
1438  if not isinstance(other, ConfigurableUser):
1439  raise Error(
1440  "'%s': Cannot make passive use of '%s', it is not a ConfigurableUser"
1441  % (self.name(), other.name())
1442  )
1443  other.__addActiveUseOf(self)
1444 

◆ __apply_configuration__()

def GaudiKernel.Configurable.ConfigurableUser.__apply_configuration__ (   self)
Function to be overridden to convert the high level configuration into a
low level one.
The default implementation calls applyConf, which is the method defined
in some ConfigurableUser implementations.

Reimplemented in ConfigurableUser.ExampleApplication, ConfigurableUser.ExampleCommon, GaudiExamples.Configuration.GaudiExamplesCommonConf, ConfigurableUser.ExampleIO, and Gaudi.ConfUser.GaudiPersistency.

Definition at line 1524 of file Configurable.py.

1524  def __apply_configuration__(self):
1525  """
1526  Function to be overridden to convert the high level configuration into a
1527  low level one.
1528  The default implementation calls applyConf, which is the method defined
1529  in some ConfigurableUser implementations.
1530  """
1531  return self.applyConf()
1532 

◆ __detach_used__()

def GaudiKernel.Configurable.ConfigurableUser.__detach_used__ (   self)
Remove this ConfigurableUser instance from the users list of the used
instances.

Definition at line 1455 of file Configurable.py.

1455  def __detach_used__(self):
1456  """
1457  Remove this ConfigurableUser instance from the users list of the used
1458  instances.
1459  """
1460  for used in self.__used_instances__:
1461  if hasattr(used, "__users__"): # allow usage of plain Configurables
1462  used.__users__.remove(self)
1463 

◆ _instanceName()

def GaudiKernel.Configurable.ConfigurableUser._instanceName (   self,
  cls 
)
private
Function used to define the name of the private instance of a given class
name.
This method is used when the __used_configurables_property__ declares the
need of a private used configurable without specifying the name.

Definition at line 1540 of file Configurable.py.

1540  def _instanceName(self, cls):
1541  """
1542  Function used to define the name of the private instance of a given class
1543  name.
1544  This method is used when the __used_configurables_property__ declares the
1545  need of a private used configurable without specifying the name.
1546  """
1547  if type(cls) is str:
1548  clName = cls
1549  else:
1550  clName = cls.__name__
1551  return "%s_%s" % (self.name(), clName)
1552 

◆ applyConf()

def GaudiKernel.Configurable.ConfigurableUser.applyConf (   self)
Function to be overridden to convert the high level configuration into a
low level one.

Definition at line 1533 of file Configurable.py.

1533  def applyConf(self):
1534  """
1535  Function to be overridden to convert the high level configuration into a
1536  low level one.
1537  """
1538  pass
1539 

◆ getDlls()

def GaudiKernel.Configurable.ConfigurableUser.getDlls (   self)

Definition at line 1449 of file Configurable.py.

1449  def getDlls(self):
1450  return None
1451 

◆ getGaudiType()

def GaudiKernel.Configurable.ConfigurableUser.getGaudiType (   cls)

Definition at line 1446 of file Configurable.py.

1446  def getGaudiType(cls):
1447  return "User"
1448 

◆ getHandle()

def GaudiKernel.Configurable.ConfigurableUser.getHandle (   self)

Definition at line 1452 of file Configurable.py.

1452  def getHandle(self):
1453  return None
1454 

◆ getUsedInstance()

def GaudiKernel.Configurable.ConfigurableUser.getUsedInstance (   self,
  name 
)
Return the used instance with a given name.

Definition at line 1553 of file Configurable.py.

1553  def getUsedInstance(self, name):
1554  """
1555  Return the used instance with a given name.
1556  """
1557  for i in self.__used_instances__:
1558  if i.name() == name:
1559  if hasattr(i, "_enabled"):
1560  # ensure that the instances retrieved through the method are
1561  # enabled
1562  i._enabled = True
1563  return i
1564  raise KeyError(name)
1565 

◆ isApplicable()

def GaudiKernel.Configurable.ConfigurableUser.isApplicable (   self)
Return True is the instance can be "applied".

Reimplemented from GaudiKernel.Configurable.Configurable.

Definition at line 1566 of file Configurable.py.

1566  def isApplicable(self):
1567  """
1568  Return True is the instance can be "applied".
1569  """
1570  return (not self.__users__) and (not self._applied)
1571 
1572 
1573 # list of callables to be called after all the __apply_configuration__ are called.

◆ propagateProperties()

def GaudiKernel.Configurable.ConfigurableUser.propagateProperties (   self,
  names = None,
  others = None,
  force = True 
)
Call propagateProperty for each property listed in 'names'.
If 'names' is None, all the properties are propagated.

Definition at line 1513 of file Configurable.py.

1513  def propagateProperties(self, names=None, others=None, force=True):
1514  """
1515  Call propagateProperty for each property listed in 'names'.
1516  If 'names' is None, all the properties are propagated.
1517  """
1518  if names is None:
1519  # use all the non-private slots
1520  names = [p for p in self.__slots__ if not p.startswith("_")]
1521  for n in names:
1522  self.propagateProperty(n, others, force)
1523 

◆ propagateProperty()

def GaudiKernel.Configurable.ConfigurableUser.propagateProperty (   self,
  name,
  others = None,
  force = True 
)
Propagate the property 'name' (if set) to other configurables (if possible).
'others' can be:
    None:
propagate to all the entries in __used_configurables__
    a configurable instance:
propagate only to it
    list of configurable instances:
propagate to all of them.


The logic is:
- if the local property is set, the other property will be overwritten
- local property not set and other set => keep other
- local property not set and other not set => overwrite the default for
    ConfigurableUser instances and set the property for Configurables

Definition at line 1464 of file Configurable.py.

1464  def propagateProperty(self, name, others=None, force=True):
1465  """
1466  Propagate the property 'name' (if set) to other configurables (if possible).
1467  'others' can be:
1468  None:
1469  propagate to all the entries in __used_configurables__
1470  a configurable instance:
1471  propagate only to it
1472  list of configurable instances:
1473  propagate to all of them.
1474 
1475 
1476  The logic is:
1477  - if the local property is set, the other property will be overwritten
1478  - local property not set and other set => keep other
1479  - local property not set and other not set => overwrite the default for
1480  ConfigurableUser instances and set the property for Configurables
1481  """
1482  # transform 'others' to a list of configurable instances
1483  if others is None:
1484  others = self.__used_instances__
1485  elif type(others) not in [list, tuple]:
1486  others = [others]
1487  # these can be computed before the loop
1488  local_is_set = self.isPropertySet(name)
1489  value = self.getProp(name)
1490  # loop over the others that do have 'name' in their slots
1491  for other in [o for o in others if name in o.__slots__]:
1492  # If self property is set, use it
1493  if local_is_set:
1494  if other.isPropertySet(name):
1495  log.warning(
1496  "Property '%(prop)s' is set in both '%(self)s' and '%(other)s', using '%(self)s.%(prop)s'"
1497  % {"self": self.name(), "other": other.name(), "prop": name}
1498  )
1499  other.setProp(name, value)
1500  # If not, and other property also not set, propagate the default
1501  elif not other.isPropertySet(name):
1502  if isinstance(other, ConfigurableUser):
1503  otherType = type(other._properties[name].getDefault())
1504  other._properties[name].setDefault(value)
1505  if otherType in [list, dict]:
1506  # Special case for list and dictionaries:
1507  # also set the property to the same value of the default (copy)
1508  other.setProp(name, otherType(value))
1509  else:
1510  other.setProp(name, value)
1511  # If not set and other set, do nothing
1512 

Member Data Documentation

◆ __queried_configurables__

GaudiKernel.Configurable.ConfigurableUser.__queried_configurables__
staticprivate

Definition at line 1375 of file Configurable.py.

◆ __slots__

GaudiKernel.Configurable.ConfigurableUser.__slots__
staticprivate

Definition at line 1358 of file Configurable.py.

◆ __used_configurables__

GaudiKernel.Configurable.ConfigurableUser.__used_configurables__
staticprivate

Definition at line 1372 of file Configurable.py.

◆ __used_instances__

GaudiKernel.Configurable.ConfigurableUser.__used_instances__
private

Definition at line 1391 of file Configurable.py.

◆ __users__

GaudiKernel.Configurable.ConfigurableUser.__users__
private

Definition at line 1382 of file Configurable.py.

◆ _applied

GaudiKernel.Configurable.ConfigurableUser._applied
private

Definition at line 1383 of file Configurable.py.

◆ _enabled

GaudiKernel.Configurable.ConfigurableUser._enabled
private

Definition at line 1381 of file Configurable.py.


The documentation for this class was generated from the following file:
gaudirun.type
type
Definition: gaudirun.py:162
GaudiKernel.ConfigurableDb
Definition: ConfigurableDb.py:1