From 3301ce4a3f46b2fb4302fbe76d0d71324cd4eebe Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Fri, 4 Dec 2020 18:41:08 +0100 Subject: [PATCH] split Double_Crystal_Mono into DoubleCrystalMono (Device) and DoubleCrystalMonoEnergy (Adjustable) --- slic/devices/xoptics/dcm.py | 58 ++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/slic/devices/xoptics/dcm.py b/slic/devices/xoptics/dcm.py index 8cf80a8e..b5ac897e 100755 --- a/slic/devices/xoptics/dcm.py +++ b/slic/devices/xoptics/dcm.py @@ -2,9 +2,10 @@ from time import sleep import numpy as np from epics import PV -from ..basedevice import BaseDevice +from slic.core.adjustable import Adjustable from slic.devices.general.motor import Motor from slic.core.task import Task +from ..device import Device class EcolEnergy: @@ -38,25 +39,20 @@ class EcolEnergy: return Task(changer, hold=hold) -class Double_Crystal_Mono(BaseDevice): - def __init__(self, Id, z_undulator=None, description=None): - self.Id = Id - self.z_undulator = z_undulator - self.description = description - self.theta = Motor(Id + ":RX12") - self.x = Motor(Id + ":TX12") - self.gap = Motor(Id + ":T2") - self.roll1 = Motor(Id + ":RZ1") - self.roll2 = Motor(Id + ":RZ2") - self.pitch2 = Motor(Id + ":RX2") + +class DoubleCrystalMonoEnergy(Adjustable): + + def __init__(self, Id): + super().__init__(Id) self.energy_rbk = PV(Id + ":ENERGY") self.energy_sp = PV(Id + ":ENERGY_SP") - self.moving = PV(Id + ":MOVING") + self._moving = PV(Id + ":MOVING") self._stop = PV(Id + ":STOP.PROC") + def move_and_wait(self, value, checktime=0.01, precision=0.5): self.energy_sp.put(value) while abs(self.wait_for_valid_value() - value) > precision: @@ -83,7 +79,7 @@ class Double_Crystal_Mono(BaseDevice): self.energy_sp.put(value) def is_moving(self): - inmotion = int(self.moving.get()) + inmotion = int(self._moving.get()) return not bool(inmotion) # spec-inspired convenience methods @@ -103,23 +99,31 @@ class Double_Crystal_Mono(BaseDevice): def wait(self): self._currentChange.wait() - def __str__(self): - s = "**Double crystal monochromator**\n\n" - motors = "theta gap x roll1 roll2 pitch2".split() - for motor in motors: - s += " - %s = %.4f\n" % (motor, getattr(self, motor).wm()) - pvs = "energy_rbk".split() - for pv in pvs: - s += " - %s = %.4f\n" % (pv, getattr(self, pv).value) - return s - - def __repr__(self): - return self.__str__() - def __call__(self, value): self._currentChange = self.set_target_value(value) + + + +class DoubleCrystalMono(Device): + + def __init__(self, Id, **kwargs): + super().__init__(Id, **kwargs) + + self.theta = Motor(Id + ":RX12") + self.x = Motor(Id + ":TX12") + self.gap = Motor(Id + ":T2") + self.roll1 = Motor(Id + ":RZ1") + self.roll2 = Motor(Id + ":RZ2") + self.pitch2 = Motor(Id + ":RX2") + + self.energy = DoubleCrystalMonoEnergy(Id) + + + + + class MonoEcolEnergy: def __init__(self, Id):