From c362776d3fcfde036ae789d6c60a4f9b994486af Mon Sep 17 00:00:00 2001 From: Sven Date: Thu, 15 Jan 2026 11:23:06 +0100 Subject: [PATCH] Layout 11.0.6 - Added diagnostics into phase final for switchyard and optimized quadrupole types according to required field strength --- Python_Code/onlinemodel/layout/layout.py | 120 +++++++++++++++-------- 1 file changed, 77 insertions(+), 43 deletions(-) diff --git a/Python_Code/onlinemodel/layout/layout.py b/Python_Code/onlinemodel/layout/layout.py index 49d87fd..d6dc2e9 100644 --- a/Python_Code/onlinemodel/layout/layout.py +++ b/Python_Code/onlinemodel/layout/layout.py @@ -325,10 +325,16 @@ import math # Layout 11.0.5 # 1) Implement moved skew quad in phase current to match installation in winter shutdown 2025/2026 +# Layout 11.0.6 +# 1) Optimize quadrupole type in switchyard for strength +# 2) Instrument SATSY01-SATBC01 with diagnostics +# 3) Instrument Switchyard with addition quadrupoles (sextupole, skew quadrupoles, QFM correctors) +# 4) Instument S20BC01 with diagnostics. + class SwissFEL: def __init__(self,alt=0): self.alt=alt - self.Version='11.0.5' + self.Version='11.0.6' def Types(self,TM): # type definitions for the SwissFEL lattice @@ -1320,9 +1326,11 @@ class SwissFEL: else: SY01 = LineContainer('SY01', -0.2) SY01.append(TM.generate('QFD', 10), 0.2, 'relative') - SY01.append(TM.generate('QFD', 20), 2, 'relative') - SY01.append(TM.generate('QFD', 30), 2, 'relative') + SY01.append(TM.generate('DBPM-C16', 20), 1.8, 'relative') + SY01.append(TM.generate('QFD', 30), 0.1, 'relative') SY01.append(TM.generate('QFD', 40), 2, 'relative') + SY01.append(TM.generate('DBPM-C16', 50), 1.8, 'relative') + SY01.append(TM.generate('QFD', 60), 0.1, 'relative') SY02 = LineContainer('SY02', -0.7502) SY02.append(TM.generate('RESKICKAC', 5, {'design_kick': 0}), 0.285, 'relative') @@ -1368,8 +1376,9 @@ class SwissFEL: BC01.append(TM.generate('QFD', 10), 3.5+2.25, 'relative') BC01.append(TM.generate('DBPM-C16', 20), 0.2+2, 'relative') BC01.append(TM.generate('QFD', 30), 1.2, 'relative') - BC01.append(TM.generate('DBPM-C16', 40), 2.5-0.985-0.3+2, 'relative') - BC01.append(TM.generate('QFD', 50), 0.2, 'relative') + BC01.append(TM.generate('DCDR-BC1', 40), 2.5 - 0.985 - 0.3 + 2-0.237, 'relative') + BC01.append(TM.generate('DBPM-C16', 50), 0.1, 'relative') + BC01.append(TM.generate('QFD', 60), 0.2, 'relative') BC02 = LineContainer('BC02', -0.521) varC = VariableContainer(7, 3.15) @@ -1457,14 +1466,16 @@ class SwissFEL: CB14 = TM.generate('CB-Lin3-Cell-incomplete', 0, {'Name': 'CB14'}) CB15 = LineContainer('CB15', 9.1) CB15.append(TM.generate('QFM',10),0.6-0.45,'relative') - CB15.append(TM.generate('QFM',20),0.75-0.45,'relative') + CB15.append(TM.generate('DBPM-C16', 15), 0.75-0.45-0.2, 'relative') + CB15.append(TM.generate('QFM',20),0.1,'relative') CB15.append(TM.generate('RESKICKDC',30,{'design_kick':0}),0.1,'relative') CB15.append(TM.generate('RESKICKAC',40,{'design_kick':0}),0.0,'relative') CB15.append(TM.generate('RESKICKDC',50,{'design_kick':0}),0.0,'relative') CB15.append(TM.generate('RESKICKAC',60,{'design_kick':0}),0.0,'relative') CB15.append(TM.generate('RESKICKDC',70,{'design_kick':0}),0.0,'relative') CB15.append(TM.generate('QFA',100),1,'relative') - CB15.append(TM.generate('QFA',200),3.,'relative') + CB15.append(TM.generate('DBPM-C16', 110), 3-0.355, 'relative') + CB15.append(TM.generate('QFA',200),0.1,'relative') CB16=LineContainer('SY01', 9.1-0.665) if self.alt > 0: # porthos extraction @@ -1631,7 +1642,7 @@ class SwissFEL: UN20.append(TM.generate('DBAM-FS8', 210), 0., 'relative') UN20.append(TM.generate('QFM', 220), 3-0.107-2.7-0.15, 'relative') angle = 0 - BD01 = LineContainer('BD02', 0) + BD01 = LineContainer('BD01', 0) BD01.append(TM.generate('DBPM-C16', 5),0.1,'relative') BD01.append(TM.generate('QFF', 10), 0.1+0.043, 'relative') BD01.append(TM.generate('QFF', 20), 1.5-0.1125, 'relative') @@ -1710,50 +1721,69 @@ class SwissFEL: SY01.append(Alignment({'dy': 0.01, 'Tag': 'ALIG', 'index': 1})) dx=0.5 dy=-0.5 - SY01.append(TM.generate('QFM-veryshort', 10), 4+dx, 'relative') # before BPM, after, Sex, Qsk, cor - SY01.append(TM.generate('QFM-veryshort', 20), 4-dx, 'relative') # before BPM, after cor - SY01.append(TM.generate('QFM-veryshort', 30), 2.5+dy, 'relative') # before BPM, after Sex,Qsk,cor - SY01.append(TM.generate('QFM-veryshort', 40), 2.5-dy, 'relative') # before BPM, magnet is QFD. -# saftety copy -# SY01.append(TM.generate('QFM-veryshort', 10), 4, 'relative') # before BPM, after, Sex, Qsk, cor -# SY01.append(TM.generate('QFM-veryshort', 20), 4, 'relative') # before BPM, after cor -# SY01.append(TM.generate('QFM-veryshort', 30), 2.5, 'relative') # before BPM, after Sex,Qsk,cor -# SY01.append(TM.generate('QFM-veryshort', 40), 2.5, 'relative') # before BPM, magnet is QFD. - SY01.append(TM.generate('AFBC3-noCor', 100, {'angle': -2, 'design_angle': -2, 'e1': 1, 'e2': 0., 'BC': 'Switch Yard 1'}), 0.3,'relative') + SY01.append(TM.generate('DBPM-C16',10),4+dx-0.1-0.1,'relative') + SY01.append(TM.generate('QFM-veryshort', 20), 0.1, 'relative') + SY01.append(TM.generate('HFB', 30), 0.1, 'relative') + SY01.append(TM.generate('QFBS', 40), 0.1, 'relative') + SY01.append(TM.generate('QFM-veryshort', 50), 4-dx-0.4, 'relative') + SY01.append(TM.generate('SFQFM', 60), 0.1, 'relative')# before BPM, after cor + SY01.append(TM.generate('DBPM-C16', 70), 2.5+dy - 0.1 - 0.1-0.4, 'relative') + SY01.append(TM.generate('QFM-veryshort', 80), 0.1, 'relative') # before BPM, after Sex,Qsk,cor + SY01.append(TM.generate('HFB', 90), 0.1, 'relative') + SY01.append(TM.generate('QFBS', 100), 0.1, 'relative') + SY01.append(TM.generate('QFD', 110), 2.5-dy+0.05-0.4, 'relative') # before BPM, magnet is QFD. + SY01.append(TM.generate('AFBC3-noCor', 200, {'angle': -2, 'design_angle': -2, 'e1': 1, 'e2': 0., 'BC': 'Switch Yard 1'}), 0.3,'relative') + SY02 = LineContainer('SY02', 66-1.7555-6.3852-9.8+6.25) SY02.append(TM.generate('QFM-veryshort', 10), 0.3, 'relative') SY02.append(TM.generate('AFL', 100,{'angle': 0.57, 'design_angle': 0.57, 'e1': 0, 'e2': 1., 'Tilt': math.asin(1)}),0.3, 'relative') SY02.append(TM.generate('AFL', 200,{'angle': -0.57, 'design_angle': -0.57, 'e1': 1, 'e2': 0., 'Tilt': math.asin(1)}),0.8, 'relative') - SY02.append(TM.generate('QFM-veryshort', 205), 0.3, 'relative') - SY02.append(TM.generate('QFM-veryshort', 210), 1.5, 'relative') - SY02.append(TM.generate('QFM-veryshort', 220), 4.5, 'relative') - SY02.append(TM.generate('QFM-veryshort', 230), 1.5, 'relative') - SY02.append(TM.generate('QFM-veryshort', 300), 38-9.8+6.25, 'relative') - SY02.append(TM.generate('QFM-veryshort', 310), 1.5, 'relative') - SY02.append(TM.generate('QFM-veryshort', 320), 4.5-1, 'relative') - SY02.append(TM.generate('QFM-veryshort', 330), 1.5+1., 'relative') + SY02.append(TM.generate('QFD', 210), 0.35, 'relative') + SY02.append(TM.generate('DBPM-C16', 220), 1.55-.2, 'relative') + SY02.append(TM.generate('QFD', 230), 0.1, 'relative') + SY02.append(TM.generate('QFD', 240), 4.55, 'relative') + SY02.append(TM.generate('DBPM-C16', 250), 1.55 - .2, 'relative') + SY02.append(TM.generate('QFD', 260), 0.1, 'relative') + SY02.append(TM.generate('DBPM-C16', 270), 17, 'relative') + SY02.append(TM.generate('DBPM-C16', 280), 17, 'relative') + SY02.append(TM.generate('DSCR-HR16', 290), 0.1, 'relative') + SY02.append(TM.generate('QFD', 300), 0.063, 'relative') + SY02.append(TM.generate('QFD', 310), 1.55, 'relative') + SY02.append(TM.generate('DBPM-C16', 320), 4.55-1.2, 'relative') + SY02.append(TM.generate('QFD', 330), 0.1, 'relative') + SY02.append(TM.generate('QFD', 340), 1.55+1., 'relative') - SY03 = LineContainer('SY03', 0) + SY03 = LineContainer('SY03', -0.1) SY03.append(TM.generate('AFBC3-noCor', 100,{'angle': 2.5, 'design_angle': 2.5, 'e1': 1, 'e2': 0., 'BC': 'Switch Yard 2'}), 0.3,'relative') - SY03.append(TM.generate('QFM-veryshort', 110), 3.5, 'relative') - SY03.append(TM.generate('AFBC3-noCor', 200,{'angle': 2.5, 'design_angle': 2.5, 'e1': 1, 'e2': 0., 'BC': 'Switch Yard 2'}), 3.5,'relative') - SY03.append(TM.generate('QFM-veryshort', 210), 0.5, 'relative') + SY03.append(TM.generate('DBPM-C16', 110), 3.5-0.2, 'relative') + SY03.append(TM.generate('QFM-veryshort', 120), 0.1, 'relative') + SY03.append(TM.generate('HFB', 130), 0.1, 'relative') + SY03.append(TM.generate('AFBC3-noCor', 200,{'angle': 2.5, 'design_angle': 2.5, 'e1': 1, 'e2': 0., 'BC': 'Switch Yard 2'}), 3.5-0.2,'relative') + SY03.append(TM.generate('DBPM-C16', 210), 0.55-0.2, 'relative') + SY03.append(TM.generate('QFD', 220), 0.1, 'relative') SY03.append(TM.generate('TW Cav C-Band',300),0.1,'relative') - SY03.append(TM.generate('QFM-veryshort', 310), 3.-0.4-0.965-0.785, 'relative') + SY03.append(TM.generate('QFD', 310), 0.9, 'relative') SY03.append(TM.generate('TW Cav C-Band', 400), 0.1, 'relative') - SY03.append(TM.generate('QFM-veryshort', 410), 3.-0.4-0.965-0.785, 'relative') - BC01 = LineContainer('BC01',-0.2) - angAT=0.5 + SY03.append(TM.generate('DCDR-BC1', 410), 0.9 - 0.2-0.237, 'relative') + SY03.append(TM.generate('DBPM-C16', 420), 0.1, 'relative') + SY03.append(TM.generate('QFD', 430), 0.1, 'relative') - varSYBC = VariableContainer(5, 0) + BC01 = LineContainer('BC01',-0.3) + angAT=0.5 + varSYBC1 = VariableContainer(5, 2.1) + varSYBC2 = VariableContainer(5, 0) BC01.append(TM.generate('AFBC3-noCor', 100,{'angle': -angAT, 'design_angle': -angAT, 'e1': 1, 'e2': 0., 'BC': 'Switch Yard 3'}), 0.5,'relative') - BC01.append(TM.generate('AFBC3-noCor', 200,{'angle': angAT, 'design_angle': angAT, 'e1': 0, 'e2': 1., 'BC': 'Switch Yard 3'}), 0,varSYBC) + BC01.append(TM.generate('DBPM-C16', 110), 2, 'relative') + BC01.append(TM.generate('AFBC3-noCor', 200,{'angle': angAT, 'design_angle': angAT, 'e1': 0, 'e2': 1., 'BC': 'Switch Yard 3'}), 0,varSYBC1) BC01.append(TM.generate('AFBC3-noCor', 300,{'angle': angAT, 'design_angle': angAT, 'e1': 1, 'e2': 0., 'BC': 'Switch Yard 3'}), 0.5-0.2,'relative') - BC01.append(TM.generate('AFBC3-noCor', 400,{'angle': -angAT, 'design_angle': -angAT, 'e1': 0, 'e2': 1., 'BC': 'Switch Yard 3'}), 0,varSYBC) - BC01.append(TM.generate('QFM-veryshort', 410), 0.1, 'relative') - BC01.append(TM.generate('QFM-veryshort', 420), 1.8+0.5-0.6, 'relative') - BC01.append(TM.generate('QFM-veryshort', 430), 1.8 + 0.5-0.6, 'relative') - BC01.append(TM.generate('QFM-veryshort', 440), 1.8+0.58699+4.5895e-3-0.6, 'relative') + BC01.append(TM.generate('AFBC3-noCor', 400,{'angle': -angAT, 'design_angle': -angAT, 'e1': 0, 'e2': 1., 'BC': 'Switch Yard 3'}), 0,varSYBC2) + BC01.append(TM.generate('QFD', 410), 0.15, 'relative') + BC01.append(TM.generate('DBPM-C16', 420), 1.85+0.5-0.6 - 0.2, 'relative') + BC01.append(TM.generate('QFD', 430), 0.1, 'relative') + BC01.append(TM.generate('DCDR-BC2', 440), 1.85 + 0.5-0.6-0.237, 'relative') + BC01.append(TM.generate('QFD', 450), 0.1, 'relative') + BC01.append(TM.generate('DBPM-C16', 460), 1.85+0.58699+4.5895e-3-0.6 - 0.2, 'relative') + BC01.append(TM.generate('QFD', 470), 0.1, 'relative') else: ddx=0.7502 SY01=LineContainer('SY01', 29.100107+ddx+0.12+0.000049) @@ -2601,8 +2631,12 @@ class SwissFEL: Parameters['SINXB01.RACC100']={'Gradient':18.96e6,'Phase':265.93} Parameters['SINXB01.RACC200']={'Gradient':18.96e6,'Phase':265.93} + + for cell in (100,200,300,400): + ele='SINCB%2.2d.RACC%3.3d' % (1,cell) + Parameters[ele]={'Gradient':28.14e6,'Phase':68.55} - for idx in (1,2,3,4,5,6,7,8,9): + for idx in (1,2,3,4,5,6,7,8,9,10,11): for cell in (100,200,300,400): ele='S10CB%2.2d.RACC%3.3d' % (idx,cell) Parameters[ele]={'Gradient':28.14e6,'Phase':68.55} @@ -2612,7 +2646,7 @@ class SwissFEL: ele='S20CB%2.2d.RACC%3.3d' % (idx,cell*100) Parameters[ele]={'Gradient':27e6,'Phase':90} - for idx in (1,2,3,4,5,6,7,8,9,10,11,12,13): + for idx in (1,2,3,4,5,6,7,8,9,10,11,12,13,14): for cell in range (1,5): ele='S30CB%2.2d.RACC%3.3d' % (idx,cell*100) Parameters[ele]={'Gradient':28e6,'Phase':90}