#!/usr/bin/env python from time import sleep from datetime import datetime import numpy as np from tqdm import trange from epics import PV from slic.gui import GUI from slic.core.adjustable import Adjustable, PVAdjustable, PVEnumAdjustable, DummyAdjustable from slic.core.acquisition import SFAcquisition#, PVAcquisition from slic.core.condition import PVCondition from slic.core.scanner import Scanner from slic.devices.simpledevice import SimpleDevice from slic.devices.general.motor import Motor from slic.devices.general.delay_stage import DelayStage from slic.devices.general.smaract import SmarActAxis from slic.utils import devices, Marker, as_shortcut #from slic.utils import Channels, Config, Elog, Screenshot, PV #from slic.core.acquisition.fakeacquisition import FakeAcquisition from devices.attenuator import Attenuator from devices.undulator import Undulators, TwoColorChicane, Phases from devices.magnet import Magnet import colors dummy = DummyAdjustable(units="au") jet_delay = PVAdjustable("SATES20-CVME-EVR0:Pul6-Delay-SP", "SATES20-CVME-EVR0:Pul6-Delay-RB", accuracy=1, name="Jet Delay") waveplate = Motor("SLAAT21-LMOT-M702:MOT", name="Laser Waveplate") exp_delay = Motor("SLAAT21-LMOT-M704:MOT", name="PP delay chamber 3") #laser_delay = DelayStage("SLAAT21-LMOT-M708:MOT", name="Laser Delay") laser_delay = Motor("SLAAT21-LMOT-M708:MOT", name="Laser Delay") lxt = PVAdjustable("SLAAT01-LTIM-PDLY:DELAY", pvname_done_moving="SLAAT01-LTIM-PDLY:WAITING", name="LXT") source_y = Motor("SATES20-MANIP1:MOTOR_1", name="Source manipulator y") source_x = Motor("SATES20-MANIP1:MOTOR_2", name="Source manipulator x") att = Attenuator("SATFE10-OATT064") #n_und_ref = 6 n_und_ref = None n_unds = [ 6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC 15, 16, 17, 18, 19, 20, 21, 22 ] chic_fudge_offset = 0 und = Undulators(n_unds, n_und_ref, chic_fudge_offset, adjust_chic=False, name="z Athos Undulators") und1 = Undulators([6, 7, 8, 9, 10, 11, 12, 13], n_und_ref=10, adjust_chic=False, name="z Athos Undulators 6-13") und2 = Undulators([15, 16, 17, 18, 19, 20, 21, 22], n_und_ref=19, adjust_chic=False, name="z Athos Undulators 15-22") und.set_limits(390, 1000) und1.set_limits(390, 1000) und2.set_limits(390, 1000) chic_delay = TwoColorChicane("zz Two Color Chicane") magn = PV("SATUN14-MBND100:CYCLE") @as_shortcut def cycle_magnet(): magn.put(1, wait=True) for _ in trange(250): sleep(1) chic_delay.set(1).wait() sleep(1) chic_delay.set(5).wait() sleep(1) xota_z_trans = Motor("SATES21-XOTA166:W_Z", name="Table 1: Z coordinated") #xota_hori_z = Motor("SATES21-XOTA166:MOTOR_Z", name="Table 1: Z raw") mot1_x = SmarActAxis("SATES21-XSMA166:MOT4", name="Table 1: sma X") mot1_y = SmarActAxis("SATES21-XSMA166:MOT5", name="Table 1: sma Y") mot1_z = SmarActAxis("SATES21-XSMA166:MOT6", name="Table 1: sma Z") mot3_z = SmarActAxis("SATES23-XSMA169:MOT3", name="Table 3: sma Z") standa = Motor("SLAAT21-LMOT-M707:MOT", name="Standa Motor") mark_microscope = Marker(standa, 141.344, "Microscope") mark_gascell = Marker(standa, 88.334, "Gas Cell") mark_tof = Marker(standa, 28.330, "TOF") class PVStringAdjustable(PVAdjustable): def get_current_value(self): return self.pvs.readback.get(as_string=True).strip() 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) 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), chicane_current = PVAdjustable("SATUN14-MBND100:I-READ", internal=True), chicane_set_current = PVAdjustable("SATUN14-MBND100:I-SET", internal=True), att64 = PVStringAdjustable("SATFE10-OATT064:MOT2TRANS.VALD", internal=True), att65 = PVStringAdjustable("SATFE10-OATT065:MOT2TRANS.VALD", internal=True), **undulator_info ) @as_shortcut def print_overview(): print(overview) @as_shortcut def print_line_for_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", "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", ] ov = overview.__dict__ def get(i): if i in ov: return str(ov[i].get()) return "" res = [get(i) for i in line] res = ",".join(res) print(res) # "SLAAR11-LTIM01-EVR0:DUMMY_PV5_NBS", channels_nbs = [f"SATES20-CVME-EVR0:DUMMY_PV{i+1}_NBS" for i in range(10)] channels_inten = [ "SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG", "SATFE10-PEPG046-EVR0:CALCI", "SATFE10-PEPG046-EVR0:CALCS", "SATFE10-PEPG046-EVR0:CALCT", "SATFE10-PEPG046-EVR0:CALCX", "SATFE10-PEPG046-EVR0:CALCY", "SATFE10-PEPG046:FCUP-INTENSITY-AVG", "SATFE10-PEPG046:FCUP-INTENSITY-CAL", ] # CH 0-3 farday cup / 4&5 multipliers channels_inten += [f"SATFE10-LSCP1:CH{n}:1" for n in range(6)] channels_ks = [ "SATES21-GES1:A1_VALUES", #SATES21-GES1:TD_VALUES.VALZ # "SATES21-GES1:A2_VALUES", # "SATES21-GES1:A3_VALUES", # "SATES21-GES1:A4_VALUES", ] channels_cam_pco = [ "SATES21-CAMS154-M1:FPICTURE", "SATES24-CAMS161-M1:FPICTURE", "SATES21-CAMS-PATT1:FPICTURE", ] channels_cam_gige = [ f"SATES21-CAMS154-GIGE{i+1}:FPICTURE" for i in range(8) ] #channels = channels_nbs + channels_inten + channels_ks #channels = channels_nbs + channels_inten + channels_ks + channels_cam_pco channels = channels_nbs + channels_inten + channels_ks + channels_cam_pco + channels_cam_gige names_cam_pco = [ "SATES21-CAMS154-M1", "SATES24-CAMS161-M1", "SATES21-CAMS-PATT1", ] suffices_proc = [ "processing_parameters", "projection_background", "projection_signal", ] for n in names_cam_pco: for s in suffices_proc: c = f"{n}.{s}" channels.append(c) pvs = [ "SATES20-MANIP2:MOTOR_1.VAL", "SATES20-MANIP2:MOTOR_2.VAL", "SATES20-MANIP2:MOTOR_3.VAL", "SATES20-MANIP2:MOTOR_1.RBV", "SATES20-MANIP2:MOTOR_2.RBV", "SATES20-MANIP2:MOTOR_3.RBV", "SATES21-VM-VT2020:PRESSURE", "SATES21-VM-VT3010:PRESSURE", "SATES21-VM-VT3030:PRESSURE", "SATES21-XSHV166:V-0-S-CH0", "SATES21-XSHV166:V-0-S-CH1", "SATES21-XSHV166:V-0-S-CH2", "SATES21-XSHV166:V-1-S-CH0", "SATES21-XSHV166:V-1-S-CH1", "SATES21-XSHV166:V-1-S-CH2", "SATES21-XSMA166:MOT1:MOTRBV", "SATES21-XSMA166:MOT2:MOTRBV", "SATES21-XSMA166:MOT3:MOTRBV", "SATES22-XSMA168:MOT10:MOTRBV", "SATES22-XSMA168:MOT11:MOTRBV", "SATES22-XSMA168:MOT12:MOTRBV", "SATFE10-OATT064:MOT2TRANS.VALD", "SATFE10-OATT065:MOT2TRANS.VALD", "SATUN14-MBND100:I-READ", "SF-CPCL-TIM:TIME", "SLAAT01-LTIM-PDLY:DELAY", "SLAAT21-LMOT-M704:MOT", "SLAAT21-LMOT-M707:MOT", "SLAAT21-LMOT-M708:MOT", "SWISSFEL-STATUS:Bunch-2-Appl-Freq-RB", ] pvs += [f"SATES20-CVME-EVR0:DUMMY_PV{i+1}_NBS.INP" for i in range(10)] pvs += [f"SATUN{i:02}-UIND030:FELPHOTENE" for i in range(6, 22+1) if i != 14] pvs += [f"SATUN{i:02}-UIND030:POL-SET" for i in range(6, 22+1) if i != 14] for n in ("TEMP", "HUMIREL", "PRES"): for i in range(5): pvs.append(f"SLAAT01-LI2C01_CH{i+1}:{n}") for i in range(2): pvs.append(f"SLAAT21-LI2C01_CH{i+1}:{n}") for i in range(4): pvs.append(f"SLAAT21-LI2C02_CH{i+1}:{n}") detectors = [ # "JF15T08V01" ] instrument = "maloja" #pgroup = "p18493" # commissioning june 2020 #pgroup = "p18722" # commissioning sept 2020 #pgroup = "p18863" # JF commissioning april 2021 #pgroup = "p19241" # two colors #pgroup = "p19342" # XMCD #pgroup = "p19343" # slic dev #pgroup = "p19373" # laser #pgroup = "p19483" # pilot 1 -- TRXPS #pgroup = "p19488" # pilot 2 -- Non-Linear Spectroscopy pgroup = "p19510" # pilot 2 -- Non-Linear Spectroscopy daq = SFAcquisition(instrument, pgroup, default_channels=channels, default_pvs=pvs, default_detectors=detectors, rate_multiplicator=1) #daq = FakeAcquisition(instrument, pgroup) #daqPV = PVAcquisition(instrument, pgroup, default_channels=channels_ks) # workaround for KS not going to DB check_intensity = PVCondition("SATBD01-DBPM060:Q2", vmin=5, vmax=None, wait_time=1, required_fraction=0.8) #check_intensity = None scan = Scanner(scan_info_dir=f"/sf/{instrument}/data/{pgroup}/res/scan_info", default_acquisitions=[daq], condition=check_intensity) gui = GUI(scan, show_goto=True, show_spec=True)