A. Petrenko (Novosibirsk, 2019)
import numpy as np
import pandas as pd
import holoviews as hv
import os
from IPython.display import Latex
from IPython.display import Image
hv.extension("bokeh", 'matplotlib')
import warnings
warnings.filterwarnings('ignore')
!pwd
%output backend='bokeh'
%opts Curve Spread [width=700 height=300 show_grid=True \
default_tools=['box_zoom','pan','wheel_zoom','reset']]
Elegant lattice file:
with open("machine.lte", "r") as f:
print(f.read())
with open("twiss.ele", "r") as f:
print(f.read())
Run Elegant
!elegant twiss.ele
os.listdir("results")
Reading beamline.mag
out = !sdds2stream results/beamline.mag -col=ElementName,s,Profile -pipe=out
out[:3]
print("\n".join(out[:3]))
from io import StringIO
DATA = StringIO("\n".join(out))
df_mag = pd.read_csv(DATA, names=['ElementName', 's', 'Profile'], delim_whitespace=True)
df_mag.head(3)
df_mag.tail(3)
dim_s = hv.Dimension('s', unit='m', label="s") # range=(-80,0))
#hv.help(hv.Curve)
from bokeh.models import HoverTool
#hover = HoverTool(tooltips=[("Name", "@ElementName")])
hover = HoverTool(tooltips="@ElementName")
%opts Curve.mag [height=70 show_frame=False show_title=False \
xaxis=None yaxis=None tools=['xbox_zoom, xpan', hover]] (color='black', alpha=0.3)
mag = hv.Curve(df_mag, kdims=dim_s, vdims=['Profile', 'ElementName'], group='mag')
mag
Reading Twiss parameters file
twi = "results/twiss.twi"
#!sddsquery $twi
out = !sdds2stream results/twiss.twi \
-col=ElementName,s,betax,betay,alphax,alphay,etax,etay,pCentral0,xAperture,yAperture -pipe=out
DATA = StringIO("\n".join(out))
df = pd.read_csv(DATA, names=['ElementName','s','betax','betay','alphax','alphay',
'etax','etay','p','xAperture','yAperture'],
delim_whitespace=True)
df.tail(3)
mc = 0.511 # MeV/c
df['xAperture'] = 1e3*df['xAperture'] # mm
df['yAperture'] = 1e3*df['yAperture'] # mm
%opts Curve.fx (color='red', alpha=0.7, line_width=3)
%opts Curve.fy (color='blue', alpha=0.7, line_width=3)
dim_beta = hv.Dimension('beta', unit='m', label="β", range=(0,15))
dim_eta = hv.Dimension('eta', unit='m', label="D", range=(0,+0.25))
beta_x = hv.Curve((df.s, df.betax), label='βx', kdims=dim_s, vdims=dim_beta, group='fx')
beta_y = hv.Curve((df.s, df.betay), label='βy', kdims=dim_s, vdims=dim_beta, group='fy')
eta_x = hv.Curve((df.s, df.etax), label='Dx', kdims=dim_s, vdims=dim_eta, group='fx')
(beta_x*beta_y + eta_x + mag).cols(1)
def sddspar(file_name, par_name):
s = !sdds2stream $file_name -par=$par_name
s = s[0]
try:
val = float(s)
return val
except (ValueError, TypeError):
return s
nux=sddspar(twi,'nux')
nuy=sddspar(twi,'nuy')
Latex(r'$\nu_x=%.3f,\ \nu_y=%.3f$' % (nux, nuy))
diag = 'results/resdiag.sdds'
nux_int = np.floor(nux)
nuy_int = np.floor(nuy)
!sddsresdiag $diag -order=8 -integerTunes=$nux_int,$nuy_int -superperiodicity=1
png = "results/image.png"
!sddsplot -device=lpng -output=$png -split=page \
-col=nux,nuy -graph=line,type=15 -filter=par,Order,5,5 $diag \
-par=nux,nuy -graph=sym,type=1,subtype=1,scale=3,thick=3 $twi
Image(png)
Chromaticity:
Latex(r'$\xi_x=%.1f,\ \xi_y=%.1f$' % (sddspar(twi,'dnux/dp'), sddspar(twi,'dnuy/dp')))
!sddsprintout results/twiss.twi \
-par=taudelta -par=taux -par=tauy -par=U0 -par=enx0 -par=Sdelta0
#Dx = hv.Curve((df.s, df.etax), label='Dx', kdims='s (m)', vdims='D (m)', group='fx')
#Dy = hv.Curve((df.s, df.etay), label='Dy', group='fy')
#(Dx*Dy + mag).cols(1)
e_nx = 4537.6 # normalized emittance [mm*mrad]
e_ny = 3512.5 # normalized emittance [mm*mrad]
#e_x = e_nx * 1e-6 / gamma # geometric emittance [m]
df['e_x'] = e_nx * 1e-6 / (df['p']/mc) # geometric emittance [m]
df['e_y'] = e_ny * 1e-6 / (df['p']/mc) # geometric emittance [m]
df['dp/p'] = 0.01
df['sigma_x'] = 1e3*np.sqrt(df['betax']*df['e_x'] + df['etax']*df['etax']*df['dp/p']*df['dp/p']) # mm
df['sigma_y'] = 1e3*np.sqrt(df['betay']*df['e_y'] + df['etay']*df['etay']*df['dp/p']*df['dp/p']) # mm
df.tail(3)
%opts Curve.Aper (color='gray', alpha=0.5, line_width=3)
dim_sigma = hv.Dimension('sigma', unit='mm', label="2σ", range=(0,16))
dim_aper = hv.Dimension('aper', unit='mm', label="Aperture", range=(0,None))
Ax = hv.Curve((df.s, df.xAperture), label='Aperture', kdims=dim_s, vdims=dim_sigma, group='Aper')
Ax_pos = Ax
Ax_neg = hv.Curve((df.s, -df.xAperture), label='Aperture', kdims=dim_s, vdims=dim_sigma, group='Aper')
Sx = hv.Curve((df.s, 2*df.sigma_x), label='2σx', kdims=dim_s, vdims=dim_sigma, group='fx')
Sy = hv.Curve((df.s, 2*df.sigma_y), label='2σy', kdims=dim_s, vdims=dim_sigma, group='fy')
#(Sx*Sy*Ax + mag).cols(1)
(Sx*Sy + mag).cols(1)
!sddsquery results/beam.cen
out = !sdds2stream results/beam.cen -col=ElementName,s,Cx,Cy,pCentral -pipe=out
DATA = StringIO("\n".join(out))
df_cen = pd.read_csv(DATA, names=['ElementName','s','Cx','Cy','p'],
delim_whitespace=True)
df_cen.tail(3)
df_cen['Cx'] = df_cen['Cx']*1e3 # m -> mm
df_cen['Cy'] = df_cen['Cy']*1e3 # m -> mm
df_cen['p'] = df_cen['p']*0.511 # gamma*beta -> MeV/c
dim_x = hv.Dimension('x', unit='mm', label="x", range=(-16,+16))
dim_y = hv.Dimension('y', unit='mm', label="y", range=(-16,+16))
dim_p = hv.Dimension('p', unit='MeV/c', label="p", range=(0,None))
#s_p = hv.Curve((df_cen.s, df_cen.p), kdims=dim_s, vdims=dim_p)
Cx = hv.Spread((df_cen.s, df_cen.Cx, 2*df.sigma_x), label='x', \
kdims=dim_s, vdims=[dim_x,dim_aper])
Cy = hv.Spread((df_cen.s, df_cen.Cy, 2*df.sigma_y), label='y', \
kdims=dim_s, vdims=[dim_y,dim_aper])
(Ax_pos*Ax_neg*Cy*Cx + mag).cols(1)
Tunnel walls:
df_wall = pd.read_csv('../../drawings_and_maps/results/tunnel.csv')
%output backend='matplotlib' fig='svg' size=200
#%output backend='matplotlib' fig='png' size=160
%opts Layout [tight=True]
%opts Curve [show_grid=True aspect='equal']
dim_X = hv.Dimension('X', label='X', unit='m') #, range=(z_min,z_max))
dim_Z = hv.Dimension('Z', label='Z', unit='m', range=(-32,+32)) #, range=(z_min,z_max))
%opts Curve.Tunnel (color='gray', alpha=0.5, line_width=3)
Tunnel = hv.Curve((df_wall.Z,df_wall.X), kdims=dim_Z, vdims=dim_X, group='Tunnel')
Tunnel
Reading xyz.sdds file
out = !sdds2stream results/xyz.sdds \
-col=ElementName,s,X,Y,Z,theta,phi,psi -pipe=out
DATA = StringIO("\n".join(out))
df_xyz = pd.read_csv(DATA, names=['ElementName','s','X','Y','Z','theta','phi','psi'],
delim_whitespace=True)
df_xyz['X'] = df_xyz['X'] - 12.5
df_xyz['Z'] = df_xyz['Z'] - 1.85
df_xyz.tail(3)
from scipy import interpolate
theta = interpolate.interp1d(
df_xyz.s.values, df_xyz.theta.values,
fill_value=(0, 0), bounds_error=False
)
X0 = interpolate.interp1d(
df_xyz.s.values, df_xyz.X.values,
fill_value=(0, 0), bounds_error=False
)
Z0 = interpolate.interp1d(
df_xyz.s.values, df_xyz.Z.values,
fill_value=(0, 0), bounds_error=False
)
s = df_mag.s.values
nx = np.cos(theta(s))
nz = -np.sin(theta(s))
Element_width = 0.5 # m
df_mag['X'] = X0(s) + Element_width*df_mag['Profile']*nx
df_mag['Z'] = Z0(s) + Element_width*df_mag['Profile']*nz
df_mag.tail(6)
#XY_traj = hv.Curve((df_xyz.Z,df_xyz.X), kdims=dim_Z, vdims=dim_X)
#XY_traj*Tunnel
XY_traj = hv.Curve((df_mag.Z,df_mag.X), kdims=dim_Z, vdims=dim_X)
XY_traj*Tunnel
%output backend='bokeh'
%opts Curve.mag2D [width=800 height=700 show_grid=True tools=[hover]] (color='black', alpha=0.5)
mag = hv.Curve(df_mag, kdims=dim_Z, vdims=[dim_X, 'ElementName'], group='mag2D')
mag*Tunnel
%load_ext watermark
%watermark --python --date --iversions --machine