Update Lattice for new Athos linac and collimation
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s

This commit is contained in:
2025-11-21 11:51:22 +01:00
parent 18b32fd3a3
commit e6ccbb3965

View File

@@ -305,8 +305,12 @@ import math
# Layout 11.0.2
# Refinement on SF+ Lattice
# Marking new elements with the type SFPlus- in the description
# 1) Marking new elements with the type SFPlus- in the description
# 2) add an additional AC resonant kick for Switchyard
# 3) Extended Athos Linac to 3 station - though it might be operated by 2 station with 6 cavities each
# 4) Moved dechirpers after beam stopper.
# 5) Extended after burner in Aramis to 3 elements
# 6) Added collimator spoilers in Athos
class SwissFEL:
def __init__(self,alt=0):
@@ -734,6 +738,8 @@ class SwissFEL:
a5alt={'Element':'DBPM-C8','sRef':0.173,'Ref':'relative','index':70}
seq=[a0,a1cor,a1,a2,a3cor,a3,a5alt,a6]
TM.define('U15-Cell-Last',seq)
seq = [a0, a1cor, a1, a2ab, a3cor, a3, a5alt, a6]
TM.define('U12-Cell-AB-Last', seq)
a2after={'Element':'UAfterburner','sRef':0.0575,'Ref':'relative','index':30}
seq=[a0,a1cor,a1,a2after,a3cor,a3,a5alt,a6]
TM.define('UAfter',seq)
@@ -1294,13 +1300,14 @@ class SwissFEL:
else:
SY01 = LineContainer('SY01', -0.2)
SY01.append(TM.generate('QFD', 5), 0.2, 'relative')
SY01.append(TM.generate('QFD', 20), 3, 'relative')
SY01.append(TM.generate('QFD', 30), 3, 'relative')
SY01.append(TM.generate('QFD', 50), 3, 'relative')
SY01.append(TM.generate('QFD', 80), 4, 'relative')
SY01.append(TM.generate('QFD', 20), 3-0.25, 'relative')
SY01.append(TM.generate('QFD', 30), 3-0.25, 'relative')
SY01.append(TM.generate('QFD', 50), 3-0.25, 'relative')
SY01.append(TM.generate('QFD', 80), 4-0.25, 'relative')
SY02 = LineContainer('SY02', -0.7502)
SY02.append(TM.generate('RESKICKDC', 10, {'design_kick': 0}), 0.285, 'relative')
SY02.append(TM.generate('RESKICKAC', 5, {'design_kick': 0}), 0.285, 'relative')
SY02.append(TM.generate('RESKICKDC', 10, {'design_kick': 0}), 0.0, 'relative')
SY02.append(TM.generate('RESKICKAC', 20, {'design_kick': 0}), 0.0, 'relative')
SY02.append(TM.generate('RESKICKDC', 30, {'design_kick': 0}), 0.0, 'relative')
SY02.append(TM.generate('RESKICKAC', 40, {'design_kick': 0}), 0.0, 'relative')
@@ -1595,9 +1602,9 @@ class SwissFEL:
UN14=TM.generate('U15-Cell',0,{'Name':'UN14'})
if self.alt==2:
UN15 = TM.generate('U15-Cell', 0, {'Name': 'UN15'})
UN16 = TM.generate('U15-Cell', 0, {'Name': 'UN16'})
UN16 = TM.generate('U12-Cell-AB', 0, {'Name': 'UN16'})
UN17 = TM.generate('U12-Cell-AB', 0, {'Name': 'UN17'})
UN18 = TM.generate('U12-Cell-AB', 0, {'Name': 'UN18'})
UN18 = TM.generate('U12-Cell-AB-Last', 0, {'Name': 'UN18'})
UN19 = TM.generate('U15-Cell-Empty', 0, {'Name': 'UN19'})
UN20 = LineContainer('UN20',4.3)
UN20.append(TM.generate('TDS X-Band', 100), 0.1, 'relative')
@@ -1806,9 +1813,10 @@ class SwissFEL:
CL01.append(TM.generate('QFD',190),2.5-0.0263,'relative')
CL01.append(TM.generate('AFBC3',300,{'angle':-2.5,'design_angle':-2.5,'e1':1,'e2':0.,'BC':'Switch Yard 2'}),0.85-0.137+0.0263+0.05+0.237,'relative')
DI01=LineContainer('DI01', 18.52)
if self.alt < 2:
DI01=LineContainer('DI01', 18.52)
else:
DI01 = LineContainer('DI01', -0.2)
DI01.append(TM.generate('DBCM-IR',10),0.4,'relative')
DI01.append(TM.generate('DICT-C16',20),0.46-0.1,'relative')
DI01.append(TM.generate('QFD',25),0.15,'relative')
@@ -1833,31 +1841,29 @@ class SwissFEL:
DI01.append(TM.generate('DBPM-C16',90),0.063,'relative')
DI01.append(TM.generate('COL-Dechirper-V',100,{'gap':2e-3}),0.5+0.087,'relative')
DI01.append(TM.generate('COL-Dechirper-H',200,{'gap':2e-3}),0.5+0.35,'relative')
DI01.append(TM.generate('DBPM-C16',210),0.5+0.019+0.115+0.327-0.437,'relative')
DI01.append(TM.generate('QFD',220),0.081,'relative')
# DI01.append(TM.generate('DBPM-C16',222),0.5+0.019+2+3.58-0.23-0.255-4.975,'relative')
# DI01.append(TM.generate('QFD',225),0.1-0.019,'relative')
DI01.append(TM.generate('QFD',230),1.25+0.7+0.37,'relative')
DI01.append(TM.generate('DBPM-C16',240),1.05-0.001,'relative')
DI01.append(TM.generate('QFD',250),0.101,'relative')
DI01.append(TM.generate('QFD',260),1.25,'relative')
DI01.append(TM.generate('DBPM-C16',270),1.05-0.021,'relative')
DI01.append(TM.generate('QFD',280),0.121,'relative')
DI01.append(TM.generate('DWSC-C16',290),0.1+0.729,'relative')
DI01.append(TM.generate('QFD',300),0.163+0.137+0.85-0.237-0.729,'relative')
DI01.append(TM.generate('DBPM-C16',310),0.04,'relative')
if self.alt < 2:
DI01.append(TM.generate('DBPM-C16', 210), 0.5 + 0.019 + 0.115 + 0.327 - 0.437, 'relative')
DI01.append(TM.generate('QFD', 220), 0.081, 'relative')
DI01.append(TM.generate('QFD', 230), 1.25 + 0.7 + 0.37, 'relative')
DI01.append(TM.generate('DBPM-C16', 240), 1.05 - 0.001, 'relative')
DI01.append(TM.generate('QFD', 250), 0.101, 'relative')
DI01.append(TM.generate('QFD',260),1.25,'relative')
DI01.append(TM.generate('DBPM-C16',270),1.05-0.021,'relative')
DI01.append(TM.generate('QFD',280),0.121,'relative')
DI01.append(TM.generate('DWSC-C16',290),0.1+0.729,'relative')
DI01.append(TM.generate('QFD',300),0.163+0.137+0.85-0.237-0.729,'relative')
DI01.append(TM.generate('DBPM-C16',310),0.04,'relative')
# needs a wire scanner here
CB01=LineContainer('CB01',9.8)
CB01.append(TM.generate('TW Cav C-Band', 100), 0.035, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 200), 0.049387, 'relative')
CB01.append(TM.generate('DBPM-C16', 220), 0.080613, 'relative')
CB01.append(TM.generate('QFD', 230), 0.049, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 300), 0.096075 + 0.137 + 0.019, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 400), 0.049387, 'relative')
CB01.append(TM.generate('DBPM-C16', 420), 0.099538, 'relative')
CB01.append(TM.generate('QFD', 430), 0.049, 'relative')
if self.alt < 2:
CB01=LineContainer('CB01',9.8)
CB01.append(TM.generate('TW Cav C-Band', 100), 0.035, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 200), 0.049387, 'relative')
CB01.append(TM.generate('DBPM-C16', 220), 0.080613, 'relative')
CB01.append(TM.generate('QFD', 230), 0.049, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 300), 0.096075 + 0.137 + 0.019, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 400), 0.049387, 'relative')
CB01.append(TM.generate('DBPM-C16', 420), 0.099538, 'relative')
CB01.append(TM.generate('QFD', 430), 0.049, 'relative')
CB02=LineContainer('CL02',9.8)
CB02.append(TM.generate('COL-Dechirper-V',100,{'gap':2e-3}),0.5+0.528-0.003,'relative')
CB02.append(TM.generate('COL-Dechirper-H',200,{'gap':2e-3}),0.5-0.528+0.875+0.003,'relative')
@@ -1868,15 +1874,45 @@ class SwissFEL:
CB02.append(TM.generate('DBPM-C16',420),0.099538+1.40146-1.09208,'relative')
CB02.append(TM.generate('QFD',430),0.049,'relative')
else:
DI01.append(TM.generate('DBPM-C16', 210), 0.5 + 0.019 + 0.115 + 0.327 - 0.437, 'relative')
DI01.append(TM.generate('QFD', 220), 0.081, 'relative')
DI01.append(TM.generate('QFD', 230), 1.25 + 0.7 + 0.37-0.3611, 'relative')
DI01.append(TM.generate('DBPM-C16', 240), 1.05 - 0.001, 'relative')
DI01.append(TM.generate('QFD', 250), 0.101, 'relative')
# needs a wire scanner here
CB01 = LineContainer('CB01', 9.8)
CB01.append(TM.generate('TW Cav C-Band', 100), 0.035, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 200), 0.049387, 'relative')
CB01.append(TM.generate('DBPM-C16', 220), 0.080613, 'relative')
CB01.append(TM.generate('QFD', 230), 0.049, 'relative')
CB01.append(TM.generate('COL-TR-16', 240), 0.019, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 300), 0.096075, 'relative')
CB01.append(TM.generate('TW Cav C-Band', 400), 0.049387, 'relative')
CB01.append(TM.generate('DBPM-C16', 420), 0.099538, 'relative')
CB01.append(TM.generate('QFD', 430), 0.049, 'relative')
CB01.append(TM.generate('COL-TR-16', 440), 0.019, 'relative')
CB02 = LineContainer('CB02', 9.8)
CB02.append(TM.generate('TW Cav C-Band', 100), 0.035, 'relative')
CB02.append(TM.generate('TW Cav C-Band', 200), 0.049387, 'relative')
CB02.append(TM.generate('DBPM-C16', 220), 0.080613, 'relative')
CB02.append(TM.generate('QFD', 230), 0.049, 'relative')
CB02.append(TM.generate('TW Cav C-Band', 300), 0.096075 + 0.137 + 0.019, 'relative')
CB02.append(TM.generate('COL-TR-16', 240), 0.019, 'relative')
CB02.append(TM.generate('TW Cav C-Band', 300), 0.096075, 'relative')
CB02.append(TM.generate('TW Cav C-Band', 400), 0.049387, 'relative')
CB02.append(TM.generate('DBPM-C16', 420), 0.099538, 'relative')
CB02.append(TM.generate('QFD', 430), 0.049, 'relative')
CB02.append(TM.generate('COL-TR-16', 440), 0.019, 'relative')
CB03 = LineContainer('CB03', 9.8)
CB03.append(TM.generate('TW Cav C-Band', 100), 0.035, 'relative')
CB03.append(TM.generate('TW Cav C-Band', 200), 0.049387, 'relative')
CB03.append(TM.generate('DBPM-C16', 220), 0.080613, 'relative')
CB03.append(TM.generate('QFD', 230), 0.049, 'relative')
CB03.append(TM.generate('COL-TR-16', 240), 0.019, 'relative')
CB03.append(TM.generate('TW Cav C-Band', 300), 0.096075, 'relative')
CB03.append(TM.generate('TW Cav C-Band', 400), 0.049387, 'relative')
CB03.append(TM.generate('DBPM-C16', 420), 0.099538, 'relative')
CB03.append(TM.generate('QFD', 430), 0.049, 'relative')
CB03.append(TM.generate('COL-TR-16', 440), 0.019, 'relative')
# here the missing part of the Athos comes only in the later phase (planned and final)
@@ -1884,31 +1920,43 @@ class SwissFEL:
LMA01 = 0
MA01=LineContainer('MA01',LMA01)
angle=0
MA01.append(TM.generate('DBPM-C8',10),0.293+0.102-0.257,'relative')
MA01.append(TM.generate('COL-Dechirper-V',15,{'gap':2e-3}),0.5+0.257-0.202,'relative')
MA01.append(TM.generate('DBPM-C8',20),0.5-0.051-0.1285+0.202,'relative')
if self.alt > 1:
MA01.append(TM.generate('COL-Dechirper-H',25,{'gap':2e-3}),0.5+0.1285-0.2155,'relative')
MA01.append(TM.generate('DSCR-HR8',30),0.28-0.037-0.051+0.2155,'relative')
else:
MA01.append(TM.generate('DSCR-HR8',30),0.28-0.037-0.051+0.2155+0.5+0.1285-0.2155+1,'relative')
MA01.append(TM.generate('DSCR-HR8', 30), 0,'relative')
MA01.append(TM.generate('AFP1', 100, {'angle': 0, 'e1': 0, 'e2': 1}), 0.1-0.0709, 'relative')
MA01.append(TM.generate('Beam-Stopper-Sat', 105), 0.881, 'relative')
MA01.append(TM.generate('DBPM-C8', 110), 1.477, 'relative')
MA01.append(TM.generate('QFF', 120), 0.06, 'relative')
MA01.append(TM.generate('COL-Dechirper-V', 122, {'gap': 2e-3}), 0.5, 'relative')
MA01.append(TM.generate('COL-Dechirper-H', 125, {'gap': 2e-3}), 0.5, 'relative')
MA01.append(TM.generate('DBPM-C8', 130), 1, 'relative')
MA01.append(TM.generate('QFF', 140), 0.06, 'relative')
MA01.append(TM.generate('COL-Dechirper-V', 142, {'gap': 2e-3}), 0.5, 'relative')
MA01.append(TM.generate('COL-Dechirper-H', 145, {'gap': 2e-3}), 0.5, 'relative')
MA01.append(TM.generate('DBPM-C8', 150), 1., 'relative')
MA01.append(TM.generate('QFF', 160), 0.06, 'relative')
MA01.append(TM.generate('DBPM-C8', 170), 4., 'relative')
MA01.append(TM.generate('QFF', 180), 0.06, 'relative')
else:
MA01.append(TM.generate('DBPM-C8', 10), 0.293 + 0.102 - 0.257, 'relative')
MA01.append(TM.generate('COL-Dechirper-V', 15, {'gap': 2e-3}), 0.5 + 0.257 - 0.202, 'relative')
MA01.append(TM.generate('DBPM-C8', 20), 0.5 - 0.051 - 0.1285 + 0.202, 'relative')
MA01.append(TM.generate('DSCR-HR8',30),0.28-0.037-0.051+0.2155+0.5+0.1285-0.2155+1,'relative')
MA01.append(TM.generate('DBPM-C8', 40), 0.12, 'relative')
MA01.append(TM.generate('QFF', 50), 0.06, 'relative')
MA01.append(TM.generate('AFP1', 100, {'angle': 0, 'e1': 0, 'e2': 1}), 0.175 + 0.177, 'relative')
MA01.append(TM.generate('Beam-Stopper-Sat', 105), 0.881, 'relative')
MA01.append(TM.generate('DBPM-C8', 110), 1.477, 'relative')
MA01.append(TM.generate('QFF', 120), 0.06, 'relative')
MA01.append(TM.generate('DBPM-C8', 130), 4, 'relative')
MA01.append(TM.generate('QFF', 140), 0.06, 'relative')
MA01.append(TM.generate('DBPM-C8', 150), 4., 'relative')
MA01.append(TM.generate('QFF', 160), 0.06, 'relative')
MA01.append(TM.generate('DBPM-C8', 170), 4., 'relative')
MA01.append(TM.generate('QFF', 180), 0.06, 'relative')
MA01.append(TM.generate('DBPM-C8',40),0.12,'relative')
MA01.append(TM.generate('QFF',50),0.06,'relative')
MA01.append(TM.generate('AFP1',100,{'angle':0,'e1':0,'e2':1}),0.175+0.177,'relative')
MA01.append(TM.generate('Beam-Stopper-Sat',105),0.881,'relative')
angcal=0.1
MA01.append(TM.generate('DBPM-C8',110),1.477,'relative')
MA01.append(TM.generate('QFF',120),0.06,'relative')
MA01.append(TM.generate('DBPM-C8',130),4,'relative')
MA01.append(TM.generate('QFF',140),0.06,'relative')
MA01.append(TM.generate('DBPM-C8',150),4.,'relative')
MA01.append(TM.generate('QFF',160),0.06,'relative')
MA01.append(TM.generate('DBPM-C8',170),4.,'relative')
MA01.append(TM.generate('QFF',180),0.06,'relative')
MA01.append(TM.generate('QFF',230),1-0.18+0.4043,'relative')
MA01.append(TM.generate('DBPM-C8',240),0.06+0.6,'relative')
MA01.append(TM.generate('QFF',250),1-0.18-0.16-0.6,'relative')
@@ -1918,10 +1966,8 @@ class SwissFEL:
MA01.append(TM.generate('AFBC3',600,{'angle':2.3,'design_angle':2.3,'e1':1,'e2':0,'BC':'Athos EEHG first BC'}),3.47,'relative')
MA01.append(TM.generate('QFD',610),0.06+0.22,'relative') # reserve space for 9.5 m chicane (4x 0.5m Dipole, 2x3m long drift, 3x 0.5m short drift)
MA01.append(TM.generate('DBPM-C16',620),0.2+0.0438,'relative')
MA01.append(TM.generate('QFDM',630),1-0.18-0.17-0.3-0.25-0.0438,'relative')
MA01.append(TM.generate('QFD-short',640),1-0.18-0.17-0.25-0.07+0.05,'relative')
MA01.append(TM.generate('QFDM',630),1-0.18-0.17-0.3-0.25-0.0438,'relative')
MA01.append(TM.generate('QFD-short',640),1-0.18-0.17-0.25-0.07+0.05,'relative')
UN04=LineContainer('UN04',3.0247+0.0027+0.0925+0.07+0.0852+0.0196+0.0968+0.0032) # modulator
UN04.append(TM.generate('DBPM-C16',10),0.008+0.0968-0.05,'relative')
UN04.append(TM.generate('DSCR-HR16',20),0.05+0.0293+0.1925-0.2218+0.07,'relative')
@@ -2031,7 +2077,7 @@ class SwissFEL:
if self.alt < 2:
AtLine=[SY01,SY02,SY03,CL01,DI01,CB01,CB02,MA01,UN04,UN05,UN06,UN07,UN08,UN09,UN10,UN11,UN12,UN13,SS,UN14,UN15,UN16,UN17,UN18,UN19,UN20,UN21,MA02,BD01]
else:
AtLine = [SY01, SY02, SY03, BC01, CL01, DI01, CB01, CB02, MA01, UN04, UN05, UN06, UN07, UN08, UN09, UN10, UN11,
AtLine = [SY01, SY02, SY03, BC01, CL01, DI01, CB01, CB02, CB03, MA01, UN04, UN05, UN06, UN07, UN08, UN09, UN10, UN11,
UN12, UN13, UN14, UN15, SS, UN16, UN17, UN18, UN19, UN20, UN21, UN22, UN23, UN24, UN25, MA02, BD01]
Athos=LineContainer('AT')
Athos.append(AtLine)