Merge remote-tracking branch 'origin/master'
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
# Conflicts: # Matching/matchAramis.madx # Matching/matchAthos.madx # Matching/matchInjector.madx # Matching/matchLattice.py
This commit is contained in:
363
Matching/Lat11.0.1_Ver1/matchAramis.madx
Normal file
363
Matching/Lat11.0.1_Ver1/matchAramis.madx
Normal file
@@ -0,0 +1,363 @@
|
||||
|
||||
|
||||
betax0=10;
|
||||
alphax0=0;
|
||||
betay0=10;
|
||||
alphay0=0;
|
||||
|
||||
Twiss0: beta0,betx=betax0,alfy=alphay0,bety=betay0,alfy=alphay0;
|
||||
|
||||
Twisssep: beta0,betx=40,alfx=0,bety=60,alfy=5;
|
||||
|
||||
|
||||
|
||||
|
||||
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;
|
||||
|
||||
|
||||
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<3;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc02$end,bety<100;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc01$end,betx<150;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc01$end,bety<50;
|
||||
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;
|
||||
|
||||
s30cb01.mqua430.k1=0.2;
|
||||
s30cb02.mqua430.k1=-0.2;
|
||||
muLin3=0.2;
|
||||
|
||||
match,SEQUENCE=swissfel,range=S30cb01$start/s30cb02$end;
|
||||
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=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);
|
||||
plot,haxis=s,vaxis=betx,bety,colour=100;
|
||||
|
||||
|
||||
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;
|
||||
|
||||
|
||||
s20cb03.mqua430.k1=0;
|
||||
|
||||
|
||||
MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s30cb02$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=s20cb03.mqua430.k1,step=0.0001;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb01$start,betx=nbetx;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb01$start,bety=nbety;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb01$start,alfx=nalfx;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= s30cb01$start,alfy=nalfy;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
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;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
!L = 9;
|
||||
!alpha = 1.5;
|
||||
!beta = alpha*L;
|
||||
|
||||
|
||||
!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;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
|
||||
|
||||
|
||||
Select,flag=Error,pattern="SPO.*";
|
||||
EALIGN,DY=0.01;
|
||||
|
||||
|
||||
|
||||
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;
|
||||
|
||||
|
||||
PSYSKICK=0;
|
||||
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;
|
||||
|
||||
|
||||
R56 = -000e-6;
|
||||
|
||||
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;
|
||||
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;
|
||||
|
||||
|
||||
dL=0.625+0.25;
|
||||
bx0=25;
|
||||
bx=bx0+dL*dL/bx0;
|
||||
ax=-dL/bx0;
|
||||
by0=0.8;
|
||||
by=by0+dL*dL/by0;
|
||||
ay=-dL/by0;
|
||||
|
||||
|
||||
twiss,sequence=swissfel,range=sarcl02.mqsk300/sarma01.mqua010,betx=bx,alfx=ax,bety=by,alfy=ay;
|
||||
|
||||
nbetx= table(twiss,sarma01$start,betx);
|
||||
nalfx=-table(twiss,sarma01$start,alfx);
|
||||
nbety= table(twiss,sarma01$start,bety);
|
||||
nalfy=-table(twiss,sarma01$start,alfy);
|
||||
|
||||
|
||||
|
||||
|
||||
MATCH,SEQUENCE=swissfel,range=S30SY01$start/sarma01.mqua010,beta0=twisspor;
|
||||
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=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;
|
||||
Vary,name=sarun03.mqua080.k1,step=0.0001;
|
||||
constraint,sequence=swissfel,range=sarun03$end,mux=muAR;
|
||||
constraint,sequence=swissfel,range=sarun03$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;
|
||||
|
||||
SARUN01.mqua080.k1=sarun03.mqua080.k1;
|
||||
sarma02.mqua050.k1=0;
|
||||
sarma02.mqua120.k1=0.7*sarun02.mqua080.k1;
|
||||
|
||||
|
||||
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;
|
||||
|
||||
MATCH,SEQUENCE=swissfel,range=S30SY01$start/sarun02$start,beta0=twisspor;
|
||||
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;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=S30SY01$start/sarun19$end,beta0=twisspor;
|
||||
plot,haxis=s,vaxis=betx,bety,range=sarcl02$start/sarun18$end,colour=100;
|
||||
|
||||
|
||||
value, table(twiss,sarun19.mqua080$start,betx);
|
||||
value, table(twiss,sarun19.mqua080$start,alfx);
|
||||
value, table(twiss,sarun19.mqua080$start,bety);
|
||||
value, table(twiss,sarun19.mqua080$start,alfy);
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=#s/sarun19$end,beta0=twiss0;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/sarun18$end,colour=100;
|
||||
|
||||
exit;
|
||||
|
||||
|
||||
|
||||
320
Matching/Lat11.0.1_Ver1/matchAthos.madx
Normal file
320
Matching/Lat11.0.1_Ver1/matchAthos.madx
Normal file
@@ -0,0 +1,320 @@
|
||||
!!!!!!!!!!!!!!!!! septum
|
||||
betax0=10;
|
||||
alphax0=0;
|
||||
betay0=10;
|
||||
alphay0=0;
|
||||
|
||||
Twiss0: beta0,betx=betax0,alfy=alphay0,bety=betay0,alfy=alphay0;
|
||||
Twisssep: beta0,betx=40,alfx=0,bety=60,alfy=5;
|
||||
|
||||
y_sep=0.01;
|
||||
py_sep=0.0;
|
||||
dy_sep=-y_sep;
|
||||
dpy_sep=-py_sep;
|
||||
|
||||
|
||||
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
|
||||
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;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=s20sy02$start/S20SY02$END,beta0=twisssep;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
plot,haxis=s,vaxis=y,dy,range=#s/#e,colour=100;
|
||||
|
||||
|
||||
satsy01.mqua040.k1=0.8;
|
||||
|
||||
|
||||
MATCH,SEQUENCE=Swissfel,range=s20sy02$start/satsy02$end,beta0=twisssep;
|
||||
VARY,NAME=satsy01.mqua010.k1,STEP=0.0001;
|
||||
VARY,NAME=satsy01.mqua020.k1,STEP=0.0001;
|
||||
VARY,NAME=satsy01.mqua030.k1,STEP=0.0001;
|
||||
VARY,NAME=satsy02.mqua010.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;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=s20sy02$start/Satsy02.mbnd200,beta0=twisssep;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100;
|
||||
|
||||
exit;
|
||||
|
||||
|
||||
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep;
|
||||
VARY,NAME=satsy03.mqua110.k1,STEP=0.0001;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy03.mbnd200,DX=0.0;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
satsy02.mqua205.k1=1.6;
|
||||
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satsy03$end,beta0=twisssep;
|
||||
!VARY,NAME=satsy02.mqua205.k1,STEP=0.0001;
|
||||
VARY,NAME=satsy02.mqua210.k1,STEP=0.0001;
|
||||
VARY,NAME=satsy02.mqua220.k1,STEP=0.0001;
|
||||
VARY,NAME=satsy02.mqua230.k1,STEP=0.0001;
|
||||
|
||||
VARY,NAME=satsy02.mqua240.k1,STEP=0.0001;
|
||||
!CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua220,betx=beta;
|
||||
!CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua220,bety=beta;
|
||||
!CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua220,alfx=alpha;
|
||||
!CONSTRAINT,SEQUENCE=SwissFEL,range= satsy02.mqua220,alfy=alpha;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy03.mqua110,betx=5;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy03.mqua110,bety=4;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy03.mqua110,alfx=1.77;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy03.mqua110,alfy=-1.04;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satsy03.mqua110,X<0;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=s20sy02$start/Satsy03.mbnd200,beta0=twisssep;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100;
|
||||
|
||||
|
||||
|
||||
|
||||
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satbc01$end,beta0=twisssep;
|
||||
VARY,NAME=satsy03.mqua210.k1,STEP=0.0001;
|
||||
VARY,NAME=satsy03.mqua220.k1,STEP=0.0001;
|
||||
VARY,NAME=satsy03.mqua230.k1,STEP=0.0001;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satbc01.mbnd400,BETX<5;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satbc01.mbnd400,BETY<60;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satbc01.mbnd100,BETX<80;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
CL1.k1 := -1.3;
|
||||
CL2.k1 := 1.1;
|
||||
satcl01.mqua120.k1 := CL1.k1;
|
||||
satcl01.mqua130.k1 := CL2.k1;
|
||||
satcl01.mqua180.k1 := CL2.k1;
|
||||
satcl01.mqua190.k1 := CL1.k1;
|
||||
|
||||
|
||||
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=cl2.k1,STEP=0.0001;
|
||||
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,dx=0;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01$end,dpx=0;
|
||||
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
|
||||
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satcl01$end,beta0=twisssep;
|
||||
VARY,NAME=satbc01.mqua410.k1,STEP=0.0001;
|
||||
VARY,NAME=satbc01.mqua420.k1,STEP=0.0001;
|
||||
VARY,NAME=satbc01.mqua430.k1,STEP=0.0001;
|
||||
VARY,NAME=satbc01.mqua440.k1,STEP=0.0001;
|
||||
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01.msex160, alfx = 0;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01.msex160, alfy = 0;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01.msex160, betx > 10;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satcl01.msex160, bety < 5;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satdi01$end,beta0=twisssep;
|
||||
VARY,NAME=satdi01.mqua025.k1,STEP=0.0001;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satdi01.dscr065$start, betx<18;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range= satdi01.dscr065$start, bety<18;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=s20sy02$start/satdi01.dscr065$end,beta0=twisssep;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100;
|
||||
|
||||
|
||||
scl:=1.5;
|
||||
ss:=0.83;
|
||||
|
||||
satdi01.mqua080.k1:=0.8*scl;
|
||||
satdi01.mqua220.k1:=-0.52*scl;
|
||||
satdi01.mqua230.k1:=-1.2*ss;
|
||||
satdi01.mqua250.k1:=1.2*ss;
|
||||
satdi01.mqua260.k1:=1.2*ss;
|
||||
satdi01.mqua280.k1:=-1.2*ss+0.2;
|
||||
|
||||
satdi01.mqua300.k1=0;
|
||||
satcb01.mqua230.k1=0;
|
||||
satcb01.mqua430.k1=0;
|
||||
satcb02.mqua230.k1=0;
|
||||
satcb02.mqua430.k1=0;
|
||||
|
||||
L = 26.;
|
||||
alpha=0.7;
|
||||
beta=L*alpha;
|
||||
|
||||
|
||||
MATCH, SEQUENCE=SwissFEL,range=s20sy02$start/satdi01$end,beta0=twisssep;
|
||||
VARY,NAME=satdi01.mqua080.k1,STEP=0.0001,lower=-1.8,upper=1.8;
|
||||
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;
|
||||
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;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua280$end,betx=beta;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua280$end,alfx=alpha;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua280$end,bety=beta;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua280$end,alfy=alpha;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua300$start,x<10;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua300$start,y<10;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satdi01.mqua300$start,DX<10;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=s20sy02$start/satma01$end,beta0=twisssep;
|
||||
plot,haxis=s,vaxis=betx,bety,range=satdi01$start/satma01.dscr030$start,colour=100;
|
||||
|
||||
|
||||
|
||||
!!!!!!!!!!!!!!!!!!!!!! Athos undulator
|
||||
|
||||
pol=-1;
|
||||
satun06.mqua080.k1 := -1.699673315*pol;
|
||||
satun07.mqua080.k1 := 1.746074065*pol;
|
||||
muAT=0.15;
|
||||
match,SEQUENCE=swissfel,range=satun06$start/satun07$end;
|
||||
Vary,name=satun06.mqua080.k1,step=0.0001;
|
||||
Vary,name=satun07.mqua080.k1,step=0.0001;
|
||||
constraint,sequence=swissfel,range=satun07$end,mux=muAT;
|
||||
constraint,sequence=swissfel,range=satun07$end,muy=muAT;
|
||||
lmdif,calls=100,tolerance=1e-21;
|
||||
endmatch;
|
||||
|
||||
|
||||
satun08.mqua080.k1 := satun06.mqua080.k1;
|
||||
satun09.mqua080.k1 := satun07.mqua080.k1;
|
||||
satun10.mqua080.k1 := satun06.mqua080.k1;
|
||||
satun11.mqua080.k1 := satun07.mqua080.k1;
|
||||
|
||||
twiss,sequence=swissfel,range=satun06$start/satun07$end;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
ATbetx=table(twiss,satun07$end,betx);
|
||||
ATalfx=table(twiss,satun07$end,alfx);
|
||||
ATbety=table(twiss,satun07$end,bety);
|
||||
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;
|
||||
VARY,NAME=satma01.mqua630.k1,STEP=0.0001,lower=-2.0,upper=2.0;
|
||||
VARY,NAME=satma01.mqua640.k1,STEP=0.0001,lower=-2.0,upper=2.0;
|
||||
VARY,NAME=satun04.mqua060.k1,STEP=0.0001,lower=-3.8,upper=3.8;
|
||||
VARY,NAME=satun05.mqua420.k1,STEP=0.0001,lower=-3.8,upper=3.8;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satun06$start,betx=ATbetx;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satun06$start,bety=ATbety;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satun06$start,alfx=ATalfx;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satun06$start,alfy=ATalfy;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=satun06$start,x<10;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=satma01.mqua250$end/satun11$end,beta0=twissee;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
|
||||
|
||||
|
||||
scl=4.0;
|
||||
satcb01.mqua230.k1=scl*0.2*0;
|
||||
satcb01.mqua430.k1=-scl*0.2*0;
|
||||
satcb02.mqua230.k1=scl*0.2;
|
||||
satcb02.mqua430.k1=-scl*0.2;
|
||||
|
||||
|
||||
satma01.mqua050.k1=0;
|
||||
satma01.mqua120.k1=0;
|
||||
satma01.mqua140.k1=0;
|
||||
satma01.mqua160.k1=0;
|
||||
satma01.mqua180.k1=0;
|
||||
satma01.mqua230.k1=0;
|
||||
satma01.mqua250.k1=0;
|
||||
|
||||
|
||||
MATCH, SEQUENCE=swissfel,range=s20sy02$start/satma01$end,beta0=twisssep;
|
||||
VARY,NAME=satma01.mqua050.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.mqua140.k1,STEP=0.0001,lower=-3.8,upper=3.8;
|
||||
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.mqua120$start, betx <70;
|
||||
CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua120$start, bety <70;
|
||||
CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua140$start, betx <70;
|
||||
CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua140$start, bety <70;
|
||||
CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua160$start, betx <70;
|
||||
CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua160$start, bety <70;
|
||||
CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua180$start, betx <70;
|
||||
CONSTRAINT,SEQUENCE=swissFEL,range=satma01.mqua180$start, bety <70;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=s20sy02$start/satun11$end,beta0=twisssep;
|
||||
plot,haxis=s,vaxis=betx,bety,range=satdi01$start/#e,colour=100;
|
||||
|
||||
!
|
||||
246
Matching/Lat11.0.1_Ver1/matchInjector.madx
Normal file
246
Matching/Lat11.0.1_Ver1/matchInjector.madx
Normal file
@@ -0,0 +1,246 @@
|
||||
option,-echo;
|
||||
betax0=10;
|
||||
alphax0=0;
|
||||
betay0=10;
|
||||
alphay0=0;
|
||||
|
||||
Twiss0: beta0,betx=betax0,alfy=alphay0,bety=betay0,alfy=alphay0;
|
||||
|
||||
|
||||
|
||||
sinlh01.mqua020.k1 = 0;
|
||||
sinlh01.mqua040.k1 = 0;
|
||||
sinlh01.mqua070.k1 = 0;
|
||||
sinsb03.mqua110.k1 = 0;
|
||||
sinsb03.mqua130.k1 = 0;
|
||||
sinsb03.mqua210.k1 = 0;
|
||||
sinsb03.mqua230.k1 = 0;
|
||||
|
||||
L = 8.72;
|
||||
alpha = 1;
|
||||
beta = alpha*L;
|
||||
|
||||
|
||||
|
||||
MATCH,SEQUENCE=SwissFEL,range=#s/sinbc02$start,beta0 = Twiss0;
|
||||
VARY,NAME=sinlh01.MQUA020.k1,STEP=0.0001;
|
||||
VARY,NAME=sinlh01.MQUA040.k1,STEP=0.0001;
|
||||
VARY,NAME=sinlh01.MQUA070.k1,STEP=0.0001;
|
||||
VARY,NAME=sinsb03.MQUA130.k1,STEP=0.0001;
|
||||
VARY,NAME=sinsb03.MQUA230.k1,STEP=0.0001;
|
||||
VARY,NAME=sinsb04.MQUA130.k1,STEP=0.0001;
|
||||
VARY,NAME=sinsb04.MQUA230.k1,STEP=0.0001;
|
||||
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinsb04.mqua230$end, alfx = alpha;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinsb04.mqua230$end, alfy = alpha;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinsb04.mqua230$end, betx = beta;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinsb04.mqua230$end, bety = beta;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinsb04.mqua130$end, betx < 100;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinsb04.mqua130$end, bety < 100;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinlh01.mqua070$end, betx < 100;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinlh01.mqua070$end, bety < 100;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
SIMPLEX,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
sinbc01.mqua020.k1=0.0;
|
||||
sinbc01.mqua050.k1=0;
|
||||
sinbc01.mqua070.k1=0;
|
||||
sinbc01.mqua090.k1=0;
|
||||
sinbc01.mqua110.k1=0;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=#s/sinbc01$end,beta0 = Twiss0;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
|
||||
MATCH,SEQUENCE=SwissFEL,range=#s/sinma01$start,beta0 = Twiss0;
|
||||
VARY,NAME=sinbc01.MQUA020.k1,STEP=0.0001;
|
||||
VARY,NAME=sinbc01.MQUA050.k1,STEP=0.0001;
|
||||
VARY,NAME=sinbc01.MQUA070.k1,STEP=0.0001;
|
||||
VARY,NAME=sinbc01.MQUA090.k1,STEP=0.0001;
|
||||
VARY,NAME=sinbc01.MQUA110.k1,STEP=0.0001;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc02$end, betx < 5;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc02$end, alfx = 0;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc01.mqua070$end, bety < 32;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc02$end, bety < 59;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinbc01$end, x = 0;
|
||||
SIMPLEX,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=#s/sinbc02$end,beta0 = Twiss0;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
|
||||
sinma01.mqua020.k1=-0.1;
|
||||
sinma01.mqua030.k1=0;
|
||||
sinma01.mqua040.k1=0;
|
||||
sincb01.mqua230.k1=0;
|
||||
sincb01.mqua430.k1=0;
|
||||
|
||||
|
||||
sindi01.mqua020.k1=0;
|
||||
sindi01.mqua070.k1=0;
|
||||
|
||||
sindi02.mqua020.k1=0.0;
|
||||
sindi02.mqua030.k1=0.0;
|
||||
sindi02.mqua050.k1=0;
|
||||
sindi02.mqua060.k1=0;
|
||||
sindi02.mqua090.k1=0;
|
||||
|
||||
bc1betx=11.1557;
|
||||
bc1alfx=-1.17;
|
||||
bc1bety=50;
|
||||
bc1alfy=0;
|
||||
|
||||
beta=50;
|
||||
MATCH,SEQUENCE=SwissFEL,range=#s/sindi02$end,beta0 = Twiss0;
|
||||
VARY,NAME=sinma01.MQUA020.k1,STEP=0.0001;
|
||||
VARY,NAME=sinma01.MQUA030.k1,STEP=0.0001;
|
||||
VARY,NAME=sinma01.MQUA040.k1,STEP=0.0001;
|
||||
VARY,NAME=sincb01.MQUA230.k1,STEP=0.0001;
|
||||
VARY,NAME=sincb01.MQUA430.k1,STEP=0.0001;
|
||||
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=sindi02.mqua020$start,bety=bc1bety;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sindi02.mqua020$start,alfy=bc1alfy;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sindi02.mqua020$start,betx=bc1betx;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sindi02.mqua020$start,alfx=bc1alfx;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinma01$end, betx < 100;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sinma01$end, bety < 100;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sincb01$end, betx < 100;
|
||||
CONSTRAINT,SEQUENCE=SwissFEL,range=sincb01$end, bety < 100;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
SIMPLEX,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=#s/sindi02$end,beta0 = Twiss0;
|
||||
plot,haxis=s,vaxis=betx,bety,range=sinbc02$start/#e,colour=100;
|
||||
|
||||
|
||||
s10cb01.mqua230.k1=0.2;
|
||||
s10cb01.mqua430.k1=-0.2;
|
||||
|
||||
muLin1=0.20;
|
||||
|
||||
match,SEQUENCE=swissfel,range=S10cb01$start/s10cb01$end;
|
||||
Vary,name=S10CB01.MQUA230.k1,step=0.0001;
|
||||
Vary,name=S10CB01.MQUA430.k1,step=0.0001;
|
||||
constraint,sequence=swissfel,range=s10cb01$end,mux=muLin1;
|
||||
constraint,sequence=swissfel,range=s10cb01$end,muy=muLin1;
|
||||
lmdif,calls=100,tolerance=1e-21;
|
||||
endmatch;
|
||||
|
||||
s10cb02.mqua230.k1 = s10cb01.mqua230.k1;
|
||||
s10cb02.mqua430.k1 = s10cb01.mqua430.k1;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=s10cb01$start/s10cb01$end;
|
||||
|
||||
nbetx=table(twiss,s10cb01$end,betx);
|
||||
nalfx=table(twiss,s10cb01$end,alfx);
|
||||
nbety=table(twiss,s10cb01$end,bety);
|
||||
nalfy=table(twiss,s10cb01$end,alfy);
|
||||
plot,haxis=s,vaxis=betx,bety,colour=100;
|
||||
|
||||
|
||||
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.mqua030.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=sindi02.mqua050.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=sindi02.mqua060.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=sindi02.mqua090.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s10cb01.mqua230.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s10cb01.mqua430.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10cb02$start,betx=nbetx;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10cb02$start,alfx=nalfx;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10cb02$start,bety=nbety;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10cb02$start,alfy=nalfy;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10cb01$start,x=0;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10cb01$start,y=0;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10cb01$start,dx=0;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10cb01$start,dy=0;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=#s/s10cb02$end,beta0 = Twiss0;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
|
||||
S10DI01.MQUA120.k1=S10CB02.MQUA230.k1;
|
||||
S10CB03.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
S10CB03.MQUA430.k1=S10CB02.MQUA230.k1;
|
||||
S10CB04.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
S10CB04.MQUA430.k1=S10CB02.MQUA230.k1;
|
||||
S10CB05.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
S10CB05.MQUA430.k1=S10CB02.MQUA230.k1;
|
||||
S10CB06.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
S10CB06.MQUA430.k1=S10CB02.MQUA230.k1;
|
||||
S10CB07.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
S10CB07.MQUA430.k1=S10CB02.MQUA230.k1;
|
||||
S10CB08.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
S10CB08.MQUA430.k1=S10CB02.MQUA230.k1;
|
||||
S10CB09.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
S10CB09.MQUA430.k1=S10CB02.MQUA230.k1;
|
||||
S10CB10.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
S10CB10.MQUA430.k1=S10CB02.MQUA230.k1;
|
||||
S10CB11.MQUA230.k1=S10CB02.MQUA430.k1;
|
||||
|
||||
s10ma01.mqua010.k1=0.;
|
||||
s10ma01.mqua020.k1=0;
|
||||
s10ma01.mqua030.k1=0;
|
||||
s10ma01.mqua040.k1=0;
|
||||
s10ma01.mqua050.k1=0;
|
||||
s10ma01.mqua060.k1=0;
|
||||
s10ma01.mqua070.k1=0;
|
||||
s10ma01.mqua080.k1=0;
|
||||
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=#s/s10ma01$end,beta0 = Twiss0;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
|
||||
|
||||
|
||||
L = 10;
|
||||
alpha = 0.85;
|
||||
beta = alpha*L;
|
||||
|
||||
MATCH,SEQUENCE=SwissFEL,range=#s/s10ma01$end,beta0 = Twiss0;
|
||||
VARY,NAME=s10ma01.mqua010.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s10ma01.mqua030.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s10ma01.mqua050.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s10ma01.mqua070.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10ma01.mqua070$end,betx=beta;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10ma01.mqua070$end,alfx=alpha;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10ma01.mqua070$end,bety=beta;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10ma01.mqua070$end,alfy=alpha;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s10ma01$start,x=0;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=#s/s10ma01$end,beta0 = Twiss0;
|
||||
plot,haxis=s,vaxis=betx,bety,range=s10cb09$start/#e,colour=100;
|
||||
|
||||
|
||||
s10ma01.mqua130.k1=0.7;
|
||||
s20cb01.mqua430.k1=0.0;
|
||||
|
||||
|
||||
|
||||
MATCH,SEQUENCE=SwissFEL,range=#s/s20sy02$start,beta0 = Twiss0;
|
||||
VARY,NAME=s20cb01.mqua430.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s20sy01.mqua020.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s20sy01.mqua030.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s20sy01.mqua050.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
VARY,NAME=s20sy01.mqua080.k1,STEP=0.0001,lower=-5.5,upper=5.5;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s20sy01$end,betx=40;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s20sy01$end,alfx=0;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s20sy01$end,bety=60;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s20sy01$end,alfy=5;
|
||||
CONSTRAINT,SEQUENCE=swissfel,range=s20sy01.mqua020$end,bety<80;
|
||||
LMDIF,CALLS=1000,TOLERANCE=1.e-21;
|
||||
ENDMATCH;
|
||||
|
||||
|
||||
twiss,SEQUENCE=swissfel,range=#s/s20sy01$end,beta0 = Twiss0;
|
||||
plot,haxis=s,vaxis=betx,bety,range=s10ma01$start/#e,colour=100;
|
||||
plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100;
|
||||
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
class ApplicationTemplate:
|
||||
def __init__(self):
|
||||
self.switch=0
|
||||
self.path='.'
|
||||
self.avoidPreset=0
|
||||
self.MapIndx=[]
|
||||
self.MapIndxSave=[]
|
||||
|
||||
def isType(self,key):
|
||||
return 0
|
||||
|
||||
def demandMapID(self):
|
||||
return 0
|
||||
|
||||
|
||||
def writeLine(self,line,seq):
|
||||
return
|
||||
|
||||
def writeDrift(self,ele):
|
||||
return
|
||||
|
||||
def writeVacuum(self,ele):
|
||||
self.writeMarker(ele)
|
||||
return
|
||||
|
||||
def writeAlignment(self,ele):
|
||||
self.writeMarker(ele)
|
||||
return
|
||||
|
||||
def writeBend(self,ele):
|
||||
return
|
||||
|
||||
def writeQuadrupole(self,ele):
|
||||
return
|
||||
|
||||
def writeCorrector(self,ele):
|
||||
return
|
||||
|
||||
|
||||
def writeSextupole(self,ele):
|
||||
return
|
||||
|
||||
def writeRF(self,ele):
|
||||
return
|
||||
|
||||
|
||||
def writeUndulator(self,ele):
|
||||
return
|
||||
|
||||
def writeDiagnostic(self,ele):
|
||||
return
|
||||
|
||||
|
||||
def writeMarker(self,ele):
|
||||
return
|
||||
|
||||
def writeSolenoid(self,ele):
|
||||
return
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
import math
|
||||
import os
|
||||
import sys
|
||||
from OMAppTemplate import ApplicationTemplate
|
||||
import numpy as np
|
||||
from string import *
|
||||
|
||||
|
||||
from os import system
|
||||
|
||||
#--------
|
||||
# Energy Manager Interface
|
||||
|
||||
class EnergyManager(ApplicationTemplate):
|
||||
def __init__(self):
|
||||
ApplicationTemplate.__init__(self)
|
||||
self.p0=0
|
||||
self.p=0
|
||||
self.Energy={}
|
||||
|
||||
|
||||
def update(self,p0):
|
||||
self.p0=p0
|
||||
|
||||
|
||||
def writeLine(self,line,seq):
|
||||
# print(line.Name)
|
||||
'Nothing to do?'
|
||||
|
||||
|
||||
def register(self,ele,Egain=0.0):
|
||||
if (self.MapIndx!=self.MapIndxSave): # New line comes
|
||||
self.p=0
|
||||
self.MapIndxSave=self.MapIndx
|
||||
self.Energy[ele.Name]=[self.p,Egain]
|
||||
if ('cor' in ele.__dict__) or ('corx' in ele.__dict__):
|
||||
name=ele.Name.replace('MQUA','MCRX').replace('MBND','MCRX').replace('UIND','MCRX').replace('MCOR','MCRX')
|
||||
self.Energy[name]=[self.p,Egain]
|
||||
if 'cory' in ele.__dict__:
|
||||
name=ele.Name.replace('MQUA','MCRY').replace('MBND','MCRY').replace('UIND','MCRY').replace('MCOR','MCRY')
|
||||
self.Energy[name]=[self.p,Egain]
|
||||
|
||||
# Double registration for later convenience
|
||||
# ... 07.08.2015 Removed. After gaining some experience, it turns out inconvenient rather than useful.
|
||||
#self.Energy[EpicsName]=[self.p,Egain]
|
||||
|
||||
return
|
||||
|
||||
|
||||
def demandMapID(self):
|
||||
'Energy manager always requests Map ID to Layout manger'
|
||||
return 1
|
||||
|
||||
|
||||
def writeVacuum(self,ele):
|
||||
self.writeMarker(ele)
|
||||
return
|
||||
|
||||
def writeAlignment(self,ele):
|
||||
self.writeMarker(ele)
|
||||
return
|
||||
|
||||
|
||||
def writeBend(self,ele):
|
||||
# Here, it is possible to implement Egain (loss) from CSR
|
||||
# EgainCSR=***
|
||||
# self.Energy[ele.Name]=[self.p,EgainCSR]
|
||||
self.register(ele)
|
||||
|
||||
def writeQuadrupole(self,ele):
|
||||
self.register(ele)
|
||||
|
||||
def writeCorrector(self,ele):
|
||||
self.register(ele)
|
||||
|
||||
def writeSextupole(self,ele):
|
||||
self.register(ele)
|
||||
|
||||
def writeRF(self,ele):
|
||||
if (self.MapIndx!=self.MapIndxSave): # New line comes
|
||||
self.p=0
|
||||
self.MapIndxSave=self.MapIndx
|
||||
if ('Gradient' in ele.__dict__) and ('Phase' in ele.__dict__): # needs a check for TDS to not give energy gain
|
||||
if 'TDS' in ele.Name:
|
||||
Egain=0.0
|
||||
else:
|
||||
E=ele.Gradient
|
||||
V=E*ele.Length
|
||||
phase=ele.Phase*math.pi/180.0
|
||||
Egain=V*math.sin(phase)
|
||||
# print(ele.Name, ' - Energy Gain:',Egain*1e-6,ele.Gradient*1e-6,self.p*1e-6)
|
||||
else:
|
||||
Egain=0.0
|
||||
self.Energy[ele.Name]=[self.p,Egain,ele.Length]
|
||||
self.p=self.p+Egain
|
||||
|
||||
def writeUndulator(self,ele):
|
||||
self.register(ele)
|
||||
|
||||
def writeDiagnostic(self,ele):
|
||||
self.register(ele)
|
||||
|
||||
def writeSolenoid(self,ele):
|
||||
self.register(ele)
|
||||
|
||||
def writeMarker(self,ele):
|
||||
self.register(ele)
|
||||
|
||||
|
||||
def demandMapID(self):
|
||||
'Energy manager always requests Map ID to Layout manger'
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -1,319 +0,0 @@
|
||||
from copy import deepcopy
|
||||
from string import *
|
||||
import math
|
||||
import re
|
||||
import numpy as np
|
||||
import sys
|
||||
|
||||
#from OMLayout import SwissFEL
|
||||
|
||||
from OMFacilityAccess import FacilityAccess
|
||||
from OMType import *
|
||||
from OMEnergyManager import *
|
||||
from OMLayout import SwissFEL
|
||||
|
||||
class Facility(FacilityAccess):
|
||||
def __init__(self,init=0,alt=0,layout=None):
|
||||
|
||||
# init=0 : no initialization of dynamic parameters
|
||||
# init=1 : initialization of dynamic parameters as in OMLayout.initialize()
|
||||
# init=2 : initialization of dynamic parameters as in OMLayout.initialize() but dipoles are forcibly turned off
|
||||
# init=3 : initialization of dynamic parameters as in OMLayout.initialize() but branch dipoles are forcibly turned off
|
||||
# Note that FacilityContainer.BeamPath() set the branch bend to the design angle
|
||||
|
||||
# alt= 0 : select current layout in OMLayout
|
||||
# alt <> 0: select alternative Layout in OMLayout
|
||||
|
||||
# layout = None : loads the curren tlayout
|
||||
# layout = '10.3.2': loads SwissFEL from the module file OMLayout_10_3_2.py
|
||||
|
||||
Layout=SwissFEL(alt) # instanciate the layout
|
||||
if layout is not None and Layout.Version is not layout:
|
||||
module_name='OMLayout_%s' % layout.replace('.','_')
|
||||
module=__import__(module_name)
|
||||
Layout=module.SwissFEL(alt)
|
||||
print('Importing Layout Module:',module_name)
|
||||
self.Version=Layout.Version
|
||||
print('Initializing Lattice',self.Version,flush=True);
|
||||
|
||||
self.PartsList=Layout.build() # generate the lattice and return the beamlines
|
||||
self.EM=EnergyManager()
|
||||
|
||||
# Note that the subsections have also a direct reference to the elements but if elements are altered
|
||||
# in ElementDB then the SectionDB is automatically updated with the new values.
|
||||
self.ElementDB={} # dictionary to hold all elements of the facility
|
||||
self.SectionDB={} # dictionary of subsections with 7 Letter ID
|
||||
self.IntegratedCorrDB={} # Database for integrated correctors
|
||||
|
||||
# flatten beamlines so that only one outer container exists with the section container, e.g. SINSB01
|
||||
|
||||
for p in self.PartsList:
|
||||
line=LineContainer('') #
|
||||
p[0].flatten('S',line,self.ElementDB,self.SectionDB,self.IntegratedCorrDB)
|
||||
p[0]=line # replace the current nested line container with the list of atomic subsection
|
||||
|
||||
# initiate the element values with default values
|
||||
if init:
|
||||
Layout.initialize(self.ElementDB)
|
||||
if init==2:
|
||||
self.turnOffBends()
|
||||
if init==3:
|
||||
self.turnOffBranchBends()
|
||||
|
||||
# define the mapping of the element, defining their position and asignment to a branch
|
||||
self.mapping()
|
||||
|
||||
# setup a dictionary of bending magnets.
|
||||
BCdict={}
|
||||
self.BranchBend=[]
|
||||
for k in self.ElementDB.keys():
|
||||
if isinstance(self.ElementDB[k],Dipole):
|
||||
try:
|
||||
self.ElementDB[k].branch
|
||||
# print(k)
|
||||
self.BranchBend.append(k)
|
||||
except:
|
||||
None
|
||||
try:
|
||||
self.ElementDB[k].BC
|
||||
if self.ElementDB[k].BC in BCdict:
|
||||
# It must be the element itself (not Element.Name) becuase the new feature altSection allows the same element name in the altered section...
|
||||
BCdict[self.ElementDB[k].BC].append(self.ElementDB[k])
|
||||
else:
|
||||
BCdict[self.ElementDB[k].BC]=[self.ElementDB[k]]
|
||||
except:
|
||||
None
|
||||
|
||||
|
||||
# get braching points and bunch compressor magnets
|
||||
|
||||
self.BC=[]
|
||||
self.BCBPM={}
|
||||
for k in BCdict.keys():
|
||||
BC=BCdict[k]
|
||||
BCsorted=[0]*len(BC)
|
||||
for i in range(0,len(BC)):
|
||||
judge=[]
|
||||
for j in range(0,len(BC)):
|
||||
if i!=j:
|
||||
judge.append(self.isUpstream(BC[i].Name,BC[j].Name))
|
||||
jsum=sum(judge)
|
||||
BCsorted[len(BC)-jsum-1]=BC[i]
|
||||
|
||||
|
||||
|
||||
if len(BCsorted)==4:
|
||||
sect=BCsorted[3].Name.split('.')[0]
|
||||
for s in self.SectionDB.keys():
|
||||
if s==sect:
|
||||
#if BCsorted[3].altSection==s.altSection: # altSection is turned off for now... 29.05.2015
|
||||
#arm=self.SectionDB[s].position(self.ElementDB[BCsorted[3].Name])-self.SectionDB[s].position(self.ElementDB[BCsorted[2].Name])
|
||||
arm=self.SectionDB[s].position(BCsorted[3])-self.SectionDB[s].position(BCsorted[2])
|
||||
BCsorted.append(arm)
|
||||
self.BCBPM[BCsorted[0].Name]=['','',0]
|
||||
for ele in self.SectionDB[s].Element:
|
||||
if 'DBPM' in ele.Name: # This does not detect Laser heater...
|
||||
if self.isUpstream(BCsorted[0].Name,ele.Name) and self.isUpstream(ele.Name,BCsorted[1].Name):
|
||||
self.BCBPM[BCsorted[0].Name][0]=ele # BPM between the first and second dipoles
|
||||
if self.isUpstream(BCsorted[2].Name,ele.Name) and self.isUpstream(ele.Name,BCsorted[3].Name):
|
||||
self.BCBPM[BCsorted[0].Name][1]=ele # BPM between the third and fourth dipoles
|
||||
self.BCBPM[BCsorted[0].Name][2]=self.SectionDB[s].position(BCsorted[3])+BCsorted[3].Length/2-self.SectionDB[s].position(ele)-ele.Length/2
|
||||
|
||||
self.BC.append(BCsorted)
|
||||
|
||||
|
||||
# get list of first nd last magnetin bunch compressor.
|
||||
self.BCstart={}
|
||||
self.BCend={}
|
||||
for ele in self.BC:
|
||||
self.BCstart[ele[0]]=1
|
||||
self.BCend[ele[-1]]=1
|
||||
|
||||
|
||||
#initialize all element with the energy. All elements need to be registered first to avoid an error message of not registered elements
|
||||
for ele in self.ElementDB.values():
|
||||
self.EM.register(ele)
|
||||
self.writeFacility(self.EM)
|
||||
|
||||
|
||||
def turnOffBends(self):
|
||||
for ele in self.ElementDB.values():
|
||||
if isinstance(ele,Dipole):
|
||||
ele.angle=0.0
|
||||
|
||||
def turnOffBranchBends(self):
|
||||
for ele in self.ElementDB.values():
|
||||
if isinstance(ele,Dipole) and ('branch' in ele.__dict__):
|
||||
ele.angle=0.0
|
||||
|
||||
# end of initialization
|
||||
#----------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
def isUpstream(self,a,b):
|
||||
# Tell you if a is upstream of b.
|
||||
try:
|
||||
A=self.ElementDB[a]
|
||||
Amap=A.mapping
|
||||
except:
|
||||
try:
|
||||
A=self.IntegratedCorrDB[a]
|
||||
Amap=A.mapping
|
||||
except:
|
||||
print('Your input element name is not in Element data base...A:',a,flush=True)
|
||||
return None
|
||||
|
||||
try:
|
||||
B=self.ElementDB[b]
|
||||
Bmap=B.mapping
|
||||
except:
|
||||
try:
|
||||
B=self.IntegratedCorrDB[b]
|
||||
Bmap=B.mapping
|
||||
except:
|
||||
print('Your input element name is not in Element data base...B:',b,flush=True)
|
||||
return None
|
||||
|
||||
if Amap[0]==Bmap[0]: # Two elements are in the same part of the machine, easy case
|
||||
if Amap[2]<Bmap[2]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
myself=Bmap[0]
|
||||
parent=999
|
||||
while parent>=0:
|
||||
parent=self.PartsList[myself][1]
|
||||
if Amap[0]==parent:
|
||||
branch=self.PartsList[myself][2]
|
||||
if branch==-1:
|
||||
return True # The part is connected to the paprent at the end, so Elem A is upstream of B
|
||||
elif Amap[1]<=branch:
|
||||
return True # The part is connected to the parent at a branch and Elem A is upstream of the branch, and thus upstream of B
|
||||
elif Amap[1]>branch:
|
||||
return False # The part is connected to the parent at a branch but Elem A is downstream of the branch and thus not upstream of B
|
||||
myself=parent
|
||||
|
||||
return False # The part which includes Elem A is not upstream of Elem B
|
||||
|
||||
def mapping(self):
|
||||
|
||||
foundMarker={}
|
||||
List1=[]
|
||||
for i in range(0,len(self.PartsList)):
|
||||
p=self.PartsList[i]
|
||||
found=0
|
||||
#line=self.BeamPath(i)
|
||||
j=1
|
||||
k=0
|
||||
for subsec in p[0].Element:
|
||||
for ele in subsec.Element:
|
||||
if ele.Tag=='MKBR':
|
||||
key=str(i)+'_'+str(j)
|
||||
found=found+1
|
||||
foundMarker[key]=ele.Name
|
||||
j=j+1
|
||||
k=k+1
|
||||
ele.__dict__.update({'mapping':[i,j,k]})
|
||||
#if ele.__dict__.has_key('cor') or ele.__dict__.has_key('corx') or ele.__dict__.has_key('cor'):
|
||||
if 'cor' in ele.__dict__ or 'corx' in ele.__dict__ or 'cor' in ele.__dict__:
|
||||
if ('MQUA' in ele.Name) or ('MBND' in ele.Name) or ('UIND' in ele.Name):
|
||||
#if ele.__dict__.has_key('cor') or ele.__dict__.has_key('corx'):
|
||||
if 'cor' in ele.__dict__ or 'corx' in ele.__dict__:
|
||||
cname=ele.Name.replace('MQUA','MCRX').replace('MBND','MCRX').replace('UIND','MCRX')
|
||||
cele=self.IntegratedCorrDB[cname]
|
||||
cele.__dict__.update({'mapping':[i,j,k]})
|
||||
#if ele.__dict__.has_key('cory'):
|
||||
if 'cory' in ele.__dict__:
|
||||
cname=ele.Name.replace('MQUA','MCRY').replace('MBND','MCRY').replace('UIND','MCRY')
|
||||
cele=self.IntegratedCorrDB[cname]
|
||||
cele.__dict__.update({'mapping':[i,j,k]})
|
||||
|
||||
section=self.SectionDB[subsec.Name]
|
||||
section.__dict__.update({'mapping':i})
|
||||
List1.append([p[1],p[2],found])
|
||||
|
||||
self.foundMarker=foundMarker
|
||||
|
||||
return List1
|
||||
|
||||
|
||||
def BeamPath(self, PathIndx, Branch=0):
|
||||
|
||||
#Branch indicates that for a branching marker is searched and then stopped at the correct occurence (e.g. Branch=2 stops at the second marker)
|
||||
if PathIndx<0 or PathIndx>len(self.PartsList)-1:
|
||||
return None
|
||||
if not isinstance(PathIndx,int):
|
||||
return None
|
||||
|
||||
path=self.PartsList[PathIndx]
|
||||
parentID=path[1] # reference to parent beamline (0 means root and has no parent)
|
||||
branchID=path[2] # branching point: the nth occurence of a marker in the parent beam line. If negative -1 than line is appended to parent line
|
||||
line=LineContainer('') # clear current line
|
||||
|
||||
if (branchID!=0): # get line from parents first
|
||||
line=self.BeamPath(parentID,branchID)
|
||||
|
||||
foundMarker=0 # to count makers in a given line
|
||||
for sec in path[0].Element: # loob over all subsection in a line
|
||||
for ele in sec.Element: # check if the element of the subsection is a marker and increase counter if so
|
||||
#if isinstance(ele,Dipole):
|
||||
# ele.angle=ele.design_angle
|
||||
if isinstance(ele,Marker):
|
||||
foundMarker=foundMarker+1
|
||||
if Branch>0 and foundMarker==Branch: # check whether the branching point is found
|
||||
found=0 # find dipole before marker to sert to desing_angle
|
||||
idx=sec.Element.index(ele)-1
|
||||
while found==0 and idx >-1:
|
||||
if isinstance(sec.Element[idx],Dipole):
|
||||
# print('setting branching angle for',sec.Element[idx].Name,'for branch', Branch)
|
||||
sec.Element[idx].angle=sec.Element[idx].design_angle;
|
||||
found=1;
|
||||
idx=idx-1;
|
||||
secnew=LineContainer(sec.Name) # create a new line container to hold reduced section
|
||||
for i in range(0,sec.Element.index(ele)):
|
||||
ref=sec.Ref[sec.Element[i]]
|
||||
secnew.append(sec.Element[i],ref['pos'],ref['ref']) # add element and its reference
|
||||
line.append(secnew,0,'relative')
|
||||
return line
|
||||
else:
|
||||
# check for dipoles to be set straight if not a branching point.
|
||||
found=0; # search backwards from the marker
|
||||
idx=sec.Element.index(ele)-1
|
||||
while found==0 and idx >-1:
|
||||
if isinstance(sec.Element[idx],Dipole):
|
||||
sec.Element[idx].angle=0;
|
||||
found=1;
|
||||
idx=idx-1;
|
||||
line.append(sec,0,'relative') # append subsection
|
||||
return line
|
||||
|
||||
def writeFacility(self,app=None,simple=0,EM=None):
|
||||
# Handle the entire facility at one time - experimental
|
||||
# Particular application is the energy manager
|
||||
|
||||
if not app:
|
||||
'no application, no action'
|
||||
return
|
||||
|
||||
for i in range(0,len(self.PartsList)):
|
||||
p=self.PartsList[i]
|
||||
if 'demandMapID' in dir(app):
|
||||
if app.demandMapID(): # app is asking which part is under writing
|
||||
if i==len(self.PartsList)-1:
|
||||
app.MapIndx=-i # Give a negative index for the last part
|
||||
else:
|
||||
app.MapIndx=i
|
||||
if simple:
|
||||
line=p[0] # this might be wrong if a branching has happen, because it takes the full cenn and not the adjusted on eup to branch
|
||||
else:
|
||||
line=self.BeamPath(self.PartsList.index(p))
|
||||
print('Writing Beam line for: ', p[3],flush=True)
|
||||
# if no energy manager is specified than use the internal one as default
|
||||
if not EM:
|
||||
EM=self
|
||||
line.writeLattice(app,EM)
|
||||
|
||||
|
||||
|
||||
@@ -1,188 +0,0 @@
|
||||
import re
|
||||
import numpy as np
|
||||
|
||||
class FacilityAccess:
|
||||
|
||||
|
||||
def listElement(self, word=None, NoE=0):
|
||||
# Return a list of elements that includes word
|
||||
# Wild card (*) can be used
|
||||
# NoE stands for Name or Element, switching the output
|
||||
# 0: list of Element names, 1: list of element instances.
|
||||
if word==None:
|
||||
return
|
||||
elif word=='*':
|
||||
allRequested=1
|
||||
elif len(word)==0:
|
||||
return []
|
||||
else:
|
||||
word=word.upper()
|
||||
word=word.split('*')
|
||||
allRequested=0
|
||||
|
||||
ElementList=[]
|
||||
for p in self.PartsList:
|
||||
for sec in p[0].Element:
|
||||
for ele in sec.Element:
|
||||
requested=1
|
||||
for w in word:
|
||||
if w not in ele.Name:
|
||||
requested=allRequested
|
||||
if requested:
|
||||
if NoE:
|
||||
ElementList.append(ele)
|
||||
else:
|
||||
if ele.Type!='Corrector':
|
||||
ElementList.append(ele.Name)
|
||||
if ('cor' in ele.__dict__) or ('corx' in ele.__dict__):
|
||||
ElementList.append(ele.Name.replace(ele.Name[8:12],'MCRX'))
|
||||
if ('cory' in ele.__dict__):
|
||||
if (ele.Name[8:12]=='MKAC') or (ele.Name[8:12]=='MKDC'):
|
||||
ElementList.append(ele.Name)
|
||||
else:
|
||||
ElementList.append(ele.Name.replace(ele.Name[8:12],'MCRY'))
|
||||
|
||||
return ElementList
|
||||
|
||||
def listSection(self, word=None, NoE=0):
|
||||
# Return a list of elements that includes word
|
||||
# Wild card (*) can be used
|
||||
# NoE stands for Name or Element, switching the output
|
||||
# 0: list of Element names, 1: list of line instances.
|
||||
if word==None:
|
||||
return
|
||||
elif word=='*':
|
||||
allRequested=1
|
||||
elif len(word)==0:
|
||||
return []
|
||||
else:
|
||||
word=upper(word)
|
||||
word=word.split('*')
|
||||
allRequested=0
|
||||
|
||||
SectionList=[]
|
||||
for p in self.PartsList:
|
||||
for sec in p[0].Element:
|
||||
requested=1
|
||||
for w in word:
|
||||
if w not in sec.Name:
|
||||
requested=allRequested
|
||||
if requested:
|
||||
if NoE:
|
||||
SectionList.append(sec)
|
||||
else:
|
||||
SectionList.append(sec.Name)
|
||||
|
||||
return SectionList
|
||||
|
||||
|
||||
|
||||
|
||||
def getElement(self,name):
|
||||
name=name.upper()
|
||||
if name in self.ElementDB:
|
||||
return self.ElementDB[name]
|
||||
else:
|
||||
return None
|
||||
|
||||
def getSection(self,name):
|
||||
name=name.upper()
|
||||
if name in self.SectionDB:
|
||||
return self.SectionDB[name]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
|
||||
def setGroup(self,dn,field,values):
|
||||
# dn is a list of element names. It can be obtained from OMEpicsChannel
|
||||
for i in range(0,len(dn)):
|
||||
n=dn[i]
|
||||
ele=self.ElementDB[n]
|
||||
if field in dir(ele):
|
||||
ele.__dict__.update({field:values[i]})
|
||||
else:
|
||||
print('Error due to unregistered Channel:',ele,field)
|
||||
|
||||
|
||||
def getGroup(self,dn,field):
|
||||
values=[]
|
||||
for i in range(0,len(dn)):
|
||||
n=dn[i]
|
||||
ele=self.ElementDB[n]
|
||||
if field in dir(ele):
|
||||
values.append(ele[field])
|
||||
else:
|
||||
print('Error due to unregistered Channel:',ele,field)
|
||||
|
||||
return values
|
||||
|
||||
|
||||
|
||||
def setRegExpElement(self,section,device,field,value):
|
||||
myRe=re.compile(section+'.*'+device)
|
||||
for key in self.ElementDB.keys():
|
||||
if (myRe.match(key)):
|
||||
ele=self.ElementDB[key]
|
||||
if field in ele.__dict__.keys():
|
||||
if (field=='angle'):
|
||||
ele.__dict__[field]=np.sign(ele['design_angle'])*abs(value) # this is needed to set collectively a bunch compressor angle without flipping signs
|
||||
# print(ele.Name,ele.__dict__[field])
|
||||
else:
|
||||
ele.__dict__[field]=value
|
||||
|
||||
|
||||
|
||||
def getRegExpElement(self,section,device,field):
|
||||
val=[]
|
||||
myRe=re.compile(section+'.*'+device)
|
||||
for key in self.ElementDB.keys():
|
||||
if (myRe.match(key)):
|
||||
ele=self.ElementDB[key]
|
||||
if field in ele.__dict__.keys():
|
||||
val.append(ele[field])
|
||||
return val
|
||||
|
||||
|
||||
#-------------------------
|
||||
# routines from former Energy Manager
|
||||
|
||||
def EnergyAt(self,ele):
|
||||
if isinstance(ele,str):
|
||||
name=ele
|
||||
else:
|
||||
name=ele.Name
|
||||
if name in self.EM.Energy.keys():
|
||||
return self.EM.Energy[name]
|
||||
else:
|
||||
print(name+' is not found in Energy manager of Module Facility!')
|
||||
return [0.0,0.0]
|
||||
|
||||
def forceEnergyAt(self,elename,Ei):
|
||||
|
||||
# force an update of the energy profile
|
||||
self.writeFacility(self.EM)
|
||||
|
||||
if Ei<0:
|
||||
# The initial energy should be positive
|
||||
return
|
||||
try:
|
||||
# Check if elename exists
|
||||
E0=self.EM.Energy[elename][0]
|
||||
dE=Ei-E0
|
||||
# dE=Ei
|
||||
# print('energy change',elename,Ei,E0)
|
||||
# self.EM.Energy[elename][0]=Ei
|
||||
except:
|
||||
return
|
||||
|
||||
# First compute the energy with the present gradient and phase
|
||||
# Note that the energy at the elements upstream of the given initial element is not touched.
|
||||
|
||||
for k in self.EM.Energy.keys():
|
||||
if len(self.EM.Energy[k])==2:
|
||||
self.EM.Energy[k]=[self.EM.Energy[k][0]+dE,self.EM.Energy[k][1]]
|
||||
elif len(self.EM.Energy[k])==3:
|
||||
self.EM.Energy[k]=[self.EM.Energy[k][0]+dE,self.EM.Energy[k][1],self.EM.Energy[k][2]]
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,750 +0,0 @@
|
||||
import math
|
||||
|
||||
#-------------------------------------
|
||||
# Type Manager - exclusively called by OMLayout
|
||||
|
||||
class TypeManager:
|
||||
def __init__(self):
|
||||
self.library={} #----- dictionary to contain all the element and line definition
|
||||
self.typecase={'Solenoid':self.sol,'Photonics':self.xray,'Undulator':self.ID,'Vacuum':self.vac, \
|
||||
'Quadrupole':self.quad,'Corrector':self.cor,'Diagnostic':self.diag,'RF':self.rf, \
|
||||
'Dipole':self.bend,'Sextupole':self.sext, 'Marker':self.marker}
|
||||
|
||||
def info(self):
|
||||
for ele in self.library.keys():
|
||||
eledef=self.library[ele]
|
||||
for att in eledef.keys():
|
||||
if isinstance(eledef[att],str):
|
||||
print('\t',att," = '",eledef[att],"'")
|
||||
else:
|
||||
print('\t',att,' = ',eledef[att])
|
||||
print('\n')
|
||||
|
||||
|
||||
def define(self,name,properties): #----------- Routine to call when an element or line is defined
|
||||
indict={name:properties}
|
||||
self.library.update(indict)
|
||||
|
||||
def generate(self,name,index=0,option={}): # create an instance of the object based on the content of the dictionary 'library'
|
||||
prop=self.library[name]
|
||||
|
||||
#print ("name=", name)
|
||||
#print ("prop=", prop)
|
||||
|
||||
#Convert tuple to list
|
||||
if isinstance(prop,tuple):
|
||||
prop=list(prop)
|
||||
print ("tuple======== REPORT THIS PLEASE TO JAN CHRIN ======= ")
|
||||
|
||||
if isinstance(prop,list): #--------- is a line-----------------
|
||||
#print ("list")
|
||||
prop0=prop[0]
|
||||
L=0
|
||||
if 'Length' in prop0: #prop0.has_key('Length'):
|
||||
L=prop0['Length']
|
||||
name=''
|
||||
if 'Name' in option: #option.has_key('Name'):
|
||||
name=option['Name']
|
||||
obj=LineContainer(name,L)
|
||||
for ele in prop[1:len(prop)]:
|
||||
eletype=ele['Element']
|
||||
sRef=ele['sRef']
|
||||
index=0
|
||||
if 'index' in ele: #ele.has_key('index'):
|
||||
index=ele['index']
|
||||
if 'Option' in ele: #ele.has_key('Option'):
|
||||
opt=ele['Option']
|
||||
else:
|
||||
opt={}
|
||||
rel='absolute'
|
||||
if 'Ref' in ele: #ele.has_key('Ref'):
|
||||
if ele['Ref']=='relative':
|
||||
rel='relative'
|
||||
obj.append(self.generate(eletype,index,opt),sRef,rel)
|
||||
else:
|
||||
#print ("else other")
|
||||
obj=self.typecase[prop['Type']](prop) # is a simple element
|
||||
option['index']=index
|
||||
obj.__dict__.update(option)
|
||||
return obj
|
||||
|
||||
def xray(self,prop):
|
||||
return Photonic(prop)
|
||||
|
||||
def ID(self,prop):
|
||||
return Undulator(prop)
|
||||
|
||||
def vac(self,prop):
|
||||
return Vacuum(prop)
|
||||
|
||||
def quad(self,prop):
|
||||
return Quadrupole(prop)
|
||||
|
||||
def bend(self,prop):
|
||||
return Dipole(prop)
|
||||
|
||||
def sol(self,prop):
|
||||
return Solenoid(prop)
|
||||
|
||||
def sext(self,prop):
|
||||
return Sextupole(prop)
|
||||
|
||||
def cor(self,prop):
|
||||
return Corrector(prop)
|
||||
|
||||
def diag(self,prop):
|
||||
return Diagnostic(prop)
|
||||
|
||||
def rf(self,prop):
|
||||
return RF(prop)
|
||||
|
||||
def marker(self,prop):
|
||||
return Marker(prop)
|
||||
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Line Container
|
||||
|
||||
|
||||
class LineContainer:
|
||||
def __init__(self, namein='', Lin=0):
|
||||
self.Name=namein
|
||||
self.LengthRes=Lin
|
||||
self.Ref={}
|
||||
self.Element=[]
|
||||
self.sRef=0
|
||||
self.initiated=0
|
||||
self.output=1
|
||||
self.isFlat=0
|
||||
|
||||
def getLength(self):
|
||||
return self.getResLength()
|
||||
|
||||
def getResLength(self):
|
||||
if len(self.Element)==0:
|
||||
return self.LengthRes
|
||||
ele=self.Element[-1]
|
||||
slen=self.position(ele)+ele.getLength()
|
||||
if (self.LengthRes<0):
|
||||
return slen-self.LengthRes
|
||||
else:
|
||||
if (self.LengthRes<slen):
|
||||
return slen
|
||||
else:
|
||||
return self.LengthRes
|
||||
|
||||
|
||||
def position(self,ele): # Beginning of the element (Reserve length inclusive)
|
||||
Ref=self.Ref[ele]
|
||||
if Ref['ref']=='absolute':
|
||||
return Ref['pos']
|
||||
else:
|
||||
idx=self.Element.index(ele)-1
|
||||
srel=0
|
||||
if idx>=0:
|
||||
srel=self.position(self.Element[idx])+self.Element[idx].getResLength()
|
||||
if Ref['ref']=='relative':
|
||||
return srel+Ref['pos']
|
||||
else:
|
||||
idx=Ref['pos']
|
||||
angle=self.Element[idx].angle
|
||||
|
||||
return srel+Ref['ref'].len(angle)
|
||||
|
||||
def positionCenter(self,ele): # Centre of the element
|
||||
return self.position(ele)+ele.sRef+ele.getLength()*0.5
|
||||
|
||||
|
||||
def append(self, ele, sRef=0,Ref='absolute'):
|
||||
if isinstance(ele,list): # a quick waz to add a series of elements if thez are givien in a list
|
||||
sRef=0
|
||||
Ref='relative'
|
||||
for p in ele:
|
||||
self.Element.append(p)
|
||||
reference={'pos':sRef,'ref':Ref}
|
||||
self.Ref.update({p:reference})
|
||||
else: # otherwise a single element is added
|
||||
self.Element.append(ele)
|
||||
reference={'pos':sRef,'ref':Ref}
|
||||
self.Ref.update({ele:reference})
|
||||
|
||||
|
||||
def flatten(self,name,line,eleDB,secDB,corrDB): # this routine is called in the facilitycontainer class to remove all arbitrary nesting of containers
|
||||
if self.isFlat>0: # check whether a given line has been already flatten (needed for phase 2 lines
|
||||
if (len(self.Name)==7):
|
||||
line.append(self)
|
||||
return
|
||||
|
||||
self.Name=name+self.Name;
|
||||
|
||||
|
||||
if (len(self.Name)==7): # chgeck wether section length has 7 letters
|
||||
for ele in self.Element:
|
||||
ele.initiate(self.Name) # initiate all elements
|
||||
eleDB[ele.Name]=ele
|
||||
try:
|
||||
if ele.Type=='Corrector':
|
||||
#if ele.__dict__.has_key('cor') or ele.__dict__.has_key('corx'):
|
||||
if 'cor' in ele.__dict__ or 'corx' in ele.__dict__:
|
||||
eleDB[ele.Name.replace('COR','CRX')]=ele
|
||||
#if ele.__dict__.has_key('cory'):
|
||||
if 'cory' in ele.__dict__:
|
||||
eleDB[ele.Name.replace('COR','CRY')]=ele
|
||||
except:
|
||||
'Alignment elem??'
|
||||
if 'cor' in ele.__dict__ or 'corx' in ele.__dict__ or 'cory' in ele.__dict__:
|
||||
#if ele.__dict__.has_key('cor') or ele.__dict__.has_key('corx') or ele.__dict__.has_key('cory'):
|
||||
if ('MQUA' in ele.Name) or ('MBND' in ele.Name) or ('UIND' in ele.Name):
|
||||
#if ele.__dict__.has_key('cor') or ele.__dict__.has_key('corx'):
|
||||
if 'cor' in ele.__dict__ or 'corx' in ele.__dict__:
|
||||
cname=ele.Name.replace('MQUA','MCRX').replace('MBND','MCRX').replace('UIND','MCRX')
|
||||
prop={}
|
||||
prop['Name']=cname
|
||||
prop['Type']='Corrector'
|
||||
cele=Corrector(prop)
|
||||
corrDB[cname]=cele
|
||||
#if ele.__dict__.has_key('cory'):
|
||||
if 'cory' in ele.__dict__:
|
||||
cname=ele.Name.replace('MQUA','MCRY').replace('MBND','MCRY').replace('UIND','MCRY')
|
||||
prop={}
|
||||
prop['Name']=cname
|
||||
prop['Type']='Corrector'
|
||||
cele=Corrector(prop)
|
||||
corrDB[cname]=cele
|
||||
|
||||
line.append(self) # add section to beamline
|
||||
secDB[self.Name]=self # Revive sectionDB...09.06.2015 Masamitsu
|
||||
self.isFlat=1
|
||||
else:
|
||||
for ele in self.Element:
|
||||
ele.flatten(self.Name,line,eleDB,secDB,corrDB);
|
||||
|
||||
|
||||
def initiate(self,name=''):
|
||||
|
||||
self.Name=name+self.Name
|
||||
self.output=1
|
||||
for ele in self.Element:
|
||||
ele.initiate(self.Name)
|
||||
|
||||
|
||||
def setRange(self,start='start',end='end',out=0):
|
||||
|
||||
self.output=out # inherit output from parent container
|
||||
|
||||
if (start=='start'):
|
||||
start=self.Name
|
||||
if (self.Name==start): # start output if name math
|
||||
self.output=1
|
||||
|
||||
hasend=0
|
||||
output=self.output
|
||||
for ele in self.Element:
|
||||
if isinstance(ele,LineContainer):
|
||||
outchild=ele.setRange(start,end,output)
|
||||
#if outchild<>0: # Not valid in python3.x
|
||||
if outchild!=0: # if child is part of the range - parent has output
|
||||
self.output=1
|
||||
output=1
|
||||
if outchild==-1: # if child was last then
|
||||
output=0 # suppress output for following children
|
||||
hasend=1 # indicate parent that this is the last element
|
||||
|
||||
if (self.Name==end) or (hasend==1):
|
||||
return -1
|
||||
return self.output
|
||||
|
||||
|
||||
|
||||
#def writeLattice(self,CI,EM,app):
|
||||
# Change the order of input arguments and set defaults
|
||||
def writeLattice(self,app,EM=None):
|
||||
|
||||
if self.output==0:
|
||||
return 0
|
||||
|
||||
seq=[]
|
||||
Last=0
|
||||
|
||||
|
||||
if (len(self.Name)==7):
|
||||
for ele in self.Element:
|
||||
ds=self.position(ele)-Last
|
||||
app.writeDrift(ds)
|
||||
name=ele.writeElement(app,EM)
|
||||
Last=self.position(ele)+ele.getResLength()
|
||||
#if name<>0: # not valid in python3.x
|
||||
if name!=0:
|
||||
seq.append(ele)
|
||||
app.writeDrift(self.getResLength()-Last)
|
||||
app.writeLine(self,seq)
|
||||
baseseq={'Name':self.Name,'L':self.getResLength()}
|
||||
return baseseq
|
||||
else:
|
||||
for ele in self.Element:
|
||||
name=ele.writeLattice(app,EM)
|
||||
# if name<>0: # not valid in python3.x
|
||||
if name!=0:
|
||||
seq.append(name)
|
||||
if len(self.Name)>1:
|
||||
return seq
|
||||
else:
|
||||
app.writeLine(self,seq);
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class VariableContainer: # used to allow varibale length in the arm of a bunch compressor, stored in a line container
|
||||
def __init__(self,L=0,Loff=0):
|
||||
self.L=L
|
||||
self.Loff=Loff
|
||||
|
||||
def len(self,angle):
|
||||
dL=self.L/math.cos(angle*math.asin(1)/90)-self.Loff
|
||||
return dL
|
||||
|
||||
|
||||
#----------------------------
|
||||
# list of basic elements such as magnets, diagnostics etc. All are based on the SimpleContainer class
|
||||
|
||||
class SimpleContainer:
|
||||
|
||||
def __init__(self,prop):
|
||||
# makes sure that common elements are defined and calculates the length and reserved length
|
||||
if not('Name' in prop): #prop.has_key('Name')):
|
||||
prop.update({'Name':''})
|
||||
|
||||
if not('Baugruppe' in prop): #prop.has_key('Baugruppe')):
|
||||
prop.update({'Baugruppe':'none'})
|
||||
|
||||
if not('BG-Variant' in prop): #prop.has_key('BG-Variant')):
|
||||
prop.update({'BG-Variant':'A'})
|
||||
|
||||
if not('index' in prop): #prop.has_key('index')):
|
||||
prop.update({'index':0})
|
||||
|
||||
if not('p0' in prop): #prop.has_key('p0')):
|
||||
prop.update({'p0':0})
|
||||
|
||||
if not('Length' in prop): #prop.has_key('Length')):
|
||||
prop.update({'Length':0})
|
||||
|
||||
if not('LengthRes' in prop): #prop.has_key('LengthRes')):
|
||||
prop.update({'LengthRes':0})
|
||||
|
||||
if not('sRef' in prop): #prop.has_key('sRef')):
|
||||
prop.update({'sRef':-1})
|
||||
|
||||
if not('Tilt' in prop): #prop.has_key('Tilt')):
|
||||
prop.update({'Tilt':0})
|
||||
|
||||
self.__dict__.update(prop)
|
||||
|
||||
if self.LengthRes <=0 :
|
||||
self.LengthRes=self.Length
|
||||
self.sRef=0
|
||||
elif self.sRef >=0:
|
||||
LRes=self.sRef+self.Length
|
||||
if self.LengthRes < LRes:
|
||||
self.LengthRes=LRes
|
||||
else:
|
||||
if self.LengthRes < self.Length:
|
||||
self.sRef=0
|
||||
self.LengthRes=self.Length
|
||||
else:
|
||||
self.sRef=0.5*(self.LengthRes-self.Length)
|
||||
|
||||
|
||||
def __getitem__(self,field):
|
||||
exec('a=self.'+field)
|
||||
# fine for python2 and python3
|
||||
return locals()['a']
|
||||
|
||||
def getResLength(self):
|
||||
# return the reserved length for that element
|
||||
return self.LengthRes
|
||||
|
||||
def getLength(self):
|
||||
# return the length for that element
|
||||
return self.Length
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
return 0
|
||||
|
||||
|
||||
def initiate(self,name=""):
|
||||
# defined element name and local energy and the element entrance
|
||||
self.Name="%s.%s%3.3d" % (name,self.Tag,self.index)
|
||||
|
||||
|
||||
def register(self):
|
||||
return
|
||||
|
||||
#---------------------------------------
|
||||
# Base Elements
|
||||
|
||||
class Magnet(SimpleContainer):
|
||||
def __init__(self,prop):
|
||||
SimpleContainer.__init__(self, prop)
|
||||
if not('Group' in prop): #prop.has_key('Group')):
|
||||
self.__dict__.update({'Group':'Magnets'})
|
||||
|
||||
|
||||
|
||||
class Dipole(Magnet):
|
||||
def __init__(self, prop):
|
||||
Magnet.__init__(self,prop)
|
||||
if not('angle' in prop): #prop.has_key('angle')):
|
||||
self.__dict__.update({'angle':0})
|
||||
if not('design_angle' in prop): #prop.has_key('design_angle')):
|
||||
self.__dict__.update({'design_angle':0})
|
||||
if not('e1' in prop): #prop.has_key('e1')):
|
||||
self.__dict__.update({'e1':0})
|
||||
if not('e2' in prop): #prop.has_key('e2')):
|
||||
self.__dict__.update({'e2':0})
|
||||
if not('Tag' in prop): #prop.has_key('Tag')):
|
||||
self.__dict__.update({'Tag':'MBND'})
|
||||
|
||||
|
||||
def getResLength(self):
|
||||
if (self.angle==0):
|
||||
return self.LengthRes
|
||||
else:
|
||||
return self.LengthRes-self.Length+self.getLength()
|
||||
|
||||
def getLength(self):
|
||||
if (self.angle==0):
|
||||
return self.Length
|
||||
else:
|
||||
angrad=math.asin(1)*self.angle/90.
|
||||
if self.e1==0 or self.e2==0:
|
||||
Lpath=self.Length/math.sin(angrad)*angrad
|
||||
else:
|
||||
Lpath=0.5*self.Length/math.sin(angrad*0.5)*angrad
|
||||
return Lpath
|
||||
|
||||
#def register(self,CI=None):
|
||||
# if CI:
|
||||
# CI.registerChannel(self.Name,'angle')
|
||||
# if self.__dict__.has_key('cor'):
|
||||
# CI.registerChannel(self.Name,'cor')
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
#if CI:
|
||||
# self.angle=CI.getValue(self.Name,'angle')
|
||||
# if self.__dict__.has_key('cor'):
|
||||
# self.cor=CI.getValue(self.Name,'cor')
|
||||
if EM:
|
||||
EA=EM.EnergyAt(self)
|
||||
self.p0=EA[0] # Beam energy may be needed for some purpose, namely CSR
|
||||
app.writeBend(self)
|
||||
return self.Name
|
||||
|
||||
|
||||
|
||||
class Quadrupole(Magnet):
|
||||
def __init__(self, prop):
|
||||
Magnet.__init__(self,prop)
|
||||
if not('k1' in prop): #prop.has_key('k1')):
|
||||
self.__dict__.update({'k1':0})
|
||||
if not('Tag' in prop): #prop.has_key('Tag')):
|
||||
self.__dict__.update({'Tag':'MQUA'})
|
||||
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
# MADExclude flag becomes 'Overlap' flag, which is more general name and may be used in other applications
|
||||
#if (app.isType('madx')):
|
||||
# if self.__dict__.has_key('MADExclude'):
|
||||
# if self.MADExclude==1:
|
||||
# return 0
|
||||
|
||||
#if CI:
|
||||
# self.k1=CI.getValue(self.Name,'k1')
|
||||
# if self.__dict__.has_key('corx'):
|
||||
# self.corx=CI.getValue(self.Name,'corx')
|
||||
# if self.__dict__.has_key('cory'):
|
||||
# self.cory=CI.getValue(self.Name,'cory')
|
||||
app.writeQuadrupole(self)
|
||||
return self.Name
|
||||
|
||||
|
||||
#def register(self,CI=None):
|
||||
# if CI:
|
||||
# CI.registerChannel(self.Name,'k1')
|
||||
# if self.__dict__.has_key('corx'):
|
||||
# CI.registerChannel(self.Name,'corx')
|
||||
# if self.__dict__.has_key('cory'):
|
||||
# CI.registerChannel(self.Name,'cory')
|
||||
|
||||
|
||||
|
||||
class Sextupole(Magnet):
|
||||
def __init__(self, prop):
|
||||
Magnet.__init__(self,prop)
|
||||
if not('k2' in prop): #prop.has_key('k2')):
|
||||
self.__dict__.update({'k2':0})
|
||||
if not('Tag' in prop): #prop.has_key('Tag')):
|
||||
self.__dict__.update({'Tag':'MSEX'})
|
||||
|
||||
#def register(self,CI=None):
|
||||
# if CI:
|
||||
# CI.registerChannel(self.Name,'k2')
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
#if CI:
|
||||
# self.k2=CI.getValue(self.Name,'k2')
|
||||
app.writeSextupole(self)
|
||||
return self.Name
|
||||
|
||||
|
||||
class Solenoid(Magnet):
|
||||
def __init__(self, prop):
|
||||
Magnet.__init__(self,prop)
|
||||
if not('ks' in prop): #prop.has_key('ks')):
|
||||
self.__dict__.update({'ks':0})
|
||||
if not('Tag' in prop): #prop.has_key('Tag')):
|
||||
self.__dict__.update({'Tag':'MSOL'})
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
#if CI:
|
||||
# self.ks=CI.getValue(self.Name,'ks')
|
||||
app.writeSolenoid(self)
|
||||
return self.Name
|
||||
|
||||
#def register(self,CI=None):
|
||||
# if CI:
|
||||
# CI.registerChannel(self.Name,'ks')
|
||||
|
||||
|
||||
class Corrector(Magnet):
|
||||
def __init__(self, prop):
|
||||
Magnet.__init__(self,prop)
|
||||
|
||||
|
||||
#def register(self,CI=None):
|
||||
# if CI:
|
||||
# if self.__dict__.has_key('corx'):
|
||||
# CI.registerChannel(self.Name,'corx')
|
||||
# if self.__dict__.has_key('cory'):
|
||||
# CI.registerChannel(self.Name,'cory')
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
#if CI:
|
||||
# if self.__dict__.has_key('corx'):
|
||||
# CI.getValue(self.Name,'corx')
|
||||
# if self.__dict__.has_key('cory'):
|
||||
# CI.getValue(self.Name,'cory')
|
||||
app.writeCorrector(self)
|
||||
return self.Name
|
||||
|
||||
|
||||
# -------
|
||||
|
||||
class Vacuum(SimpleContainer):
|
||||
def __init__(self, prop):
|
||||
SimpleContainer.__init__(self,prop)
|
||||
if not('Group' in prop): #prop.has_key('Group')):
|
||||
self.__dict__.update({'Group':'Vacuum'})
|
||||
|
||||
#def register(self,CI=None):
|
||||
# return
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
app.writeVacuum(self)
|
||||
return self.Name
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# -------
|
||||
|
||||
class Undulator(SimpleContainer):
|
||||
def __init__(self, prop):
|
||||
SimpleContainer.__init__(self,prop)
|
||||
if not('Group' in prop): #prop.has_key('Group')):
|
||||
self.__dict__.update({'Group':'ID'})
|
||||
if not('K' in prop): #prop.has_key('K')):
|
||||
self.__dict__.update({'K':0})
|
||||
if not('ku' in prop): #prop.has_key('ku')):
|
||||
self.__dict__.update({'ku':0})
|
||||
if not('kx' in prop): #prop.has_key('kx')):
|
||||
self.__dict__.update({'kx':0})
|
||||
if not('ky' in prop): #prop.has_key('ky')):
|
||||
self.__dict__.update({'ky':1})
|
||||
if not('Tag' in prop): #prop.has_key('Tag')):
|
||||
self.__dict__.update({'Tag':'UIND'})
|
||||
if not('Power' in prop): #prop.has_key('Power')):
|
||||
self.__dict__.update({'Power':0})
|
||||
if not('Waist' in prop): #prop.has_key('Waist')):
|
||||
self.__dict__.update({'Waist':1})
|
||||
|
||||
|
||||
#def register(self,CI=None):
|
||||
# if CI:
|
||||
# CI.registerChannel(self.Name,'K')
|
||||
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
#if CI:
|
||||
# self.K=CI.getValue(self.Name,'K')
|
||||
if EM:
|
||||
EA=EM.EnergyAt(self)
|
||||
self.p0=EA[0]
|
||||
self.dP=EA[1]
|
||||
else:
|
||||
self.p0=1e9
|
||||
app.writeUndulator(self)
|
||||
return self.Name
|
||||
|
||||
|
||||
|
||||
# --------------
|
||||
|
||||
class RF(SimpleContainer):
|
||||
def __init__(self, prop):
|
||||
SimpleContainer.__init__(self,prop)
|
||||
if not('Gradient' in prop): #prop.has_key('Gradient')):
|
||||
self.__dict__.update({'Gradient':0})
|
||||
if not('Phase' in prop): #prop.has_key('Phase')):
|
||||
self.__dict__.update({'Phase':0})
|
||||
if not('Band' in prop): #prop.has_key('Band')):
|
||||
self.__dict__.update({'Band':'S'})
|
||||
if not('Frequency' in prop): #prop.has_key('Frequency')):
|
||||
f0=5.712e9
|
||||
if 'S' in self.Band:
|
||||
f0=2.9988e9
|
||||
if 'X' in self.Band:
|
||||
f0=11.9952e9
|
||||
self.__dict__.update({'Frequency':f0})
|
||||
if not('Tag' in prop): #prop.has_key('Tag')):
|
||||
self.__dict__.update({'Tag':'RACC'})
|
||||
if not('Group' in prop): #prop.has_key('Group')):
|
||||
self.__dict__.update({'Group':'RF'})
|
||||
|
||||
# Enable flag for TDS as well as in the diagnostics
|
||||
if 'TDS' in prop['Baugruppe']:
|
||||
self.__dict__.update({'enable':0})
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
#if CI:
|
||||
# self.Gradient=CI.getValue(self.Name,'Gradient')
|
||||
# self.Phase=CI.getValue(self.Name,'Phase')
|
||||
if EM:
|
||||
EA=EM.EnergyAt(self)
|
||||
self.p0=EA[0]
|
||||
self.dP=EA[1]
|
||||
else:
|
||||
self.p0=1e9 # set it to 1 GeV if EM is not available...
|
||||
app.writeRF(self)
|
||||
# Energy manager is in charge of this...
|
||||
#if self.Tag=='RACC':
|
||||
# if EM:
|
||||
# EM.update(self.p0+self.Gradient/511000*math.sin(self.Phase*math.asin(1)/90)*self.Length)
|
||||
return self.Name
|
||||
|
||||
|
||||
#def register(self,CI=None):
|
||||
# if CI:
|
||||
# CI.registerChannel(self.Name,'Gradient')
|
||||
# CI.registerChannel(self.Name,'Phase')
|
||||
|
||||
# -----
|
||||
|
||||
class Diagnostic(SimpleContainer):
|
||||
def __init__(self, prop):
|
||||
SimpleContainer.__init__(self,prop)
|
||||
if not('Seval' in prop): #prop.has_key('Seval')):
|
||||
self.__dict__.update({'Seval':-1})
|
||||
if not('Cx' in prop): #prop.has_key('Cx')):
|
||||
self.__dict__.update({'Cx':1})
|
||||
if not('Cy' in prop): #prop.has_key('Cy')):
|
||||
self.__dict__.update({'Cy':1})
|
||||
if not('Cz' in prop): #prop.has_key('Cz')):
|
||||
self.__dict__.update({'Cz':0})
|
||||
if not('Sx' in prop): #prop.has_key('Sx')):
|
||||
self.__dict__.update({'Sx':0})
|
||||
if not('Sy' in prop): #prop.has_key('Sy')):
|
||||
self.__dict__.update({'Sy':0})
|
||||
if not('Sz' in prop): #prop.has_key('Sz')):
|
||||
self.__dict__.update({'Sz':0})
|
||||
if not('Distribution' in prop): #prop.has_key('Distribution')):
|
||||
self.__dict__.update({'Distribution':0})
|
||||
if not('Tag' in prop): #prop.has_key('Tag')):
|
||||
self.__dict__.update({'Tag':'DBPM'})
|
||||
if not('Group' in prop): #prop.has_key('Group')):
|
||||
self.__dict__.update({'Group':'Diagnostics'})
|
||||
if not('enable' in prop): #prop.has_key('enable')):
|
||||
self.__dict__.update({'enable':0})
|
||||
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
app.writeDiagnostic(self)
|
||||
return self.Name
|
||||
|
||||
#def register(self,CI=None):
|
||||
# if CI:
|
||||
# if self.__dict__.has_key('Cx'):
|
||||
# CI.registerChannel(self.Name,'Cx')
|
||||
# if self.__dict__.has_key('Cy'):
|
||||
# CI.registerChannel(self.Name,'Cy')
|
||||
# if self.__dict__.has_key('Cz'):
|
||||
# CI.registerChannel(self.Name,'Cz')
|
||||
# if self.__dict__.has_key('Sx'):
|
||||
# CI.registerChannel(self.Name,'Sx')
|
||||
# if self.__dict__.has_key('Sy'):
|
||||
# CI.registerChannel(self.Name,'Sy')
|
||||
# if self.__dict__.has_key('Sz'):
|
||||
# CI.registerChannel(self.Name,'Sz')
|
||||
|
||||
|
||||
class Photonic(Diagnostic):
|
||||
def __init__(self, prop):
|
||||
prop.update({'Group':'Photonics'})
|
||||
if not('Tag' in prop): #prop.has_key('Tag')):
|
||||
prop.update({'Tag':'PPRM'})
|
||||
Diagnostic.__init__(self,prop)
|
||||
|
||||
|
||||
|
||||
class Alignment(SimpleContainer):
|
||||
def __init__(self, prop):
|
||||
SimpleContainer.__init__(self,prop)
|
||||
if not('Group' in prop): #prop.has_key('Group')):
|
||||
self.__dict__.update({'Group':'Alignment'})
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
app.writeAlignment(self)
|
||||
return self.Name
|
||||
|
||||
def getLength(self):
|
||||
# return the reserved length for that element
|
||||
return 0
|
||||
|
||||
|
||||
#def initiate(self,dummy):
|
||||
# return
|
||||
|
||||
|
||||
class Marker(SimpleContainer):
|
||||
def __init__(self, prop):
|
||||
SimpleContainer.__init__(self,prop)
|
||||
if not('Group' in prop): #prop.has_key('Group')):
|
||||
self.__dict__.update({'Group':'Marker'})
|
||||
|
||||
def writeElement(self,app,EM):
|
||||
app.writeMarker(self)
|
||||
return self.Name
|
||||
|
||||
def getLength(self):
|
||||
# return the reserved length for that element
|
||||
return 0
|
||||
|
||||
|
||||
#def register(self,CI=None):
|
||||
# return
|
||||
|
||||
# -------
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
### Machine Lattice
|
||||
|
||||
- Current: [11.0.1](Release/HolyList-Latest-Phase-Current.xlsx) _(Released: 14/08/2025 - 10:23:57)_
|
||||
- Planned: [11.0.1](Release/HolyList-Latest-Phase-Planned.xlsx) _(Released: 14/08/2025 - 10:23:57)_
|
||||
- Final: [11.0.1](Release/HolyList-Latest-Phase-Final.xlsx) _(Released: 14/08/2025 - 10:23:57)_
|
||||
- Current: [11.0.1](Release/HolyList-Latest-Phase-Current.xlsx) _(Released: 18/08/2025 - 14:57:36)_
|
||||
- Planned: [11.0.1](Release/HolyList-Latest-Phase-Planned.xlsx) _(Released: 18/08/2025 - 14:57:36)_
|
||||
- Final: [11.0.1](Release/HolyList-Latest-Phase-Final.xlsx) _(Released: 18/08/2025 - 14:57:36)_
|
||||
|
||||
|
||||
### Optical Beamlines
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user