224 lines
8.2 KiB
Python
224 lines
8.2 KiB
Python
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
import numpy as np
|
|
import re
|
|
|
|
CGrey = QtGui.QColor(230,230,230)
|
|
CBeige = QtGui.QColor(250, 240, 200)
|
|
CGreen = QtGui.QColor(100, 255, 100)
|
|
CYellow = QtGui.QColor(255, 255, 0)
|
|
CRed = QtGui.QColor(255, 100, 100)
|
|
CWhite = QtGui.QColor(255, 255, 255)
|
|
|
|
class Sandbox:
|
|
def __init__(self, parent=None,machine=False):
|
|
self.parent=parent
|
|
self.machine=machine
|
|
self.parent.MagReStart.editingFinished.connect(self.updateSandbox)
|
|
self.parent.MagReFilter.editingFinished.connect(self.updateSandbox)
|
|
self.parent.Mach2ModMag.clicked.connect(self.updateModelEvent)
|
|
self.parent.SB2ModMag.clicked.connect(self.updateModelEvent)
|
|
self.parent.Mach2ModUnd.clicked.connect(self.updateModelEvent)
|
|
self.parent.SB2ModUnd.clicked.connect(self.updateModelEvent)
|
|
|
|
def updateModelEvent(self):
|
|
if self.parent.sender() is self.parent.Mach2ModMag:
|
|
self.updateModel(self.parent.MagSB,2,True)
|
|
elif self.parent.sender() is self.parent.SB2ModMag:
|
|
self.updateModel(self.parent.MagSB, 1, True)
|
|
elif self.parent.sender() is self.parent.Mach2ModUnd:
|
|
self.updateModel(self.parent.UndSB, 3, False)
|
|
self.updateModel(self.parent.RFSB, 3, False)
|
|
elif self.parent.sender() is self.parent.SB2ModUnd:
|
|
self.updateModel(self.parent.UndSB, 1, False)
|
|
self.updateModel(self.parent.RFSB, 1, False)
|
|
|
|
|
|
def updateModel(self,sb,col,single):
|
|
for i in range(sb.rowCount()):
|
|
field=str(sb.item(i,0).text())
|
|
val = str(sb.item(i, col).text())
|
|
if val == '---':
|
|
continue
|
|
if single:
|
|
val = [val]
|
|
else:
|
|
val = [val,str(sb.item(i+1,col).text())]
|
|
self.parent.model.updateElement(field.replace('-','.'),val)
|
|
self.updateSandbox()
|
|
|
|
|
|
def updateSandbox(self):
|
|
machine = self.parent.machine.getMachineStatus()
|
|
model = self.parent.model.getSettings()
|
|
self.updateMagSandbox(self.parent.MagSB,model,machine['Magnet'])
|
|
self.updateUndSandbox(self.parent.UndSB,model,machine['Undulator'])
|
|
self.updateRFSandbox(self.parent.RFSB, model, machine['RF'])
|
|
self.updateEnergySandbox(model['Energy'],machine['Energy'])
|
|
|
|
def updateEnergySandbox(self,model,machine):
|
|
E0=1.e-6*model['energy']
|
|
self.parent.SBE0Model.setText('%7.3f' % E0)
|
|
E0 = None
|
|
for key in machine.keys():
|
|
E0 = machine[key]
|
|
if E0 is None:
|
|
self.parent.SBE0Machine.setText("---")
|
|
else:
|
|
self.parent.SBE0Machine.setText('%7.3f' % E0)
|
|
|
|
def updateSandboxCommon(self,sb,values,colors,labels):
|
|
sb.clear()
|
|
ncol = len(labels)
|
|
nrow = len(values)
|
|
sb.setColumnCount(ncol)
|
|
sb.setRowCount(nrow)
|
|
for i in range(ncol):
|
|
sb.setHorizontalHeaderItem(i, QtWidgets.QTableWidgetItem(labels[i]))
|
|
for irow,value in enumerate(values):
|
|
color=colors[irow]
|
|
for icol in range(ncol):
|
|
sb.setItem(irow, icol, QtWidgets.QTableWidgetItem(value[icol]))
|
|
sb.item(irow, icol).setBackground(color[icol])
|
|
sb.resizeColumnsToContents()
|
|
sb.verticalHeader().hide()
|
|
|
|
|
|
def updateRFSandbox(self,sb,model,machine):
|
|
labels = ['Station', 'Model', 'Model', 'Machine', 'Machine']
|
|
values = []
|
|
colors = []
|
|
for key in machine.keys():
|
|
sbvalue = [key[0:7]+'-RSYS']
|
|
sbcolor = [CWhite]
|
|
mokey = key[0:7]+'.RACC100'
|
|
scl=1.
|
|
if 'CB' in mokey:
|
|
scl = 4
|
|
elif 'SINSB03' in mokey or 'SINSB04' in mokey or 'SINXB' in mokey:
|
|
scl = 2
|
|
|
|
if mokey in model['RF'].keys():
|
|
Grad=1e-6*model['RF'][mokey]['Gradient']*scl
|
|
Phase= model['RF'][mokey]['Phase']
|
|
sbvalue+=['%7.3f' % Grad,'%7.3f' % Phase]
|
|
sbcolor += [CBeige, CBeige]
|
|
else:
|
|
sbvalue += ['---', '---']
|
|
sbcolor += [CGrey, CGrey]
|
|
value = machine[key]
|
|
if value[0] is None:
|
|
sbvalue += ['---', '---']
|
|
sbcolor += [CGrey, CGrey]
|
|
else:
|
|
sbvalue += ['%f' % machine[key]['Gradient'], '%f' % machine[key]['Phase']]
|
|
sbcolor += [CBeige, CBeige]
|
|
values.append(sbvalue)
|
|
colors.append(sbcolor)
|
|
self.updateSandboxCommon(sb, values, colors, labels)
|
|
|
|
def updateUndSandbox(self,sb,model,machine,):
|
|
labels = ['Undulator', 'Model', 'Model', 'Machine', 'Machine']
|
|
values=[]
|
|
colors=[]
|
|
pol = ['LH', 'LV+', 'LV-', 'C+', 'C-', 'ZL']
|
|
for key in machine.keys():
|
|
sbvalue=[key]
|
|
sbcolor=[CWhite]
|
|
mokey = key.replace('-', '.')
|
|
if 'UMOD' in mokey:
|
|
if 'SATDI' in mokey:
|
|
mokey = mokey + '050'
|
|
else:
|
|
mokey = mokey + '030'
|
|
if mokey in model['Undulator'].keys():
|
|
value = model['Undulator'][mokey]
|
|
K = '%7.3f' % value['K']
|
|
kx = value['kx']
|
|
ky = value['ky']
|
|
if np.abs(kx - 1) < 0.1:
|
|
Pol = 'LV'
|
|
elif np.abs(ky - 1) < 0.1:
|
|
Pol = 'LH'
|
|
elif np.abs(kx - ky) < 0.1:
|
|
Pol = 'C'
|
|
else:
|
|
Pol = 'undef'
|
|
sbvalue+=[K,Pol]
|
|
sbcolor+=[CBeige,CBeige]
|
|
else:
|
|
sbvalue+=['---','---']
|
|
sbcolor+=[CGrey,CGrey]
|
|
value = machine[key]
|
|
# machine
|
|
if value[0] is None:
|
|
sbvalue +=['---','---']
|
|
sbcolor += [CGrey, CGrey]
|
|
else:
|
|
sbvalue += ['%7.3f' % value[0], pol[int(value[1])]]
|
|
sbcolor += [CBeige,CBeige]
|
|
values.append(sbvalue)
|
|
colors.append(sbcolor)
|
|
self.updateSandboxCommon(sb,values,colors,labels)
|
|
|
|
def updateMagSandbox(self,sb,magnets,machine):
|
|
labels = ['Magnet', 'Model', 'Machine']
|
|
filt = str(self.parent.MagReStart.text())
|
|
found = False
|
|
if filt == '' or filt == '*':
|
|
found = True
|
|
regpat = re.compile(filt)
|
|
filt2 = str(self.parent.MagReFilter.text())
|
|
filt2 = '.*' + filt2
|
|
regpat2 = re.compile(filt2)
|
|
|
|
values = []
|
|
colors=[]
|
|
|
|
for key in machine.keys():
|
|
if regpat.match(key):
|
|
found = True
|
|
if not (found and regpat2.match(key)):
|
|
continue
|
|
sbval=[key]
|
|
sbcol=[CWhite]
|
|
|
|
maval = machine[key]
|
|
moval=None
|
|
mokey = key.replace('-','.')
|
|
if 'MQUA' in key and mokey in magnets['Quadrupole'].keys():
|
|
moval = magnets['Quadrupole'][mokey]['k1L']
|
|
if 'MQSK' in key and mokey in magnets['Quadrupole'].keys():
|
|
moval = magnets['Quadrupole'][mokey]['k1L']
|
|
if 'MSEX' in key and mokey in magnets['Sextupole'].keys():
|
|
moval = magnets['Sextupole'][mokey]['k2L']
|
|
if 'MBND' in key and mokey in magnets['Dipole'].keys():
|
|
moval = magnets['Dipole'][mokey]['angle']
|
|
|
|
|
|
if moval is None: # model
|
|
sbval.append('---')
|
|
sbcol.append(CGrey)
|
|
else:
|
|
sbval.append('%7.3f' % moval)
|
|
sbcol.append(CBeige)
|
|
|
|
if maval is None: # machine
|
|
sbval.append('---')
|
|
sbcol.append(CGrey)
|
|
else:
|
|
sbval.append('%7.3' % maval)
|
|
if moval is None:
|
|
sbcol.append(CGrey)
|
|
else:
|
|
df = np.abs(moval-maval)
|
|
if df < 0.001:
|
|
sbcol.append(CGreen)
|
|
elif df < 0.01:
|
|
sbcol.append(CYellow)
|
|
else:
|
|
sbcol.append(CRed)
|
|
values.append(sbval)
|
|
colors.append(sbcol)
|
|
self.updateSandboxCommon(sb, values, colors, labels)
|
|
|