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 (self)
 
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 __nonzero__ (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)
 

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

dictionary __slots__
 
list __used_configurables__ = []
 list of ConfigurableUser classes this one is going to modify in the apply_configuration method. More...
 
list __queried_configurables__ = []
 list of ConfigurableUser classes this one is going to query in the apply_configuration method More...
 

Additional Inherited Members

- Static Public Attributes inherited from GaudiKernel.Configurable.Configurable
 propertyNoValue
 
string indentUnit = '| '
 
int printHeaderWidth = 100
 
int printHeaderPre = 5
 
dictionary allConfigurables = {}
 
dictionary configurableServices = {}
 

Detailed Description

Definition at line 1170 of file Configurable.py.

Constructor & Destructor Documentation

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

Definition at line 1187 of file Configurable.py.

1187  def __init__( self, name = Configurable.DefaultName, _enabled = True, **kwargs ):
1188  super( ConfigurableUser, self ).__init__( name )
1189  for n, v in kwargs.items():
1190  setattr(self, n, v)
1191  self._enabled = _enabled
1192  self.__users__ = []
1193  self._applied = False
1194 
1195  # Needed to retrieve the actual class if the declaration in __used_configurables__
1196  # and __queried_configurables__ is done with strings.
1197  from GaudiKernel.ConfigurableDb import getConfigurable as confDbGetConfigurable
1198 
1199  # Set the list of users of the used configurables
1200  #
1202  for used in self.__used_configurables__:
1203  # By default we want to use the default name of the instances
1204  # for the used configurables
1205  used_name = Configurable.DefaultName
1206  # If the entry in the list is a tuple, we need a named instance
1207  if type(used) is tuple:
1208  used, used_name = used # we re-set used to re-use the code below
1209  if not used_name:
1210  used_name = self._instanceName(used)
1211  # Check is 'used' is a string or not
1212  if type(used) is str:
1213  used_class = confDbGetConfigurable(used)
1214  else:
1215  used_class = used
1216  # Instantiate the configurable that we are going to use
1217  try:
1218  inst = used_class(name = used_name, _enabled = False)
1219  except AttributeError:
1220  # This cover the case where the used configurable is not a
1221  # ConfigurableUser instance, i.e. id doesn't have the attribute
1222  # '_enabled'.
1223  inst = used_class(name = used_name)
1224  self.__addActiveUseOf(inst)
1225  for queried in self.__queried_configurables__:
1226  try:
1227  if type(queried) is str:
1228  queried = confDbGetConfigurable(used)
1229  inst = queried(_enabled = False)
1230  except AttributeError:
1231  inst = queried()
1232  self.__addPassiveUseOf(inst)
list __queried_configurables__
list of ConfigurableUser classes this one is going to query in the apply_configuration method ...
def __init__(self, name=Configurable.DefaultName, _enabled=True, kwargs)
list __used_configurables__
list of ConfigurableUser classes this one is going to modify in the apply_configuration method...

Member Function Documentation

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

1233  def __addActiveUseOf(self, other):
1234  """
1235  Declare that we are going to modify the Configurable 'other' in our
1236  __apply_configuration__.
1237  """
1238  self.__used_instances__.append(other)
1239  if hasattr(other, "__users__"): # allow usage of plain Configurables
1240  other.__users__.append(self)
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 1241 of file Configurable.py.

1241  def __addPassiveUseOf(self, other):
1242  """
1243  Declare that we are going to retrieve property values from the
1244  ConfigurableUser 'other' in our __apply_configuration__.
1245  """
1246  if not isinstance(other, ConfigurableUser):
1247  raise Error("'%s': Cannot make passive use of '%s', it is not a ConfigurableUser" % (self.name(), other.name()))
1248  other.__addActiveUseOf(self)
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.

Definition at line 1325 of file Configurable.py.

1326  """
1327  Function to be overridden to convert the high level configuration into a
1328  low level one.
1329  The default implementation calls applyConf, which is the method defined
1330  in some ConfigurableUser implementations.
1331  """
1332  return self.applyConf()
1333 
def GaudiKernel.Configurable.ConfigurableUser.__detach_used__ (   self)
Remove this ConfigurableUser instance from the users list of the used
instances.

Definition at line 1256 of file Configurable.py.

1256  def __detach_used__(self):
1257  """
1258  Remove this ConfigurableUser instance from the users list of the used
1259  instances.
1260  """
1261  for used in self.__used_instances__:
1262  if hasattr(used, "__users__"): # allow usage of plain Configurables
1263  used.__users__.remove(self)
1264 
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 1341 of file Configurable.py.

1341  def _instanceName(self, cls):
1342  """
1343  Function used to define the name of the private instance of a given class
1344  name.
1345  This method is used when the __used_configurables_property__ declares the
1346  need of a private used configurable without specifying the name.
1347  """
1348  if type(cls) is str:
1349  clName = cls
1350  else:
1351  clName = cls.__name__
1352  return "%s_%s" % (self.name(), clName)
1353 
def GaudiKernel.Configurable.ConfigurableUser.applyConf (   self)
Function to be overridden to convert the high level configuration into a
low level one.

Definition at line 1334 of file Configurable.py.

1334  def applyConf( self ):
1335  """
1336  Function to be overridden to convert the high level configuration into a
1337  low level one.
1338  """
1339  pass
1340 
def GaudiKernel.Configurable.ConfigurableUser.getDlls (   self)

Definition at line 1251 of file Configurable.py.

1251  def getDlls( self ):
1252  return None
def GaudiKernel.Configurable.ConfigurableUser.getGaudiType (   self)

Definition at line 1249 of file Configurable.py.

1249  def getGaudiType( self ):
1250  return 'User'
def GaudiKernel.Configurable.ConfigurableUser.getHandle (   self)

Definition at line 1253 of file Configurable.py.

1253  def getHandle( self ):
1254  return None
1255 
def GaudiKernel.Configurable.ConfigurableUser.getUsedInstance (   self,
  name 
)
Return the used instance with a given name.

Definition at line 1354 of file Configurable.py.

1354  def getUsedInstance(self, name):
1355  """
1356  Return the used instance with a given name.
1357  """
1358  for i in self.__used_instances__:
1359  if i.name() == name:
1360  if hasattr(i, "_enabled"):
1361  # ensure that the instances retrieved through the method are
1362  # enabled
1363  i._enabled = True
1364  return i
1365  raise KeyError(name)
1366 
def GaudiKernel.Configurable.ConfigurableUser.isApplicable (   self)
Return True is the instance can be "applied".

Definition at line 1367 of file Configurable.py.

1367  def isApplicable(self):
1368  '''
1369  Return True is the instance can be "applied".
1370  '''
1371  return (not self.__users__) and (not self._applied)
1372 
1373 
1374 # list of callables to be called after all the __apply_configuration__ are called.
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 1314 of file Configurable.py.

1314  def propagateProperties(self, names = None, others = None, force = True):
1315  """
1316  Call propagateProperty for each property listed in 'names'.
1317  If 'names' is None, all the properties are propagated.
1318  """
1319  if names is None:
1320  # use all the non-private slots
1321  names = [ p for p in self.__slots__ if not p.startswith("_") ]
1322  for n in names:
1323  self.propagateProperty(n, others, force)
1324 
def propagateProperty(self, name, others=None, force=True)
def propagateProperties(self, names=None, others=None, force=True)
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 1265 of file Configurable.py.

1265  def propagateProperty(self, name, others = None, force = True):
1266  """
1267  Propagate the property 'name' (if set) to other configurables (if possible).
1268  'others' can be:
1269  None:
1270  propagate to all the entries in __used_configurables__
1271  a configurable instance:
1272  propagate only to it
1273  list of configurable instances:
1274  propagate to all of them.
1275 
1276 
1277  The logic is:
1278  - if the local property is set, the other property will be overwritten
1279  - local property not set and other set => keep other
1280  - local property not set and other not set => overwrite the default for
1281  ConfigurableUser instances and set the property for Configurables
1282  """
1283  # transform 'others' to a list of configurable instances
1284  if others is None:
1285  others = self.__used_instances__
1286  elif type(others) not in [ list, tuple ] :
1287  others = [ others ]
1288  # these can be computed before the loop
1289  local_is_set = self.isPropertySet(name)
1290  value = self.getProp(name)
1291  # loop over the others that do have 'name' in their slots
1292  for other in [ o for o in others if name in o.__slots__ ]:
1293  # If self property is set, use it
1294  if local_is_set:
1295  if other.isPropertySet(name):
1296  log.warning("Property '%(prop)s' is set in both '%(self)s' and '%(other)s', using '%(self)s.%(prop)s'"%
1297  { "self": self.name(),
1298  "other": other.name(),
1299  "prop": name } )
1300  other.setProp(name, value)
1301  # If not, and other property also not set, propagate the default
1302  elif not other.isPropertySet(name):
1303  if isinstance(other,ConfigurableUser):
1304  otherType = type(other._properties[name].getDefault())
1305  other._properties[name].setDefault(value)
1306  if otherType in [list, dict]:
1307  # Special case for list and dictionaries:
1308  # also set the property to the same value of the default (copy)
1309  other.setProp(name, otherType(value))
1310  else:
1311  other.setProp(name, value)
1312  # If not set and other set, do nothing
1313 
def propagateProperty(self, name, others=None, force=True)

Member Data Documentation

list GaudiKernel.Configurable.ConfigurableUser.__queried_configurables__ = []
staticprivate

list of ConfigurableUser classes this one is going to query in the apply_configuration method

Definition at line 1186 of file Configurable.py.

dictionary GaudiKernel.Configurable.ConfigurableUser.__slots__
staticprivate
Initial value:
1 = { "__users__": [],
2  "__used_instances__": [],
3  "_enabled": True,
4  "_applied": False }

Definition at line 1171 of file Configurable.py.

list GaudiKernel.Configurable.ConfigurableUser.__used_configurables__ = []
staticprivate

list of ConfigurableUser classes this one is going to modify in the apply_configuration method.

The list may contain class objects, strings representing class objects or tuples with the class object (or a string) as first element and the instance name as second element. If the instance name is None or not present, the function instanceName() is used to determine the name of the instance (the default implementation returns "<this name></em><other name>".

Definition at line 1183 of file Configurable.py.

GaudiKernel.Configurable.ConfigurableUser.__used_instances__
private

Definition at line 1201 of file Configurable.py.

GaudiKernel.Configurable.ConfigurableUser.__users__
private

Definition at line 1192 of file Configurable.py.

GaudiKernel.Configurable.ConfigurableUser._applied
private

Definition at line 1193 of file Configurable.py.

GaudiKernel.Configurable.ConfigurableUser._enabled
private

Definition at line 1191 of file Configurable.py.


The documentation for this class was generated from the following file: