Files
maloja/maloja.py

255 lines
8.6 KiB
Python

#!/usr/bin/env python
from slic.gui import GUI
from slic.core.adjustable import PVAdjustable, PVEnumAdjustable, DummyAdjustable
from slic.core.acquisition import SFAcquisition
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
from devices.magnet import Magnet
dummy = DummyAdjustable(units="au")
magnet = Magnet()
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=13, adjust_chic=False, name="z Athos Undulators 6-13")
und2 = Undulators([15, 16, 17, 18, 19, 20, 21, 22], n_und_ref=22, adjust_chic=False, name="z Athos Undulators 15-22")
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")
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",
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),
**undulator_info
)
@as_shortcut
def print_overview():
print(overview)
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")
# "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:FCUP-INTENSITY-CAL",
"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-PATT-M1: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-PATT-M1",
]
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 = [
"SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG",
]
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]
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
daq = SFAcquisition(instrument, pgroup, default_channels=channels, default_pvs=pvs, default_detectors=detectors, rate_multiplicator=1)
#daq = FakeAcquisition(instrument, pgroup)
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)
from epics import PV
from time import sleep
from datetime import datetime
def overnight():
shutter = PV("SATOP21-OPSH138:REQUEST")
print("open shutter")
shutter.put(1)
sleep(3)
#base = "I4d_high_resolution_Ek472_Ep100_TTincluded_slit_2_008"
#base = "I4d_high_resolution_Ek472_Ep200_TTincluded_slit_2_010"
base = "CF3I_C1s_Ek230_Ep200_TTincluded_slit2_2609_130microJ_002"
x0 = 15.813
start = x0 - 0.12
stop = x0 + 0.4
step = 0.004
n_pulses = 2 * 300
for i in range(1000):
print(i, "sig")
scan.scan1D(exp_delay, start, stop, step, n_pulses, f"{base}_sig_{i:04}", return_to_initial_values=True)
print("close shutter")
shutter.put(0)
sleep(3)
print(i, "bkg")
daq.acquire(f"{base}_bkg_{i:04}", n_pulses=n_pulses)
print("open shutter")
shutter.put(1)
sleep(3)