diff --git a/PMS.py b/PMS.py new file mode 100644 index 0000000..d248d28 --- /dev/null +++ b/PMS.py @@ -0,0 +1,35 @@ +from slic.utils.hastyepics import get_pv as PV +from slic.core.device.basedevice import BaseDevice +from slic.core.adjustable import PVAdjustable +from slic.utils import typename + +CTA_sequence_start_PID = PV("SAR-CCTA-ESC:seq0Ctrl-StartedAt-O") + +class PP_Shutter: + """Pulsed magnet instrument classs""" + def __init__(self, ID,name="Pulsed Magnet Instrument"): + self.ID = ID + self.name = name or ID + pvname_setvalue = ID + pvname_readback = ID + self._adj = PVAdjustable(pvname_setvalue, pvname_readback, accuracy=0, internal=True) + + def close(self): + self._adj.set_target_value(0).wait() + + def open(self): + self._adj.set_target_value(1).wait() + + @property + def status(self): + state = self._adj.get_current_value() + if state is None: + return "not connected" + return "open" if state else "closed" + + def __repr__(self): + tn = typename(self) + return f"{tn} \"{self.name}\" is {self.status}" + + + diff --git a/__pycache__/alignment_laser.cpython-39.pyc b/__pycache__/alignment_laser.cpython-39.pyc new file mode 100644 index 0000000..5e631ca Binary files /dev/null and b/__pycache__/alignment_laser.cpython-39.pyc differ diff --git a/__pycache__/attocube.cpython-39.pyc b/__pycache__/attocube.cpython-39.pyc index b569d57..b6a004c 100644 Binary files a/__pycache__/attocube.cpython-39.pyc and b/__pycache__/attocube.cpython-39.pyc differ diff --git a/__pycache__/attocube_device_def.cpython-39.pyc b/__pycache__/attocube_device_def.cpython-39.pyc index a0fc4c2..4f94fed 100644 Binary files a/__pycache__/attocube_device_def.cpython-39.pyc and b/__pycache__/attocube_device_def.cpython-39.pyc differ diff --git a/__pycache__/bs_channels.cpython-39.pyc b/__pycache__/bs_channels.cpython-39.pyc new file mode 100644 index 0000000..19c418d Binary files /dev/null and b/__pycache__/bs_channels.cpython-39.pyc differ diff --git a/__pycache__/channels.cpython-39.pyc b/__pycache__/channels.cpython-39.pyc index ab9b052..1c9a083 100644 Binary files a/__pycache__/channels.cpython-39.pyc and b/__pycache__/channels.cpython-39.pyc differ diff --git a/__pycache__/cristallina.cpython-39.pyc b/__pycache__/cristallina.cpython-39.pyc new file mode 100644 index 0000000..893d221 Binary files /dev/null and b/__pycache__/cristallina.cpython-39.pyc differ diff --git a/__pycache__/pp_shutter.cpython-39.pyc b/__pycache__/pp_shutter.cpython-39.pyc index 1ec00f3..51457f4 100644 Binary files a/__pycache__/pp_shutter.cpython-39.pyc and b/__pycache__/pp_shutter.cpython-39.pyc differ diff --git a/__pycache__/pv_channels.cpython-39.pyc b/__pycache__/pv_channels.cpython-39.pyc new file mode 100644 index 0000000..e56c060 Binary files /dev/null and b/__pycache__/pv_channels.cpython-39.pyc differ diff --git a/__pycache__/smaract.cpython-39.pyc b/__pycache__/smaract.cpython-39.pyc index 35d4fea..44110f3 100644 Binary files a/__pycache__/smaract.cpython-39.pyc and b/__pycache__/smaract.cpython-39.pyc differ diff --git a/__pycache__/spreadsheet.cpython-39.pyc b/__pycache__/spreadsheet.cpython-39.pyc index ca7c365..3585106 100644 Binary files a/__pycache__/spreadsheet.cpython-39.pyc and b/__pycache__/spreadsheet.cpython-39.pyc differ diff --git a/attocube_device_def.py b/attocube_device_def.py index 29c28d4..82361ac 100644 --- a/attocube_device_def.py +++ b/attocube_device_def.py @@ -1,6 +1,42 @@ from attocube import AttocubeStage attocube = AttocubeStage("SARES30-ATTOCUBE", - Z='SARES30-ATTOCUBE:A0', + Y='SARES30-ATTOCUBE:A2', X='SARES30-ATTOCUBE:A1', - ) \ No newline at end of file + ) + +# def make_AttocubeStage(name): +# return AttocubeStage(name, +# Z=name+':A0', +# X=name+':A1', +# ) + +# class NamedAttocubeStage(AttocubeStage): +# def __init__(self, name): +# super().__init__(name, +# Z=name+':A0', +# X=name+':A1', +# ) + + + +# def set_target_value(self, value): +# t1 = self.stage1.set_target_value(value) +# t2 = self.stage2.set_target_value(-value) +# t1.wait() +# t2.wait() + +# def is_moving(self): +# return any(self.stage1.is_moving(), self.stage2.is_moving()) + + + + + + + +# t = daq.aquire(...) +# for pos in []: +# mot.set_target_value(pos).wait() +# sleep() +# t.stop() \ No newline at end of file diff --git a/bs_channels.py b/bs_channels.py new file mode 100644 index 0000000..421784e --- /dev/null +++ b/bs_channels.py @@ -0,0 +1,170 @@ +# Channels to save at Cristallina endstation + +########################################################################################################## +########################################################################################################## +########################################################################################################## +# BS channels + +# TODO: JF settings regarding raw conversion, compression, etc. +detectors = [ + "JF16T03V01", +] + +camera_channels = [ + # "SARES30-CAMS156-PCO1:FPICTURE", # PCO edge camera for the wavefront analysis (from Alvra) + # "SARES30-CAMS156-SMX-OAV:FPICTURE", # SwissMX OAV camera picture + # "SARES30-CAMS156-XE:FPICTURE", # X-ray eye +] + +#################### +# Machine gas intensity monitor +channels_gas_monitor = [ + "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG", + # "SARFE10-PBPG050:SLOW-X", + # "SARFE10-PBPG050:SLOW-Y", + "SARFE10-PBIG050-EVR0:CALCI", # good for correlations with total beam intensity + "SARFE10-PBPG050:HAMP-INTENSITY-CAL", +] + +###################### +# PBPS053 +channels_PBPS053 = [ + "SARFE10-PBPS053:INTENSITY", + "SARFE10-PBPS053:XPOS", + "SARFE10-PBPS053:YPOS", +] + +#################### +# PSSS059 +channels_PSSS059=[ + "SARFE10-PSSS059:FIT-COM", + "SARFE10-PSSS059:FIT-FWHM", + "SARFE10-PSSS059:FIT-RES", + "SARFE10-PSSS059:FIT-RMS", + "SARFE10-PSSS059:SPECT-COM", + "SARFE10-PSSS059:SPECT-RES", + "SARFE10-PSSS059:SPECT-RMS", + "SARFE10-PSSS059:SPECTRUM_Y_SUM" + "SARFE10-PSSS059:SPECTRUM_X", + "SARFE10-PSSS059:SPECTRUM_Y", + # "SARFE10-PSSS059:FPICTURE", + # "SARFE10-PSSS059:FIT_ERR", + "SARFE10-PSSS059:processing_parameters", + # "SARFE10-PSSS059:SPECTRUM_AVG_CENTER", + # "SARFE10-PSSS059:SPECTRUM_AVG_FWHM", + # "SARFE10-PSSS059:SPECTRUM_AVG_Y", +] + +################################### +# Beam position monitor PBPS113 +channels_PBPS113 = [ + "SAROP31-PBPS113:INTENSITY", + "SAROP31-PBPS113:INTENSITY_UJ", + "SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD0", + "SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD1", + "SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD2", + "SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD3", + # "SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD4", + "SAROP31-PBPS113:XPOS", + "SAROP31-PBPS113:YPOS", +] + +#################### +# Profile monitor PPRM113 (from _proc process) +channels_PPRM113 = [ + "SAROP31-PPRM113:intensity", + "SAROP31-PPRM113:x_center_of_mass", + "SAROP31-PPRM113:x_fit_amplitude", + "SAROP31-PPRM113:x_fit_mean", + "SAROP31-PPRM113:x_fit_offset", + "SAROP31-PPRM113:x_fit_standard_deviation", + "SAROP31-PPRM113:x_fwhm", + "SAROP31-PPRM113:x_profile", + "SAROP31-PPRM113:x_rms", + "SAROP31-PPRM113:y_center_of_mass", + "SAROP31-PPRM113:y_fit_amplitude", + "SAROP31-PPRM113:y_fit_mean", + "SAROP31-PPRM113:y_fit_offset", + "SAROP31-PPRM113:y_fit_standard_deviation", + "SAROP31-PPRM113:y_fwhm", + "SAROP31-PPRM113:y_profile", + "SAROP31-PPRM113:y_rms", + # "SAROP31-PPRM113:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process +] + +########################### +# Beam position monitor PBPS149 +channel_PBPS149 = [ + "SAROP31-PBPS149:INTENSITY", + "SAROP31-PBPS149:INTENSITY_UJ", + "SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD0", + "SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD1", + "SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD2", + "SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD3", + # "SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD4", + "SAROP31-PBPS149:XPOS", + "SAROP31-PBPS149:YPOS", +] + +####################### +# Profile monitor PPRM150 (from _proc process) +channels_PPRM150 = [ + "SAROP31-PPRM150:intensity", + "SAROP31-PPRM150:x_center_of_mass", + "SAROP31-PPRM150:x_fit_amplitude", + "SAROP31-PPRM150:x_fit_mean", + "SAROP31-PPRM150:x_fit_offset", + "SAROP31-PPRM150:x_fit_standard_deviation", + "SAROP31-PPRM150:x_fwhm", + "SAROP31-PPRM150:x_profile", + "SAROP31-PPRM150:x_rms", + "SAROP31-PPRM150:y_center_of_mass", + "SAROP31-PPRM150:y_fit_amplitude", + "SAROP31-PPRM150:y_fit_mean", + "SAROP31-PPRM150:y_fit_offset", + "SAROP31-PPRM150:y_fit_standard_deviation", + "SAROP31-PPRM150:y_fwhm", + "SAROP31-PPRM150:y_profile", + "SAROP31-PPRM150:y_rms", + # "SAROP31-PPRM150:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process +] + +####################### +# Cristallina event reciever +channels_EVR = [ + 'SAR-CVME-TIFALL6:EvtSet', +] + +####################### +# Digitizer +channels_digitizer =[ + "SARES30-LTIM01-EVR0:DUMMY_PV1_NBS", + "SARES30-LTIM01-EVR0:DUMMY_PV2_NBS", + "SARES30-LTIM01-EVR0:DUMMY_PV3_NBS", + "SARES30-LTIM01-EVR0:DUMMY_PV4_NBS", + "SARES30-LSCP1-FNS:CH0:VAL_GET", # Signal-Background + "SARES30-LSCP1-CRISTA1:CH0:1", # Waveform signal + "SARES30-LSCP1-CRISTA1:CH2:1", # Waveform trigger + "SARES30-LTIM01-EVR0:CALCI", # Calculated intensity +] + +####################### +# Other BS channels that we sometimes use +channels_other = [ +] + +bs_channels = ( + camera_channels + + channels_gas_monitor + + channels_PBPS053 + + channels_PBPS053 + + channels_PSSS059 + + channels_PBPS113 + + channels_PPRM113 + + channel_PBPS149 + + channels_PPRM150 + + channels_EVR + # + channels_digitizer + # + channels_other +) + diff --git a/cristallina.py b/cristallina.py index 19c2bb5..3681729 100644 --- a/cristallina.py +++ b/cristallina.py @@ -33,7 +33,8 @@ from slic.utils import Channels, Config, Elog, Screenshot, PV from slic.core.acquisition.fakeacquisition import FakeAcquisition from slic.devices.timing.events import CTASequencer -from channels import detectors, bs_channels, pvs +from bs_channels import detectors, bs_channels +from pv_channels import pvs from spreadsheet import overview from channels_minimal import detectors_min, channels_min, pvs_min from pp_shutter import PP_Shutter @@ -157,7 +158,7 @@ import daq_client as sf_daq_client CTA_sequence_start_PID = PV("SAR-CCTA-ESC:seq0Ctrl-StartedAt-O") # Number of pulses to ask from the SFDAQ. This will depend on the CTA sequence. -npulses = 22 +# npulses = 100 def pulse(run_comment=None): # Start the CTA sequence @@ -176,11 +177,12 @@ def pulse(run_comment=None): used_detectors = detectors used_detectors = {"JF16T03V01":{}} + # TODO: change to SFAcquisition.retrieve(...) from slic # Ask the DAQ client to download the data run_number = sf_daq_client.retrieve_data_from_buffer(pgroup=pgroup, user_tag=run_comment, - camera_channels=[], bsread_channels=channels, epics_channels=pvs, + camera_channels=[], bsread_channels=bs_channels, epics_channels=pvs, detectors=used_detectors, - start_pulseid=start_PID, stop_pulseid=start_PID+npulses, + start_pulseid=start_PID-90, stop_pulseid=start_PID+20, rate_multiplicator=1, ) print('\n') diff --git a/measurement_scripts/DilSc_commisioning_pulses.py b/measurement_scripts/DilSc_commisioning_pulses.py new file mode 100644 index 0000000..9daca5e --- /dev/null +++ b/measurement_scripts/DilSc_commisioning_pulses.py @@ -0,0 +1,10 @@ +from time import sleep, time +from cristallina import cta, daq + +def make_pulse_train(): + recording = daq.acquire('pulsing_sequence',n_pulses=100*101,wait=False) + cta.start() + recording.wait() + print('done') + +#daq.acquire(filename, data_base_dir=None, detectors=None, channels=None, pvs=None, scan_info=None, n_pulses=100, continuous=False, is_scan_step=False, wait=True): \ No newline at end of file diff --git a/measurement_scripts/__pycache__/DilSc_commisioning_pulses.cpython-39.pyc b/measurement_scripts/__pycache__/DilSc_commisioning_pulses.cpython-39.pyc new file mode 100644 index 0000000..987f81d Binary files /dev/null and b/measurement_scripts/__pycache__/DilSc_commisioning_pulses.cpython-39.pyc differ diff --git a/measurement_scripts/__pycache__/inprints.cpython-39.pyc b/measurement_scripts/__pycache__/inprints.cpython-39.pyc new file mode 100644 index 0000000..2900c23 Binary files /dev/null and b/measurement_scripts/__pycache__/inprints.cpython-39.pyc differ diff --git a/measurement_scripts/inprints.py b/measurement_scripts/inprints.py index 8316e44..cc1aebf 100644 --- a/measurement_scripts/inprints.py +++ b/measurement_scripts/inprints.py @@ -6,6 +6,7 @@ import numpy as np #from slic.devices.general.motor import Motor import matplotlib.pyplot as plt import epics +from cristallina import attocube, attenuator from slic.devices.xoptics.aramis_attenuator import Attenuator attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150") @@ -38,7 +39,7 @@ between_KB_settings = 500 KBvs = [[1,2],[1,3],[1,2],[1,3],[1,2]] KBhs = [[1,2],[1,2],[1,2],[1,3],[1,2]] -# Time estimates for total time calculation +# Time estimates for total time calculation (time in seconds) t_kb_change = 30 t_shot = 5 t_atten_change = 20 @@ -48,8 +49,9 @@ def shoot(pos=pos,testing=testing_flag): print(f'Shot at: {pos}') return pos else: - epics.caput("SAR-CCTA-ESC:seq0Ctrl-Start-I",1) - + print(f'Shot at: {pos}') + #epics.caput("SAR-CCTA-ESC:seq0Ctrl-Start-I",1) + pass def change_benders(bender_1,bender_2,KB = None,do_not_move_benders = do_not_move_benders): check_KB_value(KB) @@ -104,6 +106,8 @@ def move_x_rel(distance,testing=testing_flag,pos=pos): return pos else: attocube.X.set_target_value(distance, relative=True).wait() + pos = pos + np.array([distance,0]) + return pos def move_y_rel(distance,testing=testing_flag,pos=pos): if testing == True: @@ -111,6 +115,8 @@ def move_y_rel(distance,testing=testing_flag,pos=pos): return pos else: attocube.Y.set_target_value(distance, relative=True).wait() + pos = pos + np.array([0,distance]) + return pos def move_x(value,testing=testing_flag,pos=pos): if testing == True: @@ -149,7 +155,7 @@ def make_attenuations(attenuations,testing=testing_flag,pos=pos): attenuator.trans1st(attenuation).wait() print('Making same shots') make_same_shots(n_same_holes,pos=pos) - pos = move_y_rel(between_attenuations,pos=pos) + pos = move_y_rel(between_attenuations,pos=pos,testing=testing) # Return back to where you started if testing == True: @@ -163,18 +169,21 @@ def make_same_shots(n_same_holes,testing=testing_flag,pos=pos): original_position = pos else: original_position = [attocube.X.get_current_value(),attocube.Y.get_current_value()] - + # Make holes for shot in range(n_same_holes): + sleep(1) shoot(pos=pos) - pos = move_x_rel(between_same_shots,pos=pos) + pos = move_x_rel(between_same_shots,pos=pos,testing=testing) # Return back to where you started move(original_position) -# Estimate total time -total_time = len(KBhs)*len(KBvs)*(t_kb_change+len(attenuations)*(t_atten_change+n_same_holes*t_shot) ) +def estimate_total_time(KBhs=KBhs,KBvs=KBvs,attenuations=attenuations,n_same_holes=n_same_holes,t_kb_change=t_kb_change,t_atten_change=t_atten_change,t_shot=t_shot): + total_time = len(KBhs)*len(KBvs)*(t_kb_change+len(attenuations)*(t_atten_change+n_same_holes*t_shot) ) + print(f'Total time estimate: {(total_time/60):.1f} minutes or {(total_time/60/60):.1f} hours') + return total_time # Get the starting x-position if testing_flag == True: @@ -182,34 +191,37 @@ if testing_flag == True: else: starting_x_pos = attocube.X.get_current_value() -# The actual loop to make inprints -for i,KBv in enumerate(KBvs): - change_benders(KBv[0],KBv[1],KB = 'v') - for ind,KBh in enumerate(KBhs): - change_benders(KBh[0],KBh[1],KB = 'h') - - print(f'Progress so far: KBv loop: {i+1}/{len(KBvs)}. KBh loop:{ind+1}/{len(KBhs)}') - make_attenuations(attenuations,pos=pos) - print(f'Moving to a new KBh setting') +def make_everything(KBvs,KBhs,attenuations,n_same_holes,testing=testing_flag,pos=pos): + # The actual loop to make inprints + for i,KBv in enumerate(KBvs): + change_benders(KBv[0],KBv[1],KB = 'v') + + for ind,KBh in enumerate(KBhs): + change_benders(KBh[0],KBh[1],KB = 'h') + + print(f'Progress so far: KBv loop: {i+1}/{len(KBvs)}. KBh loop:{ind+1}/{len(KBhs)}') + make_attenuations(attenuations,pos=pos) + + print(f'Moving to a new KBh setting') + # Move to the last shot of the same shot + the spacing between KB settings + pos = move_x_rel(between_KB_settings+between_same_shots*(n_same_holes-1),pos=pos) + + print('KBh set done, returning to starting_x_pos') # Move to the last shot of the same shot + the spacing between KB settings - pos = move_x_rel(between_KB_settings+between_same_shots*(n_same_holes-1),pos=pos) - print('KBh set done, returning to starting_x_pos') - # Move to the last shot of the same shot + the spacing between KB settings + pos = move_x(starting_x_pos,pos=pos) - pos = move_x(starting_x_pos,pos=pos) + print('#################################################################################') + print('Moving to a new KBv setting') + # Move to the last shot of the same shot + the spacing between KB settings - print('#################################################################################') - print('Moving to a new KBv setting') - # Move to the last shot of the same shot + the spacing between KB settings - - pos = move_y_rel(between_KB_settings+between_attenuations*(len(attenuations)-1),pos=pos) + pos = move_y_rel(between_KB_settings+between_attenuations*(len(attenuations)-1),pos=pos) -print('Inprints are done') -print(f'Total time estimate: {(total_time/60):.1f} minutes or {(total_time/60/60):.1f} hours') + print('Inprints are done') + print(f'Total time estimate: {(total_time/60):.1f} minutes or {(total_time/60/60):.1f} hours') # To do: # Fix movement of the attocubes in real time diff --git a/pv_channels.py b/pv_channels.py new file mode 100644 index 0000000..8a5c45f --- /dev/null +++ b/pv_channels.py @@ -0,0 +1,355 @@ +########################################################################################################## +########################################################################################################## +########################################################################################################## +# Epics PVS + +# Compression, charge settings +####################### +# Machine +pvs_machine = [ + "SARCL02-MBND100:P-READ", # Predicted bunch energy + "SARUN:FELPHOTENE.VAL", # Predicted photon energy from machine settings + "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG.VAL" # Average pulse energy from the gas detector +] + +####################### +# Undulator gap +pvs_undulator =[ + "SARUN03-UIND030:K_SET.VAL", + "SARUN04-UIND030:K_SET.VAL", + "SARUN05-UIND030:K_SET.VAL", + "SARUN06-UIND030:K_SET.VAL", + "SARUN07-UIND030:K_SET.VAL", + "SARUN08-UIND030:K_SET.VAL", + "SARUN09-UIND030:K_SET.VAL", + "SARUN10-UIND030:K_SET.VAL", + "SARUN11-UIND030:K_SET.VAL", + "SARUN12-UIND030:K_SET.VAL", + "SARUN13-UIND030:K_SET.VAL", + "SARUN14-UIND030:K_SET.VAL", + "SARUN15-UIND030:K_SET.VAL", +] + +#################### +# Machine gas intensity monitor +pvs_gas_monitor = [ + "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US", + "SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-DS", +] + +##################### +# Slits OAPU044 +pvs_OAPU044=[ + "SARFE10-OAPU044:MOTOR_X", + "SARFE10-OAPU044:MOTOR_Y", + "SARFE10-OAPU044:MOTOR_W", + "SARFE10-OAPU044:MOTOR_H", +] + +################### +# Beam position monitor PBPS053 +pvs_PBPS053 = [ + "SARFE10-PBPS053:MOTOR_X1", + "SARFE10-PBPS053:MOTOR_X2", + "SARFE10-PBPS053:MOTOR_PROBE", +] + +#################### +# Upstream attenuator OATT053 +pvs_OATT053=[ + "SARFE10-OATT053:MOTOR_1", + "SARFE10-OATT053:MOTOR_1.RBV", + "SARFE10-OATT053:MOTOR_2", + "SARFE10-OATT053:MOTOR_2.RBV", + "SARFE10-OATT053:MOTOR_3", + "SARFE10-OATT053:MOTOR_3.RBV", + "SARFE10-OATT053:MOTOR_4", + "SARFE10-OATT053:MOTOR_4.RBV", + "SARFE10-OATT053:MOTOR_5", + "SARFE10-OATT053:MOTOR_5.RBV", + "SARFE10-OATT053:MOTOR_6", + "SARFE10-OATT053:MOTOR_6.RBV", + "SARFE10-OATT053:ENERGY", + "SARFE10-OATT053:TRANS_SP", + "SARFE10-OATT053:TRANS_RB", +] + +################### +# Beam profile monitor PPRM053 +pvs_PPRM053 = [ + "SARFE10-PPRM053:MOTOR_PROBE.RBV", +] + +#################### +# Single shot spectrometer PSS059 +pvs_PSSS059 = [ + # "SARFE10-PSSS059:FPICTURE", # full pictures only when really needed + "SARFE10-PSSS059:SPECTRUM_X", + "SARFE10-PSSS059:SPECTRUM_Y", + "SARFE10-PSSS059:SPECTRUM_CENTER", + "SARFE10-PSSS059:SPECTRUM_COM", + "SARFE10-PSSS059:SPECTRUM_FWHM", + "SARFE10-PSSS059:SPECTRUM_STD", + "SARFE10-PSSS059:FIT_ERR", + "SARFE10-PSSS059:processing_parameters", + "SARFE10-PSSS059:SPECTRUM_AVG_CENTER," + "SARFE10-PSSS059:SPECTRUM_AVG_FWHM", + "SARFE10-PSSS059:SPECTRUM_AVG_Y", +] + +#################### +# First Cristallina horizontal offset mirror OOMH067 +pvs_OOMH067 = [ + "SAROP31-OOMH067:W_X.RBV", + "SAROP31-OOMH067:W_Y.RBV", + "SAROP31-OOMH067:W_RX.RBV", + "SAROP31-OOMH067:W_RY.RBV", + "SAROP31-OOMH067:W_RZ.RBV", + "SAROP31-OOMH067:BU.RBV", + "SAROP31-OOMH067:BD.RBV", + "SAROP31-OOMH067:VS1.RBV", + "SAROP31-OOMH067:VS2.RBV", + "SAROP31-OOMH067:VS3.RBV", + "SAROP31-OOMH067:TX.RBV", + "SAROP31-OOMH067:RY.RBV", +] + +#################### +# Beam screen between the first two horizontal mirrors PSCR068 +pvs_PSCR068 = [ + "SAROP31-PSCR068:MOTOR_PROBE.RBV", +] + +#################### +# Second Cristallina horizontal offset mirror OOMH084 +pvs_OOMH084 = [ + "SAROP31-OOMH084:W_X.RBV", + "SAROP31-OOMH084:W_Y.RBV", + "SAROP31-OOMH084:W_RX.RBV", + "SAROP31-OOMH084:W_RY.RBV", + "SAROP31-OOMH084:W_RZ.RBV", + "SAROP31-OOMH084:BU.RBV", + "SAROP31-OOMH084:BD.RBV", + "SAROP31-OOMH084:VS1.RBV", + "SAROP31-OOMH084:VS2.RBV", + "SAROP31-OOMH084:VS3.RBV", + "SAROP31-OOMH084:TX.RBV", + "SAROP31-OOMH084:RY.RBV", +] + +################### +# Beam profile monitor PPRM085 +pvs_PPRM085 = [ + "SAROP31-PPRM085:MOTOR_PROBE.RBV", +] + +################### +# Slits OAPU107 +pvs_OAPU107 = [ + "SAROP31-OAPU107:MOTOR_X.VAL", + "SAROP31-OAPU107:MOTOR_X.RBV", + "SAROP31-OAPU107:MOTOR_Y.VAL", + "SAROP31-OAPU107:MOTOR_Y.RBV", +] + +################### +## Beam position and intensity monitor PBPS113 +pvs_PBPS113 = [ + "SAROP31-PBPS113:MOTOR_X1.RBV", + "SAROP31-PBPS113:MOTOR_Y1.RBV", + "SAROP31-PBPS113:MOTOR_PROBE.RBV", + "" +] + +################### +# Beam profile monitor PPRM113 +pvs_PPRM113 = [ + "SAROP31-PPRM113:MOTOR_PROBE.RBV", +] + +#################### +# Alignment laser mirror OLAS147 +pvs_OLAS147 = [ + "SAROP31-OLAS147:MOTOR_1.RBV", +] + +################### +# Slits OAPU149 +pvs_OAPU149 = [ + "SAROP31-OAPU149:MOTOR_X.VAL", + "SAROP31-OAPU149:MOTOR_X.RBV", + "SAROP31-OAPU149:MOTOR_Y.VAL", + "SAROP31-OAPU149:MOTOR_Y.RBV", +] + +################### +# Beam position and intensity monitor PBPS149 +pvs_PBPS149 = [ + "SAROP31-PBPS149:MOTOR_X1.RBV", + "SAROP31-PBPS149:MOTOR_Y1.RBV", + "SAROP31-PBPS149:MOTOR_PROBE.RBV", +] + +################### +# Beam profile monitor PPRM150 +pvs_PPRM150 = [ + "SAROP31-PPRM150:MOTOR_PROBE.RBV", +] + +#################### +# Attenuators OATA150 +pvs_OATA150 = [ + "SAROP31-OATA150:MOTOR_1.RBV", + "SAROP31-OATA150:MOTOR_2.RBV", + "SAROP31-OATA150:MOTOR_3.RBV", + "SAROP31-OATA150:MOTOR_4.RBV", + "SAROP31-OATA150:MOTOR_5.RBV", + "SAROP31-OATA150:MOTOR_6.RBV", + "SAROP31-OATA150:TRANS_SP", + "SAROP31-OATA150:TRANS_RB", +] + +#################### +# Pulse picker OPPI151 +pvs_OPPI151 = [ + "SAROP31-OPPI151:MOTOR_X.RBV", + "SAROP31-OPPI151:MOTOR_Y.RBV", +] + +#################### +## Horizontal offset mirror ODMV152 +pvs_ODMV152 = [ + "SAROP31-ODMV152:W_X.RBV", + "SAROP31-ODMV152:W_Y.RBV", + "SAROP31-ODMV152:W_RX.RBV", + "SAROP31-ODMV152:W_RZ.RBV", + "SAROP31-ODMV152:BU.RBV", + "SAROP31-ODMV152:BD.RBV", + "SAROP31-ODMV152:VS1.RBV", + "SAROP31-ODMV152:VS2.RBV", + "SAROP31-ODMV152:VS3.RBV", + "SAROP31-ODMV152:TX.RBV", +] + +####################### +# from _proc process +pvs_PPRM150 = [ + "SAROP31-PPRM150:intensity", + "SAROP31-PPRM150:x_center_of_mass", + "SAROP31-PPRM150:x_fit_amplitude", + "SAROP31-PPRM150:x_fit_mean", + "SAROP31-PPRM150:x_fit_offset", + "SAROP31-PPRM150:x_fit_standard_deviation", + "SAROP31-PPRM150:x_fwhm", + "SAROP31-PPRM150:x_profile", + "SAROP31-PPRM150:x_rms", + "SAROP31-PPRM150:y_center_of_mass", + "SAROP31-PPRM150:y_fit_amplitude", + "SAROP31-PPRM150:y_fit_mean", + "SAROP31-PPRM150:y_fit_offset", + "SAROP31-PPRM150:y_fit_standard_deviation", + "SAROP31-PPRM150:y_fwhm", + "SAROP31-PPRM150:y_profile", + "SAROP31-PPRM150:y_rms", + # "SAROP31-PPRM150:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process +] + + +########################### +# Vertical KB mirror OKBV153 +pvs_OKBV153 = [ + "SAROP31-OKBV153:W_X.RBV", + "SAROP31-OKBV153:W_Y.RBV", + "SAROP31-OKBV153:W_RX.RBV", + "SAROP31-OKBV153:W_RY.RBV", + "SAROP31-OKBV153:W_RZ.RBV", + "SAROP31-OKBV153:BU.RBV", + "SAROP31-OKBV153:BD.RBV", + "SAROP31-OKBV153:TY1.RBV", + "SAROP31-OKBV153:TY2.RBV", + "SAROP31-OKBV153:TY3.RBV", + "SAROP31-OKBV153:TX1.RBV", + "SAROP31-OKBV153:TX2.RBV", +] + +#################### +# Screen between the KB's PSCD153 +# Not implemented yet +pvs_PSCD153 = [ + # "SAROP31-PSCD153" +] + +########################### +# Horizontal KB mirror OKBH154 +pvs_OKBH154 = [ + "SAROP31-OKBH154:W_X.RBV", + "SAROP31-OKBH154:W_Y.RBV", + "SAROP31-OKBH154:W_RX.RBV", + "SAROP31-OKBH154:W_RY.RBV", + "SAROP31-OKBH154:W_RZ.RBV", + "SAROP31-OKBH154:BU.RBV", + "SAROP31-OKBH154:BD.RBV", + "SAROP31-OKBH154:TY1.RBV", + "SAROP31-OKBH154:TY2.RBV", + "SAROP31-OKBH154:TY3.RBV", + "SAROP31-OKBH154:TX2.RBV", +] + +#################### +# Standa motors (mainly used with the X-ray eye) +pvs_standa = [ + "SARES30MOBI1:MOT_1", + "SARES30MOBI1:MOT_2", + "SARES30MOBI1:MOT_3", +] + + +#################### +# Attocube motors +pvs_attocube=[ + "SARES30-ATTOCUBE:A0-POS", + "SARES30-ATTOCUBE:A1-POS", +] + +############################### +# Smaract stages from Juraj +pvs_smaract = [ + "SARES30-XSMA156:X:MOTRBV", + "SARES30-XSMA156:Y:MOTRBV", + "SARES30-XSMA156:Z:MOTRBV", + "SARES30-XSMA156:Ry:MOTRBV", + "SARES30-XSMA156:Rx:MOTRBV", + "SARES30-XSMA156:Rz:MOTRBV", +] + +pvs = ( + pvs_machine + + pvs_undulator + + pvs_gas_monitor + + pvs_OAPU044 + + pvs_PBPS053 + + pvs_OATT053 + + pvs_PPRM053 + + pvs_PSSS059 + + pvs_OOMH067 + + pvs_PSCR068 + + pvs_OOMH084 + + pvs_PPRM085 + + pvs_OAPU107 + + pvs_PBPS113 + + pvs_PPRM113 + + pvs_OLAS147 + + pvs_OAPU149 + + pvs_PBPS149 + + pvs_PPRM150 + + pvs_OATA150 + + pvs_OPPI151 + + pvs_ODMV152 + + pvs_PPRM150 + + pvs_OKBV153 + + pvs_PSCD153 + + pvs_OKBH154 + + pvs_standa + # + pvs_attocube + # + pvs_smaract +) \ No newline at end of file diff --git a/smaract.py b/smaract.py index 2879e4a..fb14c21 100644 --- a/smaract.py +++ b/smaract.py @@ -52,13 +52,17 @@ class SmarActStage(BaseDevice): class SmarActAxis(Adjustable): - def __init__(self, ID, name=None, units=None, internal=False): + def __init__(self, ID, name=None, units=None, internal=False,tolerance=0.5): super().__init__(ID, name=name, units=units, internal=internal) self.wait_time = 0.1 self.timeout = 60 self._move_requested = False + self.config = SimpleNamespace( + tolerance = tolerance, + ) + self.pvs = SimpleNamespace( drive = PV(ID + ":DRIVE"), readback = PV(ID + ":MOTRBV"), @@ -119,6 +123,16 @@ class SmarActAxis(Adjustable): self._move_requested = False print("move done") + def is_at_target(self,from_pv=False, tolerance = None): + """Check whether target was reached. + If from_pv is True TARGET_REACHED_RB is used, else it's calculated as diffrence between the readback and set value within tolerance. + Default is False, because otherwise tolerance can only be set and read out as an integer.""" + if tolerance == None: + tolerance = self.config.tolerance + if from_pv == True: + return self.pvs.target_reached.value == 1 + else: + return abs( self.pvs.readback.get() - self.pvs.drive.get() ) < tolerance def stop(self): self._move_requested = False @@ -260,7 +274,8 @@ class SmarActAxis(Adjustable): twv = self.pvs.twv.get() twv = abs(twv) - + + ca.poll(evt=1.0e-1) while stat == Status.HOLDING and time.time() <= tout: ca.poll(evt=1.0e-2) stat = self.status @@ -275,7 +290,7 @@ class SmarActAxis(Adjustable): def gui(self): device, motor = self.ID.split(":") - cmd = f'caqtdm -macro "P={device}:,M={motor}" ESB_MX_SMARACT_mot_exp.ui' + cmd = f'caqtdm -macro "P={device}:,M={motor}" SARES30-CPCL-SMARACTX1_6axis_old.ui' return subprocess.Popen(cmd, shell=True) diff --git a/spreadsheet.py b/spreadsheet.py index 86275a7..f868d77 100644 --- a/spreadsheet.py +++ b/spreadsheet.py @@ -8,109 +8,80 @@ class PVStringAdjustable(PVAdjustable): return self.pvs.readback.get(as_string=True).strip() - n_unds = [ 6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC 15, 16, 17, 18, 19, 20, 21, 22 ] -undulator_info = {} -for i in n_unds: - undulator_info[f"energy{i}"] = PVAdjustable(f"SATUN{i:02}-UIND030:FELPHOTENE", internal=True) - undulator_info[f"polarisation{i}"] = PVEnumAdjustable(f"SATUN{i:02}-UIND030:POL-SET", internal=True) +#UND_NAME_FMT = "SARUN{:02}-UIND030" +#N_UND_CHIC = None + +#N_UNDS = list(range(3, 15+1)) +#undulator_info = {} +#for i in n_unds: +# undulator_info[f"energy{i}"] = PVAdjustable(f"SARUN{i:02}-UIND030:FELPHOTENE", internal=True) +# undulator_info[f"polarisation{i}"] = PVEnumAdjustable(f"SARUN{i:02}-UIND030:POL-SET", internal=True) -overview = SimpleDevice("Maloja Overview", -# standa = standa, -# exp_delay = exp_delay, -# laser_delay = laser_delay, -# LXT = lxt, - FELrepRate = PVAdjustable("SWISSFEL-STATUS:Bunch-2-Appl-Freq-RB", internal=True), - PaddleChamber1x = PVAdjustable("SATES21-XSMA166:MOT1:MOTRBV", internal=True), - PaddleChamber1y = PVAdjustable("SATES21-XSMA166:MOT2:MOTRBV", internal=True), - PaddleChamber1z = PVAdjustable("SATES21-XSMA166:MOT3:MOTRBV", internal=True), - SmartActTTx = PVAdjustable("SATES22-XSMA168:MOT10:MOTRBV", internal=True), - SmartActTTy = PVAdjustable("SATES22-XSMA168:MOT11:MOTRBV", internal=True), - SmartActTTz = PVAdjustable("SATES22-XSMA168:MOT12:MOTRBV", internal=True), - ToFV1m = PVAdjustable("SATES21-XSHV166:V-1-S-CH0", internal=True), - ToFV1p = PVAdjustable("SATES21-XSHV166:V-0-S-CH0", internal=True), - ToFV2m = PVAdjustable("SATES21-XSHV166:V-1-S-CH1", internal=True), - ToFV2p = PVAdjustable("SATES21-XSHV166:V-0-S-CH1", internal=True), - ToFV3m = PVAdjustable("SATES21-XSHV166:V-1-S-CH2", internal=True), - ToFV3p = PVAdjustable("SATES21-XSHV166:V-0-S-CH2", internal=True), -# energy1 = PVAdjustable("SATUN06-UIND030:FELPHOTENE", internal=True), -# energy2 = PVAdjustable("SATUN15-UIND030:FELPHOTENE", internal=True), - manip2needleESx = PVAdjustable("SATES20-MANIP2:MOTOR_1.VAL", internal=True), - manip2needleESy = PVAdjustable("SATES20-MANIP2:MOTOR_2.VAL", internal=True), - manip2needleESz = PVAdjustable("SATES20-MANIP2:MOTOR_3.VAL", internal=True), -# pol1 = PVEnumAdjustable("SATUN06-UIND030:POL-SET", internal=True), -# pol2 = PVEnumAdjustable("SATUN15-UIND030:POL-SET", internal=True), - pressChamb2 = PVAdjustable("SATES21-VM-VT2020:PRESSURE", internal=True), - pressChamb3 = PVAdjustable("SATES21-VM-VT3010:PRESSURE", internal=True), - pressChamb3GasCell = PVAdjustable("SATES21-VM-VT3030:PRESSURE", internal=True), - pulse_energy = PVAdjustable("SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG", internal=True), - timeStamp = PVAdjustable("SF-CPCL-TIM:TIME", internal=True), +overview = SimpleDevice("Cristallina Overview", + OKHB154_X_trans = PVAdjustable("SAROP31-OKBH154:W_X.RBV", internal=True), + OKHB154_Y_trans = PVAdjustable("SAROP31-OKBH154:W_Y.RBV", internal=True), + OKHB154_X_rot = PVAdjustable("SAROP31-OKBH154:W_RX.RBV", internal=True), + OKHB154_Y_rot = PVAdjustable("SAROP31-OKBH154:W_RY.RBV", internal=True), + OKHB154_Z_rot = PVAdjustable("SAROP31-OKBH154:W_RZ.RBV", internal=True), - chicane_current_rb = PVAdjustable("SATUN14-MBND100:I-READ", internal=True), - chicane_current_sv = PVAdjustable("SATUN14-MBND100:I-SET", internal=True), + OKBV153_X_trans = PVAdjustable("SAROP31-OKBV153:W_X.RBV", internal=True), + OKBV153_Y_trans = PVAdjustable("SAROP31-OKBV153:W_Y.RBV", internal=True), + OKBV153_X_rot = PVAdjustable("SAROP31-OKBV153:W_RX.RBV", internal=True), + OKBV153_Y_rot = PVAdjustable("SAROP31-OKBV153:W_RY.RBV", internal=True), + OKBV153_Z_rot = PVAdjustable("SAROP31-OKBV153:W_RZ.RBV", internal=True), - att64 = PVStringAdjustable("SATFE10-OATT064:MOT2TRANS.VALD", internal=True), - att65 = PVStringAdjustable("SATFE10-OATT065:MOT2TRANS.VALD", internal=True), + ODMV152_X_trans = PVAdjustable("SAROP31-OKBV153:W_X.RBV", internal=True), + ODMV152_Y_trans = PVAdjustable("SAROP31-OKBV153:W_Y.RBV", internal=True), + ODMV152_X_rot = PVAdjustable("SAROP31-OKBV153:W_RX.RBV", internal=True), + ODMV152_Y_rot = PVAdjustable("SAROP31-OKBV153:W_RY.RBV", internal=True), + ODMV152_COATING = PVAdjustable("SAROP31-ODMV152:COATING_SP", internal=True), + + OATA150_transmission = PVAdjustable("SAROP31-OATA150:TRANS_SP", internal=True), + + PBPS149_motor_probe = PVAdjustable("SAROP31-PBPS149:MOTOR_PROBE.RBV", internal=True), + PBPS149_motor_X1 = PVAdjustable("SAROP31-PBPS149:MOTOR_X1.RBV", internal=True), + PBPS149_motor_Y1 = PVAdjustable("SAROP31-PBPS149:MOTOR_Y1.RBV", internal=True), + PBPS149_wafer = PVAdjustable("SAROP31-PBPS149:PROBE_SP", internal=True), + + OAPU149_hor_pos = PVAdjustable("SAROP31-OAPU149:MOTOR_X.VAL", internal=True), + OAPU149_hor_width = PVAdjustable("SAROP31-OAPU149:MOTOR_W.VAL", internal=True), + OAPU149_vert_pos = PVAdjustable("SAROP31-OAPU149:MOTOR_Y.VAL", internal=True), + OAPU149_vert_width = PVAdjustable("SAROP31-OAPU149:MOTOR_H.VAL", internal=True), + + OAPU107_hor_pos = PVAdjustable("SAROP31-OAPU107:MOTOR_X.VAL", internal=True), + OAPU107_hor_width = PVAdjustable("SAROP31-OAPU107:MOTOR_W.VAL", internal=True), + OAPU107_vert_pos = PVAdjustable("SAROP31-OAPU107:MOTOR_Y.VAL", internal=True), + OAPU107_vert_width = PVAdjustable("SAROP31-OAPU107:MOTOR_H.VAL", internal=True), + + OOMH084_X_trans = PVAdjustable("SAROP31-OOMH084:W_X.RBV", internal=True), + OOMH084_Y_trans = PVAdjustable("SAROP31-OOMH084:W_Y.RBV", internal=True), + OOMH084_X_rot = PVAdjustable("SAROP31-OOMH084:W_RX.RBV", internal=True), + OOMH084_Y_rot = PVAdjustable("SAROP31-OOMH084:W_RY.RBV", internal=True), + OOMH084_Z_rot = PVAdjustable("SAROP31-OOMH084:W_RZ.RBV", internal=True), + OOMH084_COATING = PVAdjustable("SAROP31-OOMH084:COATING_SP", internal=True), + + OOMH067_X_trans = PVAdjustable("SAROP31-OOMH067:W_X.RBV", internal=True), + OOMH067_Y_trans = PVAdjustable("SAROP31-OOMH067:W_Y.RBV", internal=True), + OOMH067_X_rot = PVAdjustable("SAROP31-OOMH067:W_RX.RBV", internal=True), + OOMH067_Y_rot = PVAdjustable("SAROP31-OOMH067:W_RY.RBV", internal=True), + OOMH067_Z_rot = PVAdjustable("SAROP31-OOMH067:W_RZ.RBV", internal=True), + OOMH067_COATING = PVAdjustable("SAROP31-OOMH067:COATING_SP", internal=True), - **undulator_info ) spreadsheet_line = [ - "timeStamp", "File name", - "Gas cell / TOF", - "standa","Sample", - "pressChamb3", - "pressChamb3GasCell", "Static/scan", "Scan parameter", "ScanStep", "shots", "Comments", "Two colors (Y/N)", "energy1", - "polarisation10", "energy2", - "polarisation19", - "pulse_energy", - "chicane_current_rb", - "FELrepRate", - "att64", - "att65", "Grating", "order", "Slit", "Detector position X", "Detector position Y", "Detector position (angle)","Ek", "Ep", "Slit", "Mode", - "pressChamb2", "Gas", - "manip2needleESx", - "manip2needleESy", - "manip2needleESz", - "ToFV1p", - "ToFV2p", - "ToFV3p", - "ToFV1m", - "ToFV2m", - "ToFV3m", - "PaddleChamber1x", - "PaddleChamber1y", - "PaddleChamber1z", - "energy6", - "energy7", - "energy8", - "energy9", - "energy10", - "energy11", - "energy12", - "energy13", - "energy14", - "energy15", - "energy16", - "energy17", - "energy18", - "energy19", - "energy20", - "energy21", - "energy22", ] - - @as_shortcut def print_overview(): print(overview)