From afaea89ea693b5e8b87cbf02597c30b1443e30cf Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Thu, 5 May 2022 17:02:36 +0200 Subject: [PATCH 1/4] allow missing frappy_config, stick_rotation_alias --- commands.py | 11 ++++++++--- devices.py | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/commands.py b/commands.py index 8a97dc1..372478b 100644 --- a/commands.py +++ b/commands.py @@ -30,6 +30,7 @@ from nicos.utils import printTable from nicos.commands import helparglist, usercommand from nicos.commands.basic import AddSetup, CreateAllDevices, CreateDevice from nicos.devices.secop import get_attaching_devices +from nicos_sinq.frappy_sinq.devices import applyAliasConfig home = expanduser('~') if home not in sys.path: @@ -68,8 +69,9 @@ def all_info(all_cfg): def frappy_start(service, cfg=None): if service not in SERVICES: raise ValueError('unknown service %s' % service) - frappy_config = session.devices['frappy_config'] - frappy_config.remove_aliases() + frappy_config = session.devices.get('frappy_config') + # if frappy_config(): + # frappy_config.remove_aliases() if cfg == '': seaconn = session.devices.get('seaconn') if seaconn and seaconn._attached_secnode: @@ -108,7 +110,10 @@ def frappy_start(service, cfg=None): if cfg is not None: cleanup_defunct() CreateAllDevices() - frappy_config.set_envlist() + if frappy_config: + frappy_config.set_envlist() + else: + applyAliasConfig() if startnode and cfg == '': startnode.disable() return all_cfg diff --git a/devices.py b/devices.py index e113c20..8e06745 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, UsageError from nicos.devices.secop import SecNodeDevice from nicos.core import Device, anytype, listof from nicos.utils.comparestrings import compare @@ -87,12 +87,15 @@ class FrappyConfig(Device): 'rotation_z': Param( 'config for sample rotation', type=anytype, default={'alias': 'stickrot', 'envlist': False}), + 'stick_rotation_alias': Param( + 'alias to assign stick rotation', type=str, settable=True, default=''), 'nodes': Param( 'list of names of potential SEC nodes', type=listof(str), default=[]), } meanings = list(parameters) meanings.remove('nodes') + meanings.remove('assign_stick_rotation') def remove_aliases(self): for meaning in self.meanings: @@ -107,12 +110,25 @@ class FrappyConfig(Device): session.configured_devices.pop(aliasname, None) session.dynamic_devices.pop(aliasname, None) + def get_se_aliases(self): + result = {} + for meaning in self.meanings: + info = getattr(self, meaning) + aliasnames = info['alias'] + if isinstance(aliasname, str): + aliasnames = [aliasnames] + for aliasname in aliasnames: + aliasdev = session.devices.get(aliasname) + if aliasdev: + result[aliasname] = aliasdev + def set_envlist(self): """create aliases for SECoP devices depending on their meaning """ - self.remove_aliases() + previous_aliases = self.get_se_aliases() + # self.remove_aliases() nodedevs = filter(None, [session.devices.get(devname) for devname in self.nodes]) sample_devices = {} @@ -157,11 +173,15 @@ class FrappyConfig(Device): continue if dev: for aliasname in aliasnames: - 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 = previous_aliases.pop(aliasname, None) + if aliasdev: + session.log.debug('change alias %r -> %r', aliasname, devname) + else: + session.log.debug('create alias %r -> %r', aliasname, devname) + devcfg = ('nicos.core.DeviceAlias', {}) + aliasdev = session.createDevice(aliasname, recreate=True, explicit=True) aliasdev.alias = devname aliasname = aliasnames[0] if devname not in devset and envlistflag: @@ -175,6 +195,11 @@ class FrappyConfig(Device): for aliasname in aliasnames: newenv.pop(aliasname, None) + for aliasname in previous_aliases: + session.destroyDevice(aliasname) + session.configured_devices.pop(aliasname, None) + session.dynamic_devices.pop(aliasname, None) + applyAliasConfig() # for other aliases if set(newenv) != set(session.experiment.envlist): session.experiment.setEnvironment(list(newenv)) From a456819c4a6dfefe091be5521f91fb90557a9b1e Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Thu, 5 May 2022 17:04:32 +0200 Subject: [PATCH 2/4] fix stick_rotations_alias name --- devices.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devices.py b/devices.py index 8e06745..32c5342 100644 --- a/devices.py +++ b/devices.py @@ -95,7 +95,7 @@ class FrappyConfig(Device): meanings = list(parameters) meanings.remove('nodes') - meanings.remove('assign_stick_rotation') + meanings.remove('stick_rotation_alias') def remove_aliases(self): for meaning in self.meanings: From b80157c32d20dcd51966683cc2604b2ab2f93dde Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Thu, 5 May 2022 17:06:07 +0200 Subject: [PATCH 3/4] fix typo --- devices.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devices.py b/devices.py index 32c5342..30fd405 100644 --- a/devices.py +++ b/devices.py @@ -115,7 +115,7 @@ class FrappyConfig(Device): for meaning in self.meanings: info = getattr(self, meaning) aliasnames = info['alias'] - if isinstance(aliasname, str): + if isinstance(aliasnames, str): aliasnames = [aliasnames] for aliasname in aliasnames: aliasdev = session.devices.get(aliasname) From 96dba6e6939e7e88a58ade5173925bf3e3b49654 Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Thu, 5 May 2022 17:07:34 +0200 Subject: [PATCH 4/4] missing return value in get_se_aliases --- devices.py | 1 + 1 file changed, 1 insertion(+) diff --git a/devices.py b/devices.py index 30fd405..1cbcbbd 100644 --- a/devices.py +++ b/devices.py @@ -121,6 +121,7 @@ class FrappyConfig(Device): aliasdev = session.devices.get(aliasname) if aliasdev: result[aliasname] = aliasdev + return result def set_envlist(self): """create aliases for SECoP devices