diff --git a/OpticsTools.py b/OpticsTools.py
index 1a04c69..65ceede 100644
--- a/OpticsTools.py
+++ b/OpticsTools.py
@@ -13,6 +13,7 @@ from machine import Machine
from reference import ReferenceManager
from sandbox import Sandbox
from matchmaker import MatchMaker
+from elegant import Elegant
@@ -35,6 +36,7 @@ class OpticsTools(QtWidgets.QMainWindow, QtCore.QObject, Ui_OpticsGUI):
# initialize online model
self.model = Model(phase=phase,parent=self)
+ self.elegant=Elegant(onlinemodel=self.model,parent=self)
# initialize modeling
self.match = MatchMaker(signal=self.sigStatus,phase=phase)
@@ -64,6 +66,7 @@ class OpticsTools(QtWidgets.QMainWindow, QtCore.QObject, Ui_OpticsGUI):
self.UIMatchSelected.clicked.connect(self.doMatch)
self.actionOpen_2.triggered.connect(self.loadSettings)
self.actionSave.triggered.connect(self.saveSettings)
+ self.actionExport_Elegant.triggered.connect(self.exportElegant)
self.UIUpdateFromMachine.clicked.connect(self.fullUpdate)
self.actionHelp.triggered.connect(self.openGit)
self.actionAbout.triggered.connect(self.about)
@@ -88,11 +91,16 @@ class OpticsTools(QtWidgets.QMainWindow, QtCore.QObject, Ui_OpticsGUI):
vars = self.getMatchVariables()
else:
vars = None
+ if self.UIDoInitialEnergy.isChecked():
+ erg0 =float(str(self.UIInitialEnergy.text()))
+ else:
+ erg0=-1
inittwiss={}
inittwiss['betax']=float(str(self.UIInitBetax.text()))
inittwiss['betay'] = float(str(self.UIInitBetay.text()))
inittwiss['alphax'] = float(str(self.UIInitAlphax.text()))
inittwiss['alphay'] = float(str(self.UIInitAlphay.text()))
+ inittwiss['energy'] = erg0
twiss = self.match.match(self.model.om, variables = vars, initCond = inittwiss, Injector = injector,Athos = athos, Aramis = aramis, Porthos = porthos, full = fullOutput)
self.updateMatchResult(self.match.matchresult)
energy = self.model.calcEnergyProfile(twiss)
@@ -162,6 +170,8 @@ class OpticsTools(QtWidgets.QMainWindow, QtCore.QObject, Ui_OpticsGUI):
variables[name]={'Val':val}
return variables
+ def exportElegant(self):
+ self.elegant.export()
def closeEvent(self, event):
self.plot.close()
diff --git a/Scripts/Final/SFPlus/matchAthos.madx b/Scripts/Final/SFPlus/matchAthos.madx
index 5c2e3b7..c6f46e7 100644
--- a/Scripts/Final/SFPlus/matchAthos.madx
+++ b/Scripts/Final/SFPlus/matchAthos.madx
@@ -19,6 +19,7 @@ ealign,DY=0.01;
+
Print,text='MATCH POINT: Kicker Strength of Septum';
MATCH,SEQUENCE=swissfel,range=s20sy02$start/s20sy02$end,beta0=Twisssep;
VARY,NAME=s20sy02.mqua070.k1,STEP=0.0001,lower=-3,upper=3;
@@ -30,7 +31,7 @@ CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mbnd200,y=y_sep;
CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mbnd200,py=py_sep;
CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mbnd200,dy=-0.007;
CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mbnd200,dpy=1.7e-3;
-CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mqua180, BETY < 60;
+CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mqua180$end, BETY < 60;
LMDIF,CALLS=8000,TOLERANCE=1.e-21;
ENDMATCH;
@@ -49,43 +50,41 @@ plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
plot,haxis=s,vaxis=y,dy,range=#s/#e,colour=100;
-satsy01.mqua110.k1=-1.7;
-
-
Print,text='MATCH POINT: Closed Dispersion in Switchyard';
-MATCH,SEQUENCE=Swissfel,range=s20sy02$start/satsy02$end,beta0=twisssep;
+MATCH,SEQUENCE=Swissfel,range=s20sy02$start/satsy02$start,beta0=twisssep;
VARY,NAME=satsy01.mqua020.k1,STEP=0.0001;
VARY,NAME=satsy01.mqua050.k1,STEP=0.0001;
VARY,NAME=satsy01.mqua080.k1,STEP=0.0001;
-VARY,NAME=satsy02.mqua010.k1,STEP=0.0001;
-!VARY,NAME=satsy01.mqua110.k1,STEP=0.0001;
+VARY,NAME=satsy01.mqua120.k1,STEP=0.0001;
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy01$end,DX=0.0;
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy01$end,DPX=0.0;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mbnd200,DY=0.0;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mbnd200,DPY=0.0;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy01$end,DY=0.0;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy01$end,DPY=0.0;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy01$end,BETX<10;
JACOBIAN,CALLS=1000,TOLERANCE=1.e-21;
SIMPLEX,CALLS=1000,TOLERANCE=1.e-21;
ENDMATCH;
-Print,text='MATCH POINT: Sextupoles in Switch Yard';
-MATCH,chrom,SEQUENCE=swissfel,range=s20sy02$start/satsy02$end,beta0=twisssep;
-VARY,NAME=satsy01.msex030.k2,STEP=0.0001;
-VARY,NAME=satsy01.msex090.k2,STEP=0.0001;
-CONSTRAINT,SEQUENCE=swissfel,range=satsy01$end,ddx=0;
-CONSTRAINT,SEQUENCE=swissfel,range=satsy01$end,ddpx=0;
-LMDIF,CALLS=100,TOLERANCE=1.e-21;
-ENDMATCH;
+!Print,text='MATCH POINT: Sextupoles in Switch Yard';
+!MATCH,chrom,SEQUENCE=swissfel,range=s20sy02$start/satsy02$end,beta0=twisssep;
+!VARY,NAME=satsy01.msex030.k2,STEP=0.0001;
+!VARY,NAME=satsy01.msex090.k2,STEP=0.0001;
+!CONSTRAINT,SEQUENCE=swissfel,range=satsy01$end,ddx=0;
+!CONSTRAINT,SEQUENCE=swissfel,range=satsy01$end,ddpx=0;
+!LMDIF,CALLS=100,TOLERANCE=1.e-21;
+!ENDMATCH;
-twiss,chrom,SEQUENCE=swissfel,range=s20sy02$start/Satsy02.mqua210$start,beta0=twisssep;
+twiss,chrom,SEQUENCE=swissfel,range=s20sy02$start/Satsy02.mqua010$start,beta0=twisssep;
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100;
plot,haxis=s,vaxis=ddx,range=#s/#e,colour=100;
+
Print,text='MATCH POINT: Closed Dispersion in SATSY03';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep;
VARY,NAME=satsy03.mqua130.k1,STEP=0.0001;
@@ -94,35 +93,35 @@ LMDIF,CALLS=1000,TOLERANCE=1.e-21;
ENDMATCH;
-Print,text='MATCH POINT: Sextupoles in SATSY03';
-MATCH,chrom,SEQUENCE=swissfel,range=s20sy02$start/satsy03$end,beta0=twisssep;
-VARY,NAME=satsy03.msex110.k2,STEP=0.0001;
-VARY,NAME=satsy03.msex140.k2,STEP=0.0001;
-CONSTRAINT,SEQUENCE=swissfel,range=satsy03.mqua220$start,ddx=0;
-CONSTRAINT,SEQUENCE=swissfel,range=satsy03.mqua220$start,ddpx=0;
-LMDIF,CALLS=100,TOLERANCE=1.e-21;
-ENDMATCH;
-
-
+!Print,text='MATCH POINT: Sextupoles in SATSY03';
+!MATCH,chrom,SEQUENCE=swissfel,range=s20sy02$start/satsy03$end,beta0=twisssep;
+!VARY,NAME=satsy03.msex110.k2,STEP=0.0001;
+!VARY,NAME=satsy03.msex140.k2,STEP=0.0001;
+!CONSTRAINT,SEQUENCE=swissfel,range=satsy03.mqua220$start,ddx=0;
+!CONSTRAINT,SEQUENCE=swissfel,range=satsy03.mqua220$start,ddpx=0;
+!LMDIF,CALLS=100,TOLERANCE=1.e-21;
+!ENDMATCH;
Print,text='MATCH POINT: Switchyard Drift';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep;
-VARY,NAME=satsy02.mqua210.k1,STEP=0.0001;
-VARY,NAME=satsy02.mqua230.k1,STEP=0.0001;
-VARY,NAME=satsy02.mqua240.k1,STEP=0.0001;
-VARY,NAME=satsy02.mqua260.k1,STEP=0.0001;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua260$end,betx=twissAT1->BETX;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua260$end,bety=twissAT1->BETY;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua260$end,alfx=twissAT1->ALFX;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua260$end,alfy=twissAT1->ALFY;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua230$end,betx<120;
+VARY,NAME=satsy02.mqua010.k1,STEP=0.0001;
+VARY,NAME=satsy02.mqua030.k1,STEP=0.0001;
+VARY,NAME=satsy02.mqua050.k1,STEP=0.0001;
+VARY,NAME=satsy02.mqua080.k1,STEP=0.0001;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua080$end,betx=twissAT1->BETX;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua080$end,bety=twissAT1->BETY;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua080$end,alfx=twissAT1->ALFX;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua080$end,alfy=twissAT1->ALFY;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua050$end,betx<150;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua050$end,bety<150;
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
ENDMATCH;
+
Print,text='MATCH POINT: Match into SATSY03';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep;
VARY,NAME=satsy02.mqua300.k1,STEP=0.0001;
@@ -156,8 +155,8 @@ CONSTRAINT,SEQUENCE=SwissFEL,range= satbc01.mbnd100,BETX<180;
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
ENDMATCH;
-CL1.k1 := -1.;
-CL2.k1 := 1.3;
+CL1.k1 := -1;
+CL2.k1 := 1;
satcl01.mqua120.k1 := CL1.k1;
satcl01.mqua130.k1 := CL2.k1;
satcl01.mqua180.k1 := CL2.k1;
@@ -165,14 +164,16 @@ satcl01.mqua190.k1 := CL1.k1;
Print,text='MATCH POINT: Closed Dispersion in SATCL01';
-MATCH,SEQUENCE=SwissFEL,range=satcl01$start/satcl01$end,betx=3,alfx=0,bety=50,alfy=5;
+MATCH,SEQUENCE=SwissFEL,range=satcl01$start/satdi01$end,betx=3,alfx=0,bety=50,alfy=5,dx=0,dpx=0;
VARY,NAME=cl1.k1,STEP=0.0001;
VARY,NAME=cl2.k1,STEP=0.0001;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,dx=0;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,dpx=0;
+!CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,dx=0;
+!CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,dpx=0;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satdi01.mqua025$start,dx=0;
+CONSTRAINT,SEQUENCE=SwissFEL,range= satdi01.mqua025$start,dpx=0;
-LMDIF,CALLS=1000,TOLERANCE=1.e-21;
+SIMPLEX,CALLS=1000,TOLERANCE=1.e-21;
ENDMATCH;
@@ -202,12 +203,12 @@ ENDMATCH;
Print,text='MATCH POINT: Sextupole in SATCL01';
MATCH,chrom,SEQUENCE=SwissFEL,range=s20sy02$start/satdi01$end,beta0=twisssep;
-VARY,NAME=satcl01.msex110.k2,STEP=0.0001;
-VARY,NAME=satcl01.msex160.k2,STEP=0.0001;
+!VARY,NAME=satcl01.msex110.k2,STEP=0.0001;
+!VARY,NAME=satcl01.msex160.k2,STEP=0.0001;
VARY,NAME=satcl01.mqua180.k1,STEP=0.0001;
VARY,NAME=satcl01.mqua190.k1,STEP=0.0001;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,ddx=0;
-CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,ddpx=0;
+!CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,ddx=0;
+!CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,ddpx=0;
CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,dx=0;
CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,dpx=0;
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
diff --git a/Scripts/Final/SFPlus/settings.json b/Scripts/Final/SFPlus/settings.json
index 242682f..5de81c3 100644
--- a/Scripts/Final/SFPlus/settings.json
+++ b/Scripts/Final/SFPlus/settings.json
@@ -17,52 +17,52 @@
"k1L": 0.0
},
"SINLH01.MQUA020": {
- "k1": 0.36620934394283317,
- "k1L": 0.054931401591424976
+ "k1": 0.08689426596763641,
+ "k1L": 0.013034139895145461
},
"SINLH01.MQUA040": {
- "k1": -0.013814977177058532,
- "k1L": -0.0020722465765587797
+ "k1": 0.3495688049658884,
+ "k1L": 0.05243532074488325
},
"SINLH01.MQUA070": {
- "k1": 0.8750137053045284,
- "k1L": 0.13125205579567925
+ "k1": 0.8092252430523499,
+ "k1L": 0.12138378645785247
},
"SINSB03.MQUA130": {
- "k1": -0.8715614149953018,
- "k1L": -0.13073421224929527
+ "k1": -0.9015430377145227,
+ "k1L": -0.1352314556571784
},
"SINSB03.MQUA230": {
- "k1": 1.6106130013389368,
- "k1L": 0.2415919502008405
+ "k1": 1.5924298128731744,
+ "k1L": 0.23886447193097615
},
"SINSB04.MQUA130": {
- "k1": -1.363887477240887,
- "k1L": -0.20458312158613307
+ "k1": -1.3222488468339773,
+ "k1L": -0.19833732702509657
},
"SINSB04.MQUA230": {
- "k1": 1.5192268545482268,
- "k1L": 0.22788402818223402
+ "k1": 1.284281546784505,
+ "k1L": 0.19264223201767575
},
"SINBC01.MQUA020": {
- "k1": 5.0051988744668385,
- "k1L": 0.7507798311700258
+ "k1": 5.005198896632219,
+ "k1L": 0.7507798344948329
},
"SINBC01.MQUA050": {
- "k1": -1.3552460259497292,
- "k1L": -0.20328690389245938
+ "k1": -1.3552461151773778,
+ "k1L": -0.20328691727660667
},
"SINBC01.MQUA070": {
- "k1": -0.3830830345978297,
- "k1L": -0.05746245518967445
+ "k1": -0.3830829823134076,
+ "k1L": -0.057462447347011135
},
"SINBC01.MQUA090": {
- "k1": -2.2877140525712503,
- "k1L": -0.34315710788568754
+ "k1": -2.2877140540439056,
+ "k1L": -0.34315710810658584
},
"SINBC01.MQUA110": {
- "k1": 2.739832222865398,
- "k1L": 0.41097483342980967
+ "k1": 2.7398322193286893,
+ "k1L": 0.41097483289930337
},
"SINBC02.MQSK110": {
"k1": 0.0,
@@ -81,192 +81,192 @@
"k1L": 0.0
},
"SINMA01.MQUA020": {
- "k1": -0.796160745080611,
- "k1L": -0.11942411176209164
+ "k1": -0.79616049341844,
+ "k1L": -0.11942407401276599
},
"SINMA01.MQUA030": {
- "k1": -0.0973402324886211,
- "k1L": -0.014601034873293164
+ "k1": -0.09734079474349366,
+ "k1L": -0.01460111921152405
},
"SINMA01.MQUA050": {
- "k1": 0.43727136307188413,
- "k1L": 0.06559070446078262
+ "k1": 0.4372717527741337,
+ "k1L": 0.06559076291612005
},
"SINCB01.MQUA230": {
- "k1": 1.1239554722667795,
- "k1L": 0.1685933208400169
+ "k1": 1.123955381886233,
+ "k1L": 0.16859330728293492
},
"SINCB01.MQUA430": {
- "k1": -0.2616752802877761,
- "k1L": -0.039251292043166415
+ "k1": -0.2616752171909828,
+ "k1L": -0.03925128257864742
},
"SINDI01.MQUA020": {
- "k1": -0.5791918914752151,
- "k1L": -0.08687878372128226
+ "k1": -0.5791917670811274,
+ "k1L": -0.08687876506216911
},
"SINDI01.MQSK030": {
"k1": 0.0,
"k1L": 0.0
},
"SINDI01.MQUA070": {
- "k1": 0.12803905933769652,
- "k1L": 0.019205858900654477
+ "k1": 0.12803890813311772,
+ "k1L": 0.019205836219967656
},
"SINDI02.MQUA020": {
- "k1": -1.3489159089890062,
- "k1L": -0.2023373863483509
+ "k1": -1.3864676735437733,
+ "k1L": -0.207970151031566
},
"SINDI02.MQUA030": {
- "k1": 1.0340874760230605,
- "k1L": 0.15511312140345906
+ "k1": 1.1836428852018135,
+ "k1L": 0.17754643278027202
},
"SINDI02.MQUA050": {
- "k1": 0.3506594538970562,
- "k1L": 0.05259891808455843
+ "k1": 0.4317093237602979,
+ "k1L": 0.06475639856404468
},
"SINDI02.MQUA060": {
- "k1": 0.30394534170272214,
- "k1L": 0.04559180125540832
+ "k1": 0.27921960086263015,
+ "k1L": 0.04188294012939452
},
"SINDI02.MQUA090": {
- "k1": -0.3610969993932116,
- "k1L": -0.054164549908981736
+ "k1": -0.5045474804054468,
+ "k1L": -0.07568212206081702
},
"S10CB01.MQUA230": {
- "k1": 0.47466278368218734,
- "k1L": 0.0711994175523281
+ "k1": 0.3687762762289991,
+ "k1L": 0.05531644143434986
},
"S10CB01.MQUA430": {
- "k1": 0.12258962576471828,
- "k1L": 0.01838844386470774
+ "k1": 0.26893133241207234,
+ "k1L": 0.04033969986181085
},
"S10CB02.MQUA230": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB02.MQUA430": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10DI01.MQUA030": {
"k1": 0.0,
"k1L": 0.0
},
"S10DI01.MQUA120": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB03.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10CB03.MQUA430": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB04.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10CB04.MQUA430": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB05.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10CB05.MQUA430": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB06.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10CB06.MQUA430": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB07.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10CB07.MQUA430": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB08.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10CB08.MQUA430": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB09.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10CB09.MQUA430": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB10.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S10CB10.MQUA430": {
- "k1": -0.8305860577067147,
- "k1L": -0.12458790865600719
+ "k1": -0.8305860577067142,
+ "k1L": -0.12458790865600713
},
"S10CB11.MQUA230": {
- "k1": 0.830580330412648,
- "k1L": 0.1245870495618972
+ "k1": 0.8305803304126476,
+ "k1L": 0.12458704956189713
},
"S20SY01.MQUA010": {
- "k1": -0.7572477177136773,
- "k1L": -0.11358715765705159
+ "k1": -0.7572477177130097,
+ "k1L": -0.11358715765695145
},
"S20SY01.MQUA030": {
- "k1": 1.2405737827596908,
- "k1L": 0.18608606741395362
+ "k1": 1.2405737827592254,
+ "k1L": 0.1860860674138838
},
"S20SY01.MQUA040": {
- "k1": -1.248134967049847,
- "k1L": -0.18722024505747703
+ "k1": -1.2481349670502586,
+ "k1L": -0.1872202450575388
},
"S20SY01.MQUA060": {
- "k1": 0.27871808261871167,
- "k1L": 0.04180771239280675
+ "k1": 0.2787180826192188,
+ "k1L": 0.04180771239288282
},
"S20SY02.MQUA070": {
- "k1": 1.55717,
- "k1L": 0.2335755
+ "k1": 1.5571702267477394,
+ "k1L": 0.2335755340121609
},
"S20SY02.MQUA100": {
- "k1": 0.013737,
- "k1L": 0.00206055
+ "k1": 0.013736815174708249,
+ "k1L": 0.002060522276206237
},
"S20SY02.MQUA140": {
- "k1": -1.170621,
- "k1L": -0.17559314999999998
+ "k1": -1.170620890378731,
+ "k1L": -0.17559313355680964
},
"S20SY02.MQUA180": {
- "k1": -0.140944,
- "k1L": -0.0211416
+ "k1": -0.14094360914972026,
+ "k1L": -0.02114154137245804
},
"S20BC01.MQUA010": {
- "k1": 0.873603591111957,
- "k1L": 0.13104053866679355
+ "k1": 0.87835097911722,
+ "k1L": 0.131752646867583
},
"S20BC01.MQUA030": {
- "k1": -0.9379972125264844,
- "k1L": -0.14069958187897266
+ "k1": -0.9432169386970741,
+ "k1L": -0.1414825408045611
},
"S20BC01.MQUA060": {
- "k1": 0.8647707996664207,
- "k1L": 0.12971561994996308
+ "k1": 0.8676538482103706,
+ "k1L": 0.13014807723155558
},
"S20BC02.MQSK110": {
"k1": 0.0,
@@ -285,40 +285,40 @@
"k1L": 0.0
},
"S20MA01.MQUA010": {
- "k1": -0.20801880090673047,
- "k1L": -0.03120282013600957
+ "k1": -0.2402040740515919,
+ "k1L": -0.03603061110773878
},
"S20MA01.MQUA020": {
- "k1": -1.171764144178601,
- "k1L": -0.17576462162679016
+ "k1": -1.14289795759262,
+ "k1L": -0.171434693638893
},
"S20MA01.MQUA040": {
- "k1": 1.320901221249259,
- "k1L": 0.19813518318738885
+ "k1": 1.331391157659883,
+ "k1L": 0.19970867364898243
},
"S20CB01.MQUA430": {
- "k1": 0.3340241529425683,
- "k1L": 0.05010362294138525
+ "k1": 0.3178095692302476,
+ "k1L": 0.04767143538453714
},
"S20CB02.MQUA430": {
- "k1": 0.4182949696331242,
- "k1L": 0.06274424544496862
+ "k1": 0.41829496962824636,
+ "k1L": 0.06274424544423696
},
"S20CB03.MQUA430": {
- "k1": -0.7121361011399584,
- "k1L": -0.10682041517099376
+ "k1": -0.7121361011386458,
+ "k1L": -0.10682041517079686
},
"S20CB04.MQUA430": {
- "k1": 0.8147392424101467,
- "k1L": 0.122210886361522
+ "k1": 0.8147392424087534,
+ "k1L": 0.122210886361313
},
"S30CB01.MQUA430": {
- "k1": -0.7094285418856833,
- "k1L": -0.10641428128285249
+ "k1": -0.7094285418872037,
+ "k1L": -0.10641428128308056
},
"S30CB02.MQUA430": {
- "k1": 0.6690212627857176,
- "k1L": 0.10035318941785763
+ "k1": 0.6690212627858554,
+ "k1L": 0.10035318941787831
},
"S30CB03.MQUA430": {
"k1": -0.7877148024385267,
@@ -361,20 +361,20 @@
"k1L": 0.11815689582252914
},
"S30CB13.MQUA430": {
- "k1": -0.507676594003293,
- "k1L": -0.07615148910049395
+ "k1": -0.5076765938728264,
+ "k1L": -0.07615148908092395
},
"S30CB14.MQUA430": {
- "k1": -0.30449789907398617,
- "k1L": -0.09134936972219584
+ "k1": -0.30449790049608394,
+ "k1L": -0.09134937014882517
},
"S30CB15.MQUA010": {
- "k1": -0.17009981277881317,
- "k1L": -0.05102994383364395
+ "k1": -0.17009981041529426,
+ "k1L": -0.05102994312458828
},
"S30CB15.MQUA020": {
- "k1": 0.900363739835595,
- "k1L": 0.2701091219506785
+ "k1": 0.900363738875515,
+ "k1L": 0.2701091216626545
},
"S30CB15.MQUA100": {
"k1": -0.20725616868530256,
@@ -385,28 +385,28 @@
"k1L": -0.1554421265139769
},
"SARCL01.MQUA020": {
- "k1": 1.0485042112239236,
- "k1L": 0.31455126336717704
+ "k1": 0.17803529165711338,
+ "k1L": 0.05341058749713401
},
"SARCL01.MQUA050": {
- "k1": -0.8452727407706724,
- "k1L": -0.2535818222312017
+ "k1": 0.6695804754369342,
+ "k1L": 0.20087414263108025
},
"SARCL01.MQUA080": {
- "k1": -0.4003274763369442,
- "k1L": -0.12009824290108326
+ "k1": -0.8857700557137619,
+ "k1L": -0.2657310167141286
},
"SARCL01.MQUA100": {
- "k1": 0.6199535586235788,
- "k1L": 0.18598606758707364
+ "k1": 0.30077564673670043,
+ "k1L": 0.09023269402101013
},
"SARCL01.MQUA140": {
- "k1": 1.1619233966505333,
- "k1L": 0.34857701899515997
+ "k1": 1.377857870937014,
+ "k1L": 0.4133573612811042
},
"SARCL01.MQUA190": {
- "k1": -1.366953399953986,
- "k1L": -0.4100860199861958
+ "k1": -1.3409897965787412,
+ "k1L": -0.40229693897362234
},
"SARCL02.MQUA130": {
"k1": 1.8,
@@ -453,24 +453,24 @@
"k1L": 0.54
},
"SARMA01.MQUA010": {
- "k1": -1.6435399681642,
- "k1L": -0.49306199044925997
+ "k1": -1.6435399685725367,
+ "k1L": -0.493061990571761
},
"SARMA01.MQUA060": {
- "k1": 1.5481652397872268,
- "k1L": 0.464449571936168
+ "k1": 1.548165239970835,
+ "k1L": 0.4644495719912505
},
"SARMA01.MQUA080": {
- "k1": -1.6684096984720258,
- "k1L": -0.5005229095416077
+ "k1": -1.668409697928156,
+ "k1L": -0.5005229093784468
},
"SARMA01.MQUA120": {
- "k1": 1.0445451496443325,
- "k1L": 0.31336354489329976
+ "k1": 1.0445451491745348,
+ "k1L": 0.31336354475236045
},
"SARMA01.MQUA140": {
- "k1": -0.556714038363632,
- "k1L": -0.1670142115090896
+ "k1": -0.5567140374763775,
+ "k1L": -0.16701421124291324
},
"SARMA02.MQUA050": {
"k1": 0.0,
@@ -549,12 +549,12 @@
"k1L": -0.18797422953822612
},
"SARUN18.MQUA080": {
- "k1": -0.2275965827509157,
- "k1L": -0.018207726620073257
+ "k1": -0.33420819140062025,
+ "k1L": -0.02673665531204962
},
"SARUN19.MQUA080": {
- "k1": 0.9970832678636612,
- "k1L": 0.0797666614290929
+ "k1": 1.056174072947472,
+ "k1L": 0.08449392583579776
},
"SARUN20.MQUA220": {
"k1": 0.8363412365675689,
@@ -569,20 +569,20 @@
"k1L": -0.16799985830701
},
"SATSY01.MQUA020": {
- "k1": 1.5148580412102386,
- "k1L": 0.4544574123630716
+ "k1": 1.4485649054987229,
+ "k1L": 0.43456947164961685
},
"SATSY01.MQSK040": {
"k1": 0,
"k1L": 0.0
},
"SATSY01.MQUA050": {
- "k1": -2.519230530479981,
- "k1L": -0.7557691591439943
+ "k1": -2.0492313402917417,
+ "k1L": -0.6147694020875225
},
"SATSY01.MQUA080": {
- "k1": 2.2866664735587365,
- "k1L": 0.6859999420676209
+ "k1": 2.7402388431620075,
+ "k1L": 0.8220716529486022
},
"SATSY01.MQSK100": {
"k1": 0,
@@ -593,24 +593,24 @@
"k1L": -0.255
},
"SATSY02.MQUA010": {
- "k1": 0.8441269487029979,
- "k1L": 0.25323808461089936
+ "k1": -0.6408627305578825,
+ "k1L": -0.19225881916736473
},
"SATSY02.MQUA210": {
- "k1": 3.521141,
- "k1L": 1.0563423
+ "k1": 2.6781686064452224,
+ "k1L": 0.8034505819335667
},
"SATSY02.MQUA230": {
- "k1": -3.756948,
- "k1L": -0.5635422
+ "k1": -3.5739038342617704,
+ "k1L": -0.5360855751392656
},
"SATSY02.MQUA240": {
- "k1": 3.243975,
- "k1L": 0.48659624999999995
+ "k1": 3.4668261566767877,
+ "k1L": 0.5200239235015182
},
"SATSY02.MQUA260": {
- "k1": 2.887369,
- "k1L": 0.8662107
+ "k1": -1.7907630451575853,
+ "k1L": -0.5372289135472755
},
"SATSY02.MQUA300": {
"k1": 1.715835,
@@ -629,20 +629,20 @@
"k1L": -0.1928784
},
"SATSY03.MQUA130": {
- "k1": 0.1714116893143215,
- "k1L": 0.05142350679429645
+ "k1": 1.7543678201565072,
+ "k1L": 0.5263103460469521
},
"SATSY03.MQUA220": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": -1.9659739965977423,
+ "k1L": -0.29489609948966133
},
"SATSY03.MQUA310": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": 1.3741101816366432,
+ "k1L": 0.20611652724549648
},
"SATSY03.MQUA430": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": 0.5665375066682128,
+ "k1L": 0.08498062600023192
},
"SATBC01.MQUA320": {
"k1": 0.0,
@@ -653,20 +653,20 @@
"k1L": 0.0
},
"SATBC01.MQUA410": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": -0.9054167986177581,
+ "k1L": -0.1358125197926637
},
"SATBC01.MQUA430": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": -0.7438305346597855,
+ "k1L": -0.11157458019896783
},
"SATBC01.MQUA450": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": 1.5388310832958934,
+ "k1L": 0.461649324988768
},
"SATBC01.MQUA470": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": -0.5035328847745485,
+ "k1L": -0.07552993271618227
},
"SATCL01.MQUA120": {
"k1": -1.118724117945165,
@@ -681,12 +681,12 @@
"k1L": 0.2609532226529367
},
"SATCL01.MQUA180": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": 1.7404846119270094,
+ "k1L": 0.2610726917890514
},
"SATCL01.MQUA190": {
- "k1": 0.0,
- "k1L": 0.0
+ "k1": -1.126273749325358,
+ "k1L": -0.16894106239880372
},
"SATDI01.MQUA025": {
"k1": 0.0,
@@ -757,92 +757,92 @@
"k1L": 0.0
},
"SATMA01.MQUA610": {
- "k1": -1.2185071393832552,
- "k1L": -0.18277607090748826
+ "k1": -1.218507,
+ "k1L": -0.18277605
},
"SATMA01.MQUA630": {
- "k1": 1.3816870987354146,
- "k1L": 0.2072530648103122
+ "k1": 1.381687,
+ "k1L": 0.20725305000000002
},
"SATMA01.MQUA640": {
- "k1": 1.3544548891358774,
- "k1L": 0.20316823337038162
+ "k1": 1.354455,
+ "k1L": 0.20316825
},
"SATUN04.MQUA060": {
- "k1": -2.5934331389356884,
- "k1L": -0.20747465111485508
+ "k1": -2.593433,
+ "k1L": -0.20747464000000002
},
"SATUN05.MQUA420": {
"k1": -0.930202,
"k1L": -0.07441616
},
"SATUN06.MQUA080": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN07.MQUA080": {
- "k1": -4.059422833505335,
- "k1L": -0.3247538266804268
+ "k1": -4.059423,
+ "k1L": -0.32475384
},
"SATUN08.MQUA080": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN09.MQUA080": {
- "k1": -4.059422833505335,
- "k1L": -0.3247538266804268
+ "k1": -4.059423,
+ "k1L": -0.32475384
},
"SATUN10.MQUA080": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN11.MQUA080": {
- "k1": -4.059422833505335,
- "k1L": -0.3247538266804268
+ "k1": -4.059423,
+ "k1L": -0.32475384
},
"SATUN12.MQUA080": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN13.MQUA080": {
- "k1": -4.059422833505335,
- "k1L": -0.3247538266804268
+ "k1": -4.059423,
+ "k1L": -0.32475384
},
"SATUN14.MQUA080": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN15.MQUA080": {
- "k1": -4.059422833505335,
- "k1L": -0.3247538266804268
+ "k1": -4.059423,
+ "k1L": -0.32475384
},
"SATUN16.MQUA420": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN17.MQUA080": {
- "k1": -4.059422833505335,
- "k1L": -0.3247538266804268
+ "k1": -4.059423,
+ "k1L": -0.32475384
},
"SATUN18.MQUA080": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN19.MQUA080": {
- "k1": -4.059422833505335,
- "k1L": -0.3247538266804268
+ "k1": -4.059423,
+ "k1L": -0.32475384
},
"SATUN20.MQUA080": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN21.MQUA080": {
- "k1": -4.059422833505335,
- "k1L": -0.3247538266804268
+ "k1": -4.059423,
+ "k1L": -0.32475384
},
"SATUN22.MQUA080": {
- "k1": 4.080041726792059,
- "k1L": 0.32640333814336475
+ "k1": 4.080042,
+ "k1L": 0.32640336
},
"SATUN23.MQUA080": {
"k1": 0.0,
@@ -861,24 +861,24 @@
"k1L": 0.0
},
"SATBD01.MQUA010": {
- "k1": 0.5069789237265826,
- "k1L": 0.15209367711797478
+ "k1": 0.506979,
+ "k1L": 0.15209369999999997
},
"SATBD01.MQUA030": {
- "k1": -0.6184665903305938,
- "k1L": -0.18553997709917813
+ "k1": -0.618467,
+ "k1L": -0.18554009999999999
},
"SATBD01.MQUA050": {
- "k1": 0.1324854421128419,
- "k1L": 0.03974563263385257
+ "k1": 0.132485,
+ "k1L": 0.039745499999999996
},
"SATBD01.MQUA070": {
- "k1": 0.474028017341573,
- "k1L": 0.1422084052024719
+ "k1": 0.474028,
+ "k1L": 0.14220839999999998
},
"SATBD01.MQUA090": {
- "k1": -0.7442648986155268,
- "k1L": -0.22327946958465802
+ "k1": -0.744265,
+ "k1L": -0.2232795
},
"S10BD01.MQUA010": {
"k1": 0,
@@ -889,8 +889,8 @@
"k1L": -0.6299996827041936
},
"SATBD02.MQUA030": {
- "k1": -1.050806764409536,
- "k1L": -0.3152420293228608
+ "k1": -1.050807,
+ "k1L": -0.3152421
},
"SPOSY01.MQUA030": {
"k1": 0,
@@ -1019,32 +1019,32 @@
"k2L": 62.330264907630585
},
"SATSY01.MSEX030": {
- "k2": 69.8584896019005,
- "k2L": 5.58867916815204
+ "k2": 49.54525678617823,
+ "k2L": 3.9636205428942586
},
"SATSY01.MSEX090": {
- "k2": -109.51205543384211,
- "k2L": -8.760964434707368
+ "k2": -567.5496197971203,
+ "k2L": -45.40396958376962
},
"SATSY03.MSEX110": {
- "k2": 5.710044360549549,
- "k2L": 0.45680354884396396
+ "k2": 10.740682822533197,
+ "k2L": 0.8592546258026558
},
"SATSY03.MSEX140": {
- "k2": 83.73761512845624,
- "k2L": 6.6990092102764995
+ "k2": 36.226054254417726,
+ "k2L": 2.898084340353418
},
"SATBC01.MSEX310": {
"k2": 0.0,
"k2L": 0.0
},
"SATCL01.MSEX110": {
- "k2": 0.0,
- "k2L": 0.0
+ "k2": 275.50333784305354,
+ "k2L": 22.040267027444283
},
"SATCL01.MSEX160": {
- "k2": 0.0,
- "k2L": 0.0
+ "k2": 0.06686124876506554,
+ "k2L": 0.005348899901205243
},
"SPOSY01.MSEX020": {
"k2": 0,
@@ -1994,23 +1994,23 @@
},
"S20SY02.MKDC010": {
"cory": 0,
- "design_kick": 0.0
+ "design_kick": 0.00022426070829185702
},
"S20SY02.MKAC020": {
"cory": 0,
- "design_kick": 0.0
+ "design_kick": 0.00033639106243778553
},
"S20SY02.MKDC030": {
"cory": 0,
- "design_kick": 0.0
+ "design_kick": 0.00022426070829185702
},
"S20SY02.MKAC040": {
"cory": 0,
- "design_kick": 0.0
+ "design_kick": 0.00033639106243778553
},
"S20SY02.MKDC050": {
"cory": 0,
- "design_kick": 0.0
+ "design_kick": 0.00022426070829185702
},
"S30CB15.MKDC030": {
"cory": 0,
diff --git a/elegant.py b/elegant.py
new file mode 100644
index 0000000..a1f7163
--- /dev/null
+++ b/elegant.py
@@ -0,0 +1,431 @@
+import math
+from onlinemodel.core.apptemplate import ApplicationTemplate
+
+
+# Elegant Interface
+
+class Elegant(ApplicationTemplate):
+
+ def __init__(self, onlinemodel =None,parent=None):
+ ApplicationTemplate.__init__(self)
+
+ self.model=onlinemodel
+ self.parent=parent
+
+ # see what is needed
+
+ self.wpath = 'ReferenceFiles' # path for reference files
+ self.fid = 0
+ self.lsc = 0 # flag whether lsc is enabled
+ self.csr = 0 # flag whether csr is enabled or not
+ self.wakebins = 0 # automatic calculation of
+ self.charge = 200e-12 # default charge in the lattice
+ self.dump = [] # diagnostics location where to dump particle distribution
+
+ self.seq = []
+ self.driftcount = 1 # drift counter
+
+ self.lscbins = 100 # number of bins for lsc calculation
+ self.csrbins = 100 # number of bins for CSR calculation
+ self.csrmaxlen = 10. # distance over which the CSR wake is considered after a dipole
+ self.csrlen = 0 # running variable to count distance after last bend
+
+ self.center = [] # location where the beam is centered due to CSR kicks
+ self.Distribution = 1
+
+ def export(self):
+ if self.model is None:
+ return
+ start = str(self.parent.UITrackStart.text()).upper()
+ end = str(self.parent.UITrackEnd.text()).upper()
+ if len(start) > 7:
+ start = start[0:7]
+ if len(end) > 7:
+ end = end[0:7]
+ refloc, twiss0 = self.parent.reference.getReference()
+
+ if 'SWISSFEL' in refloc.upper():
+ refloc = 'SINLH01$START'
+ if refloc.upper() == 'START':
+ refloc = start.upper()
+ startEnergy = self.model.om.EnergyAt("SINLH01.DBAM010")[0] * 1e-6
+ print('Start Energy is (MeV):', startEnergy)
+ twiss0['energy'] = startEnergy * 1e-3 # convert to GeV for madx
+ start, end = self.model.checkRange(start, end, refloc[0:7])
+ if start is None:
+ return
+ self.model.om.setBranch(end.upper())
+ print('Exporting from', start, 'to', end, '(Reference Location:', refloc, ')')
+# self.doTrack(start, end, refloc, twiss0)
+
+# , project='SwissFEL', start='SINLH01', end='SARBD01', lsc=True, csr=True, Q=200e-12, dump=[],
+# align=[]):
+# start, end = self.checkRange(start, end)
+# self.setBranch(end)
+# lat = Lattice()
+# lat.charge = Q
+# lat.dump = dump
+# if lsc:
+# lat.lsc = 1
+# else:
+# lat.lsc = 0
+# if csr:
+# lat.csr = 1
+# else:
+# lat.csr = 0
+# lat.center = align
+ filename = self.openLatticeStream('Elegant', 'SwissFEL')
+ self.model.om.exportBranch(self)
+ self.closeLatticeStream()
+ return filename
+
+
+
+
+
+ def openLatticeStream(self, path, name):
+ filename = '%s/%s.lat' % (path, name)
+ # self.path=path
+ self.path = '.'
+ self.savepath = path
+ self.seq = []
+ self.fid = open(filename, 'w')
+ self.driftcount = 1
+ self.write('Q: CHARGE, TOTAL=%e\n' % self.charge)
+ self.write('ALTER: CENTER, DELTA=1,T=1\n') # put the beam on the right energy
+ return filename
+
+ def closeLatticeStream(self):
+ self.fid.close()
+
+ # routines to write lattice
+
+ def setCSR(self):
+ self.csrlen = self.csrmaxlen
+
+ def isType(self, name):
+ if (name.find('elegant') > -1):
+ return 1
+ else:
+ return 0
+
+ def write(self, line):
+ self.fid.write(line)
+
+ def writeLine(self, line, seq):
+
+ lc = 1
+ name = line.Name
+
+ seqloop = seq
+ if len(name) == 7:
+ seqloop = self.seq
+
+ if len(name) < 1:
+ name = 'SwissFEL'
+
+ self.write("\n%s.Start: MARKER\n" % (name))
+ secend = name + '.End'
+ if secend in self.dump:
+ print('Adding dump in Elegant output for', name)
+ self.write('%s.End: WATCH, FILENAME="Runs/%%s.%s.End.out", MODE=COORD\n' % (name, name))
+ else:
+ self.write("%s.End: MARKER\n" % (name))
+
+ if (name == "SwissFEL"):
+ self.write("\n%s: Line=(Q, ALTER, %s.Start, " % (name, name))
+ else:
+ self.write("\n%s: Line=(%s.Start, " % (name, name))
+ for ele in seqloop:
+ # print ele
+ if isinstance(ele, str):
+ self.write("%s, " % (ele))
+ else:
+ self.write("%s, " % (ele['Name']))
+ lc = lc + 1
+ if (lc > 5):
+ self.write("&\n\t")
+ lc = 0
+ self.write("%s.End)\n\n" % (name))
+
+ if len(name) == 7:
+ del self.seq[:]
+
+ def writeDrift(self, l):
+ if l <= 0:
+ return 0
+ name = "Drift%4.4d" % (self.driftcount)
+ if self.csrlen > 0:
+ self.write("%s.csr: CSRDRIFT, L=%f, DZ=0.1, USE_STUPAKOV=1, CSR=%d\n" % (name, l, self.csr))
+ self.write("%s.lsc: LSCDRIFT, L=0, LEFFECTIVE=%f, BINS=%d, SMOOTHING=1, LSC=%d\n" % (name, l, self.lscbins,
+ self.lsc))
+ self.write("%s: LINE=(%s.csr,%s.lsc)\n" % (name, name, name))
+ self.csrlen = self.csrlen - l
+ else:
+ self.write("%s: LSCDRIFT, L=%f, LEFFECTIVE=%f, BINS=%d, SMOOTHING=1, LSC=%d\n" % (name, l, l, self.lscbins,
+ self.lsc))
+ self.seq.append(name)
+ self.driftcount = self.driftcount + 1
+ return name
+
+ def writeMarker(self, ele):
+ if 'ALIG' in ele.Name and 'dy' in ele.__dict__.keys():
+ self.write('%s: MALIGN, DY=-%f \n' % (ele.Name, ele.dy))
+ else:
+ self.write('%s: MARK \n' % (ele.Name))
+ self.seq.append(ele.Name)
+
+ def writeVacuum(self, ele):
+ ds = ele.sRef + 0.5 * ele.getLength();
+ if ds > 0:
+ self.writeDrift(ds)
+ self.writeMarker(ele)
+ ds = ele.getResLength() - ele.sRef - 0.5 * ele.getLength();
+ if ds > 0:
+ self.writeDrift(ds)
+
+ def writeDiagnostic(self, ele):
+ Seval = ele.Seval
+ if (Seval < 0):
+ Seval = 0.5 * ele.Length
+ ds = ele.sRef + Seval;
+ if ds > 0:
+ self.writeDrift(ds)
+ if ele.Name in self.center:
+ print('Adding center in Elegant output for', ele.Name)
+ self.write('%s_CENTER: CENTER\n' % ele.Name)
+ self.seq.append('%s_CENTER' % ele.Name)
+
+ if ele.Name in self.dump:
+ print('Adding dump in Elegant output for', ele.Name)
+ self.write('%s: WATCH, FILENAME="Runs/%%s.%s.out", MODE=COORD\n' % (ele.Name, ele.Name))
+ self.seq.append(ele.Name)
+ else:
+ self.writeMarker(ele)
+
+ ds = ele.getResLength() - ds
+ if ds > 0:
+ self.writeDrift(ds)
+
+ def writeCorrector(self, ele):
+
+ corx = 0
+ cory = 0
+ if 'corx' in ele.__dict__:
+ corx = ele.corx
+ if 'cory' in ele.__dict__:
+ cory = ele.cory
+
+ if 'MADthin' in ele.__dict__:
+ if 'MADshift' in ele.__dict__:
+ ds = ele.Length * 0.5 + ele.MADshift
+ self.writeDrift(ds)
+ self.write("%s: KICKER, L=%f, HKICK=%e,VKICK=%e\n" % (ele.Name, 0, corx, cory))
+ self.seq.append(ele.Name)
+ return
+
+ if (ele.sRef > 0):
+ self.writeDrift(ele.sRef)
+ if self.lsc == 0 or ele.getLength() == 0:
+ self.write("%s: KICKER, L=%f, HKICK=%e,VKICK=%e\n" % (ele.Name, ele.getLength(), corx, cory))
+ self.seq.append(ele.Name)
+ else:
+ self.write("%s.cor: KICKER, L=%f, HKICK=%e,VKICK=%e\n" % (ele.Name, ele.getLength(), corx, cory))
+ self.write(
+ "%s.lsc: LSCDRIFT, L=0, LEFFECTIVE=%f, BINS=%d, SMOOTHING=1, LSC=%d\n" % (ele.Name, ele.getLength(),
+ self.lscbins, self.lsc))
+ self.write("%s: LINE=(%s.cor,%s.lsc)\n" % (ele.Name, ele.Name, ele.Name))
+ self.seq.append(ele.Name)
+ ds = ele.getResLength() - ele.getLength() - ele.sRef
+ if ds > 0:
+ self.writeDrift(ds)
+
+ def writeSextupole(self, ele):
+ if (ele.sRef > 0):
+ self.writeDrift(ele.sRef)
+ if self.lsc == 0:
+ self.write("%s: SEXTUPOLE, L=%f, K2=%e, Tilt=%f\n" % (ele.Name, ele.getLength(), ele.k2, ele.Tilt))
+ self.seq.append(ele.Name)
+ else:
+ self.write("%s.sex: SEXTUPOLE, L=%f, K2=%e, Tilt=%f\n" % (ele.Name, ele.getLength(), ele.k2, ele.Tilt))
+ self.write(
+ "%s.lsc: LSCDRIFT, L=0, LEFFECTIVE=%f, BINS=%d, SMOOTHING=1, LSC=%d\n" % (ele.Name, ele.getLength(),
+ self.lscbins, self.lsc))
+ self.fid.write("%s: LINE=(%s.sex,%s.lsc)\n" % (ele.Name, ele.Name, ele.Name))
+ self.seq.append(ele.Name)
+ ds = ele.getResLength() - ele.getLength() - ele.sRef
+ if ds > 0:
+ self.writeDrift(ds)
+
+ def writeQuadrupole(self, ele):
+ if (ele.sRef > 0):
+ self.writeDrift(ele.sRef)
+ if self.lsc != 0 or ('corx' in ele.__dict__) or 'cory' in ele.__dict__:
+ locseq = []
+ if self.lsc > 0:
+ self.write(
+ "%s.lsc: LSCDRIFT, L=0, LEFFECTIVE=%f, BINS=%d, SMOOTHING=1, LSC=%d\n" % (ele.Name, ele.getLength(),
+ self.lscbins, self.lsc))
+ locseq.append("%s.lsc" % (ele.Name))
+ if ('corx' in ele.__dict__) or 'cory' in ele.__dict__:
+ corx = 0
+ cory = 0
+ if 'corx' in ele.__dict__:
+ corx = ele.corx
+ if 'cory' in ele.__dict__:
+ corx = ele.cory
+ self.write(
+ "%s.q1: QUADRUPOLE, L=%f, K1=%e, Tilt=%f\n" % (ele.Name, ele.getLength() * 0.5, ele.k1, ele.Tilt))
+ self.write("%s.cor: KICKER, L=0, HKICK=%e,VKICK=%e\n" % (ele.Name, corx, cory))
+ self.write(
+ "%s.q2: QUADRUPOLE, L=%f, K1=%e, Tilt=%f\n" % (ele.Name, ele.getLength() * 0.5, ele.k1, ele.Tilt))
+ locseq.append("%s.q1" % (ele.Name))
+ locseq.append("%s.cor" % (ele.Name))
+ locseq.append("%s.q2" % (ele.Name))
+ else:
+ self.write("%s.q: QUADRUPOLE, L=%f, K1=%e, Tilt=%f\n" % (ele.Name, ele.getLength(), ele.k1, ele.Tilt))
+ locseq.append("%s.q" % (ele.Name))
+ self.fid.write("%s: LINE=(%s" % (ele.Name, locseq[0]))
+ for p in locseq[1:len(locseq)]:
+ self.fid.write(",%s" % p)
+ self.fid.write(")\n")
+ self.seq.append(ele.Name)
+ else:
+ self.write("%s: QUADRUPOLE, L=%f, K1=%e, Tilt=%f\n" % (ele.Name, ele.getLength(), ele.k1, ele.Tilt))
+ self.seq.append(ele.Name)
+ ds = ele.getResLength() - ele.getLength() - ele.sRef
+ if ds > 0:
+ self.writeDrift(ds)
+
+ def writeBend(self, ele):
+ if (ele.sRef > 0):
+ self.writeDrift(ele.sRef)
+ Lpath = ele.getLength()
+ angrad = ele.angle * math.asin(1) / 90
+ angradcor = angrad
+ if 'cor' in ele.__dict__:
+ angradcor = angrad + ele.cor
+ if (self.lsc != 0):
+ self.write(
+ "%s.lsc: LSCDRIFT, L=0, LEFFECTIVE=%f, BINS=%d, SMOOTHING=1, LSC=%d\n" % (ele.Name, Lpath, self.lscbins,
+ self.lsc))
+ self.seq.append("%s.lsc" % ele.Name)
+ self.write("%s.b: CSRCSBEND, L=%f, ANGLE=%f, &\n" % (ele.Name, Lpath, angradcor))
+ self.write("\tE1=%f, E2=%f, TILT=%f, &\n" % (ele.e1 * angrad, ele.e2 * angrad, ele.Tilt))
+ self.write("\tHGAP=0.015, FINT=0.5, NONLINEAR=1, N_KICKS=10,INTEGRATION_ORDER=4, &\n")
+ self.write("\tBINS=%d,SG_HALFWIDTH=2, ISR=%d, SYNCH_RAD=%d, CSR=%d\n" % (self.csrbins, self.csr, self.csr,
+ self.csr))
+ self.write("%s: LINE=(%s.lsc,%s.b)\n" % (ele.Name, ele.Name, ele.Name))
+ self.seq.append(ele.Name)
+ else:
+ self.write("%s: CSRCSBEND, L=%f, ANGLE=%f, &\n" % (ele.Name, Lpath, angradcor))
+ self.write("\tE1=%f, E2=%f, TILT=%f, &\n" % (ele.e1 * angrad, ele.e2 * angrad, ele.Tilt))
+ self.write("\tHGAP=0.015, FINT=0.5, NONLINEAR=1, N_KICKS=10,INTEGRATION_ORDER=4, &\n")
+ self.write("\tBINS=%d,SG_HALFWIDTH=2, ISR=%d, SYNCH_RAD=%d, CSR=%d\n" % (self.csrbins, self.csr, self.csr,
+ self.csr))
+ self.seq.append(ele.Name)
+ if abs(angrad) > 0:
+ self.setCSR()
+ ds = ele.getResLength() - ele.getLength() - ele.sRef
+ if ds > 0:
+ self.writeDrift(ds)
+
+ def writeUndulator(self, ele):
+ pi = 2 * math.asin(1)
+ Nu = round(ele.getLength() * ele.ku / pi)
+ r = 3e8 / 511000 / 2 / pi / 100;
+ Bu = ele.K * ele.ku * 0.01 / 2 / pi / r;
+ LaserHeater = 0
+ if 'UPHS' in ele.Name:
+ ele.K = 0
+ if 'UDLY' in ele.Name:
+ ele.K = 0
+ if 'Power' in ele.__dict__:
+ if ele.Power > 0:
+ LaserHeater = 0 ######## disable laser modulator, since energy spread is not correct anyhow
+ if ele.sRef > 0:
+ self.writeDrift(ele.sRef)
+ if ele.K == 0:
+ self.write("%s: LSCDRIFT, L=%f, LEFFECTIVE=%f, BINS=%d, SMOOTHING=1, LSC=%d\n" % (ele.Name, ele.getLength(),
+ ele.getLength(),
+ self.lscbins, self.lsc))
+ self.seq.append(ele.Name)
+ # add dechirper here
+ # if 'UDCP' in ele.Name:
+ # wake=Dechirper()
+ # wake.getWake(ele.gap, ele.Name,self.savepath)
+ # print('Write wakefile for %s with gap: %f mm' % (ele.Name,ele.gap*1e3))
+ # self.write('%s_LW : WAKE, INPUTFILE = "%s/wake_%s.sdds", CHANGE_P0 = 1, &\n' % (ele.Name,self.path,ele.Name))
+ # self.write('\t TCOLUMN="t",WCOLUMN="W", INTERPOLATE=1, FACTOR = %f, N_BINS=%d, SMOOTHING=1 \n'% (ele.getLength(),self.wakebins))
+ # self.seq.append('%s_LW' % ele.Name)
+
+ # if 'DECHIRPER-V' in ele.Baugruppe:
+ # self.write('%s_DW : TRWAKE, INPUTFILE = "%s/wake_%s.sdds", &\n' % (ele.Name,self.path,ele.Name))
+ # self.write('\t TCOLUMN="t",WXCOLUMN="WD", WYCOLUMN="WD", XFACTOR = 0, YFACTOR = %f, &\n' % (ele.getLength()))
+ # self.write('\t INTERPOLATE=1, N_BINS=%d, SMOOTHING=1 \n'% self.wakebins)
+ # self.write('%s_QW : TRWAKE, INPUTFILE = "%s/wake_%s.sdds", &\n' % (ele.Name,self.path,ele.Name))
+ # self.write('\t TCOLUMN="t",WXCOLUMN="WQP", WYCOLUMN="WQ", XFACTOR = %f, YFACTOR = %f, &\n' % (ele.getLength(),ele.getLength()))
+ # self.write('\t INTERPOLATE=1, N_BINS=%d, SMOOTHING=1, & \n'% self.wakebins)
+ # self.write('\t X_DRIVE_EXPONENT=0, Y_DRIVE_EXPONENT = 0, X_PROBE_EXPONENT = 1, Y_PROBE_EXPONENT = 1\n')
+ # self.seq.append('%s_DW' % ele.Name)
+ # self.seq.append('%s_QW' % ele.Name)
+ # elif 'DECHIRPER-H' in ele.Baugruppe:
+ # self.write('%s_DW : TRWAKE, INPUTFILE = "%s/wake_%s.sdds", &\n' % (ele.Name,self.path,ele.Name))
+ # self.write('\t TCOLUMN="t",WXCOLUMN="WD", WYCOLUMN="WD", XFACTOR = %f, YFACTOR = 0, &\n' % (ele.getLength()))
+ # self.write('\t INTERPOLATE=1, N_BINS=%d, SMOOTHING=1 \n'% self.wakebins)
+ # self.write('%s_QW : TRWAKE, INPUTFILE = "%s/wake_%s.sdds", &\n' % (ele.Name,self.path,ele.Name))
+ # self.write('\t TCOLUMN="t",WXCOLUMN="WQ", WYCOLUMN="WQP", XFACTOR = %f, YFACTOR = %f, &\n' % (ele.getLength(),ele.getLength()))
+ # self.write('\t INTERPOLATE=1, N_BINS=%d, SMOOTHING=1, & \n'% self.wakebins)
+ # self.write('\t X_DRIVE_EXPONENT=0, Y_DRIVE_EXPONENT = 0, X_PROBE_EXPONENT = 1, Y_PROBE_EXPONENT = 1\n')
+ # self.seq.append('%s_DW' % ele.Name)
+ # self.seq.append('%s_QW' % ele.Name)
+
+ ds = ele.getResLength() - ele.getLength() - ele.sRef
+ if ds > 0:
+ self.writeDrift(ds)
+ return
+ name = ele.Name
+ if self.lsc != 0:
+ self.write(
+ "%s.lsc: LSCDRIFT, L=0, LEFFECTIVE=%f, BINS=%d, SMOOTHING=1, LSC=%d\n" % (ele.Name, ele.getLength(),
+ self.lscbins, self.lsc))
+ self.seq.append("%s.lsc" % ele.Name)
+ name = "%s.wig" % ele.Name
+ if LaserHeater == 0:
+ self.write("%s : WIGGLER, L=%f, K=%f, POLES=%d, TILT=%f\n" % (name, ele.getLength(), ele.K, Nu, ele.Tilt))
+ else:
+ self.write("%s : LSRMDLTR, L=%f, PERIODS=%d, BU=%f, &\n" % (name, ele.getLength(), Nu / 2, Bu));
+ self.write("\t LASER_W0=%e, LASER_PEAK_POWER=%e, &\n" % (ele.Waist, ele.Power));
+ self.write("\t N_STEPS=%d, ACCURACY=0.001, POLE_FACTOR1=1, POLE_FACTOR2=1,POLE_FACTOR3=1\n" % (Nu * 60));
+ self.seq.append(name)
+ ds = ele.getResLength() - ele.getLength() - ele.sRef
+ if ds > 0:
+ self.writeDrift(ds)
+
+ def writeRF(self, ele):
+
+ if ele.sRef > 0:
+ self.writeDrift(ele.sRef)
+ if ele.Tag == "RACC":
+ self.write('%s : RFCW, FREQ=%f, CELL_LENGTH=1.0, &\n' % (ele.Name, ele.Frequency))
+ self.write(
+ '\t L=%f, VOLT=%e, PHASE= %f, &\n' % (ele.getLength(), ele.Gradient * ele.getLength(), ele.Phase))
+ self.write('\t CHANGE_P0=1, END1_FOCUS=1, END2_FOCUS=1, &\n');
+ self.write('\t BODY_FOCUS_MODEL="NONE",INTERPOLATE=1, N_BINS=%d, SMOOTHING=1, &\n' % (self.wakebins));
+ self.write('\t ZWAKEFILE="%s/wake_l_%s-band.sdds", &\n' % (self.wpath, ele.Band));
+ self.write('\t TRWAKEFILE="%s/wake_t_%s-band.sdds", &\n' % (self.wpath, ele.Band));
+ self.write('\t LSC=%d, LSC_BINS=%d, N_KICKS=10, &\n' % (self.lsc, self.lscbins));
+ self.write('\t TCOLUMN="t",WXCOLUMN="W", WYCOLUMN="W", WZCOLUMN="W"\n');
+ else:
+ if ele.Band == 'S':
+ SWave = 1
+ else:
+ SWave = 0
+ self.write('%s : RFDF, FREQUENCY=%f, STANDING_WAVE=%d, TILT=%f, &\n' % (ele.Name, ele.Frequency, SWave,
+ ele.Tilt))
+ grad = ele.Gradient * ele.getLength()
+ self.write('\t L=%f, VOLTAGE=%e, PHASE= %f\n' % (ele.getLength(), grad, ele.Phase))
+ self.seq.append(ele.Name)
+ ds = ele.getResLength() - ele.getLength() - ele.sRef
+ if ds > 0:
+ self.writeDrift(ds)
diff --git a/matchmaker.py b/matchmaker.py
index 75489ec..467e37b 100644
--- a/matchmaker.py
+++ b/matchmaker.py
@@ -84,6 +84,7 @@ class MatchMaker:
def match(self, om, variables = None, initCond=None, Injector=True, Athos = True, Aramis = False, Porthos = False, full =False):
+
self.matchresult.clear()
cwd = os.getcwd()
os.chdir(self.scriptdir)
@@ -97,6 +98,10 @@ class MatchMaker:
f = io.StringIO()
madx = CMadX(f)
madx.E0 = 2000
+ if initCond['energy']> 0:
+ madx.E0 = initCond['energy']
+ om.forceEnergyAt('SINLH02.MBND100', madx.E0 * 1e6)
+ print('Updating initial Energy to:',madx.E0)
om.setBranch(target, 'SINLH01')
madx.updateLattice(om, target) # write lattice
madx.commonHeader('SwissFEL', '#s/#e', None) # sets header
diff --git a/model.py b/model.py
index f18415d..a630390 100644
--- a/model.py
+++ b/model.py
@@ -148,7 +148,11 @@ class Model:
def loadSettingsGroup(self,group,fields,normalized=False):
for key in group.keys():
ele = self.om.getElement(key)
+ if ele is None: # entry in settings file, which doe snot exist in lattice
+ continue
for field in fields:
+ if 'design' in field:
+ print(ele.Name,group[key][field])
ele.__dict__[field]=group[key][field]
if normalized:
ele.__dict__[field]/=ele.Length
@@ -164,7 +168,7 @@ class Model:
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['Kicker'], ['design_kick'])
self.startEnergy = settings['Energy']['energy']
self.energyReference = settings['Energy']['location']
self.startTwiss = settings['InitialCondition']
@@ -213,11 +217,12 @@ class Model:
refloc = start.upper()
if self.startEnergy is None:
self.startEnergy = self.om.EnergyAt(self.energyReference)[0]*1e-6
+
twiss0['energy'] = self.startEnergy*1e-3 # convert to GeV for madx
start, end = self.checkRange(start, end, refloc[0:7])
if start is None:
return
- print('Tracking from',start,'to',end)
+ print('Tracking from',start,'to',end, '(Reference Location:',refloc,')')
self.doTrack(start,end,refloc,twiss0)
@@ -225,11 +230,12 @@ class Model:
#print(twiss_in)
twiss0 = {converttwiss[key]:twiss_in[key] for key in twiss_in.keys()} # follows the madx format
self.setBranch(end.upper())
- print("Tracking:",refloc[0:7],start)
if not refloc[0:7] == start:
+ print("Back tracking from", refloc, start)
twiss0 = self.doBackTrack(refloc,start,twiss0) # track backwards to get new initial twiss values
twiss = self.madx.track('swissfel',start+'$START',end+'$END',twiss0)
energy = self.calcEnergyProfile(twiss)
+ exit
if plot:
self.parent.plot.newData(twiss,energy)
@@ -285,6 +291,7 @@ class Model:
destination = 'ATHOS'
elif 'S10BD' in end or 'SIN' in end:
destination = 'INJECTOR'
+ print('Setting Branch in online model:', destination)
self.om.setBranch(destination,'SINLH01')
self.order=self.om.getBranchElements()
self.madx.updateLattice(self.om,destination,self.forceLat)
diff --git a/ui/OpticsToolsGui.py b/ui/OpticsToolsGui.py
index ce6453a..c1027dd 100644
--- a/ui/OpticsToolsGui.py
+++ b/ui/OpticsToolsGui.py
@@ -433,6 +433,15 @@ class Ui_OpticsGUI(object):
self.label_17.setObjectName("label_17")
self.gridLayout_6.addWidget(self.label_17, 2, 0, 1, 1)
self.verticalLayout_3.addLayout(self.gridLayout_6)
+ self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+ self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+ self.UIDoInitialEnergy = QtWidgets.QCheckBox(self.widget)
+ self.UIDoInitialEnergy.setObjectName("UIDoInitialEnergy")
+ self.horizontalLayout_3.addWidget(self.UIDoInitialEnergy)
+ self.UIInitialEnergy = QtWidgets.QLineEdit(self.widget)
+ self.UIInitialEnergy.setObjectName("UIInitialEnergy")
+ self.horizontalLayout_3.addWidget(self.UIInitialEnergy)
+ self.verticalLayout_3.addLayout(self.horizontalLayout_3)
self.label_19 = QtWidgets.QLabel(self.widget)
font = QtGui.QFont()
font.setBold(True)
@@ -717,9 +726,13 @@ class Ui_OpticsGUI(object):
self.actionOpenMatchEditor.setObjectName("actionOpenMatchEditor")
self.actionOpenScriptEditor = QtWidgets.QAction(OpticsGUI)
self.actionOpenScriptEditor.setObjectName("actionOpenScriptEditor")
+ self.actionExport_Elegant = QtWidgets.QAction(OpticsGUI)
+ self.actionExport_Elegant.setObjectName("actionExport_Elegant")
self.menuFile.addAction(self.actionOpen_2)
self.menuFile.addAction(self.actionSave)
self.menuFile.addSeparator()
+ self.menuFile.addAction(self.actionExport_Elegant)
+ self.menuFile.addSeparator()
self.menuFile.addAction(self.actionQuit)
self.menuFile.addSeparator()
self.menuHelp.addAction(self.actionAbout)
@@ -783,6 +796,8 @@ class Ui_OpticsGUI(object):
self.UIInitBetay.setText(_translate("OpticsGUI", "20"))
self.UIInitAlphay.setText(_translate("OpticsGUI", "0"))
self.label_17.setText(_translate("OpticsGUI", "alpha"))
+ self.UIDoInitialEnergy.setText(_translate("OpticsGUI", "Initialize Energy (MeV)"))
+ self.UIInitialEnergy.setText(_translate("OpticsGUI", "157"))
self.label_19.setText(_translate("OpticsGUI", "Matching Variables"))
self.UIModifyKnobs.setText(_translate("OpticsGUI", "Overwrite default values for matching variables "))
item = self.UIMatchKnobs.horizontalHeaderItem(0)
@@ -869,3 +884,4 @@ class Ui_OpticsGUI(object):
self.actionOpenMatch.setText(_translate("OpticsGUI", "Open New Matching File..."))
self.actionOpenMatchEditor.setText(_translate("OpticsGUI", "Open Matching File in Editor..."))
self.actionOpenScriptEditor.setText(_translate("OpticsGUI", "Open Script in Editor..."))
+ self.actionExport_Elegant.setText(_translate("OpticsGUI", "Export Elegant Lattice..."))
diff --git a/ui/OpticsToolsGui.ui b/ui/OpticsToolsGui.ui
index f700ad3..bef8e61 100644
--- a/ui/OpticsToolsGui.ui
+++ b/ui/OpticsToolsGui.ui
@@ -709,6 +709,24 @@
+ -
+
+
-
+
+
+ Initialize Energy (MeV)
+
+
+
+ -
+
+
+ 157
+
+
+
+
+
-
@@ -1006,6 +1024,8 @@
+
+
@@ -1362,6 +1382,11 @@
Open Script in Editor...
+
+
+ Export Elegant Lattice...
+
+