move set_se_list to frappy_config.set_envlist

This commit is contained in:
2022-05-02 09:38:36 +02:00
parent c974edede9
commit aaaca072e4
3 changed files with 84 additions and 89 deletions

View File

@ -35,6 +35,7 @@ from nicos.core import Override, Param, Moveable, status
from nicos.devices.secop import SecNodeDevice
from nicos.core import Device, anytype, listof
from nicos.utils.comparestrings import compare
from nicos_sinq.frappy_sinq.commands import applyAliasConfig
from servicemanager import FrappyManager
@ -72,6 +73,84 @@ class FrappyConfig(Device):
meanings = list(parameters)
meanings.remove('nodes')
def remove_aliases(self):
for meaning in self.meanings:
info = getattr(self, meaning)
aliasname = info['alias']
aliasdev = session.devices.get(aliasname)
if aliasdev:
session.destroyDevice(aliasname)
session.configured_devices.pop(aliasname, None)
session.dynamic_devices.pop(aliasname, None)
def set_envlist(self):
"""create aliases for SECoP devices
depending on their meaning
"""
self.remove_aliases()
nodedevs = filter(None, [session.devices.get(devname) for devname in self.nodes])
sample_devices = {}
for nodedev in nodedevs:
secnode = nodedev._secnode
if not secnode:
continue
for devname, (_, desc) in nodedev.setup_info.items():
secop_module = desc['secop_module']
meaning = secnode.modules[secop_module]['properties'].get('meaning')
if meaning:
meaning_name, importance = meaning
sample_devices.setdefault(meaning_name, []).append((importance, devname))
devset = set()
newenv = {e: None for e in session.experiment.envlist} # use dict instead of set because of order
drivables = {}
for meaning in self.meanings:
info = getattr(self, meaning)
aliasname = info['alias']
envlistflag = info.get('envlist', True)
aliascfg = info.get('targets', {})
importance_list = sample_devices.get(meaning, [])
importance_list.extend([(nr, nam) for nam, nr in aliascfg.items() if nam in session.devices])
importance_list = sorted(importance_list, reverse=True)
session.log.debug('%s: %r', meaning, importance_list)
prefix, _, postfix = meaning.partition('_')
if postfix == 'drivable':
# append the previously collected drivables in the group to the importance_list
group = drivables.get(prefix, {})
for key in 'regulation', '':
if key in group:
importance_list.append((None, group[key]))
for _, devname, in importance_list:
dev = session.devices.get(devname)
if isinstance(dev, Moveable):
drivables.setdefault(prefix, {})[postfix] = devname
elif postfix == 'drivable':
# marked as xxx_drivable, but not really drivable: skip
continue
if dev:
session.log.debug('create alias %r pointing to %r', aliasname, devname)
devcfg = ('nicos.core.DeviceAlias', {})
session.configured_devices[aliasname] = devcfg
session.dynamic_devices[aliasname] = 'frappy'
aliasdev = session.createDevice(aliasname, recreate=True, explicit=True)
aliasdev.alias = devname
if devname not in devset and envlistflag:
# take only the first one
devset.add(devname)
newenv[aliasname] = None
else:
newenv.pop(aliasname, None)
break
else:
newenv.pop(aliasname, None)
applyAliasConfig() # for other aliases
if set(newenv) != set(session.experiment.envlist):
session.experiment.setEnvironment(list(newenv))
session.log.info('changed environment to: %s', ', '.join(session.experiment.envlist))
class FrappyNode(SecNodeDevice, Moveable):
"""SEC node device