Added first version of Delay stage class, currently has PV address of motor as input should be changed to motor as input to be more general

This commit is contained in:
Roman Mankowsky
2018-02-23 16:34:53 +01:00
parent f24476d26a
commit 59d8a5e9ca
5 changed files with 47 additions and 14 deletions
+3 -1
View File
@@ -3,6 +3,7 @@ import os
import json
import numpy as np
from time import sleep
import traceback
class ScanSimple:
def __init__(self,adjustables,values,counterCallers,fina,Npulses=100,basepath='',scan_info_dir='',checker=None):
@@ -22,6 +23,7 @@ class ScanSimple:
'name':[ta.name for ta in adjustables ],
'Id':[ta.Id for ta in adjustables]
},
'scan_values_all':values,
'scan_values':[],
'scan_readbacks':[],
'scan_files':[],
@@ -102,7 +104,7 @@ class ScanSimple:
except:
tb = traceback.format_exc()
else:
tb = "No error"
tb = "Ended all steps without interruption."
finally:
print(tb)
+31 -3
View File
@@ -2,12 +2,31 @@ from ..eco_epics.motor import Motor as _Motor
import subprocess
from threading import Thread
from epics import PV
from .utilities import Changer
_MotorRocordStandardProperties = \
{}
_posTypes = ['user','dial','raw']
_guiTypes = ['xdm']
_status_messages = {
-13 : 'invalid value (cannot convert to float). Move not attempted.',
-12 : 'target value outside soft limits. Move not attempted.',
-11 : 'drive PV is not connected: Move not attempted.',
-8 : 'move started, but timed-out.',
-7 : 'move started, timed-out, but appears done.',
-5 : 'move started, unexpected return value from PV.put()',
-4 : 'move-with-wait finished, soft limit violation seen',
-3 : 'move-with-wait finished, hard limit violation seen',
0 : 'move-with-wait finish OK.',
0 : 'move-without-wait executed, not comfirmed',
1 : 'move-without-wait executed, move confirmed' ,
3 : 'move-without-wait finished, hard limit violation seen',
4 : 'move-without-wait finished, soft limit violation seen',
}
def _keywordChecker(kw_key_list_tups):
for tkw,tkey,tlist in kw_key_list_tups:
assert tkey in tlist, "Keyword %s should be one of %s"%(tkw,tlist)
@@ -18,19 +37,28 @@ class MotorRecord:
self._motor = _Motor(pvname)
self._elog = elog
self.name = name
self._currentChange = None
# Conventional methods and properties for all Adjustable objects
def changeTo(self, value, hold=False, check=True):
""" Adjustable convention"""
mover = lambda value: self._motor.move(\
def changer(value):
self._status = self._motor.move(\
value, ignore_limits=(not check),
wait=True)
self._status_message = _status_messages[self._status]
if not self._status==0:
print(self._status_message)
# changer = lambda value: self._motor.move(\
# value, ignore_limits=(not check),
# wait=True)
return Changer(
target=value,
parent=self,
mover=mover,
changer=changer,
hold=hold,
stopper=self._motor.stop)
def stop(self):
@@ -154,7 +182,7 @@ class MotorRecord:
class Changer:
class ChangerOld:
def __init__(self, target=None, parent=None, mover=None, hold=True, stopper=None):
self.target = target
self._mover = mover
+1 -1
View File
@@ -20,7 +20,7 @@ class Changer:
if self._thread.ident is None:
return 'waiting'
else:
if self.thread.isAlive:
if self._thread.isAlive:
return 'changing'
else:
return 'done'
+3 -3
View File
@@ -1,13 +1,13 @@
from ..devices_general.motors import MotorRecord
from epics import PV
from .delay_stage import DelayStageCA
class Laser_Exp:
def __init__(self,Id):
self.Id = Id
self.delay_stage_offset =160.
self.deltest = DelayStageCA(Id+'-M521:MOTOR_1')
### Mirrors used in the expeirment ###
try:
@@ -46,4 +46,4 @@ class Laser_Exp:
self.delay_stage.mv(motor_pos)
return (delay, motor_pos)
+9 -6
View File
@@ -120,7 +120,7 @@ _OSCILLATOR_PERIOD = 1/71.368704e6
class Phase_shifter(PV):
""" this class is needed to store the offset in files and read in ps """
def __init__(self,pv_basename="SLAAR01-TSPL-EPL",dial_max=14.0056e-9,precision=100e-15):
def __init__(self,pv_basename="SLAAR02-TSPL-EPL",dial_max=14.0056e-9,precision=100e-15):
pvname = pv_basename+":CURR_DELTA_T"
PV.__init__(self,pvname)
self._filename = os.path.join(_basefolder,pvname)
@@ -171,20 +171,21 @@ class Phase_shifter(PV):
return "Phase Shifter: user,dial = %s , %s"%(user,dial)
_slicer_gate = Pockels_trigger("SLAAR-LTIM01-EVR0:Pul2-Delay")
_sdg1 = Pockels_trigger("SLAAR-LTIM01-EVR0:Pul3-Delay")
_phase_shifter = Phase_shifter("SLAAR01-TSPL-EPL")
_slicer_gate = Pockels_trigger("SLAAR-LTIM02-EVR0:Pul3-Delay")
_sdg1 = Pockels_trigger("SLAAR-LTIM02-EVR0:Pul2-Delay")
_phase_shifter = Phase_shifter("SLAAR02-TSPL-EPL")
_POCKELS_CELL_RESOLUTION = 7e-9
class Lxt(object):
def __init__(self):
def __init__(self,accuracy_poly=[100e-15,1e-7]):
self.sdg1 = _sdg1
self.slicer_gate = _slicer_gate
self.phase_shifter = _phase_shifter
self.Id = 'SLAAR01-TSPL-EPL'
self.Id = 'SLAAR02-TSPL-EPL'
self.name = 'lxt'
self.elog = None
self.accuracy_poly = accuracy_poly
def move_sdg(self,value):
self.sdg1.move(value)
@@ -192,6 +193,8 @@ class Lxt(object):
def move(self,value,accuracy=None):
self.sdg1.move(-value)
self.slicer_gate.move(-value)
if not accuracy:
accuracy = np.abs(value)*self.accuracy_poly[1]+self.accuracy_poly[0]
self.phase_shifter.move(value,accuracy=accuracy)
def set(self,value):