Files
OpticsTools/sandbox.py

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)