120 lines
4.6 KiB
Python
120 lines
4.6 KiB
Python
import re
|
|
import numpy as np
|
|
from epics import PV,caput_many
|
|
|
|
class Machine:
|
|
def __init__(self, parent=None, office=False):
|
|
self.parent=parent
|
|
self.offline = office
|
|
self.PVs={}
|
|
self.PVNames = []
|
|
|
|
|
|
def initPVs(self,elements=None):
|
|
filters = ['-RMSM:SM-SET', '-RSYS:REQUIRED-OP', '-RSYS:SET-ACC-VOLT', '-RSYS:SET-BEAM-PHASE']
|
|
self.PVNames.clear()
|
|
for ele0 in elements:
|
|
ele = ele0.Name.replace('.','-').upper()
|
|
if 'MQUA' in ele or 'MQSK' in ele:
|
|
self.PVNames += [ele+':K1L-SET']
|
|
if 'MSEX' in ele:
|
|
self.PVNames += [ele+':K2L-SET']
|
|
if 'MBND' in ele:
|
|
if 'MBND100' in ele:
|
|
self.PVNames += [ele + ':K0L-SET']
|
|
elif 'SATMA01-MBND300' in ele:
|
|
self.PVNames += [ele + ':K0L-SET']
|
|
if 'RACC100' in ele:
|
|
name=ele[0:7]
|
|
self.PVNames += [name + filter for filter in filters]
|
|
if 'UMOD' in ele:
|
|
self.PVNames += [ele[0:7] + '-UMOD:K-SET']
|
|
if 'UIND' in ele:
|
|
if 'SARUN' in ele:
|
|
self.PVNames += [ele + ':K_UND_SET']
|
|
elif 'SATUN' in ele:
|
|
self.PVNames += [ele + ':K_READ', ele + ':POL-SET']
|
|
elif 'SINLH' in ele:
|
|
self.PVNames += [ele + ':K-SP', ele + ':X-SP']
|
|
self.PVNames += ['SINLH02-MBND100:ENERGY-OP']
|
|
|
|
if self.offline:
|
|
self.PVs = {ele: None for ele in self.PVNames}
|
|
else:
|
|
self.PVs={ele:PV(ele, auto_monitor=False) for ele in self.PVNames}
|
|
|
|
def setMagnets(self,vals):
|
|
pvs=[]
|
|
val=[]
|
|
for ele in vals.keys():
|
|
val.append(vals[ele])
|
|
if 'MQUA' in ele or 'MQSK' in ele:
|
|
pvs.append(ele+':K1L-SET')
|
|
if 'MSEX' in ele:
|
|
pvs.append(ele + ':K2L-SET')
|
|
if 'MBND' in ele:
|
|
pvs.append(ele + ':K0L-SET')
|
|
if self.offline:
|
|
print('####################################')
|
|
print('Program is in offline mode')
|
|
print('Any machine settings ar enot applied')
|
|
return
|
|
caput_many(pvs,val)
|
|
|
|
|
|
|
|
def getMachineStatus(self):
|
|
print('offline:',self.offline)
|
|
if self.offline:
|
|
values = {ele: self.PVs[ele] for ele in self.PVs.keys()}
|
|
else:
|
|
values = {ele:self.PVs[ele].get() for ele in self.PVs.keys()}
|
|
|
|
magnets={}
|
|
rf = {}
|
|
und={}
|
|
energy={}
|
|
for key in self.PVs.keys():
|
|
if 'MQUA' in key or 'MQSK' in key or 'MSEX' in key:
|
|
magnets[key[0:15]]=values[key]
|
|
if 'MBND' in key and 'K0L-SET' in key:
|
|
if 'SINBC' in key or 'SINLH' in key or 'S10BC' in key or 'SATMA' in key or 'SATUN' in key:
|
|
if values[key] is None:
|
|
magnets[key[0:15]] = values[key]
|
|
else:
|
|
magnets[key[0:15]] = values[key]*180./np.pi
|
|
if 'UMOD' in key:
|
|
und[key[0:12]]=[values[key],0.]
|
|
if 'UIND' in key:
|
|
if 'SARUN' in key:
|
|
und[key[0:15]]=[values[key],0]
|
|
elif 'SATUN' in key and 'K_READ' in key:
|
|
und[key[0:15]]=[values[key],values[key.replace('K_READ','POL-SET')]]
|
|
elif 'SINLH' in key and 'K-SP' in key:
|
|
x = values[key.replace('K-SP','X-SP')]
|
|
if x is None:
|
|
und[key[0:15]] = [None,0]
|
|
elif x < -100:
|
|
und[key[0:15]]=[0,0]
|
|
else:
|
|
und[key[0:15]] = [values[key], 0]
|
|
if 'RMSM' in key:
|
|
if values[key]is None:
|
|
rf[key[0:7]+'-RSYS']=[None,0]
|
|
elif values[key]<9:
|
|
rf[key[0:7]+'-RSYS']=[0,0]
|
|
else:
|
|
# ['-RMSM:SM-SET', '-RSYS:REQUIRED-OP', '-RSYS:SET-ACC-VOLT', '-RSYS:SET-BEAM-PHASE']
|
|
key = key.replace('RMSM:SM-SET','RSYS:REQUIRED-OP')
|
|
if values[key] == 0:
|
|
rf[key[0:7] + '-RSYS'] = [0, 0]
|
|
else:
|
|
key1 = key.replace('REQUIRED-OP','SET-ACC-VOLT')
|
|
key2 = key.replace('REQUIRED-OP','SET-BEAM-PHASE')
|
|
rf[key[0:7] + '-RSYS'] = [values[key1], values[key2]]
|
|
if 'ENERGY-OP' in key:
|
|
energy[key[0:15]]=values[key]
|
|
|
|
status={'Magnet':magnets,'RF':rf,'Undulator':und,'Energy':energy}
|
|
return status
|