Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e445af83e9 |
Generated
+57
-31
@@ -4,7 +4,16 @@
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<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="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
@@ -18,6 +27,11 @@
|
||||
</option>
|
||||
</component>
|
||||
<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$" />
|
||||
</component>
|
||||
<component name="McpProjectServerCommands">
|
||||
@@ -32,31 +46,31 @@
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||
"Python.ElegantTools.executor": "Run",
|
||||
"RunOnceActivity.MCP Project settings loaded": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
||||
"RunOnceActivity.git.unshallow": "true",
|
||||
"RunOnceActivity.typescript.service.memoryLimit.init": "true",
|
||||
"SHELLCHECK.PATH": "I do mind",
|
||||
"ai.playground.ignore.import.keys.banner.in.settings": "true",
|
||||
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
|
||||
"git-widget-placeholder": "main",
|
||||
"junie.onboarding.icon.badge.shown": "true",
|
||||
"last_opened_file_path": "/home/reiche/Codes/Python/Modelling/ElegantTools",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable",
|
||||
"to.speed.mode.migration.done": "true",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||
"Python.ElegantTools.executor": "Run",
|
||||
"RunOnceActivity.MCP Project settings loaded": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
||||
"RunOnceActivity.git.unshallow": "true",
|
||||
"RunOnceActivity.typescript.service.memoryLimit.init": "true",
|
||||
"SHELLCHECK.PATH": "I do mind",
|
||||
"ai.playground.ignore.import.keys.banner.in.settings": "true",
|
||||
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
|
||||
"git-widget-placeholder": "main",
|
||||
"junie.onboarding.icon.badge.shown": "true",
|
||||
"last_opened_file_path": "/home/reiche/Codes/Python/Modelling/ElegantTools",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable",
|
||||
"to.speed.mode.migration.done": "true",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
}
|
||||
}]]></component>
|
||||
}</component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="$PROJECT_DIR$/Runs" />
|
||||
@@ -101,8 +115,8 @@
|
||||
<component name="SharedIndexes">
|
||||
<attachedChunks>
|
||||
<set>
|
||||
<option value="bundled-js-predefined-d6986cc7102b-9b0f141eb926-JavaScript-PY-253.29346.308" />
|
||||
<option value="bundled-python-sdk-ca5e2b39c7df-6e1f45a539f7-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-253.29346.308" />
|
||||
<option value="bundled-js-predefined-d6986cc7102b-9b0f141eb926-JavaScript-PY-253.31033.139" />
|
||||
<option value="bundled-python-sdk-2653e85de345-6d6dccd035ac-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-253.31033.139" />
|
||||
</set>
|
||||
</attachedChunks>
|
||||
</component>
|
||||
@@ -117,7 +131,10 @@
|
||||
<workItem from="1753184384816" duration="49046000" />
|
||||
<workItem from="1753433608932" duration="2368000" />
|
||||
<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 id="LOCAL-00001" summary="Initial Commit">
|
||||
<option name="closed" value="true" />
|
||||
@@ -191,7 +208,15 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1769421900912</updated>
|
||||
</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 />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
@@ -213,9 +238,10 @@
|
||||
<MESSAGE value="Plotting of elegant results implemented" />
|
||||
<MESSAGE value="First release of ElegantTools" />
|
||||
<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 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>
|
||||
</project>
|
||||
+15
-1
@@ -1,5 +1,5 @@
|
||||
import sys
|
||||
#import json
|
||||
import json
|
||||
#import webbrowser
|
||||
#import subprocess
|
||||
from argparse import ArgumentParser
|
||||
@@ -38,6 +38,7 @@ class ElegantTools(QtWidgets.QMainWindow, Ui_ElegantGUI):
|
||||
self.UIDistCenter.clicked.connect(self.centerDist)
|
||||
self.UIDistCut.clicked.connect(self.cutDist)
|
||||
self.UIDistInput.clicked.connect(self.setPreferredDist)
|
||||
self.UILoadOpticsSettings.clicked.connect(self.loadOpticsSettings)
|
||||
self.UILoadReference.clicked.connect(self.loadLattice)
|
||||
self.UISaveReference.clicked.connect(self.saveLattice)
|
||||
|
||||
@@ -103,6 +104,19 @@ class ElegantTools(QtWidgets.QMainWindow, Ui_ElegantGUI):
|
||||
return
|
||||
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):
|
||||
options = QtWidgets.QFileDialog.Options()
|
||||
options |= QtWidgets.QFileDialog.DontUseNativeDialog
|
||||
|
||||
+78
-59
@@ -1,7 +1,8 @@
|
||||
import sdds
|
||||
import pysdds
|
||||
import copy
|
||||
import subprocess
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
class Distribution:
|
||||
def __init__(self,parent=None,filename=None):
|
||||
@@ -14,41 +15,56 @@ class Distribution:
|
||||
self.loadDist()
|
||||
|
||||
def getQ(self):
|
||||
return self.dist.parameterData[self.parameters.index('Charge')][0]
|
||||
return self.Q
|
||||
|
||||
def plotLPS(self):
|
||||
x = self.dist.columnData[self.columns.index('t')][0]
|
||||
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)
|
||||
self.parent.plot.LPS(self.t,self.p,self.Q)
|
||||
|
||||
def loadDist(self):
|
||||
if self.filename is None:
|
||||
return
|
||||
self.dist = sdds.load(self.filename)
|
||||
self.distcopy = copy.deepcopy(self.dist)
|
||||
self.columns = self.dist.columnName
|
||||
self.parameters =self.dist.parameterName
|
||||
Q = self.dist.parameterData[self.parameters.index('Charge')][0]
|
||||
if Q < 1e-15:
|
||||
Q = float(str(self.parent.UIDistCharge.text()))*1e-12
|
||||
self.dist.setParameterValue('Charge',Q)
|
||||
self.analyseBeam(self.filename,Q)
|
||||
self.dist = pysdds.read(self.filename)
|
||||
self.distCopy = copy.deepcopy(self.dist)
|
||||
self.Q = self.dist.par('Charge').data[0]
|
||||
self.x = self.dist.col('x').data[0]
|
||||
self.xp = self.dist.col('xp').data[0]
|
||||
self.y = self.dist.col('y').data[0]
|
||||
self.yp = self.dist.col('yp').data[0]
|
||||
self.t = self.dist.col('t').data[0]
|
||||
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()
|
||||
|
||||
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):
|
||||
output = 'Runs/analysebeam.sdds'
|
||||
subprocess.run(['sddsanalyzebeam', filename, output])
|
||||
fields = ['betax', 'betay', 'alphax', 'alphay', 'pAverage']
|
||||
out = sdds.load(output)
|
||||
dist = pysdds.read(filename)
|
||||
p = dist.col('p').data[0]
|
||||
x = dist.col('x').data[0]
|
||||
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={}
|
||||
for i ,field in enumerate(fields):
|
||||
idx = out.columnName.index(field)
|
||||
res[field]=out.columnData[idx][0][0]
|
||||
res['Q']=self.dist.parameterData[self.parameters.index('Charge')][0]
|
||||
del out
|
||||
res['betax']=bx
|
||||
res['alphax']=ax
|
||||
res['betay'] = by
|
||||
res['alphay'] = ay
|
||||
res['pAverage'] = np.mean(p)
|
||||
return res
|
||||
|
||||
def analyseBeam(self,filename,Q):
|
||||
@@ -89,53 +105,56 @@ class Distribution:
|
||||
|
||||
|
||||
def addBlurr(self):
|
||||
p=self.dist.columnData[self.columns.index('p')][0]
|
||||
ns=len(p)
|
||||
ns=len(self.p)
|
||||
blurr = float(str(self.parent.UIDistSpread.text())) / 511.
|
||||
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()
|
||||
|
||||
def centerDist(self):
|
||||
Q = float(str(self.parent.UIDistCharge.text()))*1e-12
|
||||
self.dist.setParameterValue('Charge', Q)
|
||||
self.Q = float(str(self.parent.UIDistCharge.text()))*1e-12
|
||||
pCenter = float(str(self.parent.UIDistEnergy.text()))/0.511
|
||||
p = self.dist.columnData[self.columns.index('p')][0]
|
||||
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.p = self.p - np.mean(self.p)+pCenter
|
||||
self.plotLPS()
|
||||
|
||||
|
||||
def cutDist(self):
|
||||
cut = float(str(self.parent.UIDistLength.text()))
|
||||
t = self.dist.columnData[self.columns.index('t')][0]
|
||||
nti=len(t)
|
||||
t0 = np.mean(t)
|
||||
trms = np.std(t)
|
||||
tmin = t0-cut*trms
|
||||
tmax = t0+cut*trms
|
||||
idx = np.argwhere(np.logical_and(t > tmin,t < tmax))
|
||||
ntf = len(idx)
|
||||
for i, fld in enumerate(self.columns):
|
||||
dat = np.array(self.dist.columnData[i][0])
|
||||
self.dist.setColumnValueList(fld, [d for d in dat[idx].ravel()])
|
||||
Q = self.dist.parameterData[self.parameters.index('Charge')][0]*float(ntf)/float(nti)
|
||||
self.dist.setParameterValue('Charge', Q)
|
||||
sigma = float(str(self.parent.UIDistLength.text()))
|
||||
if sigma <=0:
|
||||
return
|
||||
rmsT=np.std(self.t)
|
||||
idx=np.argwhere(np.abs(self.t)< rmsT*sigma)
|
||||
N0 = float(len(self.t))
|
||||
self.x=self.x[idx]
|
||||
self.y=self.y[idx]
|
||||
self.xp=self.xp[idx]
|
||||
self.yp=self.yp[idx]
|
||||
self.p=self.p[idx]
|
||||
self.t=self.t[idx]
|
||||
N1 = float(len(self.t))
|
||||
self.Q = self.Q*N1/N0
|
||||
self.plotLPS()
|
||||
|
||||
def revertDist(self):
|
||||
self.dist=copy.deepcopy(self.dist)
|
||||
|
||||
def saveDist(self,filename):
|
||||
x=sdds.SDDS()
|
||||
x.mode = sdds.SDDS_BINARY
|
||||
x.description[0]="test"
|
||||
x.description[1]="test"
|
||||
x.parameterName=self.dist.parameterName
|
||||
x.parameterData=self.dist.parameterData
|
||||
x.parameterDefinition = self.dist.parameterDefinition
|
||||
x.columnName=self.dist.columnName
|
||||
x.columnData=[self.dist.columnData[i] for i in range(len(self.dist.columnName))]
|
||||
x.columnDefinition=self.dist.columnDefinition
|
||||
x.save(filename)
|
||||
del x
|
||||
if len(self.t.shape) > 1:
|
||||
meas_df = {'t': self.t[:, 0], 'p': self.p[:, 0], 'x': self.x[:, 0], 'xp': self.xp[:, 0],
|
||||
'y': self.y[:, 0], 'yp': self.yp[:, 0], }
|
||||
else:
|
||||
meas_df = {'t': self.t[:], 'p': self.p[:], 'x': self.x[:], 'xp': self.xp[:],
|
||||
'y': self.y[:], 'yp': self.yp[:], }
|
||||
df_meas = pd.DataFrame.from_dict(meas_df)
|
||||
parameters = {'Charge': [float(self.Q)]}
|
||||
subprocess.run(['rm', filename])
|
||||
sdds = pysdds.SDDSFile.from_df([df_meas], parameter_dict=parameters, mode='binary')
|
||||
sdds.col('x').nm['units']= 'm'
|
||||
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)
|
||||
|
||||
|
||||
@@ -77,27 +77,33 @@ class Model:
|
||||
ele.__dict__[field]/=ele.Length
|
||||
|
||||
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['Dipole'], ['angle'])
|
||||
self.loadSettingsGroup(settings['RF'], ['Gradient'],normalized=True)
|
||||
self.loadSettingsGroup(settings['RF'], ['Gradient'], normalized=True)
|
||||
self.loadSettingsGroup(settings['RF'], ['Phase'])
|
||||
self.loadSettingsGroup(settings['Undulator'], ['K','kx','ky'])
|
||||
self.loadSettingsGroup(settings['Kicker'], ['cory','design_kick'])
|
||||
self.loadSettingsGroup(settings['Undulator'], ['K', 'kx', 'ky'])
|
||||
self.loadSettingsGroup(settings['Kicker'], ['cory', 'design_kick'])
|
||||
E0 = settings['Energy']['energy']
|
||||
if isinstance(E0,list):
|
||||
E0=E0[0]
|
||||
if isinstance(E0, list):
|
||||
E0 = E0[0]
|
||||
E0Ref = settings['Energy']['location']
|
||||
if isinstance(E0,list):
|
||||
E0=E0[0]
|
||||
self.initEnergy=E0
|
||||
self.initEnergyRef=E0Ref
|
||||
self.om.forceEnergyAt(E0Ref, E0*1e6)
|
||||
if isinstance(E0, list):
|
||||
E0 = E0[0]
|
||||
self.initEnergy = E0
|
||||
self.initEnergyRef = E0Ref
|
||||
self.om.forceEnergyAt(E0Ref, E0 * 1e6)
|
||||
self.startTwiss = settings['InitialCondition']
|
||||
self.parent.UIDistBetax.setText('%7.3f' % self.startTwiss['betax0'])
|
||||
self.parent.UIDistBetay.setText('%7.3f' % self.startTwiss['betay0'])
|
||||
self.parent.UIDistAlphax.setText('%7.3f' % self.startTwiss['alphax0'])
|
||||
self.parent.UIDistAlphay.setText('%7.3f' % self.startTwiss['alphay0'])
|
||||
print('Initial Condition:',self.startTwiss)
|
||||
self.parent.UIDistBetax.setText('%7.3f' % self.startTwiss['betx'])
|
||||
self.parent.UIDistBetay.setText('%7.3f' % self.startTwiss['bety'])
|
||||
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.updateRFTable(settings['RF'])
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import sys
|
||||
import sdds
|
||||
import pysdds
|
||||
from PyQt5 import QtWidgets,QtGui
|
||||
|
||||
|
||||
@@ -118,12 +118,12 @@ class ElegantPlot(QtWidgets.QMainWindow, Ui_ElegantPlotGUI):
|
||||
self.UITwissValues.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
||||
|
||||
def loadDist(self,filename):
|
||||
dist = sdds.load(filename)
|
||||
dist = pysdds.read(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]
|
||||
self.dist[col] = dist.col(col)[0]
|
||||
self.Q = dist.par('Charge').data[0]
|
||||
return filename
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ from threading import Thread
|
||||
import subprocess
|
||||
import re
|
||||
import os
|
||||
import sdds
|
||||
import pysdds
|
||||
|
||||
from PyQt5 import QtCore
|
||||
|
||||
@@ -62,7 +62,11 @@ class Track(QtCore.QObject):
|
||||
self.parent.preferredDist.saveDist(distfile)
|
||||
print('Input distribution copied to',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)
|
||||
# self.cmd=['mpirun','-np','10','Pelegant',inputfile]
|
||||
self.cmd=['elegant',inputfile]
|
||||
@@ -74,6 +78,7 @@ class Track(QtCore.QObject):
|
||||
def Telegant(self):
|
||||
self.parent.UITrackOutput.appendPlainText('Starting thread to run elegant')
|
||||
# p = subprocess.run(self.cmd)
|
||||
print('Elegant launch:',self.cmd)
|
||||
p = subprocess.Popen(self.cmd,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
for line in iter(p.stdout.readline, b''):
|
||||
self.message.emit(line.decode('utf-8').strip())
|
||||
@@ -94,18 +99,15 @@ class Track(QtCore.QObject):
|
||||
self.loadTracking()
|
||||
|
||||
def loadTracking(self):
|
||||
data = sdds.load(self.root+'.cen')
|
||||
columns = data.columnName
|
||||
data = pysdds.read(self.root+'.cen')
|
||||
res = {}
|
||||
fields = ['s','ElementName','Cx','Cxp','Cy','Cyp','Cdelta','pCentral']
|
||||
for field in fields:
|
||||
res[field] = data.columnData[columns.index(field)][0]
|
||||
del data
|
||||
data = sdds.load(self.root + '.sig')
|
||||
columns = data.columnName
|
||||
res[field] = data.col(field)[0]
|
||||
data = pysdds.read(self.root + '.sig')
|
||||
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)][0]
|
||||
res[field] = data.col(field)[0]
|
||||
del data
|
||||
dist = [self.root+'Inputdist.sdds']+self.getDumps()
|
||||
self.parent.plot.newData(res,dist)
|
||||
@@ -126,7 +128,7 @@ class Track(QtCore.QObject):
|
||||
# print(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)
|
||||
with open(filename, 'w') as fid:
|
||||
fid.write('&run_setup\n')
|
||||
@@ -152,7 +154,6 @@ class Track(QtCore.QObject):
|
||||
fid.write('\tn_steps\t= 1,\n')
|
||||
fid.write('\treset_rf_for_each_step = 1\n')
|
||||
fid.write('&end\n\n')
|
||||
|
||||
fid.write('&twiss_output\n')
|
||||
fid.write('\tfilename\t= %s/%%s.twi,\n' % path)
|
||||
fid.write('\tmatched\t\t= 0,\n')
|
||||
@@ -164,7 +165,7 @@ class Track(QtCore.QObject):
|
||||
|
||||
fid.write('&sdds_beam\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('\treuse_bunch\t= 0 \n')
|
||||
fid.write('&end\n\n')
|
||||
|
||||
+37
-14
@@ -28,8 +28,8 @@ class Ui_ElegantGUI(object):
|
||||
self.TabMaster.setObjectName("TabMaster")
|
||||
self.tab_3 = QtWidgets.QWidget()
|
||||
self.tab_3.setObjectName("tab_3")
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout(self.tab_3)
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.tab_3)
|
||||
self.verticalLayout_7.setObjectName("verticalLayout_7")
|
||||
self.widget_2 = QtWidgets.QWidget(self.tab_3)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
@@ -100,10 +100,26 @@ class Ui_ElegantGUI(object):
|
||||
self.label_7 = QtWidgets.QLabel(self.widget_2)
|
||||
self.label_7.setObjectName("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.setReadOnly(True)
|
||||
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.setChecked(True)
|
||||
self.UITrackDoLSC.setObjectName("UITrackDoLSC")
|
||||
@@ -123,7 +139,7 @@ class Ui_ElegantGUI(object):
|
||||
self.UITrackOutput = QtWidgets.QPlainTextEdit(self.widget_2)
|
||||
self.UITrackOutput.setObjectName("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.tab_8 = QtWidgets.QWidget()
|
||||
self.tab_8.setObjectName("tab_8")
|
||||
@@ -147,8 +163,8 @@ class Ui_ElegantGUI(object):
|
||||
self.UIDistAnalysis.setReadOnly(True)
|
||||
self.UIDistAnalysis.setObjectName("UIDistAnalysis")
|
||||
self.verticalLayout_4.addWidget(self.UIDistAnalysis)
|
||||
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||
self.verticalLayout_4.addItem(spacerItem)
|
||||
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||
self.verticalLayout_4.addItem(spacerItem1)
|
||||
self.UIDistInput = QtWidgets.QPushButton(self.tab_8)
|
||||
self.UIDistInput.setObjectName("UIDistInput")
|
||||
self.verticalLayout_4.addWidget(self.UIDistInput)
|
||||
@@ -227,8 +243,8 @@ class Ui_ElegantGUI(object):
|
||||
self.UIDistCut = QtWidgets.QPushButton(self.tab_8)
|
||||
self.UIDistCut.setObjectName("UIDistCut")
|
||||
self.verticalLayout_3.addWidget(self.UIDistCut)
|
||||
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||
self.verticalLayout_3.addItem(spacerItem1)
|
||||
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||
self.verticalLayout_3.addItem(spacerItem2)
|
||||
self.UIDistSave = QtWidgets.QPushButton(self.tab_8)
|
||||
self.UIDistSave.setObjectName("UIDistSave")
|
||||
self.verticalLayout_3.addWidget(self.UIDistSave)
|
||||
@@ -246,6 +262,10 @@ class Ui_ElegantGUI(object):
|
||||
self.UISaveReference = QtWidgets.QPushButton(self.tab_2)
|
||||
self.UISaveReference.setObjectName("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)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
@@ -332,8 +352,8 @@ class Ui_ElegantGUI(object):
|
||||
self.UIDeleteDump = QtWidgets.QPushButton(self.tab_2)
|
||||
self.UIDeleteDump.setObjectName("UIDeleteDump")
|
||||
self.verticalLayout_2.addWidget(self.UIDeleteDump)
|
||||
spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||
self.verticalLayout_2.addItem(spacerItem2)
|
||||
spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||
self.verticalLayout_2.addItem(spacerItem3)
|
||||
self.horizontalLayout_2.addLayout(self.verticalLayout_2)
|
||||
self.verticalLayout_6 = QtWidgets.QVBoxLayout()
|
||||
self.verticalLayout_6.setObjectName("verticalLayout_6")
|
||||
@@ -377,8 +397,8 @@ class Ui_ElegantGUI(object):
|
||||
self.UIAddSectionDump = QtWidgets.QPushButton(self.tab_2)
|
||||
self.UIAddSectionDump.setObjectName("UIAddSectionDump")
|
||||
self.verticalLayout_6.addWidget(self.UIAddSectionDump)
|
||||
spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||
self.verticalLayout_6.addItem(spacerItem3)
|
||||
spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||
self.verticalLayout_6.addItem(spacerItem4)
|
||||
self.horizontalLayout_2.addLayout(self.verticalLayout_6)
|
||||
self.TabMaster.addTab(self.tab_2, "")
|
||||
self.verticalLayout_5.addWidget(self.TabMaster)
|
||||
@@ -521,7 +541,7 @@ class Ui_ElegantGUI(object):
|
||||
self.menubar.addAction(self.menuHelp.menuAction())
|
||||
|
||||
self.retranslateUi(ElegantGUI)
|
||||
self.TabMaster.setCurrentIndex(0)
|
||||
self.TabMaster.setCurrentIndex(2)
|
||||
self.actionQuit.triggered.connect(ElegantGUI.close) # type: ignore
|
||||
QtCore.QMetaObject.connectSlotsByName(ElegantGUI)
|
||||
|
||||
@@ -535,9 +555,11 @@ class Ui_ElegantGUI(object):
|
||||
self.UITrackStart.setText(_translate("ElegantGUI", "SINLH01"))
|
||||
self.label_2.setText(_translate("ElegantGUI", "End-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.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.UITrackDoCSR.setText(_translate("ElegantGUI", "Include Coherent Synchrotron Radiation"))
|
||||
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.UILoadReference.setText(_translate("ElegantGUI", "Load Settings"))
|
||||
self.UISaveReference.setText(_translate("ElegantGUI", "Save Settings"))
|
||||
self.UILoadOpticsSettings.setText(_translate("ElegantGUI", "Import OpticsTool Settings"))
|
||||
self.label_3.setText(_translate("ElegantGUI", "RF Settings"))
|
||||
item = self.UIRFSettings.verticalHeaderItem(0)
|
||||
item.setText(_translate("ElegantGUI", "New Row"))
|
||||
|
||||
+58
-11
@@ -24,13 +24,13 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
<number>2</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab_3">
|
||||
<attribute name="title">
|
||||
<string>Track</string>
|
||||
</attribute>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
<item>
|
||||
<widget class="QWidget" name="widget_2" native="true">
|
||||
<property name="sizePolicy">
|
||||
@@ -135,7 +135,7 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>SATBD02</string>
|
||||
<string>SINDI02</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -149,14 +149,51 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="UITrackInput">
|
||||
<property name="text">
|
||||
<string>not yet defined</string>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="UITrackInput">
|
||||
<property name="text">
|
||||
<string>not yet defined</string>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<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>
|
||||
<widget class="QCheckBox" name="UITrackDoLSC">
|
||||
@@ -469,6 +506,16 @@
|
||||
</property>
|
||||
</widget>
|
||||
</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>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="sizePolicy">
|
||||
|
||||
Reference in New Issue
Block a user