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... + +