Files
OM/OMAT.py
T

453 lines
21 KiB
Python
Executable File

import os
from math import *
import numpy as np
import sys
Energy = 2.7e9
HarmNumber = 480
RFVoltage = 1.44e6
RFVoltage_3HC = 0.375e6
DriftPass = "'DriftPass'"
BendPass = "'BndMPoleSymplectic4Pass'"
QuadPass = "'StrMPoleSymplectic4Pass'"
SextPass = "'StrMPoleSymplectic4Pass'"
# OctPass = "'StrMPoleSymplectic4Pass'"
OctPass = "'ThinMPolePass'"
MultipolePass = "'ThinMPolePass'"
RcavPass = "'RFCavityPass'"
R3HCPass = "'DriftPass'"
class AcceleratorToolbox():
def __init__(self):
pass
def openFile(self,name='SLS2.m'):
self.fout=open(name,'w')
def closeFile(self):
self.fout.close()
def write(self,line):
line=line+'\n'
self.fout.write(line)
def appendMisalignments(self,transErrors,name,dx,dy,tilt):
transErrors['name'].append(name)
transErrors['dx'].append(str(dx))
transErrors['dy'].append(str(dy))
transErrors['tilt'].append(str(tilt))
def defineSequence(self,S2,Radiation=0,Aperture=0,RF=0):
# Input is an instance of OMFacility.Facility
if Aperture:
cnow=Aperture['Nominal']
RingA=[cnow]
for c in S2.Ring:
if type(c)==str:
pass
elif c.SN[0]=='E':
RingA.append(c)
elif cnow!=c.APERTURE:
cnow=c.APERTURE
RingA.append(cnow)
RingA.append(c)
else:
RingA.append(c)
else:
RingA=S2.Ring
d2r=pi/180.0
Drift={}
seq=[]
transErrors = {'name': [], 'dx': [], 'dy': [], 'tilt': []}
cir=0
Iap=1
self.write("function RING = SLS2")
self.write("RING = {...")
for index,c in enumerate(RingA):
if type(c)==str:
pass
elif type(c)==list:
Name='APERTURE'+str(Iap)
seq.append(Name)
Iap=Iap+1
if c[0]==None:
xm=0.05
else:
xm=c[0]
if c[1]==None:
ym=0.05
else:
ym=c[1]
if c[2]=='E' or c[2]=='e':
ell='1'
else:
ell='0'
if len(c)==4:
wline=Name.replace('-','_')+' : MAXAMP, X_MAX= '+str(xm) \
+', Y_MAX= '+str(ym)+', ELLIPTICAL= '+str(ell)+', OPEN_SIDE= '+str(c[3])
else:
wline=Name.replace('-','_')+' : MAXAMP, X_MAX= '+str(xm) \
+', Y_MAX= '+str(ym)+', ELLIPTICAL= '+str(ell)
self.write(wline)
elif c.SN=='EMALIGN':
wline=c.NAME+"atmarker('malign');"
self.write(wline)
seq.append(c.NAME)
elif c.SN=='EWATCH':
wline="atmarker('WATCH');"
self.write(wline)
seq.append(c.NAME)
elif c.SN=='DSCR' or c.SN=='GMRK' or c.SN=='GSRC' or c.SN=='DICT':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline="atmarker('"+elemName+"','Type','"+typeName+"','SN','"+c.SN+"');..."
self.write(wline)
seq.append(elemName)
elif c.SN=='DRIF':
if c.NAME in Drift.keys():
Name=c.NAME+'_'+str(Drift[c.NAME])
Drift[c.NAME]=Drift[c.NAME]+1
else:
Name=c.NAME
Drift[c.NAME]=1
elemName = Name.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline="atdrift('"+elemName+"',"+str(round(c.L,6))+",'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='RCAV':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline="atrfcavity('"+elemName+"',"+str(round(c.L,6))+","+str(RFVoltage)+",500e6,480,"+str(Energy)+",'TimeLag',0,'Type','"+typeName+"','SN','"+c.SN+"'"+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='R3HC':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline="atdrift('"+elemName+"',"+str(round(c.L,6))+",'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='MBEN' or c.SN=='MBCF':
if c.SN=='MBCF':
k1=c.K1*(1+c.RGE)
else:
k1=0
if c.TYPE=='SVBI':
print(c.K1)
print(c.NAME)
print(index)
if c.TYPE=='DCSYIN1' or c.TYPE=='DCSYIN2':
c.NAME = c.NAME.replace('MBEN','MSEP')
elemName_E = c.NAME.replace('-','_')+"_E"
typeName = c.TYPE.replace('-','_')+"_E"
wline = "atcorrector('"+elemName_E+"',0,["+str(d2r*c.ANGLE*c.RFE/2)+" 0],'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName_E)
if c.NAME in S2.OverlapC:
elemName = c.NAME.replace('-','_')+"_1" #name of the element
typeName = c.TYPE.replace('-','_')
wline="atsbend('"+elemName+"',"+str(round(c.L/2,6))+','+str(d2r*c.ANGLE/2)+","+str(k1)+", 'EntranceAngle',"+str(d2r*c.E1)+", 'ExitAngle',0,'PolynomB',[0 "+str(k1)+" 0 0], 'MaxOrder',4,'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
self.appendMisalignments(transErrors,elemName,c.MAX,c.MAY,-c.MAR)
seq.append(elemName)
oe = S2.OverlapC[c.NAME][0]
elemNameOE = oe.NAME.replace('-','_')
typeNameOE = oe.TYPE.replace('-','_')
wline="atmarker('"+elemNameOE+"','Type','"+typeNameOE+"','SN','"+oe.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemNameOE)
elemName = c.NAME.replace('-','_')+"_2" #name of the element
typeName = c.TYPE.replace('-','_')
wline="atsbend('"+elemName+"',"+str(round(c.L/2,6))+','+str(d2r*c.ANGLE/2)+","+str(k1)+", 'EntranceAngle',0, 'ExitAngle',"+str(d2r*c.E2)+",'PolynomB',[0 "+str(k1)+" 0 0], 'MaxOrder',4,'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
self.appendMisalignments(transErrors,elemName,c.MAX,c.MAY,-c.MAR)
seq.append(elemName)
else:
elemName = c.NAME.replace('-','_') #name of the element
typeName = c.TYPE.replace('-','_')
wline="atsbend('"+elemName+"',"+str(c.L)+','+str(d2r*c.ANGLE)+","+str(k1)+",'EntranceAngle',"+str(d2r*c.E1)+", 'ExitAngle',"+str(d2r*c.E2)+",'PolynomB',[0 "+str(k1)+" 0 0], 'MaxOrder',4,'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
self.appendMisalignments(transErrors,elemName,c.MAX,c.MAY,-c.MAR)
seq.append(elemName)
"""
# Minus sign for c.MAR is to be consistent with
elemName = c.NAME.replace('-','_') #name of the element
typeName = c.TYPE.replace('-','_')
wline=elemName+" = atsbend('"+elemName+"','Length',"+str(round(c.L,6))+',... \n' \
+" 'BendingAngle'," +str(d2r*c.ANGLE)+", 'EntranceAngle',"+str(d2r*c.E1)+", 'ExitAngle',"+str(d2r*c.E2)+',... \n' \
+" 'PolynomB',[0,"+str(k1)+",0,0], 'MaxOrder',4,'PassMethod',"+BendPass+",'Type','"+typeName+"','SN','"+c.SN+"');"
self.write(wline)
self.appendMisalignments(transErrors,elemName,c.MAX,c.MAY,-c.MAR)
seq.append(elemName)
"""
seq.append(elemName_E)
cir=cir+c.L
elif c.SN=='MBSC':
if hasattr(c,'k1'):
k1 = c.k1;
else:
k1 = 0
elemName_E = c.NAME.replace('-','_')+"_E"
typeName = c.TYPE.replace('-','_')+"_E"
wline = "atcorrector('"+elemName_E+"',0,["+str(d2r*c.TANGLE*c.RFE/2)+" 0],'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(c.NAME.replace('-','_')+'_E')
for i in range(0,floor(len(c.L)/2)):
elemName = c.NAME.replace('-','_')+'_'+str(i) #name of the element
typeName = c.TYPE.replace('-','_')
wline="atsbend('"+elemName+"',"+str(c.L[i])+"," +str(d2r*c.ANGLE[i])+","+str(k1)+",'EntranceAngle',"+str(d2r*c.E1[i])+", 'ExitAngle',"+str(d2r*c.E2[i])+",'PolynomB',[0 "+str(k1)+" 0 0], 'MaxOrder',4,'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
self.appendMisalignments(transErrors,elemName,c.MAX[i],c.MAY[i],-c.MAR)
seq.append(elemName)
oe = S2.OverlapC[c.NAME][0]
elemNameOE = oe.NAME.replace('-','_')
typeNameOE = oe.TYPE.replace('-','_')
wline="atmarker('"+elemNameOE+"','Type','"+typeNameOE+"','SN','"+oe.SN+"'"+",'Energy',"+str(Energy)+");"
self.write(wline)
seq.append(elemNameOE)
for i in range(floor(len(c.L)/2),len(c.L)):
elemName = c.NAME.replace('-','_')+'_'+str(i) #name of the element
typeName = c.TYPE.replace('-','_')
wline="atsbend('"+elemName+"',"+str(c.L[i])+','+str(d2r*c.ANGLE[i])+","+str(k1)+",'EntranceAngle',"+str(d2r*c.E1[i])+", 'ExitAngle',"+str(d2r*c.E2[i])+",'PolynomB',[0 "+str(k1)+" 0 0], 'MaxOrder',4,'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
self.appendMisalignments(transErrors,elemName,c.MAX[i],c.MAY[i],-c.MAR)
seq.append(elemName)
seq.append(elemName_E)
cir=cir+c.TL
elif c.SN=='UIND':
elemName = c.NAME.replace('-','_').replace('DRIF','UIND')
typeName = c.TYPE.replace('-','_')
if c.NAME in S2.OverlapC:
wline1="atdrift('"+elemName+"',"+str(round(c.L/2,6))+",'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline1)
seq.append(elemName)
oe = S2.OverlapC[c.NAME][0]
elemNameOE = oe.NAME.replace('-','_')
typeNameOE = oe.TYPE.replace('-','_')
wline="atmarker('"+elemNameOE+"','Type','"+typeNameOE+"','SN','"+oe.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
wline="atdrift('"+elemName+"',"+str(round(c.L/2,6))+",'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemNameOE)
seq.append(elemName)
else:
wline="atdrift('"+elemName+"',"+str(round(c.L,6))+",'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='MQUA':
k1 = c.K1*(1+c.RFE)
elemName = c.NAME.replace('-','_') #name of the element
typeName = c.TYPE.replace('-','_')
wline="atquadrupole('"+elemName+"',"+str(round(c.L,6))+","+str(k1)+",'MaxOrder',4,'PolynomB',[0 "+str(k1)+" 0 0],'Type','"+typeName+"','SN','"+c.SN+"','BDN','"+c.BDN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(c.NAME.replace('-','_'))
self.appendMisalignments(transErrors,elemName,c.MAX,c.MAY,-c.MAR)
cir=cir+c.L
elif c.SN=='MQCO':
k1 = c.K1*(1+c.RFE)
elemName = c.NAME.replace('-','_')+'_1'
typeName = c.TYPE.replace('-','_')+'_1'
wline="atquadrupole('"+elemName+"',"+str(round(c.L/2,6))+","+str(k1)+",'MaxOrder',4,'PolynomB',[0 "+str(k1)+" 0 0],'Type','"+typeName+"','SN','"+c.SN+"','BDN','"+c.BDN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
self.appendMisalignments(transErrors,elemName,str(c.MAX),str(c.MAY),str(-c.MAR))
for oe in S2.OverlapC[c.NAME]:
elemName = oe.NAME.replace('-','_')
typeName = oe.TYPE.replace('-','_')
if oe.SN=='MQSK':
tl=-0.78539816339744828-c.MAR
# Need to check the sign of tilt
wline = "atmultipole('"+elemName+"',0,[0 0 0 0 0],[0 "+str(oe.K1*(1+oe.RFE))+" 0 0],'PassMethod',"+MultipolePass+",'Type','"+typeName+"','SN','"+oe.SN+"','BDN','"+oe.BDN+"'"+",'Energy',"+str(Energy)+");..."
elif oe.SN=='MOCT':
wline = "atmultipole('"+elemName+"',0,[0 0 0 0 0],[0 0 0 "+str(oe.K3L*(1+oe.RFE))+"],'PassMethod',"+MultipolePass+",'MaxOrder',5,'Type','"+typeName+"','SN','"+oe.SN+"','BDN','"+oe.BDN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
self.appendMisalignments(transErrors,elemName,str(c.MAX),str(c.MAY),str(-c.MAR))
elemName = c.NAME.replace('-','_')+'_2'
typeName = c.TYPE.replace('-','_')+'_2'
wline="atquadrupole('"+elemName+"',"+str(round(c.L/2,6))+","+str(k1)+",'MaxOrder',4,'PolynomB',[0 "+str(k1)+" 0 0],'Type','"+typeName+"','SN','"+c.SN+"','BDN','"+c.BDN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
self.appendMisalignments(transErrors,elemName,str(c.MAX),str(c.MAY),str(-c.MAR))
cir=cir+c.L
elif c.SN=='MSXT':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline="atsextupole('"+elemName+"',"+str(round(c.L,6))+","+str(c.K2*(1+c.RFE))+",'MaxOrder',4,'PolynomB',[0 0 "+str(c.K2*(1+c.RFE))+" 0],'Type','"+typeName+"','SN','"+c.SN+"','BDN','"+c.BDN+"'"+",'PSFamily','"+c.FAMILY+"','Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
self.appendMisalignments(transErrors,elemName,str(c.MAX),str(c.MAY),str(-c.MAR))
cir=cir+c.L
elif c.SN=='MCOX':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline = "atcorrector('"+elemName+"',"+str(round(c.L,6))+",["+str(c.HKICK)+" 0],'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='MCOY':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline = "atcorrector('"+elemName+"',"+str(round(c.L,6))+",[0 "+str(c.VKICK)+"],'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='MKIK' or c.SN=='MSEP':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline = "atcorrector('"+elemName+"',"+str(round(c.L,6))+",[0 0],'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='DBPM':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline = "atdrift('"+elemName+"',"+str(round(c.L,6))+",'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='VCOL':
elemName = c.NAME.replace('-','_')
typeName = c.TYPE.replace('-','_')
wline = "atdrift('"+elemName+"',"+str(round(c.L,6))+",'EApertures',[1 1],'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
elif c.SN=='NONE':
if c.NAME == 'ARS03-NONE-0380':
print(c.NAME)
print(c.TYPE)
print(c.L)
print(c.SN)
if c.L:
if c.NAME in Drift.keys():
Name=c.NAME+'_'+str(Drift[c.NAME])
typeName = c.TYPE.replace('-','_')+'_'+str(Drift[c.NAME])
Drift[c.NAME]=Drift[c.NAME]+1
else:
Name=c.NAME
Drift[c.NAME]=1
typeName = c.TYPE.replace('-','_')
elemName = Name.replace('-','_')
wline="atdrift('"+elemName+"',"+str(round(c.L,6))+",'Type','"+typeName+"','SN','"+c.SN+"'"+",'Energy',"+str(Energy)+");..."
self.write(wline)
seq.append(elemName)
cir=cir+c.L
else:
print ('Element unknown:',c.NAME,c.SN,c.L)
# wline='MAL: malign, on_pass=0, force_modify_matrix=0\n'
# self.write(wline)
# wline='W1: WATCH,MODE=parameter,FILENAME=monitor.w1\n'
# self.write(wline)
# wline='W2: WATCH,MODE=coordinate,FILENAME=monitor.w2, interval=1\n'
# self.write(wline)
# wline='RF1 : RFCA, L=0.0, FREQ=500e6, VOLT=1.44e6, PHASE=151, T_REFERENCE=0.0\n'
# self.write(wline)
# wline='RF3 : RFCA, L=0.0, FREQ=1500e6, VOLT=0.375e6, PHASE=0.0, T_REFERENCE=0.0\n'
# self.write(wline)
# wline = "RF1 = atrfcavity('RF1','Length',0,'Frequency',500e6,'Voltage',"+str(RFVoltage)+",'TimeLag',0.251492);"
# self.write(wline)
# seq.append('RF1')
# wline = "RF3 = atrfcavity('RF3','Length',0,'Frequency',1500e6,'Voltage',"+str(RFVoltage_3HC)+",'TimeLag',0.0);"
# self.write(wline)
# seq.append('RF3')
# wline = '\n %%%% Setting shifts %%%% \n'
#for i in range(0,len(transErrors['name'])):
#wline=wline+transErrors['name'][i]+'=atshiftelem('+transErrors['name'][i]+","+transErrors['dx'][i]+","+transErrors['dy'][i]+");\n"
#wline = '\n %%%% Setting tilts %%%% \n'
#for i in range(0,len(transErrors['name'])):
# wline=wline+transErrors['name'][i]+'=attiltelem('+transErrors['name'][i]+","+transErrors['tilt'][i]+");\n"
#self.write(wline)
#wline = 'RING = {...\n '
#for i in range(0,len(seq)):
#wline=wline+seq[i]+", "
#if i%5==0 and i!=len(seq)-1:
#wline=wline+'... \n '
#wline=wline[0:len(wline)-1]+"}';\n"
wline = '};\n'
#wline=wline+'RING = atsetenergy(RING,'+str(Energy)+');\n'
wline=wline+'RING = atsetRFCavity(RING,'+str(RFVoltage)+",1,"+str(HarmNumber)+",0);\n"
wline=wline+'RING = atSetRingProperties(RING);'
self.write(wline)
print ('cccccccccccc',cir)
class EMALIGN:
def __init__(self, prop):
self.SN='EMALIGN'
self.NAME=prop['Name']
class EWATCH:
def __init__(self, prop):
self.SN='EWATCH'
self.NAME=prop['Name']
self.MODE=prop['Mode']
self.FILENAME=prop['Filename']
self.INTERVAL=prop['Interval']