From c2cd2840dde83ecfab66d980bcba85accfe3a7f0 Mon Sep 17 00:00:00 2001 From: reiche Date: Thu, 24 Jul 2025 11:41:16 +0200 Subject: [PATCH] Plotting of elegant results implemented --- plot.py | 352 +++++++++++++++++++++++------------------- track.py | 21 ++- ui/ElegantPlotGui.py | 201 ++++++++++++------------ ui/ElegantPlotGui.ui | 269 ++++++++++++++------------------ ui/ElegantToolsGui.py | 9 ++ ui/ElegantToolsGui.ui | 14 ++ 6 files changed, 444 insertions(+), 422 deletions(-) diff --git a/plot.py b/plot.py index d1798d2..7cdfcde 100644 --- a/plot.py +++ b/plot.py @@ -1,5 +1,5 @@ import sys -import copy +import sdds from PyQt5 import QtWidgets,QtGui @@ -26,6 +26,28 @@ class ElegantPlot(QtWidgets.QMainWindow, Ui_ElegantPlotGUI): self.setWindowIcon(QtGui.QIcon("rsc/Audrey_Icon.png")) self.setWindowTitle("Elegant Results Plotting Window") + self.PBetax.toggled.connect(self.doplot) + self.PBetay.toggled.connect(self.doplot) + self.PSizex.toggled.connect(self.doplot) + self.PSizey.toggled.connect(self.doplot) + self.PEmitx.toggled.connect(self.doplot) + self.PEmity.toggled.connect(self.doplot) + self.PDuration.toggled.connect(self.doplot) + self.PEnergy.toggled.connect(self.doplot) + self.PSpread.toggled.connect(self.doplot) + self.PCEnergy.toggled.connect(self.doplot) + self.PCx.toggled.connect(self.doplot) + self.PCy.toggled.connect(self.doplot) + + self.PDistTE.clicked.connect(self.doPSplot) + self.PDistXPx.clicked.connect(self.doPSplot) + self.PDistYPy.clicked.connect(self.doPSplot) + self.PDistTX.clicked.connect(self.doPSplot) + self.PDistTY.clicked.connect(self.doPSplot) + self.PDistXY.clicked.connect(self.doPSplot) + self.currentDist=None + self.dist={} + self.Q=0 self.initmpl(self.mplvl, self.mplwindow) @@ -45,8 +67,24 @@ class ElegantPlot(QtWidgets.QMainWindow, Ui_ElegantPlotGUI): self.show() print('Updating Plotting Data') self.data=data + # scale some data + self.data['ecnx']=[ele*1e9 for ele in self.data['ecnx']] # nm + self.data['ecny'] = [ele * 1e9 for ele in self.data['ecny']] # nm + self.data['Sx'] = [ele * 1e6 for ele in self.data['Sx']] # micrometer + self.data['Sy'] = [ele * 1e6 for ele in self.data['Sy']] # micrometer + self.data['Cx'] = [ele * 1e6 for ele in self.data['Cx']] # micrometer + self.data['Cy'] = [ele * 1e6 for ele in self.data['Cy']] # micrometer + self.data['pCentral'] = [ele * 0.511 for ele in self.data['pCentral']] # MeV + self.data['St'] = [ele * 1e15 for ele in self.data['St']] # fs + self.data['Sdelta'] = [ele * 1e2 for ele in self.data['Sdelta']] # % + self.data['Cdelta'] = [ele * 1e2 for ele in self.data['Cdelta']] # % + + self.PDistList.clear() + for dist in dists: + self.PDistList.addItem(dist) + self.updateOpticsTable() -# self.doplot() + self.doplot() def updateOpticsTable(self): self.UITwissValues.clear() @@ -54,100 +92,151 @@ class ElegantPlot(QtWidgets.QMainWindow, Ui_ElegantPlotGUI): return nrow = len(self.data['s']) - ncol = 12 + ncol = 14 self.UITwissValues.setColumnCount(ncol) self.UITwissValues.setRowCount(nrow) - self.UITwissValues.setHorizontalHeaderLabels(['Element','s','betax','betay','alphax','alphay','etax','etay','r56','mux','muy','energy']) + self.UITwissValues.setHorizontalHeaderLabels(['Element','s','Size in x','Size in y','Size in t','Energy','Energy Spread','Emit x','Emit y','Betax','Betay','','','']) + + for i in range(nrow): self.UITwissValues.setItem(i, 0, QtWidgets.QTableWidgetItem(self.data['ElementName'][i])) -# self.UITwissValues.setItem(i, 1, QtWidgets.QTableWidgetItem('%10.6f' % self.data['s'][i])) -# self.UITwissValues.setItem(i, 2, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.betx[i])) -# self.UITwissValues.setItem(i, 3, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.bety[i])) -# self.UITwissValues.setItem(i, 4, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.alfx[i])) -# self.UITwissValues.setItem(i, 5, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.alfy[i])) -# self.UITwissValues.setItem(i, 6, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.dx[i])) -# self.UITwissValues.setItem(i, 7, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.dy[i])) -# self.UITwissValues.setItem(i, 8, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.re56[i])) -# self.UITwissValues.setItem(i, 9, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.mux[i])) -# self.UITwissValues.setItem(i,10, QtWidgets.QTableWidgetItem('%10.6f' % self.twiss.muy[i])) -# self.UITwissValues.setItem(i,11, QtWidgets.QTableWidgetItem('%10.6f' % self.energy[i])) + self.UITwissValues.setItem(i, 1, QtWidgets.QTableWidgetItem('%10.6f' % self.data['s'][i])) + self.UITwissValues.setItem(i, 2, QtWidgets.QTableWidgetItem('%10.6f' % self.data['Sx'][i])) + self.UITwissValues.setItem(i, 3, QtWidgets.QTableWidgetItem('%10.6f' % self.data['Sy'][i])) + self.UITwissValues.setItem(i, 4, QtWidgets.QTableWidgetItem('%10.6f' % self.data['St'][i])) + self.UITwissValues.setItem(i, 5, QtWidgets.QTableWidgetItem('%10.6f' % self.data['pCentral'][i])) + self.UITwissValues.setItem(i, 6, QtWidgets.QTableWidgetItem('%10.6f' % self.data['Sdelta'][i])) + self.UITwissValues.setItem(i, 7, QtWidgets.QTableWidgetItem('%10.6f' % self.data['ecnx'][i])) + self.UITwissValues.setItem(i, 8, QtWidgets.QTableWidgetItem('%10.6f' % self.data['ecny'][i])) + self.UITwissValues.setItem(i, 9, QtWidgets.QTableWidgetItem('%10.6f' % self.data['betaxBeam'][i])) + self.UITwissValues.setItem(i, 10, QtWidgets.QTableWidgetItem('%10.6f' % self.data['betayBeam'][i])) + self.UITwissValues.setItem(i, 11, QtWidgets.QTableWidgetItem('%10.6f' % self.data['Cx'][i])) + self.UITwissValues.setItem(i, 12, QtWidgets.QTableWidgetItem('%10.6f' % self.data['Cy'][i])) + self.UITwissValues.setItem(i, 13, QtWidgets.QTableWidgetItem('%10.6f' % self.data['Cdelta'][i])) self.UITwissValues.resizeColumnsToContents() self.UITwissValues.verticalHeader().hide() self.UITwissValues.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) + def loadDist(self,filename): + dist = sdds.load(filename) + cols=['t','p','x','xp','y','yp'] + self.dist.clear() + for col in cols: + self.dist[col] = dist.columnData[dist.columnName.index(col)][0] + self.Q = dist.parameterData[dist.parameterName.index('Charge')][0] + return filename - def LPS(self,t,p,Q): - title = self.parent.UIDistList.currentText() - x = np.array(t).ravel()*1e12 # to ps + + + def doPSplot(self): + dist = self.PDistList.currentText() + if not dist == self.currentDist: + self.currentDist = self.loadDist(dist) + but = self.sender().objectName() + print(but) + if 'DistTE' in but: + self.LPS(self.dist['t'],self.dist['p'],self.Q,dist) + elif 'DistXPx' in but: + self.TPS(self.dist['x'],self.dist['xp'],True,dist) + elif 'DistYPy' in but: + self.TPS(self.dist['y'], self.dist['yp'], False,dist) + elif 'DistTX' in but: + self.TimePS(self.dist['t'], self.dist['x'], self.Q,True,dist) + elif 'DistTY' in but: + self.TimePS(self.dist['t'], self.dist['y'], self.Q,False,dist) + elif 'DistXY' in but: + self.TS(self.dist['x'], self.dist['y'],dist) + + def LPS(self,t,p,Q,title=None): + if title is None: + title = self.parent.UIDistList.currentText() + x = np.array(t).ravel()*1e15 # to fs y = np.array(p).ravel()*0.511 # to MEV + x=x-np.mean(x) + self.PS(x,y,Q=Q,title = title, labx=r'$t$ (fs)',laby=r'$E$ (MeV)',laby2=r'$I$ (A)',legend1='Energy Distribution',legend2='Current') + def TPS(self,xin,pin,isX=True,title=None): + if title is None: + title = self.parent.UIDistList.currentText() + x = np.array(xin).ravel()*1e3 # to mm + y = np.array(pin).ravel()*1e3 # to mrad + labx=r'$y$ (mm)' + laby=r'$y\prime$ (mrad)' + if isX: + labx = r'$x$ (mm)' + laby = r'$x\prime$ (mrad)' + self.PS(x, y, Q=None, title=title, labx=labx, laby=laby, laby2='',legend1='Distribution in Momentum', legend2='Distribution in Space') + + def TimePS(self,t,xin,Q,isX=True,title=None): + if title is None: + title = self.parent.UIDistList.currentText() + x = np.array(t).ravel()*1e15 # to fs + y = np.array(xin).ravel()*1e3 # to mm + x=x-np.mean(x) + labx=r'$t$ (fs)' + laby=r'$y$ (mm)' + if isX: + laby = r'$x$ (m)' + self.PS(x, y, Q=Q, title=title, labx=labx, laby=laby, laby2=r'$I$ (A)',legend1='Distribution in Space', legend2='Current') + + def TS(self,xin,yin,title=None): + if title is None: + title = self.parent.UIDistList.currentText() + x = np.array(xin).ravel()*1e3 # to mm + y = np.array(yin).ravel()*1e3 # to mm + labx=r'$x$ (mm)' + laby=r'$y$ (mm)' + self.PS(x, y, Q=None, title=title, labx=labx, laby=laby, laby2='',legend1='Distribution in Y', legend2='Distribution in X') + + + def PS(self,x,y,Q = None,title='',labx='',laby='',laby2='',legend1='',legend2=''): + xmin = x.min() xmax = x.max() ymin = y.min() ymax = y.max() - - + dx=(xmax-xmin)*0.1 + dy=(ymax-ymin)*0.1 + xmax+=dx + xmin-=dx + ymax+=dy + ymin-=dy + range=[[xmin,xmax],[ymin,ymax]] N = 300 - img,xed,yed = np.histogram2d(x,y,N) - xdist, xval = np.histogram(x,N) - cal = np.sum(xdist)*(xval[1]-xval[0])*1e-12/Q - xdist = xdist/cal + img,xed,yed = np.histogram2d(x,y,N,range=range) + xdist, xval = np.histogram(x,N,range=range[0]) + if Q: + cal = np.sum(xdist)*(xval[1]-xval[0])*1e-12/Q + xdist = xdist/cal*1e3 - ydist, yval = np.histogram(y, N) + ydist, yval = np.histogram(y, N,range=range[1]) ydist = ydist / np.max(ydist) * 0.3 * (xmax - xmin) + xmin self.axes.clear() self.axes2.clear() - self.axes.imshow(np.transpose(np.fliplr(img)), aspect='auto', interpolation='bicubic', cmap='viridis', + self.axes.imshow(np.transpose(np.fliplr(img)), aspect='auto', interpolation='bicubic', cmap='gnuplot2', # was viridis extent=[xmin, xmax, ymin, ymax]) self.axes2.plot(xval[:-1],xdist,'y') - self.axes.plot(ydist,yval[:-1], 'c', label='Energy Distribution') - self.axes.plot([], [], 'y', label='Current') + self.axes.plot(ydist,yval[:-1], 'c', label=legend1) + self.axes.plot([], [], 'y', label=legend2) self.axes.legend() - self.axes.set_xlabel('t (ps)') - self.axes.set_ylabel('E (MeV)') - self.axes2.set_ylabel('I (A)') + self.axes.set_xlabel(labx) + self.axes.set_ylabel(laby) + if len(laby2)> 1: + self.axes2.yaxis.set_visible(True) + else: + self.axes2.yaxis.set_visible(False) self.axes2.set_ylim([0,3*np.max(xdist)]) + self.axes2.set_xlim([xmin,xmax]) + self.axes2.set_ylabel(laby2) self.axes.set_title(title) self.canvas.draw() - -# self.twiss=None -# self.twissref = None -# self.energy=None - - # 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.PMux.toggled.connect(self.doplot) -# self.PMuy.toggled.connect(self.doplot) -# self.PX.toggled.connect(self.doplot) -# self.PY.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) - -# self.UIPlotExportOptics.clicked.connect(self.exportOptics) -# self.UIPLotNewReference.clicked.connect(self.saveReference) -# self.UIPlotSaveReference.clicked.connect(self.newReference) -# self.UIPlotClearReference.clicked.connect(self.clearReference) - - - - - - - def doplot(self): - if self.twiss is None: + if self.data is None: return z0=float(str(self.PStart.text())) @@ -157,22 +246,34 @@ class ElegantPlot(QtWidgets.QMainWindow, Ui_ElegantPlotGUI): z1 = z0 z0 = tmp - 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() - filt['MUX'] = self.PMux.isChecked() - filt['MUY'] = self.PMuy.isChecked() - filt['X'] = self.PX.isChecked() - filt['Y'] = self.PY.isChecked() + filt['Sx']=self.PSizex.isChecked() + filt['Sy'] = self.PSizey.isChecked() + filt['ecnx']=self.PEmitx.isChecked() + filt['ecny']=self.PEmity.isChecked() + filt['betaxBeam']=self.PBetax.isChecked() + filt['betayBeam']=self.PBetay.isChecked() + filt['Cx']=self.PCx.isChecked() + filt['Cy']=self.PCy.isChecked() + filt['St']=self.PDuration.isChecked() + filt['pCentral']=self.PEnergy.isChecked() + filt['Sdelta'] = self.PSpread.isChecked() + filt['Cdelta'] = self.PCEnergy.isChecked() + color={} + color['Sx']={'color':(0,0,1,1),'label':r'$\sigma_x$ ($\mu$m)','legend':r'$\sigma_x$','dash':False} + color['Sy'] = {'color':(1, 0, 0, 1),'label':r'$\sigma_y$ ($\mu$m)','legend':r'$\sigma_y$','dash':False} + color['ecnx'] ={'color': (0, 0.4, 1, 1),'label':r'$\epsilon_{nx}$ (nm)','legend':r'$\epsilon_{nx}$','dash':False} + color['ecny'] = {'color':(1, 0.4, 0, 1),'label':r'$\epsilon_{ny}$ (nm)','legend':r'$\epsilon_{ny}$','dash':False} + color['betaxBeam'] = {'color': (0, 0, 1, 1), 'label': r'$\beta_x$ (m)', 'legend': r'$\beta_x$','dash':False} + color['betayBeam'] = {'color': (1, 0, 0, 1), 'label': r'$\beta_y$ (m)', 'legend': r'$\beta_y$','dash':False} + color['Cx'] = {'color': (0, 0, 1, 1), 'label': r'$$ ($\mu$m)', 'legend': r'$$','dash':True} + color['Cy'] = {'color': (1, 0, 0, 1), 'label': r'$$ ($\mu$m)', 'legend': r'$$','dash':True} + color['pCentral'] = {'color':(0,0.5,0,1),'label':r'$E_0$ (MeV)', 'legend': r'$E_0$','dash':False} + color['Sdelta'] = {'color': (0, 0.5, 0, 1), 'label': r'$\sigma_\delta$ (%)', 'legend': r'$\sigma_\delta$', 'dash': False} + color['Cdelta'] = {'color': (0, 0.5, 0, 1), 'label': r'$<\delta>$ (%)', 'legend': r'$<\delta>$', 'dash': True} + color['St'] = {'color': (0.5, 0, 0.5, 1), 'label': r'$\sigma_t$ (fs)', 'legend': r'$\sigma_t$', 'dash': False} - s = self.twiss.s + s = np.array(self.data['s']) i1 = np.argmin(np.abs(s - z0)) i2 = np.argmin(np.abs(s - z1)) @@ -180,90 +281,21 @@ class ElegantPlot(QtWidgets.QMainWindow, Ui_ElegantPlotGUI): self.axes2.clear() ylabel = r'' - if filt['BETX']: - self.plotSingle(s[i1:i2], self.twiss.betx[i1:i2], (0, 0, 1, 1), r'$\beta_{x}$') - ylabel = ylabel + r'$\beta_x$ (m), ' - if filt['BETY']: - self.plotSingle(s[i1:i2], self.twiss.bety[i1:i2], (1, 0, 0, 1), r'$\beta_{y}$') - ylabel = ylabel + r'$\beta_y$ (m), ' - if filt['ALFX']: - self.plotSingle(s[i1:i2], self.twiss.alfx[i1:i2], (0, 0, 1, 1), r'$\alpha_{x}$') - ylabel = ylabel + r'$\alpha_x$ (rad), ' - if filt['ALFY']: - self.plotSingle(s[i1:i2], self.twiss.alfy[i1:i2], (1, 0, 0, 1), r'$\alpha_{y}$') - ylabel = ylabel + r'$\alpha_y$ (rad), ' - if filt['DX']: - self.plotSingle(s[i1:i2], self.twiss.dx[i1:i2], (0, 0, 1, 1), r'$\eta_{x}$') - ylabel = ylabel + r'$\eta_x$ (m), ' - if filt['DY']: - self.plotSingle(s[i1:i2], self.twiss.dy[i1:i2], (1, 0, 0, 1), r'$\eta_{y}$') - ylabel = ylabel + r'$\eta_y$ (m), ' - if filt['MUX']: - self.plotSingle(s[i1:i2], self.twiss.mux[i1:i2], (0, 0.5, 1, 1), r'$\mu_{x}$') - ylabel = ylabel + r'$\mu_x$, ' - if filt['MUY']: - self.plotSingle(s[i1:i2], self.twiss.muy[i1:i2], (1, 0.5, 0, 1), r'$\mu_{y}$') - ylabel = ylabel + r'$\mu_y$, ' - if filt['X']: - self.plotSingle(s[i1:i2], self.twiss.x[i1:i2], (0, 0.5, 1, 1), r'$x$') - ylabel = ylabel + r'$x$ (m), ' - if filt['Y']: - self.plotSingle(s[i1:i2], self.twiss.y[i1:i2], (1, 0.5, 0, 1), r'$y$') - ylabel = ylabel + r'$y$ (m), ' - if filt['RE56']: - self.plotSingle(s[i1:i2], self.twiss.re56[i1:i2], (0, 0, 0, 1), r'$R_{56}$') - ylabel = ylabel + r'$R_{56}$ (m), ' - if filt['Energy']: - self.plotSingle(s[i1:i2], self.energy[i1:i2], (0, 1, 0, 1), r'$E$') - ylabel = ylabel + r'$E$ (MeV), ' + for key in filt.keys(): + if filt[key]: + if key in color.keys(): + self.plotSingle(s[i1:i2],self.data[key][i1:i2], color[key]['color'],color[key]['legend'],dashed=color[key]['dash']) + ylabel += color[key]['label']+', ' if len(ylabel) < 3: self.canvas.draw() return - if not self.twissref is None: - if filt['BETX']: - self.plotSingle(s[i1:i2], self.twissref.betx[i1:i2], (0, 0, 1, 1), r'$\beta_{x}$ (ref)',dashed=True) - ylabel = ylabel + r'$\beta_x$ (m), ' - if filt['BETY']: - self.plotSingle(s[i1:i2], self.twissref.bety[i1:i2], (1, 0, 0, 1), r'$\beta_{y}$ (ref)',dashed=True) - ylabel = ylabel + r'$\beta_y$ (m), ' - if filt['ALFX']: - self.plotSingle(s[i1:i2], self.twissref.alfx[i1:i2], (0, 0, 1, 1), r'$\alpha_{x}$ (ref)',dashed=True) - ylabel = ylabel + r'$\alpha_x$ (rad), ' - if filt['ALFY']: - self.plotSingle(s[i1:i2], self.twissref.alfy[i1:i2], (1, 0, 0, 1), r'$\alpha_{y}$ (ref)',dashed=True) - ylabel = ylabel + r'$\alpha_y$ (rad), ' - if filt['DX']: - self.plotSingle(s[i1:i2], self.twissref.dx[i1:i2], (0, 0, 1, 1), r'$\eta_{x}$ (ref)',dashed=True) - ylabel = ylabel + r'$\eta_x$ (m), ' - if filt['DY']: - self.plotSingle(s[i1:i2], self.twissref.dy[i1:i2], (1, 0, 0, 1), r'$\eta_{y}$ (ref)',dashed=True) - ylabel = ylabel + r'$\eta_y$ (m), ' - if filt['MUX']: - self.plotSingle(s[i1:i2], self.twiss.mux[i1:i2], (0, 0.5, 1, 1), r'$\mu_{x}$ (ref)',dashed=True) - ylabel = ylabel + r'$\mu_x$, ' - if filt['MUY']: - self.plotSingle(s[i1:i2], self.twiss.muy[i1:i2], (1, 0.5, 0, 1), r'$\mu_{y}$ (ref)',dashed=True) - ylabel = ylabel + r'$\mu_y$, ' - if filt['X']: - self.plotSingle(s[i1:i2], self.twiss.x[i1:i2], (0, 0.5, 1, 1), r'$x$ (ref)',dashed=True) - ylabel = ylabel + r'$x$ (m), ' - if filt['Y']: - self.plotSingle(s[i1:i2], self.twiss.y[i1:i2], (1, 0.5, 0, 1), r'$y$ (ref)',dashed=True) - ylabel = ylabel + r'$y$ (m), ' - if filt['RE56']: - self.plotSingle(s[i1:i2], self.twissref.re56[i1:i2], (0, 0, 0, 1), r'$R_{56}$ (ref)',dashed=True) - ylabel = ylabel + r'$R_{56}$ (m), ' - if filt['Energy']: - self.plotSingle(s[i1:i2], self.energyref[i1:i2], (0, 1, 0, 1), r'$E$ (ref)',dashed=True) - ylabel = ylabel + r'$E$ (MeV), ' - 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,self.twiss.name) + self.plotLayout(s,self.data['ElementName']) self.axes.set_xlim([s[i1], s[i2]]) ylim = self.axes.get_ylim() dl = np.abs(ylim[1] - ylim[0]) @@ -282,37 +314,37 @@ class ElegantPlot(QtWidgets.QMainWindow, Ui_ElegantPlotGUI): s2 = [0.9, 0.9] self.axes2.plot(s1, s2, 'k') for i, name in enumerate(elements): - if 'mbnd' in name: + if '.MBND' in name and '.B' 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: + if ',MSEX' in name and '.SEX': 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: + if '.UIND' in name and '.WIG' 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: + if '.RACC' in name or '.RTDS' 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 '.MQUA' in name and '.Q': if splitquads == True: - if 'end' in name: + if '.Q2' 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: + if '.Q1' in name: splitquads = True sstart = s[i] else: diff --git a/track.py b/track.py index a011a0c..b87647c 100644 --- a/track.py +++ b/track.py @@ -16,6 +16,7 @@ class Track(QtCore.QObject): self.isRunning=False self.dumpPoints=[] self.parent.UITrack.clicked.connect(self.startTracking) + self.parent.UITrackReload.clicked.connect(self.reloadTracking) self.parent.UIAddDiagnosticDump.clicked.connect(self.addDiagnosticDump) self.parent.UIAddSectionDump.clicked.connect(self.addSectionDump) self.parent.UIDeleteDump.clicked.connect(self.deleteDump) @@ -27,6 +28,7 @@ class Track(QtCore.QObject): return project = str(self.parent.UITrackRootName.text()) self.root= 'Runs/'+project + start=str(self.parent.UITrackStart.text()) end=str(self.parent.UITrackEnd.text()) lsc = self.parent.UITrackDoLSC.isChecked() @@ -69,25 +71,36 @@ class Track(QtCore.QObject): self.isRunning=False self.done.emit() + def reloadTracking(self): + if self.isRunning: + return + project = str(self.parent.UITrackRootName.text()) + self.root = 'Runs/' + project + self.loadTracking() + @QtCore.pyqtSlot() def elegantFinished(self): self.parent.UITrackStatus.setText('Idle') self.parent.UITrackStatus.setStyleSheet("background-color: white") - # read central moments + self.loadTracking() + + def loadTracking(self): data = sdds.load(self.root+'.cen') columns = data.columnName res = {} fields = ['s','ElementName','Cx','Cxp','Cy','Cyp','Cdelta','pCentral'] for field in fields: - res[field] = data.columnData[columns.index(field)] + res[field] = data.columnData[columns.index(field)][0] del data data = sdds.load(self.root + '.sig') columns = data.columnName fields = ['Sx', 'Sxp', 'Sy', 'Syp', 'Sdelta', 'St','enx','eny','ecnx','ecny','betaxBeam','betayBeam','alphaxBeam','alphayBeam'] for field in fields: - res[field] = data.columnData[columns.index(field)] + res[field] = data.columnData[columns.index(field)][0] del data - self.parent.plot.newData(res) + dist1 = self.root+'Inputdist.sdds' + dist2 = self.root+'.out' + self.parent.plot.newData(res,[dist1,dist2]) @QtCore.pyqtSlot(str) def trackMessage(self, msg=''): diff --git a/ui/ElegantPlotGui.py b/ui/ElegantPlotGui.py index a493f29..f31d06c 100644 --- a/ui/ElegantPlotGui.py +++ b/ui/ElegantPlotGui.py @@ -35,93 +35,66 @@ class Ui_ElegantPlotGUI(object): self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.widget_2) self.verticalLayout_5.setObjectName("verticalLayout_5") self.label_31 = QtWidgets.QLabel(self.widget_2) + font = QtGui.QFont() + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.label_31.setFont(font) self.label_31.setObjectName("label_31") self.verticalLayout_5.addWidget(self.label_31) self.gridLayout_4 = QtWidgets.QGridLayout() self.gridLayout_4.setObjectName("gridLayout_4") - self.PY = QtWidgets.QPushButton(self.widget_2) - self.PY.setCheckable(True) - self.PY.setObjectName("PY") - self.gridLayout_4.addWidget(self.PY, 3, 1, 1, 1) - self.PR22 = QtWidgets.QPushButton(self.widget_2) - self.PR22.setEnabled(False) - self.PR22.setObjectName("PR22") - self.gridLayout_4.addWidget(self.PR22, 7, 1, 1, 1) - self.PAlphay = QtWidgets.QPushButton(self.widget_2) - self.PAlphay.setCheckable(True) - self.PAlphay.setObjectName("PAlphay") - self.gridLayout_4.addWidget(self.PAlphay, 1, 1, 1, 1) - self.PR12 = QtWidgets.QPushButton(self.widget_2) - self.PR12.setEnabled(False) - self.PR12.setObjectName("PR12") - self.gridLayout_4.addWidget(self.PR12, 6, 1, 1, 1) + self.PEmity = QtWidgets.QPushButton(self.widget_2) + self.PEmity.setCheckable(True) + self.PEmity.setObjectName("PEmity") + self.gridLayout_4.addWidget(self.PEmity, 1, 1, 1, 1) + self.PDuration = QtWidgets.QPushButton(self.widget_2) + self.PDuration.setCheckable(True) + self.PDuration.setObjectName("PDuration") + self.gridLayout_4.addWidget(self.PDuration, 3, 0, 1, 1) + self.PCy = QtWidgets.QPushButton(self.widget_2) + self.PCy.setEnabled(True) + self.PCy.setCheckable(True) + self.PCy.setObjectName("PCy") + self.gridLayout_4.addWidget(self.PCy, 5, 1, 1, 1) self.PEnergy = QtWidgets.QPushButton(self.widget_2) - self.PEnergy.setEnabled(True) self.PEnergy.setCheckable(True) self.PEnergy.setObjectName("PEnergy") - self.gridLayout_4.addWidget(self.PEnergy, 5, 1, 1, 1) - self.PMux = QtWidgets.QPushButton(self.widget_2) - self.PMux.setCheckable(True) - self.PMux.setObjectName("PMux") - self.gridLayout_4.addWidget(self.PMux, 4, 0, 1, 1) + self.gridLayout_4.addWidget(self.PEnergy, 3, 1, 1, 1) + self.PCx = QtWidgets.QPushButton(self.widget_2) + self.PCx.setCheckable(True) + self.PCx.setObjectName("PCx") + self.gridLayout_4.addWidget(self.PCx, 5, 0, 1, 1) + self.PSpread = QtWidgets.QPushButton(self.widget_2) + self.PSpread.setCheckable(True) + self.PSpread.setObjectName("PSpread") + self.gridLayout_4.addWidget(self.PSpread, 4, 0, 1, 1) + self.PSizey = QtWidgets.QPushButton(self.widget_2) + self.PSizey.setCheckable(True) + self.PSizey.setChecked(True) + self.PSizey.setObjectName("PSizey") + self.gridLayout_4.addWidget(self.PSizey, 0, 1, 1, 1) + self.PSizex = QtWidgets.QPushButton(self.widget_2) + self.PSizex.setCheckable(True) + self.PSizex.setChecked(True) + self.PSizex.setObjectName("PSizex") + self.gridLayout_4.addWidget(self.PSizex, 0, 0, 1, 1) self.PBetax = QtWidgets.QPushButton(self.widget_2) self.PBetax.setCheckable(True) - self.PBetax.setChecked(True) self.PBetax.setObjectName("PBetax") - self.gridLayout_4.addWidget(self.PBetax, 0, 0, 1, 1) - self.PAlphax = QtWidgets.QPushButton(self.widget_2) - self.PAlphax.setCheckable(True) - self.PAlphax.setObjectName("PAlphax") - self.gridLayout_4.addWidget(self.PAlphax, 1, 0, 1, 1) - self.PR56 = QtWidgets.QPushButton(self.widget_2) - self.PR56.setCheckable(True) - self.PR56.setObjectName("PR56") - self.gridLayout_4.addWidget(self.PR56, 5, 0, 1, 1) - self.PR33 = QtWidgets.QPushButton(self.widget_2) - self.PR33.setEnabled(False) - self.PR33.setObjectName("PR33") - self.gridLayout_4.addWidget(self.PR33, 8, 0, 1, 1) - self.PR34 = QtWidgets.QPushButton(self.widget_2) - self.PR34.setEnabled(False) - self.PR34.setObjectName("PR34") - self.gridLayout_4.addWidget(self.PR34, 8, 1, 1, 1) - self.PEtax = QtWidgets.QPushButton(self.widget_2) - self.PEtax.setCheckable(True) - self.PEtax.setObjectName("PEtax") - self.gridLayout_4.addWidget(self.PEtax, 2, 0, 1, 1) - self.PX = QtWidgets.QPushButton(self.widget_2) - self.PX.setCheckable(True) - self.PX.setObjectName("PX") - self.gridLayout_4.addWidget(self.PX, 3, 0, 1, 1) - self.PEtay = QtWidgets.QPushButton(self.widget_2) - self.PEtay.setCheckable(True) - self.PEtay.setObjectName("PEtay") - self.gridLayout_4.addWidget(self.PEtay, 2, 1, 1, 1) - self.PR11 = QtWidgets.QPushButton(self.widget_2) - self.PR11.setEnabled(False) - self.PR11.setObjectName("PR11") - self.gridLayout_4.addWidget(self.PR11, 6, 0, 1, 1) + self.gridLayout_4.addWidget(self.PBetax, 2, 0, 1, 1) self.PBetay = QtWidgets.QPushButton(self.widget_2) self.PBetay.setCheckable(True) - self.PBetay.setChecked(True) self.PBetay.setObjectName("PBetay") - self.gridLayout_4.addWidget(self.PBetay, 0, 1, 1, 1) - self.PR21 = QtWidgets.QPushButton(self.widget_2) - self.PR21.setEnabled(False) - self.PR21.setObjectName("PR21") - self.gridLayout_4.addWidget(self.PR21, 7, 0, 1, 1) - self.PMuy = QtWidgets.QPushButton(self.widget_2) - self.PMuy.setCheckable(True) - self.PMuy.setObjectName("PMuy") - self.gridLayout_4.addWidget(self.PMuy, 4, 1, 1, 1) - self.PR43 = QtWidgets.QPushButton(self.widget_2) - self.PR43.setEnabled(False) - self.PR43.setObjectName("PR43") - self.gridLayout_4.addWidget(self.PR43, 9, 0, 1, 1) - self.PR44 = QtWidgets.QPushButton(self.widget_2) - self.PR44.setEnabled(False) - self.PR44.setObjectName("PR44") - self.gridLayout_4.addWidget(self.PR44, 9, 1, 1, 1) + self.gridLayout_4.addWidget(self.PBetay, 2, 1, 1, 1) + self.PEmitx = QtWidgets.QPushButton(self.widget_2) + self.PEmitx.setCheckable(True) + self.PEmitx.setObjectName("PEmitx") + self.gridLayout_4.addWidget(self.PEmitx, 1, 0, 1, 1) + self.PCEnergy = QtWidgets.QPushButton(self.widget_2) + self.PCEnergy.setCheckable(True) + self.PCEnergy.setObjectName("PCEnergy") + self.gridLayout_4.addWidget(self.PCEnergy, 4, 1, 1, 1) self.verticalLayout_5.addLayout(self.gridLayout_4) self.gridLayout_5 = QtWidgets.QGridLayout() self.gridLayout_5.setObjectName("gridLayout_5") @@ -148,17 +121,37 @@ class Ui_ElegantPlotGUI(object): self.PEnd.setObjectName("PEnd") self.gridLayout_5.addWidget(self.PEnd, 1, 1, 1, 1) self.verticalLayout_5.addLayout(self.gridLayout_5) + self.label = QtWidgets.QLabel(self.widget_2) + font = QtGui.QFont() + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.label.setFont(font) + self.label.setObjectName("label") + self.verticalLayout_5.addWidget(self.label) + self.PDistList = QtWidgets.QComboBox(self.widget_2) + self.PDistList.setObjectName("PDistList") + self.verticalLayout_5.addWidget(self.PDistList) + self.PDistTE = QtWidgets.QPushButton(self.widget_2) + self.PDistTE.setObjectName("PDistTE") + self.verticalLayout_5.addWidget(self.PDistTE) + self.PDistXPx = QtWidgets.QPushButton(self.widget_2) + self.PDistXPx.setObjectName("PDistXPx") + self.verticalLayout_5.addWidget(self.PDistXPx) + self.PDistYPy = QtWidgets.QPushButton(self.widget_2) + self.PDistYPy.setObjectName("PDistYPy") + self.verticalLayout_5.addWidget(self.PDistYPy) + self.PDistXY = QtWidgets.QPushButton(self.widget_2) + self.PDistXY.setObjectName("PDistXY") + self.verticalLayout_5.addWidget(self.PDistXY) + self.PDistTX = QtWidgets.QPushButton(self.widget_2) + self.PDistTX.setObjectName("PDistTX") + self.verticalLayout_5.addWidget(self.PDistTX) + self.PDistTY = QtWidgets.QPushButton(self.widget_2) + self.PDistTY.setObjectName("PDistTY") + self.verticalLayout_5.addWidget(self.PDistTY) spacerItem = QtWidgets.QSpacerItem(20, 175, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_5.addItem(spacerItem) - self.UIPlotSaveReference = QtWidgets.QPushButton(self.widget_2) - self.UIPlotSaveReference.setObjectName("UIPlotSaveReference") - self.verticalLayout_5.addWidget(self.UIPlotSaveReference) - self.UIPlotClearReference = QtWidgets.QPushButton(self.widget_2) - self.UIPlotClearReference.setObjectName("UIPlotClearReference") - self.verticalLayout_5.addWidget(self.UIPlotClearReference) - self.UIPlotExportOptics = QtWidgets.QPushButton(self.widget_2) - self.UIPlotExportOptics.setObjectName("UIPlotExportOptics") - self.verticalLayout_5.addWidget(self.UIPlotExportOptics) self.horizontalLayout.addWidget(self.widget_2) self.mplwindow = QtWidgets.QWidget(self.tab_3) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding) @@ -320,34 +313,30 @@ class Ui_ElegantPlotGUI(object): def retranslateUi(self, ElegantPlotGUI): _translate = QtCore.QCoreApplication.translate ElegantPlotGUI.setWindowTitle(_translate("ElegantPlotGUI", "SwissFEL Optics")) - self.label_31.setText(_translate("ElegantPlotGUI", "Plotting")) - self.PY.setText(_translate("ElegantPlotGUI", "Y")) - self.PR22.setText(_translate("ElegantPlotGUI", "R22")) - self.PAlphay.setText(_translate("ElegantPlotGUI", "AlphaY")) - self.PR12.setText(_translate("ElegantPlotGUI", "R12")) + self.label_31.setText(_translate("ElegantPlotGUI", "Plotting along Lattice")) + self.PEmity.setText(_translate("ElegantPlotGUI", "Emit y")) + self.PDuration.setText(_translate("ElegantPlotGUI", "Duration")) + self.PCy.setText(_translate("ElegantPlotGUI", "")) self.PEnergy.setText(_translate("ElegantPlotGUI", "Energy")) - self.PMux.setText(_translate("ElegantPlotGUI", "Mux")) - self.PBetax.setText(_translate("ElegantPlotGUI", "Betax")) - self.PAlphax.setText(_translate("ElegantPlotGUI", "Alphax")) - self.PR56.setText(_translate("ElegantPlotGUI", "R56")) - self.PR33.setText(_translate("ElegantPlotGUI", "R33")) - self.PR34.setText(_translate("ElegantPlotGUI", "R34")) - self.PEtax.setText(_translate("ElegantPlotGUI", "Etax")) - self.PX.setText(_translate("ElegantPlotGUI", "X")) - self.PEtay.setText(_translate("ElegantPlotGUI", "Etay")) - self.PR11.setText(_translate("ElegantPlotGUI", "R11")) - self.PBetay.setText(_translate("ElegantPlotGUI", "Betay")) - self.PR21.setText(_translate("ElegantPlotGUI", "R21")) - self.PMuy.setText(_translate("ElegantPlotGUI", "Muy")) - self.PR43.setText(_translate("ElegantPlotGUI", "R43")) - self.PR44.setText(_translate("ElegantPlotGUI", "R44")) + self.PCx.setText(_translate("ElegantPlotGUI", "")) + self.PSpread.setText(_translate("ElegantPlotGUI", "Energy Spread")) + self.PSizey.setText(_translate("ElegantPlotGUI", "Size in y")) + self.PSizex.setText(_translate("ElegantPlotGUI", "Size in x")) + self.PBetax.setText(_translate("ElegantPlotGUI", "Beta x")) + self.PBetay.setText(_translate("ElegantPlotGUI", "Beta y")) + self.PEmitx.setText(_translate("ElegantPlotGUI", "Emit x")) + self.PCEnergy.setText(_translate("ElegantPlotGUI", "")) self.label_22.setText(_translate("ElegantPlotGUI", "Plot Start")) self.PStart.setText(_translate("ElegantPlotGUI", "0")) self.label_21.setText(_translate("ElegantPlotGUI", "Plot End")) self.PEnd.setText(_translate("ElegantPlotGUI", "1000")) - self.UIPlotSaveReference.setText(_translate("ElegantPlotGUI", "Save Current Optics as Reference")) - self.UIPlotClearReference.setText(_translate("ElegantPlotGUI", "Clear Reference")) - self.UIPlotExportOptics.setText(_translate("ElegantPlotGUI", "Export Optics")) + self.label.setText(_translate("ElegantPlotGUI", "Distribution")) + self.PDistTE.setText(_translate("ElegantPlotGUI", "Longitudinal Phase Space")) + self.PDistXPx.setText(_translate("ElegantPlotGUI", "Transverse Phase Space in x")) + self.PDistYPy.setText(_translate("ElegantPlotGUI", "Transverse Phase Space in y")) + self.PDistXY.setText(_translate("ElegantPlotGUI", "X-Y")) + self.PDistTX.setText(_translate("ElegantPlotGUI", "T-X")) + self.PDistTY.setText(_translate("ElegantPlotGUI", "T-Y")) self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_3), _translate("ElegantPlotGUI", "Plot")) self.UIPLotNewReference.setText(_translate("ElegantPlotGUI", "Copy Entry as New Reference Point")) self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_4), _translate("ElegantPlotGUI", "Values")) diff --git a/ui/ElegantPlotGui.ui b/ui/ElegantPlotGui.ui index f0208ef..29437b2 100644 --- a/ui/ElegantPlotGui.ui +++ b/ui/ElegantPlotGui.ui @@ -36,58 +36,55 @@ + + + 10 + 75 + true + + - Plotting + Plotting along Lattice - - - - Y - - - true - - - - - - - false - - - R22 - - - - + - AlphaY + Emit y true - - - - false - + + - R12 + Duration + + + true - + true + + <y> + + + true + + + + + Energy @@ -96,20 +93,30 @@ - - + + - Mux + <x> true - - + + - Betax + Energy Spread + + + true + + + + + + + Size in y true @@ -119,60 +126,23 @@ - - + + - Alphax + Size in x true - - - - - - R56 - - + true - - - - false - - - R33 - - - - - - - false - - - R34 - - - - + - Etax - - - true - - - - - - - X + Beta x true @@ -180,78 +150,35 @@ - - - Etay - - - true - - - - - - - false - - - R11 - - - - - Betay + Beta y true - - true - - - - - false - + + - R21 + Emit x + + + true - + - Muy + <Energy> true - - - - false - - - R43 - - - - - - - false - - - R44 - - - @@ -298,6 +225,65 @@ + + + + + 10 + 75 + true + + + + Distribution + + + + + + + + + + Longitudinal Phase Space + + + + + + + Transverse Phase Space in x + + + + + + + Transverse Phase Space in y + + + + + + + X-Y + + + + + + + T-X + + + + + + + T-Y + + + @@ -311,27 +297,6 @@ - - - - Save Current Optics as Reference - - - - - - - Clear Reference - - - - - - - Export Optics - - - diff --git a/ui/ElegantToolsGui.py b/ui/ElegantToolsGui.py index 09b596e..23cf93d 100644 --- a/ui/ElegantToolsGui.py +++ b/ui/ElegantToolsGui.py @@ -48,6 +48,14 @@ class Ui_ElegantGUI(object): self.UITrack.setStyleSheet("background-color: rgb(255, 255, 127);") self.UITrack.setObjectName("UITrack") self.verticalLayout.addWidget(self.UITrack) + self.UITrackReload = QtWidgets.QPushButton(self.widget_2) + font = QtGui.QFont() + font.setPointSize(12) + font.setBold(True) + font.setWeight(75) + self.UITrackReload.setFont(font) + self.UITrackReload.setObjectName("UITrackReload") + self.verticalLayout.addWidget(self.UITrackReload) self.label_8 = QtWidgets.QLabel(self.widget_2) self.label_8.setObjectName("label_8") self.verticalLayout.addWidget(self.label_8) @@ -515,6 +523,7 @@ class Ui_ElegantGUI(object): _translate = QtCore.QCoreApplication.translate ElegantGUI.setWindowTitle(_translate("ElegantGUI", "SwissFEL Optics")) self.UITrack.setText(_translate("ElegantGUI", "Track")) + self.UITrackReload.setText(_translate("ElegantGUI", "Reload the Output Files")) self.label_8.setText(_translate("ElegantGUI", "Root Name")) self.UITrackRootName.setText(_translate("ElegantGUI", "SwissFEL")) self.UITrackStart.setText(_translate("ElegantGUI", "SINLH01")) diff --git a/ui/ElegantToolsGui.ui b/ui/ElegantToolsGui.ui index 31e0880..6d63fdd 100644 --- a/ui/ElegantToolsGui.ui +++ b/ui/ElegantToolsGui.ui @@ -57,6 +57,20 @@ + + + + + 12 + 75 + true + + + + Reload the Output Files + + +