fixes and changes during trigo

This commit is contained in:
2022-03-25 14:18:26 +01:00
parent c7e0c0463e
commit dd94966b3b
11 changed files with 570 additions and 180 deletions
+147 -63
View File
@@ -226,7 +226,7 @@ namespace.append_obj(
n_output_rear=16,
name="evr",
module_name="eco.timing.event_timing_new_new",
lazy=True,
lazy=False,
)
namespace.append_obj(
"EventReceiver",
@@ -237,7 +237,7 @@ namespace.append_obj(
n_output_rear=16,
name="evr_laser",
module_name="eco.timing.event_timing_new_new",
lazy=True,
lazy=False,
)
namespace.append_obj(
"EventReceiver",
@@ -248,7 +248,7 @@ namespace.append_obj(
n_output_rear=16,
name="evr_hutch_laser",
module_name="eco.timing.event_timing_new_new",
lazy=True,
lazy=False,
)
namespace.append_obj(
"EventReceiver",
@@ -259,7 +259,7 @@ namespace.append_obj(
n_output_rear=0,
name="evr_camserver72",
module_name="eco.timing.event_timing_new_new",
lazy=True,
lazy=False,
)
namespace.append_obj(
"EventReceiver",
@@ -270,7 +270,7 @@ namespace.append_obj(
n_output_rear=0,
name="evr_camserver83",
module_name="eco.timing.event_timing_new_new",
lazy=True,
lazy=False,
)
namespace.append_obj(
"EventReceiver",
@@ -281,7 +281,7 @@ namespace.append_obj(
n_output_rear=0,
name="evr_camserver84",
module_name="eco.timing.event_timing_new_new",
lazy=True,
lazy=False,
)
namespace.append_obj(
"EventReceiver",
@@ -292,7 +292,8 @@ namespace.append_obj(
n_output_rear=0,
name="evr_camserver85",
module_name="eco.timing.event_timing_new_new",
lazy=True,
# lazy=True,
lazy=False,
)
namespace.append_obj(
@@ -327,7 +328,21 @@ namespace.append_obj(
"GudeStrip",
"SARES20-CPPS-01",
lazy=True,
name="powerstrip_mobile",
name="powerstrip_gps",
module_name="eco.devices_general.powersockets",
)
namespace.append_obj(
"GudeStrip",
"SARES20-CPPS-04",
lazy=True,
name="powerstrip_xrd",
module_name="eco.devices_general.powersockets",
)
namespace.append_obj(
"GudeStrip",
"SARES20-CPPS-02",
lazy=True,
name="powerstrip_patch2",
module_name="eco.devices_general.powersockets",
)
namespace.append_obj(
@@ -339,15 +354,15 @@ namespace.append_obj(
fina_hex_angle_offset="~/eco/reference_values/hex_pi_angle_offset.json",
lazy=True,
)
#namespace.append_obj(
# "XRDYou",
# module_name="eco.endstations.bernina_diffractometers",
# Id="SARES21-XRD",
# configuration=config_berninamesp["xrd_config"],
# diff_detector={"jf_id": "JF01T03V01"},
# name="xrd",
# lazy=True,
#)
namespace.append_obj(
"XRDYou",
module_name="eco.endstations.bernina_diffractometers",
Id="SARES21-XRD",
configuration=config_berninamesp["xrd_config"],
diff_detector={"jf_id": "JF01T03V01"},
name="xrd",
lazy=True,
)
namespace.append_obj(
"KBMirrorBernina_new",
"SAROP21-OKBV139",
@@ -355,7 +370,7 @@ namespace.append_obj(
module_name="eco.xoptics.kb_bernina",
usd_table=usd_table,
name="kb",
diffractometer=gps,
diffractometer=xrd,
)
### channelsfor daq ###
@@ -482,6 +497,7 @@ def _append_namesace_status_to_scan(scan):
base=None
)
def _append_namespace_aliases_to_scan(scan):
scan.scan_info["scan_parameters"]["namespace_aliases"] = namespace.alias.get_all()
@@ -492,24 +508,28 @@ def _message_end_scan(scan):
e.runAndWait()
e.stop()
def _increment_daq_run_number(scan, daq=daq):
try:
daq_last_run_number = daq.get_last_run_number()
if int(scan.run_number) is int(daq_last_run_number)+1:
if int(scan.run_number) is int(daq_last_run_number) + 1:
daq_run_number = daq.get_next_run_number()
else:
else:
daq_run_number = daq_last_run_number
if int(scan.run_number) is not int(daq_run_number):
print(f'Difference in run number between eco {int(scan.run_number)} and daq {int(daq_run_number)}: using run number {int(scan.run_number)}')
print(
f"Difference in run number between eco {int(scan.run_number)} and daq {int(daq_run_number)}: using run number {int(scan.run_number)}"
)
if int(scan.run_number) > int(daq_run_number):
n = int(scan.run_number) - int(daq_run_number)
print('Increasing daq run_number')
print("Increasing daq run_number")
for i in range(n):
rn = daq.get_next_run_number()
print(rn)
except Exception as e:
print(e)
callbacks_start_scan = []
callbacks_start_scan = [lambda scan: namespace.init_all()]
callbacks_start_scan.append(_append_namespace_aliases_to_scan)
@@ -547,24 +567,24 @@ namespace.append_obj(
#### Beam pointing cameras for THz setups ####
namespace.append_obj(
"CameraBasler",
pvname="SLAAR21-LCAM-C531",
lazy=True,
name="cam_NIR_position",
camserver_group=["Laser", "Bernina"],
module_name="eco.devices_general.cameras_swissfel",
)
namespace.append_obj(
"CameraBasler",
pvname="SLAAR21-LCAM-C511",
lazy=True,
name="cam_NIR_angle",
camserver_group=["Laser", "Bernina"],
module_name="eco.devices_general.cameras_swissfel",
)
# namespace.append_obj(
# "CameraBasler",
# pvname="SLAAR21-LCAM-C531",
# lazy=True,
# name="cam_NIR_position",
# camserver_group=["Laser", "Bernina"],
# module_name="eco.devices_general.cameras_swissfel",
# )
#
#
# namespace.append_obj(
# "CameraBasler",
# pvname="SLAAR21-LCAM-C511",
# lazy=True,
# name="cam_NIR_angle",
# camserver_group=["Laser", "Bernina"],
# module_name="eco.devices_general.cameras_swissfel",
# )
namespace.append_obj(
"AxisPTZ",
@@ -591,9 +611,18 @@ namespace.append_obj(
# pvname_zoom="SARES20-MF1:MOT_16",
# )
namespace.append_obj(
"MicroscopeMotorRecord",
"SARES20-CAMS142-C1",
lazy=True,
pvname_zoom="SARES20-MF1:MOT_16",
name="samplecam_microscope",
module_name="eco.microscopes",
)
namespace.append_obj(
"CameraBasler",
"SARES20-CAMS142-M1",
"SARES20-CAMS142-C2",
lazy=True,
name="samplecam_sideview",
module_name="eco.devices_general.cameras_swissfel",
@@ -634,43 +663,98 @@ namespace.append_obj(
name="las",
module_name="eco.loptics.bernina_laser",
)
namespace.append_obj(
"IncouplingCleanBernina",
lazy=False,
name="las_inc",
module_name="eco.loptics.bernina_laser",
)
# namespace.append_obj(
# "IncouplingCleanBernina",
# lazy=False,
# name="las_inc",
# module_name="eco.loptics.bernina_laser",
# )
from ..elements.assembly import Assembly
from ..devices_general.motors import SmaractStreamdevice
# namespace.append_obj(
# "Organic_crystal_breadboard",
# lazy=True,
# name="ocb",
# module_name="eco.endstations.bernina_sample_environments",
# Id="SARES23",
# )
from ..epics.adjustable import AdjustablePv
# ad hoc N2 jet readout
class N2jet(Assembly):
def __init__(self, name=None):
super().__init__(name=name)
### lakeshore temperatures ####
self._append(
AdjustablePv,
pvsetname="SARES20-CRYO:TEMP-C_RBV",
pvreadbackname="SARES20-CRYO:TEMP-C_RBV",
accuracy=0.1,
name="sample_temp",
is_setting=False,
)
### oxford jet readouts ####
self._append(
AdjustablePv,
pvsetname="SARES20-OXCS:GasSetPoint",
pvreadbackname="SARES20-OXCS:GasSetPoint",
accuracy=0.1,
name="gas_temp_setpoint",
is_setting=False,
)
self._append(
AdjustablePv,
pvsetname="SARES20-OXCS:GasTemp",
pvreadbackname="SARES20-OXCS:GasTemp",
accuracy=0.1,
name="gas_temp",
is_setting=False,
)
self._append(
AdjustablePv,
pvsetname="SARES20-OXCS:GasFlow",
pvreadbackname="SARES20-OXCS:GasFlow",
accuracy=0.1,
name="gas_flow",
is_setting=False,
)
self._append(
AdjustablePv,
pvsetname="SARES20-OXCS:Remaining",
pvreadbackname="SARES20-OXCS:Remaining",
accuracy=0.1,
name="gas_remaining",
is_setting=False,
)
namespace.append_obj(
"Organic_crystal_breadboard",
N2jet,
lazy=True,
name="ocb",
module_name="eco.endstations.bernina_sample_environments",
Id="SARES23",
name="jet",
)
# ad hoc incoupling device
class Incoupling(Assembly):
def __init__(self, name=None):
super().__init__(name=name)
self._append(SmaractStreamdevice, "SARES23-ESB16", name="tilt", is_setting=True)
self._append(
SmaractStreamdevice, "SARES23-ESB17", name="rx_pump", is_setting=True
)
self._append(
SmaractStreamdevice, "SARES23-ESB18", name="ry_pump", is_setting=True
SmaractStreamdevice, "SARES23-ESB17", name="rotation", is_setting=True
)
# namespace.append_obj(
# Incoupling,
# lazy=True,
# name="incoupling",
# )
namespace.append_obj(
Incoupling,
lazy=True,
name="las_inc",
)
from ..devices_general.motors import MotorRecord
from ..loptics.bernina_laser import DelayTime
from ..microscopes import MicroscopeMotorRecord
@@ -726,7 +810,7 @@ from ..microscopes import MicroscopeMotorRecord
# from eco.xoptics import dcm_pathlength_compensation as dpc
#namespace.append_obj(
# namespace.append_obj(
# "MonoTimecompensation",
# # laser2pulse.pump_delay_exp,
# las.delay_glob,
@@ -736,7 +820,7 @@ from ..microscopes import MicroscopeMotorRecord
# lazy=True,
# name="mono_time_corrected",
# module_name="eco.xoptics.dcm_pathlength_compensation",
#)
# )
# ad hoc interferometric timetool
+40 -32
View File
@@ -149,6 +149,14 @@ components = [
"z_und": 115,
"desc": "Bernina safety shutter",
},
{
"name": "sshut_fe",
"type": "eco.xoptics.shutters:SafetyShutter",
"args": ["SGE01-EPKT820:BST1_oeffnen"],
"kwargs": {},
"z_und": 115,
"desc": "Bernina safety shutter",
},
{
"name": "att_fe",
"type": "eco.xoptics.attenuator_aramis:AttenuatorAramis",
@@ -663,38 +671,38 @@ components = [
# "kwargs": {},
# "lazy": False,
# },
{
"args": [],
"name": "thc",
"z_und": 142,
"desc": "High field THz Chamber",
"type": "eco.endstations.bernina_sample_environments:High_field_thz_chamber",
"kwargs": {"Id": "SARES23", "configuration": ["ottifant"]},
},
{
"args": [],
"name": "ocb",
"z_und": 142,
"desc": "Organic Crystal Breadboard",
"type": "eco.endstations.bernina_sample_environments:Organic_crystal_breadboard",
"kwargs": {"Id": "SARES23"},
},
{
"args": [],
"name": "eos",
"z_und": 142,
"desc": "electro optic sampling stages",
"type": "eco.endstations.bernina_sample_environments:Electro_optic_sampling",
"kwargs": {
"Id": "SARES23",
"pgroup": config["pgroup"],
"diode_channels": {
"d1": "SARES20-LSCP9-FNS:CH1:VAL_GET",
"d2": "SARES20-LSCP9-FNS:CH2:VAL_GET",
"diff": "SARES20-LSCP9-FNS:CH3:VAL_GET",
},
},
},
#{
# "args": [],
# "name": "thc",
# "z_und": 142,
# "desc": "High field THz Chamber",
# "type": "eco.endstations.bernina_sample_environments:High_field_thz_chamber",
# "kwargs": {"Id": "SARES23", "configuration": ["ottifant"]},
#},
# {
# "args": [],
# "name": "ocb",
# "z_und": 142,
# "desc": "Organic Crystal Breadboard",
# "type": "eco.endstations.bernina_sample_environments:Organic_crystal_breadboard",
# "kwargs": {"Id": "SARES23"},
# },
# {
# "args": [],
# "name": "eos",
# "z_und": 142,
# "desc": "electro optic sampling stages",
# "type": "eco.endstations.bernina_sample_environments:Electro_optic_sampling",
# "kwargs": {
# "Id": "SARES23",
# "pgroup": config["pgroup"],
# "diode_channels": {
# "d1": "SARES20-LSCP9-FNS:CH1:VAL_GET",
# "d2": "SARES20-LSCP9-FNS:CH2:VAL_GET",
# "diff": "SARES20-LSCP9-FNS:CH3:VAL_GET",
# },
# },
# },
{
"args": [],
"name": "dsd",
+37 -2
View File
@@ -1,8 +1,11 @@
from ..elements.adjustable import AdjustableVirtual
from tkinter import W
from ..elements.adjustable import AdjustableVirtual, AdjustableGetSet
from ..epics.adjustable import AdjustablePv
from ..elements.assembly import Assembly
from ..aliases import Alias
from pathlib import Path
from ..elements import memory
from datetime import datetime
class Jungfrau(Assembly):
@@ -36,9 +39,41 @@ class Jungfrau(Assembly):
append_aliases=False,
is_setting=True,
)
self._append(
AdjustableGetSet,
self.get_present_pedestal_filename,
lambda value: NotImplementedError(
"Can not set the pedestal file manually yet."
),
name="pedestal_file",
is_status=True,
)
self._append(
AdjustableGetSet,
self.get_present_gain_filename,
lambda value: NotImplementedError(
"Can not set the pedestal file manually yet."
),
name="gain_file",
is_status=True,
)
def _set_trigger_enable(self, value):
if value:
self.trigger.set_target_value(self._trigger_on).wait()
else:
self.trigger.set_target_value(self._triggeroff).wait()
self.trigger.set_target_value(self._trigger_off).wait()
def get_present_gain_filename(self):
filepath = Path(f"/sf/jungfrau/config/gainMaps/{self.jf_id}/gains.h5")
if filepath.exists():
return filepath.resolve().as_posix()
else:
raise Exception(f"File {filepath.resolve().as_posix()} seems not to exist!")
def get_present_pedestal_filename(self):
searchpath = Path(f"/sf/jungfrau/data/pedestal/{self.jf_id}")
filelist = list(searchpath.glob("*.h5"))
times = [datetime.strptime(f.stem, "%Y%m%d_%H%M%S") for f in filelist]
return filelist[times.index(max(times))].resolve().as_posix()
+3 -3
View File
@@ -84,7 +84,7 @@ class SmaractStreamdevice(Assembly):
offset_file=None,
):
super().__init__(name=name)
self.settings.append(self)
# self.settings.append(self)
self.settings_collection.append(self, force=True)
self.pvname = pvname
@@ -431,7 +431,7 @@ class MotorRecord(Assembly):
expect_bad_limits=True,
):
super().__init__(name=name)
self.settings.append(self)
# self.settings.append(self)
self.settings_collection.append(self, force=True)
self.pvname = pvname
@@ -537,7 +537,7 @@ class MotorRecord(Assembly):
is_status=False,
)
def check_bad_limits(self, abs_set_value=2 ** 53):
def check_bad_limits(self, abs_set_value=2**53):
ll, hl = self.get_limits()
if ll == 0 and hl == 0:
self.set_limits(-abs_set_value, abs_set_value)
+5 -5
View File
@@ -57,8 +57,8 @@ class Assembly:
def __init__(self, name=None, parent=None, is_alias=True):
self.name = name
self.alias = Alias(name, parent=parent)
self.settings = []
self.status_indicators = []
# self.settings = []
# self.status_indicators = []
self.settings_collection = Collection(name="settings_collection")
self.status_indicators_collection = Collection(
name="status_indicators_collection"
@@ -88,7 +88,7 @@ class Assembly:
# print(f'object {name} / {foo_obj_init} not initialized with name/parent')
# self.__dict__[name] = foo_obj_init(*args, **kwargs)
if is_setting:
self.settings.append(self.__dict__[name])
# self.settings.append(self.__dict__[name])
self.settings_collection.append(self.__dict__[name], recursive=True)
if is_status:
@@ -101,8 +101,8 @@ class Assembly:
self.__dict__[name], recursive=False
)
if (not is_setting) and is_status:
self.status_indicators.append(self.__dict__[name])
# if (not is_setting) and is_status:
# self.status_indicators.append(self.__dict__[name])
if view_toplevel_only:
self.view_toplevel_only.append(self.__dict__[name])
+1 -1
View File
@@ -114,7 +114,7 @@ class Memory:
return mem_filt
else:
return mem_all
return mem_full
def recall(
self,
+126 -66
View File
@@ -108,24 +108,31 @@ class GPS(Assembly):
MotorRecord, pvname + ":MOT_NY_RY2TH", name="nu", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOT_NY_RY2TH", name="gamma", is_setting=False, is_status=False,
)
MotorRecord,
pvname + ":MOT_NY_RY2TH",
name="gamma",
is_setting=False,
is_status=False,
)
self._append(
MotorRecord, pvname + ":MOT_MY_RYTH", name="mu", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOT_MY_RYTH", name="alpha", is_setting=False, is_status=False,
)
MotorRecord,
pvname + ":MOT_MY_RYTH",
name="alpha",
is_setting=False,
is_status=False,
)
self.set_base_off = DeltaTauCurrOff("SARES22-GPS:asyn2.AOUT")
if "phi_table" in self.configuration:
### motors phi table ###
self._append(
MotorRecord, pvname + ":MOT_HEX_RX", name="phi", is_setting=True
MotorRecord, pvname + ":MOT_HEX_RX", name="eta", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOT_HEX_TX", name="tphi", is_setting=True
MotorRecord, pvname + ":MOT_HEX_TX", name="transl_eta", is_setting=True
)
if "phi_hex" in self.configuration:
@@ -282,7 +289,14 @@ class GPS(Assembly):
# bash -c 'caqtdm -noMsg -stylefile sfop.qss -macro P=SARES22-GPS /ioc/modules/qt/ESB_GPS_exp.ui'
def calc_you2kappa(
self, eta, chi, phi, kappa_angle=60, degrees=True, bernina_kappa=True, invert_elbow=False,
self,
eta,
chi,
phi,
kappa_angle=60,
degrees=True,
bernina_kappa=True,
invert_elbow=False,
):
"""tool to convert from you definition angles to kappa angles, in
particular the bernina kappa where the"""
@@ -308,11 +322,13 @@ class GPS(Assembly):
phi_k = phi_k
if True:
def flip_ang(ang):
if 1 < abs(ang // np.pi):
return ang - np.sign(ang) * np.pi * 2
else:
return ang
phi_k = flip_ang(phi_k)
eta_k = flip_ang(eta_k)
kappa = flip_ang(kappa)
@@ -322,7 +338,14 @@ class GPS(Assembly):
return eta_k, kappa, phi_k
def calc_kappa2you(
self, eta_k, kappa, phi_k, kappa_angle=60, degrees=True, bernina_kappa=True, invert_elbow=False,
self,
eta_k,
kappa,
phi_k,
kappa_angle=60,
degrees=True,
bernina_kappa=True,
invert_elbow=False,
):
if degrees:
eta_k, kappa, phi_k, kappa_angle = np.deg2rad(
@@ -372,7 +395,14 @@ class DeltaTauCurrOff:
class XRDYou(Assembly):
def __init__(self, name=None, Id=None, configuration=["base"], diff_detector=None, invert_kappa_ellbow=True):
def __init__(
self,
name=None,
Id=None,
configuration=["base"],
diff_detector=None,
invert_kappa_ellbow=True,
):
"""X-ray diffractometer platform in AiwssFEL Bernina.\
<configuration> : list of elements mounted on
the plaform, options are kappa, nutable, hlgonio, polana"""
@@ -678,16 +708,21 @@ class XRDYou(Assembly):
def set_youvar_value_to_current_kappa(value, varind):
vars = list(get_current_kappa2you())
vars[varind] = value
return self.calc_you2kappa(*vars,
bernina_kappa=True,
invert_elbow=self.invert_kappa_ellbow,
)
return self.calc_you2kappa(
*vars,
bernina_kappa=True,
invert_elbow=self.invert_kappa_ellbow,
)
self._append(
AdjustableVirtual,
[self.eta_kap, self.kappa, self.phi_kap],
lambda eta_kap, kappa, phi_kap: self.calc_kappa2you(
eta_kap, kappa, phi_kap, invert_elbow=self.invert_kappa_ellbow,bernina_kappa=True,
eta_kap,
kappa,
phi_kap,
invert_elbow=self.invert_kappa_ellbow,
bernina_kappa=True,
)[0],
lambda value_eta: set_youvar_value_to_current_kappa(value_eta, 0),
name="eta",
@@ -697,7 +732,11 @@ class XRDYou(Assembly):
AdjustableVirtual,
[self.eta_kap, self.kappa, self.phi_kap],
lambda eta_kap, kappa, phi_kap: self.calc_kappa2you(
eta_kap, kappa, phi_kap, invert_elbow=self.invert_kappa_ellbow,bernina_kappa=True,
eta_kap,
kappa,
phi_kap,
invert_elbow=self.invert_kappa_ellbow,
bernina_kappa=True,
)[1],
lambda value_chi: set_youvar_value_to_current_kappa(value_chi, 1),
name="chi",
@@ -707,7 +746,11 @@ class XRDYou(Assembly):
AdjustableVirtual,
[self.eta_kap, self.kappa, self.phi_kap],
lambda eta_kap, kappa, phi_kap: self.calc_kappa2you(
eta_kap, kappa, phi_kap, invert_elbow=self.invert_kappa_ellbow,bernina_kappa=True,
eta_kap,
kappa,
phi_kap,
invert_elbow=self.invert_kappa_ellbow,
bernina_kappa=True,
)[2],
lambda value_phi: set_youvar_value_to_current_kappa(value_phi, 2),
name="phi",
@@ -751,10 +794,17 @@ class XRDYou(Assembly):
# def calc_you2kappa(self, eta, chi, phi):
# return you2kappa(eta, chi, phi)
#################
#################
def calc_you2kappa(
self, eta, chi, phi, kappa_angle=60, degrees=True, bernina_kappa=True, invert_elbow=False,
self,
eta,
chi,
phi,
kappa_angle=60,
degrees=True,
bernina_kappa=True,
invert_elbow=False,
):
"""tool to convert from you definition angles to kappa angles, in
particular the bernina kappa where the"""
@@ -779,11 +829,13 @@ class XRDYou(Assembly):
eta_k = eta_k - np.pi / 2
kappa = -kappa
if True:
def flip_ang(ang):
if 1 < abs(ang // np.pi):
return ang - np.sign(ang) * np.pi * 2
else:
return ang
phi_k = flip_ang(phi_k)
eta_k = flip_ang(eta_k)
kappa = flip_ang(kappa)
@@ -792,7 +844,14 @@ class XRDYou(Assembly):
return eta_k, kappa, phi_k
def calc_kappa2you(
self, eta_k, kappa, phi_k, kappa_angle=60, degrees=True, bernina_kappa=True, invert_elbow=False,
self,
eta_k,
kappa,
phi_k,
kappa_angle=60,
degrees=True,
bernina_kappa=True,
invert_elbow=False,
):
if degrees:
eta_k, kappa, phi_k, kappa_angle = np.deg2rad(
@@ -801,7 +860,7 @@ class XRDYou(Assembly):
if bernina_kappa:
eta_k = eta_k + np.pi / 2
kappa = -kappa
#phi_k = -phi_k
# phi_k = -phi_k
if invert_elbow:
kappa = -kappa
delta_angle = np.pi - np.arctan(np.tan(kappa / 2) * np.cos(kappa_angle))
@@ -817,52 +876,53 @@ class XRDYou(Assembly):
phi = -phi
return eta, chi, phi
#################
# def calc_you2kappa(
# self, eta, chi, phi, kappa_angle=60, degrees=True, bernina_kappa=True
# ):
# """tool to convert from you definition angles to kappa angles, in
# particular the bernina kappa where the"""
# if bernina_kappa:
# eta = -eta
# if degrees:
# eta, chi, phi, kappa_angle = np.deg2rad([eta, chi, phi, kappa_angle])
# delta_angle = np.arcsin(-np.tan(chi / 2) / np.tan(kappa_angle))
# eta_k = eta - delta_angle
# kappa = 2 * np.arcsin(np.sin(chi / 2) / np.sin(kappa_angle))
# phi_k = phi - delta_angle
#
# if bernina_kappa:
# eta_k = eta_k - np.pi / 2
# kappa = -kappa
# phi_k = phi_k
# if degrees:
# eta_k, kappa, phi_k = np.rad2deg([eta_k, kappa, phi_k])
# return eta_k, kappa, phi_k
#
# def calc_kappa2you(
# self, eta_k, kappa, phi_k, kappa_angle=60, degrees=True, bernina_kappa=True
# ):
# if degrees:
# eta_k, kappa, phi_k, kappa_angle = np.deg2rad(
# [eta_k, kappa, phi_k, kappa_angle]
# )
# if bernina_kappa:
# eta_k = eta_k + np.pi / 2
# kappa = -kappa
# phi_k = phi_k
# delta_angle = np.arctan(np.tan(kappa / 2) * np.cos(kappa_angle))
# eta = eta_k - delta_angle
# chi = 2 * np.arcsin(np.sin(kappa / 2) * np.sin(kappa_angle))
# phi = phi_k - delta_angle
# if degrees:
# eta, chi, phi = np.rad2deg([eta, chi, phi])
# if bernina_kappa:
# eta = -eta
# return eta, chi, phi
#
# # def __repr__(self):
# # return self.get_adjustable_positions_str()
# def calc_you2kappa(
# self, eta, chi, phi, kappa_angle=60, degrees=True, bernina_kappa=True
# ):
# """tool to convert from you definition angles to kappa angles, in
# particular the bernina kappa where the"""
# if bernina_kappa:
# eta = -eta
# if degrees:
# eta, chi, phi, kappa_angle = np.deg2rad([eta, chi, phi, kappa_angle])
# delta_angle = np.arcsin(-np.tan(chi / 2) / np.tan(kappa_angle))
# eta_k = eta - delta_angle
# kappa = 2 * np.arcsin(np.sin(chi / 2) / np.sin(kappa_angle))
# phi_k = phi - delta_angle
#
# if bernina_kappa:
# eta_k = eta_k - np.pi / 2
# kappa = -kappa
# phi_k = phi_k
# if degrees:
# eta_k, kappa, phi_k = np.rad2deg([eta_k, kappa, phi_k])
# return eta_k, kappa, phi_k
#
# def calc_kappa2you(
# self, eta_k, kappa, phi_k, kappa_angle=60, degrees=True, bernina_kappa=True
# ):
# if degrees:
# eta_k, kappa, phi_k, kappa_angle = np.deg2rad(
# [eta_k, kappa, phi_k, kappa_angle]
# )
# if bernina_kappa:
# eta_k = eta_k + np.pi / 2
# kappa = -kappa
# phi_k = phi_k
# delta_angle = np.arctan(np.tan(kappa / 2) * np.cos(kappa_angle))
# eta = eta_k - delta_angle
# chi = 2 * np.arcsin(np.sin(kappa / 2) * np.sin(kappa_angle))
# phi = phi_k - delta_angle
# if degrees:
# eta, chi, phi = np.rad2deg([eta, chi, phi])
# if bernina_kappa:
# eta = -eta
# return eta, chi, phi
#
# # def __repr__(self):
# # return self.get_adjustable_positions_str()
class XRD(Assembly):
+7 -3
View File
@@ -14,12 +14,13 @@ ureg = UnitRegistry()
class IncouplingCleanBernina(Assembly):
def __init__(self, name=None):
super().__init__(name=name)
self._append(SmaractStreamdevice,"SARES23-LIC13",name='tilt')
self._append(SmaractStreamdevice,"SARES23-LIC14",name='rotation')
self._append(SmaractStreamdevice,"SARES23-ESB13",name='tilt')
self._append(SmaractStreamdevice,"SARES23-ESB14",name='rotation')
self._append(SmaractStreamdevice,"SARES23-LIC15",name='transl_vertical')
self._append(MotorRecord,"SARES20-MF2:MOT_5",name='transl_horizontal')
class LaserBernina(Assembly):
def __init__(self, pvname, name=None):
super().__init__(name=name)
@@ -47,7 +48,10 @@ class LaserBernina(Assembly):
self._append(AdjustableFS,'/photonics/home/gac-bernina/eco/configuration/wp_att_calibration',name='wp_att_calibration')
def uJ2wp(uJ):
return np.interp(uJ,*np.asarray(self.wp_att_calibration())[::-1].T[::-1])
direction = 1
if np.mean(np.diff(np.asarray(self.wp_att_calibration()).T[1]))<0:
direction = -1
return np.interp(uJ,*np.asarray(self.wp_att_calibration())[::direction].T[::-1])
def wp2uJ(wp):
return np.interp(wp,*np.asarray(self.wp_att_calibration()).T)
+3 -3
View File
@@ -23,7 +23,7 @@ class MicroscopeMotorRecord(Assembly):
CameraBasler,
pvname_camera,
camserver_alias=camserver_alias,
name="camera",
name=name,
is_setting=True,
is_status="recursive",
)
@@ -62,7 +62,7 @@ class BerninaInlineMicroscope(Assembly):
self._append(
CameraBasler,
pvname_camera,
camserver_alias = self.alias.get_full_name() + f" ({pvname_camera})",
camserver_alias=self.alias.get_full_name() + f" ({pvname_camera})",
name="camera",
is_setting=True,
is_status="recursive",
@@ -83,7 +83,7 @@ class OptoSigmaZoom(Assembly):
name=None,
):
super().__init__(name=name)
self.settings.append(self)
self.settings_collection.append(self)
self._append(
AdjustablePv,
pv_set_position,
+2 -2
View File
@@ -719,7 +719,7 @@ class Gsheet_API:
)
self.gc = gspread.authorize(self._credentials)
self._keydf_fname = keydf_fname
self.keys = "metadata midir xrd energy transmission delay lxt pulse_id att_self att_fe_self"
self.keys = "metadata gps jet energy las_inc delay lxt pulse_id att_self att_fe_self"
self._key_df=DataFrame()
self.gsheet_keys = AdjustableFS(gsheet_key_path, name="gsheet_keys", default_value='metadata thc gps xrd att att_usd kb')
self.init_runtable(exp_id)
@@ -1023,7 +1023,7 @@ class Run_Table_DataFrame(DataFrame):
self._parse_exclude_keys = "status_indicators settings_collection status_indicators_collection presets memory _elog _currentChange _flags __ alias namespace daq scan MasterEventSystem _motor Alias".split(" ")
self._parse_exclude_class_types = ("__ alias namespace daq scan MasterEventSystem _motor Alias AdjustablePv".split(" "))
self._adj_exclude_class_types = ("__ alias namespace daq scan MasterEventSystem _motor Alias".split(" "))
self.key_order = "metadata xrd midir env_thc temperature1_rbk temperature2_rbk time name gps gps_hex thc ocb eos las lxt phase_shifter mono att att_fe slit_und slit_switch slit_att slit_kb slit_cleanup pulse_id mono_energy_rbk att_transmission att_fe_transmission"
self.key_order = "metadata gps xrd midir env_thc temperature1_rbk temperature2_rbk time name gps gps_hex thc ocb eos las lxt phase_shifter mono att att_fe slit_und slit_switch slit_att slit_kb slit_cleanup pulse_id mono_energy_rbk att_transmission att_fe_transmission"
pd.options.display.max_rows = 100
pd.options.display.max_columns = 50
pd.set_option("display.float_format", lambda x: "%.5g" % x)
+199
View File
@@ -636,3 +636,202 @@ class SolidTargetDetectorPBPS_new_assembly(Assembly):
return gains
except:
print("No diodes configured, can not change any gain!")
class SolidTargetDetectorPBPS_assembly(Assembly):
def __init__(
self,
pvname,
VME_crate=None,
pipeline=None,
link=None,
channels={},
ch_up=12,
ch_down=13,
ch_left=15,
ch_right=14,
elog=None,
name=None,
calc=None,
calc_calib={},
):
super().__init__(name=name)
self.pvname = pvname
self._append(
MotorRecord, pvname + ":MOTOR_X1", name="x_diodes", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOTOR_Y1", name="y_diodes", is_setting=True
)
self._append(
MotorRecord, pvname + ":MOTOR_PROBE", name="target_y", is_setting=True
)
self._append(
AdjustablePvEnum, pvname + ":PROBE_SP", name="target", is_setting=True
)
self
if VME_crate:
self.diode_up = FeDigitizer("%s:Lnk%dCh%d" % (VME_crate, link, ch_up))
self.diode_down = FeDigitizer("%s:Lnk%dCh%d" % (VME_crate, link, ch_down))
self.diode_left = FeDigitizer("%s:Lnk%dCh%d" % (VME_crate, link, ch_left))
self.diode_right = FeDigitizer("%s:Lnk%dCh%d" % (VME_crate, link, ch_right))
if channels:
self._append(
DetectorPvDataStream, channels["up"], name="signal_up", is_setting=False
)
self._append(
DetectorPvDataStream,
channels["down"],
name="signal_down",
is_setting=False,
)
self._append(
DetectorPvDataStream,
channels["left"],
name="signal_left",
is_setting=False,
)
self._append(
DetectorPvDataStream,
channels["right"],
name="signal_right",
is_setting=False,
)
if calc:
self._append(
DetectorPvDataStream, calc["itot"], name="intensity", is_setting=False
)
self._append(
DetectorPvDataStream, calc["xpos"], name="xpos", is_setting=False
)
self._append(
DetectorPvDataStream, calc["ypos"], name="ypos", is_setting=False
)
def get_calibration_values(self, seconds=5):
self.x_diodes.set_target_value(0).wait()
self.y_diodes.set_target_value(0).wait()
ds = [self.signal_up, self.signal_down, self.signal_left, self.signal_right]
aqs = [d.acquire(seconds=seconds) for d in ds]
data = [aq.wait() for aq in aqs]
mean = [np.mean(td) for td in data]
std = [np.std(td) for td in data]
norm_diodes = [1 / tm / 4 for tm in mean]
return norm_diodes
def set_calibration_values(self, norm_diodes):
# this is now only for bernina when using the ioxos from sla
channels = [
"SLAAR21-LTIM01-EVR0:CALCI.INPG",
"SLAAR21-LTIM01-EVR0:CALCI.INPH",
"SLAAR21-LTIM01-EVR0:CALCI.INPE",
"SLAAR21-LTIM01-EVR0:CALCI.INPF",
]
for tc, tv in zip(channels, norm_diodes):
PV(tc).put(bytes(str(tv), "utf8"))
channels = ["SLAAR21-LTIM01-EVR0:CALCX.INPE", "SLAAR21-LTIM01-EVR0:CALCX.INPF"]
for tc, tv in zip(channels, norm_diodes[2:4]):
PV(tc).put(bytes(str(tv), "utf8"))
channels = ["SLAAR21-LTIM01-EVR0:CALCY.INPE", "SLAAR21-LTIM01-EVR0:CALCY.INPF"]
for tc, tv in zip(channels, norm_diodes[0:2]):
PV(tc).put(bytes(str(tv), "utf8"))
def get_calibration_values_position(
self, calib_intensities, seconds=5, motion_range=0.2
):
self.x_diodes.set_limits(-motion_range / 2 - 0.1, +motion_range / 2 + 0.1)
self.y_diodes.set_limits(-motion_range / 2 - 0.1, +motion_range / 2 + 0.1)
self.x_diodes.set_target_value(0).wait()
self.y_diodes.set_target_value(0).wait()
raw = []
for pos in [motion_range / 2, -motion_range / 2]:
print(pos)
self.x_diodes.set_target_value(pos).wait()
aqs = [
ts.acquire(seconds=seconds)
for ts in [self.signal_left, self.signal_right]
]
vals = [
np.mean(aq.wait()) * calib
for aq, calib in zip(aqs, calib_intensities[0:2])
]
raw.append((vals[0] - vals[1]) / (vals[0] + vals[1]))
grad = motion_range / np.diff(raw)[0]
# xcalib = [np.diff(calib_intensities[0:2])[0]/np.sum(calib_intensities[0:2]), grad]
xcalib = [0, grad]
self.x_diodes.set_target_value(0).wait()
raw = []
for pos in [motion_range / 2, -motion_range / 2]:
self.y_diodes.set_target_value(pos).wait()
aqs = [
ts.acquire(seconds=seconds) for ts in [self.signal_up, self.signal_down]
]
vals = [
np.mean(aq.wait()) * calib
for aq, calib in zip(aqs, calib_intensities[2:4])
]
raw.append((vals[0] - vals[1]) / (vals[0] + vals[1]))
grad = motion_range / np.diff(raw)[0]
# ycalib = [np.diff(calib_intensities[2:4])[0]/np.sum(calib_intensities[2:4]), grad]
ycalib = [0, grad]
self.y_diodes.set_target_value(0).wait()
return xcalib, ycalib
def set_calibration_values_position(self, xcalib, ycalib):
channels = ["SLAAR21-LTIM01-EVR0:CALCX.INPJ", "SLAAR21-LTIM01-EVR0:CALCX.INPI"]
# txcalib = [-1*xcalib[0],-1*xcalib[1]]
for tc, tv in zip(channels, xcalib):
PV(tc).put(bytes(str(tv), "utf8"))
channels = ["SLAAR21-LTIM01-EVR0:CALCY.INPJ", "SLAAR21-LTIM01-EVR0:CALCY.INPI"]
for tc, tv in zip(channels, ycalib):
PV(tc).put(bytes(str(tv), "utf8"))
def calibrate(self, seconds=5):
c = self.get_calibration_values(seconds=seconds)
self.set_calibration_values(c)
xc, yc = self.get_calibration_values_position(c, seconds=seconds)
self.set_calibration_values_position(xc, yc)
def set_gains(self, value):
try:
self.diode_up.gain.set(value)
self.diode_down.gain.set(value)
self.diode_left.gain.set(value)
self.diode_right.gain.set(value)
except:
print("No diodes configured, can not change any gain!")
def get_available_gains(self):
try:
nu = self.diode_up.gain.names
nd = self.diode_down.gain.names
nl = self.diode_left.gain.names
nr = self.diode_right.gain.names
assert (
nu == nd == nl == nr
), "NB: the gain options of the four diodes are not equal!!!"
return nu
except:
print("No diodes configured, can not change any gain!")
def get_gains(self):
try:
gains = dict()
gains["up"] = (self.diode_up.gain.get_name(), self.diode_up.gain.get())
gains["down"] = (
self.diode_down.gain.get_name(),
self.diode_down.gain.get(),
)
gains["left"] = (
self.diode_left.gain.get_name(),
self.diode_left.gain.get(),
)
gains["right"] = (
self.diode_right.gain.get_name(),
self.diode_right.gain.get(),
)
return gains
except:
print("No diodes configured, can not change any gain!")