large cleanup, part 1
This commit is contained in:
293
PSSS_motion.py
293
PSSS_motion.py
@ -1,293 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
#*-----------------------------------------------------------------------*
|
|
||||||
#| |
|
|
||||||
#| Copyright (c) 2014 by Paul Scherrer Institute (http://www.psi.ch) |
|
|
||||||
#| |
|
|
||||||
#| Author Thierry Zamofing (thierry.zamofing@psi.ch) |
|
|
||||||
#*-----------------------------------------------------------------------*
|
|
||||||
'''
|
|
||||||
motion procedures for PSSS:
|
|
||||||
|
|
||||||
mode:
|
|
||||||
0: homing
|
|
||||||
1: calc energy and SPECTRUM_X out of camera arm angle
|
|
||||||
move CamPosX out of CristBendRot
|
|
||||||
'''
|
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
from errno import ENETRESET
|
|
||||||
import logging, sys, os, json
|
|
||||||
import CaChannel,time
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
|
|
||||||
class PSSS:
|
|
||||||
|
|
||||||
def __init__(self, args):
|
|
||||||
# import pdb; pdb.set_trace()
|
|
||||||
# sys.exit()
|
|
||||||
# {'mode': 0, 'stdout': True, 'var': []}
|
|
||||||
# {'mode': 5, 'stdout': True, 'var': ['SARFE10-PSSS059']}
|
|
||||||
|
|
||||||
self.args=args
|
|
||||||
prefix=self.args.var[0]
|
|
||||||
prefix=prefix[0:prefix.find('-')+1]
|
|
||||||
self.prefix=prefix
|
|
||||||
#print('Prefix='+prefix)
|
|
||||||
self.pv=dict()
|
|
||||||
|
|
||||||
def getPv(self,name):
|
|
||||||
try:
|
|
||||||
pv=self.pv[name]
|
|
||||||
except KeyError:
|
|
||||||
prefix=self.prefix
|
|
||||||
pv = CaChannel.CaChannel(prefix+name) ;pv.searchw()
|
|
||||||
self.pv[name]=pv
|
|
||||||
return pv
|
|
||||||
|
|
||||||
def moveLimit(self,m,val):
|
|
||||||
self.moveAbs(m,val)
|
|
||||||
|
|
||||||
def waitMotionDone(self,m):
|
|
||||||
s=m+'.DMOV'
|
|
||||||
pv=self.getPv(s)
|
|
||||||
sys.stdout.write('wait motion '+s+' ');sys.stdout.flush();
|
|
||||||
while pv.getw()==0:
|
|
||||||
sys.stdout.write('.');sys.stdout.flush();
|
|
||||||
time.sleep(.1)
|
|
||||||
print('done');
|
|
||||||
|
|
||||||
def setPos(self,m,ofs):
|
|
||||||
pvSET=self.getPv(m+'.SET')
|
|
||||||
pvVAL=self.getPv(m+'.VAL')
|
|
||||||
pvSET.putw(1)#Set
|
|
||||||
print('set ofset to %f'%ofs)
|
|
||||||
pvVAL.putw(ofs) #set value (without move)
|
|
||||||
time.sleep(.1) # wait for safety
|
|
||||||
pvSET.putw(0)#Use
|
|
||||||
time.sleep(.1) # wait for safety
|
|
||||||
|
|
||||||
def moveAbs(self,m,val):
|
|
||||||
pvVAL=self.getPv(m+'.VAL')
|
|
||||||
pvVAL.putw(val) #set position and move
|
|
||||||
|
|
||||||
def homing(self):
|
|
||||||
pvNameLst=('PSSS055:MOTOR_ROT_X1',
|
|
||||||
'PSSS055:MOTOR_X1',
|
|
||||||
'PSSS055:MOTOR_Y1',
|
|
||||||
'PSSS055:MOTOR_PROBE',
|
|
||||||
'PSSS059:MOTOR_X5',
|
|
||||||
'PSSS059:MOTOR_Y5',
|
|
||||||
'PSSS059:MOTOR_Z5',
|
|
||||||
'PSSS059:MOTOR_X3',
|
|
||||||
'PSSS059:MOTOR_Y3')
|
|
||||||
|
|
||||||
pvHOME = self.getPv('PSSS059:HOMING.VAL')
|
|
||||||
if pvHOME.getw(1) == 1:
|
|
||||||
print('homing still in progress. abort new procedure')
|
|
||||||
#return
|
|
||||||
pvHOME.putw(1)#homing in progress
|
|
||||||
|
|
||||||
try:
|
|
||||||
pvHomr=self.getPv(pvNameLst[0]+'.HOMR')
|
|
||||||
pvHomr.putw(1)#homing MOTOR_ROT_X1
|
|
||||||
self.waitMotionDone(pvNameLst[0])
|
|
||||||
|
|
||||||
homing=(
|
|
||||||
(1,200,10,0), # PSSS055:MOTOR_X1 Home on +limit switch to +10mm
|
|
||||||
(2,10,4.475,2.22), # PSSS055:MOTOR_Y1 Home on +limit switch to +4.475mm
|
|
||||||
(3,50,0,-9), # PSSS055:MOTOR_PROBE Home on +limit switch to +0mm
|
|
||||||
(4,80,35,0), # PSSS059:MOTOR_X5 Home on +limit switch to +35mm
|
|
||||||
(5,30,10,0), # PSSS059:MOTOR_Y5 Home on +limit switch to +10mm
|
|
||||||
# (6,20,8.9,0), # PSSS059:MOTOR_Z5 Home on +limit switch to +8.9mm Set HLM to 10, LLM to -2mm
|
|
||||||
(7,30,1,0), # PSSS059:MOTOR_X3 Home on +limit switch to +10mm
|
|
||||||
(8,30,1,-1.4), # PSSS059:MOTOR_Y3 Home on +limit switch to +10mm
|
|
||||||
)
|
|
||||||
for idx,mvLim,setPos,mvPos in homing:
|
|
||||||
pvName=pvNameLst[idx]
|
|
||||||
print('homing %s %f %f %f'%(pvName,mvLim,setPos,mvPos))
|
|
||||||
self.moveLimit(pvName,mvLim)
|
|
||||||
|
|
||||||
for idx,mvLim,setPos,mvPos in homing:
|
|
||||||
pvName=pvNameLst[idx]
|
|
||||||
self.waitMotionDone(pvName)
|
|
||||||
self.setPos(pvName,setPos)
|
|
||||||
|
|
||||||
time.sleep(2);print ("sleep 2 sec.")
|
|
||||||
for idx,mvLim,setPos,mvPos in homing:
|
|
||||||
pvName=pvNameLst[idx]
|
|
||||||
self.moveAbs(pvName,mvPos)
|
|
||||||
|
|
||||||
for idx,mvLim,setPos,mvPos in homing:
|
|
||||||
pvName=pvNameLst[idx]
|
|
||||||
self.waitMotionDone(pvName)
|
|
||||||
|
|
||||||
|
|
||||||
except AssertionError as e: #BaseException as e:
|
|
||||||
print(e)
|
|
||||||
pvHOME.putw(3)#homing failed
|
|
||||||
else:
|
|
||||||
pvHOME.putw(2)#homing done
|
|
||||||
|
|
||||||
|
|
||||||
def set_energy_motor(self,energy2motor,scan=False, rotWait=False):
|
|
||||||
crystalType=self.getPv('PSSS059:CRYSTAL_SP').getw()
|
|
||||||
#crystalType=2
|
|
||||||
#print(crystalType)
|
|
||||||
#print(type(crystalType))
|
|
||||||
if crystalType==0: return
|
|
||||||
# 0 None
|
|
||||||
# 1 Si(111)R155
|
|
||||||
# 2 Si(220)R75
|
|
||||||
# 3 Si(220)R145
|
|
||||||
# 4 Si(220)R200
|
|
||||||
# 5 Si(333)R155
|
|
||||||
|
|
||||||
#load lut
|
|
||||||
fnXtlLst=(None,"Si111R155","Si220R75","Si220R145","Si220R200","Si333R155")
|
|
||||||
#print(__file__)
|
|
||||||
base=os.path.dirname(__file__)
|
|
||||||
fn=os.path.join(base,'lut'+fnXtlLst[crystalType]+'.txt')
|
|
||||||
lut= np.genfromtxt(fn, delimiter='\t',names=True)
|
|
||||||
#lut
|
|
||||||
#lut.dtype
|
|
||||||
#lut[1]['Energy']
|
|
||||||
#lut['Energy']
|
|
||||||
#lut=np.genfromtxt(fn, delimiter='\t',skip_header=1)
|
|
||||||
if energy2motor:
|
|
||||||
energy =self.getPv('PSSS059:ENERGY').getw()
|
|
||||||
#energy =6000
|
|
||||||
gratingType=self.getPv('PSSS055:GRATING_SP').getw()
|
|
||||||
#gratingType=3
|
|
||||||
camPosX='CamPosX'
|
|
||||||
if gratingType in(1,2):camPosX+='_100nm'
|
|
||||||
elif gratingType==3:camPosX+='_150nm'
|
|
||||||
elif gratingType==4:camPosX+='_200nm'
|
|
||||||
|
|
||||||
camArmRot =np.interp(energy,lut['Energy'],lut['CamArmRot'])
|
|
||||||
cristBendRot=np.interp(energy,lut['Energy'],lut['CristBendRot'])
|
|
||||||
camPosX =np.interp(energy,lut['Energy'],lut[camPosX])
|
|
||||||
evPerPix =np.interp(energy,lut['Energy'],lut['EvPerPix'])
|
|
||||||
else:
|
|
||||||
camArmRot=self.getPv('PSSS059:MOTOR_ROT_X4').getw()
|
|
||||||
idx=~np.isnan(lut['CamArmRot'])
|
|
||||||
lutCamArmRot=lut['CamArmRot'][idx]
|
|
||||||
energy =np.interp(camArmRot,lutCamArmRot[::-1],lut['Energy'][idx][::-1])
|
|
||||||
evPerPix =np.interp(camArmRot,lutCamArmRot[::-1],lut['EvPerPix'][idx][::-1])
|
|
||||||
|
|
||||||
#camera: 2560 x 2160
|
|
||||||
n=2560
|
|
||||||
i=np.arange(n)-n/2
|
|
||||||
spctr_x=energy+i*evPerPix
|
|
||||||
pv=self.getPv('PSSS059:SPECTRUM_X')
|
|
||||||
pv.putw(spctr_x)
|
|
||||||
|
|
||||||
pv=self.getPv('PSSS059:SPECTRUM_Y')
|
|
||||||
mu=2560./2
|
|
||||||
sigma=100.
|
|
||||||
x=np.arange(2560.)
|
|
||||||
spctr_y= 1000.*np.exp(-( (x-mu)**2 / ( 2.0 * sigma**2 ) ) )
|
|
||||||
pv.putw(spctr_y)
|
|
||||||
|
|
||||||
if energy2motor:
|
|
||||||
print('energy2motor: camArmRot: %g cristBendRot: %g camPosX:%g evPerPix:%g'%(camArmRot,cristBendRot,camPosX,evPerPix))
|
|
||||||
pv=self.getPv('PSSS059:MOTOR_ROT_X4')
|
|
||||||
pv.putw(camArmRot)
|
|
||||||
pv=self.getPv('PSSS059:MOTOR_ROT_X3')
|
|
||||||
pv.putw(cristBendRot)
|
|
||||||
if rotWait == True:
|
|
||||||
self.waitMotionDone('PSSS059:MOTOR_ROT_X3')
|
|
||||||
if scan == False: # if True the camera X position will not be changed
|
|
||||||
pv=self.getPv('PSSS059:MOTOR_X5')
|
|
||||||
pv.putw(camPosX)
|
|
||||||
else:
|
|
||||||
print('motor2energy: energy: %g evPerPix:%g'%(energy,evPerPix))
|
|
||||||
pv=self.getPv('PSSS059:ENERGY')
|
|
||||||
pv.putw(energy)
|
|
||||||
|
|
||||||
def grating2motor(self):
|
|
||||||
energy =self.getPv('PSSS059:ENERGY').getw()
|
|
||||||
gratingType=self.getPv('PSSS055:GRATING_SP').getw()
|
|
||||||
if gratingType==0:
|
|
||||||
print('no grating')
|
|
||||||
girderX=0.
|
|
||||||
else:
|
|
||||||
base=os.path.dirname(__file__)
|
|
||||||
fn=fn=os.path.join(base,'lutGirderXTrans.txt')
|
|
||||||
lut= np.genfromtxt(fn, delimiter='\t',names=True)
|
|
||||||
|
|
||||||
d={1:'100nm',2:'100nm',3:'150nm',4:'200nm'}
|
|
||||||
print(gratingType)
|
|
||||||
grtStr=d[gratingType]
|
|
||||||
|
|
||||||
girderX =np.interp(energy,lut['Energy'],lut[grtStr])
|
|
||||||
|
|
||||||
print("girderX:%g"%(girderX))
|
|
||||||
pv=self.getPv('PSSS059:MOTOR_X2')
|
|
||||||
pv.putw(girderX)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__=='__main__':
|
|
||||||
from optparse import OptionParser, IndentedHelpFormatter
|
|
||||||
class MyFormatter(IndentedHelpFormatter):
|
|
||||||
'helper class for formating the OptionParser'
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
IndentedHelpFormatter.__init__(self)
|
|
||||||
|
|
||||||
def format_epilog(self, epilog):
|
|
||||||
if epilog:
|
|
||||||
return epilog
|
|
||||||
else:
|
|
||||||
return ""
|
|
||||||
|
|
||||||
def parse_args():
|
|
||||||
'main command line interpreter function'
|
|
||||||
(h, t)=os.path.split(sys.argv[0]);cmd='\n '+(t if len(h)>3 else sys.argv[0])+' '
|
|
||||||
exampleCmd=('MYPREFIX',
|
|
||||||
)
|
|
||||||
epilog=__doc__+'''
|
|
||||||
Examples:'''+''.join(map(lambda s:cmd+s, exampleCmd))+'\n '
|
|
||||||
|
|
||||||
fmt=MyFormatter()
|
|
||||||
parser=OptionParser(epilog=epilog, formatter=fmt)
|
|
||||||
parser.add_option('-m', '--mode', type="int", help='move instead of homing', default=0)
|
|
||||||
parser.add_option('-s', '--stdout', action="store_true", help='log to stdout instead of file')
|
|
||||||
|
|
||||||
(args, other)=parser.parse_args()
|
|
||||||
#print(args,other)
|
|
||||||
args.var=other
|
|
||||||
#args.var=('SARFE10-',)
|
|
||||||
|
|
||||||
fn='/afs/psi.ch/intranet/Controls/scratch/'+os.path.basename(__file__)+'_'+os.environ.get('USER')+'.log'
|
|
||||||
if not args.stdout:
|
|
||||||
print('output redirected to file:\n'+fn)
|
|
||||||
stdoutBak=sys.stdout
|
|
||||||
sys.stdout = open(fn, 'a+')
|
|
||||||
print('*'*30+'\n'+time.ctime()+': run on host:'+os.environ.get('HOSTNAME'))
|
|
||||||
print('Args:'+str(args)+' '+str(args.var))
|
|
||||||
sys.stdout.flush()
|
|
||||||
|
|
||||||
psss=PSSS(args)
|
|
||||||
if args.mode==0:
|
|
||||||
psss.homing()
|
|
||||||
elif args.mode==1:
|
|
||||||
psss.set_energy_motor(energy2motor=True)
|
|
||||||
elif args.mode==2:
|
|
||||||
psss.set_energy_motor(energy2motor=False)
|
|
||||||
elif args.mode==3:
|
|
||||||
psss.grating2motor()
|
|
||||||
elif args.mode==4:
|
|
||||||
psss.set_energy_motor(energy2motor=True, scan=True)
|
|
||||||
elif args.mode==5:
|
|
||||||
psss.set_energy_motor(energy2motor=True, scan=True,rotWait=True)
|
|
||||||
print('PSSS_motion done.')
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
#os.environ['EPICS_CA_ADDR_LIST']='localhost'
|
|
||||||
#os.environ['EPICS_CA_ADDR_LIST']='172.26.0.255 172.26.2.255 172.26.8.255 172.26.16.255 172.26.24.255 172.26.32.255 172.26.40.255 172.26.110.255 172.26.111.255 172.26.120.255 129.129.242.255 129.129.243.255'
|
|
||||||
|
|
||||||
parse_args()
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
268
acquisition/base.py
Normal file
268
acquisition/base.py
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
|
||||||
|
import time
|
||||||
|
# setup logging
|
||||||
|
from loguru import logger
|
||||||
|
|
||||||
|
def simple_scan():
|
||||||
|
"""
|
||||||
|
adjustable: Adjustable names to scan.
|
||||||
|
n_pulses (int): Number of pulses per step.
|
||||||
|
filename (str): Name of output file.
|
||||||
|
|
||||||
|
"""
|
||||||
|
scan.scan1D(adjustable, start_pos, end_pos, step_size, n_pulses, filename)
|
||||||
|
|
||||||
|
# TODO: make stand work with stand as well, what's the easiest way here?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def simple_acquisition(daq, filename, n_pulses=10, sample="LiTbF4 sample (left)", comment="", parameters="", stand_client=None):
|
||||||
|
logger.info("Simple acquisition started.")
|
||||||
|
|
||||||
|
task = daq.acquire(filename, n_pulses=n_pulses, n_repeat=1, is_scan_step=False, wait=True)
|
||||||
|
run_number = daq.client.run_number
|
||||||
|
|
||||||
|
# fname = task.filenames[0]
|
||||||
|
# pattern = r"run([0-9]{4})"
|
||||||
|
# match = re.search(pattern, fname)
|
||||||
|
# run_number = int(match.groups()[0])
|
||||||
|
|
||||||
|
# stand_client.add_row(run_number=run_number)
|
||||||
|
|
||||||
|
all_things = {}
|
||||||
|
all_things["run_number"] = run_number
|
||||||
|
all_things["time"] = time.asctime()
|
||||||
|
all_things["topic"] = "Li magnetism"
|
||||||
|
all_things["sample"] = sample
|
||||||
|
all_things["comment"] = comment
|
||||||
|
all_things["parameters"] = parameters
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# combine with other parameters (spreadsheet overview)
|
||||||
|
# overviews = {thing.name: thing.get() for thing in overview}
|
||||||
|
|
||||||
|
# combined = all_things | overviews
|
||||||
|
combined = all_things
|
||||||
|
|
||||||
|
if stand_client is not None:
|
||||||
|
stand_client.add_row(**combined)
|
||||||
|
|
||||||
|
logger.debug(f"Simple acquisition complete: {combined}")
|
||||||
|
|
||||||
|
return run_number
|
||||||
|
|
||||||
|
|
||||||
|
def scan_positions(positions_x, positions_y):
|
||||||
|
for x in positions_x:
|
||||||
|
for y in positions_y:
|
||||||
|
smaract_mini_XYZ.x.mv(x)
|
||||||
|
smaract_mini_XYZ.y.mv(y)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
# while smaract_mini_XYZ.x.is_moving():
|
||||||
|
# time.sleep(1)
|
||||||
|
simple_acquisition(
|
||||||
|
"Speckle scan grid 5",
|
||||||
|
n_pulses=100,
|
||||||
|
comment=f"Grid scan 5",
|
||||||
|
parameters=f"at x={x:.5f}mm, y={y:.5f}mm, OWIS:{OWIS.get():.3f}mm",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def minimized_acquisition(daq, run_number=839, n_pulses=100):
|
||||||
|
if n_pulses > 6000:
|
||||||
|
logger.warning("DAQ cannot provide data of so many pulses in one request. Aborting.")
|
||||||
|
return
|
||||||
|
|
||||||
|
import cta_lib
|
||||||
|
|
||||||
|
repetitions = n_pulses
|
||||||
|
# this is such an ugly interface...
|
||||||
|
# anyway: we set the number of repetitions for the CTA
|
||||||
|
cta.cta_client.set_repetition_config(config={"mode": cta_lib.CtaLib.RepetitionMode.NTIMES, "n": repetitions})
|
||||||
|
|
||||||
|
# logger.info(f"CTA start sequence, total runtime approximately {repetitions/10:.1f}s.")
|
||||||
|
cta.cta_client.start()
|
||||||
|
|
||||||
|
time.sleep(1)
|
||||||
|
start = time.time()
|
||||||
|
|
||||||
|
while cta.cta_client.is_running():
|
||||||
|
print(f"Wait for CTA sequence to finish, {time.time() - start:.0f}s elapsed.")
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
# Without the wait time the DAQ is returning fewer images than we asked it for
|
||||||
|
print("Waiting 60s for DAQ pipeline")
|
||||||
|
time.sleep(60)
|
||||||
|
|
||||||
|
CTA_sequence_start_PID = int(PV("SAR-CCTA-ESC:seq0Ctrl-StartedAt-O").get())
|
||||||
|
logger.info(f"Retrieve images starting from pid {CTA_sequence_start_PID}.")
|
||||||
|
|
||||||
|
# n_pulses*10 because of current rate_multiplicator
|
||||||
|
res = daq.retrieve(
|
||||||
|
"CTA_pulses",
|
||||||
|
np.arange(CTA_sequence_start_PID, CTA_sequence_start_PID + n_pulses * 10),
|
||||||
|
run_number=run_number,
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.debug(res)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def acquire_measured(daq, filename, sample="", comment="", parameters="", repetitions=1, no_CTA=False):
|
||||||
|
""" Combined acquisition: necessary to create a new run and then start the CTA sequence to
|
||||||
|
collect data for repetitions x 10 minutes at 10 Hz.
|
||||||
|
|
||||||
|
This is all rather brittle and rough but runs OK at the moment.
|
||||||
|
"""
|
||||||
|
|
||||||
|
run_number = daq.client.run_number # get current run number
|
||||||
|
|
||||||
|
all_things = {}
|
||||||
|
all_things["run_number"] = run_number + 1 # but store next one
|
||||||
|
all_things["time"] = time.asctime()
|
||||||
|
all_things["topic"] = "Li magnetism"
|
||||||
|
all_things["sample"] = sample
|
||||||
|
all_things["comment"] = comment
|
||||||
|
all_things["parameters"] = parameters
|
||||||
|
|
||||||
|
overviews = {thing.name: thing.get() for thing in overview}
|
||||||
|
|
||||||
|
combined = all_things | overviews
|
||||||
|
|
||||||
|
stand_client.add_row(**combined)
|
||||||
|
|
||||||
|
logger.debug(f"Simple acquisition complete: {combined}")
|
||||||
|
|
||||||
|
run_number = None # should automatically increase in broker client
|
||||||
|
logger.info(f"Retrieve images starting from pid {CTA_sequence_start_PID}.")
|
||||||
|
# n_pulses*10 because of current rate_multiplicator
|
||||||
|
res = daq.retrieve(
|
||||||
|
"CTA_pulses",
|
||||||
|
np.arange(CTA_sequence_start_PID, CTA_sequence_start_PID + n_pulses * 10),
|
||||||
|
run_number=run_number,
|
||||||
|
)
|
||||||
|
logger.debug(res)
|
||||||
|
|
||||||
|
|
||||||
|
def acquire_long(daq, filename, sample="", comment="", parameters="", repetitions=1, no_CTA=False):
|
||||||
|
""" Combined acquisition: necessary to create a new run and then start the CTA sequence to
|
||||||
|
collect data for repetitions x 10 minutes at 10 Hz.
|
||||||
|
|
||||||
|
This is all rather brittle and rough but runs OK at the moment.
|
||||||
|
"""
|
||||||
|
|
||||||
|
n_pulses = 6000 # 10 minutes, longer is not possible because the DAQ complains. So we split this up.
|
||||||
|
|
||||||
|
if no_CTA:
|
||||||
|
run_number = simple_acquisition(filename, n_pulses=n_pulses, sample=sample, comment=comment, parameters=parameters, daq=daq)
|
||||||
|
return
|
||||||
|
|
||||||
|
# only 10 pulses as a baseline
|
||||||
|
run_number = simple_acquisition(filename, n_pulses=10, sample=sample, comment=comment, parameters=parameters, daq=daq)
|
||||||
|
|
||||||
|
for _ in range(repetitions):
|
||||||
|
minimized_acquisition(run_number=run_number, n_pulses=n_pulses, daq=daq)
|
||||||
|
|
||||||
|
|
||||||
|
def acquire_long_energy(daq, filename, sample="LiHoF4 sample", comment="", parameters="", repetitions=1):
|
||||||
|
""" Use acquire long to make an enery scan, every energy is a new run.
|
||||||
|
"""
|
||||||
|
energies = np.linspace(8044, 8092, 13)
|
||||||
|
#energies = np.linspace(8044, 8092, 7)
|
||||||
|
|
||||||
|
for i, energy in enumerate(energies):
|
||||||
|
undulators.set_target_value(energy)
|
||||||
|
time.sleep(10)
|
||||||
|
|
||||||
|
parameters = f'Energy: {energy}eV, multiplicator:{daq.client.config.rate_multiplicator}, steps: {i} of {len(energies)-1}'
|
||||||
|
acquire_long(filename=f'LiTbF4,energy_scan_energy_{energy}_multiplicator_{daq.client.config.rate_multiplicator}',sample=sample, comment=comment,
|
||||||
|
parameters=parameters, daq=daq, repetitions=repetitions, no_CTA=True)
|
||||||
|
|
||||||
|
|
||||||
|
# def acquire_long_energy(filename, sample="", comment="", parameters="", daq=slow_daq, repetitions=1):
|
||||||
|
# """ a brittle energy scan combined with the CTA
|
||||||
|
# """
|
||||||
|
|
||||||
|
# target_values = np.arange(7490, 7540, 2)
|
||||||
|
|
||||||
|
# for target in target_values:
|
||||||
|
|
||||||
|
# undulators.set_target_value(target)
|
||||||
|
# time.sleep(10)
|
||||||
|
|
||||||
|
# run_number = simple_acquisition(filename, n_pulses=10, sample=sample, comment=comment, parameters=parameters, daq=slow_daq)
|
||||||
|
# n_pulses = 60 # 1 minute.
|
||||||
|
# minimized_acquisition(run_number=run_number, n_pulses=n_pulses, daq=slow_daq)
|
||||||
|
|
||||||
|
|
||||||
|
def acquisition_pms(daq, run_number=200):
|
||||||
|
import cta_lib
|
||||||
|
|
||||||
|
cta.cta_client.set_repetition_config(config={"mode": cta_lib.CtaLib.RepetitionMode.NTIMES, "n": 1})
|
||||||
|
|
||||||
|
cta.cta_client.start()
|
||||||
|
|
||||||
|
time.sleep(1)
|
||||||
|
start = time.time()
|
||||||
|
|
||||||
|
while cta.cta_client.is_running():
|
||||||
|
print(f"Wait for CTA sequence to finish, {time.time() - start:.0f}s elapsed.")
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
CTA_sequence_start_PID = int(PV("SAR-CCTA-ESC:seq0Ctrl-StartedAt-O").get())
|
||||||
|
CTA_sequence_length = int(PV("SAR-CCTA-ESC:seq0Ctrl-Length-I").get())
|
||||||
|
CTA_sequence_end_PID = CTA_sequence_start_PID + CTA_sequence_length - 1
|
||||||
|
|
||||||
|
print("Start PID = ", CTA_sequence_start_PID)
|
||||||
|
print("End PID = ", CTA_sequence_end_PID)
|
||||||
|
|
||||||
|
|
||||||
|
# Without the wait time the DAQ is returning fewer images than we asked it for
|
||||||
|
print("Waiting 30s for DAQ pipeline")
|
||||||
|
time.sleep(30)
|
||||||
|
|
||||||
|
logger.info(f"Retrieve images starting from pid {CTA_sequence_start_PID}.")
|
||||||
|
|
||||||
|
print(np.arange(CTA_sequence_start_PID, CTA_sequence_end_PID+1))
|
||||||
|
|
||||||
|
res = daq.retrieve(
|
||||||
|
"PuMa_run",
|
||||||
|
np.arange(CTA_sequence_start_PID, CTA_sequence_end_PID),
|
||||||
|
run_number=run_number,
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.debug(res)
|
||||||
|
|
||||||
|
|
||||||
|
def acquire_and_pulse(tag="test"):
|
||||||
|
# empty images because pulse picker is closed here, only for the generation of a new run
|
||||||
|
task = daq.acquire(tag, n_pulses=1, n_repeat=1, is_scan_step=False, wait=True)
|
||||||
|
|
||||||
|
run_number = int(task.filenames[0].split("/")[6][3:])
|
||||||
|
|
||||||
|
print(f"new run {run_number} generated.")
|
||||||
|
|
||||||
|
acquisition_pms(run_number=run_number)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def acquire_and_pulse_long(tag="test"):
|
||||||
|
|
||||||
|
pp_normal(opening='on')
|
||||||
|
time.sleep(0.1)
|
||||||
|
|
||||||
|
# empty images because pulse picker is closed here, only for the generation of a new run
|
||||||
|
task = daq.acquire(tag, n_pulses=1000, n_repeat=1, is_scan_step=False, wait=True)
|
||||||
|
|
||||||
|
run_number = int(task.filenames[0].split("/")[6][3:])
|
||||||
|
|
||||||
|
print(f"new run {run_number} generated.")
|
||||||
|
|
||||||
|
pp_cta()
|
||||||
|
time.sleep(0.1)
|
||||||
|
acquisition_pms(run_number=run_number)
|
313
beamline/PSSS_motion.py
Normal file
313
beamline/PSSS_motion.py
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# *-----------------------------------------------------------------------*
|
||||||
|
# | |
|
||||||
|
# | Copyright (c) 2014 by Paul Scherrer Institute (http://www.psi.ch) |
|
||||||
|
# | |
|
||||||
|
# | Author Thierry Zamofing (thierry.zamofing@psi.ch) |
|
||||||
|
# *-----------------------------------------------------------------------*
|
||||||
|
"""
|
||||||
|
motion procedures for PSSS:
|
||||||
|
|
||||||
|
mode:
|
||||||
|
0: homing
|
||||||
|
1: calc energy and SPECTRUM_X out of camera arm angle
|
||||||
|
move CamPosX out of CristBendRot
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
from errno import ENETRESET
|
||||||
|
import logging, sys, os, json
|
||||||
|
import CaChannel, time
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
class PSSS:
|
||||||
|
def __init__(self, args):
|
||||||
|
# import pdb; pdb.set_trace()
|
||||||
|
# sys.exit()
|
||||||
|
# {'mode': 0, 'stdout': True, 'var': []}
|
||||||
|
# {'mode': 5, 'stdout': True, 'var': ['SARFE10-PSSS059']}
|
||||||
|
|
||||||
|
self.args = args
|
||||||
|
prefix = self.args.var[0]
|
||||||
|
prefix = prefix[0 : prefix.find("-") + 1]
|
||||||
|
self.prefix = prefix
|
||||||
|
# print('Prefix='+prefix)
|
||||||
|
self.pv = dict()
|
||||||
|
|
||||||
|
def getPv(self, name):
|
||||||
|
try:
|
||||||
|
pv = self.pv[name]
|
||||||
|
except KeyError:
|
||||||
|
prefix = self.prefix
|
||||||
|
pv = CaChannel.CaChannel(prefix + name)
|
||||||
|
pv.searchw()
|
||||||
|
self.pv[name] = pv
|
||||||
|
return pv
|
||||||
|
|
||||||
|
def moveLimit(self, m, val):
|
||||||
|
self.moveAbs(m, val)
|
||||||
|
|
||||||
|
def waitMotionDone(self, m):
|
||||||
|
s = m + ".DMOV"
|
||||||
|
pv = self.getPv(s)
|
||||||
|
sys.stdout.write("wait motion " + s + " ")
|
||||||
|
sys.stdout.flush()
|
||||||
|
while pv.getw() == 0:
|
||||||
|
sys.stdout.write(".")
|
||||||
|
sys.stdout.flush()
|
||||||
|
time.sleep(0.1)
|
||||||
|
print("done")
|
||||||
|
|
||||||
|
def setPos(self, m, ofs):
|
||||||
|
pvSET = self.getPv(m + ".SET")
|
||||||
|
pvVAL = self.getPv(m + ".VAL")
|
||||||
|
pvSET.putw(1) # Set
|
||||||
|
print("set ofset to %f" % ofs)
|
||||||
|
pvVAL.putw(ofs) # set value (without move)
|
||||||
|
time.sleep(0.1) # wait for safety
|
||||||
|
pvSET.putw(0) # Use
|
||||||
|
time.sleep(0.1) # wait for safety
|
||||||
|
|
||||||
|
def moveAbs(self, m, val):
|
||||||
|
pvVAL = self.getPv(m + ".VAL")
|
||||||
|
pvVAL.putw(val) # set position and move
|
||||||
|
|
||||||
|
def homing(self):
|
||||||
|
pvNameLst = (
|
||||||
|
"PSSS055:MOTOR_ROT_X1",
|
||||||
|
"PSSS055:MOTOR_X1",
|
||||||
|
"PSSS055:MOTOR_Y1",
|
||||||
|
"PSSS055:MOTOR_PROBE",
|
||||||
|
"PSSS059:MOTOR_X5",
|
||||||
|
"PSSS059:MOTOR_Y5",
|
||||||
|
"PSSS059:MOTOR_Z5",
|
||||||
|
"PSSS059:MOTOR_X3",
|
||||||
|
"PSSS059:MOTOR_Y3",
|
||||||
|
)
|
||||||
|
|
||||||
|
pvHOME = self.getPv("PSSS059:HOMING.VAL")
|
||||||
|
if pvHOME.getw(1) == 1:
|
||||||
|
print("homing still in progress. abort new procedure")
|
||||||
|
# return
|
||||||
|
pvHOME.putw(1) # homing in progress
|
||||||
|
|
||||||
|
try:
|
||||||
|
pvHomr = self.getPv(pvNameLst[0] + ".HOMR")
|
||||||
|
pvHomr.putw(1) # homing MOTOR_ROT_X1
|
||||||
|
self.waitMotionDone(pvNameLst[0])
|
||||||
|
|
||||||
|
homing = (
|
||||||
|
(1, 200, 10, 0), # PSSS055:MOTOR_X1 Home on +limit switch to +10mm
|
||||||
|
(2, 10, 4.475, 2.22), # PSSS055:MOTOR_Y1 Home on +limit switch to +4.475mm
|
||||||
|
(3, 50, 0, -9), # PSSS055:MOTOR_PROBE Home on +limit switch to +0mm
|
||||||
|
(4, 80, 35, 0), # PSSS059:MOTOR_X5 Home on +limit switch to +35mm
|
||||||
|
(5, 30, 10, 0), # PSSS059:MOTOR_Y5 Home on +limit switch to +10mm
|
||||||
|
# (6,20,8.9,0), # PSSS059:MOTOR_Z5 Home on +limit switch to +8.9mm Set HLM to 10, LLM to -2mm
|
||||||
|
(7, 30, 1, 0), # PSSS059:MOTOR_X3 Home on +limit switch to +10mm
|
||||||
|
(8, 30, 1, -1.4), # PSSS059:MOTOR_Y3 Home on +limit switch to +10mm
|
||||||
|
)
|
||||||
|
for idx, mvLim, setPos, mvPos in homing:
|
||||||
|
pvName = pvNameLst[idx]
|
||||||
|
print("homing %s %f %f %f" % (pvName, mvLim, setPos, mvPos))
|
||||||
|
self.moveLimit(pvName, mvLim)
|
||||||
|
|
||||||
|
for idx, mvLim, setPos, mvPos in homing:
|
||||||
|
pvName = pvNameLst[idx]
|
||||||
|
self.waitMotionDone(pvName)
|
||||||
|
self.setPos(pvName, setPos)
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
print("sleep 2 sec.")
|
||||||
|
for idx, mvLim, setPos, mvPos in homing:
|
||||||
|
pvName = pvNameLst[idx]
|
||||||
|
self.moveAbs(pvName, mvPos)
|
||||||
|
|
||||||
|
for idx, mvLim, setPos, mvPos in homing:
|
||||||
|
pvName = pvNameLst[idx]
|
||||||
|
self.waitMotionDone(pvName)
|
||||||
|
|
||||||
|
except AssertionError as e: # BaseException as e:
|
||||||
|
print(e)
|
||||||
|
pvHOME.putw(3) # homing failed
|
||||||
|
else:
|
||||||
|
pvHOME.putw(2) # homing done
|
||||||
|
|
||||||
|
def set_energy_motor(self, energy2motor, scan=False, rotWait=False):
|
||||||
|
crystalType = self.getPv("PSSS059:CRYSTAL_SP").getw()
|
||||||
|
# crystalType=2
|
||||||
|
# print(crystalType)
|
||||||
|
# print(type(crystalType))
|
||||||
|
if crystalType == 0:
|
||||||
|
return
|
||||||
|
# 0 None
|
||||||
|
# 1 Si(111)R155
|
||||||
|
# 2 Si(220)R75
|
||||||
|
# 3 Si(220)R145
|
||||||
|
# 4 Si(220)R200
|
||||||
|
# 5 Si(333)R155
|
||||||
|
|
||||||
|
# load lut
|
||||||
|
fnXtlLst = (None, "Si111R155", "Si220R75", "Si220R145", "Si220R200", "Si333R155")
|
||||||
|
# print(__file__)
|
||||||
|
base = os.path.dirname(__file__)
|
||||||
|
fn = os.path.join(base, "lut" + fnXtlLst[crystalType] + ".txt")
|
||||||
|
lut = np.genfromtxt(fn, delimiter="\t", names=True)
|
||||||
|
# lut
|
||||||
|
# lut.dtype
|
||||||
|
# lut[1]['Energy']
|
||||||
|
# lut['Energy']
|
||||||
|
# lut=np.genfromtxt(fn, delimiter='\t',skip_header=1)
|
||||||
|
if energy2motor:
|
||||||
|
energy = self.getPv("PSSS059:ENERGY").getw()
|
||||||
|
# energy =6000
|
||||||
|
gratingType = self.getPv("PSSS055:GRATING_SP").getw()
|
||||||
|
# gratingType=3
|
||||||
|
camPosX = "CamPosX"
|
||||||
|
if gratingType in (1, 2):
|
||||||
|
camPosX += "_100nm"
|
||||||
|
elif gratingType == 3:
|
||||||
|
camPosX += "_150nm"
|
||||||
|
elif gratingType == 4:
|
||||||
|
camPosX += "_200nm"
|
||||||
|
|
||||||
|
camArmRot = np.interp(energy, lut["Energy"], lut["CamArmRot"])
|
||||||
|
cristBendRot = np.interp(energy, lut["Energy"], lut["CristBendRot"])
|
||||||
|
camPosX = np.interp(energy, lut["Energy"], lut[camPosX])
|
||||||
|
evPerPix = np.interp(energy, lut["Energy"], lut["EvPerPix"])
|
||||||
|
else:
|
||||||
|
camArmRot = self.getPv("PSSS059:MOTOR_ROT_X4").getw()
|
||||||
|
idx = ~np.isnan(lut["CamArmRot"])
|
||||||
|
lutCamArmRot = lut["CamArmRot"][idx]
|
||||||
|
energy = np.interp(camArmRot, lutCamArmRot[::-1], lut["Energy"][idx][::-1])
|
||||||
|
evPerPix = np.interp(camArmRot, lutCamArmRot[::-1], lut["EvPerPix"][idx][::-1])
|
||||||
|
|
||||||
|
# camera: 2560 x 2160
|
||||||
|
n = 2560
|
||||||
|
i = np.arange(n) - n / 2
|
||||||
|
spctr_x = energy + i * evPerPix
|
||||||
|
pv = self.getPv("PSSS059:SPECTRUM_X")
|
||||||
|
pv.putw(spctr_x)
|
||||||
|
|
||||||
|
pv = self.getPv("PSSS059:SPECTRUM_Y")
|
||||||
|
mu = 2560.0 / 2
|
||||||
|
sigma = 100.0
|
||||||
|
x = np.arange(2560.0)
|
||||||
|
spctr_y = 1000.0 * np.exp(-((x - mu) ** 2 / (2.0 * sigma**2)))
|
||||||
|
pv.putw(spctr_y)
|
||||||
|
|
||||||
|
if energy2motor:
|
||||||
|
print(
|
||||||
|
"energy2motor: camArmRot: %g cristBendRot: %g camPosX:%g evPerPix:%g"
|
||||||
|
% (camArmRot, cristBendRot, camPosX, evPerPix)
|
||||||
|
)
|
||||||
|
pv = self.getPv("PSSS059:MOTOR_ROT_X4")
|
||||||
|
pv.putw(camArmRot)
|
||||||
|
pv = self.getPv("PSSS059:MOTOR_ROT_X3")
|
||||||
|
pv.putw(cristBendRot)
|
||||||
|
if rotWait == True:
|
||||||
|
self.waitMotionDone("PSSS059:MOTOR_ROT_X3")
|
||||||
|
if scan == False: # if True the camera X position will not be changed
|
||||||
|
pv = self.getPv("PSSS059:MOTOR_X5")
|
||||||
|
pv.putw(camPosX)
|
||||||
|
else:
|
||||||
|
print("motor2energy: energy: %g evPerPix:%g" % (energy, evPerPix))
|
||||||
|
pv = self.getPv("PSSS059:ENERGY")
|
||||||
|
pv.putw(energy)
|
||||||
|
|
||||||
|
def grating2motor(self):
|
||||||
|
energy = self.getPv("PSSS059:ENERGY").getw()
|
||||||
|
gratingType = self.getPv("PSSS055:GRATING_SP").getw()
|
||||||
|
if gratingType == 0:
|
||||||
|
print("no grating")
|
||||||
|
girderX = 0.0
|
||||||
|
else:
|
||||||
|
base = os.path.dirname(__file__)
|
||||||
|
fn = fn = os.path.join(base, "lutGirderXTrans.txt")
|
||||||
|
lut = np.genfromtxt(fn, delimiter="\t", names=True)
|
||||||
|
|
||||||
|
d = {1: "100nm", 2: "100nm", 3: "150nm", 4: "200nm"}
|
||||||
|
print(gratingType)
|
||||||
|
grtStr = d[gratingType]
|
||||||
|
|
||||||
|
girderX = np.interp(energy, lut["Energy"], lut[grtStr])
|
||||||
|
|
||||||
|
print("girderX:%g" % (girderX))
|
||||||
|
pv = self.getPv("PSSS059:MOTOR_X2")
|
||||||
|
pv.putw(girderX)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
from optparse import OptionParser, IndentedHelpFormatter
|
||||||
|
|
||||||
|
class MyFormatter(IndentedHelpFormatter):
|
||||||
|
"helper class for formating the OptionParser"
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
IndentedHelpFormatter.__init__(self)
|
||||||
|
|
||||||
|
def format_epilog(self, epilog):
|
||||||
|
if epilog:
|
||||||
|
return epilog
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def parse_args():
|
||||||
|
"main command line interpreter function"
|
||||||
|
(h, t) = os.path.split(sys.argv[0])
|
||||||
|
cmd = "\n " + (t if len(h) > 3 else sys.argv[0]) + " "
|
||||||
|
exampleCmd = ("MYPREFIX",)
|
||||||
|
epilog = (
|
||||||
|
__doc__
|
||||||
|
+ """
|
||||||
|
Examples:"""
|
||||||
|
+ "".join(map(lambda s: cmd + s, exampleCmd))
|
||||||
|
+ "\n "
|
||||||
|
)
|
||||||
|
|
||||||
|
fmt = MyFormatter()
|
||||||
|
parser = OptionParser(epilog=epilog, formatter=fmt)
|
||||||
|
parser.add_option("-m", "--mode", type="int", help="move instead of homing", default=0)
|
||||||
|
parser.add_option("-s", "--stdout", action="store_true", help="log to stdout instead of file")
|
||||||
|
|
||||||
|
(args, other) = parser.parse_args()
|
||||||
|
# print(args,other)
|
||||||
|
args.var = other
|
||||||
|
# args.var=('SARFE10-',)
|
||||||
|
|
||||||
|
fn = (
|
||||||
|
"/afs/psi.ch/intranet/Controls/scratch/"
|
||||||
|
+ os.path.basename(__file__)
|
||||||
|
+ "_"
|
||||||
|
+ os.environ.get("USER")
|
||||||
|
+ ".log"
|
||||||
|
)
|
||||||
|
if not args.stdout:
|
||||||
|
print("output redirected to file:\n" + fn)
|
||||||
|
stdoutBak = sys.stdout
|
||||||
|
sys.stdout = open(fn, "a+")
|
||||||
|
print("*" * 30 + "\n" + time.ctime() + ": run on host:" + os.environ.get("HOSTNAME"))
|
||||||
|
print("Args:" + str(args) + " " + str(args.var))
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
psss = PSSS(args)
|
||||||
|
if args.mode == 0:
|
||||||
|
psss.homing()
|
||||||
|
elif args.mode == 1:
|
||||||
|
psss.set_energy_motor(energy2motor=True)
|
||||||
|
elif args.mode == 2:
|
||||||
|
psss.set_energy_motor(energy2motor=False)
|
||||||
|
elif args.mode == 3:
|
||||||
|
psss.grating2motor()
|
||||||
|
elif args.mode == 4:
|
||||||
|
psss.set_energy_motor(energy2motor=True, scan=True)
|
||||||
|
elif args.mode == 5:
|
||||||
|
psss.set_energy_motor(energy2motor=True, scan=True, rotWait=True)
|
||||||
|
print("PSSS_motion done.")
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
# os.environ['EPICS_CA_ADDR_LIST']='localhost'
|
||||||
|
# os.environ['EPICS_CA_ADDR_LIST']='172.26.0.255 172.26.2.255 172.26.8.255 172.26.16.255 172.26.24.255 172.26.32.255 172.26.40.255 172.26.110.255 172.26.111.255 172.26.120.255 129.129.242.255 129.129.243.255'
|
||||||
|
|
||||||
|
parse_args()
|
85
beamline/bernina_mono.py
Normal file
85
beamline/bernina_mono.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
from types import SimpleNamespace
|
||||||
|
from time import sleep
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from slic.core.adjustable import Adjustable, PVAdjustable, PVEnumAdjustable
|
||||||
|
from slic.core.device import Device
|
||||||
|
from slic.utils.hastyepics import get_pv as PV
|
||||||
|
from slic.devices.general.motor import Motor
|
||||||
|
|
||||||
|
|
||||||
|
class BerninaMono(Device):
|
||||||
|
|
||||||
|
def __init__(self, ID, name="Bernina DCM", **kwargs):
|
||||||
|
super().__init__(ID, name=name, **kwargs)
|
||||||
|
|
||||||
|
self.theta = Motor(ID + ":RX12")
|
||||||
|
self.x = Motor(ID + ":TX12")
|
||||||
|
self.gap = Motor(ID + ":T2")
|
||||||
|
self.roll1 = Motor(ID + ":RZ1")
|
||||||
|
self.roll2 = Motor(ID + ":RZ2")
|
||||||
|
self.pitch2 = Motor(ID + ":RX2")
|
||||||
|
|
||||||
|
self.energy = DoubleCrystalMonoEnergy(ID, name=name)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class DoubleCrystalMonoEnergy(Adjustable):
|
||||||
|
|
||||||
|
def __init__(self, ID, name=None):
|
||||||
|
self.wait_time = 0.1
|
||||||
|
|
||||||
|
pvname_setvalue = "SAROP21-ARAMIS:ENERGY_SP"
|
||||||
|
pvname_readback = "SAROP21-ARAMIS:ENERGY"
|
||||||
|
pvname_moving = "SAROP21-ODCM098:MOVING"
|
||||||
|
pvname_stop = "SAROP21-ODCM098:STOP.PROC"
|
||||||
|
|
||||||
|
pv_setvalue = PV(pvname_setvalue)
|
||||||
|
pv_readback = PV(pvname_readback)
|
||||||
|
pv_moving = PV(pvname_moving)
|
||||||
|
pv_stop = PV(pvname_stop)
|
||||||
|
|
||||||
|
units = pv_readback.units
|
||||||
|
super().__init__(ID, name=name, units=units)
|
||||||
|
|
||||||
|
self.pvnames = SimpleNamespace(
|
||||||
|
setvalue = pvname_setvalue,
|
||||||
|
readback = pvname_readback,
|
||||||
|
moving = pvname_moving,
|
||||||
|
stop = pvname_stop
|
||||||
|
)
|
||||||
|
|
||||||
|
self.pvs = SimpleNamespace(
|
||||||
|
setvalue = pv_setvalue,
|
||||||
|
readback = pv_readback,
|
||||||
|
moving = pv_moving,
|
||||||
|
stop = pv_stop
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_current_value(self):
|
||||||
|
return self.pvs.readback.get()
|
||||||
|
|
||||||
|
def set_current_value(self, value):
|
||||||
|
self.pvs.setvalue.put(value)
|
||||||
|
sleep(3)
|
||||||
|
|
||||||
|
def set_target_value(self, value):
|
||||||
|
self.set_current_value(value)
|
||||||
|
# while abs(self.wait_for_valid_value() - value) > accuracy:
|
||||||
|
while self.is_moving():
|
||||||
|
sleep(self.wait_time)
|
||||||
|
|
||||||
|
|
||||||
|
def wait_for_valid_value(self):
|
||||||
|
val = np.nan
|
||||||
|
while not np.isfinite(val):
|
||||||
|
val = self.get_current_value()
|
||||||
|
return val
|
||||||
|
|
||||||
|
def is_moving(self):
|
||||||
|
moving = self.pvs.moving.get()
|
||||||
|
return bool(moving)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
self.pvs.stop.put(1)
|
@ -19,12 +19,13 @@ N_UNDS = list(range(3, 15+1))
|
|||||||
# energy_offset = 20.37839
|
# energy_offset = 20.37839
|
||||||
|
|
||||||
# Cristallina without calibration
|
# Cristallina without calibration
|
||||||
energy_offset = 26
|
energy_offset = 0
|
||||||
|
|
||||||
|
|
||||||
# move the PSSS motor according to the energy
|
# move the PSSS motor according to the energy
|
||||||
# TODO: improve this hack
|
# TODO: improve this hack
|
||||||
PSSS_MOVE = False
|
PSSS_MOVE = True
|
||||||
|
|
||||||
|
|
||||||
def set_PSSS_energy(energy: float):
|
def set_PSSS_energy(energy: float):
|
||||||
"""When scanning the energy with the undulator we
|
"""When scanning the energy with the undulator we
|
||||||
@ -32,7 +33,7 @@ def set_PSSS_energy(energy : float):
|
|||||||
"""
|
"""
|
||||||
energy = energy - energy_offset
|
energy = energy - energy_offset
|
||||||
print(f"Adjusting PSSS to {energy}")
|
print(f"Adjusting PSSS to {energy}")
|
||||||
PSSS_energy_PV_name = 'SARFE10-PSSS059:ENERGY'
|
PSSS_energy_PV_name = "SARFE10-PSSS059:ENERGY"
|
||||||
PSSS_energy_PV = PV(PSSS_energy_PV_name)
|
PSSS_energy_PV = PV(PSSS_energy_PV_name)
|
||||||
PSSS_energy_PV.put(energy, wait=True)
|
PSSS_energy_PV.put(energy, wait=True)
|
||||||
|
|
||||||
@ -45,40 +46,46 @@ def set_PSSS_energy(energy : float):
|
|||||||
else:
|
else:
|
||||||
print("Finished adjusting PSSS.")
|
print("Finished adjusting PSSS.")
|
||||||
|
|
||||||
|
|
||||||
class Undulators(Adjustable):
|
class Undulators(Adjustable):
|
||||||
"""
|
"""
|
||||||
for n_und_ref=None (default), the reference undulator currently used by the machine will be used
|
for n_und_ref=None (default), the reference undulator currently used by the machine will be used
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, n_unds=N_UNDS, n_und_ref=None, scaled=True, ID="ARAMIS_UNDULATORS", name="Aramis Undulators", units="eV"):
|
def __init__(
|
||||||
|
self, n_unds=N_UNDS, n_und_ref=None, scaled=True, ID="ARAMIS_UNDULATORS", name="Aramis Undulators", units="eV"
|
||||||
|
):
|
||||||
# # don't allow setting these since there's no chic :)
|
# # don't allow setting these since there's no chic :)
|
||||||
# chic_fudge_offset = 0
|
# chic_fudge_offset = 0
|
||||||
# adjust_chic = False
|
# adjust_chic = False
|
||||||
|
|
||||||
super().__init__(ID, name=name, units=units)
|
super().__init__(ID, name=name, units=units)
|
||||||
|
|
||||||
|
|
||||||
machine_n_und_ref = get_machine_n_und_ref()
|
machine_n_und_ref = get_machine_n_und_ref()
|
||||||
|
|
||||||
if n_und_ref is None:
|
if n_und_ref is None:
|
||||||
if machine_n_und_ref is None:
|
if machine_n_und_ref is None:
|
||||||
raise ValueError(f"could not read reference undulator currently used by the machine, please specify n_und_ref")
|
raise ValueError(
|
||||||
|
f"could not read reference undulator currently used by the machine, please specify n_und_ref"
|
||||||
|
)
|
||||||
n_und_ref = machine_n_und_ref
|
n_und_ref = machine_n_und_ref
|
||||||
|
|
||||||
if n_und_ref != machine_n_und_ref:
|
if n_und_ref != machine_n_und_ref:
|
||||||
log.warning(f"the chosen reference undulator ({n_und_ref}) is not the reference undulator currently used by the machine ({machine_n_und_ref})")
|
log.warning(
|
||||||
|
f"the chosen reference undulator ({n_und_ref}) is not the reference undulator currently used by the machine ({machine_n_und_ref})"
|
||||||
|
)
|
||||||
|
|
||||||
n_unds = list(n_unds)
|
n_unds = list(n_unds)
|
||||||
|
|
||||||
if N_UND_CHIC in n_unds:
|
if N_UND_CHIC in n_unds:
|
||||||
log.warning(f"the CHIC ({N_UND_CHIC}) is in the list of active undulators: {n_unds}, and will be ignored/removed")
|
log.warning(
|
||||||
|
f"the CHIC ({N_UND_CHIC}) is in the list of active undulators: {n_unds}, and will be ignored/removed"
|
||||||
|
)
|
||||||
n_unds.remove(N_UND_CHIC)
|
n_unds.remove(N_UND_CHIC)
|
||||||
|
|
||||||
if n_und_ref not in n_unds:
|
if n_und_ref not in n_unds:
|
||||||
raise ValueError(f"the reference undulator ({n_und_ref}) is not in the list of active undulators: {n_unds}")
|
raise ValueError(f"the reference undulator ({n_und_ref}) is not in the list of active undulators: {n_unds}")
|
||||||
|
|
||||||
|
|
||||||
self.n_unds = n_unds
|
self.n_unds = n_unds
|
||||||
self.n_und_ref = n_und_ref
|
self.n_und_ref = n_und_ref
|
||||||
|
|
||||||
@ -89,7 +96,6 @@ class Undulators(Adjustable):
|
|||||||
# self.chic = CHIC(chic_fudge_offset, name, units)
|
# self.chic = CHIC(chic_fudge_offset, name, units)
|
||||||
# self.phases = Phases(n_unds)
|
# self.phases = Phases(n_unds)
|
||||||
|
|
||||||
|
|
||||||
# self.adjust_chic = adjust_chic
|
# self.adjust_chic = adjust_chic
|
||||||
self.scaled = scaled
|
self.scaled = scaled
|
||||||
|
|
||||||
@ -98,8 +104,6 @@ class Undulators(Adjustable):
|
|||||||
a = self.adjs[und_name_cal]
|
a = self.adjs[und_name_cal]
|
||||||
self.scale = ScalerEK(a)
|
self.scale = ScalerEK(a)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def set_target_value(self, value, hold=False):
|
def set_target_value(self, value, hold=False):
|
||||||
value = value + energy_offset
|
value = value + energy_offset
|
||||||
k = self.convert.K(value)
|
k = self.convert.K(value)
|
||||||
@ -170,7 +174,6 @@ class Undulators(Adjustable):
|
|||||||
|
|
||||||
return self._as_task(change, hold=hold)
|
return self._as_task(change, hold=hold)
|
||||||
|
|
||||||
|
|
||||||
def get_current_value(self):
|
def get_current_value(self):
|
||||||
n = self.und_name_cal
|
n = self.und_name_cal
|
||||||
a = self.adjs[n]
|
a = self.adjs[n]
|
||||||
@ -187,19 +190,24 @@ class Undulators(Adjustable):
|
|||||||
|
|
||||||
return energy # if we need to fudge the number to match the mono, do it here!
|
return energy # if we need to fudge the number to match the mono, do it here!
|
||||||
|
|
||||||
|
|
||||||
def is_moving(self):
|
def is_moving(self):
|
||||||
return any(a.is_moving() for a in self.adjs)
|
return any(a.is_moving() for a in self.adjs)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Undulator(PVAdjustable):
|
class Undulator(PVAdjustable):
|
||||||
|
|
||||||
def __init__(self, name, accuracy=0.0005):
|
def __init__(self, name, accuracy=0.0005):
|
||||||
pvname_setvalue = name + ":K_SET"
|
pvname_setvalue = name + ":K_SET"
|
||||||
pvname_readback = pvname_setvalue # name + ":K_READ" #TODO: there are no readback values?
|
pvname_readback = pvname_setvalue # name + ":K_READ" #TODO: there are no readback values?
|
||||||
super().__init__(pvname_setvalue, pvname_readback=pvname_readback, accuracy=accuracy, active_move=True, name=name, internal=True)
|
super().__init__(
|
||||||
|
pvname_setvalue,
|
||||||
|
pvname_readback=pvname_readback,
|
||||||
|
accuracy=accuracy,
|
||||||
|
active_move=True,
|
||||||
|
name=name,
|
||||||
|
internal=True,
|
||||||
|
)
|
||||||
self.adj_energy = PVAdjustable(name + ":FELPHOTENE", internal=True)
|
self.adj_energy = PVAdjustable(name + ":FELPHOTENE", internal=True)
|
||||||
|
|
||||||
# self.adj_radial_on = PVAdjustable(name + ":RADIAL-ON", internal=True) #TODO: do not exist
|
# self.adj_radial_on = PVAdjustable(name + ":RADIAL-ON", internal=True) #TODO: do not exist
|
||||||
# self.adj_radial_go = PVAdjustable(name + ":RADIAL-GO", internal=True) #TODO: do not exist
|
# self.adj_radial_go = PVAdjustable(name + ":RADIAL-GO", internal=True) #TODO: do not exist
|
||||||
# self.adj_radial_on_proc = PVAdjustable(name + ":RADIAL-ON.PROC", internal=True)
|
# self.adj_radial_on_proc = PVAdjustable(name + ":RADIAL-ON.PROC", internal=True)
|
||||||
@ -210,9 +218,7 @@ class Undulator(PVAdjustable):
|
|||||||
return self.adj_energy.get_current_value() * 1000
|
return self.adj_energy.get_current_value() * 1000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ConverterEK:
|
class ConverterEK:
|
||||||
|
|
||||||
h = 4.135667696e-15 # eV * s
|
h = 4.135667696e-15 # eV * s
|
||||||
c = 299792458 # m / s
|
c = 299792458 # m / s
|
||||||
lambda_u = 15e-3 # m
|
lambda_u = 15e-3 # m
|
||||||
@ -220,7 +226,6 @@ class ConverterEK:
|
|||||||
|
|
||||||
electron_rest_energy = 0.51099895 # MeV
|
electron_rest_energy = 0.51099895 # MeV
|
||||||
|
|
||||||
|
|
||||||
# was: pvname_electron_energy="SATCL01-MBND100:P-READ"
|
# was: pvname_electron_energy="SATCL01-MBND100:P-READ"
|
||||||
# was: pvname_electron_energy="SATCB01:ENE-FILT-OP"
|
# was: pvname_electron_energy="SATCB01:ENE-FILT-OP"
|
||||||
def __init__(self, pvname_electron_energy="SARCL02-MBND100:P-READ"): # S30CB13:ENE-FILT-OP
|
def __init__(self, pvname_electron_energy="SARCL02-MBND100:P-READ"): # S30CB13:ENE-FILT-OP
|
||||||
@ -245,9 +250,7 @@ class ConverterEK:
|
|||||||
return gamma**2
|
return gamma**2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ScalerEK:
|
class ScalerEK:
|
||||||
|
|
||||||
def __init__(self, und_reference):
|
def __init__(self, und_reference):
|
||||||
self.und = und_reference
|
self.und = und_reference
|
||||||
|
|
||||||
@ -261,7 +264,6 @@ class ScalerEK:
|
|||||||
return np.sqrt(K_target_squared)
|
return np.sqrt(K_target_squared)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# class CHIC(PVAdjustable):
|
# class CHIC(PVAdjustable):
|
||||||
#
|
#
|
||||||
# def __init__(self, fudge_offset, name, units):
|
# def __init__(self, fudge_offset, name, units):
|
||||||
@ -294,9 +296,6 @@ class ScalerEK:
|
|||||||
# return super().get_current_value() * 1000
|
# return super().get_current_value() * 1000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# class TwoColorChicane(PVAdjustable):
|
# class TwoColorChicane(PVAdjustable):
|
||||||
#
|
#
|
||||||
# def __init__(self, name):#, t0=0):
|
# def __init__(self, name):#, t0=0):
|
||||||
@ -311,9 +310,6 @@ class ScalerEK:
|
|||||||
## return super().get_current_value()
|
## return super().get_current_value()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# class Phases:
|
# class Phases:
|
||||||
#
|
#
|
||||||
# def __init__(self, n_unds=N_UNDS):
|
# def __init__(self, n_unds=N_UNDS):
|
||||||
@ -357,9 +353,6 @@ class ScalerEK:
|
|||||||
## pv_fixed_energy.put(current_state) # reset to original state
|
## pv_fixed_energy.put(current_state) # reset to original state
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# class Phases:
|
# class Phases:
|
||||||
|
|
||||||
# def __init__(self, n_unds=N_UNDS):
|
# def __init__(self, n_unds=N_UNDS):
|
||||||
@ -394,9 +387,6 @@ class ScalerEK:
|
|||||||
# ])
|
# ])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_machine_n_und_ref():
|
def get_machine_n_und_ref():
|
||||||
res = PVEnumAdjustable("SARUN:REF-UND").get()
|
res = PVEnumAdjustable("SARUN:REF-UND").get()
|
||||||
if not res.startswith("SARUN"):
|
if not res.startswith("SARUN"):
|
||||||
@ -408,8 +398,3 @@ def get_machine_n_und_ref():
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
return None
|
return None
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -7,13 +7,13 @@
|
|||||||
|
|
||||||
# TODO: JF settings regarding raw conversion, compression, etc.
|
# TODO: JF settings regarding raw conversion, compression, etc.
|
||||||
detectors = [
|
detectors = [
|
||||||
# "JF16T03V01",
|
"JF16T03V01",
|
||||||
]
|
]
|
||||||
|
|
||||||
camera_channels = [
|
camera_channels = [
|
||||||
# "SARES30-CAMS156-PCO1:FPICTURE", # PCO edge camera for the wavefront analysis (from Alvra)
|
# "SARES30-CAMS156-PCO1:FPICTURE", # PCO edge camera for the wavefront analysis (from Alvra)
|
||||||
# "SARES30-CAMS156-SMX-OAV:FPICTURE", # SwissMX OAV camera picture
|
# "SARES30-CAMS156-SMX-OAV:FPICTURE", # SwissMX OAV camera picture
|
||||||
"SARES30-CAMS156-XE:FPICTURE", # X-ray eye
|
# "SARES30-CAMS156-XE:FPICTURE", # X-ray eye
|
||||||
]
|
]
|
||||||
|
|
||||||
####################
|
####################
|
||||||
@ -96,7 +96,7 @@ channels_RF = [
|
|||||||
"S30CB14-RLLE-DSP:AMPLT-VS",
|
"S30CB14-RLLE-DSP:AMPLT-VS",
|
||||||
]
|
]
|
||||||
|
|
||||||
channels_Xeye = ['SARES30-CAMS156-XE:intensity']
|
channels_Xeye = ["SARES30-CAMS156-XE:intensity"]
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# PBPS053
|
# PBPS053
|
||||||
@ -120,18 +120,20 @@ channels_PSSS059=[
|
|||||||
"SARFE10-PSSS059:SPECTRUM_X",
|
"SARFE10-PSSS059:SPECTRUM_X",
|
||||||
"SARFE10-PSSS059:SPECTRUM_Y",
|
"SARFE10-PSSS059:SPECTRUM_Y",
|
||||||
# "SARFE10-PSSS059:FPICTURE",
|
# "SARFE10-PSSS059:FPICTURE",
|
||||||
"SARFE10-PSSS059:FIT_ERR",
|
|
||||||
"SARFE10-PSSS059:processing_parameters",
|
"SARFE10-PSSS059:processing_parameters",
|
||||||
"SARFE10-PSSS059:SPECTRUM_AVG_CENTER",
|
|
||||||
"SARFE10-PSSS059:SPECTRUM_AVG_FWHM",
|
|
||||||
"SARFE10-PSSS059:SPECTRUM_AVG_Y",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
## Bernina channels
|
## Bernina channels
|
||||||
# Beam position monitor PBPS113
|
# Beam position monitor PBPS113
|
||||||
channels_Bernina = [
|
channels_Bernina = [
|
||||||
#"SAROP21-PBPS103:INTENSITY",
|
"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",
|
||||||
]
|
]
|
||||||
###################################
|
###################################
|
||||||
# Beam position monitor PBPS113
|
# Beam position monitor PBPS113
|
||||||
@ -142,7 +144,6 @@ channels_PBPS113 = [
|
|||||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD1",
|
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD1",
|
||||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD2",
|
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD2",
|
||||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD3",
|
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD3",
|
||||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD4",
|
|
||||||
"SAROP31-PBPS113:XPOS",
|
"SAROP31-PBPS113:XPOS",
|
||||||
"SAROP31-PBPS113:YPOS",
|
"SAROP31-PBPS113:YPOS",
|
||||||
]
|
]
|
||||||
@ -190,6 +191,11 @@ channels_PPRM113 = [
|
|||||||
|
|
||||||
###########################
|
###########################
|
||||||
# Beam position monitor PBPS149
|
# Beam position monitor PBPS149
|
||||||
|
# "SARES30-CAMS156-PCO1:FPICTURE", # PCO edge camera for the wavefront analysis (from Alvra)
|
||||||
|
# "SARES30-CAMS156-SMX-OAV:FPIC
|
||||||
|
|
||||||
|
###########################
|
||||||
|
# Beam position monitor
|
||||||
channels_PBPS149 = [
|
channels_PBPS149 = [
|
||||||
"SAROP31-PBPS149:INTENSITY",
|
"SAROP31-PBPS149:INTENSITY",
|
||||||
"SAROP31-PBPS149:INTENSITY_UJ",
|
"SAROP31-PBPS149:INTENSITY_UJ",
|
||||||
@ -197,28 +203,9 @@ channels_PBPS149 = [
|
|||||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD1",
|
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD1",
|
||||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD2",
|
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD2",
|
||||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD3",
|
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD3",
|
||||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD4",
|
|
||||||
"SAROP31-PBPS149:XPOS",
|
"SAROP31-PBPS149:XPOS",
|
||||||
"SAROP31-PBPS149:YPOS",
|
"SAROP31-PBPS149:YPOS",
|
||||||
]
|
]
|
||||||
channels_PBPS149_waveforms = [
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch0-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch1-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch2-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch3-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch4-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch5-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch6-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch7-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch8-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch9-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch10-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch11-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch12-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch13-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch14-WF-DATA",
|
|
||||||
"SAROP31-PBPS149:Lnk9Ch15-WF-DATA",
|
|
||||||
]
|
|
||||||
|
|
||||||
#######################
|
#######################
|
||||||
# Profile monitor PPRM150 (from _proc process)
|
# Profile monitor PPRM150 (from _proc process)
|
||||||
@ -246,7 +233,7 @@ channels_PPRM150 = [
|
|||||||
#######################
|
#######################
|
||||||
# Cristallina event reciever
|
# Cristallina event reciever
|
||||||
channels_EVR = [
|
channels_EVR = [
|
||||||
'SAR-CVME-TIFALL6:EvtSet',
|
"SAR-CVME-TIFALL6:EvtSet",
|
||||||
]
|
]
|
||||||
|
|
||||||
#######################
|
#######################
|
||||||
@ -264,25 +251,38 @@ channels_digitizer =[
|
|||||||
|
|
||||||
#######################
|
#######################
|
||||||
# Other BS channels that we sometimes use
|
# Other BS channels that we sometimes use
|
||||||
channels_other = [
|
channels_other = []
|
||||||
]
|
|
||||||
|
|
||||||
bs_channels = (
|
bs_channels = (
|
||||||
camera_channels
|
camera_channels
|
||||||
+ channels_gas_monitor
|
+ channels_gas_monitor
|
||||||
+ channels_RF
|
# + channels_RF
|
||||||
+ channels_Xeye
|
# + channels_Xeye
|
||||||
+ channels_PBPS053
|
+ channels_PBPS053
|
||||||
+ channels_PSSS059
|
+ channels_PSSS059
|
||||||
#+ channels_Bernina
|
|
||||||
+ channels_PBPS113
|
+ channels_PBPS113
|
||||||
# + channels_PBPS113_waveforms
|
# + channels_PBPS113_waveforms
|
||||||
+ channels_PPRM113
|
# + channels_PPRM113
|
||||||
+ channels_PBPS149
|
+ channels_PBPS149
|
||||||
# + channels_PBPS149_waveforms
|
# + channels_PBPS149_waveforms
|
||||||
+ channels_PPRM150
|
# + channels_PPRM150
|
||||||
+ channels_EVR
|
+ channels_EVR
|
||||||
# + channels_digitizer
|
# + channels_digitizer
|
||||||
# + channels_other
|
# + channels_other
|
||||||
)
|
)
|
||||||
|
|
||||||
|
bs_channels_OAPU107_scan = (
|
||||||
|
channels_gas_monitor
|
||||||
|
+ channels_PBPS053
|
||||||
|
+ channels_PSSS059
|
||||||
|
+ channels_PBPS113
|
||||||
|
+ channels_PPRM113
|
||||||
|
)
|
||||||
|
|
||||||
|
bs_channels_pbps_snapshot = (
|
||||||
|
channels_gas_monitor
|
||||||
|
+ channels_PBPS053
|
||||||
|
+ channels_PSSS059
|
||||||
|
+ channels_PBPS113
|
||||||
|
+ channels_PBPS149
|
||||||
|
)
|
259
channels/channels_copy.py
Normal file
259
channels/channels_copy.py
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
# Channels at Cristallina endstation
|
||||||
|
|
||||||
|
|
||||||
|
##########################################################################################################
|
||||||
|
# BS channels
|
||||||
|
|
||||||
|
# TODO: JF settings regarding raw conversion, compression, etc.
|
||||||
|
detectors = [
|
||||||
|
# "JF16T03V01",
|
||||||
|
]
|
||||||
|
|
||||||
|
####################
|
||||||
|
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",
|
||||||
|
]
|
||||||
|
|
||||||
|
######################
|
||||||
|
### PCO edge camera for the wavefront analysis
|
||||||
|
channels_PCO = [
|
||||||
|
"SARES30-CAMS156-PCO1:FPICTURE",
|
||||||
|
]
|
||||||
|
|
||||||
|
######################
|
||||||
|
### SwissMX OAV camera picture
|
||||||
|
channels_OAV = [] # "SARES30-CAMS156-SMX-OAV:FPICTURE",
|
||||||
|
|
||||||
|
######################
|
||||||
|
### PBPS053
|
||||||
|
channels_PBPS053 = [
|
||||||
|
"SARFE10-PBPS053:INTENSITY",
|
||||||
|
"SARFE10-PBPS053:XPOS",
|
||||||
|
"SARFE10-PBPS053:YPOS",
|
||||||
|
]
|
||||||
|
|
||||||
|
###################################
|
||||||
|
### 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",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
####################
|
||||||
|
## PSS059
|
||||||
|
channels_pss059 = [
|
||||||
|
# "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
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# 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
|
||||||
|
]
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# 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
|
||||||
|
]
|
||||||
|
|
||||||
|
###########################
|
||||||
|
# Beam position monitor
|
||||||
|
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",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
further_channels = [
|
||||||
|
####################
|
||||||
|
## Digitizer
|
||||||
|
# Integration limits
|
||||||
|
"SARES30-LTIM01-EVR0:DUMMY_PV1_NBS",
|
||||||
|
"SARES30-LTIM01-EVR0:DUMMY_PV2_NBS",
|
||||||
|
"SARES30-LTIM01-EVR0:DUMMY_PV3_NBS",
|
||||||
|
"SARES30-LTIM01-EVR0:DUMMY_PV4_NBS",
|
||||||
|
# Signal-Background
|
||||||
|
"SARES30-LSCP1-FNS:CH0:VAL_GET",
|
||||||
|
# Waveform signal
|
||||||
|
"SARES30-LSCP1-CRISTA1:CH0:1",
|
||||||
|
# Waveform trigger
|
||||||
|
"SARES30-LSCP1-CRISTA1:CH2:1",
|
||||||
|
# Calculated intensity
|
||||||
|
"SARES30-LTIM01-EVR0:CALCI",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
channels = (
|
||||||
|
channels_gas_monitor
|
||||||
|
+ channels_PCO
|
||||||
|
+ channels_OAV
|
||||||
|
+ channels_PBPS053
|
||||||
|
+ channels_pss059
|
||||||
|
+ channels_PPRM113
|
||||||
|
+ channels_PPRM150
|
||||||
|
+ channel_PBPS149
|
||||||
|
+ channel_PBPS149
|
||||||
|
+ further_channels
|
||||||
|
)
|
||||||
|
|
||||||
|
##########################################################################################################
|
||||||
|
|
||||||
|
pv_channels = [
|
||||||
|
####################
|
||||||
|
## OAPU044
|
||||||
|
"SARFE10-OAPU044:MOTOR_X",
|
||||||
|
"SARFE10-OAPU044:MOTOR_Y",
|
||||||
|
"SARFE10-OAPU044:MOTOR_W",
|
||||||
|
"SARFE10-OAPU044:MOTOR_H",
|
||||||
|
####################
|
||||||
|
## 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",
|
||||||
|
####################
|
||||||
|
## OATA150
|
||||||
|
"SAROP31-OATA150:MOTOR_1",
|
||||||
|
"SAROP31-OATA150:MOTOR_2",
|
||||||
|
"SAROP31-OATA150:MOTOR_3",
|
||||||
|
"SAROP31-OATA150:MOTOR_4",
|
||||||
|
"SAROP31-OATA150:MOTOR_5",
|
||||||
|
"SAROP31-OATA150:MOTOR_6",
|
||||||
|
####################
|
||||||
|
## PSSS
|
||||||
|
"SARFE10-PSSS059:MOTOR_Y3.VAL",
|
||||||
|
"SARFE10-PSSS059:MOTOR_ROT_X3.VAL",
|
||||||
|
"SARFE10-PSSS059:MOTOR_X5.VAL",
|
||||||
|
"SARFE10-PSSS059:MOTOR_X3.VAL",
|
||||||
|
###########################
|
||||||
|
# KB mirrors
|
||||||
|
"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",
|
||||||
|
"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",
|
||||||
|
####################
|
||||||
|
## FEL Photon Energy
|
||||||
|
"SARUN:FELPHOTENE",
|
||||||
|
###################
|
||||||
|
## FEL Photon Pulse Energy
|
||||||
|
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG",
|
||||||
|
]
|
||||||
|
|
||||||
|
pvs_slits = [
|
||||||
|
# TODO: PVS slits can't be read by the DAQ module currently. Therefore disabled it.
|
||||||
|
# "SARFE10-OAPU044:MOTOR_X.VAL",
|
||||||
|
# "SARFE10-OAPU044:MOTOR_X.RBV"
|
||||||
|
]
|
||||||
|
|
||||||
|
pvs_apertures = [
|
||||||
|
"SAROP31-OAPU149:MOTOR_X.VAL", # the x pos of the aperture
|
||||||
|
"SAROP31-OAPU149:MOTOR_X.RBV", # the x pos of the aperture
|
||||||
|
]
|
||||||
|
|
||||||
|
###############################
|
||||||
|
smaract_channels = [
|
||||||
|
"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_slits + pv_channels + smaract_channels
|
@ -10,7 +10,6 @@ detectors_min = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
channels_min = ["SARFE10-PSSS059:SPECTRUM_Y"]
|
channels_min = ["SARFE10-PSSS059:SPECTRUM_Y"]
|
||||||
|
|
||||||
pvs_min = ['SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG']#pvs_slits + pv_channels + smaract_channels
|
pvs_min = ["SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG"] # pvs_slits + pv_channels + smaract_channels
|
@ -9,7 +9,7 @@
|
|||||||
pvs_machine = [
|
pvs_machine = [
|
||||||
"SARCL02-MBND100:P-READ", # Predicted bunch energy
|
"SARCL02-MBND100:P-READ", # Predicted bunch energy
|
||||||
"SARUN:FELPHOTENE.VAL", # Predicted photon energy from machine settings
|
"SARUN:FELPHOTENE.VAL", # Predicted photon energy from machine settings
|
||||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG.VAL" # Average pulse energy from the gas detector
|
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG.VAL", # Average pulse energy from the gas detector
|
||||||
]
|
]
|
||||||
pvs_RF = [
|
pvs_RF = [
|
||||||
"SINSB01-RSYS:GET-VSUM-PHASE-OFFSET",
|
"SINSB01-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
@ -123,6 +123,25 @@ pvs_PBPS053 = [
|
|||||||
"SARFE10-PBPS053:MOTOR_PROBE",
|
"SARFE10-PBPS053:MOTOR_PROBE",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
###################
|
||||||
|
# Spectrometer PSSS059
|
||||||
|
pvs_PSSS059 = [
|
||||||
|
"SARFE10-PSSS055:MOTOR_X1.RBV",
|
||||||
|
"SARFE10-PSSS055:MOTOR_Y1.RBV",
|
||||||
|
"SARFE10-PSSS055:MOTOR_ROT_X1.RBV",
|
||||||
|
"SARFE10-PSSS055:MOTOR_PROBE.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_X3.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_Y3.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_ROT_X3.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_Y4.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_ROT_X4.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_X5.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_Y5.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_Z5.RBV",
|
||||||
|
"SARFE10-PSSS055:GRATING_SP",
|
||||||
|
"SARFE10-PSSS059:CRYSTAL_SP",
|
||||||
|
]
|
||||||
|
|
||||||
####################
|
####################
|
||||||
# Upstream attenuator OATT053
|
# Upstream attenuator OATT053
|
||||||
pvs_OATT053 = [
|
pvs_OATT053 = [
|
||||||
@ -149,23 +168,20 @@ pvs_PPRM053 = [
|
|||||||
"SARFE10-PPRM053:MOTOR_PROBE.RBV",
|
"SARFE10-PPRM053:MOTOR_PROBE.RBV",
|
||||||
]
|
]
|
||||||
|
|
||||||
####################
|
###################
|
||||||
# Single shot spectrometer PSS059
|
# Bernina mono
|
||||||
pvs_PSSS059 = [
|
pvs_Bernina = [
|
||||||
# "SARFE10-PSSS059:FPICTURE", # full pictures only when really needed
|
"SAROP21-ARAMIS:ENERGY_SP",
|
||||||
"SARFE10-PSSS059:SPECTRUM_X",
|
"SAROP21-ARAMIS:ENERGY",
|
||||||
"SARFE10-PSSS059:SPECTRUM_Y",
|
"SAROP21-PBPS103:MOTOR_X1.DRBV",
|
||||||
"SARFE10-PSSS059:SPECTRUM_CENTER",
|
"SAROP21-PBPS103:MOTOR_Y1.DRBV",
|
||||||
"SARFE10-PSSS059:SPECTRUM_COM",
|
"SAROP21-PBPS103:MOTOR_X1.RBV",
|
||||||
"SARFE10-PSSS059:SPECTRUM_FWHM",
|
"SAROP21-PBPS103:MOTOR_Y1.RBV",
|
||||||
"SARFE10-PSSS059:SPECTRUM_STD",
|
"SAROP21-PBPS103:MOTOR_PROBE.RBV",
|
||||||
"SARFE10-PSSS059:FIT_ERR",
|
"SAROP21-PPRM113:MOTOR_PROBE.RBV"
|
||||||
"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
|
# First Cristallina horizontal offset mirror OOMH067
|
||||||
pvs_OOMH067 = [
|
pvs_OOMH067 = [
|
||||||
@ -224,6 +240,8 @@ pvs_OAPU107 = [
|
|||||||
###################
|
###################
|
||||||
## Beam position and intensity monitor PBPS113
|
## Beam position and intensity monitor PBPS113
|
||||||
pvs_PBPS113 = [
|
pvs_PBPS113 = [
|
||||||
|
"SAROP31-PBPS113:MOTOR_X1.DRBV",
|
||||||
|
"SAROP31-PBPS113:MOTOR_Y1.DRBV",
|
||||||
"SAROP31-PBPS113:MOTOR_X1.RBV",
|
"SAROP31-PBPS113:MOTOR_X1.RBV",
|
||||||
"SAROP31-PBPS113:MOTOR_Y1.RBV",
|
"SAROP31-PBPS113:MOTOR_Y1.RBV",
|
||||||
"SAROP31-PBPS113:MOTOR_PROBE.RBV",
|
"SAROP31-PBPS113:MOTOR_PROBE.RBV",
|
||||||
@ -253,6 +271,8 @@ pvs_OAPU149 = [
|
|||||||
###################
|
###################
|
||||||
# Beam position and intensity monitor PBPS149
|
# Beam position and intensity monitor PBPS149
|
||||||
pvs_PBPS149 = [
|
pvs_PBPS149 = [
|
||||||
|
"SAROP31-PBPS149:MOTOR_X1.DRBV",
|
||||||
|
"SAROP31-PBPS149:MOTOR_Y1.DRBV",
|
||||||
"SAROP31-PBPS149:MOTOR_X1.RBV",
|
"SAROP31-PBPS149:MOTOR_X1.RBV",
|
||||||
"SAROP31-PBPS149:MOTOR_Y1.RBV",
|
"SAROP31-PBPS149:MOTOR_Y1.RBV",
|
||||||
"SAROP31-PBPS149:MOTOR_PROBE.RBV",
|
"SAROP31-PBPS149:MOTOR_PROBE.RBV",
|
||||||
@ -402,14 +422,14 @@ pvs_smaract_juraj = [
|
|||||||
|
|
||||||
pvs = (
|
pvs = (
|
||||||
pvs_machine
|
pvs_machine
|
||||||
+ pvs_RF
|
# + pvs_RF
|
||||||
+ pvs_undulator
|
# + pvs_undulator
|
||||||
+ pvs_gas_monitor
|
+ pvs_gas_monitor
|
||||||
+ pvs_OAPU044
|
+ pvs_OAPU044
|
||||||
+ pvs_PBPS053
|
+ pvs_PBPS053
|
||||||
|
+ pvs_PSSS059
|
||||||
+ pvs_OATT053
|
+ pvs_OATT053
|
||||||
+ pvs_PPRM053
|
+ pvs_PPRM053
|
||||||
+ pvs_PSSS059
|
|
||||||
+ pvs_OOMH067
|
+ pvs_OOMH067
|
||||||
+ pvs_PSCR068
|
+ pvs_PSCR068
|
||||||
+ pvs_OOMH084
|
+ pvs_OOMH084
|
||||||
@ -424,12 +444,12 @@ pvs = (
|
|||||||
+ pvs_OATA150
|
+ pvs_OATA150
|
||||||
+ pvs_OPPI151
|
+ pvs_OPPI151
|
||||||
+ pvs_ODMV152
|
+ pvs_ODMV152
|
||||||
+ pvs_PPRM150
|
|
||||||
+ pvs_OKBV153
|
+ pvs_OKBV153
|
||||||
+ pvs_PSCD153
|
+ pvs_PSCD153
|
||||||
+ pvs_OKBH154
|
+ pvs_OKBH154
|
||||||
+ pvs_standa
|
# + pvs_standa
|
||||||
+ pvs_smaract_xyz
|
# + pvs_smaract_xyz
|
||||||
|
# + pvs_Bernina
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
260
channels_copy.py
260
channels_copy.py
@ -1,260 +0,0 @@
|
|||||||
# Channels at Cristallina endstation
|
|
||||||
|
|
||||||
|
|
||||||
##########################################################################################################
|
|
||||||
# BS channels
|
|
||||||
|
|
||||||
# TODO: JF settings regarding raw conversion, compression, etc.
|
|
||||||
detectors = [
|
|
||||||
# "JF16T03V01",
|
|
||||||
]
|
|
||||||
|
|
||||||
####################
|
|
||||||
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",
|
|
||||||
]
|
|
||||||
|
|
||||||
######################
|
|
||||||
### PCO edge camera for the wavefront analysis
|
|
||||||
channels_PCO=["SARES30-CAMS156-PCO1:FPICTURE",
|
|
||||||
]
|
|
||||||
|
|
||||||
######################
|
|
||||||
### SwissMX OAV camera picture
|
|
||||||
channels_OAV=[#"SARES30-CAMS156-SMX-OAV:FPICTURE",
|
|
||||||
]
|
|
||||||
|
|
||||||
######################
|
|
||||||
### PBPS053
|
|
||||||
channels_PBPS053 = [
|
|
||||||
"SARFE10-PBPS053:INTENSITY",
|
|
||||||
"SARFE10-PBPS053:XPOS",
|
|
||||||
"SARFE10-PBPS053:YPOS",
|
|
||||||
]
|
|
||||||
|
|
||||||
###################################
|
|
||||||
### 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",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
####################
|
|
||||||
## PSS059
|
|
||||||
channels_pss059 = [
|
|
||||||
#"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
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
#######################
|
|
||||||
# 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
|
|
||||||
]
|
|
||||||
|
|
||||||
#######################
|
|
||||||
# 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
|
|
||||||
]
|
|
||||||
|
|
||||||
###########################
|
|
||||||
# Beam position monitor
|
|
||||||
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",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
further_channels = [
|
|
||||||
####################
|
|
||||||
## Digitizer
|
|
||||||
|
|
||||||
#Integration limits
|
|
||||||
"SARES30-LTIM01-EVR0:DUMMY_PV1_NBS",
|
|
||||||
"SARES30-LTIM01-EVR0:DUMMY_PV2_NBS",
|
|
||||||
"SARES30-LTIM01-EVR0:DUMMY_PV3_NBS",
|
|
||||||
"SARES30-LTIM01-EVR0:DUMMY_PV4_NBS",
|
|
||||||
|
|
||||||
# Signal-Background
|
|
||||||
"SARES30-LSCP1-FNS:CH0:VAL_GET",
|
|
||||||
|
|
||||||
#Waveform signal
|
|
||||||
"SARES30-LSCP1-CRISTA1:CH0:1",
|
|
||||||
|
|
||||||
#Waveform trigger
|
|
||||||
"SARES30-LSCP1-CRISTA1:CH2:1",
|
|
||||||
|
|
||||||
#Calculated intensity
|
|
||||||
"SARES30-LTIM01-EVR0:CALCI",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
channels = channels_gas_monitor + channels_PCO + channels_OAV + channels_PBPS053 + channels_pss059 + channels_PPRM113 + channels_PPRM150 + channel_PBPS149 + channel_PBPS149 + further_channels
|
|
||||||
|
|
||||||
##########################################################################################################
|
|
||||||
|
|
||||||
pv_channels = [
|
|
||||||
####################
|
|
||||||
## OAPU044
|
|
||||||
"SARFE10-OAPU044:MOTOR_X",
|
|
||||||
"SARFE10-OAPU044:MOTOR_Y",
|
|
||||||
"SARFE10-OAPU044:MOTOR_W",
|
|
||||||
"SARFE10-OAPU044:MOTOR_H",
|
|
||||||
|
|
||||||
####################
|
|
||||||
## 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",
|
|
||||||
|
|
||||||
####################
|
|
||||||
## OATA150
|
|
||||||
"SAROP31-OATA150:MOTOR_1",
|
|
||||||
"SAROP31-OATA150:MOTOR_2",
|
|
||||||
"SAROP31-OATA150:MOTOR_3",
|
|
||||||
"SAROP31-OATA150:MOTOR_4",
|
|
||||||
"SAROP31-OATA150:MOTOR_5",
|
|
||||||
"SAROP31-OATA150:MOTOR_6",
|
|
||||||
|
|
||||||
####################
|
|
||||||
## PSSS
|
|
||||||
'SARFE10-PSSS059:MOTOR_Y3.VAL',
|
|
||||||
'SARFE10-PSSS059:MOTOR_ROT_X3.VAL',
|
|
||||||
'SARFE10-PSSS059:MOTOR_X5.VAL',
|
|
||||||
'SARFE10-PSSS059:MOTOR_X3.VAL',
|
|
||||||
|
|
||||||
###########################
|
|
||||||
# KB mirrors
|
|
||||||
"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",
|
|
||||||
"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",
|
|
||||||
|
|
||||||
####################
|
|
||||||
## FEL Photon Energy
|
|
||||||
'SARUN:FELPHOTENE',
|
|
||||||
|
|
||||||
###################
|
|
||||||
## FEL Photon Pulse Energy
|
|
||||||
'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG',
|
|
||||||
]
|
|
||||||
|
|
||||||
pvs_slits = [
|
|
||||||
# TODO: PVS slits can't be read by the DAQ module currently. Therefore disabled it.
|
|
||||||
# "SARFE10-OAPU044:MOTOR_X.VAL",
|
|
||||||
# "SARFE10-OAPU044:MOTOR_X.RBV"
|
|
||||||
]
|
|
||||||
|
|
||||||
pvs_apertures = [
|
|
||||||
"SAROP31-OAPU149:MOTOR_X.VAL", # the x pos of the aperture
|
|
||||||
"SAROP31-OAPU149:MOTOR_X.RBV", # the x pos of the aperture
|
|
||||||
]
|
|
||||||
|
|
||||||
###############################
|
|
||||||
smaract_channels = [
|
|
||||||
"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_slits + pv_channels + smaract_channels
|
|
42
client.py
42
client.py
@ -1,42 +0,0 @@
|
|||||||
import requests
|
|
||||||
import json
|
|
||||||
|
|
||||||
|
|
||||||
class Client:
|
|
||||||
|
|
||||||
def __init__(self, host="saresc-vcons-02", port=9090):
|
|
||||||
self.host = host
|
|
||||||
self.port = port
|
|
||||||
self.session = requests.Session()
|
|
||||||
|
|
||||||
def add_row(self, **kwargs):
|
|
||||||
addr = self._make_addr()
|
|
||||||
resp = self.session.patch(addr, json=kwargs)
|
|
||||||
return ResponseWrapper(resp)
|
|
||||||
|
|
||||||
def get(self):
|
|
||||||
addr = self._make_addr()
|
|
||||||
resp = self.session.get(addr)
|
|
||||||
return ResponseWrapper(resp)
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
addr = self._make_addr()
|
|
||||||
resp = self.session.delete(addr)
|
|
||||||
return ResponseWrapper(resp)
|
|
||||||
|
|
||||||
def _make_addr(self):
|
|
||||||
return f"http://{self.host}:{self.port}/"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ResponseWrapper:
|
|
||||||
|
|
||||||
def __init__(self, resp):
|
|
||||||
resp.raise_for_status()
|
|
||||||
self.resp = resp
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return self.resp.text
|
|
||||||
|
|
||||||
|
|
||||||
|
|
183
cristallina.py
183
cristallina.py
@ -1,36 +1,42 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
os.chdir('/sf/cristallina/applications/slic/cristallina')
|
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import time
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
from tracemalloc import start
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
os.chdir("/sf/cristallina/applications/slic/cristallina_cleanup")
|
||||||
|
|
||||||
# setup logging
|
# setup logging
|
||||||
import logging
|
from loguru import logger
|
||||||
logger = logging.getLogger("slic")
|
|
||||||
logger.setLevel(logging.INFO)
|
logger.remove()
|
||||||
|
logger.add(
|
||||||
|
sys.stderr,
|
||||||
|
format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}",
|
||||||
|
level="INFO",
|
||||||
|
)
|
||||||
logger.info("Loading started.")
|
logger.info("Loading started.")
|
||||||
|
|
||||||
# create file handler which logs
|
# create file handler which logs
|
||||||
|
# TODO: better directory for log files? should not be pgroup specific so that this always works
|
||||||
try:
|
try:
|
||||||
fh = logging.FileHandler('/sf/cristallina/applications/slic/cristallina/log/cristallina.log')
|
logger.add(
|
||||||
fh.setLevel(logging.DEBUG)
|
"/sf/cristallina/applications/slic/cristallina/log/cristallina.log",
|
||||||
logger.addHandler(fh)
|
format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}",
|
||||||
|
level="DEBUG",
|
||||||
|
)
|
||||||
except PermissionError as e:
|
except PermissionError as e:
|
||||||
logger.warning("Cannot write log file.")
|
logger.warning("Cannot write log file.")
|
||||||
logger.warning(e)
|
logger.warning(e)
|
||||||
|
|
||||||
|
|
||||||
from time import sleep
|
|
||||||
from tracemalloc import start
|
|
||||||
|
|
||||||
from epics import PV
|
from epics import PV
|
||||||
|
|
||||||
from stand_client import Client
|
from devices.alignment_laser import AlignmentLaser
|
||||||
|
|
||||||
stand_client = Client(host='saresc-vcons-02.psi.ch', port=9090)
|
|
||||||
|
|
||||||
|
|
||||||
from alignment_laser import AlignmentLaser
|
|
||||||
from slic.gui import GUI
|
from slic.gui import GUI
|
||||||
from slic.core.adjustable import Adjustable, PVAdjustable, DummyAdjustable
|
from slic.core.adjustable import Adjustable, PVAdjustable, DummyAdjustable
|
||||||
from slic.core.acquisition import SFAcquisition, PVAcquisition
|
from slic.core.acquisition import SFAcquisition, PVAcquisition
|
||||||
@ -43,26 +49,55 @@ from slic.devices.xoptics.pulsepicker import PulsePicker
|
|||||||
from slic.utils import devices, Marker, as_shortcut
|
from slic.utils import devices, Marker, as_shortcut
|
||||||
from slic.utils import Channels, Config, Elog, Screenshot, PV
|
from slic.utils import Channels, Config, Elog, Screenshot, PV
|
||||||
from slic.core.acquisition.fakeacquisition import FakeAcquisition
|
from slic.core.acquisition.fakeacquisition import FakeAcquisition
|
||||||
|
|
||||||
from slic.devices.timing.events import CTASequencer
|
from slic.devices.timing.events import CTASequencer
|
||||||
|
|
||||||
from bs_channels import detectors, bs_channels, camera_channels
|
from channels.bs_channels import detectors, bs_channels, camera_channels
|
||||||
from pv_channels import pvs
|
from channels.pv_channels import pvs
|
||||||
from spreadsheet import overview
|
from spreadsheet import overview
|
||||||
from channels_minimal import detectors_min, channels_min, pvs_min
|
# from channels_minimal import detectors_min, channels_min, pvs_min
|
||||||
from pp_shutter import PP_Shutter
|
from devices.pp_shutter import PP_Shutter
|
||||||
|
|
||||||
|
|
||||||
# DEVICES
|
# 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
|
||||||
|
|
||||||
|
try:
|
||||||
|
from stand_client import Client
|
||||||
|
|
||||||
|
stand_host = "saresc-vcons-02.psi.ch"
|
||||||
|
stand_client = Client(host=stand_host, port=9090)
|
||||||
|
response = stand_client.get()
|
||||||
|
logger.info("Connected to stand server")
|
||||||
|
except Exception as error:
|
||||||
|
# catching with a broad net because different connection errors can occur.
|
||||||
|
logger.warning(f"Cannot connect to stand server on {stand_host}. Caught {error}.")
|
||||||
|
|
||||||
|
# spreadsheet = Spreadsheet(adjs, placeholders=PLACEHOLDERS, host="127.0.0.1", port=8080))
|
||||||
|
|
||||||
|
################# DEVICES #################
|
||||||
dummy = DummyAdjustable(units="au")
|
dummy = DummyAdjustable(units="au")
|
||||||
|
|
||||||
# Attenuators
|
# Attenuators
|
||||||
from slic.devices.xoptics.aramis_attenuator import Attenuator
|
from slic.devices.xoptics.aramis_attenuator import Attenuator
|
||||||
from knife_edge import KnifeEdge
|
from devices.knife_edge import KnifeEdge
|
||||||
from standa import standa
|
from devices.standa import standa
|
||||||
|
|
||||||
standa = standa
|
|
||||||
Newport_large = Motor("SARES30-MOBI1:MOT_5")
|
Newport_large = Motor("SARES30-MOBI1:MOT_5")
|
||||||
|
OWIS = Motor("SARES30-MOBI1:MOT_6") # small OWIS linear stage
|
||||||
|
|
||||||
attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150")
|
attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150")
|
||||||
|
|
||||||
|
def test_attenuator():
|
||||||
|
tfundamental = attenuator.get_transmission()
|
||||||
|
try:
|
||||||
|
assert tfundamental > 0
|
||||||
|
except TypeError:
|
||||||
|
logger.warning("No transmission value reported from {attenuator.ID}")
|
||||||
|
|
||||||
|
|
||||||
|
test_attenuator()
|
||||||
|
|
||||||
front_end_attenuator = Attenuator("SARFE10-OATT053", description="Front end attenuator OATT053")
|
front_end_attenuator = Attenuator("SARFE10-OATT053", description="Front end attenuator OATT053")
|
||||||
cta = CTASequencer("SAR-CCTA-ESC")
|
cta = CTASequencer("SAR-CCTA-ESC")
|
||||||
|
|
||||||
@ -77,26 +112,26 @@ pbps149 = IntensityMonitorPBPS(
|
|||||||
"SAROP31-PBPS149",
|
"SAROP31-PBPS149",
|
||||||
# vme_crate="SAROP31-CVME-PBPS2", # please check this!
|
# vme_crate="SAROP31-CVME-PBPS2", # please check this!
|
||||||
# link=9,
|
# link=9,
|
||||||
description="Intensity/position monitor in the experimental hutch"
|
description="Intensity/position monitor in the experimental hutch",
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_attenuator():
|
|
||||||
tfundamental = attenuator.get_transmission()
|
|
||||||
try:
|
|
||||||
assert tfundamental > 0
|
|
||||||
except TypeError:
|
|
||||||
logger.warning("No transmission value reported from {attenuator.ID}")
|
|
||||||
|
|
||||||
test_attenuator()
|
|
||||||
|
|
||||||
|
|
||||||
# Undulators
|
# Undulators
|
||||||
import undulator
|
from beamline import undulator
|
||||||
|
|
||||||
undulators = undulator.Undulators()
|
undulators = undulator.Undulators()
|
||||||
|
logger.info(f"Using undulator (Aramis) offset to PSSS energy of {undulator.energy_offset} eV.")
|
||||||
|
|
||||||
|
|
||||||
# Shutter
|
# Shutter
|
||||||
shutter = PP_Shutter("SARES30-LTIM01-EVR0:RearUniv0-Ena-SP", name="Cristallina pulse picker shutter") # Shutter buttton when using the pulse picker
|
shutter = PP_Shutter(
|
||||||
pulsepicker = PulsePicker("SAROP31-OPPI151","SARES30-LTIM01-EVR0:Pul3", name="Cristallina X-ray pulse picker OPPI151")
|
"SARES30-LTIM01-EVR0:RearUniv0-Ena-SP", name="Cristallina pulse picker shutter"
|
||||||
|
) # Shutter buttton when using the pulse picker
|
||||||
|
pulsepicker = PulsePicker(
|
||||||
|
"SAROP31-OPPI151",
|
||||||
|
"SARES30-LTIM01-EVR0:Pul3",
|
||||||
|
name="Cristallina X-ray pulse picker OPPI151",
|
||||||
|
)
|
||||||
|
|
||||||
# Alignment laser
|
# Alignment laser
|
||||||
alaser = AlignmentLaser("SAROP31-OLAS147:MOTOR_1", name="Cristallina alignment laser OLAS147")
|
alaser = AlignmentLaser("SAROP31-OLAS147:MOTOR_1", name="Cristallina alignment laser OLAS147")
|
||||||
@ -105,23 +140,22 @@ alaser = AlignmentLaser("SAROP31-OLAS147:MOTOR_1", name="Cristallina alignment l
|
|||||||
from slic.devices.xoptics import slits
|
from slic.devices.xoptics import slits
|
||||||
|
|
||||||
## Smaract & attocube stages
|
## Smaract & attocube stages
|
||||||
from smaract_device_def import smaract_Juraj, smaract_mini_XYZ
|
from devices.smaract_device_def import smaract_Juraj, smaract_mini_XYZ
|
||||||
from attocube_device_def import attocube
|
from devices.attocube_device_def import attocube
|
||||||
from jj_device_def import jjslits
|
from devices.jj_device_def import jjslits
|
||||||
|
|
||||||
# KBs
|
# KBs
|
||||||
from slic.devices.xoptics.kb import KBHor, KBVer
|
from slic.devices.xoptics.kb import KBHor, KBVer
|
||||||
kbHor = KBHor(
|
|
||||||
"SAROP31-OKBH154",
|
kbHor = KBHor("SAROP31-OKBH154", description="Cristallina horizontal KB mirror")
|
||||||
description="Cristallina horizontal KB mirror"
|
kbVer = KBVer("SAROP31-OKBV153", description="Cristallina vertical KB mirror")
|
||||||
)
|
|
||||||
kbVer = KBVer(
|
# Bernina monochromator
|
||||||
"SAROP31-OKBV153",
|
from beamline.bernina_mono import BerninaMono
|
||||||
description="Cristallina vertical KB mirror"
|
BerninaDCM = BerninaMono("SAROP21-ODCM098")
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
################# DAQ Setup #################
|
||||||
instrument = "cristallina"
|
instrument = "cristallina"
|
||||||
|
|
||||||
# pgroup = "p19739" # commissioning March 2022 -- July 2022
|
# pgroup = "p19739" # commissioning March 2022 -- July 2022
|
||||||
@ -131,14 +165,20 @@ instrument = "cristallina"
|
|||||||
# pgroup = "p20557" # CrQ PMS commisioning 1
|
# pgroup = "p20557" # CrQ PMS commisioning 1
|
||||||
# pgroup = "p20509" # CrQ commissoing DilSc1
|
# pgroup = "p20509" # CrQ commissoing DilSc1
|
||||||
# pgroup = "p20519" # beamline commissioning 2
|
# pgroup = "p20519" # beamline commissioning 2
|
||||||
# pgroup = "p20840" # Cr beamline commisioning (Jan-Feb 2023)
|
|
||||||
# pgroup = "p20841" # CrQ PMS commisioning 2 (Jan 2023)
|
# pgroup = "p20841" # CrQ PMS commisioning 2 (Jan 2023)
|
||||||
# pgroup = "p20993" # CrQ commissoing DilSc2 (March 2023)
|
# pgroup = "p20993" # CrQ commissoing DilSc2 (March 2023)
|
||||||
pgroup = "p21147" # SAXS
|
# pgroup = "p21147" # SAXS
|
||||||
|
# pgroup = "p21238" # Cristallina photon diagnostics p-group with Chris
|
||||||
|
# pgroup = "p21224" # SwissMX commissioning 7
|
||||||
|
|
||||||
# pgroup = "p19150" # Scratch
|
pgroup = "p19150" # Scratch
|
||||||
# pgroup = "p19152" # Scratch
|
# pgroup = "p19152" # Scratch
|
||||||
|
|
||||||
|
# pgroup = "p20840" # Cr beamline commisioning (Jan-Feb 2023)
|
||||||
|
# pgroup = "p21261" # CrQ PMS-3 July 2023
|
||||||
|
|
||||||
|
# pgroup = "p21528" # Cr-MX Colletier 2023-09-05
|
||||||
|
|
||||||
daq = SFAcquisition(
|
daq = SFAcquisition(
|
||||||
instrument,
|
instrument,
|
||||||
pgroup,
|
pgroup,
|
||||||
@ -147,15 +187,21 @@ daq = SFAcquisition(
|
|||||||
default_detectors=detectors,
|
default_detectors=detectors,
|
||||||
rate_multiplicator=1,
|
rate_multiplicator=1,
|
||||||
)
|
)
|
||||||
|
# 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()
|
||||||
|
|
||||||
# daq = FakeAcquisition(instrument, pgroup)
|
# daq = FakeAcquisition(instrument, pgroup)
|
||||||
# daqPV = PVAcquisition(instrument, pgroup, default_channels=channels_ks) # workaround for KS not going to DB
|
# daqPV = PVAcquisition(instrument, pgroup, default_channels=channels_ks) # workaround for KS not going to DB
|
||||||
|
|
||||||
# scan = Scanner(scan_info_dir=f"/sf/{instrument}/data/{pgroup}/res/scan_info", default_acquisitions=[daq], condition=None)
|
|
||||||
|
|
||||||
# Run the scan only when gas monitor value larger than 10uJ (and smaller than 2000uJ):
|
# Run the scan only when gas monitor value larger than 10uJ (and smaller than 2000uJ):
|
||||||
# required fraction defines ammount of data recorded to save the step and move on to the next one
|
# required fraction defines ammount of data recorded to save the step and move on to the next one
|
||||||
check_intensity_gas_monitor = PVCondition("SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US", vmin=10, vmax=2000, wait_time=0.5, required_fraction=0.8)
|
check_intensity_gas_monitor = PVCondition(
|
||||||
|
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US",
|
||||||
|
vmin=-100,
|
||||||
|
vmax=2000,
|
||||||
|
wait_time=0.5,
|
||||||
|
required_fraction=0.8,
|
||||||
|
)
|
||||||
|
|
||||||
scan = Scanner(default_acquisitions=[daq], condition=check_intensity_gas_monitor)
|
scan = Scanner(default_acquisitions=[daq], condition=check_intensity_gas_monitor)
|
||||||
gui = GUI(scan, show_goto=True, show_spec=True)
|
gui = GUI(scan, show_goto=True, show_spec=True)
|
||||||
@ -163,14 +209,23 @@ 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}.")
|
||||||
logger.info("Loading finished.")
|
logger.info("Loading finished.")
|
||||||
|
|
||||||
def simple_acquisition(filename):
|
|
||||||
task = daq.acquire(filename)
|
|
||||||
#fname = task.filenames[0]
|
|
||||||
#pattern = r"run([0-9]{4})"
|
|
||||||
#match = re.search(pattern, fname)
|
|
||||||
#run_number = int(match.groups()[0])
|
|
||||||
|
|
||||||
#stand_client.add_row(run_number=run_number)
|
|
||||||
|
|
||||||
stand_client.add_row(run_number=-4,step=0, smaract_x=smaract_mini_XYZ.x.get_current_value(),smaract_y=smaract_mini_XYZ.y.get_current_value(),smaract_z=smaract_mini_XYZ.z.get_current_value()
|
slow_daq_test = SFAcquisition(
|
||||||
|
instrument,
|
||||||
|
"p19150",
|
||||||
|
default_channels=bs_channels,
|
||||||
|
default_pvs=pvs,
|
||||||
|
default_detectors=detectors,
|
||||||
|
rate_multiplicator=100,
|
||||||
|
)
|
||||||
|
|
||||||
|
slow_daq = SFAcquisition(
|
||||||
|
instrument,
|
||||||
|
pgroup,
|
||||||
|
default_channels=bs_channels,
|
||||||
|
default_pvs=pvs,
|
||||||
|
default_detectors=detectors,
|
||||||
|
rate_multiplicator=100,
|
||||||
|
)
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ from slic.utils import typename
|
|||||||
|
|
||||||
class AlignmentLaser:
|
class AlignmentLaser:
|
||||||
"""Class for the alignment laser"""
|
"""Class for the alignment laser"""
|
||||||
|
|
||||||
def __init__(self, ID, name="Cristallina alignment laser"):
|
def __init__(self, ID, name="Cristallina alignment laser"):
|
||||||
self.ID = ID
|
self.ID = ID
|
||||||
self.name = name or ID
|
self.name = name or ID
|
||||||
@ -33,7 +34,6 @@ class AlignmentLaser:
|
|||||||
def get_downstream_status(self):
|
def get_downstream_status(self):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
tn = typename(self)
|
tn = typename(self)
|
||||||
return f"{tn} \"{self.name}\" is {self.status}"
|
return f'{tn} "{self.name}" is {self.status}'
|
@ -15,12 +15,12 @@ from slic.core.adjustable import Adjustable, AdjustableError
|
|||||||
from slic.utils import typename
|
from slic.utils import typename
|
||||||
from slic.utils.printing import printable_dict
|
from slic.utils.printing import printable_dict
|
||||||
from slic.utils.hastyepics import get_pv as PV
|
from slic.utils.hastyepics import get_pv as PV
|
||||||
|
|
||||||
# from ..basedevice import BaseDevice
|
# from ..basedevice import BaseDevice
|
||||||
from slic.core.device.basedevice import BaseDevice
|
from slic.core.device.basedevice import BaseDevice
|
||||||
|
|
||||||
|
|
||||||
class AttocubeStage(BaseDevice):
|
class AttocubeStage(BaseDevice):
|
||||||
|
|
||||||
def __init__(self, name=None, **axis_ids):
|
def __init__(self, name=None, **axis_ids):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.axis_ids = axis_ids
|
self.axis_ids = axis_ids
|
||||||
@ -32,15 +32,15 @@ class AttocubeStage(BaseDevice):
|
|||||||
setattr(self, ax_name, ax)
|
setattr(self, ax_name, ax)
|
||||||
self.axes[ax_name] = ax
|
self.axes[ax_name] = ax
|
||||||
|
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
tname = typename(self)
|
tname = typename(self)
|
||||||
name = self.name
|
name = self.name
|
||||||
head = f"{tname} \"{name}\""
|
head = f'{tname} "{name}"'
|
||||||
|
|
||||||
to_print = {ax_name: ax.get_current_value() for ax_name, ax in self.axes.items()}
|
to_print = {ax_name: ax.get_current_value() for ax_name, ax in self.axes.items()}
|
||||||
return printable_dict(to_print, head)
|
return printable_dict(to_print, head)
|
||||||
|
|
||||||
|
|
||||||
# Commments after talking to Sven:
|
# Commments after talking to Sven:
|
||||||
# 1. give values in init and then fill self.config
|
# 1. give values in init and then fill self.config
|
||||||
# 2. set_target_value() is the method for the scanner. Therefore, update it so that it has move() inside it.
|
# 2. set_target_value() is the method for the scanner. Therefore, update it so that it has move() inside it.
|
||||||
@ -56,9 +56,24 @@ class AttocubeStage(BaseDevice):
|
|||||||
# where .acqure() has a the event_map - basically for every pulse id it shows whether the event was on or off. this way we can search for pulse ids for every drilling shot if we wanted to.
|
# where .acqure() has a the event_map - basically for every pulse id it shows whether the event was on or off. this way we can search for pulse ids for every drilling shot if we wanted to.
|
||||||
# event map channel is probably somewhere on the list when typing: " ioc records .*Evt.* "
|
# event map channel is probably somewhere on the list when typing: " ioc records .*Evt.* "
|
||||||
|
|
||||||
class AttocubeAxis(Adjustable):
|
|
||||||
|
|
||||||
def __init__(self, ID, name=None, units=None, internal=False, tolerance=0.3, timeout=300.0, pos_check_delay=0.15, target_gnd=None, move_attempts = 5, move_attempt_sleep=4, verbose_move = False, ignore_limits=True, confirm_move= True):
|
class AttocubeAxis(Adjustable):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
ID,
|
||||||
|
name=None,
|
||||||
|
units=None,
|
||||||
|
internal=False,
|
||||||
|
tolerance=0.3,
|
||||||
|
timeout=300.0,
|
||||||
|
pos_check_delay=0.15,
|
||||||
|
target_gnd=None,
|
||||||
|
move_attempts=5,
|
||||||
|
move_attempt_sleep=4,
|
||||||
|
verbose_move=False,
|
||||||
|
ignore_limits=True,
|
||||||
|
confirm_move=True,
|
||||||
|
):
|
||||||
super().__init__(ID, name=name, units=units, internal=internal)
|
super().__init__(ID, name=name, units=units, internal=internal)
|
||||||
|
|
||||||
self.wait_time = 0.1
|
self.wait_time = 0.1
|
||||||
@ -134,7 +149,7 @@ class AttocubeAxis(Adjustable):
|
|||||||
def get_amplitude(self, verbose=False):
|
def get_amplitude(self, verbose=False):
|
||||||
amplitude = self.pvs.amplitude_rb.value
|
amplitude = self.pvs.amplitude_rb.value
|
||||||
if verbose:
|
if verbose:
|
||||||
print(f'Drive amplitude is {amplitude/1000} V')
|
print(f"Drive amplitude is {amplitude/1000} V")
|
||||||
return amplitude / 1000
|
return amplitude / 1000
|
||||||
|
|
||||||
def set_amplitude(self, value, verbose=False, check=False):
|
def set_amplitude(self, value, verbose=False, check=False):
|
||||||
@ -142,14 +157,14 @@ class AttocubeAxis(Adjustable):
|
|||||||
self.pvs.amplitude.put(value * 1000)
|
self.pvs.amplitude.put(value * 1000)
|
||||||
if check:
|
if check:
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
assert self.pvs.amplitude_rb.value == value*1000, 'drive amplitude readback does not match set value'
|
assert self.pvs.amplitude_rb.value == value * 1000, "drive amplitude readback does not match set value"
|
||||||
if verbose:
|
if verbose:
|
||||||
print(f'Drive amplitude is set to {value} V')
|
print(f"Drive amplitude is set to {value} V")
|
||||||
|
|
||||||
def get_frequency(self, verbose=False):
|
def get_frequency(self, verbose=False):
|
||||||
frequency = self.pvs.frequency_rb.value
|
frequency = self.pvs.frequency_rb.value
|
||||||
if verbose:
|
if verbose:
|
||||||
print(f'Drive frequency is {frequency} V')
|
print(f"Drive frequency is {frequency} V")
|
||||||
return frequency
|
return frequency
|
||||||
|
|
||||||
def set_frequency(self, value, verbose=False, check=False):
|
def set_frequency(self, value, verbose=False, check=False):
|
||||||
@ -157,9 +172,9 @@ class AttocubeAxis(Adjustable):
|
|||||||
self.pvs.frequency.put(value)
|
self.pvs.frequency.put(value)
|
||||||
if check:
|
if check:
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
assert self.pvs.frequency_rb.value == value, 'drive frequency readback does not match set value'
|
assert self.pvs.frequency_rb.value == value, "drive frequency readback does not match set value"
|
||||||
if verbose:
|
if verbose:
|
||||||
print(f'Drive frequency is set to {value} Hz')
|
print(f"Drive frequency is set to {value} Hz")
|
||||||
|
|
||||||
def set_ground_on_target(self, value, verbose=True):
|
def set_ground_on_target(self, value, verbose=True):
|
||||||
if value == True or value == 1:
|
if value == True or value == 1:
|
||||||
@ -338,15 +353,15 @@ class AttocubeAxis(Adjustable):
|
|||||||
if self.is_at_target(tolerance=2):
|
if self.is_at_target(tolerance=2):
|
||||||
for attempt in range(self.config.move_attempts):
|
for attempt in range(self.config.move_attempts):
|
||||||
if self.config.verbose_move:
|
if self.config.verbose_move:
|
||||||
print(f'move attempt: {attempt+1}')
|
print(f"move attempt: {attempt+1}")
|
||||||
self.pvs.move.put(1, wait=True)
|
self.pvs.move.put(1, wait=True)
|
||||||
time.sleep(self.config.move_attempt_sleep)
|
time.sleep(self.config.move_attempt_sleep)
|
||||||
if self.is_at_target():
|
if self.is_at_target():
|
||||||
if self.config.verbose_move:
|
if self.config.verbose_move:
|
||||||
print(f'Move finished. Had to poke the cube {attempt+1}x to get there though.')
|
print(f"Move finished. Had to poke the cube {attempt+1}x to get there though.")
|
||||||
return SUCCESS
|
return SUCCESS
|
||||||
|
|
||||||
print('Position reached within 2um, but not better.')
|
print("Position reached within 2um, but not better.")
|
||||||
return TIMEOUT
|
return TIMEOUT
|
||||||
|
|
||||||
if self.is_at_target():
|
if self.is_at_target():
|
||||||
@ -355,17 +370,14 @@ class AttocubeAxis(Adjustable):
|
|||||||
return UNKNOWN_ERROR
|
return UNKNOWN_ERROR
|
||||||
|
|
||||||
def move(self, val, relative=False, wait=True):
|
def move(self, val, relative=False, wait=True):
|
||||||
''''Same as set target value, just for convenience'''
|
"""'Same as set target value, just for convenience"""
|
||||||
return self.set_target_value(val, relative=relative, wait=wait)
|
return self.set_target_value(val, relative=relative, wait=wait)
|
||||||
|
|
||||||
|
|
||||||
def gui(self):
|
def gui(self):
|
||||||
device, motor = self.ID.split(":")
|
device, motor = self.ID.split(":")
|
||||||
cmd = f'caqtdm -macro "DEVICE={device}" S_ANC350.ui'
|
cmd = f'caqtdm -macro "DEVICE={device}" S_ANC350.ui'
|
||||||
return subprocess.Popen(cmd, shell=True)
|
return subprocess.Popen(cmd, shell=True)
|
||||||
|
|
||||||
|
|
||||||
class AttocubeError(AdjustableError):
|
class AttocubeError(AdjustableError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
|||||||
from attocube import AttocubeStage
|
from devices.attocube import AttocubeStage
|
||||||
|
|
||||||
attocube = AttocubeStage("SARES30-ATTOCUBE",
|
attocube = AttocubeStage(
|
||||||
Y='SARES30-ATTOCUBE:A2',
|
"SARES30-ATTOCUBE",
|
||||||
X='SARES30-ATTOCUBE:A1',
|
Y="SARES30-ATTOCUBE:A2",
|
||||||
|
X="SARES30-ATTOCUBE:A1",
|
||||||
)
|
)
|
||||||
|
|
||||||
# def make_AttocubeStage(name):
|
# def make_AttocubeStage(name):
|
||||||
@ -19,7 +20,6 @@ attocube = AttocubeStage("SARES30-ATTOCUBE",
|
|||||||
# )
|
# )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# def set_target_value(self, value):
|
# def set_target_value(self, value):
|
||||||
# t1 = self.stage1.set_target_value(value)
|
# t1 = self.stage1.set_target_value(value)
|
||||||
# t2 = self.stage2.set_target_value(-value)
|
# t2 = self.stage2.set_target_value(-value)
|
||||||
@ -30,11 +30,6 @@ attocube = AttocubeStage("SARES30-ATTOCUBE",
|
|||||||
# return any(self.stage1.is_moving(), self.stage2.is_moving())
|
# return any(self.stage1.is_moving(), self.stage2.is_moving())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# t = daq.aquire(...)
|
# t = daq.aquire(...)
|
||||||
# for pos in []:
|
# for pos in []:
|
||||||
# mot.set_target_value(pos).wait()
|
# mot.set_target_value(pos).wait()
|
@ -2,7 +2,6 @@ from slic.core.adjustable import Adjustable
|
|||||||
|
|
||||||
|
|
||||||
class MyNewCoolThing(Adjustable):
|
class MyNewCoolThing(Adjustable):
|
||||||
|
|
||||||
pos = 0
|
pos = 0
|
||||||
|
|
||||||
def get_current_value(self):
|
def get_current_value(self):
|
18
devices/jj_device_def.py
Normal file
18
devices/jj_device_def.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
from slic.core.device import Device, SimpleDevice
|
||||||
|
from slic.devices.general.motor import Motor
|
||||||
|
|
||||||
|
|
||||||
|
class SlitUnitCenterWidthJJ(Device):
|
||||||
|
def __init__(self, ID, motor_naming="MOTOR", **kwargs):
|
||||||
|
super().__init__(ID, **kwargs)
|
||||||
|
|
||||||
|
self.x = SimpleDevice(
|
||||||
|
ID + "-X", center=Motor(ID + ":" + motor_naming + "_X"), width=Motor(ID + ":" + motor_naming + "_W")
|
||||||
|
)
|
||||||
|
|
||||||
|
self.y = SimpleDevice(
|
||||||
|
ID + "-Y", center=Motor(ID + ":" + motor_naming + "_Y"), width=Motor(ID + ":" + motor_naming + "_H")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
jjslits = SlitUnitCenterWidthJJ("SARES30-MOBI2", motor_naming="MOT")
|
@ -4,6 +4,7 @@ from slic.utils import typename
|
|||||||
|
|
||||||
class PP_Shutter:
|
class PP_Shutter:
|
||||||
"""Class for when pulse picker is used as a shutter. Opening and closing is done with turning on and off the event reciever universal output ON and OFF."""
|
"""Class for when pulse picker is used as a shutter. Opening and closing is done with turning on and off the event reciever universal output ON and OFF."""
|
||||||
|
|
||||||
def __init__(self, ID, name="X-ray Pulse Picker Shutter"):
|
def __init__(self, ID, name="X-ray Pulse Picker Shutter"):
|
||||||
self.ID = ID
|
self.ID = ID
|
||||||
self.name = name or ID
|
self.name = name or ID
|
||||||
@ -26,4 +27,4 @@ class PP_Shutter:
|
|||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
tn = typename(self)
|
tn = typename(self)
|
||||||
return f"{tn} \"{self.name}\" is {self.status}"
|
return f'{tn} "{self.name}" is {self.status}'
|
35
devices/pulse_picker.py
Normal file
35
devices/pulse_picker.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
from epics import PV
|
||||||
|
|
||||||
|
def pp_normal(opening = True):
|
||||||
|
""" Set pulse picker to fixed open or closed mode.
|
||||||
|
"""
|
||||||
|
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0-Ena-SP").put("Disabled")
|
||||||
|
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0_SOURCE").put("HIGH")
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0_SOURCE2").put("HIGH")
|
||||||
|
|
||||||
|
if opening:
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0-Ena-SP").put("Enabled")
|
||||||
|
else:
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0-Ena-SP").put("Disabled")
|
||||||
|
|
||||||
|
def pp_cta():
|
||||||
|
""" Set pulse picker to use the CTA as control input.
|
||||||
|
(check connections and parameters!)
|
||||||
|
"""
|
||||||
|
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0-Ena-SP").put("Disabled")
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0_SOURCE").put("PULSER")
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0_SOURCE2").put("PULSER")
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0_SNUMPD").put("3")
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0_SNUMPD2").put("3")
|
||||||
|
PV("SARES30-LTIM01-EVR0:RearUniv0-Ena-SP").put("Enabled")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -9,6 +9,7 @@ from slic.core.adjustable import Adjustable, AdjustableError
|
|||||||
from slic.utils import typename
|
from slic.utils import typename
|
||||||
from slic.utils.printing import printable_dict
|
from slic.utils.printing import printable_dict
|
||||||
from slic.utils.hastyepics import get_pv as PV
|
from slic.utils.hastyepics import get_pv as PV
|
||||||
|
|
||||||
# from ..basedevice import BaseDevice
|
# from ..basedevice import BaseDevice
|
||||||
from slic.core.device.basedevice import BaseDevice
|
from slic.core.device.basedevice import BaseDevice
|
||||||
|
|
||||||
@ -25,9 +26,7 @@ class Status(IntEnum):
|
|||||||
LOCKED = 8
|
LOCKED = 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SmarActStage(BaseDevice):
|
class SmarActStage(BaseDevice):
|
||||||
|
|
||||||
def __init__(self, name=None, **axis_ids):
|
def __init__(self, name=None, **axis_ids):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.axis_ids = axis_ids
|
self.axis_ids = axis_ids
|
||||||
@ -39,19 +38,16 @@ class SmarActStage(BaseDevice):
|
|||||||
setattr(self, ax_name, ax)
|
setattr(self, ax_name, ax)
|
||||||
self.axes[ax_name] = ax
|
self.axes[ax_name] = ax
|
||||||
|
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
tname = typename(self)
|
tname = typename(self)
|
||||||
name = self.name
|
name = self.name
|
||||||
head = f"{tname} \"{name}\""
|
head = f'{tname} "{name}"'
|
||||||
|
|
||||||
to_print = {ax_name: ax.get_current_value() for ax_name, ax in self.axes.items()}
|
to_print = {ax_name: ax.get_current_value() for ax_name, ax in self.axes.items()}
|
||||||
return printable_dict(to_print, head)
|
return printable_dict(to_print, head)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SmarActAxis(Adjustable):
|
class SmarActAxis(Adjustable):
|
||||||
|
|
||||||
def __init__(self, ID, name=None, units=None, internal=False, tolerance=0.5):
|
def __init__(self, ID, name=None, units=None, internal=False, tolerance=0.5):
|
||||||
super().__init__(ID, name=name, units=units, internal=internal)
|
super().__init__(ID, name=name, units=units, internal=internal)
|
||||||
|
|
||||||
@ -73,7 +69,7 @@ class SmarActAxis(Adjustable):
|
|||||||
stop=PV(ID + ":STOP.PROC"),
|
stop=PV(ID + ":STOP.PROC"),
|
||||||
hold=PV(ID + ":HOLD"),
|
hold=PV(ID + ":HOLD"),
|
||||||
twv=PV(ID + ":TWV"),
|
twv=PV(ID + ":TWV"),
|
||||||
units = PV(ID + ":DRIVE.EGU")
|
units=PV(ID + ":DRIVE.EGU"),
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -87,7 +83,6 @@ class SmarActAxis(Adjustable):
|
|||||||
def units(self, value):
|
def units(self, value):
|
||||||
self._units = value
|
self._units = value
|
||||||
|
|
||||||
|
|
||||||
def get_current_value(self, readback=True):
|
def get_current_value(self, readback=True):
|
||||||
if readback:
|
if readback:
|
||||||
return self.pvs.readback.get()
|
return self.pvs.readback.get()
|
||||||
@ -111,7 +106,7 @@ class SmarActAxis(Adjustable):
|
|||||||
if time.time() >= timeout:
|
if time.time() >= timeout:
|
||||||
tname = typename(self)
|
tname = typename(self)
|
||||||
self.stop()
|
self.stop()
|
||||||
raise SmarActError(f"starting to move {tname} \"{self.name}\" to {value} {self.units} timed out")
|
raise SmarActError(f'starting to move {tname} "{self.name}" to {value} {self.units} timed out')
|
||||||
|
|
||||||
# wait for move done
|
# wait for move done
|
||||||
while self._move_requested and self.is_moving():
|
while self._move_requested and self.is_moving():
|
||||||
@ -137,7 +132,6 @@ class SmarActAxis(Adjustable):
|
|||||||
self._move_requested = False
|
self._move_requested = False
|
||||||
self.pvs.stop.put(1, wait=True)
|
self.pvs.stop.put(1, wait=True)
|
||||||
|
|
||||||
|
|
||||||
def is_moving(self):
|
def is_moving(self):
|
||||||
return self.status != Status.STOPPED
|
return self.status != Status.STOPPED
|
||||||
|
|
||||||
@ -148,7 +142,6 @@ class SmarActAxis(Adjustable):
|
|||||||
def status(self):
|
def status(self):
|
||||||
return self.pvs.status.get()
|
return self.pvs.status.get()
|
||||||
|
|
||||||
|
|
||||||
def within_epics_limits(self, val):
|
def within_epics_limits(self, val):
|
||||||
low, high = self.get_epics_limits()
|
low, high = self.get_epics_limits()
|
||||||
return low <= val <= high
|
return low <= val <= high
|
||||||
@ -168,7 +161,6 @@ class SmarActAxis(Adjustable):
|
|||||||
self.pvs.llm.put(low)
|
self.pvs.llm.put(low)
|
||||||
self.pvs.hlm.put(high)
|
self.pvs.hlm.put(high)
|
||||||
|
|
||||||
|
|
||||||
def move(self, val, relative=False, wait=True, ignore_limits=False, confirm_move=True, timeout=300.0):
|
def move(self, val, relative=False, wait=True, ignore_limits=False, confirm_move=True, timeout=300.0):
|
||||||
"""
|
"""
|
||||||
moves SmarAct drive to position (emulating pyepics Motor class)
|
moves SmarAct drive to position (emulating pyepics Motor class)
|
||||||
@ -286,16 +278,11 @@ class SmarActAxis(Adjustable):
|
|||||||
|
|
||||||
return UNKNOWN_ERROR
|
return UNKNOWN_ERROR
|
||||||
|
|
||||||
|
|
||||||
def gui(self):
|
def gui(self):
|
||||||
device, motor = self.ID.split(":")
|
device, motor = self.ID.split(":")
|
||||||
cmd = f'caqtdm -macro "P={device}:,M={motor}" SARES30-CPCL-SMARACTX1_6axis_old.ui'
|
cmd = f'caqtdm -macro "P={device}:,M={motor}" SARES30-CPCL-SMARACTX1_6axis_old.ui'
|
||||||
return subprocess.Popen(cmd, shell=True)
|
return subprocess.Popen(cmd, shell=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SmarActError(AdjustableError):
|
class SmarActError(AdjustableError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
# from slic.devices.general.smaract import SmarActStage
|
# from slic.devices.general.smaract import SmarActStage
|
||||||
from smaract import SmarActStage
|
from devices.smaract import SmarActStage
|
||||||
from slic.core.device.simpledevice import SimpleDevice
|
from slic.core.device.simpledevice import SimpleDevice
|
||||||
from slic.devices.general.motor import Motor
|
from slic.devices.general.motor import Motor
|
||||||
|
|
||||||
@ -15,14 +15,14 @@ smaract_y = Motor("SARES30-MCS2750:MOT_3")
|
|||||||
smaract_mini_XYZ = SimpleDevice("XYZ smaract stage (mini)", x=smaract_x, y=smaract_y, z=smaract_z)
|
smaract_mini_XYZ = SimpleDevice("XYZ smaract stage (mini)", x=smaract_x, y=smaract_y, z=smaract_z)
|
||||||
|
|
||||||
|
|
||||||
|
smaract_Juraj = SmarActStage(
|
||||||
smaract_Juraj = SmarActStage("SARES30-XSMA156",
|
"SARES30-XSMA156",
|
||||||
X='SARES30-XSMA156:X',
|
X="SARES30-XSMA156:X",
|
||||||
Y='SARES30-XSMA156:Y',
|
Y="SARES30-XSMA156:Y",
|
||||||
Z='SARES30-XSMA156:Z',
|
Z="SARES30-XSMA156:Z",
|
||||||
Ry='SARES30-XSMA156:Ry',
|
Ry="SARES30-XSMA156:Ry",
|
||||||
Rx='SARES30-XSMA156:Rx',
|
Rx="SARES30-XSMA156:Rx",
|
||||||
Rz='SARES30-XSMA156:Rz',
|
Rz="SARES30-XSMA156:Rz",
|
||||||
)
|
)
|
||||||
|
|
||||||
# smaract_mini_XYZ = SmarActStage("SARES30-MCS2750",
|
# smaract_mini_XYZ = SmarActStage("SARES30-MCS2750",
|
5
exp_temp/apertures.py
Normal file
5
exp_temp/apertures.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from slic.devices.xoptics import slits
|
||||||
|
|
||||||
|
slits149 = slits.SlitUnitCenterWidth('SAROP31-OAPU149')
|
||||||
|
slits107 = slits.SlitUnitCenterWidth('SAROP31-OAPU107')
|
||||||
|
|
73
exp_temp/attenuator_scans.py
Normal file
73
exp_temp/attenuator_scans.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
from time import sleep
|
||||||
|
from epics import PV
|
||||||
|
#from slic.devices.xoptics.aramis_attenuator import Attenuator
|
||||||
|
|
||||||
|
pulse_picker_opening_pv = "SARES30-LTIM01-EVR0:RearUniv0-Ena-SP"
|
||||||
|
|
||||||
|
def attenuator_scan(transmissions,att,daq,sleep_time=8,label='test',n_pulses=100,detectors=None,pvs=None,channels=None):
|
||||||
|
|
||||||
|
PV(pulse_picker_opening_pv).put("Disabled")
|
||||||
|
sleep(1)
|
||||||
|
|
||||||
|
for idx,transmission in enumerate(transmissions):
|
||||||
|
|
||||||
|
print("Setting transmission = ",transmission)
|
||||||
|
att.trans1st(transmission)
|
||||||
|
sleep(sleep_time)
|
||||||
|
|
||||||
|
PV(pulse_picker_opening_pv).put("Enabled")
|
||||||
|
sleep(1)
|
||||||
|
|
||||||
|
print("Acquiring scan point ",idx,", Transmission = ",transmission)
|
||||||
|
|
||||||
|
if idx == 0:
|
||||||
|
#print("First point")
|
||||||
|
daq.acquire(label,is_scan_step=False,n_pulses=n_pulses,detectors=detectors,channels=channels,pvs=pvs)
|
||||||
|
|
||||||
|
else:
|
||||||
|
#print("Not first point")
|
||||||
|
daq.acquire(label,is_scan_step=True,n_pulses=n_pulses,detectors=detectors,channels=channels,pvs=pvs)
|
||||||
|
|
||||||
|
PV(pulse_picker_opening_pv).put("Disabled")
|
||||||
|
sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
print("Returning to first transmission = ",transmissions[0])
|
||||||
|
att.trans1st(transmissions[0])
|
||||||
|
sleep(sleep_time)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def attenuator_scan_cont(transmissions,att,daq,sleep_time=8,label='test',n_pulses=100,detectors=None,pvs=None,channels=None):
|
||||||
|
|
||||||
|
PV(pulse_picker_opening_pv).put("Disabled")
|
||||||
|
sleep(1)
|
||||||
|
|
||||||
|
for idx,transmission in enumerate(transmissions):
|
||||||
|
|
||||||
|
print("Setting transmission = ",transmission)
|
||||||
|
att.trans1st(transmission)
|
||||||
|
sleep(sleep_time)
|
||||||
|
|
||||||
|
PV(pulse_picker_opening_pv).put("Enabled")
|
||||||
|
sleep(1)
|
||||||
|
|
||||||
|
print("Acquiring scan point ",idx,", Transmission = ",transmission)
|
||||||
|
|
||||||
|
if idx < 0:
|
||||||
|
#print("First point")
|
||||||
|
daq.acquire(label,is_scan_step=False,n_pulses=n_pulses,detectors=detectors,channels=channels,pvs=pvs)
|
||||||
|
|
||||||
|
else:
|
||||||
|
#print("Not first point")
|
||||||
|
daq.acquire(label,is_scan_step=True,n_pulses=n_pulses,detectors=detectors,channels=channels,pvs=pvs)
|
||||||
|
|
||||||
|
PV(pulse_picker_opening_pv).put("Disabled")
|
||||||
|
sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
print("Returning to first transmission = ",transmissions[0])
|
||||||
|
att.trans1st(transmissions[0])
|
||||||
|
sleep(sleep_time)
|
||||||
|
|
||||||
|
|
804
exp_temp/channels.py
Normal file
804
exp_temp/channels.py
Normal file
@ -0,0 +1,804 @@
|
|||||||
|
# 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",
|
||||||
|
]
|
||||||
|
# RF phases and amplitudes
|
||||||
|
channels_RF = [
|
||||||
|
"SINSB01-RLLE-DSP:PHASE-VS",
|
||||||
|
"SINSB02-RLLE-DSP:PHASE-VS",
|
||||||
|
"SINSB03-RLLE-DSP:PHASE-VS",
|
||||||
|
"SINSB04-RLLE-DSP:PHASE-VS",
|
||||||
|
"SINXB01-RLLE-DSP:PHASE-VS",
|
||||||
|
"SINDI01-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB01-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB02-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB03-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB04-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB05-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB06-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB07-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB08-RLLE-DSP:PHASE-VS",
|
||||||
|
"S10CB09-RLLE-DSP:PHASE-VS",
|
||||||
|
"S20CB01-RLLE-DSP:PHASE-VS",
|
||||||
|
"S20CB02-RLLE-DSP:PHASE-VS",
|
||||||
|
"S20CB03-RLLE-DSP:PHASE-VS",
|
||||||
|
"S20CB04-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB01-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB02-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB03-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB04-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB05-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB06-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB07-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB08-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB09-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB10-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB11-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB12-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB13-RLLE-DSP:PHASE-VS",
|
||||||
|
"S30CB14-RLLE-DSP:PHASE-VS",
|
||||||
|
"SINEG01-RLLE-DSP:AMPLT-VS",
|
||||||
|
"SINSB01-RLLE-DSP:AMPLT-VS",
|
||||||
|
"SINSB02-RLLE-DSP:AMPLT-VS",
|
||||||
|
"SINSB03-RLLE-DSP:AMPLT-VS",
|
||||||
|
"SINSB04-RLLE-DSP:AMPLT-VS",
|
||||||
|
"SINXB01-RLLE-DSP:AMPLT-VS",
|
||||||
|
"SINDI01-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB01-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB02-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB03-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB04-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB05-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB06-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB07-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB08-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S10CB09-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S20CB01-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S20CB02-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S20CB03-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S20CB04-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB01-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB02-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB03-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB04-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB05-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB06-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB07-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB08-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB09-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB10-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB11-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB12-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB13-RLLE-DSP:AMPLT-VS",
|
||||||
|
"S30CB14-RLLE-DSP:AMPLT-VS",
|
||||||
|
]
|
||||||
|
|
||||||
|
channels_Xeye = ["SARES30-CAMS156-XE:intensity"]
|
||||||
|
|
||||||
|
######################
|
||||||
|
# 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",
|
||||||
|
]
|
||||||
|
|
||||||
|
###################################
|
||||||
|
## Bernina channels
|
||||||
|
# Beam position monitor PBPS113
|
||||||
|
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",
|
||||||
|
]
|
||||||
|
###################################
|
||||||
|
# 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:XPOS",
|
||||||
|
"SAROP31-PBPS113:YPOS",
|
||||||
|
]
|
||||||
|
channels_PBPS113_waveforms = [
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch0-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch1-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch2-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch3-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch4-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch5-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch6-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch7-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch8-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch9-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch10-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch11-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch12-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch13-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch14-WF-DATA",
|
||||||
|
"SAROP31-PBPS113:Lnk9Ch15-WF-DATA",
|
||||||
|
]
|
||||||
|
|
||||||
|
####################
|
||||||
|
# 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
|
||||||
|
# "SARES30-CAMS156-PCO1:FPICTURE", # PCO edge camera for the wavefront analysis (from Alvra)
|
||||||
|
# "SARES30-CAMS156-SMX-OAV:FPIC
|
||||||
|
|
||||||
|
###########################
|
||||||
|
# Beam position monitor
|
||||||
|
channels_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: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
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
##########################################################################################################
|
||||||
|
##########################################################################################################
|
||||||
|
##########################################################################################################
|
||||||
|
# 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
|
||||||
|
]
|
||||||
|
pvs_RF = [
|
||||||
|
"SINSB01-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"SINSB02-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"SINSB03-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"SINSB04-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"SINXB01-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"SINDI01-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB01-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB02-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB03-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB04-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB06-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB05-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB07-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB08-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S10CB09-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S20CB01-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S20CB02-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S20CB03-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S20CB04-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB01-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB02-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB03-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB04-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB05-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB06-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB07-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB08-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB09-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB10-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB11-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB12-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB13-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"S30CB14-RSYS:GET-VSUM-PHASE-OFFSET",
|
||||||
|
"SINEG01-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"SINSB01-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"SINSB02-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"SINSB03-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"SINSB04-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"SINXB01-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"SINDI01-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB01-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB02-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB03-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB04-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB05-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB06-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB07-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB08-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S10CB09-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S20CB01-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S20CB02-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S20CB03-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S20CB04-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB01-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB02-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB03-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB04-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB05-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB06-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB07-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB08-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB09-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB10-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB11-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB12-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB13-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
"S30CB14-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||||
|
]
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# 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",
|
||||||
|
]
|
||||||
|
|
||||||
|
###################
|
||||||
|
# Bernina mono
|
||||||
|
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"
|
||||||
|
]
|
||||||
|
|
||||||
|
####################
|
||||||
|
# Single shot spectrometer PSS059
|
||||||
|
pvs_PSSS059 = [
|
||||||
|
"SARFE10-PSSS055:MOTOR_X1.RBV",
|
||||||
|
"SARFE10-PSSS055:MOTOR_Y1.RBV",
|
||||||
|
"SARFE10-PSSS055:MOTOR_ROT_X1.RBV",
|
||||||
|
"SARFE10-PSSS055:MOTOR_PROBE.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_X3.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_Y3.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_ROT_X3.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_Y4.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_ROT_X4.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_X5.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_Y5.RBV",
|
||||||
|
"SARFE10-PSSS059:MOTOR_Z5.RBV",
|
||||||
|
"SARFE10-PSSS055:GRATING_SP",
|
||||||
|
"SARFE10-PSSS059:CRYSTAL_SP",
|
||||||
|
"SARFE10-PSSS059:SPC_ROI_YMIN",
|
||||||
|
"SARFE10-PSSS059:SPC_ROI_YMAX",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
####################
|
||||||
|
# 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.DRBV",
|
||||||
|
"SAROP31-PBPS113:MOTOR_Y1.DRBV",
|
||||||
|
"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.DRBV",
|
||||||
|
"SAROP31-PBPS149:MOTOR_Y1.DRBV",
|
||||||
|
"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:ENERGY",
|
||||||
|
"SAROP31-OATA150:TRANS_SP",
|
||||||
|
"SAROP31-OATA150:TRANS_RB",
|
||||||
|
"SAROP31-OATA150:TRANS3EDHARM_RB",
|
||||||
|
"SAROP31-OATA150:MOT2TRANS.VALD"
|
||||||
|
]
|
||||||
|
|
||||||
|
####################
|
||||||
|
# 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:MOTOR_PROBE.RBV",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
###########################
|
||||||
|
# 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:MOTOR_PROBE.RBV"
|
||||||
|
]
|
||||||
|
|
||||||
|
###########################
|
||||||
|
# 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 = [
|
||||||
|
"SARES30-MOBI1:MOT_1.RBV",
|
||||||
|
"SARES30-MOBI1:MOT_2.RBV",
|
||||||
|
"SARES30-MOBI1:MOT_3.RBV",
|
||||||
|
]
|
||||||
|
|
||||||
|
###############################
|
||||||
|
# Smaract stages mini XYZ from SwissMX
|
||||||
|
pvs_smaract_xyz = [
|
||||||
|
"SARES30-MCS2750:MOT_1.RBV",
|
||||||
|
"SARES30-MCS2750:MOT_1.VAL",
|
||||||
|
"SARES30-MCS2750:MOT_2.RBV",
|
||||||
|
"SARES30-MCS2750:MOT_2.VAL",
|
||||||
|
"SARES30-MCS2750:MOT_3.RBV",
|
||||||
|
"SARES30-MCS2750:MOT_3.VAL",
|
||||||
|
]
|
||||||
|
|
||||||
|
####################
|
||||||
|
# Attocube motors
|
||||||
|
pvs_attocube = [
|
||||||
|
"SARES30-ATTOCUBE:A0-POS",
|
||||||
|
"SARES30-ATTOCUBE:A1-POS",
|
||||||
|
]
|
||||||
|
|
||||||
|
###############################
|
||||||
|
# Smaract stages from Juraj
|
||||||
|
pvs_smaract_juraj = [
|
||||||
|
"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_RF
|
||||||
|
# + 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_OKBV153
|
||||||
|
+ pvs_PSCD153
|
||||||
|
+ pvs_OKBH154
|
||||||
|
# + pvs_standa
|
||||||
|
# + pvs_smaract_xyz
|
||||||
|
# + pvs_Bernina
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# + pvs_attocube
|
||||||
|
# + pvs_smaract_juraj
|
||||||
|
|
||||||
|
|
||||||
|
##########################
|
||||||
|
#########################
|
||||||
|
|
||||||
|
####################
|
||||||
|
|
||||||
|
detectors_jf_direct_beam_012 = [
|
||||||
|
"JF16T03V01",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
####################
|
||||||
|
|
||||||
|
bs_channels_OAPU107_scan = (
|
||||||
|
channels_gas_monitor
|
||||||
|
+ channels_PBPS053
|
||||||
|
+ channels_PSSS059
|
||||||
|
+ channels_PBPS113
|
||||||
|
+ channels_PBPS113
|
||||||
|
+ channels_PPRM150
|
||||||
|
)
|
||||||
|
|
||||||
|
bs_channels_OAPU149_scan = (
|
||||||
|
channels_gas_monitor
|
||||||
|
+ channels_PBPS053
|
||||||
|
+ channels_PSSS059
|
||||||
|
+ channels_PBPS113
|
||||||
|
+ channels_PBPS113
|
||||||
|
+ channels_PPRM150
|
||||||
|
)
|
||||||
|
|
||||||
|
bs_channels_pbps_snapshot = (
|
||||||
|
channels_gas_monitor
|
||||||
|
+ channels_PBPS053
|
||||||
|
+ channels_PSSS059
|
||||||
|
+ channels_PBPS113
|
||||||
|
+ channels_PBPS149
|
||||||
|
)
|
||||||
|
|
||||||
|
bs_channels_PPRM150 = (
|
||||||
|
channels_gas_monitor
|
||||||
|
+ channels_PBPS053
|
||||||
|
+ channels_PSSS059
|
||||||
|
+ channels_PPRM150
|
||||||
|
+ ["SAROP31-PPRM150:FPICTURE"]
|
||||||
|
)
|
||||||
|
|
||||||
|
bs_channels_jf_direct_beam = (
|
||||||
|
channels_gas_monitor
|
||||||
|
+ channels_PBPS053
|
||||||
|
+ channels_PSSS059
|
||||||
|
+ channels_PBPS113
|
||||||
|
+ channels_PBPS149
|
||||||
|
+ channels_EVR
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
####################
|
||||||
|
|
||||||
|
pvs_channels_PPRM150 = (
|
||||||
|
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_channels_jf_direct_beam = (
|
||||||
|
pvs_gas_monitor
|
||||||
|
+ pvs_OAPU044
|
||||||
|
+ pvs_PBPS053
|
||||||
|
+ pvs_OATT053
|
||||||
|
+ pvs_PPRM053
|
||||||
|
+ pvs_PSSS059
|
||||||
|
+ pvs_OOMH067
|
||||||
|
+ pvs_OOMH084
|
||||||
|
+ pvs_PPRM085
|
||||||
|
+ pvs_OAPU107
|
||||||
|
+ pvs_PBPS113
|
||||||
|
+ pvs_PPRM113
|
||||||
|
+ pvs_OAPU149
|
||||||
|
+ pvs_PBPS149
|
||||||
|
+ pvs_OATA150
|
||||||
|
+ pvs_OPPI151
|
||||||
|
+ pvs_ODMV152
|
||||||
|
+ pvs_OKBV153
|
||||||
|
+ pvs_PSCD153
|
||||||
|
+ pvs_OKBH154
|
||||||
|
)
|
@ -5,8 +5,10 @@ from slic.utils import typename
|
|||||||
|
|
||||||
CTA_sequence_start_PID = PV("SAR-CCTA-ESC:seq0Ctrl-StartedAt-O")
|
CTA_sequence_start_PID = PV("SAR-CCTA-ESC:seq0Ctrl-StartedAt-O")
|
||||||
|
|
||||||
|
|
||||||
class PP_Shutter:
|
class PP_Shutter:
|
||||||
"""Pulsed magnet instrument classs"""
|
"""Pulsed magnet instrument classs"""
|
||||||
|
|
||||||
def __init__(self, ID, name="Pulsed Magnet Instrument"):
|
def __init__(self, ID, name="Pulsed Magnet Instrument"):
|
||||||
self.ID = ID
|
self.ID = ID
|
||||||
self.name = name or ID
|
self.name = name or ID
|
||||||
@ -29,7 +31,4 @@ class PP_Shutter:
|
|||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
tn = typename(self)
|
tn = typename(self)
|
||||||
return f"{tn} \"{self.name}\" is {self.status}"
|
return f'{tn} "{self.name}" is {self.status}'
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
|||||||
from slic.core.device import Device, SimpleDevice
|
|
||||||
from slic.devices.general.motor import Motor
|
|
||||||
|
|
||||||
class SlitUnitCenterWidthJJ(Device):
|
|
||||||
|
|
||||||
def __init__(self, ID, motor_naming="MOTOR",**kwargs):
|
|
||||||
super().__init__(ID, **kwargs)
|
|
||||||
|
|
||||||
self.x = SimpleDevice(ID + "-X",
|
|
||||||
center = Motor(ID + ":"+motor_naming+"_X"),
|
|
||||||
width = Motor(ID + ":"+motor_naming+"_W")
|
|
||||||
)
|
|
||||||
|
|
||||||
self.y = SimpleDevice(ID + "-Y",
|
|
||||||
center = Motor(ID + ":"+motor_naming+"_Y"),
|
|
||||||
width = Motor(ID + ":"+motor_naming+"_H")
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
jjslits = SlitUnitCenterWidthJJ("SARES30-MOBI2", motor_naming="MOT")
|
|
2012
log/cristallina.log
2012
log/cristallina.log
File diff suppressed because it is too large
Load Diff
@ -1,10 +1,12 @@
|
|||||||
from time import sleep, time
|
from time import sleep, time
|
||||||
from cristallina import cta, daq
|
from cristallina import cta, daq
|
||||||
|
|
||||||
|
|
||||||
def make_pulse_train():
|
def make_pulse_train():
|
||||||
recording = daq.acquire('pulsing_sequence',n_pulses=100*101,wait=False)
|
recording = daq.acquire("pulsing_sequence", n_pulses=100 * 101, wait=False)
|
||||||
cta.start()
|
cta.start()
|
||||||
recording.wait()
|
recording.wait()
|
||||||
print('done')
|
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):
|
# 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):
|
@ -3,6 +3,7 @@ from time import sleep, time
|
|||||||
from tracemalloc import start
|
from tracemalloc import start
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
# from epics import PV
|
# from epics import PV
|
||||||
# from slic.utils import nice_arange
|
# from slic.utils import nice_arange
|
||||||
# from slic.devices.general.motor import Motor
|
# from slic.devices.general.motor import Motor
|
||||||
@ -15,10 +16,12 @@ from tqdm import tqdm
|
|||||||
from standa import standa
|
from standa import standa
|
||||||
|
|
||||||
from slic.devices.timing.events import CTASequencer
|
from slic.devices.timing.events import CTASequencer
|
||||||
|
|
||||||
cta = CTASequencer("SAR-CCTA-ESC")
|
cta = CTASequencer("SAR-CCTA-ESC")
|
||||||
|
|
||||||
# setup logging
|
# setup logging
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
logger = logging.getLogger("slic.hole_drilling")
|
logger = logging.getLogger("slic.hole_drilling")
|
||||||
logger.setLevel(logging.INFO)
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
@ -27,7 +30,7 @@ logger.setLevel(logging.INFO)
|
|||||||
|
|
||||||
# create file handler which logs
|
# create file handler which logs
|
||||||
try:
|
try:
|
||||||
fh = logging.FileHandler('/sf/cristallina/applications/slic/cristallina/log/hole_drilling.log')
|
fh = logging.FileHandler("/sf/cristallina/applications/slic/cristallina/log/hole_drilling.log")
|
||||||
fh.setLevel(logging.DEBUG)
|
fh.setLevel(logging.DEBUG)
|
||||||
# fh.setFormatter(formatter)
|
# fh.setFormatter(formatter)
|
||||||
logger.addHandler(fh)
|
logger.addHandler(fh)
|
||||||
@ -36,19 +39,13 @@ except PermissionError as e:
|
|||||||
logger.warning(e)
|
logger.warning(e)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150")
|
attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150")
|
||||||
|
|
||||||
from slic.devices.xoptics.kb import KBHor, KBVer
|
from slic.devices.xoptics.kb import KBHor, KBVer
|
||||||
kbHor = KBHor(
|
|
||||||
"SAROP31-OKBH154",
|
|
||||||
description="Cristallina horizontal KB mirror"
|
|
||||||
)
|
|
||||||
|
|
||||||
kbVer = KBVer(
|
kbHor = KBHor("SAROP31-OKBH154", description="Cristallina horizontal KB mirror")
|
||||||
"SAROP31-OKBV153",
|
|
||||||
description="Cristallina vertical KB mirror"
|
kbVer = KBVer("SAROP31-OKBV153", description="Cristallina vertical KB mirror")
|
||||||
)
|
|
||||||
|
|
||||||
do_not_move_benders = True
|
do_not_move_benders = True
|
||||||
testing_flag = False
|
testing_flag = False
|
||||||
@ -65,6 +62,7 @@ between_same_shots = 150
|
|||||||
between_attenuations = 150
|
between_attenuations = 150
|
||||||
between_KB_settings = 500 # 500
|
between_KB_settings = 500 # 500
|
||||||
|
|
||||||
|
|
||||||
### 23.02
|
### 23.02
|
||||||
def kb_settings_list(best, step, no_steps):
|
def kb_settings_list(best, step, no_steps):
|
||||||
for i in range(no_steps):
|
for i in range(no_steps):
|
||||||
@ -77,9 +75,11 @@ def kb_settings_list(best,step,no_steps):
|
|||||||
l.append([best[0], best[1] + i * step])
|
l.append([best[0], best[1] + i * step])
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
|
||||||
KBvs = kb_settings_list([1.595, 1.874], 0.05, 3)
|
KBvs = kb_settings_list([1.595, 1.874], 0.05, 3)
|
||||||
KBhs = kb_settings_list([1.799000, 2.100000], 0.05, 3)
|
KBhs = kb_settings_list([1.799000, 2.100000], 0.05, 3)
|
||||||
|
|
||||||
|
|
||||||
### 24.02
|
### 24.02
|
||||||
def kb_settings_list_new(best, step, no_steps_one_way):
|
def kb_settings_list_new(best, step, no_steps_one_way):
|
||||||
l = []
|
l = []
|
||||||
@ -87,6 +87,8 @@ def kb_settings_list_new(best,step,no_steps_one_way):
|
|||||||
for i in range(no_steps_one_way * 2 + 1):
|
for i in range(no_steps_one_way * 2 + 1):
|
||||||
l.append([first[0] + i * step, first[1] + i * step])
|
l.append([first[0] + i * step, first[1] + i * step])
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
|
||||||
KBvs = kb_settings_list_new([1.595, 1.874], 0.0075, 3)
|
KBvs = kb_settings_list_new([1.595, 1.874], 0.0075, 3)
|
||||||
KBhs = kb_settings_list_new([1.799000, 2.100000], 0.0075, 3)
|
KBhs = kb_settings_list_new([1.799000, 2.100000], 0.0075, 3)
|
||||||
|
|
||||||
@ -104,6 +106,7 @@ if smaract_stage:
|
|||||||
between_attenuations = between_attenuations / 1000
|
between_attenuations = between_attenuations / 1000
|
||||||
between_KB_settings = between_KB_settings / 1000
|
between_KB_settings = between_KB_settings / 1000
|
||||||
|
|
||||||
|
|
||||||
def shoot(n_shots=1):
|
def shoot(n_shots=1):
|
||||||
epics.caput("SAR-CCTA-ESC:seq0Ctrl-Cycles-I", n_shots)
|
epics.caput("SAR-CCTA-ESC:seq0Ctrl-Cycles-I", n_shots)
|
||||||
sleep(0.1)
|
sleep(0.1)
|
||||||
@ -113,6 +116,7 @@ def shoot(n_shots=1):
|
|||||||
def move_x_rel(distance):
|
def move_x_rel(distance):
|
||||||
standa.x.mvr(distance)
|
standa.x.mvr(distance)
|
||||||
|
|
||||||
|
|
||||||
def move_y_rel(distance):
|
def move_y_rel(distance):
|
||||||
standa.z.mvr(distance)
|
standa.z.mvr(distance)
|
||||||
|
|
||||||
@ -121,22 +125,24 @@ def move_absolute(x, y):
|
|||||||
standa.x.mv(x).wait()
|
standa.x.mv(x).wait()
|
||||||
standa.z.mv(y).wait()
|
standa.z.mv(y).wait()
|
||||||
|
|
||||||
|
|
||||||
def make_holes(quantity, spacing=0.25, wait=1):
|
def make_holes(quantity, spacing=0.25, wait=1):
|
||||||
start_x = standa.x.get()
|
start_x = standa.x.get()
|
||||||
start_y = standa.z.get()
|
start_y = standa.z.get()
|
||||||
|
|
||||||
print(f'Starting postion:\n {standa}')
|
print(f"Starting postion:\n {standa}")
|
||||||
|
|
||||||
for i in range(quantity):
|
for i in range(quantity):
|
||||||
print(f'Shot {i}')
|
print(f"Shot {i}")
|
||||||
shoot()
|
shoot()
|
||||||
sleep(wait)
|
sleep(wait)
|
||||||
move_x_rel(spacing)
|
move_x_rel(spacing)
|
||||||
print('Done')
|
print("Done")
|
||||||
print('Returning to the start')
|
print("Returning to the start")
|
||||||
standa.x.mv(start_x)
|
standa.x.mv(start_x)
|
||||||
standa.z.mv(start_y)
|
standa.z.mv(start_y)
|
||||||
|
|
||||||
|
|
||||||
def drill_holes_grid(x_start, x_stop, n_cols, y_start, y_stop, n_rows, wait_time=0.5):
|
def drill_holes_grid(x_start, x_stop, n_cols, y_start, y_stop, n_rows, wait_time=0.5):
|
||||||
# make grid
|
# make grid
|
||||||
x_pos = np.linspace(x_start, x_stop, n_cols)
|
x_pos = np.linspace(x_start, x_stop, n_cols)
|
||||||
@ -146,20 +152,22 @@ def drill_holes_grid(x_start, x_stop, n_cols, y_start, y_stop, n_rows, wait_time
|
|||||||
y_spacing = (y_stop - y_start) / (n_rows - 1)
|
y_spacing = (y_stop - y_start) / (n_rows - 1)
|
||||||
|
|
||||||
# TODO: add settings we want to change per row
|
# TODO: add settings we want to change per row
|
||||||
row_settings = defaultdict(lambda: {'n_pulses' : 100})
|
row_settings = defaultdict(lambda: {"n_pulses": 100})
|
||||||
row_settings[0] = {'n_pulses' : 500}
|
row_settings[0] = {"n_pulses": 500}
|
||||||
row_settings[1] = {'n_pulses' : 100}
|
row_settings[1] = {"n_pulses": 100}
|
||||||
row_settings[2] = {'n_pulses' : 10}
|
row_settings[2] = {"n_pulses": 10}
|
||||||
row_settings[3] = {'n_pulses' : 1}
|
row_settings[3] = {"n_pulses": 1}
|
||||||
|
|
||||||
x_start = standa.x.get()
|
x_start = standa.x.get()
|
||||||
y_start = standa.z.get()
|
y_start = standa.z.get()
|
||||||
|
|
||||||
logger.info(f"Begin hole pattern at x:{x_start:.5f}, y:{y_start:.5f}, with transmission: {attenuator.get_transmission():.5f}.")
|
logger.info(
|
||||||
|
f"Begin hole pattern at x:{x_start:.5f}, y:{y_start:.5f}, with transmission: {attenuator.get_transmission():.5f}."
|
||||||
|
)
|
||||||
|
|
||||||
for row, y in enumerate(y_pos):
|
for row, y in enumerate(y_pos):
|
||||||
settings = row_settings[row]
|
settings = row_settings[row]
|
||||||
n_pulses = settings['n_pulses']
|
n_pulses = settings["n_pulses"]
|
||||||
|
|
||||||
for x in x_pos:
|
for x in x_pos:
|
||||||
move_absolute(x, y)
|
move_absolute(x, y)
|
||||||
@ -170,15 +178,17 @@ def drill_holes_grid(x_start, x_stop, n_cols, y_start, y_stop, n_rows, wait_time
|
|||||||
sleep(0.2)
|
sleep(0.2)
|
||||||
while cta.cta_client.is_running():
|
while cta.cta_client.is_running():
|
||||||
# wait until sequence is done
|
# wait until sequence is done
|
||||||
print('waiting for CTA ...')
|
print("waiting for CTA ...")
|
||||||
sleep(0.1)
|
sleep(0.1)
|
||||||
|
|
||||||
logger.info(f"At {time():.5f}s, drilled {n_pulses} hole(s) at x:{x:.5f}, y:{y:.5f}, with transmission: {attenuator.get_transmission():.5f}.")
|
logger.info(
|
||||||
|
f"At {time():.5f}s, drilled {n_pulses} hole(s) at x:{x:.5f}, y:{y:.5f}, with transmission: {attenuator.get_transmission():.5f}."
|
||||||
|
)
|
||||||
|
|
||||||
move_absolute(x_start, y_start)
|
move_absolute(x_start, y_start)
|
||||||
|
|
||||||
def drill_here():
|
|
||||||
|
|
||||||
|
def drill_here():
|
||||||
x_start = standa.x.get()
|
x_start = standa.x.get()
|
||||||
x_stop = x_start + 2
|
x_stop = x_start + 2
|
||||||
n_cols = 11
|
n_cols = 11
|
||||||
|
@ -2,6 +2,7 @@ from datetime import datetime
|
|||||||
from time import sleep, time
|
from time import sleep, time
|
||||||
from tracemalloc import start
|
from tracemalloc import start
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
# from epics import PV
|
# from epics import PV
|
||||||
# from slic.utils import nice_arange
|
# from slic.utils import nice_arange
|
||||||
# from slic.devices.general.motor import Motor
|
# from slic.devices.general.motor import Motor
|
||||||
@ -15,15 +16,10 @@ from tqdm import tqdm
|
|||||||
attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150")
|
attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150")
|
||||||
|
|
||||||
from slic.devices.xoptics.kb import KBHor, KBVer
|
from slic.devices.xoptics.kb import KBHor, KBVer
|
||||||
kbHor = KBHor(
|
|
||||||
"SAROP31-OKBH154",
|
|
||||||
description="Cristallina horizontal KB mirror"
|
|
||||||
)
|
|
||||||
|
|
||||||
kbVer = KBVer(
|
kbHor = KBHor("SAROP31-OKBH154", description="Cristallina horizontal KB mirror")
|
||||||
"SAROP31-OKBV153",
|
|
||||||
description="Cristallina vertical KB mirror"
|
kbVer = KBVer("SAROP31-OKBV153", description="Cristallina vertical KB mirror")
|
||||||
)
|
|
||||||
|
|
||||||
do_not_move_benders = True
|
do_not_move_benders = True
|
||||||
testing_flag = False
|
testing_flag = False
|
||||||
@ -40,6 +36,7 @@ between_same_shots = 150
|
|||||||
between_attenuations = 150
|
between_attenuations = 150
|
||||||
between_KB_settings = 500 # 500
|
between_KB_settings = 500 # 500
|
||||||
|
|
||||||
|
|
||||||
### 23.02
|
### 23.02
|
||||||
def kb_settings_list(best, step, no_steps):
|
def kb_settings_list(best, step, no_steps):
|
||||||
for i in range(no_steps):
|
for i in range(no_steps):
|
||||||
@ -52,9 +49,11 @@ def kb_settings_list(best,step,no_steps):
|
|||||||
l.append([best[0], best[1] + i * step])
|
l.append([best[0], best[1] + i * step])
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
|
||||||
KBvs = kb_settings_list([1.595, 1.874], 0.05, 3)
|
KBvs = kb_settings_list([1.595, 1.874], 0.05, 3)
|
||||||
KBhs = kb_settings_list([1.799000, 2.100000], 0.05, 3)
|
KBhs = kb_settings_list([1.799000, 2.100000], 0.05, 3)
|
||||||
|
|
||||||
|
|
||||||
### 24.02
|
### 24.02
|
||||||
def kb_settings_list_new(best, step, no_steps_one_way):
|
def kb_settings_list_new(best, step, no_steps_one_way):
|
||||||
l = []
|
l = []
|
||||||
@ -62,6 +61,8 @@ def kb_settings_list_new(best,step,no_steps_one_way):
|
|||||||
for i in range(no_steps_one_way * 2 + 1):
|
for i in range(no_steps_one_way * 2 + 1):
|
||||||
l.append([first[0] + i * step, first[1] + i * step])
|
l.append([first[0] + i * step, first[1] + i * step])
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
|
||||||
KBvs = kb_settings_list_new([1.595, 1.874], 0.0075, 3)
|
KBvs = kb_settings_list_new([1.595, 1.874], 0.0075, 3)
|
||||||
KBhs = kb_settings_list_new([1.799000, 2.100000], 0.0075, 3)
|
KBhs = kb_settings_list_new([1.799000, 2.100000], 0.0075, 3)
|
||||||
|
|
||||||
@ -79,25 +80,27 @@ if smaract_stage:
|
|||||||
between_attenuations = between_attenuations / 1000
|
between_attenuations = between_attenuations / 1000
|
||||||
between_KB_settings = between_KB_settings / 1000
|
between_KB_settings = between_KB_settings / 1000
|
||||||
|
|
||||||
|
|
||||||
def shoot(pos=pos, testing=testing_flag):
|
def shoot(pos=pos, testing=testing_flag):
|
||||||
if testing:
|
if testing:
|
||||||
print(f'Shot at: {pos}')
|
print(f"Shot at: {pos}")
|
||||||
return pos
|
return pos
|
||||||
else:
|
else:
|
||||||
print(f'Shot at: {pos}')
|
print(f"Shot at: {pos}")
|
||||||
sleep(2)
|
sleep(2)
|
||||||
epics.caput("SAR-CCTA-ESC:seq0Ctrl-Start-I", 1)
|
epics.caput("SAR-CCTA-ESC:seq0Ctrl-Start-I", 1)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def change_benders(bender_1, bender_2, KB=None, do_not_move_benders=do_not_move_benders):
|
def change_benders(bender_1, bender_2, KB=None, do_not_move_benders=do_not_move_benders):
|
||||||
check_KB_value(KB)
|
check_KB_value(KB)
|
||||||
|
|
||||||
current_values = get_bender_values(KB)
|
current_values = get_bender_values(KB)
|
||||||
if current_values[0] > bender_1 or current_values[1] > bender_2:
|
if current_values[0] > bender_1 or current_values[1] > bender_2:
|
||||||
print('Unbending first because of backlash')
|
print("Unbending first because of backlash")
|
||||||
if do_not_move_benders != True:
|
if do_not_move_benders != True:
|
||||||
# Move home first
|
# Move home first
|
||||||
if KB == 'h' or KB == 'H':
|
if KB == "h" or KB == "H":
|
||||||
kbHor.bend1.set_target_value(KBh_home[0]).wait()
|
kbHor.bend1.set_target_value(KBh_home[0]).wait()
|
||||||
sleep(1)
|
sleep(1)
|
||||||
kbHor.bend2.set_target_value(KBh_home[1]).wait()
|
kbHor.bend2.set_target_value(KBh_home[1]).wait()
|
||||||
@ -109,13 +112,13 @@ def change_benders(bender_1,bender_2,KB = None,do_not_move_benders = do_not_move
|
|||||||
sleep(1)
|
sleep(1)
|
||||||
|
|
||||||
if do_not_move_benders:
|
if do_not_move_benders:
|
||||||
print(f'Bender 1 to: {bender_1}')
|
print(f"Bender 1 to: {bender_1}")
|
||||||
print(f'Bender 2 to: {bender_2}')
|
print(f"Bender 2 to: {bender_2}")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Move to the new position
|
# Move to the new position
|
||||||
print(f'Changing {KB} bender to: [{bender_1} , {bender_2}]')
|
print(f"Changing {KB} bender to: [{bender_1} , {bender_2}]")
|
||||||
if KB == 'h' or KB == 'H':
|
if KB == "h" or KB == "H":
|
||||||
kbHor.bend1.set_target_value(bender_1).wait()
|
kbHor.bend1.set_target_value(bender_1).wait()
|
||||||
sleep(1)
|
sleep(1)
|
||||||
kbHor.bend2.set_target_value(bender_2).wait()
|
kbHor.bend2.set_target_value(bender_2).wait()
|
||||||
@ -128,12 +131,13 @@ def change_benders(bender_1,bender_2,KB = None,do_not_move_benders = do_not_move
|
|||||||
|
|
||||||
|
|
||||||
def check_KB_value(KB):
|
def check_KB_value(KB):
|
||||||
if KB not in ['H','h','V','v']:
|
if KB not in ["H", "h", "V", "v"]:
|
||||||
raise KeyError(f"KB can only be horizontal (H) or vertical (V), not {KB}")
|
raise KeyError(f"KB can only be horizontal (H) or vertical (V), not {KB}")
|
||||||
|
|
||||||
|
|
||||||
def get_bender_values(KB=None):
|
def get_bender_values(KB=None):
|
||||||
check_KB_value(KB)
|
check_KB_value(KB)
|
||||||
if KB == 'h' or KB == 'H':
|
if KB == "h" or KB == "H":
|
||||||
return [kbHor.bend1.get(), kbHor.bend2.get()]
|
return [kbHor.bend1.get(), kbHor.bend2.get()]
|
||||||
else:
|
else:
|
||||||
return [kbVer.bend1.get(), kbVer.bend2.get()]
|
return [kbVer.bend1.get(), kbVer.bend2.get()]
|
||||||
@ -151,6 +155,7 @@ def move_x_rel(distance,testing=testing_flag,pos=pos):
|
|||||||
pos = pos + np.array([distance, 0])
|
pos = pos + np.array([distance, 0])
|
||||||
return pos
|
return pos
|
||||||
|
|
||||||
|
|
||||||
def move_y_rel(distance, testing=testing_flag, pos=pos):
|
def move_y_rel(distance, testing=testing_flag, pos=pos):
|
||||||
if testing == True:
|
if testing == True:
|
||||||
pos = pos + np.array([0, distance])
|
pos = pos + np.array([0, distance])
|
||||||
@ -163,6 +168,7 @@ def move_y_rel(distance,testing=testing_flag,pos=pos):
|
|||||||
pos = pos + np.array([0, distance])
|
pos = pos + np.array([0, distance])
|
||||||
return pos
|
return pos
|
||||||
|
|
||||||
|
|
||||||
def move_x(value, testing=testing_flag, pos=pos):
|
def move_x(value, testing=testing_flag, pos=pos):
|
||||||
if testing == True:
|
if testing == True:
|
||||||
pos[0] = value
|
pos[0] = value
|
||||||
@ -174,6 +180,7 @@ def move_x(value,testing=testing_flag,pos=pos):
|
|||||||
attocube.X.set_target_value(value, relative=False).wait()
|
attocube.X.set_target_value(value, relative=False).wait()
|
||||||
return [value, pos[1]]
|
return [value, pos[1]]
|
||||||
|
|
||||||
|
|
||||||
def move_y(value, testing=testing_flag, pos=pos):
|
def move_y(value, testing=testing_flag, pos=pos):
|
||||||
if testing == True:
|
if testing == True:
|
||||||
pos[1] = value
|
pos[1] = value
|
||||||
@ -185,6 +192,7 @@ def move_y(value,testing=testing_flag,pos=pos):
|
|||||||
attocube.Y.set_target_value(value, relative=False).wait()
|
attocube.Y.set_target_value(value, relative=False).wait()
|
||||||
return [pos[0], value]
|
return [pos[0], value]
|
||||||
|
|
||||||
|
|
||||||
def move(target_pos, testing=True, pos=pos):
|
def move(target_pos, testing=True, pos=pos):
|
||||||
if testing == True:
|
if testing == True:
|
||||||
pass
|
pass
|
||||||
@ -198,6 +206,7 @@ def move(target_pos,testing=True,pos=pos):
|
|||||||
pos = target_pos
|
pos = target_pos
|
||||||
return pos
|
return pos
|
||||||
|
|
||||||
|
|
||||||
def get_original_position(testing=testing_flag):
|
def get_original_position(testing=testing_flag):
|
||||||
if testing == True:
|
if testing == True:
|
||||||
original_position = pos
|
original_position = pos
|
||||||
@ -208,6 +217,7 @@ def get_original_position(testing=testing_flag):
|
|||||||
original_position = [attocube.X.get_current_value(), attocube.Y.get_current_value()]
|
original_position = [attocube.X.get_current_value(), attocube.Y.get_current_value()]
|
||||||
return original_position
|
return original_position
|
||||||
|
|
||||||
|
|
||||||
def set_attenuation(value):
|
def set_attenuation(value):
|
||||||
attenuator.set_transmission(value)
|
attenuator.set_transmission(value)
|
||||||
sleep(1)
|
sleep(1)
|
||||||
@ -215,17 +225,18 @@ def set_attenuation(value):
|
|||||||
sleep(1)
|
sleep(1)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
def make_attenuations(attenuations, testing=testing_flag, pos=pos):
|
def make_attenuations(attenuations, testing=testing_flag, pos=pos):
|
||||||
original_position = get_original_position(testing=testing)
|
original_position = get_original_position(testing=testing)
|
||||||
|
|
||||||
# Make all attenuations
|
# Make all attenuations
|
||||||
for attenuation in attenuations:
|
for attenuation in attenuations:
|
||||||
print(f'Setting attenuation to: {attenuation}')
|
print(f"Setting attenuation to: {attenuation}")
|
||||||
if testing:
|
if testing:
|
||||||
print('Testing: no attenuator change')
|
print("Testing: no attenuator change")
|
||||||
else:
|
else:
|
||||||
set_attenuation(attenuation)
|
set_attenuation(attenuation)
|
||||||
print('Making same shots')
|
print("Making same shots")
|
||||||
make_same_shots(n_same_holes, pos=pos, testing=testing)
|
make_same_shots(n_same_holes, pos=pos, testing=testing)
|
||||||
pos = move_y_rel(between_attenuations, pos=pos, testing=testing)
|
pos = move_y_rel(between_attenuations, pos=pos, testing=testing)
|
||||||
|
|
||||||
@ -236,6 +247,7 @@ def make_attenuations(attenuations,testing=testing_flag,pos=pos):
|
|||||||
pos = move(original_position, testing=testing)
|
pos = move(original_position, testing=testing)
|
||||||
return pos
|
return pos
|
||||||
|
|
||||||
|
|
||||||
def make_same_shots(n_same_holes, testing=testing_flag, pos=pos):
|
def make_same_shots(n_same_holes, testing=testing_flag, pos=pos):
|
||||||
original_position = get_original_position(testing=testing)
|
original_position = get_original_position(testing=testing)
|
||||||
|
|
||||||
@ -249,11 +261,20 @@ def make_same_shots(n_same_holes,testing=testing_flag,pos=pos):
|
|||||||
move(original_position, testing=testing)
|
move(original_position, testing=testing)
|
||||||
|
|
||||||
|
|
||||||
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):
|
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))
|
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')
|
print(f"Total time estimate: {(total_time/60):.1f} minutes or {(total_time/60/60):.1f} hours")
|
||||||
return total_time
|
return total_time
|
||||||
|
|
||||||
|
|
||||||
# Get the starting x-position
|
# Get the starting x-position
|
||||||
if testing_flag == True:
|
if testing_flag == True:
|
||||||
starting_x_pos = pos[0]
|
starting_x_pos = pos[0]
|
||||||
@ -267,41 +288,42 @@ else:
|
|||||||
def make_everything(KBvs, KBhs, attenuations, n_same_holes, testing=testing_flag, pos=pos, do_not_move_benders=True):
|
def make_everything(KBvs, KBhs, attenuations, n_same_holes, testing=testing_flag, pos=pos, do_not_move_benders=True):
|
||||||
# The loop to make inprints
|
# The loop to make inprints
|
||||||
for i, KBv in enumerate(tqdm(KBvs)):
|
for i, KBv in enumerate(tqdm(KBvs)):
|
||||||
change_benders(KBv[0],KBv[1],KB = 'v',do_not_move_benders=do_not_move_benders)
|
change_benders(KBv[0], KBv[1], KB="v", do_not_move_benders=do_not_move_benders)
|
||||||
|
|
||||||
for ind, KBh in enumerate(KBhs):
|
for ind, KBh in enumerate(KBhs):
|
||||||
change_benders(KBh[0],KBh[1],KB = 'h')
|
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)}')
|
print(f"Progress so far: KBv loop: {i+1}/{len(KBvs)}. KBh loop:{ind+1}/{len(KBhs)}")
|
||||||
make_attenuations(attenuations, pos=pos, testing=testing)
|
make_attenuations(attenuations, pos=pos, testing=testing)
|
||||||
|
|
||||||
print(f'Moving to a new KBh setting')
|
print(f"Moving to a new KBh setting")
|
||||||
# Move to the last shot of the same shot + the spacing between KB settings
|
# 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, testing=testing)
|
pos = move_x_rel(between_KB_settings + between_same_shots * (n_same_holes - 1), pos=pos, testing=testing)
|
||||||
|
|
||||||
print('KBh set done, returning to starting_x_pos')
|
print("KBh set done, returning to starting_x_pos")
|
||||||
# Move to the last shot of the same shot + the spacing between KB settings
|
# Move to the last shot of the same shot + the spacing between KB settings
|
||||||
|
|
||||||
pos = move_x(starting_x_pos, pos=pos, testing=testing)
|
pos = move_x(starting_x_pos, pos=pos, testing=testing)
|
||||||
|
|
||||||
print('#################################################################################')
|
print("#################################################################################")
|
||||||
print('Moving to a new KBv setting')
|
print("Moving to a new KBv setting")
|
||||||
# Move to the last shot of the same shot + the spacing between KB settings
|
# 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, testing=testing)
|
pos = move_y_rel(between_KB_settings + between_attenuations * (len(attenuations) - 1), pos=pos, testing=testing)
|
||||||
|
|
||||||
|
print("Inprints are done")
|
||||||
print('Inprints are done')
|
|
||||||
set_attenuation(1e-6)
|
set_attenuation(1e-6)
|
||||||
status_pv = PV('SF-OP:ESC-MSG:STATUS')
|
status_pv = PV("SF-OP:ESC-MSG:STATUS")
|
||||||
status_pv.put(0)
|
status_pv.put(0)
|
||||||
|
|
||||||
# print(f'Total time estimate: {(total_time/60):.1f} minutes or {(total_time/60/60):.1f} hours')
|
# print(f'Total time estimate: {(total_time/60):.1f} minutes or {(total_time/60/60):.1f} hours')
|
||||||
|
|
||||||
|
|
||||||
# To do:
|
# To do:
|
||||||
# Fix movement of the attocubes in real time
|
# Fix movement of the attocubes in real time
|
||||||
# Load lut files into the controller and check that x is x and y is y
|
# Load lut files into the controller and check that x is x and y is y
|
||||||
|
|
||||||
|
|
||||||
def make_z_scan(z_list, n_same_holes, attenuations, vertical_spacing=0.150):
|
def make_z_scan(z_list, n_same_holes, attenuations, vertical_spacing=0.150):
|
||||||
original_position = get_original_position(testing=False)
|
original_position = get_original_position(testing=False)
|
||||||
for attenuation in attenuations:
|
for attenuation in attenuations:
|
||||||
|
464
retrieve.ipynb
Normal file
464
retrieve.ipynb
Normal file
@ -0,0 +1,464 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 1,
|
||||||
|
"id": "8960fc34-a3b8-4f3a-85a4-22ea697ee38a",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import numpy as np\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 2,
|
||||||
|
"id": "1a5fa748-9641-4c93-b0bf-9a2a3ac58745",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stderr",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"2023-05-22 at 08:16:27 | INFO | Loading started.\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"\u001b]0;⊚slic\u0007could not set up DBusNotify: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stderr",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"2023-05-22 at 08:16:32 | INFO | Connected to stand server\n",
|
||||||
|
"2023-05-22 at 08:16:33 | INFO | Using undulator (Aramis) offset to PSSS energy of 13 eV.\n",
|
||||||
|
"2023-05-22 at 08:16:33 | INFO | Running at cristallina with pgroup p21147.\n",
|
||||||
|
"2023-05-22 at 08:16:33 | INFO | Loading finished.\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"%run cristallina.py"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "69ae9d05-4a12-40b0-b0a7-d5436eaf23ea",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"We recorded at 1 Hz with the CTA and 6000 repetions."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 3,
|
||||||
|
"id": "09065809-9077-46b1-8fea-a13c0a92e2a2",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"shots = 6000 # repetitions from CTA"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 5,
|
||||||
|
"id": "1713739a-6399-43fa-ad60-1ef2a0903d1a",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
|
||||||
|
"<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">array</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">120000</span>., <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">180000</span>., <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">240000</span>., <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">300000</span>., <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">360000</span>., <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">420000</span>., <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">480000</span>.,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">540000</span>.<span style=\"font-weight: bold\">])</span>\n",
|
||||||
|
"</pre>\n"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
"\n",
|
||||||
|
"\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m120000\u001b[0m., \u001b[1;36m180000\u001b[0m., \u001b[1;36m240000\u001b[0m., \u001b[1;36m300000\u001b[0m., \u001b[1;36m360000\u001b[0m., \u001b[1;36m420000\u001b[0m., \u001b[1;36m480000\u001b[0m.,\n",
|
||||||
|
" \u001b[1;36m540000\u001b[0m.\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"pids = shots*100\n",
|
||||||
|
"\n",
|
||||||
|
"missing = np.arange(2,10)*pids/10\n",
|
||||||
|
"missing\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "a15fc525-b909-43a1-a105-bf13272a3257",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Missing are the images from pids 12000 to 18000, 18000 to 24000 and so on. Already recorded are the first 60000.\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 24,
|
||||||
|
"id": "0b0d72f1-9528-4077-89f1-1476b4b74411",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"# with scratch pgroup:\n",
|
||||||
|
"\n",
|
||||||
|
"daq_test = SFAcquisition(\n",
|
||||||
|
" instrument,\n",
|
||||||
|
" \"p19150\",\n",
|
||||||
|
" default_channels=bs_channels,\n",
|
||||||
|
" default_pvs=pvs,\n",
|
||||||
|
" default_detectors=detectors,\n",
|
||||||
|
" rate_multiplicator=100,\n",
|
||||||
|
")\n",
|
||||||
|
"\n",
|
||||||
|
"slow_daq_test = SFAcquisition(\n",
|
||||||
|
" instrument,\n",
|
||||||
|
" \"p19150\",\n",
|
||||||
|
" default_channels=bs_channels,\n",
|
||||||
|
" default_pvs=pvs,\n",
|
||||||
|
" default_detectors=detectors,\n",
|
||||||
|
" rate_multiplicator=100,\n",
|
||||||
|
")\n",
|
||||||
|
"\n",
|
||||||
|
"slow_daq = SFAcquisition(\n",
|
||||||
|
" instrument,\n",
|
||||||
|
" pgroup,\n",
|
||||||
|
" default_channels=bs_channels,\n",
|
||||||
|
" default_pvs=pvs,\n",
|
||||||
|
" default_detectors=detectors,\n",
|
||||||
|
" rate_multiplicator=100,\n",
|
||||||
|
")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "d1db9525-bb0e-4c32-8aa5-752091928bbd",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"pgroup = \"p21147\" # SAXS\n",
|
||||||
|
"\n",
|
||||||
|
"if False:\n",
|
||||||
|
" res = daq.retrieve(\n",
|
||||||
|
" \"CTA_pulses\",\n",
|
||||||
|
" np.arange(CTA_sequence_start_PID, CTA_sequence_start_PID + n_pulses * 10),\n",
|
||||||
|
" run_number=run_number,\n",
|
||||||
|
" )"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"id": "77d93f9d-2a11-4059-966f-4640f1ea86b0",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"ename": "BrokerError",
|
||||||
|
"evalue": "An error happened on the server:\nUnknown error",
|
||||||
|
"output_type": "error",
|
||||||
|
"traceback": [
|
||||||
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||||
|
"\u001b[0;31mBrokerError\u001b[0m Traceback (most recent call last)",
|
||||||
|
"Cell \u001b[0;32mIn[11], line 5\u001b[0m\n\u001b[1;32m 1\u001b[0m CTA_sequence_start_PID \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m18111678900\u001b[39m\n\u001b[1;32m 3\u001b[0m length \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m200\u001b[39m\n\u001b[0;32m----> 5\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43mslow_daq_test\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mCTA_pulses\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marange\u001b[49m\u001b[43m(\u001b[49m\u001b[43mCTA_sequence_start_PID\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mCTA_sequence_start_PID\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mlength\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_number\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
|
||||||
|
"File \u001b[0;32m/gfa/.mounts/sf_cristallina/applications/slic/slic-package/slic/core/acquisition/sfacquisition.py:125\u001b[0m, in \u001b[0;36mSFAcquisition.retrieve\u001b[0;34m(self, filename, pulseids, run_number)\u001b[0m\n\u001b[1;32m 122\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_continuous(pulseids):\n\u001b[1;32m 123\u001b[0m params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mselected_pulse_ids\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m pulseids\n\u001b[0;32m--> 125\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\u001b[43mclient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maddress\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mclient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 127\u001b[0m res_run_number \u001b[38;5;241m=\u001b[39m res[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_number\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 128\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m res_run_number \u001b[38;5;241m==\u001b[39m run_number, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreceived \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mres_run_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m and expected \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrun_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m run numbers not identical\u001b[39m\u001b[38;5;124m\"\u001b[39m\n",
|
||||||
|
"File \u001b[0;32m/gfa/.mounts/sf_cristallina/applications/slic/slic-package/slic/core/acquisition/broker_client.py:251\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(address, *args, **kwargs)\u001b[0m\n\u001b[1;32m 249\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mretrieve\u001b[39m(address, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 250\u001b[0m requrl \u001b[38;5;241m=\u001b[39m address\u001b[38;5;241m.\u001b[39mrstrip(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/retrieve_from_buffers\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 251\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mpost_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequrl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 252\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\n\u001b[1;32m 253\u001b[0m run_number \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(response[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_number\u001b[39m\u001b[38;5;124m\"\u001b[39m]),\n\u001b[1;32m 254\u001b[0m acq_number \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(response[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124macquisition_number\u001b[39m\u001b[38;5;124m\"\u001b[39m]),\n\u001b[1;32m 255\u001b[0m total_acq_number \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(response[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124munique_acquisition_number\u001b[39m\u001b[38;5;124m\"\u001b[39m]),\n\u001b[1;32m 256\u001b[0m filenames \u001b[38;5;241m=\u001b[39m response[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfiles\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 257\u001b[0m )\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\n",
|
||||||
|
"File \u001b[0;32m/gfa/.mounts/sf_cristallina/applications/slic/slic-package/slic/core/acquisition/broker_client.py:275\u001b[0m, in \u001b[0;36mpost_request\u001b[0;34m(requrl, params, timeout)\u001b[0m\n\u001b[1;32m 273\u001b[0m params \u001b[38;5;241m=\u001b[39m json_validate(params)\n\u001b[1;32m 274\u001b[0m response \u001b[38;5;241m=\u001b[39m requests\u001b[38;5;241m.\u001b[39mpost(requrl, json\u001b[38;5;241m=\u001b[39mparams, timeout\u001b[38;5;241m=\u001b[39mtimeout)\u001b[38;5;241m.\u001b[39mjson()\n\u001b[0;32m--> 275\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mvalidate_response\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m)\u001b[49m\n",
|
||||||
|
"File \u001b[0;32m/gfa/.mounts/sf_cristallina/applications/slic/slic-package/slic/core/acquisition/broker_client.py:289\u001b[0m, in \u001b[0;36mvalidate_response\u001b[0;34m(resp)\u001b[0m\n\u001b[1;32m 287\u001b[0m message \u001b[38;5;241m=\u001b[39m resp\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmessage\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnknown error\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 288\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAn error happened on the server:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(message)\n\u001b[0;32m--> 289\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m BrokerError(msg)\n",
|
||||||
|
"\u001b[0;31mBrokerError\u001b[0m: An error happened on the server:\nUnknown error"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"CTA_sequence_start_PID = 18111678900\n",
|
||||||
|
"\n",
|
||||||
|
"length = 200\n",
|
||||||
|
"\n",
|
||||||
|
"res = slow_daq_test.retrieve(\n",
|
||||||
|
" \"CTA_pulses\",\n",
|
||||||
|
" np.arange(CTA_sequence_start_PID, CTA_sequence_start_PID + length),\n",
|
||||||
|
" run_number=None,\n",
|
||||||
|
" )"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"id": "0733b5e8-b7f0-4693-b772-670ee62d6e35",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"ename": "BrokerError",
|
||||||
|
"evalue": "An error happened on the server:\nUnknown error",
|
||||||
|
"output_type": "error",
|
||||||
|
"traceback": [
|
||||||
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||||
|
"\u001b[0;31mBrokerError\u001b[0m Traceback (most recent call last)",
|
||||||
|
"Cell \u001b[0;32mIn[11], line 6\u001b[0m\n\u001b[1;32m 2\u001b[0m CTA_sequence_start_PID \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m18111618800\u001b[39m\n\u001b[1;32m 4\u001b[0m length \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1000\u001b[39m\n\u001b[0;32m----> 6\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43mslow_daq\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mCTA_pulses\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marange\u001b[49m\u001b[43m(\u001b[49m\u001b[43mCTA_sequence_start_PID\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mCTA_sequence_start_PID\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mlength\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_number\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1120\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
|
||||||
|
"File \u001b[0;32m/gfa/.mounts/sf_cristallina/applications/slic/slic-package/slic/core/acquisition/sfacquisition.py:125\u001b[0m, in \u001b[0;36mSFAcquisition.retrieve\u001b[0;34m(self, filename, pulseids, run_number)\u001b[0m\n\u001b[1;32m 122\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_continuous(pulseids):\n\u001b[1;32m 123\u001b[0m params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mselected_pulse_ids\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m pulseids\n\u001b[0;32m--> 125\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\u001b[43mclient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maddress\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mclient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 127\u001b[0m res_run_number \u001b[38;5;241m=\u001b[39m res[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_number\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 128\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m res_run_number \u001b[38;5;241m==\u001b[39m run_number, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreceived \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mres_run_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m and expected \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrun_number\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m run numbers not identical\u001b[39m\u001b[38;5;124m\"\u001b[39m\n",
|
||||||
|
"File \u001b[0;32m/gfa/.mounts/sf_cristallina/applications/slic/slic-package/slic/core/acquisition/broker_client.py:251\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(address, *args, **kwargs)\u001b[0m\n\u001b[1;32m 249\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mretrieve\u001b[39m(address, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 250\u001b[0m requrl \u001b[38;5;241m=\u001b[39m address\u001b[38;5;241m.\u001b[39mrstrip(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/retrieve_from_buffers\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 251\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mpost_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequrl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 252\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\n\u001b[1;32m 253\u001b[0m run_number \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(response[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrun_number\u001b[39m\u001b[38;5;124m\"\u001b[39m]),\n\u001b[1;32m 254\u001b[0m acq_number \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(response[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124macquisition_number\u001b[39m\u001b[38;5;124m\"\u001b[39m]),\n\u001b[1;32m 255\u001b[0m total_acq_number \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(response[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124munique_acquisition_number\u001b[39m\u001b[38;5;124m\"\u001b[39m]),\n\u001b[1;32m 256\u001b[0m filenames \u001b[38;5;241m=\u001b[39m response[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfiles\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 257\u001b[0m )\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\n",
|
||||||
|
"File \u001b[0;32m/gfa/.mounts/sf_cristallina/applications/slic/slic-package/slic/core/acquisition/broker_client.py:275\u001b[0m, in \u001b[0;36mpost_request\u001b[0;34m(requrl, params, timeout)\u001b[0m\n\u001b[1;32m 273\u001b[0m params \u001b[38;5;241m=\u001b[39m json_validate(params)\n\u001b[1;32m 274\u001b[0m response \u001b[38;5;241m=\u001b[39m requests\u001b[38;5;241m.\u001b[39mpost(requrl, json\u001b[38;5;241m=\u001b[39mparams, timeout\u001b[38;5;241m=\u001b[39mtimeout)\u001b[38;5;241m.\u001b[39mjson()\n\u001b[0;32m--> 275\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mvalidate_response\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m)\u001b[49m\n",
|
||||||
|
"File \u001b[0;32m/gfa/.mounts/sf_cristallina/applications/slic/slic-package/slic/core/acquisition/broker_client.py:289\u001b[0m, in \u001b[0;36mvalidate_response\u001b[0;34m(resp)\u001b[0m\n\u001b[1;32m 287\u001b[0m message \u001b[38;5;241m=\u001b[39m resp\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmessage\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnknown error\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 288\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAn error happened on the server:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(message)\n\u001b[0;32m--> 289\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m BrokerError(msg)\n",
|
||||||
|
"\u001b[0;31mBrokerError\u001b[0m: An error happened on the server:\nUnknown error"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"CTA_sequence_start_PID = 18111678900\n",
|
||||||
|
"CTA_sequence_start_PID = 18111618800\n",
|
||||||
|
"\n",
|
||||||
|
"length = 1000\n",
|
||||||
|
"\n",
|
||||||
|
"res = slow_daq.retrieve(\n",
|
||||||
|
" \"CTA_pulses\",\n",
|
||||||
|
" np.arange(CTA_sequence_start_PID, CTA_sequence_start_PID + length),\n",
|
||||||
|
" run_number=1120,\n",
|
||||||
|
" )"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 40,
|
||||||
|
"id": "a0b1dece-021b-4bf5-9031-3db06c56b8fb",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"#CTA_sequence_start_PID = 18111678900\n",
|
||||||
|
"CTA_sequence_start_PID = 18111618800\n",
|
||||||
|
"CTA_sequence_start_PID = 18116377800\n",
|
||||||
|
"\n",
|
||||||
|
"CTA_sequence_start_PID = 18114660400 # works\n",
|
||||||
|
"CTA_sequence_start_PID = 18113444000 # fails \n",
|
||||||
|
"CTA_sequence_start_PID = 18114052200 # fails\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"CTA_sequence_start_PID = 18114660400 # works\n",
|
||||||
|
"\n",
|
||||||
|
"length = 60000\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"for start_pid in [18114720400, 18114780500, 18114840600, 18114900700, 18114960800,\n",
|
||||||
|
" 18115020900, 18115081000, 18115141100, 18115201200, 18115261300]:\n",
|
||||||
|
"\n",
|
||||||
|
" res = slow_daq.retrieve(\n",
|
||||||
|
" \"CTA_pulses\",\n",
|
||||||
|
" np.arange(start_pid, start_pid + length),\n",
|
||||||
|
" run_number=1129,\n",
|
||||||
|
" )"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 32,
|
||||||
|
"id": "684e664b-fe6d-404d-86b9-7a223fa990c3",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Advanced run number to 1129.\n",
|
||||||
|
"No detectors specified, using default detector list.\n",
|
||||||
|
"No PVs specified, using default PV list.\n",
|
||||||
|
"No channels specified, using default channel list.\n",
|
||||||
|
"\u001b[31m\u001b[1mOffline Channels:\n",
|
||||||
|
"-----------------\n",
|
||||||
|
"- SAR-CVME-TIFALL6:EvtSet\n",
|
||||||
|
"- SARFE10-PSSS059:FIT_ERR\n",
|
||||||
|
"- SARFE10-PSSS059:SPECTRUM_AVG_CENTER\n",
|
||||||
|
"- SARFE10-PSSS059:SPECTRUM_AVG_FWHM\n",
|
||||||
|
"- SARFE10-PSSS059:SPECTRUM_AVG_Y\n",
|
||||||
|
"\u001b[39m\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stderr",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
" 1%|██ | 2/200 [00:03<05:02, 1.5s/@]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"run number: 1129\n",
|
||||||
|
"acq number: 1\n",
|
||||||
|
"total acq number: 1970\n",
|
||||||
|
"\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stderr",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
|
||||||
|
"DAQTask: done\n",
|
||||||
|
"\n",
|
||||||
|
"Output files:\n",
|
||||||
|
"-------------\n",
|
||||||
|
"- <span style=\"color: #800080; text-decoration-color: #800080\">/sf/cristallina/data/p21147/raw/run1129/data/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">acq0001.PVDATA.h5</span>\n",
|
||||||
|
"- <span style=\"color: #800080; text-decoration-color: #800080\">/sf/cristallina/data/p21147/raw/run1129/data/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">acq0001.BSDATA.h5</span>\n",
|
||||||
|
"- <span style=\"color: #800080; text-decoration-color: #800080\">/sf/cristallina/data/p21147/raw/run1129/data/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">acq0001.JF16T03V01.h5</span>\n",
|
||||||
|
"</pre>\n"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
"\n",
|
||||||
|
"DAQTask: done\n",
|
||||||
|
"\n",
|
||||||
|
"Output files:\n",
|
||||||
|
"-------------\n",
|
||||||
|
"- \u001b[35m/sf/cristallina/data/p21147/raw/run1129/data/\u001b[0m\u001b[95macq0001.PVDATA.h5\u001b[0m\n",
|
||||||
|
"- \u001b[35m/sf/cristallina/data/p21147/raw/run1129/data/\u001b[0m\u001b[95macq0001.BSDATA.h5\u001b[0m\n",
|
||||||
|
"- \u001b[35m/sf/cristallina/data/p21147/raw/run1129/data/\u001b[0m\u001b[95macq0001.JF16T03V01.h5\u001b[0m\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"slow_daq.acquire('something', n_pulses=2)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 37,
|
||||||
|
"id": "3852ea6f-b014-402b-ba9c-fb5778a76e00",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
|
||||||
|
"<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">array</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114720400</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114780500</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114840600</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114900700</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114960800</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115020900</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115081000</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115141100</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115201200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115261300</span><span style=\"font-weight: bold\">])</span>\n",
|
||||||
|
"</pre>\n"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
"\n",
|
||||||
|
"\u001b[1;35marray\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m18114720400\u001b[0m, \u001b[1;36m18114780500\u001b[0m, \u001b[1;36m18114840600\u001b[0m, \u001b[1;36m18114900700\u001b[0m, \u001b[1;36m18114960800\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18115020900\u001b[0m, \u001b[1;36m18115081000\u001b[0m, \u001b[1;36m18115141100\u001b[0m, \u001b[1;36m18115201200\u001b[0m, \u001b[1;36m18115261300\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"np.array([[18114720400],\n",
|
||||||
|
" [18114780500],\n",
|
||||||
|
" [18114840600],\n",
|
||||||
|
" [18114900700],\n",
|
||||||
|
" [18114960800],\n",
|
||||||
|
" [18115020900],\n",
|
||||||
|
" [18115081000],\n",
|
||||||
|
" [18115141100],\n",
|
||||||
|
" [18115201200],\n",
|
||||||
|
" [18115261300]]).flatten()\n",
|
||||||
|
"\n",
|
||||||
|
"\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 38,
|
||||||
|
"id": "c4de9b27-2721-449b-a3e6-6658d3e611c8",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n",
|
||||||
|
"<span style=\"font-weight: bold\">[</span>\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114720400</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114780500</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114840600</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114900700</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18114960800</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115020900</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115081000</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115141100</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115201200</span>,\n",
|
||||||
|
" <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18115261300</span>\n",
|
||||||
|
"<span style=\"font-weight: bold\">]</span>\n",
|
||||||
|
"</pre>\n"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
"\n",
|
||||||
|
"\u001b[1m[\u001b[0m\n",
|
||||||
|
" \u001b[1;36m18114720400\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18114780500\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18114840600\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18114900700\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18114960800\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18115020900\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18115081000\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18115141100\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18115201200\u001b[0m,\n",
|
||||||
|
" \u001b[1;36m18115261300\u001b[0m\n",
|
||||||
|
"\u001b[1m]\u001b[0m\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"[18114720400, 18114780500, 18114840600, 18114900700, 18114960800,\n",
|
||||||
|
" 18115020900, 18115081000, 18115141100, 18115201200, 18115261300]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "a8be60a2-d85b-4cbc-8e8b-ffd749b09d15",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3 (ipykernel)",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.9.16"
|
||||||
|
},
|
||||||
|
"widgets": {
|
||||||
|
"application/vnd.jupyter.widget-state+json": {
|
||||||
|
"state": {},
|
||||||
|
"version_major": 2,
|
||||||
|
"version_minor": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
107
spreadsheet.py
107
spreadsheet.py
@ -8,10 +8,7 @@ class PVStringAdjustable(PVAdjustable):
|
|||||||
return self.pvs.readback.get(as_string=True).strip()
|
return self.pvs.readback.get(as_string=True).strip()
|
||||||
|
|
||||||
|
|
||||||
n_unds = [
|
n_unds = [6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22] # 14 is the CHIC
|
||||||
6, 7, 8, 9, 10, 11, 12, 13, # 14 is the CHIC
|
|
||||||
15, 16, 17, 18, 19, 20, 21, 22
|
|
||||||
]
|
|
||||||
|
|
||||||
# UND_NAME_FMT = "SARUN{:02}-UIND030"
|
# UND_NAME_FMT = "SARUN{:02}-UIND030"
|
||||||
# N_UND_CHIC = None
|
# N_UND_CHIC = None
|
||||||
@ -25,77 +22,71 @@ n_unds = [
|
|||||||
# undulator_info[f"polarisation{i}"] = PVEnumAdjustable(f"SARUN{i:02}-UIND030:POL-SET", internal=True)
|
# undulator_info[f"polarisation{i}"] = PVEnumAdjustable(f"SARUN{i:02}-UIND030:POL-SET", internal=True)
|
||||||
|
|
||||||
|
|
||||||
overview = SimpleDevice("Cristallina Overview",
|
overview = SimpleDevice(
|
||||||
OKHB154_X_trans = PVAdjustable("SAROP31-OKBH154:W_X.RBV", internal=True),
|
"Cristallina Overview",
|
||||||
OKHB154_Y_trans = PVAdjustable("SAROP31-OKBH154:W_Y.RBV", internal=True),
|
# OKHB154_X_trans = PVAdjustable("SAROP31-OKBH154:W_X.RBV", internal=True),
|
||||||
OKHB154_X_rot = PVAdjustable("SAROP31-OKBH154:W_RX.RBV", internal=True),
|
# OKHB154_Y_trans = PVAdjustable("SAROP31-OKBH154:W_Y.RBV", internal=True),
|
||||||
OKHB154_Y_rot = PVAdjustable("SAROP31-OKBH154:W_RY.RBV", internal=True),
|
# OKHB154_X_rot = PVAdjustable("SAROP31-OKBH154:W_RX.RBV", internal=True),
|
||||||
OKHB154_Z_rot = PVAdjustable("SAROP31-OKBH154:W_RZ.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),
|
||||||
OKBV153_X_trans = PVAdjustable("SAROP31-OKBV153:W_X.RBV", 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_Y_trans = PVAdjustable("SAROP31-OKBV153:W_Y.RBV", internal=True),
|
||||||
OKBV153_X_rot = PVAdjustable("SAROP31-OKBV153:W_RX.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_Y_rot = PVAdjustable("SAROP31-OKBV153:W_RY.RBV", internal=True),
|
||||||
OKBV153_Z_rot = PVAdjustable("SAROP31-OKBV153:W_RZ.RBV", internal=True),
|
# OKBV153_Z_rot = PVAdjustable("SAROP31-OKBV153:W_RZ.RBV", internal=True),
|
||||||
|
# ODMV152_X_trans = PVAdjustable("SAROP31-OKBV153:W_X.RBV", 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_Y_trans = PVAdjustable("SAROP31-OKBV153:W_Y.RBV", internal=True),
|
# ODMV152_X_rot = PVAdjustable("SAROP31-OKBV153:W_RX.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_Y_rot = PVAdjustable("SAROP31-OKBV153:W_RY.RBV", internal=True),
|
# ODMV152_COATING = PVAdjustable("SAROP31-ODMV152:COATING_SP", internal=True),
|
||||||
ODMV152_COATING = PVAdjustable("SAROP31-ODMV152:COATING_SP", internal=True),
|
|
||||||
|
|
||||||
OATA150_transmission=PVAdjustable("SAROP31-OATA150:TRANS_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_probe = PVAdjustable("SAROP31-PBPS149:MOTOR_PROBE.RBV", internal=True),
|
# PBPS149_motor_X1 = PVAdjustable("SAROP31-PBPS149:MOTOR_X1.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_motor_Y1 = PVAdjustable("SAROP31-PBPS149:MOTOR_Y1.RBV", internal=True),
|
# PBPS149_wafer = PVAdjustable("SAROP31-PBPS149:PROBE_SP", 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_hor_pos = PVAdjustable("SAROP31-OAPU149:MOTOR_X.VAL", internal=True),
|
# OAPU149_vert_pos = PVAdjustable("SAROP31-OAPU149:MOTOR_Y.VAL", internal=True),
|
||||||
OAPU149_hor_width = PVAdjustable("SAROP31-OAPU149:MOTOR_W.VAL", internal=True),
|
# OAPU149_vert_width = PVAdjustable("SAROP31-OAPU149:MOTOR_H.VAL", internal=True),
|
||||||
OAPU149_vert_pos = PVAdjustable("SAROP31-OAPU149:MOTOR_Y.VAL", internal=True),
|
# OAPU107_hor_pos = PVAdjustable("SAROP31-OAPU107:MOTOR_X.VAL", internal=True),
|
||||||
OAPU149_vert_width = PVAdjustable("SAROP31-OAPU149:MOTOR_H.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_hor_pos = PVAdjustable("SAROP31-OAPU107:MOTOR_X.VAL", internal=True),
|
# OAPU107_vert_width = PVAdjustable("SAROP31-OAPU107:MOTOR_H.VAL", internal=True),
|
||||||
OAPU107_hor_width = PVAdjustable("SAROP31-OAPU107:MOTOR_W.VAL", internal=True),
|
# OOMH084_X_trans = PVAdjustable("SAROP31-OOMH084:W_X.RBV", internal=True),
|
||||||
OAPU107_vert_pos = PVAdjustable("SAROP31-OAPU107:MOTOR_Y.VAL", internal=True),
|
# OOMH084_Y_trans = PVAdjustable("SAROP31-OOMH084:W_Y.RBV", internal=True),
|
||||||
OAPU107_vert_width = PVAdjustable("SAROP31-OAPU107:MOTOR_H.VAL", 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_X_trans = PVAdjustable("SAROP31-OOMH084:W_X.RBV", internal=True),
|
# OOMH084_Z_rot = PVAdjustable("SAROP31-OOMH084:W_RZ.RBV", internal=True),
|
||||||
OOMH084_Y_trans = PVAdjustable("SAROP31-OOMH084:W_Y.RBV", internal=True),
|
# OOMH084_COATING = PVAdjustable("SAROP31-OOMH084:COATING_SP", internal=True),
|
||||||
OOMH084_X_rot = PVAdjustable("SAROP31-OOMH084:W_RX.RBV", internal=True),
|
# OOMH067_X_trans = PVAdjustable("SAROP31-OOMH067:W_X.RBV", internal=True),
|
||||||
OOMH084_Y_rot = PVAdjustable("SAROP31-OOMH084:W_RY.RBV", internal=True),
|
# OOMH067_Y_trans = PVAdjustable("SAROP31-OOMH067:W_Y.RBV", internal=True),
|
||||||
OOMH084_Z_rot = PVAdjustable("SAROP31-OOMH084:W_RZ.RBV", internal=True),
|
# OOMH067_X_rot = PVAdjustable("SAROP31-OOMH067:W_RX.RBV", internal=True),
|
||||||
OOMH084_COATING = PVAdjustable("SAROP31-OOMH084:COATING_SP", 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_X_trans = PVAdjustable("SAROP31-OOMH067:W_X.RBV", internal=True),
|
# OOMH067_COATING = PVAdjustable("SAROP31-OOMH067:COATING_SP", internal=True),
|
||||||
OOMH067_Y_trans = PVAdjustable("SAROP31-OOMH067:W_Y.RBV", internal=True),
|
SMARACT_MINI_X=PVAdjustable("SARES30-MCS2750:MOT_2.RBV", internal=True),
|
||||||
OOMH067_X_rot = PVAdjustable("SAROP31-OOMH067:W_RX.RBV", internal=True),
|
SMARACT_MINI_Y=PVAdjustable("SARES30-MCS2750:MOT_3.RBV", internal=True),
|
||||||
OOMH067_Y_rot = PVAdjustable("SAROP31-OOMH067:W_RY.RBV", internal=True),
|
SMARACT_MINI_Z=PVAdjustable("SARES30-MCS2750:MOT_1.RBV", internal=True),
|
||||||
OOMH067_Z_rot = PVAdjustable("SAROP31-OOMH067:W_RZ.RBV", internal=True),
|
|
||||||
OOMH067_COATING = PVAdjustable("SAROP31-OOMH067:COATING_SP", internal=True),
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
spreadsheet_line = []
|
||||||
|
|
||||||
spreadsheet_line = [
|
|
||||||
]
|
|
||||||
|
|
||||||
@as_shortcut
|
@as_shortcut
|
||||||
def print_overview():
|
def print_overview():
|
||||||
print(overview)
|
print(overview)
|
||||||
|
|
||||||
|
|
||||||
@as_shortcut
|
@as_shortcut
|
||||||
def print_line_for_spreadsheet():
|
def print_line_for_spreadsheet():
|
||||||
ov = overview.__dict__
|
ov = overview.__dict__
|
||||||
|
|
||||||
def get(i):
|
def get(i):
|
||||||
if i in ov:
|
if i in ov:
|
||||||
return str(ov[i].get())
|
return str(ov[i].get())
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
res = [get(i) for i in spreadsheet_line]
|
res = [get(i) for i in spreadsheet_line]
|
||||||
res = ",".join(res)
|
res = ",".join(res)
|
||||||
print(res)
|
print(res)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user