finalized kb_steering for the hexapod table in bernina

This commit is contained in:
2020-05-27 18:47:45 +02:00
parent a9805a630f
commit 10d57fa106
4 changed files with 310 additions and 17 deletions
+21 -1
View File
@@ -562,7 +562,7 @@ components = [
"z_und": 141,
"desc": "Upstream diagnostics table",
"type": "eco.endstations.hexapod:HexapodSymmetrie",
"kwargs": {},
"kwargs": {'offset':[1.308,0.881,0.,0.027,0.231,0.]},
"lazy": True,
},
{
@@ -616,6 +616,26 @@ components = [
"kwargs": {"Id": "SARES23"},
"lazy": True,
},
{
"args": [],
"name": "tht",
"z_und": 142,
"desc": "High field THz Table",
"type": "eco.endstations.bernina_sample_environments:High_field_thz_table",
"kwargs": {"Id": "SARES23"},
"lazy": True,
},
{
"args": [],
"name": "eos",
"z_und": 142,
"desc": "electro optic sampling stages",
"type": "eco.endstations.bernina_sample_environments:electro_optic_sampling",
"kwargs": {"Id": "SARES23"},
"lazy": True,
},
]
try:
+241 -4
View File
@@ -31,16 +31,16 @@ class High_field_thz_chamber:
self.motor_configuration = {
"rx": {
"id": "-ESB4",
"pv_descr": "Motor4:1 THz Chamber Rx",
"id": "-ESB13",
"pv_descr": "Motor7:1 THz Chamber Rx",
"type": 2,
"sensor": 1,
"speed": 250,
"home_direction": "back",
},
"x": {
"id": "-ESB5",
"pv_descr": "Motor5:2 THz Chamber x ",
"id": "-ESB14",
"pv_descr": "Motor7:2 THz Chamber x ",
"type": 1,
"sensor": 0,
"speed": 250,
@@ -132,3 +132,240 @@ class High_field_thz_chamber:
def __repr__(self):
return self.get_adjustable_positions_str()
class High_field_thz_table:
def __init__(self, name=None, Id=None, alias_namespace=None):
self.Id = Id
self.name = name
self.alias = Alias(name)
self.motor_configuration = {
"mirr2_x": {
"id": "-ESB1",
"pv_descr": "Motor3:1 THz mirror x ",
"type": 2,
"sensor": 1,
"speed": 250,
"home_direction": "back",
},
"mirr2_rz": {
"id": "-ESB2",
"pv_descr": "Motor3:2 THz mirror rz ",
"type": 1,
"sensor": 0,
"speed": 250,
"home_direction": "back",
},
"mirr2_ry": {
"id": "-ESB3",
"pv_descr": "Motor3:3 THz mirror ry ",
"type": 1,
"sensor": 0,
"speed": 250,
"home_direction": "back",
},
"mirr2_z": {
"id": "-ESB4",
"pv_descr": "Motor4:1 THz mirror z",
"type": 2,
"sensor": 1,
"speed": 250,
"home_direction": "back",
},
"par2_x": {
"id": "-ESB5",
"pv_descr": "Motor4:2 THz parabola2 x",
"type": 2,
"sensor": 1,
"speed": 250,
"home_direction": "back",
},
"mirr1_x": {
"id": "-ESB7",
"pv_descr": "Motor5:1 near IR mirror x",
"type": 2,
"sensor": 1,
"speed": 250,
"home_direction": "back",
},
"mirr1_ry": {
"id": "-ESB8",
"pv_descr": "Motor5:2 near IR mirror ry",
"type": 2,
"sensor": 1,
"speed": 250,
"home_direction": "back",
},
"mirr1_rx": {
"id": "-ESB9",
"pv_descr": "Motor5:3 near IR mirror rx",
"type": 2,
"sensor": 1,
"speed": 250,
"home_direction": "back",
},
}
### in vacuum smaract motors ###
for name, config in self.motor_configuration.items():
addSmarActRecordToSelf(self, Id=Id + config["id"], name=name)
def set_stage_config(self):
for name, config in self.motor_configuration.items():
mot = self.__dict__[name]._device
mot.put("NAME", config["pv_descr"])
mot.put("STAGE_TYPE", config["type"])
mot.put("SET_SENSOR_TYPE", config["sensor"])
mot.put("CL_MAX_FREQ", config["speed"])
sleep(0.5)
mot.put("CALIBRATE.PROC", 1)
def home_smaract_stages(self, stages=None):
if stages == None:
stages = self.motor_configuration.keys()
print("#### Positions before homing ####")
print(self.__repr__())
for name in stages:
config = self.motor_configuration[name]
mot = self.__dict__[name]._device
print(
"#### Homing {} in {} direction ####".format(
name, config["home_direction"]
)
)
sleep(1)
if config["home_direction"] == "back":
mot.put("FRM_BACK.PROC", 1)
while mot.get("STATUS") == 7:
sleep(1)
if mot.get("GET_HOMED") == 0:
print(
"Homing failed, try homing {} in forward direction".format(name)
)
mot.put("FRM_FORW.PROC", 1)
elif config["home_direction"] == "forward":
mot.put("FRM_FORW.PROC", 1)
while mot.get("STATUS") == 7:
sleep(1)
if mot.get("GET_HOMED") == 0:
print(
"Homing failed, try homing {} in backward direction".format(
name
)
)
mot.put("FRM_BACK.PROC", 1)
def get_adjustable_positions_str(self):
ostr = "*****THz table motor positions******\n"
for tkey, item in self.__dict__.items():
if hasattr(item, "get_current_value"):
pos = item.get_current_value()
ostr += " " + tkey.ljust(17) + " : % 14g\n" % pos
return ostr
def __repr__(self):
return self.get_adjustable_positions_str()
class electro_optic_sampling:
def __init__(self, name=None, Id=None, alias_namespace=None):
self.Id = Id
self.name = name
self.alias = Alias(name)
self.motor_configuration = {
"ry": {
"id": "-ESB16",
"pv_descr": "Motor8:1 EOS prism ry ",
"type": 2,
"sensor": 1,
"speed": 250,
"home_direction": "back",
},
"rx": {
"id": "-ESB17",
"pv_descr": "Motor8:2 EOS prism rx ",
"type": 1,
"sensor": 0,
"speed": 250,
"home_direction": "back",
},
"x": {
"id": "-ESB18",
"pv_descr": "Motor8:3 EOS prism x ",
"type": 1,
"sensor": 0,
"speed": 250,
"home_direction": "back",
},
}
### in vacuum smaract motors ###
for name, config in self.motor_configuration.items():
addSmarActRecordToSelf(self, Id=Id + config["id"], name=name)
def set_stage_config(self):
for name, config in self.motor_configuration.items():
mot = self.__dict__[name]._device
mot.put("NAME", config["pv_descr"])
mot.put("STAGE_TYPE", config["type"])
mot.put("SET_SENSOR_TYPE", config["sensor"])
mot.put("CL_MAX_FREQ", config["speed"])
sleep(0.5)
mot.put("CALIBRATE.PROC", 1)
def home_smaract_stages(self, stages=None):
if stages == None:
stages = self.motor_configuration.keys()
print("#### Positions before homing ####")
print(self.__repr__())
for name in stages:
config = self.motor_configuration[name]
mot = self.__dict__[name]._device
print(
"#### Homing {} in {} direction ####".format(
name, config["home_direction"]
)
)
sleep(1)
if config["home_direction"] == "back":
mot.put("FRM_BACK.PROC", 1)
while mot.get("STATUS") == 7:
sleep(1)
if mot.get("GET_HOMED") == 0:
print(
"Homing failed, try homing {} in forward direction".format(name)
)
mot.put("FRM_FORW.PROC", 1)
elif config["home_direction"] == "forward":
mot.put("FRM_FORW.PROC", 1)
while mot.get("STATUS") == 7:
sleep(1)
if mot.get("GET_HOMED") == 0:
print(
"Homing failed, try homing {} in backward direction".format(
name
)
)
mot.put("FRM_BACK.PROC", 1)
def get_adjustable_positions_str(self):
ostr = "*****EOS motor positions******\n"
for tkey, item in self.__dict__.items():
if hasattr(item, "get_current_value"):
pos = item.get_current_value()
ostr += " " + tkey.ljust(17) + " : % 14g\n" % pos
return ostr
def __repr__(self):
return self.get_adjustable_positions_str()
+31 -12
View File
@@ -20,8 +20,9 @@ class Hexapod_PI:
class HexapodSymmetrie:
def __init__(self,pv_master='SARES20-HEXSYM',name='hex_usd'):
def __init__(self,pv_master='SARES20-HEXSYM',name='hex_usd',offset=[0,0,0,0,0,0]):
self.name = name
self.offset = offset
self.pvname = pv_master
self.coordinate_switch = PvEnum(f'{self.pvname}:MOVE#PARAM:CM',name='hex_usd_coordinate_switch')
self.pvs_setpos = {
@@ -43,12 +44,12 @@ class HexapodSymmetrie:
self._ctrl_pv = PV(f'{self.pvname}:STATE#PANEL:SET.VAL')
def set_coordinates(self,x,y,z,rx,ry,rz):
self.pvs_setpos['x'].set(x)
self.pvs_setpos['y'].set(y)
self.pvs_setpos['z'].set(z)
self.pvs_setpos['rx'].set(rx)
self.pvs_setpos['ry'].set(ry)
self.pvs_setpos['rz'].set(rz)
self.pvs_setpos['x'].put(x)
self.pvs_setpos['y'].put(y)
self.pvs_setpos['z'].put(z)
self.pvs_setpos['rx'].put(rx)
self.pvs_setpos['ry'].put(ry)
self.pvs_setpos['rz'].put(rz)
def get_coordinates(self):
x = self.pvs_getpos['x'].get()
@@ -60,10 +61,10 @@ class HexapodSymmetrie:
return x,y,z,rx,ry,rz
def set_control_on(self):
self._ctrl_pv.set(3)
self._ctrl_pv.put(3)
def set_control_off(self):
self._ctrl_pv.set(4)
self._ctrl_pv.put(4)
def get_control_state(self):
stat = self._ctrl_pv.get()
@@ -76,9 +77,24 @@ class HexapodSymmetrie:
elif stat==11:
return 'moving'
def start_move(self,target=None,precision=[.001,.001,.001,.001,.001,.001]):
def move_to_coordinates(self,x,y,z,rx,ry,rz,precision=[.001,.001,.001,.001,.001,.001],coordinate_type='absolute',relative_to_eco_offset=True):
self.coordinate_switch.set_target_value(coordinate_type).wait()
if relative_to_eco_offset:
x = x+self.offset[0]
y = y+self.offset[1]
z = z+self.offset[2]
rx = rx+self.offset[3]
ry = ry+self.offset[4]
rz = rz+self.offset[5]
self.set_coordinates(x,y,z,rx,ry,rz)
sleep(.1)
self.start_move(target=(x,y,z,rx,ry,rz),precision=precision,coordinate_type=coordinate_type)
def start_move(self,target=None,precision=[.001,.001,.001,.001,.001,.001],coordinate_type='absolute'):
print('Starting to move... stop with Ctrl-C')
self._ctrl_pv.set(11)
self.set_control_on()
sleep(0.2)
self._ctrl_pv.put(11) #this starts moving!
while 1:
try:
if target:
@@ -91,7 +107,10 @@ class HexapodSymmetrie:
except KeyboardInterrupt:
self.stop_move()
print('Motion stopped')
break
self.set_control_off()
sleep(0.05)
def stop_move(self):
self._ctrl_pv.set(2)
self._ctrl_pv.put(2)
+17
View File
@@ -52,6 +52,23 @@ class KBMirrorBernina:
# res['fwhm_kbhor'] = (fwhm_z(self.d_kbhor+z_fochor,w0_hor),fwhm_z(self.d_kbhor+z_focver,w0_ver))
return res
def move_hex_for_kb_angles(self,the_kbver,the_kbhor):
pos = self.calc_positions(the_kbver,the_kbhor)
x = pos['x_hex']
y = pos['y_hex']
rx = pos['rx_hex']*180/np.pi
ry = pos['ry_hex']*180/np.pi
z=rz=0.
print(f"moving to (x/mm,y/mm,z/mm,rx/°,ry/°,rz/°) = ({x:g},{y:g},{z:g},{rx:g},{ry:g},{rz:g})")
if not input("start moving upstream large hexapod? (y/n)")=="y":
print("did nothing")
return
else:
self.usd_table.move_to_coordinates(x,y,z,rx,ry,rz)