Indication of magnet strengths and matching results in GUI

This commit is contained in:
2026-01-20 15:12:12 +01:00
parent 906890da98
commit 60b9643568
9 changed files with 192 additions and 38 deletions
+13 -1
View File
@@ -91,6 +91,7 @@ class OpticsTools(QtWidgets.QMainWindow, QtCore.QObject, Ui_OpticsGUI):
else: else:
vars = None vars = None
twiss = self.match.match(self.model.om, variables = vars, Injector = injector,Athos = athos, Aramis = aramis, Porthos = porthos) twiss = self.match.match(self.model.om, variables = vars, Injector = injector,Athos = athos, Aramis = aramis, Porthos = porthos)
self.updateMatchResult(self.match.matchresult)
energy = self.model.calcEnergyProfile(twiss) energy = self.model.calcEnergyProfile(twiss)
#enfore the writing of a new lattice so that the magnet settings are in the new lattice #enfore the writing of a new lattice so that the magnet settings are in the new lattice
self.model.forceLat = True self.model.forceLat = True
@@ -100,7 +101,18 @@ class OpticsTools(QtWidgets.QMainWindow, QtCore.QObject, Ui_OpticsGUI):
self.saveSettingsdirect(fileName) self.saveSettingsdirect(fileName)
def updateMatchResult(self,result):
self.UIReportMatchResult.clear()
for ele in result:
label = '%s (%6.2e)' % (ele['Location'],ele['Error'])
listitem = QtWidgets.QListWidgetItem(label)
color = QtGui.QColor(100, 255, 100) # white
if ele['Error'] > 1e-5:
color = QtGui.QColor(255, 255, 100)
if ele['Error'] > 1:
color = QtGui.QColor(255, 100, 100)
listitem.setBackground(color)
self.UIReportMatchResult.addItem(listitem)
def updateMatchingCase(self): def updateMatchingCase(self):
""" """
+15 -3
View File
@@ -10,7 +10,7 @@ S20SY02.MKDC050.cory:= SYKICK*2;
s20bc01.mqua010.k1:=1.; s20bc01.mqua010.k1:=1.;
Print,text='MATCH POINT: BC2 in Linac 2';
MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s20bc02$end,beta0=twisssep; MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s20bc02$end,beta0=twisssep;
VARY,NAME=s20bc01.mqua010.k1,STEP=0.0001; VARY,NAME=s20bc01.mqua010.k1,STEP=0.0001;
VARY,NAME=s20bc01.mqua030.k1,STEP=0.0001; VARY,NAME=s20bc01.mqua030.k1,STEP=0.0001;
@@ -32,6 +32,7 @@ pol = 1;
s20cb01.mqua430.k1=0.5*pol; s20cb01.mqua430.k1=0.5*pol;
s20cb02.mqua430.k1=-0.5*pol; s20cb02.mqua430.k1=-0.5*pol;
Print,text='MATCH POINT: FODO - Linac 2';
match,SEQUENCE=swissfel,range=S20cb01$start/s20cb02$end; match,SEQUENCE=swissfel,range=S20cb01$start/s20cb02$end;
Vary,name=S20CB01.MQUA430.k1,step=0.0001; Vary,name=S20CB01.MQUA430.k1,step=0.0001;
Vary,name=S20CB02.MQUA430.k1,step=0.0001; Vary,name=S20CB02.MQUA430.k1,step=0.0001;
@@ -70,6 +71,7 @@ s30cb14.mqua430.k1 = s20cb02.mqua430.k1;
Print,text='MATCH POINT: Match into Linac 2';
MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s20cb04$end,beta0=twisssep; MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s20cb04$end,beta0=twisssep;
VARY,NAME=s20ma01.mqua010.k1,STEP=0.0001; VARY,NAME=s20ma01.mqua010.k1,STEP=0.0001;
VARY,NAME=s20ma01.mqua020.k1,STEP=0.0001; VARY,NAME=s20ma01.mqua020.k1,STEP=0.0001;
@@ -86,6 +88,8 @@ twiss,SEQUENCE=swissfel,range=s20sy02$start/S20cb04$end,beta0=twisssep;
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
Print,text='MATCH POINT: Corrected Matching into Linac 3';
MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s30cb07$end,beta0=twisssep; MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s30cb07$end,beta0=twisssep;
VARY,NAME=s30cb01.mqua430.k1,STEP=0.0001; VARY,NAME=s30cb01.mqua430.k1,STEP=0.0001;
VARY,NAME=s30cb02.mqua430.k1,STEP=0.0001; VARY,NAME=s30cb02.mqua430.k1,STEP=0.0001;
@@ -119,6 +123,7 @@ pqf:=1;
S30cb15.mqua100.k1 := -0.2*pqf; S30cb15.mqua100.k1 := -0.2*pqf;
S30cb15.mqua200.k1 := -pqf; S30cb15.mqua200.k1 := -pqf;
Print,text='MATCH POINT: Kicker Strength for Porthos Septum';
MATCH,SEQUENCE=Swissfel,range=S30CB15$START/s30cb15$END,BETA0 = TWISSsep; MATCH,SEQUENCE=Swissfel,range=S30CB15$START/s30cb15$END,BETA0 = TWISSsep;
VARY, NAME=PSYKICK, STEP=0.00001; VARY, NAME=PSYKICK, STEP=0.00001;
VARY, NAME=PQF, STEP=0.00001; VARY, NAME=PQF, STEP=0.00001;
@@ -134,6 +139,8 @@ s30cb15.mqua010.k1 = 1.1533;
s30cb15.mqua020.k1 = -0.0961; s30cb15.mqua020.k1 = -0.0961;
Print,text='MATCH POINT: Match into Porthos Septum';
MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s30sy01$end,beta0=twisssep; MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s30sy01$end,beta0=twisssep;
VARY,NAME=s30cb13.mqua430.k1,STEP=0.0001; VARY,NAME=s30cb13.mqua430.k1,STEP=0.0001;
VARY,NAME=s30cb14.mqua430.k1,STEP=0.0001; VARY,NAME=s30cb14.mqua430.k1,STEP=0.0001;
@@ -171,6 +178,7 @@ if (ECOLasBC ==0.) {
sarcl02.mqua130.k1=1.8; sarcl02.mqua130.k1=1.8;
R56 = -000e-6; R56 = -000e-6;
Print,text='MATCH POINT: Isochronous Setup of Energy Collimator';
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; VARY,NAME=sarcl02.mqua130.k1,STEP=0.0001;
CONSTRAINT,SEQUENCE=swissfel,range=sarcl02.mqua210,re56=R56*0.5; CONSTRAINT,SEQUENCE=swissfel,range=sarcl02.mqua210,re56=R56*0.5;
@@ -180,6 +188,7 @@ if (ECOLasBC ==0.) {
sarcl02.mqua210.k1=-sarcl02.mqua130.k1*0.9; sarcl02.mqua210.k1=-sarcl02.mqua130.k1*0.9;
sarcl02.mqua250.k1= sarcl02.mqua130.k1; sarcl02.mqua250.k1= sarcl02.mqua130.k1;
Print,text='MATCH POINT: Dispersion Symmetry Point of Energy Collimator';
MATCH,SEQUENCE=swissfel,range=SARCL02$START/SARCL02$END,betx=10,alfx=0,bety=10,alfy=0; MATCH,SEQUENCE=swissfel,range=SARCL02$START/SARCL02$END,betx=10,alfx=0,bety=10,alfy=0;
VARY,NAME=sarcl02.mqua250.k1,STEP=0.0001; VARY,NAME=sarcl02.mqua250.k1,STEP=0.0001;
CONSTRAINT,SEQUENCE=swissfel,range=sarcl02.dbpm260$end,dpx=0; CONSTRAINT,SEQUENCE=swissfel,range=sarcl02.dbpm260$end,dpx=0;
@@ -210,7 +219,7 @@ if (ECOLasBC ==0.) {
sarcl02.msex255.k2:=110; sarcl02.msex255.k2:=110;
sarcl02.msex305.k2:=110; sarcl02.msex305.k2:=110;
Print,text='MATCH POINT: Sextupoles in Energy Collimator';
MATCH,chrom,SEQUENCE=sarcl02,range=#s/#e,betx=nbetx,alfx=nalfx,bety=nbety,alfy=nalfy; MATCH,chrom,SEQUENCE=sarcl02,range=#s/#e,betx=nbetx,alfx=nalfx,bety=nbety,alfy=nalfy;
VARY,NAME=ecol_k2,STEP=0.0001; VARY,NAME=ecol_k2,STEP=0.0001;
CONSTRAINT,SEQUENCE=Sarcl02,range=#e,ddx=0; CONSTRAINT,SEQUENCE=Sarcl02,range=#e,ddx=0;
@@ -259,6 +268,7 @@ sarcl01.mqua190.k1 := -1.475278354;
use,sequence=swissfel; use,sequence=swissfel;
Print,text='MATCH POINT: Match into Energy Collimator';
MATCH,SEQUENCE=swissfel,range=s20SY02$start/sarma02$start,beta0=twisssep; MATCH,SEQUENCE=swissfel,range=s20SY02$start/sarma02$start,beta0=twisssep;
VARY,NAME=sarcl01.mqua020.k1,STEP=0.0001,lower=-1., upper =1.; VARY,NAME=sarcl01.mqua020.k1,STEP=0.0001,lower=-1., upper =1.;
VARY,NAME=sarcl01.mqua050.k1,STEP=0.0001; VARY,NAME=sarcl01.mqua050.k1,STEP=0.0001;
@@ -295,6 +305,7 @@ plot,haxis=s,vaxis=betx,bety,range=S30CB15$START/SARCL02$END,colour=100;
!----------------- !-----------------
muAR=0.16; muAR=0.16;
Print,text='MATCH POINT: FODO - Aramis Undulator';
match,SEQUENCE=swissfel,range=sarun02$start/sarun03$end; match,SEQUENCE=swissfel,range=sarun02$start/sarun03$end;
Vary,name=sarun02.mqua080.k1,step=0.0001; Vary,name=sarun02.mqua080.k1,step=0.0001;
Vary,name=sarun03.mqua080.k1,step=0.0001; Vary,name=sarun03.mqua080.k1,step=0.0001;
@@ -338,6 +349,7 @@ sarma01.mqua080.k1 := -1.1356922498;
sarma01.mqua120.k1 := 0.4142170392; sarma01.mqua120.k1 := 0.4142170392;
sarma01.mqua140.k1 := -0.4428419456; sarma01.mqua140.k1 := -0.4428419456;
Print,text='MATCH POINT: Match into Aramis Undulator';
MATCH,SEQUENCE=swissfel,range=S30SY01$start/sarun02$start,beta0=twisspor; MATCH,SEQUENCE=swissfel,range=S30SY01$start/sarun02$start,beta0=twisspor;
VARY,NAME=sarma01.mqua010.k1,STEP=0.0001; VARY,NAME=sarma01.mqua010.k1,STEP=0.0001;
VARY,NAME=sarma01.mqua060.k1,STEP=0.0001; VARY,NAME=sarma01.mqua060.k1,STEP=0.0001;
@@ -369,7 +381,7 @@ twiss,SEQUENCE=swissfel,range=#s/sarbd02.dscr050$end,beta0=twiss0;
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; 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=dx,dy,range=#s/#e,colour=100;
exit;
+20 -4
View File
@@ -17,6 +17,9 @@ use,sequence=swissfel;
select,flag=Error,pattern="SAT.*"; select,flag=Error,pattern="SAT.*";
ealign,DY=0.01; ealign,DY=0.01;
Print,text='MATCH POINT: Kicker Strength of Septum';
MATCH,SEQUENCE=swissfel,range=s20sy02$start/s20sy02$end,beta0=Twisssep; 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.mqua070.k1,STEP=0.0001,lower=-3,upper=3;
VARY,NAME=s20sy02.mqua100.k1,STEP=0.0001,lower=-3,upper=3; VARY,NAME=s20sy02.mqua100.k1,STEP=0.0001,lower=-3,upper=3;
@@ -49,7 +52,7 @@ plot,haxis=s,vaxis=y,dy,range=#s/#e,colour=100;
satsy01.mqua110.k1=-0.7; satsy01.mqua110.k1=-0.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$end,beta0=twisssep;
VARY,NAME=satsy01.mqua020.k1,STEP=0.0001; VARY,NAME=satsy01.mqua020.k1,STEP=0.0001;
VARY,NAME=satsy01.mqua050.k1,STEP=0.0001; VARY,NAME=satsy01.mqua050.k1,STEP=0.0001;
@@ -73,7 +76,7 @@ plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100;
Print,text='MATCH POINT: Closed Dispersion in SATSY03';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep; MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep;
VARY,NAME=satsy03.mqua120.k1,STEP=0.0001; VARY,NAME=satsy03.mqua120.k1,STEP=0.0001;
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy03.mbnd200,DX=0.0; CONSTRAINT,SEQUENCE=SwissFEL,range= satsy03.mbnd200,DX=0.0;
@@ -85,6 +88,7 @@ satsy02.mqua230.k1=0;
satsy02.mqua240.k1=0; satsy02.mqua240.k1=0;
satsy02.mqua260.k1=0; satsy02.mqua260.k1=0;
Print,text='MATCH POINT: Switchyard Drift';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep; MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep;
VARY,NAME=satsy02.mqua210.k1,STEP=0.0001; VARY,NAME=satsy02.mqua210.k1,STEP=0.0001;
VARY,NAME=satsy02.mqua230.k1,STEP=0.0001; VARY,NAME=satsy02.mqua230.k1,STEP=0.0001;
@@ -98,6 +102,7 @@ LMDIF,CALLS=1000,TOLERANCE=1.e-21;
ENDMATCH; ENDMATCH;
Print,text='MATCH POINT: Match into SATSY03';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep; MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep;
VARY,NAME=satsy02.mqua300.k1,STEP=0.0001; VARY,NAME=satsy02.mqua300.k1,STEP=0.0001;
VARY,NAME=satsy02.mqua310.k1,STEP=0.0001; VARY,NAME=satsy02.mqua310.k1,STEP=0.0001;
@@ -119,6 +124,7 @@ plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100;
Print,text='MATCH POINT: BC2 in Switchyard';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satbc01$end,beta0=twisssep; MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satbc01$end,beta0=twisssep;
VARY,NAME=satsy03.mqua220.k1,STEP=0.0001; VARY,NAME=satsy03.mqua220.k1,STEP=0.0001;
VARY,NAME=satsy03.mqua310.k1,STEP=0.0001; VARY,NAME=satsy03.mqua310.k1,STEP=0.0001;
@@ -137,6 +143,7 @@ satcl01.mqua180.k1 := CL2.k1;
satcl01.mqua190.k1 := CL1.k1; 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/satcl01$end,betx=3,alfx=0,bety=50,alfy=5;
VARY,NAME=cl1.k1,STEP=0.0001; VARY,NAME=cl1.k1,STEP=0.0001;
VARY,NAME=cl2.k1,STEP=0.0001; VARY,NAME=cl2.k1,STEP=0.0001;
@@ -148,7 +155,7 @@ LMDIF,CALLS=1000,TOLERANCE=1.e-21;
ENDMATCH; ENDMATCH;
Print,text='MATCH POINT: Match into SATCL01';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satcl01$end,beta0=twisssep; MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satcl01$end,beta0=twisssep;
VARY,NAME=satbc01.mqua410.k1,STEP=0.0001; VARY,NAME=satbc01.mqua410.k1,STEP=0.0001;
VARY,NAME=satbc01.mqua430.k1,STEP=0.0001; VARY,NAME=satbc01.mqua430.k1,STEP=0.0001;
@@ -162,6 +169,10 @@ CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01.msex160, bety < 5;
LMDIF,CALLS=1000,TOLERANCE=1.e-21; LMDIF,CALLS=1000,TOLERANCE=1.e-21;
ENDMATCH; ENDMATCH;
Print,text='MATCH POINT: Minimizing Beam Size in HERO Modulator';
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satdi01$end,beta0=twisssep; MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satdi01$end,beta0=twisssep;
VARY,NAME=satdi01.mqua025.k1,STEP=0.0001; VARY,NAME=satdi01.mqua025.k1,STEP=0.0001;
CONSTRAINT,SEQUENCE=SwissFEL,range= satdi01.dscr065$start, betx<19; CONSTRAINT,SEQUENCE=SwissFEL,range= satdi01.dscr065$start, betx<19;
@@ -191,6 +202,7 @@ L = 20.;
alpha=0.7; alpha=0.7;
beta=L*alpha; beta=L*alpha;
Print,text='MATCH POINT: Match through Athos C-Band Linac';
MATCH, SEQUENCE=SwissFEL,range=s20sy02$start/satcb01$end,beta0=twisssep; MATCH, SEQUENCE=SwissFEL,range=s20sy02$start/satcb01$end,beta0=twisssep;
VARY,NAME=satdi01.mqua080.k1,STEP=0.0001,lower=-1.8,upper=1.8; VARY,NAME=satdi01.mqua080.k1,STEP=0.0001,lower=-1.8,upper=1.8;
@@ -220,6 +232,8 @@ pol=-1;
satun06.mqua080.k1 := -1.699673315*pol; satun06.mqua080.k1 := -1.699673315*pol;
satun07.mqua080.k1 := 1.746074065*pol; satun07.mqua080.k1 := 1.746074065*pol;
muAT=0.15; muAT=0.15;
Print,text='MATCH POINT: FODO - Athos Undulator';
match,SEQUENCE=swissfel,range=satun06$start/satun07$end; match,SEQUENCE=swissfel,range=satun06$start/satun07$end;
Vary,name=satun06.mqua080.k1,step=0.0001; Vary,name=satun06.mqua080.k1,step=0.0001;
Vary,name=satun07.mqua080.k1,step=0.0001; Vary,name=satun07.mqua080.k1,step=0.0001;
@@ -271,6 +285,7 @@ eealfy=1.5;
twissee: beta0,betx=eebetx,bety=eebety,alfx=eealfx,alfy=eealfy; twissee: beta0,betx=eebetx,bety=eebety,alfx=eealfx,alfy=eealfy;
Print,text='MATCH POINT: Match into Athos Undulator';
MATCH, SEQUENCE=swissfel,range=satma01.mqua250$end/satun07$end,beta0=twissee; 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; VARY,NAME=satma01.mqua610.k1,STEP=0.0001,lower=-2.0,upper=2.0;
VARY,NAME=satma01.mqua630.k1,STEP=0.0001,lower=-2.0,upper=2.0; VARY,NAME=satma01.mqua630.k1,STEP=0.0001,lower=-2.0,upper=2.0;
@@ -298,7 +313,7 @@ satcb03.mqua230.k1=scl*0.2;
satcb03.mqua430.k1=-scl*0.2; satcb03.mqua430.k1=-scl*0.2;
Print,text='MATCH POINT: Match through EEHG Section';
MATCH, SEQUENCE=swissfel,range=s20sy02$start/satma01$end,beta0=twisssep; MATCH, SEQUENCE=swissfel,range=s20sy02$start/satma01$end,beta0=twisssep;
VARY,NAME=satcb03.mqua430.k1,STEP=0.0001,lower=-3.8,upper=3.8; VARY,NAME=satcb03.mqua430.k1,STEP=0.0001,lower=-3.8,upper=3.8;
VARY,NAME=satma01.mqua120.k1,STEP=0.0001,lower=-3.8,upper=3.8; VARY,NAME=satma01.mqua120.k1,STEP=0.0001,lower=-3.8,upper=3.8;
@@ -329,3 +344,4 @@ plot,haxis=s,vaxis=betx,bety,range=satdi01$start/#e,colour=100;
twiss,SEQUENCE=swissfel,range=#s/satun26$end,beta0=twiss0; twiss,SEQUENCE=swissfel,range=#s/satun26$end,beta0=twiss0;
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; 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=dx,dy,range=#s/#e,colour=100;
+6 -4
View File
@@ -8,7 +8,7 @@ alpha = 1;
beta = alpha*L; beta = alpha*L;
Print,text='MATCH POINT: Laser Heater';
MATCH,SEQUENCE=SwissFEL,range=#s/sinbc02$start,beta0 = Twiss0; MATCH,SEQUENCE=SwissFEL,range=#s/sinbc02$start,beta0 = Twiss0;
VARY,NAME=sinlh01.MQUA020.k1,STEP=0.0001; VARY,NAME=sinlh01.MQUA020.k1,STEP=0.0001;
VARY,NAME=sinlh01.MQUA040.k1,STEP=0.0001; VARY,NAME=sinlh01.MQUA040.k1,STEP=0.0001;
@@ -35,6 +35,7 @@ ENDMATCH;
twiss,SEQUENCE=swissfel,range=#s/sinbc01$end,beta0 = Twiss0; twiss,SEQUENCE=swissfel,range=#s/sinbc01$end,beta0 = Twiss0;
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
Print,text='MATCH POINT: BC 1';
MATCH,SEQUENCE=SwissFEL,range=#s/sinma01$start,beta0 = Twiss0; MATCH,SEQUENCE=SwissFEL,range=#s/sinma01$start,beta0 = Twiss0;
VARY,NAME=sinbc01.MQUA020.k1,STEP=0.0001; VARY,NAME=sinbc01.MQUA020.k1,STEP=0.0001;
VARY,NAME=sinbc01.MQUA050.k1,STEP=0.0001; VARY,NAME=sinbc01.MQUA050.k1,STEP=0.0001;
@@ -54,6 +55,7 @@ plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
sinma01.mqua020.k1=-0.1; sinma01.mqua020.k1=-0.1;
Print,text='MATCH POINT: Injector-TDS';
MATCH,SEQUENCE=SwissFEL,range=#s/sindi02$end,beta0 = Twiss0; MATCH,SEQUENCE=SwissFEL,range=#s/sindi02$end,beta0 = Twiss0;
VARY,NAME=sinma01.MQUA020.k1,STEP=0.0001; VARY,NAME=sinma01.MQUA020.k1,STEP=0.0001;
VARY,NAME=sinma01.MQUA030.k1,STEP=0.0001; VARY,NAME=sinma01.MQUA030.k1,STEP=0.0001;
@@ -83,7 +85,7 @@ s10cb02.mqua230.k1=0.2;
s10cb02.mqua430.k1=-0.2; s10cb02.mqua430.k1=-0.2;
muLin1=0.2; muLin1=0.2;
Print,text='MATCH POINT: FODO - Linac 1';
match,SEQUENCE=swissfel,range=S10cb02$start/s10cb02$end; match,SEQUENCE=swissfel,range=S10cb02$start/s10cb02$end;
Vary,name=S10CB02.MQUA230.k1,step=0.0001; Vary,name=S10CB02.MQUA230.k1,step=0.0001;
Vary,name=S10CB02.MQUA430.k1,step=0.0001; Vary,name=S10CB02.MQUA430.k1,step=0.0001;
@@ -103,7 +105,7 @@ nbety=table(twiss,s10cb02$end,bety);
nalfy=table(twiss,s10cb02$end,alfy); nalfy=table(twiss,s10cb02$end,alfy);
plot,haxis=s,vaxis=betx,bety,colour=100; plot,haxis=s,vaxis=betx,bety,colour=100;
Print,text='MATCH POINT: Match into Linac 1';
MATCH,SEQUENCE=SwissFEL,range=#s/s10cb02$end,beta0 = Twiss0; MATCH,SEQUENCE=SwissFEL,range=#s/s10cb02$end,beta0 = Twiss0;
VARY,NAME=sindi02.mqua020.k1,STEP=0.0001,lower=-5.5,upper=5.5; VARY,NAME=sindi02.mqua020.k1,STEP=0.0001,lower=-5.5,upper=5.5;
VARY,NAME=sindi02.mqua030.k1,STEP=0.0001,lower=-5.5,upper=5.5; VARY,NAME=sindi02.mqua030.k1,STEP=0.0001,lower=-5.5,upper=5.5;
@@ -151,7 +153,7 @@ twiss,SEQUENCE=swissfel,range=#s/s10cb10$end,beta0 = Twiss0;
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
Print,text='MATCH POINT: Match into Athos Septum';
MATCH,SEQUENCE=SwissFEL,range=#s/s20sy02$start,beta0 = Twiss0; MATCH,SEQUENCE=SwissFEL,range=#s/s20sy02$start,beta0 = Twiss0;
VARY,NAME=s20sy01.mqua010.k1,STEP=0.0001,lower=-5.5,upper=5.5; VARY,NAME=s20sy01.mqua010.k1,STEP=0.0001,lower=-5.5,upper=5.5;
VARY,NAME=s20sy01.mqua060.k1,STEP=0.0001,lower=-5.5,upper=5.5; VARY,NAME=s20sy01.mqua060.k1,STEP=0.0001,lower=-5.5,upper=5.5;
+3 -3
View File
@@ -9,10 +9,10 @@
3) Allo filter to update quadrupoles to be part of the match scripts and not globally written in the code 3) Allo filter to update quadrupoles to be part of the match scripts and not globally written in the code
#) Give feedback on the matching results to GUI
#) allow for some progress indication of matching #) allow for some progress indication of matching
#) Check for maximum gradient for matched values
3) Match for sextupoles! 3) Match for sextupoles!
#) check why program crashes when matching all 3 beamlines
+30 -16
View File
@@ -2,10 +2,10 @@ import os
import re import re
from onlinemodel.madx import CMadX from onlinemodel.madx import CMadX
import io import io
import contextlib
from io import StringIO import copy
import sys
class MatchMaker: class MatchMaker:
def __init__(self,signal = None): def __init__(self,signal = None):
@@ -14,6 +14,7 @@ class MatchMaker:
self.variables={} self.variables={}
self.scriptdir = None self.scriptdir = None
self.signal=signal self.signal=signal
self.matchresult=[]
def initScripts(self,target): def initScripts(self,target):
self.scriptdir = self.matchlist[target] self.scriptdir = self.matchlist[target]
@@ -56,6 +57,9 @@ class MatchMaker:
def match(self, om, variables = None, Injector=True, Athos = True, Aramis = False, Porthos = False): def match(self, om, variables = None, Injector=True, Athos = True, Aramis = False, Porthos = False):
self.matchresult.clear()
cwd = os.getcwd()
os.chdir(self.scriptdir)
if Athos: if Athos:
target = 'SATBD02' target = 'SATBD02'
else: else:
@@ -67,58 +71,68 @@ class MatchMaker:
om.setBranch(target, 'SINLH01') om.setBranch(target, 'SINLH01')
madx.updateLattice(om, target) # write lattice madx.updateLattice(om, target) # write lattice
madx.commonHeader('SwissFEL', '#s/#e', None) # sets header madx.commonHeader('SwissFEL', '#s/#e', None) # sets header
madx.madx.call(self.scriptdir + '/initTwiss.madx') madx.madx.call('initTwiss.madx')
if not variables is None: if not variables is None:
madx.definePresets(variables) madx.definePresets(variables)
if Injector: if Injector:
print('Matching Injector ...') print('Matching Injector ...')
madx.madx.call(self.scriptdir+'/matchInjector.madx', chdir=True) madx.madx.call('matchInjector.madx')
self.updateOnlineModel(om,madx.madx, 's[i1].*k[12]|s20cb.*k1|s20sy01.*k1') self.updateOnlineModel(om,madx.madx, 's[i1].*k[12]|s20cb.*k1|s20sy01.*k1')
self.parseMatchOutput(f.getvalue().split('\n'),'Injector') self.parseMatchOutput(f.getvalue().split('\n'),'Injector')
if Athos: if Athos:
f.truncate(0) f.truncate(0)
print('Matching Athos ...') print('Matching Athos ...')
if self.signal: madx.madx.call('matchAthos.madx')
self.signal.emit('Matching Athos ...')
madx.madx.call(self.scriptdir+'/matchAthos.madx', chdir=True)
self.updateOnlineModel(om, madx.madx, 'sat.*mqua.*k1|sat.*msex.*k2|s20sy02.*m[kq]') self.updateOnlineModel(om, madx.madx, 'sat.*mqua.*k1|sat.*msex.*k2|s20sy02.*m[kq]')
self.parseMatchOutput(f.getvalue().split('\n'), 'Athos') self.parseMatchOutput(f.getvalue().split('\n'), 'Athos')
if Aramis: if Aramis:
f.truncate(0) f.truncate(0)
print('Matching Aramis ...') print('Matching Aramis ...')
if target=='SATBD01': if target=='SATBD02':
target = 'SARUN20' target = 'SARUN20'
om.setBranch(target, 'SINLH01') om.setBranch(target, 'SINLH01')
madx.updateLattice(om, target) # write lattice madx.updateLattice(om, target) # write lattice
madx.commonHeader('SwissFEL', '#s/#e', None) # sets header madx.commonHeader('SwissFEL', '#s/#e', None) # sets header
madx.madx.call(self.scriptdir + '/initTwiss.madx') madx.madx.call('initTwiss.madx')
madx.madx.call(self.scriptdir + '/matchAramis.madx', chdir=True) madx.madx.call('matchAramis.madx')
self.updateOnlineModel(om, madx.madx, 's[3a][0r].*k[12]|s20sy03.*k1') self.updateOnlineModel(om, madx.madx, 's[3a][0r].*k[12]|s20sy03.*k1')
self.parseMatchOutput(f.getvalue().split('\n'), 'Aramis') self.parseMatchOutput(f.getvalue().split('\n'), 'Aramis')
if self.signal: os.chdir(cwd)
self.signal.emit('Matching done')
return madx.madx.table.twiss return madx.madx.table.twiss
def parseMatchOutput(self, result,prefix,full=False): def parseMatchOutput(self, result,prefix,full=False):
loc = None
locidx = 1
isMatch = False isMatch = False
penalty = 1 penalty = 1
report=[] report=[]
for line in result: for line in result:
if full: if full:
print(line) print(line)
if 'MATCH POINT' in line:
isMatch = False
print("--------------------------------------")
print(line)
loc = line.split(':')[1].strip()
continue continue
if 'MATCH SUMMARY' in line: if 'MATCH SUMMARY' in line.upper():
isMatch = True isMatch = True
continue continue
if 'VARIABLE "TAR"' in line: if 'VARIABLE "TAR"' in line:
isMatch = False isMatch = False
print("--------------------------------------")
print('MATCHING RESULTS: %s (error: %e)' % (prefix,penalty)) print('MATCHING RESULTS: %s (error: %e)' % (prefix,penalty))
if loc is None:
loc = 'Matchpoint %d' % locidx
locidx +=1
self.matchresult.append({'Location':loc,'Error':penalty})
if penalty > 1e-5: if penalty > 1e-5:
for rep in report: for rep in report:
print(rep) print(rep)
penalty = 1 penalty = 1
loc = None
report.clear() report.clear()
continue continue
if isMatch and len(line) > 4: if isMatch and len(line) > 4:
@@ -126,7 +140,7 @@ class MatchMaker:
penalty = float(line.split('=')[1].strip()) penalty = float(line.split('=')[1].strip())
else: else:
report.append(line) report.append(line)
return
def updateOnlineModel(self,om,madx,filter): def updateOnlineModel(self,om,madx,filter):
reg = re.compile(filter) reg = re.compile(filter)
+13 -2
View File
@@ -2,9 +2,10 @@ import json
import copy import copy
import numpy as np import numpy as np
from PyQt5 import QtWidgets,QtGui
from onlinemodel.core import Facility from onlinemodel.core import Facility
from onlinemodel.madx import CMadX from onlinemodel.madx import CMadX
#from sipbuild.generator.outputs.formatters import variable
converttwiss= {'betx':'betx','bety':'bety','alfx':'alfx','alfy':'alfy', converttwiss= {'betx':'betx','bety':'bety','alfx':'alfx','alfy':'alfy',
'etax':'dx','etay':'dy','etapx':'dpx','etapy':'dpy','mux':'mux','muy':'muy', 'etax':'dx','etay':'dy','etapx':'dpx','etapy':'dpy','mux':'mux','muy':'muy',
@@ -309,6 +310,7 @@ class Model:
########################################3 ########################################3
def checkMagnetLimit(self): def checkMagnetLimit(self):
# using magnet calibration # using magnet calibration
self.parent.UIReportMagnetResult.clear()
self.updateEnergy(140.) self.updateEnergy(140.)
quad={} quad={}
quad['QFA'] = [0.15, 0.173, 150.0, 91.1, 0.0, 0.74521, -0.00813, -0.03542, quad['QFA'] = [0.15, 0.173, 150.0, 91.1, 0.0, 0.74521, -0.00813, -0.03542,
@@ -347,7 +349,16 @@ class Model:
if bg in k1brho.keys(): if bg in k1brho.keys():
k1max=k1brho[bg]/brho k1max=k1brho[bg]/brho
rat=np.abs(ele.k1/k1max)*100. rat=np.abs(ele.k1/k1max)*100.
print('%s: %5.1f (percent)' % (ele.Name.replace('.','-'),rat)) label = '%s: %5.1f %%' % (ele.Name.replace('.','-'),rat)
print(label)
listitem = QtWidgets.QListWidgetItem(label)
color = QtGui.QColor(255,255,255) # white
if rat>95:
color = QtGui.QColor(255,255,0)
if rat>100:
color = QtGui.QColor(255,0,0)
listitem.setBackground(color)
self.parent.UIReportMagnetResult.addItem(listitem)
else: else:
print('%s: Unsupported type %s' % (ele.Name.replace('.','-'),bg)) print('%s: Unsupported type %s' % (ele.Name.replace('.','-'),bg))
+37 -2
View File
@@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_OpticsGUI(object): class Ui_OpticsGUI(object):
def setupUi(self, OpticsGUI): def setupUi(self, OpticsGUI):
OpticsGUI.setObjectName("OpticsGUI") OpticsGUI.setObjectName("OpticsGUI")
OpticsGUI.resize(813, 775) OpticsGUI.resize(938, 791)
self.centralwidget = QtWidgets.QWidget(OpticsGUI) self.centralwidget = QtWidgets.QWidget(OpticsGUI)
self.centralwidget.setObjectName("centralwidget") self.centralwidget.setObjectName("centralwidget")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.centralwidget)
@@ -386,6 +386,38 @@ class Ui_OpticsGUI(object):
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_3.addItem(spacerItem1) self.verticalLayout_3.addItem(spacerItem1)
self.horizontalLayout_4.addWidget(self.widget) self.horizontalLayout_4.addWidget(self.widget)
self.groupBox = QtWidgets.QGroupBox(self.tab_3)
font = QtGui.QFont()
font.setPointSize(9)
font.setBold(True)
font.setWeight(75)
self.groupBox.setFont(font)
self.groupBox.setObjectName("groupBox")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label_11 = QtWidgets.QLabel(self.groupBox)
self.label_11.setObjectName("label_11")
self.verticalLayout_2.addWidget(self.label_11)
self.UIReportMatchResult = QtWidgets.QListWidget(self.groupBox)
font = QtGui.QFont()
font.setPointSize(9)
font.setBold(False)
font.setWeight(50)
self.UIReportMatchResult.setFont(font)
self.UIReportMatchResult.setObjectName("UIReportMatchResult")
self.verticalLayout_2.addWidget(self.UIReportMatchResult)
self.label_12 = QtWidgets.QLabel(self.groupBox)
self.label_12.setObjectName("label_12")
self.verticalLayout_2.addWidget(self.label_12)
self.UIReportMagnetResult = QtWidgets.QListWidget(self.groupBox)
font = QtGui.QFont()
font.setPointSize(9)
font.setBold(False)
font.setWeight(50)
self.UIReportMagnetResult.setFont(font)
self.UIReportMagnetResult.setObjectName("UIReportMagnetResult")
self.verticalLayout_2.addWidget(self.UIReportMagnetResult)
self.horizontalLayout_4.addWidget(self.groupBox)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_4.addItem(spacerItem2) self.horizontalLayout_4.addItem(spacerItem2)
self.TabMaster.addTab(self.tab_3, "") self.TabMaster.addTab(self.tab_3, "")
@@ -477,7 +509,7 @@ class Ui_OpticsGUI(object):
self.verticalLayout_4.addWidget(self.TabMaster) self.verticalLayout_4.addWidget(self.TabMaster)
OpticsGUI.setCentralWidget(self.centralwidget) OpticsGUI.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(OpticsGUI) self.menubar = QtWidgets.QMenuBar(OpticsGUI)
self.menubar.setGeometry(QtCore.QRect(0, 0, 813, 22)) self.menubar.setGeometry(QtCore.QRect(0, 0, 938, 22))
self.menubar.setObjectName("menubar") self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile") self.menuFile.setObjectName("menuFile")
@@ -667,6 +699,9 @@ class Ui_OpticsGUI(object):
item = self.UIMatchKnobs.horizontalHeaderItem(1) item = self.UIMatchKnobs.horizontalHeaderItem(1)
item.setText(_translate("OpticsGUI", "Value")) item.setText(_translate("OpticsGUI", "Value"))
self.UIReportMagnetStrength.setText(_translate("OpticsGUI", "Report Matched Quadrupole Strength")) self.UIReportMagnetStrength.setText(_translate("OpticsGUI", "Report Matched Quadrupole Strength"))
self.groupBox.setTitle(_translate("OpticsGUI", "Matching Results"))
self.label_11.setText(_translate("OpticsGUI", "Matching"))
self.label_12.setText(_translate("OpticsGUI", "Magnet Strength"))
self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_3), _translate("OpticsGUI", "Track")) self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_3), _translate("OpticsGUI", "Track"))
self.groupBox_8.setTitle(_translate("OpticsGUI", "Magnets (Angle/ k1L / k2L)")) self.groupBox_8.setTitle(_translate("OpticsGUI", "Magnets (Angle/ k1L / k2L)"))
self.label_23.setText(_translate("OpticsGUI", "Start")) self.label_23.setText(_translate("OpticsGUI", "Start"))
+55 -3
View File
@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>813</width> <width>938</width>
<height>775</height> <height>791</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -644,6 +644,58 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="font">
<font>
<pointsize>9</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Matching Results</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_11">
<property name="text">
<string>Matching</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="UIReportMatchResult">
<property name="font">
<font>
<pointsize>9</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_12">
<property name="text">
<string>Magnet Strength</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="UIReportMagnetResult">
<property name="font">
<font>
<pointsize>9</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
@@ -805,7 +857,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>813</width> <width>938</width>
<height>22</height> <height>22</height>
</rect> </rect>
</property> </property>