From 68e39be72577ebfbde02d12f06b6e601a8d6c572 Mon Sep 17 00:00:00 2001 From: reiche Date: Fri, 25 Apr 2025 16:02:46 +0200 Subject: [PATCH] Initial Commit --- OpticsMachine.py | 25 + OpticsModel.py | 36 + OpticsPlotting.py | 158 +++ OpticsTools.py | 131 +++ rsc/iconoptics.png | Bin 0 -> 44665 bytes ui/OpticsToolsGui.py | 1440 +++++++++++++++++++++++ ui/OpticsToolsGui.ui | 2591 ++++++++++++++++++++++++++++++++++++++++++ updateGui.sh | 2 + 8 files changed, 4383 insertions(+) create mode 100644 OpticsMachine.py create mode 100644 OpticsModel.py create mode 100644 OpticsPlotting.py create mode 100644 OpticsTools.py create mode 100644 rsc/iconoptics.png create mode 100644 ui/OpticsToolsGui.py create mode 100644 ui/OpticsToolsGui.ui create mode 100755 updateGui.sh diff --git a/OpticsMachine.py b/OpticsMachine.py new file mode 100644 index 0000000..be7a58c --- /dev/null +++ b/OpticsMachine.py @@ -0,0 +1,25 @@ +import re +import sys +from typing import is_typeddict + +sys.path.append('/sf/bd/packages/sfbd') +from sfbd.interface import getSnapPV,getSnapVal + +from epics import PV + +class Machine: + def __init__(self): + print('Initializing PVs for Snapshot...') + mags = ['SINLH02-MBND100', 'SINBC02-MBND100', 'S10BC02-MBND100', 'SARCL02-MBND100', 'SATCL01-MBND100', + 'SATUN05-MBND100'] + self.snapPVs = getSnapPV() + [PV('%s:ENERGY-OP' % ele, auto_monitor=False) for ele in mags] + self.omfilter = ['.*-RMSM:SM-SET','.*-RSYS:REQUIRED-OP','.*-RSYS:SET-ACC-VOLT','.*-RSYS:SET-BEAM-PHASE'] + + + + def getSnap(self,filters = ['.*']): + if isinstance(filters, str): + filters = [filters] + recomp = re.compile('|'.join(filters)) + pvget = [pv for pv in self.snapPVs if recomp.match(pv.pvname)] + self.snap = getSnapVal(pvget) \ No newline at end of file diff --git a/OpticsModel.py b/OpticsModel.py new file mode 100644 index 0000000..2bb8e61 --- /dev/null +++ b/OpticsModel.py @@ -0,0 +1,36 @@ +import sys +import numpy as np + +sys.path.append('/sf/bd/packages/onlinemodel') +from onlinemodel.core import Facility +from onlinemodel.code import MadX + +class Model: + def __init__(self, phase, debug=False): + print('Initializing online model ...') + self.phase = phase # current planned future + self.om = Facility(phase) + self.madx = MadX() + self.twiss = None + + def update(self, snap) -> None: + self.om.updateModel(snap,True) + + def track(self, start,end,twiss): + destination = 'ARAMIS' + start0 = start[0:7] + end0 = end[0:7] + if 'SPO' in end: + destination = 'PORTHOS' + elif 'SAT' in end: + destination = 'ATHOS' + elif 'S10BD' in end: + destination = 'INJECTOR' + self.om.setBranch(destination,start0,end0) + self.madx.setInitialCondition(twiss['betax'],twiss['betay'],twiss['alphax'],twiss['alphay'],150.) + if len(start) <8: + start = '#s' + if len(end) < 8: + end = '#e' + self.madx.track(self.om,False,start,end) + self.twiss = self.madx.getTwiss() diff --git a/OpticsPlotting.py b/OpticsPlotting.py new file mode 100644 index 0000000..733d9da --- /dev/null +++ b/OpticsPlotting.py @@ -0,0 +1,158 @@ +#!/opt/gfa/python-3.5/latest/bin/python + +import sys +import datetime +import os.path +import time +from os import walk +import numpy as np +import sys +import re + + +from matplotlib.figure import Figure +import matplotlib.patches as patches + +from matplotlib.backends.backend_qt5agg import ( + FigureCanvasQTAgg as FigureCanvas, + NavigationToolbar2QT as NavigationToolbar) + + + + +class OpticsPlotting: + + def initmpl(self,mplvl,mplwindow): + self.fig=Figure() + self.axes=self.fig.add_subplot(111) + self.axes2 = self.axes.twinx() + self.canvas = FigureCanvas(self.fig) + mplvl.addWidget(self.canvas) + self.canvas.draw() + self.toolbar=NavigationToolbar(self.canvas,mplwindow, coordinates=True) + mplvl.addWidget(self.toolbar) + + + def plotSingle(self,x,y,color,legend,dashed=False): + + if dashed: + self.axes.plot(x,y,'--',color=color,label=legend) + else: + self.axes.plot(x,y,color=color,label=legend) + + + + + def plot(self,data,filt,z0,z1): + + self.axes.clear() + self.axes2.clear() + + s=np.array(data['S']) + if z0>z1: + tmp=z1 + z1=z0 + z0=tmp + + i1=np.argmin(np.abs(s-z0)) + i2=np.argmin(np.abs(s-z1)) + + ylabel=r'' + if filt['BETX']: + self.plotSingle(s[i1:i2],data['BETX'][i1:i2],(0,0,1,1),r'$\beta_{x}$') + ylabel=ylabel+r'$\beta_x$ (m), ' + if filt['BETY']: + self.plotSingle(s[i1:i2],data['BETY'][i1:i2],(1,0,0,1),r'$\beta_{y}$') + ylabel=ylabel+r'$\beta_y$ (m), ' + if filt['ALFX']: + self.plotSingle(s[i1:i2],data['ALFX'][i1:i2],(0,0,1,1),r'$\alpha_{x}$') + ylabel=ylabel+r'$\alpha_x$ (rad), ' + if filt['ALFY']: + self.plotSingle(s[i1:i2],data['ALFY'][i1:i2],(1,0,0,1),r'$\alpha_{y}$') + ylabel=ylabel+r'$\alpha_y$ (rad), ' + if filt['DX']: + self.plotSingle(s[i1:i2],data['DX'][i1:i2],(0,0,1,1),r'$\eta_{x}$') + ylabel=ylabel+r'$\eta_x$ (m), ' + if filt['DY']: + self.plotSingle(s[i1:i2],data['DY'][i1:i2],(1,0,0,1),r'$\eta_{y}$') + ylabel=ylabel+r'$\eta_y$ (m), ' + if filt['RE56']: + self.plotSingle(s[i1:i2],data['RE56'][i1:i2],(0,0,0,1),r'$R_{56}$') + ylabel=ylabel+r'$R_{56}$ (m), ' + if filt['Energy']: + self.plotSingle(s[i1:i2],data['Energy'][i1:i2],(0,1,0,1),r'$E$') + ylabel=ylabel+r'$E$ (MeV), ' + + + if len(ylabel) < 3: + self.canvas.draw() + return + + self.axes.legend(bbox_to_anchor=(0.15,0.85)) + self.axes.set_xlabel('s (m)') + self.axes.set_ylabel(ylabel[0:-2]) + + self.plotLayout(s,data['NAME']) + self.axes.set_xlim([s[i1],s[i2]]) + ylim=self.axes.get_ylim() + dl=np.abs(ylim[1]-ylim[0]) + yl=[ylim[0],ylim[1]+0.2*dl] + self.axes.set_ylim(yl) + self.axes2.set_xlim([s[i1],s[i2]]) + self.canvas.draw() + + return + + + + def plotLayout(self,s,elements): + splitquads=False + sstart=0 + + s1=[np.min(s),np.max(s)] + s2=[0.9,0.9] + self.axes2.plot(s1,s2,'k') + for i,name in enumerate(elements): + if 'MBND' in name: + s1=s[i-1] + s2=s[i] + self.axes2.add_patch(patches.Rectangle((s1, 0.9), (s2-s1),0.03,facecolor='blue',edgecolor="none")) + if 'MSEX' in name: + s1=s[i-1] + s2=s[i] + self.axes2.add_patch(patches.Rectangle((s1, 0.87), (s2-s1),0.06,facecolor='green',edgecolor="none")) + + if 'UIND' in name: + s1=s[i-1] + s2=s[i] + self.axes2.add_patch(patches.Rectangle((s1, 0.88), (s2-s1),0.04,facecolor='purple',edgecolor="none")) + + if 'ACC' in name or 'TDS' in name: + s1=s[i-1] + s2=s[i] + self.axes2.add_patch(patches.Rectangle((s1, 0.89), (s2-s1),0.02,facecolor='cyan',edgecolor="none")) + + if 'MQUA' in name: + if splitquads == True: + if 'END' in name: + s1=sstart + s2=s[i] + self.axes2.add_patch(patches.Rectangle((s1, 0.85), (s2-s1),0.1,facecolor='red',edgecolor="none")) + splitquads=False + else: + if 'START' in name: + splitquads=True + sstart=s[i] + else: + s1=s[i-1] + s2=s[i] + self.axes2.add_patch(patches.Rectangle((s1, 0.85), (s2-s1),0.1,facecolor='red',edgecolor="none")) + + self.axes2.set_ylim([0,1]) + self.axes2.yaxis.set_visible(False) + return + + + + +# \ No newline at end of file diff --git a/OpticsTools.py b/OpticsTools.py new file mode 100644 index 0000000..7093fd1 --- /dev/null +++ b/OpticsTools.py @@ -0,0 +1,131 @@ +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_()) diff --git a/rsc/iconoptics.png b/rsc/iconoptics.png new file mode 100644 index 0000000000000000000000000000000000000000..55ec3d63782fd9278771c748ca5b22225d3be824 GIT binary patch literal 44665 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 Machine")) + self.Mach2ModMag.setText(_translate("OpticsGUI", "Model <- Sandbox <- Machine")) + self.SB2ModMag.setText(_translate("OpticsGUI", "Model <- Sandbox")) + self.groupBox_9.setTitle(_translate("OpticsGUI", "Undulator/ID (K/Gap and Pol./Offset")) + self.Mach2ModUnd.setText(_translate("OpticsGUI", "Model <- Sandbox <- Machine")) + self.SB2ModUnd.setText(_translate("OpticsGUI", "Model <- Sandbox")) + self.RFgroup.setTitle(_translate("OpticsGUI", "RF (Gradient and Phase)")) + self.label_25.setText(_translate("OpticsGUI", "Initial Energy (MeV)")) + self.label_26.setText(_translate("OpticsGUI", "Model")) + self.label_27.setText(_translate("OpticsGUI", "Machine")) + self.Mach2ModRF.setText(_translate("OpticsGUI", "Model <- Sandbox <- Machine")) + self.SB2ModRF.setText(_translate("OpticsGUI", "Model <- Sandbox")) + self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_8), _translate("OpticsGUI", "Settings Sandbox")) + self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_4), _translate("OpticsGUI", "Optics Functions")) + self.label_8.setText(_translate("OpticsGUI", "Script")) + self.EditorFile.setText(_translate("OpticsGUI", "NewFile.madx")) + self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_5), _translate("OpticsGUI", "Script Editor")) + self.EleDist.setTitle(_translate("OpticsGUI", "Distribution")) + self.label_7.setText(_translate("OpticsGUI", "Charge")) + self.label_9.setText(_translate("OpticsGUI", "Energy")) + self.label_10.setText(_translate("OpticsGUI", "Energy Spread")) + self.label_11.setText(_translate("OpticsGUI", "Bunch Duration")) + self.label_12.setText(_translate("OpticsGUI", "Emittance in X")) + self.label_13.setText(_translate("OpticsGUI", "Emittance in Y")) + self.label_14.setText(_translate("OpticsGUI", "Beta in X")) + self.label_15.setText(_translate("OpticsGUI", "Beta in Y")) + self.label_16.setText(_translate("OpticsGUI", "Alpha in X")) + self.label_17.setText(_translate("OpticsGUI", "Alpha in Y")) + self.EleParm.setTitle(_translate("OpticsGUI", "Elegant Parameters")) + self.label_18.setText(_translate("OpticsGUI", "Downsample Rate")) + self.EleSampleRate.setText(_translate("OpticsGUI", "1")) + self.EleLSC.setText(_translate("OpticsGUI", "Exclude Space Charge")) + self.EleCSR.setText(_translate("OpticsGUI", "Exclude CSR")) + self.EleCenter.setText(_translate("OpticsGUI", "Center Bunch after Chicanes")) + self.EleDumpDist.setText(_translate("OpticsGUI", "Generate Dump at Following Locations")) + __sortingEnabled = self.EleDumpList.isSortingEnabled() + self.EleDumpList.setSortingEnabled(False) + item = self.EleDumpList.item(0) + item.setText(_translate("OpticsGUI", "SINLH03-DBPM010")) + item = self.EleDumpList.item(1) + item.setText(_translate("OpticsGUI", "SINSB04-DBPM220")) + item = self.EleDumpList.item(2) + item.setText(_translate("OpticsGUI", "SINBC01-DBPM100")) + item = self.EleDumpList.item(3) + item.setText(_translate("OpticsGUI", "SINDI01-DBPM010")) + item = self.EleDumpList.item(4) + item.setText(_translate("OpticsGUI", "S10BC01-DBPM090")) + item = self.EleDumpList.item(5) + item.setText(_translate("OpticsGUI", "S10MA01-DBPM010")) + item = self.EleDumpList.item(6) + item.setText(_translate("OpticsGUI", "S20SY01-DBPM060")) + item = self.EleDumpList.item(7) + item.setText(_translate("OpticsGUI", "SARCL01-DBPM010")) + item = self.EleDumpList.item(8) + item.setText(_translate("OpticsGUI", "SARMA02-DBPM110")) + self.EleDumpList.setSortingEnabled(__sortingEnabled) + self.EleDumpAdd.setText(_translate("OpticsGUI", "Add")) + self.EleDumpRemove.setText(_translate("OpticsGUI", "Remove")) + self.EleNewDump.setText(_translate("OpticsGUI", "New Beamline Element")) + self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_6), _translate("OpticsGUI", "Elegant Configuration")) + self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab), _translate("OpticsGUI", "Log")) + self.menuFile.setTitle(_translate("OpticsGUI", "File")) + self.menuRun.setTitle(_translate("OpticsGUI", "MadX")) + self.menuHelp.setTitle(_translate("OpticsGUI", "Help")) + self.menuEdit.setTitle(_translate("OpticsGUI", "Edit")) + self.menuSettings.setTitle(_translate("OpticsGUI", "Settings")) + self.menuElegant.setTitle(_translate("OpticsGUI", "Elegant")) + self.actionNew.setText(_translate("OpticsGUI", "New Model")) + self.actionNew.setShortcut(_translate("OpticsGUI", "Ctrl+N")) + self.actionOpen.setText(_translate("OpticsGUI", "Open Model...")) + self.actionOpen.setShortcut(_translate("OpticsGUI", "Ctrl+O")) + self.actionSave_Model.setText(_translate("OpticsGUI", "Save Model")) + self.actionSave_Model.setShortcut(_translate("OpticsGUI", "Ctrl+S")) + self.actionSave_Model_as.setText(_translate("OpticsGUI", "Save Model as ...")) + self.actionNew_Script.setText(_translate("OpticsGUI", "New Script...")) + self.actionNew_Script.setShortcut(_translate("OpticsGUI", "Ctrl+Shift+N")) + self.actionDuplicate_Script.setText(_translate("OpticsGUI", "Save Script as...")) + self.actionTrack.setText(_translate("OpticsGUI", "Track")) + self.actionTrack.setShortcut(_translate("OpticsGUI", "Ctrl+T")) + self.actionMatch.setText(_translate("OpticsGUI", "Match")) + self.actionMatch.setShortcut(_translate("OpticsGUI", "Ctrl+M")) + self.actionQuit.setText(_translate("OpticsGUI", "Quit")) + self.actionExport_Lattice.setText(_translate("OpticsGUI", "Export Lattice...")) + self.actionExport_Magnet_Settings.setText(_translate("OpticsGUI", "Export Magnet Settings...")) + self.actionInfo.setText(_translate("OpticsGUI", "Info...")) + self.actionWebsite.setText(_translate("OpticsGUI", "Website...")) + self.actionLoad_Settings_from_Model.setText(_translate("OpticsGUI", "Load Settings from Model")) + self.actionUpdate_Model.setText(_translate("OpticsGUI", "Update Model")) + self.actionLoad_Settings_from_Machine.setText(_translate("OpticsGUI", "Load Settings from Machine")) + self.actionOpen_Script.setText(_translate("OpticsGUI", "Open Script...")) + self.actionOpen_Script.setShortcut(_translate("OpticsGUI", "Ctrl+Shift+O")) + self.actionSave_Script.setText(_translate("OpticsGUI", "Save Script")) + self.actionSave_Script.setShortcut(_translate("OpticsGUI", "Ctrl+Shift+S")) + self.actionCut.setText(_translate("OpticsGUI", "Cut")) + self.actionCut.setShortcut(_translate("OpticsGUI", "Ctrl+X")) + self.actionCopy.setText(_translate("OpticsGUI", "Copy")) + self.actionCopy.setShortcut(_translate("OpticsGUI", "Ctrl+C")) + self.actionPaste.setText(_translate("OpticsGUI", "Paste")) + self.actionPaste.setShortcut(_translate("OpticsGUI", "Ctrl+V")) + self.actionRefreshSettings.setText(_translate("OpticsGUI", "Refresh")) + self.actionLoad_From_Machine.setText(_translate("OpticsGUI", "Load From Machine")) + self.actionUpdate_RF_in_Model.setText(_translate("OpticsGUI", "Update RF in Model")) + self.actionEnforce_Energy_Profile.setText(_translate("OpticsGUI", "Enforce Energy Profile")) + self.actionSerach.setText(_translate("OpticsGUI", "Serach...")) + self.actionExport_Lattice_for_Elegant.setText(_translate("OpticsGUI", "Export Lattice for Elegant...")) + self.actionTrack_Elegant.setText(_translate("OpticsGUI", "Track (Blocking)")) + self.actionTrack_Elegant.setShortcut(_translate("OpticsGUI", "Ctrl+Shift+T")) + self.actionReduce_Distribution.setText(_translate("OpticsGUI", "Reduce Input Distribution")) + self.actionExclude_Space_Charge.setText(_translate("OpticsGUI", "Exclude Space Charge")) + self.actionExclude_CSR.setText(_translate("OpticsGUI", "Exclude CSR")) + self.actionTest.setText(_translate("OpticsGUI", "Test")) + self.actionImport_Initial_Distribution.setText(_translate("OpticsGUI", "Import Initial Distribution...")) + self.actionLoad_From_LongTracker.setText(_translate("OpticsGUI", "Load From LongTracker...")) + self.actionUpdate_Undulator_in_Model.setText(_translate("OpticsGUI", "Update Undulator in Model")) + self.actionBackup.setText(_translate("OpticsGUI", "Backup Files")) + self.actionExport_Optics_Function.setText(_translate("OpticsGUI", "Export Optics Function...")) + self.actionExport_Optics_Functions.setText(_translate("OpticsGUI", "Export Optical Functions...")) + self.actionLoad_Reference.setText(_translate("OpticsGUI", "Load Reference...")) + self.actionSave_Reference.setText(_translate("OpticsGUI", "Save Reference")) + self.actionNew_Reference.setText(_translate("OpticsGUI", "New Reference")) diff --git a/ui/OpticsToolsGui.ui b/ui/OpticsToolsGui.ui new file mode 100644 index 0000000..6fc32ab --- /dev/null +++ b/ui/OpticsToolsGui.ui @@ -0,0 +1,2591 @@ + + + OpticsGUI + + + + 0 + 0 + 1605 + 1023 + + + + SwissFEL Optics + + + + + + + + 0 + 0 + + + + 0 + + + + Track + + + + + + + + + Track + + + + + + + + 0 + 0 + + + + Start + + + + + + + + 0 + 0 + + + + SINLH01 + + + + + + + + 0 + 0 + + + + End + + + + + + + + 0 + 0 + + + + SINDI02 + + + + + + + + + + 0 + 0 + + + + 0 + + + + + + + + 0 + 0 + + + + 30 + + + + + + + + 0 + 0 + + + + 0 + + + + + + + + 0 + 0 + + + + 30 + + + + + + + alpha + + + + + + + beta + + + + + + + + 0 + 0 + + + + x + + + + + + + + 0 + 0 + + + + y + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Plotting + + + + + + + + + Betax + + + true + + + + + + + Betay + + + true + + + + + + + Alphax + + + true + + + + + + + AlphaY + + + true + + + + + + + Etax + + + true + + + + + + + Etay + + + true + + + + + + + R56 + + + true + + + + + + + false + + + Energy + + + true + + + + + + + + + + + Plot Start + + + + + + + + 0 + 0 + + + + 0 + + + + + + + Plot End + + + + + + + + 0 + 0 + + + + 1000 + + + + + + + + + Qt::Vertical + + + + 20 + 175 + + + + + + + + Save Current Optics as Reference + + + + + + + Export Optics + + + + + + + Copy Entry as New Reference Point + + + + + + + + + + + 0 + 0 + + + + + 900 + 0 + + + + + + + + + + Optics Plotting + + + + + MadX Plots + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 50 + + + + + 8 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Plot + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + 1 + + + + + + + + 0 + 0 + + + + + 120 + 16777215 + + + + of 10 + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 167772 + 16777215 + + + + Previous + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + Next + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Page + + + + + 9 + 9 + 126 + 215 + + + + + 1 + 0 + + + + + 250 + 16777215 + + + + + + + Line + + + + + + + 1 + + + + Injector + + + + + Aramis + + + + + Athos + + + + + Porthos + + + + + + + + Qt::Horizontal + + + + + + + Match + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + Status + + + + + + + Idle + + + + + + + + + Matching + + + + + + + 0 + 0 + + + + + 0 + 700 + + + + + 16777215 + 200000 + + + + + + + Name + + + + + + + + + + Description + + + + + + + + + + Match Aramis + + + true + + + + + + + Match Athos + + + true + + + + + + + Initialize Quad for Matching + + + true + + + + + + + + 0 + 0 + + + + + 0 + 100 + + + + Variables + + + + + + + Name + + + + + Value + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Add + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Remove + + + + + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 300 + + + + Common - Script Order + + + + 0 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Matched + + + true + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Move up + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Move down + + + + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Add + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Remove + + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 300 + + + + Aramis - Script Order + + + + 0 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Matched + + + true + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Move up + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Move down + + + + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Add + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Remove + + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 300 + + + + Athos -Script Order + + + + 0 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Matched + + + true + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Move up + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Move down + + + + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Add + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Remove + + + + + + + + + + + + + Porthos-Script Order + + + + 0 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Matched + + + true + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Move up + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Move down + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Add + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + Remove + + + + + + + + + + + + + Qt::Horizontal + + + + 361 + 20 + + + + + + + + + 0 + 0 + + + + + 200 + 16777215 + + + + + 0 + 0 + + + + Available Scripts + + + + + + + 0 + 0 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Settings Sandbox + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + Magnets (Angle/ k1L / k2L) + + + + + + + + + + + Start + + + + + + + + + + Filter + + + + + + + + + + + + background-color: rgb(170, 170, 0); + + + Model -> Machine + + + + + + + Model <- Sandbox <- Machine + + + + + + + Model <- Sandbox + + + + + + + + + + + 0 + 0 + + + + + 400 + 0 + + + + Undulator/ID (K/Gap and Pol./Offset + + + + + + + + + Model <- Sandbox <- Machine + + + + + + + Model <- Sandbox + + + + + + + + + + + 0 + 0 + + + + + 400 + 0 + + + + RF (Gradient and Phase) + + + + + + Initial Energy (MeV) + + + + + + + + + Model + + + + + + + Machine + + + + + + + + + + + + + + + + + + Model <- Sandbox <- Machine + + + + + + + Model <- Sandbox + + + + + + + + + + + Optics Functions + + + + + + + + + 0 + 0 + + + + + + + + + + + Script Editor + + + + + + + + + Script + + + + + + + NewFile.madx + + + true + + + + + + + + + + + + + + Elegant Configuration + + + + + + false + + + Distribution + + + + + + Charge + + + + + + + + + + Energy + + + + + + + + + + Energy Spread + + + + + + + + + + Bunch Duration + + + + + + + + + + Emittance in X + + + + + + + + + + Emittance in Y + + + + + + + + + + Beta in X + + + + + + + + + + Beta in Y + + + + + + + + + + Alpha in X + + + + + + + + + + Alpha in Y + + + + + + + + + + + + + false + + + Elegant Parameters + + + + + + Downsample Rate + + + + + + + 1 + + + + + + + Exclude Space Charge + + + true + + + true + + + + + + + Exclude CSR + + + true + + + + + + + Center Bunch after Chicanes + + + true + + + + + + + Generate Dump at Following Locations + + + true + + + + + + + + SINLH03-DBPM010 + + + + + SINSB04-DBPM220 + + + + + SINBC01-DBPM100 + + + + + SINDI01-DBPM010 + + + + + S10BC01-DBPM090 + + + + + S10MA01-DBPM010 + + + + + S20SY01-DBPM060 + + + + + SARCL01-DBPM010 + + + + + SARMA02-DBPM110 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Add + + + + + + + Remove + + + + + + + + + + New Beamline Element + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + Log + + + + + + + 0 + 0 + + + + true + + + + + + + + + + + + + 0 + 0 + 1605 + 22 + + + + + File + + + + + + + + + + + + + + + + + MadX + + + + + + + + + Help + + + + + + + Edit + + + + + + + + Settings + + + + + + + + Elegant + + + + + + + + + + + + + + + New Model + + + Ctrl+N + + + + + Open Model... + + + Ctrl+O + + + + + Save Model + + + Ctrl+S + + + + + Save Model as ... + + + + + New Script... + + + Ctrl+Shift+N + + + + + Save Script as... + + + + + Track + + + Ctrl+T + + + + + Match + + + Ctrl+M + + + + + true + + + Quit + + + + + + + + true + + + Export Lattice... + + + + + false + + + Export Magnet Settings... + + + + + true + + + Info... + + + + + false + + + Website... + + + + + true + + + Load Settings from Model + + + + + false + + + Update Model + + + + + false + + + Load Settings from Machine + + + + + Open Script... + + + Ctrl+Shift+O + + + + + Save Script + + + Ctrl+Shift+S + + + + + Cut + + + Ctrl+X + + + + + Copy + + + Ctrl+C + + + + + Paste + + + Ctrl+V + + + + + false + + + Refresh + + + + + true + + + Load From Machine + + + + + true + + + Update RF in Model + + + + + true + + + Enforce Energy Profile + + + + + Serach... + + + + + true + + + Export Lattice for Elegant... + + + + + true + + + Track (Blocking) + + + Ctrl+Shift+T + + + + + true + + + true + + + Reduce Input Distribution + + + + + true + + + true + + + Exclude Space Charge + + + + + true + + + true + + + Exclude CSR + + + + + Test + + + + + true + + + Import Initial Distribution... + + + + + Load From LongTracker... + + + + + Update Undulator in Model + + + + + Backup Files + + + + + Export Optics Function... + + + + + Export Optical Functions... + + + + + Load Reference... + + + + + Save Reference + + + + + New Reference + + + + + + + actionQuit + triggered() + OpticsGUI + close() + + + -1 + -1 + + + 747 + 448 + + + + + diff --git a/updateGui.sh b/updateGui.sh new file mode 100755 index 0000000..fab6456 --- /dev/null +++ b/updateGui.sh @@ -0,0 +1,2 @@ +#!/bin/bash +pyuic5 ui/OpticsToolsGui.ui > ui/OpticsToolsGui.py