post N2O repeat: energy limits, magnet cycling, more overview stuff, spreadsheet line, another intensity channel, PATT cam renamed, more PV channels, pgroup update, show special tab, remove overnight
This commit is contained in:
229
maloja.py
229
maloja.py
@ -1,8 +1,14 @@
|
|||||||
#!/usr/bin/env python
|
#!/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.gui import GUI
|
||||||
from slic.core.adjustable import PVAdjustable, PVEnumAdjustable, DummyAdjustable
|
from slic.core.adjustable import Adjustable, PVAdjustable, PVEnumAdjustable, DummyAdjustable
|
||||||
from slic.core.acquisition import SFAcquisition
|
from slic.core.acquisition import SFAcquisition#, PVAcquisition
|
||||||
from slic.core.condition import PVCondition
|
from slic.core.condition import PVCondition
|
||||||
from slic.core.scanner import Scanner
|
from slic.core.scanner import Scanner
|
||||||
from slic.devices.simpledevice import SimpleDevice
|
from slic.devices.simpledevice import SimpleDevice
|
||||||
@ -14,14 +20,14 @@ from slic.utils import devices, Marker, as_shortcut
|
|||||||
#from slic.core.acquisition.fakeacquisition import FakeAcquisition
|
#from slic.core.acquisition.fakeacquisition import FakeAcquisition
|
||||||
|
|
||||||
from devices.attenuator import Attenuator
|
from devices.attenuator import Attenuator
|
||||||
from devices.undulator import Undulators
|
from devices.undulator import Undulators, TwoColorChicane, Phases
|
||||||
from devices.magnet import Magnet
|
from devices.magnet import Magnet
|
||||||
|
|
||||||
|
import colors
|
||||||
|
|
||||||
|
|
||||||
dummy = DummyAdjustable(units="au")
|
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")
|
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")
|
waveplate = Motor("SLAAT21-LMOT-M702:MOT", name="Laser Waveplate")
|
||||||
@ -35,17 +41,40 @@ source_x = Motor("SATES20-MANIP1:MOTOR_2", name="Source manipulator x")
|
|||||||
|
|
||||||
att = Attenuator("SATFE10-OATT064")
|
att = Attenuator("SATFE10-OATT064")
|
||||||
|
|
||||||
##n_und_ref = 6
|
#n_und_ref = 6
|
||||||
#n_und_ref = None
|
n_und_ref = None
|
||||||
n_unds = [
|
n_unds = [
|
||||||
6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC
|
6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC
|
||||||
15, 16, 17, 18, 19, 20, 21, 22
|
15, 16, 17, 18, 19, 20, 21, 22
|
||||||
]
|
]
|
||||||
#chic_fudge_offset = 0
|
chic_fudge_offset = 0
|
||||||
#und = Undulators(n_unds, n_und_ref, chic_fudge_offset, adjust_chic=False, name="z Athos Undulators")
|
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)
|
||||||
|
|
||||||
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_z_trans = Motor("SATES21-XOTA166:W_Z", name="Table 1: Z coordinated")
|
||||||
@ -59,6 +88,21 @@ 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 = {}
|
undulator_info = {}
|
||||||
for i in n_unds:
|
for i in n_unds:
|
||||||
undulator_info[f"energy{i}"] = PVAdjustable(f"SATUN{i:02}-UIND030:FELPHOTENE", internal=True)
|
undulator_info[f"energy{i}"] = PVAdjustable(f"SATUN{i:02}-UIND030:FELPHOTENE", internal=True)
|
||||||
@ -66,9 +110,11 @@ for i in n_unds:
|
|||||||
|
|
||||||
|
|
||||||
overview = SimpleDevice("Maloja Overview",
|
overview = SimpleDevice("Maloja Overview",
|
||||||
|
standa = standa,
|
||||||
exp_delay = exp_delay,
|
exp_delay = exp_delay,
|
||||||
laser_delay = laser_delay,
|
laser_delay = laser_delay,
|
||||||
LXT = lxt,
|
LXT = lxt,
|
||||||
|
|
||||||
FELrepRate = PVAdjustable("SWISSFEL-STATUS:Bunch-2-Appl-Freq-RB", internal=True),
|
FELrepRate = PVAdjustable("SWISSFEL-STATUS:Bunch-2-Appl-Freq-RB", internal=True),
|
||||||
PaddleChamber1x = PVAdjustable("SATES21-XSMA166:MOT1:MOTRBV", internal=True),
|
PaddleChamber1x = PVAdjustable("SATES21-XSMA166:MOT1:MOTRBV", internal=True),
|
||||||
PaddleChamber1y = PVAdjustable("SATES21-XSMA166:MOT2:MOTRBV", internal=True),
|
PaddleChamber1y = PVAdjustable("SATES21-XSMA166:MOT2:MOTRBV", internal=True),
|
||||||
@ -94,7 +140,12 @@ overview = SimpleDevice("Maloja Overview",
|
|||||||
pressChamb3GasCell = PVAdjustable("SATES21-VM-VT3030:PRESSURE", internal=True),
|
pressChamb3GasCell = PVAdjustable("SATES21-VM-VT3030:PRESSURE", internal=True),
|
||||||
pulse_energy = PVAdjustable("SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG", internal=True),
|
pulse_energy = PVAdjustable("SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG", internal=True),
|
||||||
timeStamp = PVAdjustable("SF-CPCL-TIM:TIME", internal=True),
|
timeStamp = PVAdjustable("SF-CPCL-TIM:TIME", internal=True),
|
||||||
|
|
||||||
chicane_current = PVAdjustable("SATUN14-MBND100:I-READ", 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
|
**undulator_info
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -102,13 +153,62 @@ overview = SimpleDevice("Maloja Overview",
|
|||||||
def print_overview():
|
def print_overview():
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
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")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -117,7 +217,7 @@ channels_nbs = [f"SATES20-CVME-EVR0:DUMMY_PV{i+1}_NBS" for i in range(10)]
|
|||||||
|
|
||||||
|
|
||||||
channels_inten = [
|
channels_inten = [
|
||||||
"SATFE10-PEPG046:FCUP-INTENSITY-CAL",
|
"SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG",
|
||||||
"SATFE10-PEPG046-EVR0:CALCI",
|
"SATFE10-PEPG046-EVR0:CALCI",
|
||||||
"SATFE10-PEPG046-EVR0:CALCS",
|
"SATFE10-PEPG046-EVR0:CALCS",
|
||||||
"SATFE10-PEPG046-EVR0:CALCT",
|
"SATFE10-PEPG046-EVR0:CALCT",
|
||||||
@ -141,7 +241,7 @@ channels_ks = [
|
|||||||
channels_cam_pco = [
|
channels_cam_pco = [
|
||||||
"SATES21-CAMS154-M1:FPICTURE",
|
"SATES21-CAMS154-M1:FPICTURE",
|
||||||
"SATES24-CAMS161-M1:FPICTURE",
|
"SATES24-CAMS161-M1:FPICTURE",
|
||||||
"SATES21-PATT-M1:FPICTURE",
|
"SATES21-CAMS-PATT1:FPICTURE",
|
||||||
]
|
]
|
||||||
|
|
||||||
channels_cam_gige = [
|
channels_cam_gige = [
|
||||||
@ -157,7 +257,7 @@ channels = channels_nbs + channels_inten + channels_ks + channels_cam_pco + chan
|
|||||||
names_cam_pco = [
|
names_cam_pco = [
|
||||||
"SATES21-CAMS154-M1",
|
"SATES21-CAMS154-M1",
|
||||||
"SATES24-CAMS161-M1",
|
"SATES24-CAMS161-M1",
|
||||||
"SATES21-PATT-M1",
|
"SATES21-CAMS-PATT1",
|
||||||
]
|
]
|
||||||
suffices_proc = [
|
suffices_proc = [
|
||||||
"processing_parameters",
|
"processing_parameters",
|
||||||
@ -171,11 +271,51 @@ for n in names_cam_pco:
|
|||||||
|
|
||||||
|
|
||||||
pvs = [
|
pvs = [
|
||||||
"SATFE10-PEPG046:PHOTON-ENERGY-PER-PULSE-AVG",
|
"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"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: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 = [
|
detectors = [
|
||||||
@ -192,63 +332,24 @@ instrument = "maloja"
|
|||||||
#pgroup = "p19343" # slic dev
|
#pgroup = "p19343" # slic dev
|
||||||
#pgroup = "p19373" # laser
|
#pgroup = "p19373" # laser
|
||||||
#pgroup = "p19483" # pilot 1 -- TRXPS
|
#pgroup = "p19483" # pilot 1 -- TRXPS
|
||||||
pgroup = "p19488" # pilot 2 -- Non-Linear Spectroscopy
|
#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 = SFAcquisition(instrument, pgroup, default_channels=channels, default_pvs=pvs, default_detectors=detectors, rate_multiplicator=1)
|
||||||
#daq = FakeAcquisition(instrument, pgroup)
|
#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 = PVCondition("SATBD01-DBPM060:Q2", vmin=5, vmax=None, wait_time=1, required_fraction=0.8)
|
||||||
#check_intensity = None
|
#check_intensity = None
|
||||||
|
|
||||||
scan = Scanner(scan_info_dir=f"/sf/{instrument}/data/{pgroup}/res/scan_info", default_acquisitions=[daq], condition=check_intensity)
|
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)
|
gui = GUI(scan, show_goto=True, show_spec=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)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user