Files
OpticsTools/generateMatchSettings.py
2026-01-26 12:51:49 +01:00

275 lines
15 KiB
Python

import json
def configMatching(label_in = 'Reference',var={}):
path = "MatchingConfig/"
label = label_in
print(var)
dependence = generateDependences()
reference = generateReferences()
order = generateOrder()
parameter = generateMatchingSteps(reference,var)
settings={'Label':label,'Order':order,'Dependence':dependence,'Reference':reference,'Parameter':parameter}
fname=path+label+'.json'
with open(fname, 'w', encoding='utf-8') as f:
json.dump(settings, f, ensure_ascii=False, indent=4)
return fname
#######
# some internal functions
def MatchReference(loc,twiss,limit=None): # limit 1 -> smaller than, 2 -> larger than (default is euqal)
match ={'Location': loc, 'Twiss': twiss}
if not limit is None:
match['Limit'] = limit
return match
def MatchStep(ref,id,end, dest,sequence=None,saveTwiss=None):
match={'Reference':ref,'MatchID':id,'End':end, 'Destination':dest,'Sequence':sequence,'Save':saveTwiss}
return match
def MatchParameter(var0,tar0,user0=None):
if user0 is None:
return {'Variable':var0,'Target':tar0}
return {'Variable':var0,'Target':tar0,'User':user0}
############
# generating functions
def generateReferences():
# list of references with fixed twiss parameters
reference = {}
reference['Start'] = MatchReference('start', {'betax': 29.971, 'alphax': 0.003, 'betay': 26.00, 'alphay': -0.288})
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['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['HERO'] = MatchReference('satdi01.mqua250$start',
{'betax': 35.76, 'alphax': -1.166, 'betay': 24.087, 'alphay': 0.648})
reference['Athos Deflector'] = MatchReference('satbd01.mqua010$start',
{'betax': 50, 'alphax': 0, 'betay': 50, 'alphay': 0})
reference['EEHG'] = MatchReference('satma01.mqua610$start',
{'betax': 10., 'alphax': 0.027, 'betay': 16.85, 'alphay': 0.027})
return reference
def generateDependences():
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['SATCB01-MQUA230']=['SATCL02-MQUA430']
dependence['SATCB01-MQUA430']=['SATCL02-MQUA430']
dependence['SATUN06-MQUA080']=['SATUN%2.2d-MQUA080' % (2*i+6) for i in range(1,4)] +['SATUN14-MQUA420']+['SATUN%d-MQUA080' % (2*i+16) for i in range(3)]
dependence['SATUN07-MQUA080']=['SATUN%2.2d-MQUA080' % (2*i+7) for i in range(1,8)]
dependence['S30CB01-MQUA430'] = ['S30CB%2.2d-MQUA430' % (i*2 + 3) for i in range(7)]
dependence['S30CB02-MQUA430'] = ['S30CB%2.2d-MQUA430' % (i*2 + 4) for i in range(6)]
dependence['SARUN03-MQUA080'] = ['SARMA02-MQUA050','SARUN01-MQUA080'] + ['SARUN%2.2d-MQUA080' % (2*i + 5) for i in range(8)]
dependence['SARUN04-MQUA080'] = ['SARMA02-MQUA120','SARUN02-MQUA080'] + ['SARUN%2.2d-MQUA080' % (2*i + 6) for i in range(8)]
return dependence
def generateOrder():
order = []
# order of elements:
# - Match starting point with Twiss, None has no initial condition and starts with #s
# - ID to find additional parameteters
# - Last section in tracking/matching. If none it tracks to the end (#e)
# - destination: selection of branch by giving a unique section name (e.g. SARBD01 for Aramis)
# - sequence: sequence to use. If it is a list of sequence then a temporary sequence is used. Default to swissfel
# - flag to last twiss parameters, needed for other routines to refer to.
order.append(MatchStep(None, 'Preset', None, 'SATBD01'))
order.append(MatchStep('Start', 'Laser Heater', 'SINLH02', 'SATBD01'))
order.append(MatchStep(None, 'SINSB04', None, 'SATBD01', 'SINSB04', True))
order.append(MatchStep('Laser Heater', 'Match to SINSB04', 'SINSB04', 'SATBD01'))
order.append(MatchStep('Laser Heater', 'Bunch Compressor 1', 'SINDI02', 'SATBD01'))
order.append(MatchStep(None, 'Linac 1', None, 'SATBD01', 'S10CB02', True))
order.append(MatchStep('Bunch Compressor 1', 'Match to Linac 1', 'S10CB02', 'SATBD01'))
order.append(MatchStep('Bunch Compressor 1', 'End of Linac 1', 'S10BC01', 'SATBD01'))
order.append(MatchStep('Bunch Compressor 1', 'Bunch Compressor 2', 'S10MA01', 'SATBD01'))
order.append(MatchStep(None, 'Linac 2', None, 'SATBD01', ['S20CB01', 'S20CB02'], True))
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', 'Athos Diagnostics', 'SATDI01', 'SATBD01'))
order.append(MatchStep(None, 'Athos Linac', None, 'SATBD01', 'SATCB01', True))
order.append(MatchStep('HERO', 'Athos Stopper', 'SATCL02', 'SATBD01'))
order.append(MatchStep('HERO', 'Athos EEHG', 'SATMA01', 'SATBD01'))
order.append(MatchStep(None, 'Athos Undulator', None, 'SATBD01', ['SATUN06', 'SATUN07'], True))
order.append(MatchStep('EEHG', 'Match to Athos Undulator', 'SATUN09', 'SATBD01'))
order.append(MatchStep('EEHG', 'Match to Athos Deflector', 'SATBD01', 'SATBD01'))
order.append(MatchStep(None, 'Linac 3', None, 'SARBD01',['S30CB01','S30CB02'], True))
order.append(MatchStep('Switchyard', 'Match to Linac 3', 'S30CB03', 'SARBD01'))
order.append(MatchStep('Switchyard', 'End of Linac 3', 'S30CB10', 'SARBD01'))
order.append(MatchStep(None, 'Aramis Undulator', None, 'SARBD01', ['SARUN03', 'SARUN04'], True))
order.append(MatchStep('Linac3', 'Aramis - ECOL', None, 'SARBD01'))
order.append(MatchStep('Linac3', 'Match to Aramis Undulator', 'SARUN20', 'SARBD01'))
order.append(MatchStep('Linac3', 'Aramis Dump', 'SARBD02', 'SARBd02'))
return order
def generateMatchingSteps(reference,var_ext):
parameter={}
var=[]
tar = [{'Preset':{'sinlh01.mqsk030.k1':0,'sinbc02.mqsk110.k1':0,'sinbc02.mqsk350.k1':0,
'sindi01.mqsk030.k1':0,'s10bc02.mqsk110.k1':0,'s10bc02.mqsk350.k1':0,
'sarcl02.mqsk160.k1':0,'sarcl02.mqsk300.k1':0,'sarcl02.mqsk420.k1':0,
'satsy01.mqsk030.k1':0,'satsy01.mqsk270.k1':0,
'sinbc02.mqua120.k1':0,'sinbc02.mqua340.k1':0,
's10bc02.mqua120.k1':0,'s10bc02.mqua340.k1':0,
'sarcl02.mqua150.k1':0,'sarcl02.mqua430.k1':0,
'satbd01.mqua010.k1':0.50697,'satbd01.mqua030.k1':-0.618466,
'satbd01.mqua050.k1':0.13249,'satbd01.mqua070.k1':0.47403,
'satbd01.mqua090.k1':-0.74426,'satbd02.mqua030.k1':-1.05081}}]
parameter['Preset'] = MatchParameter(var,tar)
var = ['SINLH01-MQUA020', 'SINLH01-MQUA040','SINLH01-MQUA050','SINLH01-MQUA070','SINLH02-MQUA010']
tar = [reference['Laser Heater']]
parameter['Laser Heater'] = MatchParameter(var,tar)
var = ['SINSB04-MQUA130','SINSB04-MQUA230']
tar =[MatchReference('#e',{'MUX':0.2,'MUY':0.2})]
parameter['SINSB04'] = MatchParameter(var,tar)
var = ['SINLH02-MQUA410','SINLH03-MQUA030','SINLH03-MQUA040','SINLH03-MQUA060','SINLH03-MQUA080','SINSB03-MQUA130']
tar =[{'Location':'sinsb04$start','SavedID':'SINSB04'}]
parameter['Match to SINSB04']=MatchParameter(var,tar)
var = ['SINBC01-MQUA020','SINBC01-MQUA050','SINBC01-MQUA070','SINBC01-MQUA090','SINBC01-MQUA110','SINDI01-MQUA020','SINDI01-MQUA070']
tar =[reference['Bunch Compressor 1'],
MatchReference('sinbc02.mbnd400',{'betax':5.1,'betay':100},1),
MatchReference('sinbc01.mqua110$end',{'betax':100},1)]
parameter['Bunch Compressor 1']=MatchParameter(var, tar)
var = ['S10CB02-MQUA230','S10CB02-MQUA430']
tar = [MatchReference('#e',{'MUX':0.1883,'MUY':0.1883})]
parameter['Linac 1'] = MatchParameter(var, tar)
var = ['S10CB01-MQUA230','S10CB01-MQUA430','SINDI02-MQUA020','SINDI02-MQUA030','SINDI02-MQUA050','SINDI02-MQUA060','SINDI02-MQUA090']
tar =[{'Location':'s10cb02$start','SavedID':'Linac 1'}]
parameter['Match to Linac 1']=MatchParameter(var,tar)
var = ['S10CB07-MQUA430','S10CB08-MQUA230','S10CB08-MQUA430','S10CB09-MQUA230']
tar = [MatchReference('s10bc01.mqua020$start',{'betax':4.88,'betay':16.11,'alphax':0.5546,'alphay':-1.81})]
parameter['End of Linac 1']=MatchParameter(var, tar)
var = ['S10BC01-MQUA020','S10BC01-MQUA040','S10BC01-MQUA060','S10BC01-MQUA080','S10BC01-MQUA100']
tar = [reference['Bunch Compressor 2']]
parameter['Bunch Compressor 2']=MatchParameter(var,tar)
var = ['S20CB01-MQUA430','S20CB02-MQUA430']
tar = [MatchReference('#e', {'MUX': 0.2, 'MUY': 0.2})]
parameter['Linac 2'] = MatchParameter(var, tar)
var = ['S10MA01-MQUA020','S10MA01-MQUA050','S10MA01-MQUA070','S10MA01-MQUA110','S10MA01-MQUA130']
tar =[{'Location':'s20cb01$start','SavedID':'Linac 2'}]
parameter['Match to Linac 2']=MatchParameter(var, tar)
var = ['S20SY01-MQUA020','S20SY01-MQUA030','S20SY01-MQUA050','S20SY01-MQUA080']
tar = [reference['Switchyard']]
parameter['Match to Switchyard']=MatchParameter(var, tar)
var = ['S20SY02-MQUA070','S20SY02-MQUA100','S20SY02-MQUA140','S20SY02-MQUA180','S20SY02-MKDC010','S20SY02-MKAC020','S20SY02-MKDC030','S20SY02-MKAC040','S20SY02-MKDC050']
tar=[{'Script':'Scripts/switchyard_kicker.madx'}]
parameter['Resonant Kicker']=MatchParameter(var, tar)
var=['SATSY01-MQUA020','SATSY01-MQUA040','SATSY01-MQUA070','SATSY01-MQUA090','SATSY01-MQUA210','SATSY01-MQUA230','SATSY01-MQUA260','SATSY01-MQUA280',
'SATSY01-MQUA300','SATSY02-MQUA010','SATSY02-MQUA110','SATSY02-MQUA120','SATSY02-MQUA230','SATSY03-MQUA010','SATSY03-MQUA040','SATSY03-MQUA070',
'SATSY03-MQUA100','SATSY03-MQUA130','SATCL01-MQUA120','SATCL01-MQUA130','SATCL01-MQUA180','SATCL01-MQUA190']
tar=[{'Script':'Scripts/switchyard.madx'}]
val = 0.0
if 'SYR56' in var_ext:
val = var_ext['SYR56']
uservar = {'LEAKDISP':val}
parameter['Switchyard']=MatchParameter(var, tar, uservar)
var=['SATDI01-MQUA025','SATDI01-MQUA080','SATDI01-MQUA220','SATDI01-MQUA230']
tar = [reference['HERO']]
parameter['Athos Diagnostics'] = MatchParameter(var,tar)
var = ['SATCB01-MQUA230','SATCB01-MQUA430']
tar =[MatchReference('#e',{'MUX':0.053,'MUY':0.053})]
parameter['Athos Linac'] = MatchParameter(var,tar)
var=['SATDI01-MQUA250','SATDI01-MQUA260','SATDI01-MQUA280','SATDI01-MQUA300']
tar =[{'Location':'satcl01$start','SavedID':'Athos Linac'}]
parameter['Athos Stopper'] = MatchParameter(var,tar)
var=['SATMA01-MQUA050','SATMA01-MQUA120','SATMA01-MQUA140','SATMA01-MQUA160','SATMA01-MQUA180','SATMA01-MQUA230','SATMA01-MQUA250']
tar = [reference['EEHG'],
MatchReference('satma01.mqua140$start', {'betax': 70, 'betay': 70}, 1),
MatchReference('satma01.mqua160$start', {'betax': 70, 'betay': 70}, 1),
MatchReference('satma01.mqua180$start', {'betax': 70, 'betay': 70}, 1)]
parameter['Athos EEHG'] = MatchParameter(var,tar)
var = ['SATUN06-MQUA080','SATUN07-MQUA080']
tar =[MatchReference('#e',{'MUX':0.15,'MUY':0.15})]
parameter['Athos Undulator'] = MatchParameter(var,tar)
var=['SATMA01-MQUA610','SATMA01-MQUA630','SATMA01-MQUA640','SATUN04-MQUA060','SATUN05-MQUA420']
tar =[{'Location':'satun06$start','SavedID':'Athos Undulator'},
MatchReference('satun07$end', {'x': 10, 'y': 10,'px':10}, 1)]
parameter['Match to Athos Undulator'] = MatchParameter(var,tar)
var = ['SATUN22-MQUA080','SATMA02-MQUA010','SATMA02-MQUA020','SATMA02-MQUA040','SATMA02-MQUA050','SATMA02-MQUA070']
tar = [reference['Athos Deflector'],
MatchReference('satun22$end', {'x':0, 'px': 0})]
parameter['Match to Athos Deflector'] = MatchParameter(var,tar)
var = ['S30CB01-MQUA430', 'S30CB02-MQUA430']
tar = [MatchReference('#e', {'MUX': 0.1883, 'MUY': 0.1883})]
parameter['Linac 3'] = MatchParameter(var, tar)
var = ['S20SY03-MQUA020', 'S20SY03-MQUA030', 'S20SY03-MQUA050', 'S20SY03-MQUA060', 'S20SY03-MQUA100']
tar = [{'Location': 's30cb01$start', 'SavedID': 'Linac 3'}]
parameter['Match to Linac 3'] = MatchParameter(var, tar)
var = ['S30CB01-MQUA430', 'S30CB01-MQUA430', 'S30CB01-MQUA430', 'S30CB01-MQUA430']
tar = [reference['Linac3']]
parameter['End of Linac 3'] = MatchParameter(var, tar)
var = ['SARCL02-MQUA130','SARCL02-MQUA210','SARCL02-MQUA250',
'SARCL02-MQUA310','SARCL02-MQUA350','SARCL02-MQUA460',
'SARCL01-MQUA020', 'SARCL01-MQUA050', 'SARCL01-MQUA080',
'SARCL01-MQUA100', 'SARCL01-MQUA140', 'SARCL01-MQUA190'
]
tar = [{'Script': 'Scripts/ecol.madx'}]
parameter['Aramis - ECOL'] = MatchParameter(var, tar)
var = ['SARUN03-MQUA080', 'SARUN04-MQUA080']
tar = [MatchReference('#e', {'MUX': 0.15, 'MUY': 0.15})]
parameter['Aramis Undulator'] = MatchParameter(var, tar)
var = ['SARMA01-MQUA010', 'SARMA01-MQUA060', 'SARMA01-MQUA080', 'SARMA01-MQUA120', 'SARMA01-MQUA140']
tar = [{'Location': 'sarun03$start', 'SavedID': 'Aramis Undulator'},
MatchReference('sarma01.mqua060', {'betax': 40}, 1)]
parameter['Match to Aramis Undulator'] = MatchParameter(var, tar)
var = ['SARUN19-MQUA080', 'SARUN20-MQUA080', 'SARBD01-MQUA020', 'SARBD02-MQUA030']
tar = [MatchReference('SARBD02$END', {'betax': 250, 'betay': 250,'etax':100,'etay':1.2}, 1)]
parameter['Aramis Dump'] = MatchParameter(var, tar)
return parameter