From cbbec5647c5b6d27c80e834bffe637b827f228f4 Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Thu, 25 Aug 2022 09:29:25 +0200 Subject: [PATCH] improved code for envlist modification previous matching devices are removed, also when the previous was an alias pointing to the same device --- devices.py | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/devices.py b/devices.py index 267e4ef..b177e7d 100644 --- a/devices.py +++ b/devices.py @@ -31,7 +31,7 @@ import os from os.path import expanduser from nicos import config, session -from nicos.core import Override, Param, Moveable, status +from nicos.core import Override, Param, Moveable, status, DeviceAlias from nicos.devices.secop import SecNodeDevice from nicos.core import Device, anytype, listof from nicos.utils.comparestrings import compare @@ -133,8 +133,13 @@ class FrappyConfig(Device): meaning_name, importance = meaning sample_devices.setdefault(meaning_name, []).append((importance, devname)) - devset = set() - newenv = {e: 1 for e in session.experiment.envlist} # use dict instead of set because of order + envlist = list(session.experiment.envlist) + prev_env_alias = {} # dict [devname] of aliasname of previous aliases in envlist + for devname in envlist: + dev = session.device.get(devname) + if isinstance(dev, DeviceAlias): + prev_env_alias[devname] = dev.alias + newenv = {} for meaning in self.meanings: info = getattr(self, meaning) aliasnames = info.get('alias') @@ -162,20 +167,21 @@ class FrappyConfig(Device): session.log.debug('create alias %r -> %r', aliasname, devname) aliasdev = session.createDevice(aliasname, recreate=True, explicit=True) aliasdev.alias = devname + # only the first item of aliasnames is added to the envlist aliasname = aliasnames[0] - if devname not in devset and info.get('envlist', True): - # take only the first one + if devname in envlist: + envlist.remove(devname) + else: + prev_alias = prev_env_alias[devname] + if prev_alias in envlist: + envlist.remove(prev_alias) + if devname not in newenv and info.get('envlist', True): # example: when 'temperature' and 'temperature_regulation' are the - # same device, it is not added twice - devset.add(devname) - newenv[aliasname] = 1 - elif aliasname in newenv: - newenv.pop(aliasname, None) + # same device, the first one is kept + newenv[devname] = aliasname break else: - for aliasname in aliasnames: - if aliasname in newenv: - newenv.pop(aliasname, None) + envlist = [k for k in envlist if k not in aliasnames] for aliasname in previous_aliases: session.destroyDevice(aliasname) @@ -183,8 +189,10 @@ class FrappyConfig(Device): session.dynamic_devices.pop(aliasname, None) applyAliasConfig() # for other aliases - if set(newenv) != set(session.experiment.envlist): - session.experiment.setEnvironment(list(newenv)) + + envlist.extend(newenv.values()) + if set(envlist) != set(session.experiment.envlist): + session.experiment.setEnvironment(envlist) session.log.info('changed environment to: %s', ', '.join(session.experiment.envlist))