118 lines
4.9 KiB
Python
118 lines
4.9 KiB
Python
from threading import Thread
|
|
import subprocess
|
|
|
|
class Track:
|
|
def __init__(self, parent=None):
|
|
self.parent=parent
|
|
self.dumpPoints=[]
|
|
self.parent.UITrack.clicked.connect(self.startTracking)
|
|
self.parent.UIAddDiagnosticDump.clicked.connect(self.addDiagnosticDump)
|
|
self.parent.UIAddSectionDump.clicked.connect(self.addSectionDump)
|
|
self.parent.UIDeleteDump.clicked.connect(self.deleteDump)
|
|
|
|
def startTracking(self):
|
|
project = 'SwissFEL'
|
|
start=str(self.parent.UITrackStart.text())
|
|
end=str(self.parent.UITrackEnd.text())
|
|
lsc = self.parent.UITrackDoLSC.isChecked()
|
|
csr = self.parent.UITrackDoCSR.isChecked()
|
|
print('Tracking from',start,'to',end,'...')
|
|
if self.parent.preferredDist is None:
|
|
Q = 200e-12
|
|
else:
|
|
Q = self.parent.preferredDist.getQ()
|
|
dumps = []
|
|
for ele in self.dumpPoints:
|
|
if '-' in ele:
|
|
dumps.append(ele.replace('-','.'))
|
|
else:
|
|
dumps.append(ele+'.End')
|
|
latfile = self.parent.model.writeLattice(project,start,end,lsc,csr,Q,dumps)
|
|
print('Lattice written to',latfile)
|
|
if self.parent.preferredDist is None:
|
|
print('No distribution defined')
|
|
print('Only lattice file written to Directory ./Runs/')
|
|
return
|
|
distfile='Runs/'+project+'Inputdist.sdds'
|
|
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('Input file written to',inputfile)
|
|
self.cmd=['elegant',inputfile]
|
|
Thread(name='Elegant Run', target=self.Telegant).start()
|
|
|
|
def Telegant(self):
|
|
print('Starting thread to run elegant')
|
|
subprocess.run(self.cmd)
|
|
|
|
def writeInputFile(self,path,name,latfile,distfile,distinfo):
|
|
filename = '%s/%s.ele' % (path, name)
|
|
with open(filename, 'w') as fid:
|
|
fid.write('&run_setup\n')
|
|
fid.write('\tlattice\t\t= %s,\n' % (latfile))
|
|
fid.write('\tuse_beamline\t= SwissFEL,\n')
|
|
fid.write('\trootname\t= %s,\n' % name)
|
|
fid.write('\toutput\t\t= %s/%%s.out,\n' % path)
|
|
fid.write('\tcentroid\t\t= %s/%%s.cen,\n' % path)
|
|
fid.write('\tsigma\t\t= %s/%%s.sig,\n' % path)
|
|
fid.write('\tfinal\t\t= %s/%%s.fin,\n' % path)
|
|
fid.write('\tparameters\t= %s/%%s.par,\n' % path)
|
|
fid.write('\tmagnets\t\t= %s/%%s.mag,\n' % path)
|
|
fid.write('\tcombine_bunch_statistics = 0,\n')
|
|
fid.write('\tdefault_order\t= 2,\n')
|
|
fid.write('\tconcat_order\t= 0,\n')
|
|
fid.write('\tprint_statistics\t= 0,\n')
|
|
fid.write('\trandom_number_seed\t= 9876543210,\n')
|
|
fid.write('\tp_central\t= %f,\n' % distinfo['pAverage'])
|
|
fid.write('\ttracking_updates\t= 1\n')
|
|
fid.write('\talways_change_p0\t= 1\n')
|
|
fid.write('&end\n\n')
|
|
fid.write('&run_control\n')
|
|
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')
|
|
fid.write('\tbeta_x\t\t= %f,\n' % distinfo['betax'])
|
|
fid.write('\tbeta_y\t\t= %f,\n' % distinfo['betay'])
|
|
fid.write('\talpha_x\t\t= %f,\n' % distinfo['alphax'])
|
|
fid.write('\talpha_y\t\t= %f,\n' % distinfo['alphay'])
|
|
fid.write('&end\n\n')
|
|
|
|
fid.write('&sdds_beam\n')
|
|
fid.write('\tinput_type= "elegant",\n')
|
|
fid.write('\tsample_interval\t= 1,\n')
|
|
fid.write('\tinput = %s,\n' % distfile)
|
|
fid.write('\treuse_bunch\t= 0 \n')
|
|
fid.write('&end\n\n')
|
|
|
|
fid.write('&track\n')
|
|
fid.write('&end\n\n')
|
|
fid.close()
|
|
|
|
return filename
|
|
|
|
def addDiagnosticDump(self):
|
|
self.addDump(self.parent.UIDiagnosticList)
|
|
|
|
def addSectionDump(self):
|
|
self.addDump(self.parent.UISectionList)
|
|
|
|
def addDump(self,qwidget):
|
|
elements=[str(ele.text()) for ele in qwidget.selectedItems()]
|
|
for ele in elements:
|
|
if not ele in self.dumpPoints:
|
|
self.dumpPoints.append(ele)
|
|
self.parent.UIDumpLocation.clear()
|
|
for ele in self.dumpPoints:
|
|
self.parent.UIDumpLocation.addItem(ele)
|
|
|
|
def deleteDump(self):
|
|
sels = [str(ele.text()) for ele in self.parent.UIDumpLocation.selectedItems()]
|
|
self.dumpPoints = [ele for ele in self.dumpPoints if not ele in sels]
|
|
self.parent.UIDumpLocation.clear()
|
|
for ele in self.dumpPoints:
|
|
self.parent.UIDumpLocation.addItem(ele) |