1 Commits

8 changed files with 283 additions and 147 deletions
+57 -31
View File
@@ -4,7 +4,16 @@
<option name="autoReloadType" value="SELECTIVE" /> <option name="autoReloadType" value="SELECTIVE" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="0efcf7ff-c00b-4b53-9800-80ad65aeaff9" name="Changes" comment="Fixed to filter for non-existing elements when initializing from a setting file" /> <list default="true" id="0efcf7ff-c00b-4b53-9800-80ad65aeaff9" name="Changes" comment="Migrating repo">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ElegantTools.py" beforeDir="false" afterPath="$PROJECT_DIR$/ElegantTools.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/distribution.py" beforeDir="false" afterPath="$PROJECT_DIR$/distribution.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/model.py" beforeDir="false" afterPath="$PROJECT_DIR$/model.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/plot.py" beforeDir="false" afterPath="$PROJECT_DIR$/plot.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/track.py" beforeDir="false" afterPath="$PROJECT_DIR$/track.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ui/ElegantToolsGui.py" beforeDir="false" afterPath="$PROJECT_DIR$/ui/ElegantToolsGui.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ui/ElegantToolsGui.ui" beforeDir="false" afterPath="$PROJECT_DIR$/ui/ElegantToolsGui.ui" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -18,6 +27,11 @@
</option> </option>
</component> </component>
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="dev" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component> </component>
<component name="McpProjectServerCommands"> <component name="McpProjectServerCommands">
@@ -32,31 +46,31 @@
<option name="hideEmptyMiddlePackages" value="true" /> <option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" /> <option name="showLibraryContents" value="true" />
</component> </component>
<component name="PropertiesComponent"><![CDATA[{ <component name="PropertiesComponent">{
"keyToString": { &quot;keyToString&quot;: {
"ModuleVcsDetector.initialDetectionPerformed": "true", &quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
"Python.ElegantTools.executor": "Run", &quot;Python.ElegantTools.executor&quot;: &quot;Run&quot;,
"RunOnceActivity.MCP Project settings loaded": "true", &quot;RunOnceActivity.MCP Project settings loaded&quot;: &quot;true&quot;,
"RunOnceActivity.ShowReadmeOnStart": "true", &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", &quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252&quot;: &quot;true&quot;,
"RunOnceActivity.git.unshallow": "true", &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
"RunOnceActivity.typescript.service.memoryLimit.init": "true", &quot;RunOnceActivity.typescript.service.memoryLimit.init&quot;: &quot;true&quot;,
"SHELLCHECK.PATH": "I do mind", &quot;SHELLCHECK.PATH&quot;: &quot;I do mind&quot;,
"ai.playground.ignore.import.keys.banner.in.settings": "true", &quot;ai.playground.ignore.import.keys.banner.in.settings&quot;: &quot;true&quot;,
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true", &quot;com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1&quot;: &quot;true&quot;,
"git-widget-placeholder": "main", &quot;git-widget-placeholder&quot;: &quot;main&quot;,
"junie.onboarding.icon.badge.shown": "true", &quot;junie.onboarding.icon.badge.shown&quot;: &quot;true&quot;,
"last_opened_file_path": "/home/reiche/Codes/Python/Modelling/ElegantTools", &quot;last_opened_file_path&quot;: &quot;/home/reiche/Codes/Python/Modelling/ElegantTools&quot;,
"node.js.detected.package.eslint": "true", &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
"node.js.detected.package.tslint": "true", &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
"node.js.selected.package.eslint": "(autodetect)", &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
"node.js.selected.package.tslint": "(autodetect)", &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
"nodejs_package_manager_path": "npm", &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable", &quot;settings.editor.selected.configurable&quot;: &quot;com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable&quot;,
"to.speed.mode.migration.done": "true", &quot;to.speed.mode.migration.done&quot;: &quot;true&quot;,
"vue.rearranger.settings.migration": "true" &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
} }
}]]></component> }</component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/Runs" /> <recent name="$PROJECT_DIR$/Runs" />
@@ -101,8 +115,8 @@
<component name="SharedIndexes"> <component name="SharedIndexes">
<attachedChunks> <attachedChunks>
<set> <set>
<option value="bundled-js-predefined-d6986cc7102b-9b0f141eb926-JavaScript-PY-253.29346.308" /> <option value="bundled-js-predefined-d6986cc7102b-9b0f141eb926-JavaScript-PY-253.31033.139" />
<option value="bundled-python-sdk-ca5e2b39c7df-6e1f45a539f7-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-253.29346.308" /> <option value="bundled-python-sdk-2653e85de345-6d6dccd035ac-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-253.31033.139" />
</set> </set>
</attachedChunks> </attachedChunks>
</component> </component>
@@ -117,7 +131,10 @@
<workItem from="1753184384816" duration="49046000" /> <workItem from="1753184384816" duration="49046000" />
<workItem from="1753433608932" duration="2368000" /> <workItem from="1753433608932" duration="2368000" />
<workItem from="1753700276583" duration="1239000" /> <workItem from="1753700276583" duration="1239000" />
<workItem from="1769421276584" duration="2171000" /> <workItem from="1769421276584" duration="3404000" />
<workItem from="1772625641497" duration="2357000" />
<workItem from="1772704898677" duration="3651000" />
<workItem from="1772711572989" duration="8172000" />
</task> </task>
<task id="LOCAL-00001" summary="Initial Commit"> <task id="LOCAL-00001" summary="Initial Commit">
<option name="closed" value="true" /> <option name="closed" value="true" />
@@ -191,7 +208,15 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1769421900912</updated> <updated>1769421900912</updated>
</task> </task>
<option name="localTasksCounter" value="10" /> <task id="LOCAL-00010" summary="Migrating repo">
<option name="closed" value="true" />
<created>1769423688133</created>
<option name="number" value="00010" />
<option name="presentableId" value="LOCAL-00010" />
<option name="project" value="LOCAL" />
<updated>1769423688133</updated>
</task>
<option name="localTasksCounter" value="11" />
<servers /> <servers />
</component> </component>
<component name="TypeScriptGeneratedFilesManager"> <component name="TypeScriptGeneratedFilesManager">
@@ -213,9 +238,10 @@
<MESSAGE value="Plotting of elegant results implemented" /> <MESSAGE value="Plotting of elegant results implemented" />
<MESSAGE value="First release of ElegantTools" /> <MESSAGE value="First release of ElegantTools" />
<MESSAGE value="Fixed to filter for non-existing elements when initializing from a setting file" /> <MESSAGE value="Fixed to filter for non-existing elements when initializing from a setting file" />
<option name="LAST_COMMIT_MESSAGE" value="Fixed to filter for non-existing elements when initializing from a setting file" /> <MESSAGE value="Migrating repo" />
<option name="LAST_COMMIT_MESSAGE" value="Migrating repo" />
</component> </component>
<component name="com.intellij.coverage.CoverageDataManagerImpl"> <component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/ElegantTools$ElegantTools.coverage" NAME="ElegantTools Coverage Results" MODIFIED="1769421815378" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/ElegantTools$ElegantTools.coverage" NAME="ElegantTools Coverage Results" MODIFIED="1772718092788" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component> </component>
</project> </project>
+15 -1
View File
@@ -1,5 +1,5 @@
import sys import sys
#import json import json
#import webbrowser #import webbrowser
#import subprocess #import subprocess
from argparse import ArgumentParser from argparse import ArgumentParser
@@ -38,6 +38,7 @@ class ElegantTools(QtWidgets.QMainWindow, Ui_ElegantGUI):
self.UIDistCenter.clicked.connect(self.centerDist) self.UIDistCenter.clicked.connect(self.centerDist)
self.UIDistCut.clicked.connect(self.cutDist) self.UIDistCut.clicked.connect(self.cutDist)
self.UIDistInput.clicked.connect(self.setPreferredDist) self.UIDistInput.clicked.connect(self.setPreferredDist)
self.UILoadOpticsSettings.clicked.connect(self.loadOpticsSettings)
self.UILoadReference.clicked.connect(self.loadLattice) self.UILoadReference.clicked.connect(self.loadLattice)
self.UISaveReference.clicked.connect(self.saveLattice) self.UISaveReference.clicked.connect(self.saveLattice)
@@ -103,6 +104,19 @@ class ElegantTools(QtWidgets.QMainWindow, Ui_ElegantGUI):
return return
self.model.loadLatticeSettings(fileName) self.model.loadLatticeSettings(fileName)
def loadOpticsSettings(self):
options = QtWidgets.QFileDialog.Options()
options |= QtWidgets.QFileDialog.DontUseNativeDialog
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open Lattice Settings",
"LatticeSettings/default.json",
"Json Files(*.json)", options=options)
if not fileName:
return
with open(fileName, 'r', encoding='utf-8') as f:
settings = json.load(f)
self.model.loadSettings(settings)
def saveLattice(self): def saveLattice(self):
options = QtWidgets.QFileDialog.Options() options = QtWidgets.QFileDialog.Options()
options |= QtWidgets.QFileDialog.DontUseNativeDialog options |= QtWidgets.QFileDialog.DontUseNativeDialog
+78 -59
View File
@@ -1,7 +1,8 @@
import sdds import pysdds
import copy import copy
import subprocess import subprocess
import numpy as np import numpy as np
import pandas as pd
class Distribution: class Distribution:
def __init__(self,parent=None,filename=None): def __init__(self,parent=None,filename=None):
@@ -14,41 +15,56 @@ class Distribution:
self.loadDist() self.loadDist()
def getQ(self): def getQ(self):
return self.dist.parameterData[self.parameters.index('Charge')][0] return self.Q
def plotLPS(self): def plotLPS(self):
x = self.dist.columnData[self.columns.index('t')][0] self.parent.plot.LPS(self.t,self.p,self.Q)
y = self.dist.columnData[self.columns.index('p')][0]
Q = self.dist.parameterData[self.parameters.index('Charge')][0]
self.parent.plot.LPS(x,y,Q)
def loadDist(self): def loadDist(self):
if self.filename is None: if self.filename is None:
return return
self.dist = sdds.load(self.filename) self.dist = pysdds.read(self.filename)
self.distcopy = copy.deepcopy(self.dist) self.distCopy = copy.deepcopy(self.dist)
self.columns = self.dist.columnName self.Q = self.dist.par('Charge').data[0]
self.parameters =self.dist.parameterName self.x = self.dist.col('x').data[0]
Q = self.dist.parameterData[self.parameters.index('Charge')][0] self.xp = self.dist.col('xp').data[0]
if Q < 1e-15: self.y = self.dist.col('y').data[0]
Q = float(str(self.parent.UIDistCharge.text()))*1e-12 self.yp = self.dist.col('yp').data[0]
self.dist.setParameterValue('Charge',Q) self.t = self.dist.col('t').data[0]
self.analyseBeam(self.filename,Q) self.p = self.dist.col('p').data[0]
if self.Q < 1e-15:
self.Q = float(str(self.parent.UIDistCharge.text()))*1e-12
self.plotLPS() self.plotLPS()
def getTwiss(self,x,xp,p):
x1 = np.mean(x)
x2= np.mean(x*x)
xp1 = np.mean(xp)
xp2 = np.mean(xp*xp)
xxp1 = np.mean(x*xp)
g1=np.mean(p)
ex = np.sqrt((x2-x1*x1)*(xp2-xp1*xp1)-(xxp1-x1*xp1)**2)*g1
bx = (x2-x1*x1)*g1/ex
ax = - (xxp1-x1*xp1)*g1/ex
return bx,ax,ex
def analyseBeamShort(self,filename): def analyseBeamShort(self,filename):
output = 'Runs/analysebeam.sdds' dist = pysdds.read(filename)
subprocess.run(['sddsanalyzebeam', filename, output]) p = dist.col('p').data[0]
fields = ['betax', 'betay', 'alphax', 'alphay', 'pAverage'] x = dist.col('x').data[0]
out = sdds.load(output) xp = dist.col('xp').data[0]
y = dist.col('y').data[0]
yp = dist.col('yp').data[0]
bx, ax, ex = self.getTwiss(x,xp,p)
by, ay, ey = self.getTwiss(y,yp,p)
res={} res={}
for i ,field in enumerate(fields): res['betax']=bx
idx = out.columnName.index(field) res['alphax']=ax
res[field]=out.columnData[idx][0][0] res['betay'] = by
res['Q']=self.dist.parameterData[self.parameters.index('Charge')][0] res['alphay'] = ay
del out res['pAverage'] = np.mean(p)
return res return res
def analyseBeam(self,filename,Q): def analyseBeam(self,filename,Q):
@@ -89,53 +105,56 @@ class Distribution:
def addBlurr(self): def addBlurr(self):
p=self.dist.columnData[self.columns.index('p')][0] ns=len(self.p)
ns=len(p)
blurr = float(str(self.parent.UIDistSpread.text())) / 511. blurr = float(str(self.parent.UIDistSpread.text())) / 511.
dg = np.random.normal(0, blurr, size=ns) dg = np.random.normal(0, blurr, size=ns)
self.dist.setColumnValueList('p', [p[i]+dg[i] for i in range(ns)]) self.p += dg
self.plotLPS() self.plotLPS()
def centerDist(self): def centerDist(self):
Q = float(str(self.parent.UIDistCharge.text()))*1e-12 self.Q = float(str(self.parent.UIDistCharge.text()))*1e-12
self.dist.setParameterValue('Charge', Q)
pCenter = float(str(self.parent.UIDistEnergy.text()))/0.511 pCenter = float(str(self.parent.UIDistEnergy.text()))/0.511
p = self.dist.columnData[self.columns.index('p')][0] self.p = self.p - np.mean(self.p)+pCenter
p = p - np.mean(p)+pCenter
self.dist.columnData[self.columns.index('p')][0] = [p0 for p0 in p]
#self.dist.setColumnValueList('p', p)
self.plotLPS() self.plotLPS()
def cutDist(self): def cutDist(self):
cut = float(str(self.parent.UIDistLength.text())) sigma = float(str(self.parent.UIDistLength.text()))
t = self.dist.columnData[self.columns.index('t')][0] if sigma <=0:
nti=len(t) return
t0 = np.mean(t) rmsT=np.std(self.t)
trms = np.std(t) idx=np.argwhere(np.abs(self.t)< rmsT*sigma)
tmin = t0-cut*trms N0 = float(len(self.t))
tmax = t0+cut*trms self.x=self.x[idx]
idx = np.argwhere(np.logical_and(t > tmin,t < tmax)) self.y=self.y[idx]
ntf = len(idx) self.xp=self.xp[idx]
for i, fld in enumerate(self.columns): self.yp=self.yp[idx]
dat = np.array(self.dist.columnData[i][0]) self.p=self.p[idx]
self.dist.setColumnValueList(fld, [d for d in dat[idx].ravel()]) self.t=self.t[idx]
Q = self.dist.parameterData[self.parameters.index('Charge')][0]*float(ntf)/float(nti) N1 = float(len(self.t))
self.dist.setParameterValue('Charge', Q) self.Q = self.Q*N1/N0
self.plotLPS() self.plotLPS()
def revertDist(self): def revertDist(self):
self.dist=copy.deepcopy(self.dist) self.dist=copy.deepcopy(self.dist)
def saveDist(self,filename): def saveDist(self,filename):
x=sdds.SDDS() if len(self.t.shape) > 1:
x.mode = sdds.SDDS_BINARY meas_df = {'t': self.t[:, 0], 'p': self.p[:, 0], 'x': self.x[:, 0], 'xp': self.xp[:, 0],
x.description[0]="test" 'y': self.y[:, 0], 'yp': self.yp[:, 0], }
x.description[1]="test" else:
x.parameterName=self.dist.parameterName meas_df = {'t': self.t[:], 'p': self.p[:], 'x': self.x[:], 'xp': self.xp[:],
x.parameterData=self.dist.parameterData 'y': self.y[:], 'yp': self.yp[:], }
x.parameterDefinition = self.dist.parameterDefinition df_meas = pd.DataFrame.from_dict(meas_df)
x.columnName=self.dist.columnName parameters = {'Charge': [float(self.Q)]}
x.columnData=[self.dist.columnData[i] for i in range(len(self.dist.columnName))] subprocess.run(['rm', filename])
x.columnDefinition=self.dist.columnDefinition sdds = pysdds.SDDSFile.from_df([df_meas], parameter_dict=parameters, mode='binary')
x.save(filename) sdds.col('x').nm['units']= 'm'
del x sdds.col('y').nm['units'] = 'm'
sdds.col('t').nm['units'] = 's'
sdds.col('p').nm['units'] = 'm$be$nc'
sdds.par('Charge').nm['units']='C'
sdds.validate_data()
pysdds.write(sdds, filename)
+21 -15
View File
@@ -77,27 +77,33 @@ class Model:
ele.__dict__[field]/=ele.Length ele.__dict__[field]/=ele.Length
def loadSettings(self,settings): def loadSettings(self,settings):
self.loadSettingsGroup(settings['Quadrupole'],['k1'])
if not 'Phase' in settings.keys():
return False
if not settings['Phase'] == self.phase:
return False
self.loadSettingsGroup(settings['Quadrupole'], ['k1'])
self.loadSettingsGroup(settings['Sextupole'], ['k2']) self.loadSettingsGroup(settings['Sextupole'], ['k2'])
self.loadSettingsGroup(settings['Dipole'], ['angle']) self.loadSettingsGroup(settings['Dipole'], ['angle'])
self.loadSettingsGroup(settings['RF'], ['Gradient'],normalized=True) self.loadSettingsGroup(settings['RF'], ['Gradient'], normalized=True)
self.loadSettingsGroup(settings['RF'], ['Phase']) self.loadSettingsGroup(settings['RF'], ['Phase'])
self.loadSettingsGroup(settings['Undulator'], ['K','kx','ky']) self.loadSettingsGroup(settings['Undulator'], ['K', 'kx', 'ky'])
self.loadSettingsGroup(settings['Kicker'], ['cory','design_kick']) self.loadSettingsGroup(settings['Kicker'], ['cory', 'design_kick'])
E0 = settings['Energy']['energy'] E0 = settings['Energy']['energy']
if isinstance(E0,list): if isinstance(E0, list):
E0=E0[0] E0 = E0[0]
E0Ref = settings['Energy']['location'] E0Ref = settings['Energy']['location']
if isinstance(E0,list): if isinstance(E0, list):
E0=E0[0] E0 = E0[0]
self.initEnergy=E0 self.initEnergy = E0
self.initEnergyRef=E0Ref self.initEnergyRef = E0Ref
self.om.forceEnergyAt(E0Ref, E0*1e6) self.om.forceEnergyAt(E0Ref, E0 * 1e6)
self.startTwiss = settings['InitialCondition'] self.startTwiss = settings['InitialCondition']
self.parent.UIDistBetax.setText('%7.3f' % self.startTwiss['betax0']) print('Initial Condition:',self.startTwiss)
self.parent.UIDistBetay.setText('%7.3f' % self.startTwiss['betay0']) self.parent.UIDistBetax.setText('%7.3f' % self.startTwiss['betx'])
self.parent.UIDistAlphax.setText('%7.3f' % self.startTwiss['alphax0']) self.parent.UIDistBetay.setText('%7.3f' % self.startTwiss['bety'])
self.parent.UIDistAlphay.setText('%7.3f' % self.startTwiss['alphay0']) self.parent.UIDistAlphax.setText('%7.3f' % self.startTwiss['alfx'])
self.parent.UIDistAlphay.setText('%7.3f' % self.startTwiss['alfy'])
self.parent.UIDistEnergy.setText('%7.3f' % E0) self.parent.UIDistEnergy.setText('%7.3f' % E0)
self.updateRFTable(settings['RF']) self.updateRFTable(settings['RF'])
+4 -4
View File
@@ -1,5 +1,5 @@
import sys import sys
import sdds import pysdds
from PyQt5 import QtWidgets,QtGui from PyQt5 import QtWidgets,QtGui
@@ -118,12 +118,12 @@ class ElegantPlot(QtWidgets.QMainWindow, Ui_ElegantPlotGUI):
self.UITwissValues.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.UITwissValues.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
def loadDist(self,filename): def loadDist(self,filename):
dist = sdds.load(filename) dist = pysdds.read(filename)
cols=['t','p','x','xp','y','yp'] cols=['t','p','x','xp','y','yp']
self.dist.clear() self.dist.clear()
for col in cols: for col in cols:
self.dist[col] = dist.columnData[dist.columnName.index(col)][0] self.dist[col] = dist.col(col)[0]
self.Q = dist.parameterData[dist.parameterName.index('Charge')][0] self.Q = dist.par('Charge').data[0]
return filename return filename
+13 -12
View File
@@ -2,7 +2,7 @@ from threading import Thread
import subprocess import subprocess
import re import re
import os import os
import sdds import pysdds
from PyQt5 import QtCore from PyQt5 import QtCore
@@ -62,7 +62,11 @@ class Track(QtCore.QObject):
self.parent.preferredDist.saveDist(distfile) self.parent.preferredDist.saveDist(distfile)
print('Input distribution copied to',distfile) print('Input distribution copied to',distfile)
res=self.parent.preferredDist.analyseBeamShort(distfile) res=self.parent.preferredDist.analyseBeamShort(distfile)
inputfile=self.writeInputFile('Runs',project,latfile,distfile,res) print(res)
downsample=int(str(self.parent.UISkipParticles.text()))
if downsample<1:
downsample = 1
inputfile=self.writeInputFile('Runs',project,latfile,distfile,res,downsample)
print('Input file written to',inputfile) print('Input file written to',inputfile)
# self.cmd=['mpirun','-np','10','Pelegant',inputfile] # self.cmd=['mpirun','-np','10','Pelegant',inputfile]
self.cmd=['elegant',inputfile] self.cmd=['elegant',inputfile]
@@ -74,6 +78,7 @@ class Track(QtCore.QObject):
def Telegant(self): def Telegant(self):
self.parent.UITrackOutput.appendPlainText('Starting thread to run elegant') self.parent.UITrackOutput.appendPlainText('Starting thread to run elegant')
# p = subprocess.run(self.cmd) # p = subprocess.run(self.cmd)
print('Elegant launch:',self.cmd)
p = subprocess.Popen(self.cmd,stdout=subprocess.PIPE, stderr=subprocess.STDOUT) p = subprocess.Popen(self.cmd,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, b''): for line in iter(p.stdout.readline, b''):
self.message.emit(line.decode('utf-8').strip()) self.message.emit(line.decode('utf-8').strip())
@@ -94,18 +99,15 @@ class Track(QtCore.QObject):
self.loadTracking() self.loadTracking()
def loadTracking(self): def loadTracking(self):
data = sdds.load(self.root+'.cen') data = pysdds.read(self.root+'.cen')
columns = data.columnName
res = {} res = {}
fields = ['s','ElementName','Cx','Cxp','Cy','Cyp','Cdelta','pCentral'] fields = ['s','ElementName','Cx','Cxp','Cy','Cyp','Cdelta','pCentral']
for field in fields: for field in fields:
res[field] = data.columnData[columns.index(field)][0] res[field] = data.col(field)[0]
del data data = pysdds.read(self.root + '.sig')
data = sdds.load(self.root + '.sig')
columns = data.columnName
fields = ['Sx', 'Sxp', 'Sy', 'Syp', 'Sdelta', 'St','enx','eny','ecnx','ecny','betaxBeam','betayBeam','alphaxBeam','alphayBeam'] fields = ['Sx', 'Sxp', 'Sy', 'Syp', 'Sdelta', 'St','enx','eny','ecnx','ecny','betaxBeam','betayBeam','alphaxBeam','alphayBeam']
for field in fields: for field in fields:
res[field] = data.columnData[columns.index(field)][0] res[field] = data.col(field)[0]
del data del data
dist = [self.root+'Inputdist.sdds']+self.getDumps() dist = [self.root+'Inputdist.sdds']+self.getDumps()
self.parent.plot.newData(res,dist) self.parent.plot.newData(res,dist)
@@ -126,7 +128,7 @@ class Track(QtCore.QObject):
# print(msg) # print(msg)
self.parent.UITrackOutput.appendPlainText(msg) self.parent.UITrackOutput.appendPlainText(msg)
def writeInputFile(self,path,name,latfile,distfile,distinfo): def writeInputFile(self,path,name,latfile,distfile,distinfo,ds):
filename = '%s/%s.ele' % (path, name) filename = '%s/%s.ele' % (path, name)
with open(filename, 'w') as fid: with open(filename, 'w') as fid:
fid.write('&run_setup\n') fid.write('&run_setup\n')
@@ -152,7 +154,6 @@ class Track(QtCore.QObject):
fid.write('\tn_steps\t= 1,\n') fid.write('\tn_steps\t= 1,\n')
fid.write('\treset_rf_for_each_step = 1\n') fid.write('\treset_rf_for_each_step = 1\n')
fid.write('&end\n\n') fid.write('&end\n\n')
fid.write('&twiss_output\n') fid.write('&twiss_output\n')
fid.write('\tfilename\t= %s/%%s.twi,\n' % path) fid.write('\tfilename\t= %s/%%s.twi,\n' % path)
fid.write('\tmatched\t\t= 0,\n') fid.write('\tmatched\t\t= 0,\n')
@@ -164,7 +165,7 @@ class Track(QtCore.QObject):
fid.write('&sdds_beam\n') fid.write('&sdds_beam\n')
fid.write('\tinput_type= "elegant",\n') fid.write('\tinput_type= "elegant",\n')
fid.write('\tsample_interval\t= 1,\n') fid.write('\tsample_interval\t= %d,\n' % ds)
fid.write('\tinput = %s,\n' % distfile) fid.write('\tinput = %s,\n' % distfile)
fid.write('\treuse_bunch\t= 0 \n') fid.write('\treuse_bunch\t= 0 \n')
fid.write('&end\n\n') fid.write('&end\n\n')
+37 -14
View File
@@ -28,8 +28,8 @@ class Ui_ElegantGUI(object):
self.TabMaster.setObjectName("TabMaster") self.TabMaster.setObjectName("TabMaster")
self.tab_3 = QtWidgets.QWidget() self.tab_3 = QtWidgets.QWidget()
self.tab_3.setObjectName("tab_3") self.tab_3.setObjectName("tab_3")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.tab_3) self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.tab_3)
self.horizontalLayout.setObjectName("horizontalLayout") self.verticalLayout_7.setObjectName("verticalLayout_7")
self.widget_2 = QtWidgets.QWidget(self.tab_3) self.widget_2 = QtWidgets.QWidget(self.tab_3)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
@@ -100,10 +100,26 @@ class Ui_ElegantGUI(object):
self.label_7 = QtWidgets.QLabel(self.widget_2) self.label_7 = QtWidgets.QLabel(self.widget_2)
self.label_7.setObjectName("label_7") self.label_7.setObjectName("label_7")
self.verticalLayout.addWidget(self.label_7) self.verticalLayout.addWidget(self.label_7)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.UITrackInput = QtWidgets.QLineEdit(self.widget_2) self.UITrackInput = QtWidgets.QLineEdit(self.widget_2)
self.UITrackInput.setReadOnly(True) self.UITrackInput.setReadOnly(True)
self.UITrackInput.setObjectName("UITrackInput") self.UITrackInput.setObjectName("UITrackInput")
self.verticalLayout.addWidget(self.UITrackInput) self.horizontalLayout.addWidget(self.UITrackInput)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.label_9 = QtWidgets.QLabel(self.widget_2)
self.label_9.setObjectName("label_9")
self.horizontalLayout.addWidget(self.label_9)
self.UISkipParticles = QtWidgets.QLineEdit(self.widget_2)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.UISkipParticles.sizePolicy().hasHeightForWidth())
self.UISkipParticles.setSizePolicy(sizePolicy)
self.UISkipParticles.setObjectName("UISkipParticles")
self.horizontalLayout.addWidget(self.UISkipParticles)
self.verticalLayout.addLayout(self.horizontalLayout)
self.UITrackDoLSC = QtWidgets.QCheckBox(self.widget_2) self.UITrackDoLSC = QtWidgets.QCheckBox(self.widget_2)
self.UITrackDoLSC.setChecked(True) self.UITrackDoLSC.setChecked(True)
self.UITrackDoLSC.setObjectName("UITrackDoLSC") self.UITrackDoLSC.setObjectName("UITrackDoLSC")
@@ -123,7 +139,7 @@ class Ui_ElegantGUI(object):
self.UITrackOutput = QtWidgets.QPlainTextEdit(self.widget_2) self.UITrackOutput = QtWidgets.QPlainTextEdit(self.widget_2)
self.UITrackOutput.setObjectName("UITrackOutput") self.UITrackOutput.setObjectName("UITrackOutput")
self.verticalLayout.addWidget(self.UITrackOutput) self.verticalLayout.addWidget(self.UITrackOutput)
self.horizontalLayout.addWidget(self.widget_2) self.verticalLayout_7.addWidget(self.widget_2)
self.TabMaster.addTab(self.tab_3, "") self.TabMaster.addTab(self.tab_3, "")
self.tab_8 = QtWidgets.QWidget() self.tab_8 = QtWidgets.QWidget()
self.tab_8.setObjectName("tab_8") self.tab_8.setObjectName("tab_8")
@@ -147,8 +163,8 @@ class Ui_ElegantGUI(object):
self.UIDistAnalysis.setReadOnly(True) self.UIDistAnalysis.setReadOnly(True)
self.UIDistAnalysis.setObjectName("UIDistAnalysis") self.UIDistAnalysis.setObjectName("UIDistAnalysis")
self.verticalLayout_4.addWidget(self.UIDistAnalysis) self.verticalLayout_4.addWidget(self.UIDistAnalysis)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem) self.verticalLayout_4.addItem(spacerItem1)
self.UIDistInput = QtWidgets.QPushButton(self.tab_8) self.UIDistInput = QtWidgets.QPushButton(self.tab_8)
self.UIDistInput.setObjectName("UIDistInput") self.UIDistInput.setObjectName("UIDistInput")
self.verticalLayout_4.addWidget(self.UIDistInput) self.verticalLayout_4.addWidget(self.UIDistInput)
@@ -227,8 +243,8 @@ class Ui_ElegantGUI(object):
self.UIDistCut = QtWidgets.QPushButton(self.tab_8) self.UIDistCut = QtWidgets.QPushButton(self.tab_8)
self.UIDistCut.setObjectName("UIDistCut") self.UIDistCut.setObjectName("UIDistCut")
self.verticalLayout_3.addWidget(self.UIDistCut) self.verticalLayout_3.addWidget(self.UIDistCut)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_3.addItem(spacerItem1) self.verticalLayout_3.addItem(spacerItem2)
self.UIDistSave = QtWidgets.QPushButton(self.tab_8) self.UIDistSave = QtWidgets.QPushButton(self.tab_8)
self.UIDistSave.setObjectName("UIDistSave") self.UIDistSave.setObjectName("UIDistSave")
self.verticalLayout_3.addWidget(self.UIDistSave) self.verticalLayout_3.addWidget(self.UIDistSave)
@@ -246,6 +262,10 @@ class Ui_ElegantGUI(object):
self.UISaveReference = QtWidgets.QPushButton(self.tab_2) self.UISaveReference = QtWidgets.QPushButton(self.tab_2)
self.UISaveReference.setObjectName("UISaveReference") self.UISaveReference.setObjectName("UISaveReference")
self.verticalLayout_2.addWidget(self.UISaveReference) self.verticalLayout_2.addWidget(self.UISaveReference)
self.UILoadOpticsSettings = QtWidgets.QPushButton(self.tab_2)
self.UILoadOpticsSettings.setStyleSheet("background-color: rgb(255, 255, 127);")
self.UILoadOpticsSettings.setObjectName("UILoadOpticsSettings")
self.verticalLayout_2.addWidget(self.UILoadOpticsSettings)
self.label_3 = QtWidgets.QLabel(self.tab_2) self.label_3 = QtWidgets.QLabel(self.tab_2)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
@@ -332,8 +352,8 @@ class Ui_ElegantGUI(object):
self.UIDeleteDump = QtWidgets.QPushButton(self.tab_2) self.UIDeleteDump = QtWidgets.QPushButton(self.tab_2)
self.UIDeleteDump.setObjectName("UIDeleteDump") self.UIDeleteDump.setObjectName("UIDeleteDump")
self.verticalLayout_2.addWidget(self.UIDeleteDump) self.verticalLayout_2.addWidget(self.UIDeleteDump)
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_2.addItem(spacerItem2) self.verticalLayout_2.addItem(spacerItem3)
self.horizontalLayout_2.addLayout(self.verticalLayout_2) self.horizontalLayout_2.addLayout(self.verticalLayout_2)
self.verticalLayout_6 = QtWidgets.QVBoxLayout() self.verticalLayout_6 = QtWidgets.QVBoxLayout()
self.verticalLayout_6.setObjectName("verticalLayout_6") self.verticalLayout_6.setObjectName("verticalLayout_6")
@@ -377,8 +397,8 @@ class Ui_ElegantGUI(object):
self.UIAddSectionDump = QtWidgets.QPushButton(self.tab_2) self.UIAddSectionDump = QtWidgets.QPushButton(self.tab_2)
self.UIAddSectionDump.setObjectName("UIAddSectionDump") self.UIAddSectionDump.setObjectName("UIAddSectionDump")
self.verticalLayout_6.addWidget(self.UIAddSectionDump) self.verticalLayout_6.addWidget(self.UIAddSectionDump)
spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_6.addItem(spacerItem3) self.verticalLayout_6.addItem(spacerItem4)
self.horizontalLayout_2.addLayout(self.verticalLayout_6) self.horizontalLayout_2.addLayout(self.verticalLayout_6)
self.TabMaster.addTab(self.tab_2, "") self.TabMaster.addTab(self.tab_2, "")
self.verticalLayout_5.addWidget(self.TabMaster) self.verticalLayout_5.addWidget(self.TabMaster)
@@ -521,7 +541,7 @@ class Ui_ElegantGUI(object):
self.menubar.addAction(self.menuHelp.menuAction()) self.menubar.addAction(self.menuHelp.menuAction())
self.retranslateUi(ElegantGUI) self.retranslateUi(ElegantGUI)
self.TabMaster.setCurrentIndex(0) self.TabMaster.setCurrentIndex(2)
self.actionQuit.triggered.connect(ElegantGUI.close) # type: ignore self.actionQuit.triggered.connect(ElegantGUI.close) # type: ignore
QtCore.QMetaObject.connectSlotsByName(ElegantGUI) QtCore.QMetaObject.connectSlotsByName(ElegantGUI)
@@ -535,9 +555,11 @@ class Ui_ElegantGUI(object):
self.UITrackStart.setText(_translate("ElegantGUI", "SINLH01")) self.UITrackStart.setText(_translate("ElegantGUI", "SINLH01"))
self.label_2.setText(_translate("ElegantGUI", "End-Section")) self.label_2.setText(_translate("ElegantGUI", "End-Section"))
self.label.setText(_translate("ElegantGUI", "Start-Section")) self.label.setText(_translate("ElegantGUI", "Start-Section"))
self.UITrackEnd.setText(_translate("ElegantGUI", "SATBD02")) self.UITrackEnd.setText(_translate("ElegantGUI", "SINDI02"))
self.label_7.setText(_translate("ElegantGUI", "Input Distribution")) self.label_7.setText(_translate("ElegantGUI", "Input Distribution"))
self.UITrackInput.setText(_translate("ElegantGUI", "not yet defined")) self.UITrackInput.setText(_translate("ElegantGUI", "not yet defined"))
self.label_9.setText(_translate("ElegantGUI", "Skip"))
self.UISkipParticles.setText(_translate("ElegantGUI", "10"))
self.UITrackDoLSC.setText(_translate("ElegantGUI", "Include Longitudinal Space Charge")) self.UITrackDoLSC.setText(_translate("ElegantGUI", "Include Longitudinal Space Charge"))
self.UITrackDoCSR.setText(_translate("ElegantGUI", "Include Coherent Synchrotron Radiation")) self.UITrackDoCSR.setText(_translate("ElegantGUI", "Include Coherent Synchrotron Radiation"))
self.UITrackAutoAlign.setText(_translate("ElegantGUI", "Align Beam After Each Chicane")) self.UITrackAutoAlign.setText(_translate("ElegantGUI", "Align Beam After Each Chicane"))
@@ -571,6 +593,7 @@ class Ui_ElegantGUI(object):
self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_8), _translate("ElegantGUI", "Distribution")) self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_8), _translate("ElegantGUI", "Distribution"))
self.UILoadReference.setText(_translate("ElegantGUI", "Load Settings")) self.UILoadReference.setText(_translate("ElegantGUI", "Load Settings"))
self.UISaveReference.setText(_translate("ElegantGUI", "Save Settings")) self.UISaveReference.setText(_translate("ElegantGUI", "Save Settings"))
self.UILoadOpticsSettings.setText(_translate("ElegantGUI", "Import OpticsTool Settings"))
self.label_3.setText(_translate("ElegantGUI", "RF Settings")) self.label_3.setText(_translate("ElegantGUI", "RF Settings"))
item = self.UIRFSettings.verticalHeaderItem(0) item = self.UIRFSettings.verticalHeaderItem(0)
item.setText(_translate("ElegantGUI", "New Row")) item.setText(_translate("ElegantGUI", "New Row"))
+58 -11
View File
@@ -24,13 +24,13 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>2</number>
</property> </property>
<widget class="QWidget" name="tab_3"> <widget class="QWidget" name="tab_3">
<attribute name="title"> <attribute name="title">
<string>Track</string> <string>Track</string>
</attribute> </attribute>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QVBoxLayout" name="verticalLayout_7">
<item> <item>
<widget class="QWidget" name="widget_2" native="true"> <widget class="QWidget" name="widget_2" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
@@ -135,7 +135,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text"> <property name="text">
<string>SATBD02</string> <string>SINDI02</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -149,14 +149,51 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="UITrackInput"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="text"> <item>
<string>not yet defined</string> <widget class="QLineEdit" name="UITrackInput">
</property> <property name="text">
<property name="readOnly"> <string>not yet defined</string>
<bool>true</bool> </property>
</property> <property name="readOnly">
</widget> <bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_9">
<property name="text">
<string>Skip</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="UISkipParticles">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>10</string>
</property>
</widget>
</item>
</layout>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="UITrackDoLSC"> <widget class="QCheckBox" name="UITrackDoLSC">
@@ -469,6 +506,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="UILoadOpticsSettings">
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 127);</string>
</property>
<property name="text">
<string>Import OpticsTool Settings</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="sizePolicy"> <property name="sizePolicy">