hardcoded file adjustment in dia, added spectral and spatial encoders, added autocalibrate for monOpt in Bernina

This commit is contained in:
2019-09-18 11:55:40 +02:00
parent c575f4e213
commit 60cf87fca0
4 changed files with 87 additions and 5 deletions
+1 -1
View File
@@ -337,7 +337,7 @@ class DIAClient:
self.client.stop()
outputfilenames = [
f"{file_name_JF}.{tcli.upper()}.h5" for tcli in self.active_clients+['camera'] # DIRTY HACK
f"{file_name_JF}.{tcli.upper()}.h5" for tcli in self.active_clients+['BSREAD.h5_SARES20-CAMS142-M4','BSREAD.h5_SARES20-CAMS142-M5'] # DIRTY HACK
]
return Acquisition(
+2 -2
View File
@@ -178,7 +178,7 @@ components = [
"desc": "Intensity/position monitor after Optics hutch",
"type": "eco.xdiagnostics.intensity_monitors:SolidTargetDetectorPBPS_new",
"args": ["SAROP21-PBPS133"],
"kwargs": {"VME_crate": "SAROP21-CVME-PBPS1", "link": 9, 'channels':{'up':'SLAAR21-LSCP1-FNS:CH4:VAL_GET','down':'SLAAR21-LSCP1-FNS:CH5:VAL_GET','left':'SLAAR21-LSCP1-FNS:CH6:VAL_GET','right':'SLAAR21-LSCP1-FNS:CH7:VAL_GET'},'calc':{'itot':'SLAAR21-LTIM01-EVR0:CALCI','xpos':'SLAAR21-LTIM01-EVR0:CALCX','ypos':'SLAAR21-LTIM01-EVR0:CALCY'}},
"kwargs": {"VME_crate": "SAROP21-CVME-PBPS1", "link": 9, 'channels':{'up':'SLAAR21-LSCP1-FNS:CH6:VAL_GET','down':'SLAAR21-LSCP1-FNS:CH7:VAL_GET','left':'SLAAR21-LSCP1-FNS:CH4:VAL_GET','right':'SLAAR21-LSCP1-FNS:CH5:VAL_GET'},'calc':{'itot':'SLAAR21-LTIM01-EVR0:CALCI','xpos':'SLAAR21-LTIM01-EVR0:CALCX','ypos':'SLAAR21-LTIM01-EVR0:CALCY'}},
},
{
"name": "prof_opt",
@@ -479,7 +479,7 @@ components = [
"name": "default_channel_list_bs",
"desc": "Bernina default bs channels, used by bs_daq",
"type": "eco.utilities.config:ChannelList",
"kwargs": {"file_name":"/sf/bernina/config/channel_lists/default_channel_list"},
"kwargs": {"file_name":"/sf/bernina/config/channel_lists/default_channel_list_bs"},
"lazy": False,
},
{
+11
View File
@@ -32,6 +32,7 @@ class DelayTime(AdjustableVirtual):
self._group_velo = 299798458 # m/s
self._passes = passes
self.Id = stage.Id + "_delay"
self._stage = stage
AdjustableVirtual.__init__(
self,
[stage],
@@ -57,6 +58,16 @@ class DelayTime(AdjustableVirtual):
s += f"{colorama.Style.RESET_ALL}"
return s
def get_limits(self):
return [self._mm_to_s(tl) for tl in self._stage.get_limits()]
def set_limits(self,low_limit,high_limit):
lims_stage = [self._s_to_mm(tl) for tl in [low_limit,high_limit]]
lims_stage.sort()
self._stage.set_limits(*lims_stage)
return [self._mm_to_s(tl) for tl in self._stage.get_limits()]
class DelayCompensation(AdjustableVirtual):
"""Simple virtual adjustable for compensating delay adjustables. It assumes the first adjustable is the master for
+73 -2
View File
@@ -4,6 +4,7 @@ from ..devices_general.detectors import FeDigitizer,PvDataStream
from ..devices_general.adjustable import PvEnum
from ..aliases import Alias,append_object_to_object
from epics import PV
import numpy as np
class GasDetector:
@@ -32,8 +33,8 @@ class SolidTargetDetectorPBPS_new:
self.name = name
self.pvname = pvname
self.alias = Alias(name)
append_object_to_object(self,MotorRecord,pvname + ":MOTOR_X1", name="diodes_x")
append_object_to_object(self,MotorRecord,pvname + ":MOTOR_Y1", name="diodes_y")
append_object_to_object(self,MotorRecord,pvname + ":MOTOR_X1", name="x_diodes")
append_object_to_object(self,MotorRecord,pvname + ":MOTOR_Y1", name="y_diodes")
append_object_to_object(self,MotorRecord,pvname + ":MOTOR_PROBE", name="target_y")
append_object_to_object(self,PvEnum,pvname + ":PROBE_SP", name="target")
if VME_crate:
@@ -54,6 +55,76 @@ class SolidTargetDetectorPBPS_new:
append_object_to_object(self,PvDataStream,calc['xpos'], name="xpos")
append_object_to_object(self,PvDataStream,calc['ypos'], name="ypos")
def get_calibration_values(self,seconds=5):
self.x_diodes.set_target(0).wait()
self.y_diodes.set_target(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.INPF','SLAAR21-LTIM01-EVR0:CALCI.INPE']
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=.2):
self.x_diodes.set_limits(-motion_range/2-.1,+motion_range/2+.1)
self.y_diodes.set_limits(-motion_range/2-.1,+motion_range/2+.1)
self.x_diodes.set_target(0).wait()
self.y_diodes.set_target(0).wait()
raw = []
for pos in [motion_range/2, -motion_range/2]:
self.x_diodes.set_target(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(0).wait()
raw = []
for pos in [motion_range/2, -motion_range/2]:
self.y_diodes.set_target(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(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 __repr__(self):
s = f"**Intensity monitor {self.name}**\n\n"