A. Petrenko (Novosibirsk, 2019)
import numpy as np
import pandas as pd
import holoviews as hv
import os
hv.extension("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 = pd.read_csv(DATA, names=['ElementName', 's', 'Profile'], delim_whitespace=True)
df.head(3)
df.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, 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['p'] = mc*df['p'] # 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_p = hv.Dimension('p', unit='MeV/c', range=(0,None))
dim_beta = hv.Dimension('beta', unit='m', label="β", range=(0,None))
s_p = hv.Curve((df.s, df.p), kdims=dim_s, vdims=dim_p)
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')
(s_p + beta_x*beta_y + mag).cols(1)
#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 = 9.2 # normalized emittance [mm*mrad]
e_ny = e_nx
#e_x = e_nx * 1e-6 / gamma # geometric emittance [m]
#e_y = e_ny * 1e-6 / gamma
df['e_x'] = e_nx * 1e-6 / (df['p']/mc) # geometric emittance [m]
df['dp/p'] = 0
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_x'] + 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,None))
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)
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=(-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])
(s_p + Ax_pos*Ax_neg*Cx*Cy + mag).cols(1)