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

132 lines
4.0 KiB
Python

import sys
#import re
#import numpy as np
#import copy
#import os
#import json
from datetime import datetime
import time
#from shutil import copyfile
#from os.path import isfile, join
from PyQt5 import QtWidgets,QtGui
from PyQt5.uic import loadUiType
#from PyQt5.QtGui import QPixmap, QTransform
#from PyQt5.QtWidgets import QMessageBox
from ui.OpticsToolsGui import Ui_OpticsGUI
from OpticsModel import Model
from OpticsMachine import Machine
from OpticsPlotting import OpticsPlotting
class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI):
def __init__(self,phase=0):
super(OpticsTools, self).__init__()
self.setupUi(self)
self.version = '1.0.1'
self.setWindowIcon(QtGui.QIcon("rsc/iconoptics.png"))
self.setWindowTitle("SwissFEL Optics Tools")
self.plot = OpticsPlotting()
self.plot.initmpl(self.mplvl, self.mplwindow)
# initialize online model
self.model = Model(phase)
if phase == 0:
self.machine = Machine()
else:
self.machine = None
# widget signals
self.UITrack.clicked.connect(self.track)
# all action for optics plotting
self.PBetax.toggled.connect(self.doplot)
self.PAlphax.toggled.connect(self.doplot)
self.PBetay.toggled.connect(self.doplot)
self.PAlphay.toggled.connect(self.doplot)
self.PEtax.toggled.connect(self.doplot)
self.PEtay.toggled.connect(self.doplot)
self.PR56.toggled.connect(self.doplot)
# self.PEnergy.toggled.connect(self.doplot)
self.PStart.editingFinished.connect(self.doplot)
self.PEnd.editingFinished.connect(self.doplot)
def track(self):
start = str(self.UITrackStart.text())
end = str(self.UITrackEnd.text())
twiss = {}
twiss['betax'] = float(str(self.UIBetax.text()))
twiss['betay'] = float(str(self.UIBetay.text()))
twiss['alphax'] = float(str(self.UIAlphax.text()))
twiss['alphay'] = float(str(self.UIAlphay.text()))
self.model.track(start,end,twiss)
self.updateOpticsTable()
def updateOpticsTable(self):
self.UITwissValues.clear()
if self.model.twiss is None:
return
res = self.model.twiss
if 'NAME' in res.keys():
nrow = len(res['NAME'])
if nrow == 0:
return
else:
return
ncol = len(res.keys())
self.UITwissValues.setColumnCount(ncol + 1)
self.UITwissValues.setRowCount(nrow)
for j,key in enumerate(res.keys()):
col = res[key]
self.UITwissValues.setHorizontalHeaderItem(j, QtWidgets.QTableWidgetItem(key))
for i,val in enumerate(col):
if j == 0:
self.UITwissValues.setItem(i, j, QtWidgets.QTableWidgetItem(val))
else:
self.UITwissValues.setItem(i, j, QtWidgets.QTableWidgetItem('%10.6f' % val))
self.UITwissValues.resizeColumnsToContents()
self.UITwissValues.verticalHeader().hide()
self.UITwissValues.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
def doplot(self):
if self.model.twiss is None:
return
zstart=float(str(self.PStart.text()))
zend=float(str(self.PEnd.text()))
filt={}
filt['BETX']=self.PBetax.isChecked()
filt['BETY']=self.PBetay.isChecked()
filt['ALFX']=self.PAlphax.isChecked()
filt['ALFY']=self.PAlphay.isChecked()
filt['DX']=self.PEtax.isChecked()
filt['DY']=self.PEtay.isChecked()
filt['RE56']=self.PR56.isChecked()
filt['Energy']=self.PEnergy.isChecked()
self.plot.plot(self.model.twiss,filt,zstart,zend)
# --------------------------------
# Main routine
if __name__ == '__main__':
QtWidgets.QApplication.setStyle(QtWidgets.QStyleFactory.create("plastique"))
app = QtWidgets.QApplication(sys.argv)
if len(sys.argv) > 1:
arg=int(sys.argv[1])
else:
arg=0
main = OpticsTools()
main.show()
sys.exit(app.exec_())