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