Files
OpticsTools/matchmaker.py

71 lines
2.9 KiB
Python

import os
import re
from onlinemodel.madx import CMadX
class MatchMaker:
def __init__(self):
self.matchlist={'SwissFEL+':'Scripts/SFPlus'}
def initScripts(self,target):
self.scriptdir = self.matchlist[target]
self.scriptInjector = os.path.exists(self.scriptdir+'/matchInjector.madx')
self.scriptAramis = os.path.exists(self.scriptdir+'/matchAramis.madx')
self.scriptAthos = os.path.exists(self.scriptdir + '/matchAthos.madx')
self.scriptPorthos = os.path.exists(self.scriptdir + '/matchPorthos.madx')
self.settings = os.path.exists(self.scriptdir + '/ReferenceSettings')
def match(self, om, Injector=True, Athos = True, Aramis = False, Porthos = False):
if Athos:
target = 'SATBD01'
else:
target = 'SARUN20'
madx = CMadX()
madx.E0 = 2000
om.setBranch(target, 'SINLH01')
madx.updateLattice(om, target) # write lattice
madx.commonHeader('SwissFEL', '#s/#e', None) # sets header
madx.madx.call(self.scriptdir + '/initTwiss.madx')
if Injector:
madx.madx.call(self.scriptdir+'/matchInjector.madx', chdir=True)
self.updateOnlineModel(om,madx.madx, 's[i1].*k1|s20sy01.*k1')
if Athos:
madx.madx.call(self.scriptdir+'/matchAthos.madx', chdir=True)
self.updateOnlineModel(om, madx.madx, 'sat.*k1|s20sy02.*m[kq]')
if Aramis:
if target=='SATBD01':
target = 'SARUN20'
om.setBranch(target, 'SINLH01')
madx.updateLattice(om, target) # write lattice
madx.commonHeader('SwissFEL', '#s/#e', None) # sets header
madx.madx.call(self.scriptdir + '/initTwiss.madx')
madx.madx.call(self.scriptdir + '/matchAramis.madx', chdir=True)
self.updateOnlineModel(om, madx.madx, 's[3a][0r].*k1|s20[bm][ca].*k1')
return madx.madx.table.twiss
def updateOnlineModel(self,om,madx,filter):
reg = re.compile(filter)
for var in list(madx.globals):
if reg.match(var):
if '.k1' in var:
element = var.split('.k1')[0]
ele = om.getElement(element)
if not ele is None:
ele.k1 = madx.globals.get(var,0)
print('... Updating', ele.Name, 'to k1=',ele.k1)
else:
print('### Unidentified element', element)
elif '.cory' in var:
element = var.split('.cory')[0]
ele = om.getElement(element)
if not ele is None:
ele.design_kick = madx.globals.get(var, 0)
print('... Updating', ele.Name, 'to design_kick=', ele.design_kick)
else:
print('### Unidentified element', element)