Files
eco/xoptics/dcm.py
T
2018-03-08 16:24:37 +01:00

80 lines
2.4 KiB
Python
Executable File

from ..devices_general.motors import MotorRecord
from epics import PV
from ..devices_general.utilities import Changer
from time import sleep
import numpy as np
class Double_Crystal_Mono:
def __init__(self,Id):
self.Id = Id
self.theta = MotorRecord(Id+':RX12')
self.x = MotorRecord(Id+':TX12')
self.gap = MotorRecord(Id+':T2')
self.roll1 = MotorRecord(Id+':RZ1')
self.roll2 = MotorRecord(Id+':RZ2')
self.pitch2 = MotorRecord(Id+':RX2')
self.energy_rbk = PV(Id+':ENERGY')
self.energy_sp = PV(Id+':ENERGY_SP')
self.moving = PV(Id+':MOVING')
self._stop = PV(Id +':STOP.PROC')
def move_and_wait(self,value,checktime=.01,precision=.5):
self.energy_sp.put(value)
while abs(self.wait_for_valid_value()-value)>precision:
sleep(checktime)
def changeTo(self,value,hold=False):
changer = lambda value: self.move_and_wait(value)
return Changer(
target=value,
parent=self,
changer=changer,
hold=hold,
stopper=self.stop)
def stop(self):
self._stop.put(1)
def get_current_value(self):
currentenergy = self.energy_rbk.get()
return currentenergy
def wait_for_valid_value(self):
tval = np.nan
while not np.isfinite(tval):
tval = self.energy_rbk.get()
return(tval)
def set_current_value(self,value):
self.energy_sp.put(value)
def get_moveDone(self):
inmotion = int(self.moving.get())
return inmotion
# spec-inspired convenience methods
def mv(self,value):
self._currentChange = self.changeTo(value)
def wm(self,*args,**kwargs):
return self.get_current_value(*args,**kwargs)
def mvr(self,value,*args,**kwargs):
if(self.get_moveDone == 1):
startvalue = self.get_current_value(*args,**kwargs)
else:
startvalue = self.get_current_value(*args,**kwargs)
self._currentChange = self.changeTo(value+startvalue,*args,**kwargs)
def wait(self):
self._currentChange.wait()
# return string with motor value as variable representation
def __str__(self):
return "Motor is at %s"%self.wm()
def __repr__(self):
return self.__str__()
def __call__(self,value):
self._currentChange = self.changeTo(value)