diff --git a/OpticsTools.py b/OpticsTools.py index ceaae0b..6d4dced 100644 --- a/OpticsTools.py +++ b/OpticsTools.py @@ -4,7 +4,7 @@ import webbrowser import subprocess from argparse import ArgumentParser -from PyQt5 import QtWidgets,QtGui +from PyQt5 import QtWidgets,QtGui,QtCore from ui.OpticsToolsGui import Ui_OpticsGUI from plot import OpticsPlot @@ -15,7 +15,10 @@ from sandbox import Sandbox from matchmaker import MatchMaker -class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): + +class OpticsTools(QtWidgets.QMainWindow, QtCore.QObject, Ui_OpticsGUI): + sigStatus = QtCore.pyqtSignal(str) + def __init__(self,phase=0, office= 1): super(OpticsTools, self).__init__() self.setupUi(self) @@ -34,7 +37,7 @@ class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): self.model = Model(phase=phase,parent=self) # initialize modeling - self.match = MatchMaker() + self.match = MatchMaker(signal=self.sigStatus) self.UIMatchOpticsSelect.clear() for key in self.match.matchlist.keys(): self.UIMatchOpticsSelect.addItem(key) @@ -65,7 +68,7 @@ class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): self.actionHelp.triggered.connect(self.openGit) self.actionAbout.triggered.connect(self.about) self.actionOpenScriptEditor.triggered.connect(self.editMatchingScript) - + self.sigStatus.connect(self.status) def doMatch(self): """ @@ -166,7 +169,7 @@ class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): "Json Files (*.json)", options=options) if not fileName: return - self.saveSettingDirect(fileName) + self.saveSettingdirect(fileName) def loadSettings(self): @@ -197,7 +200,8 @@ class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): self.sandbox.updateSandbox() self.status('Machine Settings') - def status(self,msg=''): + @QtCore.pyqtSlot(str) + def status(self,msg): self.UIStatus.setText(msg) # -------------------------------- # Main routine diff --git a/Scripts/Reference-SwissFEL/initTwiss.madx b/Scripts/Reference-SwissFEL/initTwiss.madx index db1b991..ff311c7 100644 --- a/Scripts/Reference-SwissFEL/initTwiss.madx +++ b/Scripts/Reference-SwissFEL/initTwiss.madx @@ -1,11 +1,17 @@ option,-echo; ! starting condition Twiss0: beta0, betx = 29.971, alfx = 0.003, bety = 26., alfy = -0.288; ! location:swissfel$start -TwissM1: beta0, betx = 11.2, alfx = 3.2, bety = 0.8, alfy = 0.75; ! location:sinlh02.mqua410$start -TwissM2: beta0, betx = 11.1557, alfx = -1.17, bety = 50, alfy = 0.; ! location:sindi02.mqua020$start -TwissM3: beta0, betx = 4.88, alfx = 0.5546, bety = 16.11, alfy = -1.81; ! location:s10bc01.mqua020$start -TwissM4: beta0, betx = 6.14, alfx = -0.83, bety = 22.86, alfy = -1.18; ! location:s10ma01.mqua020$start -Twisssep: beta0,betx = 48.26, alfx = 7.322, bety = 14.293, alfy = -3.513; ! location:s20sy02$start +TwissM1: beta0, betx = 11.2, alfx = 3.2, bety = 0.8, alfy = 0.75; ! label: Laser heater location:sinlh02.mqua410$start +TwissM2: beta0, betx = 11.1557, alfx = -1.17, bety = 50, alfy = 0.; ! label: After BC1 location:sindi02.mqua020$start +TwissM3: beta0, betx = 4.88, alfx = 0.5546, bety = 16.11, alfy = -1.81; ! label: After Linac 1 location:s10bc01.mqua020$start +TwissM4: beta0, betx = 6.14, alfx = -0.83, bety = 22.86, alfy = -1.18; ! label: After BC 2 location:s10ma01.mqua020$start +Twisssep: beta0,betx = 48.26, alfx = 7.322, bety = 14.293, alfy = -3.513; ! label: Septum location:s20sy02$start +TwissAT1: beta0, betx=35.76, alfx = -1.166, bety = 24.087, alfy = 0.648; ! label: Athos diagnostics location: satdi01.mqua250$start +twissee: beta0, betx=7,bety=30,alfx=0.5,alfy=1.5; ! label: EEHG location: satma01.mqua250$end +twissAT2: beta0, betx=50,bety=50,alfx=0.0,alfy=0; ! label: Athos XTCAV location: satbd01.mqua010$start +twissL3: beta0, betx = 8.83, alfx = 0.0548, bety = 30.44, alfy = -1.866; ! label: Linac 3 location:s30cb10.mqua430$start +twissARECOL:beta0, betx = 2.304, alfx = -1.4045, bety = 25.929, alfy = -6.363; ! label: Aramis ECOL location:sarma01.mqua010$start + ! variables leakdisp = 0; ! Description: Leaked dispersion in SATSY01 to control R56 of switchyard ECOLasBC = 0; ! Description: Flag to configure Aramis Energy collimator as a bunch compressor \ No newline at end of file diff --git a/Scripts/Reference-SwissFEL/matchAramis.madx b/Scripts/Reference-SwissFEL/matchAramis.madx index 29b1359..44910e1 100644 --- a/Scripts/Reference-SwissFEL/matchAramis.madx +++ b/Scripts/Reference-SwissFEL/matchAramis.madx @@ -1,243 +1,109 @@ +!----------------------------------- +! switch yard +! matching condition at the septum, the new design by Natalia on 27th July 2011 +! find the correct kicker strength to have the right dispersion and offset. + + +!------------------------------ +! match periodic lattice of linac 3 +s30cb01.mqua430.k1 := 0.8168941546; +s30cb02.mqua430.k1 := -0.8168914699; +muLin3=0.188; - -y_sep=0.01; -py_sep=0.0; - - - -S20SY02.MKDC010.cory := SYKICK*2; -S20SY02.MKAC020.cory := SYKICK*3; -S20SY02.MKDC030.cory := SYKICK*2; -S20SY02.MKAC040.cory := SYKICK*3; -S20SY02.MKDC050.cory := SYKICK*2; - - - -use,sequence=swissfel; -select,flag=Error,pattern="SAT.*"; -ealign,DY=0.01; - -MATCH,SEQUENCE=swissfel,range=s20sy02$start/s20sy02$end,beta0=Twisssep; -VARY,NAME=s20sy02.mqua070.k1,STEP=0.0001,lower=-3,upper=3; -VARY,NAME=s20sy02.mqua100.k1,STEP=0.0001,lower=-3,upper=3; -VARY,NAME=s20sy02.mqua140.k1,STEP=0.0001,lower=-3,upper=3; -VARY,NAME=s20sy02.mqua180.k1,STEP=0.0001,lower=-3,upper=3; -VARY,NAME=SYKICK,STEP=0.0001; -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; -LMDIF,CALLS=8000,TOLERANCE=1.e-21; -ENDMATCH; - - - -! this statements are needed to have explicit values in the output file -SYKICK=0; -S20SY02.MKDC010.c1:= SYKICK*2; -S20SY02.MKAC020.c1:= SYKICK*3; -S20SY02.MKDC030.c1:= SYKICK*2; -S20SY02.MKAC040.c1:= SYKICK*3; -S20SY02.MKDC050.c1:= SYKICK*2; - - -s20bc01.mqua010.k1:=1.; - -MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s20bc02$end,beta0=twisssep; -VARY,NAME=s20bc01.mqua010.k1,STEP=0.0001; -VARY,NAME=s20bc01.mqua030.k1,STEP=0.0001; -VARY,NAME=s20bc01.mqua050.k1,STEP=0.0001; -CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc02$end,betx<4; -CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc02$end,bety<90; -CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc01$end,betx<250; -CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc01$end,bety<20; -LMDIF,CALLS=1000,TOLERANCE=1.e-21; -ENDMATCH; - -twiss,SEQUENCE=swissfel,range=s20sy02$start/S20BC02$END,beta0=twisssep; -plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; - - - -muLin3=0.2; -pol = 1; -s20cb01.mqua430.k1=0.5*pol; -s20cb02.mqua430.k1=-0.5*pol; - -match,SEQUENCE=swissfel,range=S20cb01$start/s20cb02$end; -Vary,name=S20CB01.MQUA430.k1,step=0.0001; -Vary,name=S20CB02.MQUA430.k1,step=0.0001; -constraint,sequence=swissfel,range=s20cb02$end,mux=muLin3; -constraint,sequence=swissfel,range=s20cb02$end,muy=muLin3; +match,SEQUENCE=swissfel,range=s30cb01$start/s30cb03$start; +Vary,name=S30CB01.MQUA430.k1,step=0.0001; +Vary,name=S30CB02.MQUA430.k1,step=0.0001; +constraint,sequence=swissfel,range=s30cb02$end,mux=muLin3; +constraint,sequence=swissfel,range=s30cb02$end,muy=muLin3; lmdif,calls=100,tolerance=1e-21; endmatch; -twiss,SEQUENCE=swissfel,range=s20cb01$start/s20cb02$end; - -nbetx=table(twiss,s20cb02$end,betx); -nalfx=table(twiss,s20cb02$end,alfx); -nbety=table(twiss,s20cb02$end,bety); -nalfy=table(twiss,s20cb02$end,alfy); -plot,haxis=s,vaxis=betx,bety,colour=100; - -s20cb03.mqua430.k1 = s20cb01.mqua430.k1; -s20cb04.mqua430.k1 = s20cb02.mqua430.k1; -s30cb01.mqua430.k1 = s20cb01.mqua430.k1; -s30cb02.mqua430.k1 = s20cb02.mqua430.k1; -s30cb03.mqua430.k1 = s20cb01.mqua430.k1; -s30cb04.mqua430.k1 = s20cb02.mqua430.k1; -s30cb05.mqua430.k1 = s20cb01.mqua430.k1; -s30cb06.mqua430.k1 = s20cb02.mqua430.k1; -s30cb07.mqua430.k1 = s20cb01.mqua430.k1; -s30cb08.mqua430.k1 = s20cb02.mqua430.k1; -s30cb09.mqua430.k1 = s20cb01.mqua430.k1; -s30cb10.mqua430.k1 = s20cb02.mqua430.k1; -s30cb11.mqua430.k1 = s20cb01.mqua430.k1; -s30cb12.mqua430.k1 = s20cb02.mqua430.k1; -s30cb13.mqua430.k1 = s20cb01.mqua430.k1; -s30cb14.mqua430.k1 = s20cb02.mqua430.k1; +S30CB03.MQUA430.k1=S30CB01.MQUA430.k1; +S30CB04.MQUA430.k1=S30CB02.MQUA430.k1; +S30CB05.MQUA430.k1=S30CB01.MQUA430.k1; +S30CB06.MQUA430.k1=S30CB02.MQUA430.k1; +S30CB07.MQUA430.k1=S30CB01.MQUA430.k1; +S30CB08.MQUA430.k1=S30CB02.MQUA430.k1; +S30CB09.MQUA430.k1=S30CB01.MQUA430.k1; +S30CB10.MQUA430.k1=S30CB02.MQUA430.k1; +S30CB11.MQUA430.k1=S30CB01.MQUA430.k1; +S30CB12.MQUA430.k1=S30CB02.MQUA430.k1; +S30CB13.MQUA430.k1=S30CB01.MQUA430.k1; +S30CB14.MQUA430.k1=S30CB02.MQUA430.k1; +S30CB15.MQUA430.k1=S30CB01.MQUA430.k1; +twiss,SEQUENCE=swissfel,range=s30cb01$start/s30cb02$end; +nbetx=table(twiss,s30cb02$end,betx); +nalfx=table(twiss,s30cb02$end,alfx); +nbety=table(twiss,s30cb02$end,bety); +nalfy=table(twiss,s30cb02$end,alfy); -MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s20cb04$end,beta0=twisssep; -VARY,NAME=s20ma01.mqua010.k1,STEP=0.0001; -VARY,NAME=s20ma01.mqua020.k1,STEP=0.0001; -VARY,NAME=s20ma01.mqua040.k1,STEP=0.0001; -vary,name=s20cb01.mqua430.k1,step=0.0001; -CONSTRAINT,SEQUENCE=SwissFEL,range= s20cb03$start,betx=nbetx; -CONSTRAINT,SEQUENCE=SwissFEL,range= s20cb03$start,bety=nbety; -CONSTRAINT,SEQUENCE=SwissFEL,range= s20cb03$start,alfx=nalfx; -CONSTRAINT,SEQUENCE=SwissFEL,range= s20cb03$start,alfy=nalfy; -LMDIF,CALLS=1000,TOLERANCE=1.e-21; -ENDMATCH; - -twiss,SEQUENCE=swissfel,range=s20sy02$start/S20cb04$end,beta0=twisssep; -plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; - - -MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s30cb07$end,beta0=twisssep; -VARY,NAME=s30cb01.mqua430.k1,STEP=0.0001; -VARY,NAME=s30cb02.mqua430.k1,STEP=0.0001; -VARY,NAME=s30cb03.mqua430.k1,STEP=0.0001; -VARY,NAME=s30cb04.mqua430.k1,STEP=0.0001; -CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb05$start,betx=nbetx; -CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb05$start,bety=nbety; -CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb05$start,alfx=nalfx; -CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb05$start,alfy=nalfy; -LMDIF,CALLS=1000,TOLERANCE=1.e-21; +use,sequence=swissfel; +MATCH,SEQUENCE=swissfel,range=s20SY02$start/s30cb01$end,beta0=twisssep; +VARY,NAME=s20sy03.mqua020.k1,STEP=0.0001,lower=-2.2,upper=2.2; +VARY,NAME=s20sy03.mqua030.k1,STEP=0.0001,lower=-2.2,upper=2.2; +VARY,NAME=s20sy03.mqua050.k1,STEP=0.0001,lower=-2.2,upper=2.2; +VARY,NAME=s20sy03.mqua060.k1,STEP=0.0001,lower=-2.2,upper=2.2; +VARY,NAME=s20sy03.mqua100.k1,STEP=0.0001,lower=-2.2,upper=2.2; +CONSTRAINT,SEQUENCE=swissfel,range=s20sy03$end,betx=nbetx; +CONSTRAINT,SEQUENCE=swissfel,range=s20sy03$end,alfx=nalfx; +CONSTRAINT,SEQUENCE=swissfel,range=s20sy03$end,bety=nbety; +CONSTRAINT,SEQUENCE=swissfel,range=s20sy03$end,alfy=nalfy; +CONSTRAINT,SEQUENCE=swissfel,range=s20sy03.mqua060$start,betx<30; ! for the new design +LMDIF,CALLS=100,TOLERANCE=1.e-21; ENDMATCH; -!L = 9; -!alpha = 1.5; -!beta = alpha*L; +use,sequence=swissfel; +MATCH,SEQUENCE=swissfel,range=s20SY02$start/s30cb12$end,beta0=twisssep; +VARY,NAME=s30cb06.mqua430.k1,STEP=0.0001; +VARY,NAME=s30cb07.mqua430.k1,STEP=0.0001; +VARY,NAME=s30cb08.mqua430.k1,STEP=0.0001; +VARY,NAME=s30cb09.mqua430.k1,STEP=0.0001; +CONSTRAINT,SEQUENCE=swissfel,range=s30cb10.mqua430$start,betx=twissL3->BETX; +CONSTRAINT,SEQUENCE=swissfel,range=s30cb10.mqua430$start,alfx=twissL3->ALFX; +CONSTRAINT,SEQUENCE=swissfel,range=s30cb10.mqua430$start,bety=twissL3->BETY; +CONSTRAINT,SEQUENCE=swissfel,range=s30cb10.mqua430$start,alfy=twissL3->ALFY; +LMDIF,CALLS=100,TOLERANCE=1.e-21; +ENDMATCH; -!MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s30cb14$end,beta0=twisssep; -!VARY,NAME=s30cb10.mqua430.k1,STEP=0.0001; -!VARY,NAME=s30cb11.mqua430.k1,STEP=0.0001; -!VARY,NAME=s30cb12.mqua430.k1,STEP=0.0001; -!VARY,NAME=s30cb13.mqua430.k1,STEP=0.0001; -!VARY,NAME=s30cb14.mqua430.k1,STEP=0.0001; -!CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb14.mqua430$end,betx=beta; -!CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb14.mqua430$end,bety=beta; -!CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb14.mqua430$end,alfx=alpha; -!CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb14.mqua430$end,alfy=alpha; -!CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb14.mqua430$end,X<1; -!LMDIF,CALLS=1000,TOLERANCE=1.e-21; -!ENDMATCH; - -twiss,SEQUENCE=swissfel,range=s20sy02$start/S30cb14$END,beta0=twisssep; +twiss,SEQUENCE=swissfel,range=s20SY02$start/sarcl01$start,beta0=twisssep; plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; -Select,flag=Error,pattern="SPO.*"; -EALIGN,DY=0.01; +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 +! energy collimator - -PSYKICK:=0.1; -S30cb15.MKDC010.cory := PSYKICK*2; -S30cb15.MKAC020.cory := PSYKICK*3; -S30cb15.MKDC030.cory := PSYKICK*2; -S30cb15.MKAC040.cory := PSYKICK*3; -S30CB15.MKDC050.cory := PSYKICK*2; -pqf:=1; - -S30cb15.mqua100.k1 := -0.2*pqf; -S30cb15.mqua200.k1 := -pqf; - -MATCH,SEQUENCE=Swissfel,range=S30CB15$START/s30cb15$END,BETA0 = TWISSsep; -VARY, NAME=PSYKICK, STEP=0.00001; -VARY, NAME=PQF, STEP=0.00001; -CONSTRAINT, SEQUENCE=swissfel, RANGE=s30cb15$end, Y = 0.01; -CONSTRAINT, SEQUENCE=swissfel, RANGE=s30cb15$end, PY = 0.; -LMDIF, CALLS=1000, TOLERANCE=1.E-21; -ENDMATCH; - - -pbetx=3.9036; -palfx=-0.05021; -pbety=37.6374; -palfy=4.4433; - -twisspor: beta0, betx=pbetx,alfx=palfx, bety=pbety,alfy=palfy; - -s30cb13.mqua430.k1 = 0.456; -s30cb14.mqua430.k1 = -1.741; -s30cb15.mqua010.k1 = 1.1533; -s30cb15.mqua020.k1 = -0.0961; - -MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s30sy01$end,beta0=twisssep; -VARY,NAME=s30cb13.mqua430.k1,STEP=0.0001; -VARY,NAME=s30cb14.mqua430.k1,STEP=0.0001; -VARY,NAME=s30cb15.mqua010.k1,STEP=0.0001; -VARY,NAME=s30cb15.mqua020.k1,STEP=0.0001; -CONSTRAINT, SEQUENCE=swissfel, RANGE=s30cb15$end,betx=pbetx; -CONSTRAINT, SEQUENCE=swissfel, RANGE=s30cb15$end,bety=pbety; -CONSTRAINT, SEQUENCE=swissfel, RANGE=s30cb15$end,alfx=palfx; -CONSTRAINT, SEQUENCE=swissfel, RANGE=s30cb15$end,alfy=palfy; -!LMDIF, CALLS=1000, TOLERANCE=1.E-21; -Simplex, CALLS=1000, TOLERANCE=1.E-21; -ENDMATCH; - -twiss,SEQUENCE=swissfel,range=s20sy02$start/s30cb15$end,beta0=twisssep; -plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; -plot,haxis=s,vaxis=y,dy,range=s30cb15$start/#e,colour=100; - - - - -S30cb15.MKDC010.cory := 0; -S30cb15.MKAC020.cory := 0; -S30cb15.MKDC030.cory := 0; -S30cb15.MKAC040.cory := 0; -S30CB15.MKDC050.cory := 0; +sarcl02.mqua130.k1=1.8; R56 = -000e-6; -MATCH,RMATRIX,SEQUENCE=swissFEL,range=SARCL02$start/SARCL02$end,betx=10,alfx=0,bety=10,alfy=0; +MATCH,RMATRIX,SEQUENCE=swissfel,range=SARCL02$START/SARCL02$END,betx=10,alfx=0,bety=10,alfy=0; VARY,NAME=sarcl02.mqua130.k1,STEP=0.0001; CONSTRAINT,SEQUENCE=swissfel,range=sarcl02.mqua210,re56=R56*0.5; LMDIF,CALLS=100,TOLERANCE=1.e-21; ENDMATCH; -sarcl02.mqua210.k1=-sarcl02.mqua130.k1*0.9; -MATCH,SEQUENCE=swissfel,range=sarcl02$start/sarma01.mqua010,betx=10,alfx=0,bety=10,alfy=0; +sarcl02.mqua210.k1=-sarcl02.mqua130.k1*0.9; +sarcl02.mqua250.k1= sarcl02.mqua130.k1; + + +MATCH,SEQUENCE=swissfel,range=SARCL02$START/SARCL02$END,betx=10,alfx=0,bety=10,alfy=0; VARY,NAME=sarcl02.mqua250.k1,STEP=0.0001; CONSTRAINT,SEQUENCE=swissfel,range=sarcl02.dbpm260$end,dpx=0; LMDIF,CALLS=100,TOLERANCE=1.e-21; ENDMATCH; - sarcl02.mqua310.k1=sarcl02.mqua250.k1; sarcl02.mqua350.k1=sarcl02.mqua210.k1; sarcl02.mqua460.k1=sarcl02.mqua130.k1; @@ -252,103 +118,175 @@ by=by0+dL*dL/by0; ay=-dL/by0; -twiss,sequence=swissfel,range=sarcl02.mqsk300/sarma01.mqua010,betx=bx,alfx=ax,bety=by,alfy=ay; +twiss,sequence=swissfel,range=sarcl02.mqsk300/sarcl02$end,betx=bx,alfx=ax,bety=by,alfy=ay; +plot,haxis=s,vaxis=betx,bety,colour=100; -nbetx= table(twiss,sarma01$start,betx); -nalfx=-table(twiss,sarma01$start,alfx); -nbety= table(twiss,sarma01$start,bety); -nalfy=-table(twiss,sarma01$start,alfy); +nbetx= table(twiss,sarcl02$end,betx); +nalfx=-table(twiss,sarcl02$end,alfx); +nbety= table(twiss,sarcl02$end,bety); +nalfy=-table(twiss,sarcl02$end,alfy); + + +sarcl02.msex255.k2:=110; +sarcl02.msex305.k2:=110; + + +MATCH,chrom,SEQUENCE=sarcl02,range=#s/#e,betx=nbetx,alfx=nalfx,bety=nbety,alfy=nalfy; +VARY,NAME=ecol_k2,STEP=0.0001; +CONSTRAINT,SEQUENCE=Sarcl02,range=#e,ddx=0; +LMDIF,CALLS=100,TOLERANCE=1.e-21; +ENDMATCH; + +sarcl02.msex255.k2=ecol_k2; +sarcl02.msex305.k2=ecol_k2; + +twiss,chrom,rmatrix,range=SARCL02$START/SARCL02$END,betx=nbetx,alfx=nalfx,bety=nbety,alfy=nalfy; +plot,haxis=s,vaxis=betx,colour=100; +plot,haxis=s,vaxis=bety,colour=100; +plot,haxis=s,vaxis=dx,colour=100; +plot,haxis=s,vaxis=ddx,colour=100; +plot,haxis=s,vaxis=re56,colour=100; -MATCH,SEQUENCE=swissfel,range=S30SY01$start/sarma01.mqua010,beta0=twisspor; +!--------------------------------- +! match into energy collimator +! reference point is sarma01-mqua010 + + +sarcl01.mqua020.k1 := 0.4550820417; +sarcl01.mqua050.k1 := -0.02350776516; +sarcl01.mqua080.k1 := -0.3705426893; +sarcl01.mqua100.k1 := 0.3937186328; +sarcl01.mqua140.k1 := 1.214406656; +sarcl01.mqua190.k1 := -1.475278354; + + +use,sequence=swissfel; +MATCH,SEQUENCE=swissfel,range=s20SY02$start/sarma02$start,beta0=twisssep; VARY,NAME=sarcl01.mqua020.k1,STEP=0.0001; VARY,NAME=sarcl01.mqua050.k1,STEP=0.0001; VARY,NAME=sarcl01.mqua080.k1,STEP=0.0001; VARY,NAME=sarcl01.mqua100.k1,STEP=0.0001; VARY,NAME=sarcl01.mqua140.k1,STEP=0.0001; VARY,NAME=sarcl01.mqua190.k1,STEP=0.0001; -!CONSTRAINT,SEQUENCE=swissfel,range=sarcl01.mqua080,betx=beta; -!CONSTRAINT,SEQUENCE=swissfel,range=sarcl01.mqua080,alfx=alpha; -!CONSTRAINT,SEQUENCE=swissfel,range=sarcl01.mqua080,bety=beta; -!CONSTRAINT,SEQUENCE=swissfel,range=sarcl01.mqua080,alfy=alpha; - -CONSTRAINT,SEQUENCE=swissfel,range=sarcl02$start,betx=nbetx; -CONSTRAINT,SEQUENCE=swissfel,range=sarcl02$start,alfx=nalfx; -CONSTRAINT,SEQUENCE=swissfel,range=sarcl02$start,bety=nbety; -CONSTRAINT,SEQUENCE=swissfel,range=sarcl02$start,alfy=nalfy; +CONSTRAINT,SEQUENCE=swissfel,range=sarma01.mqua010$start,betx=twissARECOL->BETX; +CONSTRAINT,SEQUENCE=swissfel,range=sarma01.mqua010$start,alfx=twissARECOL->ALFX; +CONSTRAINT,SEQUENCE=swissfel,range=sarma01.mqua010$start,bety=twissARECOL->BETY; +CONSTRAINT,SEQUENCE=swissfel,range=sarma01.mqua010$start,alfy=twissARECOL->ALFY; CONSTRAINT,SEQUENCE=swissfel,range=sarcl01.mqua050,bety<30; CONSTRAINT,SEQUENCE=swissfel,range=sarcl01.mqua190,betx<30; LMDIF,CALLS=100,TOLERANCE=1.e-21; ENDMATCH; -muAR=0.17; -match,SEQUENCE=swissfel,range=sarun02$start/sarun03$end; -Vary,name=sarun02.mqua080.k1,step=0.0001; + +twiss,sequence=swissfel,range=s20SY02$start/sarcl01$start,beta0=twisssep; +plot,haxis=s,vaxis=betx,bety,range=S30CB15$START/SARCL02$END,colour=100; + + + +!--------------------- +! match periodic lattice of Aramis + +muAR=0.15; +sarun03.mqua080.k1 := -1.699673315; +sarun04.mqua080.k1 := 1.746074065; + +match,SEQUENCE=swissfel,range=sarun03$start/sarun04$end; Vary,name=sarun03.mqua080.k1,step=0.0001; -constraint,sequence=swissfel,range=sarun03$end,mux=muAR; -constraint,sequence=swissfel,range=sarun03$end,muy=muAR; +Vary,name=sarun04.mqua080.k1,step=0.0001; +constraint,sequence=swissfel,range=sarun04$end,mux=muAR; +constraint,sequence=swissfel,range=sarun04$end,muy=muAR; lmdif,calls=100,tolerance=1e-21; endmatch; -twiss,sequence=swissfel,range=sarun02$start/sarun03$end; -mbetx=table(twiss,sarun02$end,betx); -malfx=table(twiss,sarun02$end,alfx); -mbety=table(twiss,sarun02$end,bety); -malfy=table(twiss,sarun02$end,alfy); -plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; -sarun04.mqua080.k1=sarun02.mqua080.k1; -sarun05.mqua080.k1=sarun03.mqua080.k1; -sarun06.mqua080.k1=sarun02.mqua080.k1; -sarun07.mqua080.k1=sarun03.mqua080.k1; -sarun08.mqua080.k1=sarun02.mqua080.k1; -sarun09.mqua080.k1=sarun03.mqua080.k1; -sarun10.mqua420.k1=sarun02.mqua080.k1; -sarun11.mqua080.k1=sarun03.mqua080.k1; -sarun12.mqua080.k1=sarun02.mqua080.k1; -sarun13.mqua080.k1=sarun03.mqua080.k1; -sarun14.mqua080.k1=sarun02.mqua080.k1; -sarun15.mqua080.k1=sarun03.mqua080.k1; -sarun16.mqua080.k1=sarun02.mqua080.k1; -sarun17.mqua080.k1=sarun03.mqua080.k1; -sarun18.mqua080.k1=sarun02.mqua080.k1; -sarun19.mqua080.k1=sarun03.mqua080.k1; +twiss,SEQUENCE=swissfel,range=sarun03$start/sarun04$end; +nbetx=table(twiss,sarun04$end,betx); +nalfx=table(twiss,sarun04$end,alfx); +nbety=table(twiss,sarun04$end,bety); +nalfy=table(twiss,sarun04$end,alfy); -SARUN01.mqua080.k1=sarun03.mqua080.k1; -sarma02.mqua050.k1=0; -sarma02.mqua120.k1=0.7*sarun02.mqua080.k1; + +sarma02.mqua050.k1=sarun03.mqua080.k1; +sarma02.mqua120.k1=sarun04.mqua080.k1; +sarun01.mqua080.k1=sarun03.mqua080.k1; +sarun02.mqua080.k1=sarun04.mqua080.k1; + +!--------------------------- +! matching into the undulator line sarma01.mqua010.k1 := -1.435783623; sarma01.mqua060.k1 := 1.29993551; -sarma01.mqua080.k1 := -1.1356922498; -sarma01.mqua120.k1 := 0.4142170392; -sarma01.mqua140.k1 := -0.4428419456; +sarma01.mqua080.k1 := -0.1356922498; +sarma01.mqua120.k1 := -0.4142170392; +sarma01.mqua140.k1 := 0.4428419456; -MATCH,SEQUENCE=swissfel,range=S30SY01$start/sarun02$start,beta0=twisspor; + + +MATCH,SEQUENCE=swissfel,range=s20SY02$start/sarun06$start,beta0=twisssep; VARY,NAME=sarma01.mqua010.k1,STEP=0.0001; VARY,NAME=sarma01.mqua060.k1,STEP=0.0001; VARY,NAME=sarma01.mqua080.k1,STEP=0.0001; VARY,NAME=sarma01.mqua120.k1,STEP=0.0001; VARY,NAME=sarma01.mqua140.k1,STEP=0.0001; -CONSTRAINT,SEQUENCE=swissfel,range=sarun01$start,betx=mbetx; -CONSTRAINT,SEQUENCE=swissfel,range=sarun01$start,bety=mbety; -CONSTRAINT,SEQUENCE=swissfel,range=sarun01$start,alfx=malfx; -CONSTRAINT,SEQUENCE=swissfel,range=sarun01$start,alfy=malfy; -CONSTRAINT,SEQUENCE=swissfel,range=sarun02$start,x<5; -LMDIF,CALLS=100,TOLERANCE=1.e-21; +CONSTRAINT,SEQUENCE=swissfel,range=sarun03$start,betx=nbetx; +CONSTRAINT,SEQUENCE=swissfel,range=sarun03$start,alfx=nalfx; +CONSTRAINT,SEQUENCE=swissfel,range=sarun03$start,bety=nbety; +CONSTRAINT,SEQUENCE=swissfel,range=sarun03$start,alfy=nalfy; +CONSTRAINT,SEQUENCE=swissfel,range=sarma01.mqua060,betx<40; +LMDIF,CALLS=300,TOLERANCE=1.e-21; ENDMATCH; +sarun05.mqua080.k1=sarun03.mqua080.k1; +sarun06.mqua080.k1=sarun04.mqua080.k1; +sarun07.mqua080.k1=sarun03.mqua080.k1; +sarun08.mqua080.k1=sarun04.mqua080.k1; +sarun09.mqua080.k1=sarun03.mqua080.k1; +sarun10.mqua080.k1=sarun04.mqua080.k1; +sarun11.mqua080.k1=sarun03.mqua080.k1; +sarun12.mqua080.k1=sarun04.mqua080.k1; +sarun13.mqua080.k1=sarun03.mqua080.k1; +sarun14.mqua080.k1=sarun04.mqua080.k1; +sarun15.mqua080.k1=sarun03.mqua080.k1; +sarun16.mqua080.k1=sarun04.mqua080.k1; +sarun17.mqua080.k1=sarun03.mqua080.k1; +sarun18.mqua080.k1=sarun04.mqua080.k1; -twiss,SEQUENCE=swissfel,range=#s/sarun19$end,beta0=twiss0; +sarun19.mqua080.k1=sarun03.mqua080.k1; +sarun20.mqua080.k1=sarun04.mqua080.k1; +sarbd01.mqua020.k1=0; + + + +match,sequence=swissfel,range=s20SY02$start/#e,beta0=twisssep; +vary,name=sarun19.mqua080.k1,step=0.0001,lower=-3,upper=3; +vary,name=sarun20.mqua080.k1,step=0.0001,lower=-3,upper=3; +vary,name=sarbd02.mqua030.k1,step=0.0001; +constraint,sequence=swissfel,range=#e,betx<200; +constraint,sequence=swissfel,range=#e,bety<150; +constraint,sequence=swissfel,range=#e,dx<100; +constraint,sequence=swissfel,range=#e,dy<0.5; +lmdif,calls=300,tolerance=1e-21; +endmatch; + +twiss,RMATRIX,SEQUENCE=swissfel,range=#s/sarbd02$end,beta0=twiss0; plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; -plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100; - -exit; + + + + + + + + + + + diff --git a/Scripts/Reference-SwissFEL/matchAthos.madx b/Scripts/Reference-SwissFEL/matchAthos.madx index 7c9bca6..2109782 100644 --- a/Scripts/Reference-SwissFEL/matchAthos.madx +++ b/Scripts/Reference-SwissFEL/matchAthos.madx @@ -27,7 +27,7 @@ VARY,NAME=s20sy02.mqua180.k1,STEP=0.0001,lower=-3,upper=3; VARY,NAME=SYKICK,STEP=0.0001; 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.006; +CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mbnd200,dy<-0.0063; CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mbnd200,dpy<1; CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mqua180, BETY < 60; LMDIF,CALLS=8000,TOLERANCE=1.e-21; @@ -87,7 +87,7 @@ satsy01.mqua280.k1 = satsy01.mqua280.k1*(1+leakdisp); !------------------------------------------ ! close vertical dispersion - +satcl01.mqsk125.k1 = 0; satsy02.mqua010.k1 := - 1.71; satsy02.mqua110.k1 := 1.22622; @@ -124,12 +124,13 @@ LMDIF, CALLS=1000, TOLERANCE=1.E-21; ENDMATCH; -satsy02.mqua230.k1 = -0.12; -satsy03.mqua010.k1 = 0.56; -satsy03.mqua040.k1 = 0.72; -satsy03.mqua070.k1 = 0.427; -satsy03.mqua100.k1 = -0.01; -satsy03.mqua130.k1 = -0.67; +satsy02.mqua230.k1 = -0.12*0; +satsy03.mqua010.k1 = 0.56*0; +satsy03.mqua040.k1 = 0.72*0; +satsy03.mqua070.k1 = 0.427*0; +satsy03.mqua100.k1 = -0.01*0; +satsy03.mqua130.k1 = -0.67*0; + MATCH,SEQUENCE=swissfel,range=#s/#e,range=s20SY02$start/satcl01$end,beta0=twisssep; @@ -139,9 +140,9 @@ VARY, NAME=satsy03.mqua040.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; VARY, NAME=satsy03.mqua070.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; VARY, NAME=satsy03.mqua100.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; VARY, NAME=satsy03.mqua130.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; -CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,betx=10.8; +CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,betx=10; CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,alfx=-0.01; -CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,bety<30.8; ! was 13.8 +CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,bety<10.0; ! was 13.8 CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,alfy=-0.01; constraint, sequence=swissfel, range=satsy03.mqua130$end, betx <90 ; constraint, sequence=swissfel, range=satsy03.mqua130$end, bety <90 ; @@ -170,15 +171,15 @@ plot,haxis=s,vaxis=re56,range=s20SY02$start/#e,colour=100; muATL := 0.053; ! Linac 1 Fodo lattice matching -satcb01.mqua230.k1 := 1.490961973; -satcb01.mqua430.k1 := -1.490511125; +satcb01.mqua230.k1 := 0.490961973; +satcb01.mqua430.k1 := -0.490511125; match,SEQUENCE=swissfel,range=satcb01$start/satcb01$end; Vary,name=SatCB01.MQUA230.k1,step=0.0001; Vary,name=SatCB01.MQUA430.k1,step=0.0001; -constraint,sequence=satcb01,range=#e,mux=muATL; -constraint,sequence=satcb01,range=#e,muy=muATL; +constraint,sequence=swissfel,range=satcb01$end,mux=muATL; +constraint,sequence=swissfel,range=satcb01$end,muy=muATL; lmdif,calls=100,tolerance=1e-21; endmatch; @@ -197,15 +198,15 @@ nalfy=table(twiss,satcb01$end,alfy); !--------------------------------------- ! match to reference point at satdi01-mqua250 -MATCH, SEQUENCE=swissfel,range=s20sy02$start/satcb01$start,beta0=twisssep; +MATCH, SEQUENCE=swissfel,range=s20sy02$start/satma01$start,beta0=twisssep; VARY,NAME=satdi01.mqua025.k1,STEP=0.0001,lower=-2.0,upper=2.0; VARY,NAME=satdi01.mqua080.k1,STEP=0.0001,lower=-2.0,upper=2.0; VARY,NAME=satdi01.mqua220.k1,STEP=0.0001,lower=-1.8,upper=1.8; VARY,NAME=satdi01.mqua230.k1,STEP=0.0001,lower=-1.8,upper=1.8; -CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua250$start,betx=35.76; -CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua250$start,alfx=-1.166; -CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua250$start,bety=24.087; -CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua250$start,alfy=0.648; +CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua250$start,betx = TwissAT1->BETX; +CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua250$start,alfx = TwissAT1->ALFX; +CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua250$start,bety = TwissAT1->BETY; +CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua250$start,alfy = TwissAT1->ALFY; LMDIF,CALLS=1000,TOLERANCE=1.e-21; ENDMATCH; @@ -214,12 +215,11 @@ ENDMATCH; !------------------------------------ ! match into SATCB01 -MATCH, SEQUENCE=swissfel,range=s20sy02$start/satcb01$end,beta0=twisssep; +MATCH, SEQUENCE=swissfel,range=s20sy02$start/satcl02$end,beta0=twisssep; VARY,NAME=satdi01.mqua250.k1,STEP=0.0001,lower=-1.8,upper=1.8; VARY,NAME=satdi01.mqua260.k1,STEP=0.0001,lower=-1.8,upper=1.8; VARY,NAME=satdi01.mqua280.k1,STEP=0.0001,lower=-1.8,upper=1.8; VARY,NAME=satdi01.mqua300.k1,STEP=0.0001,lower=-1.8,upper=1.8; - CONSTRAINT,SEQUENCE=swissfel,range=satcb01$start,betx=nbetx; CONSTRAINT,SEQUENCE=swissfel,range=satcb01$start,alfx=nalfx; CONSTRAINT,SEQUENCE=swissfel,range=satcb01$start,bety=nbety; @@ -229,7 +229,7 @@ ENDMATCH; twiss, SEQUENCE=swissFEL,range=s20sy02$start/satcl02$end,beta0=twisssep; -plot,haxis=s,vaxis=betx,bety,range=satdi01$start/satcl02$end,colour=100; +plot,haxis=s,vaxis=betx,bety,range=satdi01$start/#e,colour=100; @@ -238,7 +238,7 @@ plot,haxis=s,vaxis=betx,bety,range=satdi01$start/satcl02$end,colour=100; pol=-1; satun06.mqua080.k1 := -1.699673315*pol; satun07.mqua080.k1 := 1.746074065*pol; -muAT=0.15; +muAT=0.14; match,SEQUENCE=swissfel,range=satun06$start/satun07$end; Vary,name=satun06.mqua080.k1,step=0.0001; Vary,name=satun07.mqua080.k1,step=0.0001; @@ -254,9 +254,9 @@ satun10.mqua080.k1 := satun06.mqua080.k1; satun11.mqua080.k1 := satun07.mqua080.k1; satun12.mqua080.k1 := satun06.mqua080.k1; satun13.mqua080.k1 := satun07.mqua080.k1; -satun14.mqua080.k1 := satun06.mqua080.k1; +satun14.mqua420.k1 := satun06.mqua080.k1; satun15.mqua080.k1 := satun07.mqua080.k1; -satun16.mqua420.k1 := satun06.mqua080.k1; +satun16.mqua080.k1 := satun06.mqua080.k1; satun17.mqua080.k1 := satun07.mqua080.k1; satun18.mqua080.k1 := satun06.mqua080.k1; satun19.mqua080.k1 := satun07.mqua080.k1; @@ -274,17 +274,7 @@ ATalfy=table(twiss,satun07$end,alfy); -eebetx=8; -eealfx=0.5; -eebety=30; -eealfy=-0.5; -eebetx=7; -eealfx=0.5; -eebety=30; -eealfy=1.5; - -twissee: beta0,betx=eebetx,bety=eebety,alfx=eealfx,alfy=eealfy; MATCH, SEQUENCE=swissfel,range=satma01.mqua250$end/satun07$end,beta0=twissee; VARY,NAME=satma01.mqua610.k1,STEP=0.0001,lower=-2.0,upper=2.0; @@ -305,14 +295,7 @@ twiss,SEQUENCE=swissfel,range=satma01.mqua250$end/satun11$end,beta0=twissee; plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; - -scl=4; -satcb02.mqua230.k1=scl*0.2; -satcb02.mqua430.k1=-scl*0.2; -satcb03.mqua230.k1=scl*0.2; -satcb03.mqua430.k1=-scl*0.2; - - +satma01.mqua050.k1 = 1.; satma01.mqua120.k1=0; satma01.mqua140.k1=0; @@ -330,10 +313,10 @@ VARY,NAME=satma01.mqua160.k1,STEP=0.0001,lower=-3.8,upper=3.8; VARY,NAME=satma01.mqua180.k1,STEP=0.0001,lower=-3.8,upper=3.8; VARY,NAME=satma01.mqua230.k1,STEP=0.0001,lower=-3.0,upper=3.0; VARY,NAME=satma01.mqua250.k1,STEP=0.0001,lower=-3.0,upper=3.0; -CONSTRAINT,SEQUENCE=swissfel,range=satma01.mqua250$end,betx=eebetx; -CONSTRAINT,SEQUENCE=swissfel,range=satma01.mqua250$end,bety=eebety; -CONSTRAINT,SEQUENCE=swissfel,range=satma01.mqua250$end,alfx=eealfx; -CONSTRAINT,SEQUENCE=swissfel,range=satma01.mqua250$end,alfy=eealfy; +CONSTRAINT,SEQUENCE=swissfel,range=satma01.mqua250$end,betx=twissee->BETX; +CONSTRAINT,SEQUENCE=swissfel,range=satma01.mqua250$end,bety=twissee->BETY; +CONSTRAINT,SEQUENCE=swissfel,range=satma01.mqua250$end,alfx=twissee->ALFX; +CONSTRAINT,SEQUENCE=swissfel,range=satma01.mqua250$end,alfy=twissee->ALFY; CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua120$start, betx <70; CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua120$start, bety <70; CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua140$start, betx <70; @@ -346,7 +329,6 @@ LMDIF,CALLS=1000,TOLERANCE=1.e-21; ENDMATCH; - MATCH, SEQUENCE=swissfel,range=s20sy02$start/satbd01$end,beta0=twisssep; VARY,NAME=satun22.mqua080.k1,STEP=0.0001,lower=-5.0,upper=5.0; VARY,NAME=satma02.mqua010.k1,STEP=0.0001,lower=-5.0,upper=5.0; @@ -355,16 +337,18 @@ VARY,NAME=satma02.mqua040.k1,STEP=0.0001,lower=-5.0,upper=5.0; VARY,NAME=satma02.mqua050.k1,STEP=0.0001,lower=-5.0,upper=5.0; VARY,NAME=satma02.mqua070.k1,STEP=0.0001,lower=-5.0,upper=5.0; -CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,betx=50; -CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,bety=50; -CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,alfx=0; -CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,alfy=0; +CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,betx=twissAT2->BETX; +CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,bety=twissAT2->BETY; +CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,alfx=twissAT2->ALFX; +CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,alfy=twissAT2->ALFY; CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,x=0; CONSTRAINT,SEQUENCE=swissfel,range=satbd01.mqua010$start,px=0; LMDIF,CALLS=1000,TOLERANCE=1.e-21; ENDMATCH; +! fixed values, given by Eduard + SATBD01.MQUA010.K1= 5.069789237265826e-01; SATBD01.MQUA030.K1= -6.184665903305938e-01 ; SATBD01.MQUA050.K1= 1.324854421128419e-01 ; @@ -376,7 +360,7 @@ twiss,SEQUENCE=swissfel,range=s20sy02$start/satbd01$end,beta0=twisssep; plot,haxis=s,vaxis=betx,bety,range=satdi01$start/#e,colour=100; -twiss,SEQUENCE=swissfel,range=#s/satbd01$end,beta0=twiss0; +twiss,RMATRIX,SEQUENCE=swissfel,range=#s/satbd01$end,beta0=twiss0; plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100; diff --git a/Scripts/Reference-SwissFEL/matchInjector.madx b/Scripts/Reference-SwissFEL/matchInjector.madx index 844483c..4020768 100644 --- a/Scripts/Reference-SwissFEL/matchInjector.madx +++ b/Scripts/Reference-SwissFEL/matchInjector.madx @@ -25,12 +25,12 @@ ENDMATCH; sinsb04.mqua130.k1 :=0.7219189344; sinsb04.mqua230.k1 :=-0.71562666978; -muInj := 0.2; +muInj := 0.1; MATCH,SEQUENCE=swissfel,range=sinsb04$start/sinsb04$end; VARY,NAME=sinsb04.MQUA130.k1,STEP=0.0001,lower=-2.5,upper=2.5; VARY,NAME=sinsb04.MQUA230.k1,STEP=0.0001,lower=-2.5,upper=2.5; -CONSTRAINT,SEQUENCE=swissfel,range=#e,mux=muInj; -CONSTRAINT,SEQUENCE=swissfel,range=#e,muy=muInj; +CONSTRAINT,SEQUENCE=swissfel,range=sinsb04$end,mux=muInj; +CONSTRAINT,SEQUENCE=swissfel,range=sinsb04$end,muy=muInj; LMDIF,CALLS=100,TOLERANCE=1.e-21; ENDMATCH; @@ -42,7 +42,8 @@ nalfy=table(twiss,sinsb04$end,alfy); ! Matching from Laser heater into S-band linac - +sinsb03.mqua130.k1 = sinsb04.mqua130.k1; +sinsb03.mqua230.k1 = sinsb04.mqua230; MATCH,SEQUENCE=SwissFEL,range=#s/sinsb04$end,beta0 = Twiss0; VARY,NAME=sinlh02.MQUA410.k1,STEP=0.0001,lower=-3.5,upper=3.5; @@ -81,7 +82,7 @@ VARY,NAME=sinbc01.mqua110.k1,STEP=0.0001,lower=-3.5,upper=3.5; VARY,NAME=sindi01.mqua020.k1,STEP=0.0001,lower=-3.5,upper=3.5; VARY,NAME=sindi01.mqua070.k1,STEP=0.0001,lower=-3.5,upper=3.5; -CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc01.mqua110$end,betx<100; +CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc01.mqua110$end,betx<120; CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc02.mbnd400,bety<100; CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc02.mbnd400,betx<5.1; CONSTRAINT,SEQUENCE=SwissFEL,range=sindi02.mqua020$start,bety=TwissM2->BETY; @@ -110,10 +111,10 @@ s10cb02.mqua230.k1 := -1.490961973; s10cb02.mqua430.k1 := 1.490511125; MATCH,SEQUENCE=swissfel,range=s10cb02$start/s10cb02$end; -VARY,NAME=s10cb02.MQUA130.k1,STEP=0.0001,lower=-2.5,upper=2.5; VARY,NAME=s10cb02.MQUA230.k1,STEP=0.0001,lower=-2.5,upper=2.5; -CONSTRAINT,SEQUENCE=swissfel,range=#e,mux=muLin1; -CONSTRAINT,SEQUENCE=swissfel,range=#e,muy=muLin1; +VARY,NAME=s10cb02.MQUA430.k1,STEP=0.0001,lower=-2.5,upper=2.5; +CONSTRAINT,SEQUENCE=swissfel,range=s10cb02$end,mux=muLin1; +CONSTRAINT,SEQUENCE=swissfel,range=s10cb02$end,muy=muLin1; LMDIF,CALLS=100,TOLERANCE=1.e-21; ENDMATCH; @@ -146,7 +147,7 @@ S10CB09.MQUA230.k1 :=S10CB02.MQUA430.k1; !----------------------------------- ! match into Linac 1st - +sindi02.mqua020.k1=-1; MATCH,SEQUENCE=SwissFEL,range=#s/s10cb02$end,beta0=twiss0; VARY,NAME=sindi02.mqua020.k1,STEP=0.0001,lower=-5.5,upper=5.5; @@ -223,8 +224,8 @@ muLin2=0.2; match,SEQUENCE=swissfel,range=s20cb01$start/s20cb02$end; Vary,name=S20CB01.MQUA430.k1,step=0.0001; Vary,name=S20CB02.MQUA430.k1,step=0.0001; -constraint,sequence=linac2,range=#e,mux=muLin2; -constraint,sequence=linac2,range=#e,muy=muLin2; +constraint,sequence=swissfel,range=s20cb02$end,mux=muLin2; +constraint,sequence=swissfel,range=s20cb02$end,muy=muLin2; lmdif,calls=100,tolerance=1e-21; endmatch; diff --git a/issues.txt b/issues.txt index 452fe6d..12d86bd 100644 --- a/issues.txt +++ b/issues.txt @@ -1,11 +1,18 @@ -3) matching output on a log + 5) Load Reference -> initial matching condition 4) Save aver matching -> save initial twiss conditions 6) filter for current, planned and final phase for matching scripts 1) Check reference settings directory, depending on online and offline mode 2) switch between references +3) Allo filter to update quadrupoles to be part of the match scripts and not globally written in the code +#) include ecol in reference matching script +#) Give feedback on the matching results to GUI +#) allow for some progress indication of matching - +#) make matching more robust. +#) Fix matching point of linac 3 +#) Check for maximum gradient for matched values +3) Match for sextupoles! diff --git a/matchmaker.py b/matchmaker.py index b1679b8..49e886d 100644 --- a/matchmaker.py +++ b/matchmaker.py @@ -1,14 +1,19 @@ import os import re from onlinemodel.madx import CMadX +import io +import contextlib +from io import StringIO +import sys class MatchMaker: - def __init__(self): + def __init__(self,signal = None): self.matchlist={'Reference-SwissFEL':'Scripts/Reference-SwissFEL','SwissFEL+':'Scripts/SFPlus'} self.referencePoints={} self.variables={} self.scriptdir = None + self.signal=signal def initScripts(self,target): self.scriptdir = self.matchlist[target] @@ -31,9 +36,13 @@ class MatchMaker: if 'location:' in line: tags = line.split('location:') location = tags[1].strip() + if 'label:' in tags[0]: + label = tags[0].split('label:')[1].strip() + else: + label=None fields_all = tags[0].split(',') fields = [fld.split(';')[0].strip() for fld in fields_all if "=" in fld] - self.referencePoints[location] = {twiss.split('=')[0].strip().lower():float(twiss.split('=')[1].strip()) for twiss in fields} + self.referencePoints[location] = {'Twiss':{twiss.split('=')[0].strip().lower():float(twiss.split('=')[1].strip()) for twiss in fields},'Label':label} if 'Description:' in line: tags = line.split('Description:') description = tags[1].strip() @@ -51,7 +60,9 @@ class MatchMaker: target = 'SATBD01' else: target = 'SARUN20' - madx = CMadX() + + f = io.StringIO() + madx = CMadX(f) madx.E0 = 2000 om.setBranch(target, 'SINLH01') madx.updateLattice(om, target) # write lattice @@ -60,12 +71,23 @@ class MatchMaker: if not variables is None: madx.definePresets(variables) if Injector: + if self.signal: + self.signal.emit('Matching Injector ...') madx.madx.call(self.scriptdir+'/matchInjector.madx', chdir=True) self.updateOnlineModel(om,madx.madx, 's[i1].*k1|s20sy01.*k1') + self.parseMatchOutput(f.getvalue().split('\n'),'Injector') + if Athos: + f.flush() + if self.signal: + self.signal.emit('Matching Athos ...') madx.madx.call(self.scriptdir+'/matchAthos.madx', chdir=True) self.updateOnlineModel(om, madx.madx, 'sat.*k1|s20sy02.*m[kq]') + self.parseMatchOutput(f.getvalue().split('\n'), 'Athos') if Aramis: + f.flush() + if self.signal: + self.signal.emit('Matching Aramis ...') if target=='SATBD01': target = 'SARUN20' om.setBranch(target, 'SINLH01') @@ -73,9 +95,41 @@ class MatchMaker: madx.commonHeader('SwissFEL', '#s/#e', None) # sets header madx.madx.call(self.scriptdir + '/initTwiss.madx') madx.madx.call(self.scriptdir + '/matchAramis.madx', chdir=True) - self.updateOnlineModel(om, madx.madx, 's[3a][0r].*k1|s20[bm][ca].*k1') + self.updateOnlineModel(om, madx.madx, 's[3a][0r].*k1|s20sy03.*k1') + self.parseMatchOutput(f.getvalue().split('\n'), 'Aramis') + if self.signal: + self.signal.emit('Matching done') return madx.madx.table.twiss + def parseMatchOutput(self, result,prefix,full=False): + + isMatch = False + penalty = 1 + report=[] + for line in result: + if full: + print(line) + continue + if 'MATCH SUMMARY' in line: + isMatch = True + continue + if 'VARIABLE "TAR"' in line: + isMatch = False + print("--------------------------------------") + print('MATCHING RESULTS: %s (error: %e)' % (prefix,penalty)) + if penalty > 1e-5: + for rep in report: + print(rep) + penalty = 1 + report.clear() + continue + if isMatch and len(line) > 4: + if 'Final Penal' in line: + penalty = float(line.split('=')[1].strip()) + else: + report.append(line) + + def updateOnlineModel(self,om,madx,filter): reg = re.compile(filter) for var in list(madx.globals): diff --git a/reference.py b/reference.py index aba8fab..fca1765 100644 --- a/reference.py +++ b/reference.py @@ -31,8 +31,12 @@ class ReferenceManager: if i is 0: tag = 'Start' else: - tag = 'Matchpoint %d' % i - self.reference[tag]= {'Location':key,'Twiss':matchmaker.referencePoints[key]} + label = matchmaker.referencePoints[key]['Label'] + if label is None: + tag = 'Matchpoint %d' % i + else: + tag = label + self.reference[tag]= {'Location':key,'Twiss':matchmaker.referencePoints[key]['Twiss']} self.updateReferenceComboBox() def swithToUserDefinedLocation(self):