A. Petrenko (Novosibirsk, 2019)
import numpy as np
import pandas as pd
import holoviews as hv
import os
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
#!sddsquery results/twiss.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
Reading $R_{56}$:
out = !sdds2stream results/R.sdds \
-col=ElementName,s,R56 -pipe=out
DATA = StringIO("\n".join(out))
df_R = pd.read_csv(DATA, names=['ElementName','s','R56'], delim_whitespace=True)
df_R.tail(3)
dim_R56 = hv.Dimension('R56', unit='m', label="R56")
R56 = hv.Curve((df_R.s, df_R.R56), label='R56', kdims=dim_s, vdims=dim_R56)
%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.40,+0.40))
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*R56 + mag).cols(1)
#!sddsprintout results/twiss.twi -par=nux -par=nuy
#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 = 5300.0 # normalized emittance [mm*mrad]
e_ny = 5300.0 # 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.0335
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,30))
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)
Beam centroid:
!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=(-30,+30))
dim_y = hv.Dimension('y', unit='mm', label="y", range=(-30,+30))
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=(-28,+28)) #, 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']
df_xyz['Z'] = df_xyz['Z'] - 20.0
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