The Gaudi Framework  v39r2 (37c0b60a)
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 1361 of file Configurable.py.

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 1381 of file Configurable.py.

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

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 1428 of file Configurable.py.

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

◆ __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 1437 of file Configurable.py.

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

◆ __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, Configuration.GaudiTestSuiteCommonConf, Gaudi.ConfUser.GaudiPersistency, and ConfigurableUser.ExampleIO.

Definition at line 1528 of file Configurable.py.

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

◆ __detach_used__()

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

Definition at line 1459 of file Configurable.py.

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

◆ _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 1544 of file Configurable.py.

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

◆ 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 1537 of file Configurable.py.

1537  def applyConf(self):
1538  """
1539  Function to be overridden to convert the high level configuration into a
1540  low level one.
1541  """
1542  pass
1543 

◆ getDlls()

def GaudiKernel.Configurable.ConfigurableUser.getDlls (   self)

Definition at line 1453 of file Configurable.py.

1453  def getDlls(self):
1454  return None
1455 

◆ getGaudiType()

def GaudiKernel.Configurable.ConfigurableUser.getGaudiType (   cls)

Definition at line 1450 of file Configurable.py.

1450  def getGaudiType(cls):
1451  return "User"
1452 

◆ getHandle()

def GaudiKernel.Configurable.ConfigurableUser.getHandle (   self)

Definition at line 1456 of file Configurable.py.

1456  def getHandle(self):
1457  return None
1458 

◆ getUsedInstance()

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

Definition at line 1557 of file Configurable.py.

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

◆ isApplicable()

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

Reimplemented from GaudiKernel.Configurable.Configurable.

Definition at line 1570 of file Configurable.py.

1570  def isApplicable(self):
1571  """
1572  Return True is the instance can be "applied".
1573  """
1574  return (not self.__users__) and (not self._applied)
1575 
1576 
1577 # 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 1517 of file Configurable.py.

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

◆ 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 1468 of file Configurable.py.

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

Member Data Documentation

◆ __queried_configurables__

GaudiKernel.Configurable.ConfigurableUser.__queried_configurables__
staticprivate

Definition at line 1379 of file Configurable.py.

◆ __slots__

GaudiKernel.Configurable.ConfigurableUser.__slots__
staticprivate

Definition at line 1362 of file Configurable.py.

◆ __used_configurables__

GaudiKernel.Configurable.ConfigurableUser.__used_configurables__
staticprivate

Definition at line 1376 of file Configurable.py.

◆ __used_instances__

GaudiKernel.Configurable.ConfigurableUser.__used_instances__
private

Definition at line 1395 of file Configurable.py.

◆ __users__

GaudiKernel.Configurable.ConfigurableUser.__users__
private

Definition at line 1386 of file Configurable.py.

◆ _applied

GaudiKernel.Configurable.ConfigurableUser._applied
private

Definition at line 1387 of file Configurable.py.

◆ _enabled

GaudiKernel.Configurable.ConfigurableUser._enabled
private

Definition at line 1385 of file Configurable.py.


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