Files
OpticsTools/machine.py
2026-01-26 12:51:49 +01:00

100 lines
4.0 KiB
Python

import re
import numpy as np
from epics import PV
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 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