From d11a57f446b480b090da8af06ea2e2d2407515f6 Mon Sep 17 00:00:00 2001 From: reiche Date: Wed, 28 May 2025 17:55:03 +0200 Subject: [PATCH] Adding reference scripts --- OpticsTools.py | 5 +- Scripts/switchyard.madx | 121 ++++++++++++++++++++------------- Scripts/switchyard_kicker.madx | 17 ++--- Settings/Reference.json | 32 ++++++--- generateMatchSettings.py | 29 ++++++-- machine.py | 6 +- model.py | 11 +-- 7 files changed, 144 insertions(+), 77 deletions(-) diff --git a/OpticsTools.py b/OpticsTools.py index 5e03be5..7c38bc3 100644 --- a/OpticsTools.py +++ b/OpticsTools.py @@ -15,10 +15,11 @@ from sandbox import Sandbox from matching import Matching class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): - def __init__(self,phase=0, office = False): + def __init__(self,phase=0, office= 1): super(OpticsTools, self).__init__() self.setupUi(self) + office = office== 1 self.version = '1.0.1' self.setWindowIcon(QtGui.QIcon("rsc/iconoptics.png")) @@ -99,7 +100,7 @@ if __name__ == '__main__': QtWidgets.QApplication.setStyle(QtWidgets.QStyleFactory.create("plastique")) parser = ArgumentParser() parser.add_argument('-phase', type=int, help='Disable any action on the machine', default=0) - parser.add_argument('-offline', type=int, help='Excludes any connection to control system', default=0) + parser.add_argument('-offline', type=int, help='Excludes any connection to control system', default=1) args = parser.parse_args() app = QtWidgets.QApplication(sys.argv) diff --git a/Scripts/switchyard.madx b/Scripts/switchyard.madx index 3f8f151..03d50e1 100644 --- a/Scripts/switchyard.madx +++ b/Scripts/switchyard.madx @@ -1,86 +1,111 @@ -MATCH,SEQUENCE=swissfel,range=#s/#e,betx=betax0,alfx=alphax0,bety=betay0,alfy=alphay0; -VARY, NAME=satsy01.mqua020.k1, STEP=0.00001,LOWER=-4,UPPER=4; + +satsy01.mqua020.k1 := 0.48577; +satsy01.mqua040.k1 := 1.0122; +satsy01.mqua070.k1 := -0.055; +satsy01.mqua090.k1 := -0.826; + +kmin=-2; +kmax=2; +MATCH,SEQUENCE=swissfel,range=s20SY02$start/satcl01$end,beta0=initcon; +VARY, NAME=satsy01.mqua020.k1, STEP=0.00001,LOWER=0,UPPER=4; VARY, NAME=satsy01.mqua040.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; -VARY, NAME=satsy01.mqua070.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +VARY, NAME=satsy01.mqua070.k1, STEP=0.00001,LOWER=Kmin,UPPER=KMAX; VARY, NAME=satsy01.mqua090.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; -CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, DX = 0.082; ! -CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, DPX = 0.0084; -!CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, DPX = DPXM*1.2; -CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, DY < 0.09; -CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, DPY < 1; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, DX < 7.05e2; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, DPX = 7.87e-3; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, ALFX=0; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, ALFY=0; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01.mbnd200, DPY =-1.16e-4; LMDIF, CALLS=1000, TOLERANCE=1.E-21; ENDMATCH; - -!------------------------------------- -! match second half of SATSY01 - closing dispersion - -if (initquads ==1){ satsy01.mqua210.k1=satsy01.mqua090.k1; satsy01.mqua230.k1=satsy01.mqua070.k1; satsy01.mqua260.k1=satsy01.mqua040.k1; satsy01.mqua280.k1=satsy01.mqua020.k1; satsy01.mqua300.k1 := 5.27400e-01; -} -DXS = -0.030; -DPXS = -0.001; -MATCH,SEQUENCE=swissfel,range=#s/#e,betx=betax0,alfx=alphax0,bety=betay0,alfy=alphay0; -VARY, NAME=satsy01.mqua280.k1, STEP=0.00001,LOWER=-4,UPPER=4; +DXS = 0.000; +DPXS = 0.000; + +MATCH,SEQUENCE=swissfel,range=s20SY02$start/satcl01$end,beta0=initcon; +VARY, NAME=satsy01.mqua230.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +VARY, NAME=satsy01.mqua210.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; VARY, NAME=satsy01.mqua300.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; -CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01$end, DX = DXS; -CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01$end, DPX =DPXS; -CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01$end, X < 0.1; +VARY, NAME=satsy01.mqua280.k1, STEP=0.00001,LOWER=-4,UPPER=4; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01$end, DX = 0; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01$end, DPX = 0; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01$end, DY < -0.009; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01$end, X<10; LMDIF, CALLS=1000, TOLERANCE=1.E-21; ENDMATCH; -matching.xdispersion=TAR; - +satsy01.mqua280.k1 = satsy01.mqua280.k1*1.3; !------------------------------------------ ! close vertical dispersion -if (initquads==1){ + satsy02.mqua010.k1 := - 1.71; satsy02.mqua110.k1 := 1.22622; satsy02.mqua120.k1 := 1.64073; satsy02.mqua230.k1 = -1.61620; -} -MATCH,SEQUENCE=swissfel,range=#s/#e,betx=betax0,alfx=alphax0,bety=betay0,alfy=alphay0; + +MATCH,SEQUENCE=swissfel,range=s20SY02$start/satcl01$end,beta0=initcon; VARY, NAME=satsy02.mqua010.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; VARY, NAME=satsy02.mqua110.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; VARY, NAME=satsy02.mqua120.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy02$end, DY = 0.0; CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy02$end, DPY = 0.0; -CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy02$end, X = 0.0; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy02$end, X <0; LMDIF, CALLS=1000, TOLERANCE=1.E-21; ENDMATCH; -matching.ydispersion=TAR; + +satcl011:=-1.3; +satcl012:= 1.1; +satcl01.mqua120.k1:=satcl011; +satcl01.mqua130.k1:=satcl012; +satcl01.mqua180.k1:=satcl012; +satcl01.mqua190.k1:=satcl011; -!--------------------------------- -! match sextupoles -if (initquads==1){ -satsy01.msex050.k2 = 100; -satsy01.msex080.k2 = -100; -satsy01.msex220.k2 = -100; -satsy01.msex250.k2 = 100; -} - - -MATCH,chrom, SEQUENCE=swissfel,range=#s/#e,betx=betax0,alfx=alphax0,bety=betay0,alfy=alphay0; -VARY, NAME=satsy01.msex050.k2, STEP=0.00001; -VARY, NAME=satsy01.msex080.k2, STEP=0.00001; -VARY, NAME=satsy01.msex220.k2, STEP=0.00001; -VARY, NAME=satsy01.msex250.k2, STEP=0.00001; - -CONSTRAINT, SEQUENCE=swissFEL, RANGE=satsy02$end, DDX = 0; -CONSTRAINT, SEQUENCE=swissFEL, RANGE=satsy02$end, DDY = 0; -CONSTRAINT, SEQUENCE=swissFEL, RANGE=satsy02$end, DDPX = 0; -CONSTRAINT, SEQUENCE=swissFEL, RANGE=satsy02$end, DDPY = 0; +MATCH, SEQUENCE=swissfel, range=SATCL01$START/#SATCL01$END,betx=5,alfx=0,bety=30,alfy=0; +VARY, NAME=satcl011, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +VARY, NAME=satcl012, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satcl01$end, DX = 0; +CONSTRAINT, SEQUENCE=swissfel, RANGE=satcl01$end, DPX = 0; LMDIF, CALLS=1000, TOLERANCE=1.E-21; ENDMATCH; + + +satsy02.mqua230.k1 = -0.12; +satsy03.mqua010.k1 = 0.56; +satsy03.mqua040.k1 = 0.72; +satsy03.mqua070.k1 = 0.427; +satsy03.mqua100.k1 = -0.01; +satsy03.mqua130.k1 = -0.67; + + +MATCH,SEQUENCE=swissfel,range=#s/#e,range=s20SY02$start/satcl01$end,beta0=initcon; +VARY, NAME=satsy02.mqua230.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +VARY, NAME=satsy03.mqua010.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +VARY, NAME=satsy03.mqua040.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +VARY, NAME=satsy03.mqua070.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +VARY, NAME=satsy03.mqua100.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +VARY, NAME=satsy03.mqua130.k1, STEP=0.00001,LOWER=Kmin,UPPER=Kmax; +CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,betx=10.8; +CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,alfx=-0.01; +CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,bety<30.8; ! was 13.8 +CONSTRAINT, SEQUENCE=swissFEL, RANGE=satcl01.msex160,alfy=-0.01; +constraint, sequence=swissfel, range=satsy03.mqua130$end, betx <90 ; +constraint, sequence=swissfel, range=satsy03.mqua130$end, bety <90 ; +LMDIF, CALLS=1000, TOLERANCE=1.E-21; +ENDMATCH; + + + +twiss,sequence=swissfel,range=s20sy02$start/satcl01$end,rmatrix,beta0=initcon; \ No newline at end of file diff --git a/Scripts/switchyard_kicker.madx b/Scripts/switchyard_kicker.madx index 9fcab3f..1473c03 100644 --- a/Scripts/switchyard_kicker.madx +++ b/Scripts/switchyard_kicker.madx @@ -16,19 +16,20 @@ S20SY02.MKAC040.cory := SYKICK*3; S20SY02.MKDC050.cory := SYKICK*2; -use,sequence=s20sy02; -MATCH,SEQUENCE=s20sy02,range=#s/#e,betx=20,alfx=0,bety=20,alfy=0; + +use,sequence=swissfel; +MATCH,SEQUENCE=swissfel,range=s20sy02$start/s20sy02$end,beta0=initcon; 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=s20sy02,range=S20SY02.mbnd200,y=y_sep; -CONSTRAINT,SEQUENCE=s20sy02,range=S20SY02.mbnd200,py=py_sep; -CONSTRAINT,SEQUENCE=s20sy02,range=S20SY02.mbnd200,dy=-0.007; -CONSTRAINT,SEQUENCE=s20sy02,range=S20SY02.mbnd200,dpy<1; -CONSTRAINT,SEQUENCE=s20sy02,range=S20SY02.mqua180, BETY < 60; +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; +CONSTRAINT,SEQUENCE=swissfel,range=S20SY02.mqua180, BETY < 60; LMDIF,CALLS=8000,TOLERANCE=1.e-21; ENDMATCH; -twiss,sequence=s20sy02,range=#s/#e,rmatrix,betx=20,alfx=0,bety=20,alfy=0; +twiss,sequence=swissfel,range=s20sy02$start/s20sy02$end,rmatrix,beta0=initcon; diff --git a/Settings/Reference.json b/Settings/Reference.json index d31e07a..f03ac80 100644 --- a/Settings/Reference.json +++ b/Settings/Reference.json @@ -99,6 +99,14 @@ "Destination": "SATBD01", "Sequence": null, "Save": null + }, + { + "Reference": "Switchyard", + "MatchID": "Switchyard", + "End": "SATCL01", + "Destination": "SATBD01", + "Sequence": null, + "Save": null } ], "Dependence": { @@ -124,15 +132,6 @@ ], "S20CB01-MQUA430": [ "S20CB03-MQUA430" - ], - "SATSY01-MQUA090": [ - "SATSY01-MQUA210" - ], - "SATSY01-MQUA070": [ - "SATSY01-MQUA230" - ], - "SATSY01-MQUA040": [ - "SATSY01-MQUA260" ] }, "Reference": { @@ -420,7 +419,7 @@ "Location": "s20sy02$start", "Twiss": { "betax": 48.26, - "alphax": 7.322, + "alphax": 0, "betay": 14.293, "alphay": -3.513 } @@ -444,6 +443,19 @@ "Script": "Scripts/switchyard_kicker.madx" } ] + }, + "Switchyard": { + "Variable": [ + "SATSY01-MQUA020", + "SATSY01-MQUA040", + "SATSY01-MQUA070", + "SATSY01-MQUA090" + ], + "Target": [ + { + "Script": "Scripts/switchyard.madx" + } + ] } } } \ No newline at end of file diff --git a/generateMatchSettings.py b/generateMatchSettings.py index 05045c1..1562205 100644 --- a/generateMatchSettings.py +++ b/generateMatchSettings.py @@ -39,6 +39,7 @@ order.append(MatchStep(None, 'Linac 2', None,'SATBD01',['S20CB01','S20CB02'],Tru order.append(MatchStep('Bunch Compressor 2', 'Match to Linac 2','S20CB04','SATBD01')) order.append(MatchStep('Bunch Compressor 2', 'Match to Switchyard','S20SY02','SATBD01')) order.append(MatchStep('Switchyard', 'Resonant Kicker','S20SY02','SATBD01')) +order.append(MatchStep('Switchyard', 'Switchyard','SATCL01','SATBD01')) #order.append(MatchStep('Switchyard', 'Switchyard','SATSY03','SATBD01')) # list of references with fixed twiss parameters @@ -47,7 +48,8 @@ reference['Start'] = MatchReference('start',{'betax':29.971,'alphax':0.003,'beta reference['Laser Heater'] = MatchReference('sinlh02.mqua410$start',{'betax': 11.2, 'alphax': 3.2,'betay': 0.8, 'alphay': 0.75,}) reference['Bunch Compressor 1'] = MatchReference('sindi02.mqua020$start',{'betax': 11.1557, 'alphax': -1.17,'betay': 50, 'alphay': 0.}) reference['Bunch Compressor 2'] = MatchReference('s10ma01.mqua020$start',{'betax': 6.14, 'alphax': -0.83,'betay': 22.86, 'alphay': -1.18}) -reference['Switchyard'] = MatchReference('s20sy02$start',{'betax': 48.26, 'alphax': 7.322,'betay': 14.293, 'alphay': -3.513}) +#reference['Switchyard'] = MatchReference('s20sy02$start',{'betax': 48.26, 'alphax': 7.322,'betay': 14.293, 'alphay': -3.513}) +reference['Switchyard'] = MatchReference('s20sy02$start',{'betax': 48.26, 'alphax': 0,'betay': 14.293, 'alphay': -3.513}) reference['Linac3'] = MatchReference('s30cb10.mqua430$start',{'betax': 8.83,'alphax': 0.548,'betay': 30.44,'alphay': -1.866}) reference['Aramis Stopper'] = MatchReference('sarma01.mqua010$start',{'betax': 2.304, 'alphax': -1.4045, 'betay': 25.929, 'alphay': -6.363}) reference['Athos HERO'] = MatchReference('satdi01.mqua250$start',{'betax': 35.76, 'alphax': -1.166,'betay': 24.087, 'alphay': 0.648}) @@ -112,14 +114,33 @@ var = ['S20SY02-MQUA070','S20SY02-MQUA100','S20SY02-MQUA140','S20SY02-MQUA180',' tar=[{'Script':'Scripts/switchyard_kicker.madx'}] parameter['Resonant Kicker']=MatchParameter(var, tar) + +#var = ['SATSY01-MQUA020','SATSY01-MQUA040','SATSY01-MQUA070','SATSY01-MQUA090'] +#tar =[MatchReference('satsy01.mbnd200',{'etax':0.082,'etapx':0.0084}), +# MatchReference('satsy01.mbnd200',{'etay':0.09,'etapy':1},1)] +#parameter['SATSY01 - I']=MatchParameter(var, tar) + +#var = ['SATSY01-MQUA280','SATSY01-MQUA300'] +#tar =[MatchReference('satsy01$end',{'etax':-0.030,'etapx':-0.001})] +#parameter['SATSY01 - II']=MatchParameter(var, tar) + +#var = ['SATSY02-MQUA010','SATSY02-MQUA110','SATSY02-MQUA120'] +#tar =[MatchReference('satsy02$end',{'etay':0.,'etapy':0.,'x':0})] +#parameter['SATSY02']=MatchParameter(var, tar) + +#var = ['SATSY02-MQUA210','SATSY03-MQUA010','SATSY03-MQUA040','SATSY03-MQUA070','SATSY03-MQUA100','SATSY03-MQUA130', +# 'SATCL01-MQUA120','SATCL01-MQUA130','SATCL01-MQUA180','SATCL01-MQUA190'] +var=['SATSY01-MQUA020','SATSY01-MQUA040','SATSY01-MQUA070','SATSY01-MQUA090'] +tar=[{'Script':'Scripts/switchyard.madx'}] +parameter['Switchyard']=MatchParameter(var, tar) + + dependence={} dependence['SINSB04-MQUA230']=['SINSB03-MQUA230'] dependence['S10CB02-MQUA230']=['S10DI01-MQUA120'] + ['S10CB%2.2d-MQUA430' % i for i in range(3,9)] dependence['S10CB02-MQUA430']=['S10CB%2.2d-MQUA230' % i for i in range(3,9)] dependence['S20CB01-MQUA430']=['S20CB03-MQUA430'] -dependence['SATSY01-MQUA090']=['SATSY01-MQUA210'] -dependence['SATSY01-MQUA070']=['SATSY01-MQUA230'] -dependence['SATSY01-MQUA040']=['SATSY01-MQUA260'] + reference={} diff --git a/machine.py b/machine.py index 49b596f..d7a1c53 100644 --- a/machine.py +++ b/machine.py @@ -44,6 +44,7 @@ class Machine: self.PVs={ele:PV(ele, auto_monitor=False) for ele in self.PVNames} def getMachineStatus(self): + print('offline:',self.offline) if self.offline: values = {ele: self.PVs[ele] for ele in self.PVs.keys()} else: @@ -58,7 +59,10 @@ class Machine: magnets[key[0:15]]=values[key] if 'MBND' in key and 'K0L-SET' in key: if 'SINBC' in key or 'SINLH' in key or 'S10BC' in key or 'SATMA' in key or 'SATUN' in key: - magnets[key[0:15]] = values[key]*180./np.pi + if values[key] is None: + magnets[key[0:15]] = values[key] + else: + magnets[key[0:15]] = values[key]*180./np.pi if 'UMOD' in key: und[key[0:12]]=[values[key],0.] if 'UIND' in key: diff --git a/model.py b/model.py index e8ac1e9..e85fdfa 100644 --- a/model.py +++ b/model.py @@ -246,8 +246,13 @@ class Model: target = config['target'] if 'Script' in target.keys(): - res,twiss,err = self.madx.callScript(script = target['Script'],sequence=sequence, start=start, end=end,var=var) - self.endMatching() + res,twiss,err = self.madx.callScript(script = target['Script'],sequence=sequence, start=start, end=end,init=itwiss,var=var) + + self.updateModelFromMatching(res) + self.parent.reference.updateMatchPoint(ID, err) + if self.matchplot: + energy = self.calcEnergyProfile(twiss) + self.parent.plot.newData(twiss, energy) return ncon = 0 @@ -282,9 +287,7 @@ class Model: res,twiss,err=self.madx.match(sequence=sequence, start=start, end=end, init=itwiss, var=var, const=condilist, preset=False,random=random) - self.endMatching() - def endMatching(self): self.updateModelFromMatching(res) if config['save'] == True: self.parent.reference.saveTwiss(ID,twiss)