SF+ matching and support for ELegant lattice export

This commit is contained in:
reiche committed 2026-10-13 09:39:40 +02:00
1 parent 85b8e89917
commit 4e9a35b0e7
8 files changed
+818 -323

No files matched your search

+10
View File
@@ -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()
+48 -47
View File
@@ -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;
+273 -273
View File
@@ -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,
+431
View File
@@ -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)
+5
View File
@@ -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
+10 -3
View File
@@ -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)
+16
View File
@@ -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..."))
+25
View File
@@ -709,6 +709,24 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="UIDoInitialEnergy">
<property name="text">
<string>Initialize Energy (MeV)</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="UIInitialEnergy">
<property name="text">
<string>157</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_19">
<property name="font">
@@ -1006,6 +1024,8 @@
<addaction name="actionOpen_2"/>
<addaction name="actionSave"/>
<addaction name="separator"/>
<addaction name="actionExport_Elegant"/>
<addaction name="separator"/>
<addaction name="actionQuit"/>
<addaction name="separator"/>
</widget>
@@ -1362,6 +1382,11 @@
<string>Open Script in Editor...</string>
</property>
</action>
<action name="actionExport_Elegant">
<property name="text">
<string>Export Elegant Lattice...</string>
</property>
</action>
</widget>
<resources/>
<connections>