From 792e562d48428fbd47201657b824a5e017ff72f5 Mon Sep 17 00:00:00 2001 From: Alexander Steppke Date: Wed, 23 Oct 2024 17:59:59 +0200 Subject: [PATCH] before MX beamtime October 2024 --- channels/bs_channels.py | 58 ++++++++++++++++-- channels/pv_channels.py | 131 +++++++++++++++++++++++++++++++++++++++- cristallina.py | 77 +++++++++++++++++------ exp_temp/mono.py | 6 ++ pgroups.py | 8 ++- stand/time.py | 25 ++++++++ 6 files changed, 277 insertions(+), 28 deletions(-) create mode 100644 exp_temp/mono.py create mode 100644 stand/time.py diff --git a/channels/bs_channels.py b/channels/bs_channels.py index bf9a11d..abb9fc1 100644 --- a/channels/bs_channels.py +++ b/channels/bs_channels.py @@ -9,8 +9,10 @@ from slic.core.acquisition.detcfg import DetectorConfig # TODO: JF settings regarding raw conversion, compression, etc. detectors = [ - "JF16T03V01", + "JF16T03V02", +# "JF16T03V01", # "JF17T16V01", + "JF20T01V01", ] # ALLOWED_PARAMS = dict( @@ -160,6 +162,7 @@ channels_Xeye = ["SARES30-CAMS156-XE:intensity", "SARES30-CAMS156-XE:y_fwhm", "SARES30-CAMS156-XE:y_profile", "SARES30-CAMS156-XE:y_rms", + # "SARES30-CAMS156-XE:FPICTURE", ] ###################### @@ -207,15 +210,49 @@ channels_PSSS059_LB = [ ################################### ## Bernina channels # Beam position monitor PBPS113 -channels_Bernina = [ +#channels_Bernina = [ +# "SAROP21-PBPS103:INTENSITY", +# "SAROP21-PBPS103:XPOS", +# "SAROP21-PBPS103:YPOS", +# #"SAROP21-PPRM113:FPICTURE", +# "SAROP21-PPRM113:intensity", +# "SAROP21-PPRM113:x_fit_mean", +# "SAROP21-PPRM113:y_fit_mean", +#] + +channels_PBPS113_bernina = [ "SAROP21-PBPS103:INTENSITY", + "SAROP21-PBPS103:INTENSITY_UJ", + "SAROP21-PBPS103:Lnk9Ch0-PP_VAL_PD0", + "SAROP21-PBPS103:Lnk9Ch0-PP_VAL_PD1", + "SAROP21-PBPS103:Lnk9Ch0-PP_VAL_PD2", + "SAROP21-PBPS103:Lnk9Ch0-PP_VAL_PD3", "SAROP21-PBPS103:XPOS", "SAROP21-PBPS103:YPOS", - #"SAROP21-PPRM113:FPICTURE", - "SAROP21-PPRM113:intensity", - "SAROP21-PPRM113:x_fit_mean", - "SAROP21-PPRM113:y_fit_mean", ] + +channels_PPRM113_bernina = [ + "SAROP21-PPRM113:intensity", + "SAROP21-PPRM113:x_center_of_mass", + "SAROP21-PPRM113:x_fit_amplitude", + "SAROP21-PPRM113:x_fit_mean", + "SAROP21-PPRM113:x_fit_offset", + "SAROP21-PPRM113:x_fit_standard_deviation", + "SAROP21-PPRM113:x_fwhm", + "SAROP21-PPRM113:x_profile", + "SAROP21-PPRM113:x_rms", + "SAROP21-PPRM113:y_center_of_mass", + "SAROP21-PPRM113:y_fit_amplitude", + "SAROP21-PPRM113:y_fit_mean", + "SAROP21-PPRM113:y_fit_offset", + "SAROP21-PPRM113:y_fit_standard_deviation", + "SAROP21-PPRM113:y_fwhm", + "SAROP21-PPRM113:y_profile", + "SAROP21-PPRM113:y_rms", + # "SAROP31-PPRM113:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process +] + + ################################### # Beam position monitor PBPS113 channels_PBPS113 = [ @@ -360,3 +397,12 @@ bs_channels = ( + channels_other ) +bs_channels_bernina_DCM = ( + channels_gas_monitor + # + channels_RF + + channels_PBPS053 + + channels_PSSS059 + + channels_PSSS059_LB + + channels_PBPS113_bernina +# + channels_PPRM113_bernina +) diff --git a/channels/pv_channels.py b/channels/pv_channels.py index 7536a4e..bf91a5a 100644 --- a/channels/pv_channels.py +++ b/channels/pv_channels.py @@ -193,9 +193,84 @@ pvs_PPRM053 = [ ################### # Bernina mono -pvs_Bernina = [ +#pvs_Bernina = [ +# "SAROP21-ARAMIS:ENERGY_SP", +# "SAROP21-ARAMIS:ENERGY", +# "SAROP21-PBPS103:MOTOR_X1.DRBV", +# "SAROP21-PBPS103:MOTOR_Y1.DRBV", +# "SAROP21-PBPS103:MOTOR_X1.RBV", +# "SAROP21-PBPS103:MOTOR_Y1.RBV", +# "SAROP21-PBPS103:MOTOR_PROBE.RBV", +# "SAROP21-PPRM113:MOTOR_PROBE.RBV" +#] +pvs_photon_energy_bernina = [ "SAROP21-ARAMIS:ENERGY_SP", "SAROP21-ARAMIS:ENERGY", +] + +pvs_OAPU092_bernina = [ + "SAROP21-OAPU044:MOTOR_X.RBV", + "SAROP21-OAPU044:MOTOR_Y.RBV", + "SAROP21-OAPU044:MOTOR_W.RBV", + "SAROP21-OAPU044:MOTOR_H.RBV", +] + +pvs_OOMV092_bernina = [ + "SAROP21-OOMV092:W_X.RBV", + "SAROP21-OOMV092:W_Y.RBV", + "SAROP21-OOMV092:W_RX.RBV", + "SAROP21-OOMV092:W_RZ.RBV", + "SAROP21-OOMV092:BU.RBV", + "SAROP21-OOMV092:BD.RBV", + "SAROP21-OOMV092:VS1.RBV", + "SAROP21-OOMV092:VS2.RBV", + "SAROP21-OOMV092:VS3.RBV", + "SAROP21-OOMV092:TX.RBV", +] + +pvs_PPRM094_bernina = [ + "SAROP21-PPRM113:MOTOR_PROBE", + #"SAROP21-PPRM113:FPICTURE", +] + +pvs_OOMV096_bernina = [ + "SAROP21-OOMV096:W_X.RBV", + "SAROP21-OOMV096:W_Y.RBV", + "SAROP21-OOMV096:W_RX.RBV", + "SAROP21-OOMV096:W_RZ.RBV", + "SAROP21-OOMV096:BU.RBV", + "SAROP21-OOMV096:BD.RBV", + "SAROP21-OOMV096:VS1.RBV", + "SAROP21-OOMV096:VS2.RBV", + "SAROP21-OOMV096:VS3.RBV", + "SAROP21-OOMV096:TX.RBV", +] + +pvs_PSCR097_bernina = [ + "SAROP21-PSCR097:MOTOR_Y1.RBV", +] + +pvs_ODCM098_bernina = [ + "SAROP21-ODCM098:RX12.RBV", # BRAGG + "SAROP21-ODCM098:TX12.RBV", # Horizontal + "SAROP21-ODCM098:T2.RBV", # Crystal gap T2 + "SAROP21-ODCM098:RZ1.RBV", # 1st xtal roll + "SAROP21-ODCM098:RZ2.RBV", # 2nd xtal roll + "SAROP21-ODCM098:RX2.RBV", # 2nd xtal pitch +] + +pvs_OAPU102_bernina = [ + "SAROP21-OAPU092:MOTOR_X.RBV", + "SAROP21-OAPU092:MOTOR_Y.RBV", + "SAROP21-OAPU092:MOTOR_W.RBV", + "SAROP21-OAPU092:MOTOR_H.RBV", +] + +pvs_PSRD103_bernina = [ + "SAROP21-PSRD103:MOTOR_PROBE", +] + +pvs_PBPS113_bernina = [ "SAROP21-PBPS103:MOTOR_X1.DRBV", "SAROP21-PBPS103:MOTOR_Y1.DRBV", "SAROP21-PBPS103:MOTOR_X1.RBV", @@ -204,6 +279,17 @@ pvs_Bernina = [ "SAROP21-PPRM113:MOTOR_PROBE.RBV" ] +pvs_OPPI113_bernina = [ + "SAROP21-OPPI113:MOTOR_X1.RBV", # X1 instead of X + "SAROP21-OPPI113:MOTOR_Y1.RBV", # Y1 instead of X + "SAROP21-OPPI113:TC1", # Pulse picker temperature +] + + +pvs_PPRM113 = [ + "SAROP21-PPRM113:MOTOR_PROBE.RBV", +] + #################### # First Cristallina horizontal offset mirror OOMH067 @@ -347,8 +433,8 @@ pvs_OATA150 = [ #################### # Pulse picker OPPI151 pvs_OPPI151 = [ - # "SAROP31-OPPI151:MOTOR_X.RBV", # Not available - # "SAROP31-OPPI151:MOTOR_Y.RBV", # Not available + "SAROP31-OPPI151:MOTOR_X1.RBV", # X1 instead of X + "SAROP31-OPPI151:MOTOR_Y1.RBV", # Y1 instead of X "SAROP31-OPPI151:TC1", # Pulse picker temperature ] @@ -528,3 +614,42 @@ pv_channels = ( # + pvs_attocube # + pvs_smaract_juraj + +pv_channels_front_end = ( + pvs_machine + # + pvs_RF + # + pvs_undulator + + pvs_gas_monitor + + pvs_OAPU044 + + pvs_PBPS053 + + pvs_OATT053 + + pvs_PPRM053 + + pvs_PSSS059 + + pvs_OOMH067 + + pvs_PSCR068 +) + +pv_channels_bernina = ( + pvs_machine + # + pvs_RF + # + pvs_undulator + + pvs_gas_monitor + + pvs_OAPU044 + + pvs_PBPS053 + + pvs_OATT053 + + pvs_PPRM053 + + pvs_PSSS059 + + pvs_OOMH067 + + pvs_PSCR068 + + pvs_photon_energy_bernina + + pvs_OAPU092_bernina + + pvs_OOMV092_bernina + + pvs_PPRM094_bernina + + pvs_OOMV096_bernina + + pvs_PSCR097_bernina + + pvs_ODCM098_bernina + + pvs_OAPU102_bernina + + pvs_PSRD103_bernina + + pvs_PBPS113_bernina + + pvs_PPRM113 +) diff --git a/cristallina.py b/cristallina.py index d7d4428..fad0f47 100644 --- a/cristallina.py +++ b/cristallina.py @@ -133,9 +133,15 @@ from crq_exp.diffractometer import Diffractometer diffractometer = Diffractometer("diffractometer") +# Dilution fridge from crq_exp.dilsc import Dilution -dilution = Dilution() +try: + dilution = Dilution() +except Exception as e: + logger.warning(f"Error: Could not connect to dilution fridge. {e}") + dilution = None + # MX adajustables import mx.mx_adjustables @@ -145,10 +151,11 @@ import mx.mx_adjustables # TODO: requires the stand client, need small howto how to start and configure or let it run all the time from slic.core.acquisition.spreadsheet import Spreadsheet +from stand.time import Time -# setup spreadsheet for transmission to stand -spreadsheet = Spreadsheet( - { + +adjs_for_spreadsheet = { + #"Time": Time(), "Transmission": attenuator.trans1st, "Upstream Transmission": upstream_attenuator.trans1st, "Energy_setpoint": undulators, @@ -160,12 +167,27 @@ spreadsheet = Spreadsheet( "TRYBASE": diffractometer.try_base, "THETA": diffractometer.theta, "TWOTHETA": diffractometer.twotheta, + } + + +if dilution is not None: + adjs_dilsc = { "Magnet_X": dilution.x, "Magnet_Y": dilution.y, "Magnet_Z": dilution.z, "DilSc_T_chip": dilution.T_chip, "DilSc_T_pucksensor": dilution.T_pucksensor, - }, + } + adjs_for_spreadsheet.update(adjs_dilsc) + + +# temporary mono +from exp_temp.mono import Mono_rotation + + +# setup spreadsheet for transmission to stand +spreadsheet = Spreadsheet( + adjs_for_spreadsheet, placeholders=("comment", "sample", "run_usable"), host="saresc-vcons-02.psi.ch", port=9090, @@ -187,26 +209,47 @@ except Exception as error: ################# DAQ Setup ################# instrument = "cristallina" +experiment_type = "MX" # "MX" or "Q" for the different setups and detector configurations from pgroups import pgroup, pgroup_scratch - # setup pgroup specific logger setup_logging_pgroup(pgroup) -daq = SFAcquisition( - instrument, - pgroup, - default_channels=bs_channels, - default_pvs=pv_channels, - default_detectors=detectors, - rate_multiplicator=1, - spreadsheet=spreadsheet, -) +logger.info(f"Using Cristallina{experiment_type} setup for detectors.") +if experiment_type == "MX": + daq = SFAcquisition( + instrument, + pgroup, + default_channels=bs_channels, + default_pvs=pv_channels, + default_detectors=detectors_MX, + rate_multiplicator=1, + spreadsheet=spreadsheet, + ) +elif experiment_type == "Q": + daq = SFAcquisition( + instrument, + pgroup, + default_channels=bs_channels, + default_pvs=pv_channels, + default_detectors=detectors, + rate_multiplicator=1, + spreadsheet=spreadsheet, + ) +else: + logger.error(f"Experiment type {experiment_type} not supported. Exiting.") + sys.exit(1) + + +daq.update_config_pvs() # There is a new EPICS buffer, so the archiver is no longer used. This makes sure we are taking PVs from the right place. -daq.update_config_pvs() +try: + daq.update_config_pvs() +except Exception as e: + print(e) from acquisition import multiple_daqs @@ -228,5 +271,5 @@ check_intensity_gas_monitor = PVCondition( scan = Scanner(default_acquisitions=[daq], condition=check_intensity_gas_monitor) gui = GUI(scan, show_goto=True, show_spec=True) -logger.info(f"Running at {instrument} with pgroup {pgroup}.") +logger.info(f"Running at {instrument} with pgroup {pgroup}. Experiment type: {experiment_type}.") logger.info("Loading finished.") diff --git a/exp_temp/mono.py b/exp_temp/mono.py new file mode 100644 index 0000000..848b805 --- /dev/null +++ b/exp_temp/mono.py @@ -0,0 +1,6 @@ +from slic.devices.general.motor import Motor + + +Mono_rotation = Motor("SARES30-MOBI2:MOT_RY") # large rotation stage + + diff --git a/pgroups.py b/pgroups.py index 622cd0c..24db1dc 100644 --- a/pgroups.py +++ b/pgroups.py @@ -33,7 +33,11 @@ pgroup_scratch = "p19150" # Scratch # pgroup = "p21741" # CrQ - DilSc - SAXS LiHoF4 -#pgroup = "p21735" # Cr-MX Aller 2024-06-04 +# pgroup = "p21735" # Cr-MX Aller 2024-06-04 # pgroup = "p21736" # Cr-MX Weik 2024-06-07 -pgroup = "p21977" # CrQ - Dilsc - LiErF4 +# pgroup = "p21977" # CrQ - Dilsc - LiErF4 + +# pgroup = "p21981" # CrMX JFJ commissioning and other related detector bullocks +pgroup = "p22198" # CrMX Fromme - 2024-10-25 + diff --git a/stand/time.py b/stand/time.py new file mode 100644 index 0000000..86fc76b --- /dev/null +++ b/stand/time.py @@ -0,0 +1,25 @@ +from slic.core.adjustable import Adjustable +import datetime + +class Time(Adjustable): + """ Adjustable only for spreadsheet, no other functionality + """ + def __init__(self): + super().__init__(self, "") + + def get_current_value(self): + return datetime.datetime.now().replace(microsecond=0).isoformat() + + def is_moving(self): + return False + + def set_target_value(self): + pass + + def __repr__(self): + name = "Time" + value = self._printable_value() + return f"{name} : {value}" + + def __str__(self): + return self._printable_value() \ No newline at end of file