In [1]:
import numpy as np
import pandas as pd
import holoviews as hv
import os
from IPython.display import Image

hv.extension('matplotlib')
In [2]:
pwd
Out[2]:
'C:\\!Work\\BINP\\c-tau\\Injector\\p-linac\\Martyshkin'
In [3]:
!ls -all -h
total 45M
drwxr-xr-x 4 Alexey Petrenko Administrators 4.0K May 11 22:11 .
drwxr-xr-x 7 Alexey Petrenko Administrators 4.0K May  8 13:45 ..
drwxr-xr-x 2 Alexey Petrenko Administrators    0 May 11 22:05 .ipynb_checkpoints
-rw-r--r-- 1 Alexey Petrenko Administrators 8.0M Mar 20 17:56 80-6.dat2
-rw-r--r-- 1 Alexey Petrenko Administrators 9.5M Mar 20 17:56 80-7.dat2
-rw-r--r-- 1 Alexey Petrenko Administrators  11M Mar 20 17:56 80-8.dat2
-rw-r--r-- 1 Alexey Petrenko Administrators 3.7M Mar 11 17:43 Pavel Martyshkin. ct-factory.pdf
-rw-r--r-- 1 Alexey Petrenko Administrators 5.0M Mar  6 13:10 Pavel Martyshkin. ct-factory.pptx
-rw-r--r-- 1 Alexey Petrenko Administrators 1.3M May 11 22:11 dat2sdds.html
-rw-r--r-- 1 Alexey Petrenko Administrators 1.8M May 11 22:11 dat2sdds.ipynb
-rw-r--r-- 1 Alexey Petrenko Administrators 1.8M Mar 20 21:56 plot.html
-rw-r--r-- 1 Alexey Petrenko Administrators 3.0M Mar 20 21:56 plot.ipynb
drwxr-xr-x 2 Alexey Petrenko Administrators 4.0K May 11 22:09 results

Reading dat-file

In [4]:
dat = '80-8.dat2'
In [5]:
!head -4 $dat
   x(cm)         y(cm)         z(cm)          betx           bety           betz       
  -0.306712     -0.129667   -118.038297   -0.201571826    0.121096071    0.959625231   
  -0.183744      0.187483    -76.613413   -0.054458183    0.193268288    0.975308374   
  -0.180331     -0.134400     -0.503864   -0.000021356    0.000404277    0.999996187   
In [6]:
def read_dat(dat):
    df = pd.read_csv(dat, names=['x', 'y', 'z', 'vx', 'vy', 'vz'], delim_whitespace=True, skiprows=1)
    df['x'] = df['x']*10.0 # mm
    df['y'] = df['y']*10.0 # mm
    df['z'] = df['z']*10.0 # mm
    df['p'] = 0.511/np.sqrt(1-(df['vx']*df['vx'] + df['vy']*df['vy'] + df['vz']*df['vz'])) # MeV/c
    df['xp']= 1e3*df['vx']/df['vz'] # mrad
    df['yp']= 1e3*df['vy']/df['vz'] # mrad
    return df
In [7]:
df = read_dat(dat)
In [8]:
df.head(3)
Out[8]:
x y z vx vy vz p xp yp
0 -3.06712 -1.29667 -1180.38297 -0.201572 0.121096 0.959625 3.310655 -210.052653 126.191004
1 -1.83744 1.87483 -766.13413 -0.054458 0.193268 0.975308 5.557221 -55.836887 198.161210
2 -1.80331 -1.34400 -5.03864 -0.000021 0.000404 0.999996 187.064197 -0.021356 0.404279
In [9]:
df.tail(3)
Out[9]:
x y z vx vy vz p xp yp
127917 -1.19112 -6.43032 -4.83780 -0.005545 -0.004722 0.999970 198.268106 -5.545192 -4.721922
127918 0.10751 3.28405 -9.43167 0.001102 0.003774 0.999988 172.332324 1.102020 3.774303
127919 2.63936 -1.28877 -2.78681 -0.002129 -0.000536 0.999994 193.031566 -2.128612 -0.535891

Plotting the data

In [10]:
%opts Scatter (alpha=0.01 s=2) [aspect=1 show_grid=True]

dim_x  = hv.Dimension('x',  unit='mm', label='$x$', range=(-12,+12))
dim_xp = hv.Dimension('xp', unit='mrad', label="$x'$", range=(-12,+12))

dim_y  = hv.Dimension('y',  unit='mm', label='$y$', range=(-12,+12))
dim_yp = hv.Dimension('yp', unit='mrad', label="$y'$", range=(-12,+12))

dim_z  = hv.Dimension('z',  unit='mm', label='$z$', range=(-12,+12))
dim_p  = hv.Dimension('p', unit='MeV/c', label='$p$', range=(0,None)) # label='100%*$\Delta p/p$', range=(-1.5,+1.5))

%output backend='matplotlib' fig='png' size=100 dpi=100
In [11]:
hv.Scatter(df, kdims=[dim_z,dim_p]) + hv.Scatter(df, kdims=[dim_xp,dim_p]) + hv.Scatter(df, kdims=[dim_x,dim_p])
Out[11]:
In [12]:
(hv.Scatter(df, kdims=[dim_x,dim_y]) + \
 hv.Scatter(df, kdims=[dim_yp,dim_y]) + \
 hv.Scatter(df, kdims=[dim_x,dim_xp]) + \
 hv.Scatter(df, kdims=[dim_yp,dim_xp])).cols(2)
Out[12]:

Converting the data into the Elegant-compatible sdds-file

In [13]:
df.tail(3)
Out[13]:
x y z vx vy vz p xp yp
127917 -1.19112 -6.43032 -4.83780 -0.005545 -0.004722 0.999970 198.268106 -5.545192 -4.721922
127918 0.10751 3.28405 -9.43167 0.001102 0.003774 0.999988 172.332324 1.102020 3.774303
127919 2.63936 -1.28877 -2.78681 -0.002129 -0.000536 0.999994 193.031566 -2.128612 -0.535891
In [14]:
df['x_m']    =  df['x']*1e-3
df['y_m']    =  df['y']*1e-3
df['xp_rad'] =  df['xp']*1e-3
df['yp_rad'] =  df['yp']*1e-3
df['p_mc']   =  df['p']/0.511
df['t_sec']  = -df['z']*1e-3/3e8
In [15]:
df.tail(3)
Out[15]:
x y z vx vy vz p xp yp x_m y_m xp_rad yp_rad p_mc t_sec
127917 -1.19112 -6.43032 -4.83780 -0.005545 -0.004722 0.999970 198.268106 -5.545192 -4.721922 -0.001191 -0.006430 -0.005545 -0.004722 388.000207 1.612600e-11
127918 0.10751 3.28405 -9.43167 0.001102 0.003774 0.999988 172.332324 1.102020 3.774303 0.000108 0.003284 0.001102 0.003774 337.245253 3.143890e-11
127919 2.63936 -1.28877 -2.78681 -0.002129 -0.000536 0.999994 193.031566 -2.128612 -0.535891 0.002639 -0.001289 -0.002129 -0.000536 377.752576 9.289367e-12
In [16]:
df = df[df.p_mc > 160/0.511]

tmp = "results/isdlksd.txt"

df[['x_m', 'xp_rad', 'y_m', 'yp_rad', 't_sec', 'p_mc']].to_csv(tmp, sep=' ', index=False, float_format='%.6e')
In [17]:
!head -4 $tmp
x_m xp_rad y_m yp_rad t_sec p_mc
-1.803310e-03 -2.135608e-05 -1.344000e-03 4.042785e-04 1.679547e-11 3.660747e+02
7.770700e-04 6.036217e-04 1.859900e-04 3.422682e-03 1.005963e-11 3.844725e+02
-3.243500e-04 1.497080e-03 5.703980e-03 1.993092e-03 1.614667e-12 3.973898e+02
In [18]:
sdds = 'results/beam.sdds'
os.path.exists(sdds) and os.remove(sdds)
In [19]:
!plaindata2sdds $tmp $sdds -inputMode=ascii -outputMode=binary \
    -noRowCount -skiplines=1 \
        -column=x,double,units=m \
        -column=xp,double,symbol=x' \
        -column=y,double,units=m \
        -column=yp,double,symbol=y' \
        -column=t,double,units=s \
        -column=p,double,units=m$$be$$nc
In [20]:
os.path.exists(tmp) and os.remove(tmp)
In [21]:
png = 'results/image.png'
w = sdds
!sddsplot -lay=2,2 -device=lpng -output=$png \
    -col=x,y -graph=dot,type=2 $w -endPanel \
    -col=yp,y -graph=dot,type=2 $w -endPanel \
    -col=x,xp -graph=dot,type=2  $w -endPanel \
    -col=yp,xp -graph=dot,type=2 $w
Image(png)
Out[21]:
In [22]:
!sddsplot -device=lpng -output=$png -lay=2,2 "-title=" \
    -col=t,p -factor=yMult=0.511,xMult=-3e11 \
        "-xlabel=z (mm)" "-ylabel=p (MeV/c)" -graph=dot,type=2 $w -endPanel \
    -col=xp,p -factor=yMult=0.511,xMult=1e3 \
        "-xlabel=xp (mrad)" "-ylabel=p (MeV/c)" -graph=dot,type=2 $w -endPanel \
    -col=t,x -factor=xMult=-3e11,yMult=1e3 \
        "-xlabel=z (mm)" "-ylabel=x (mm)" -graph=dot,type=2 $w -endPanel \
    -col=xp,x -factor=yMult=1e3,xMult=1e3 \
        "-xlabel=xp (mrad)" "-ylabel=x (mm)" -graph=dot,type=2 $w -endPanel
Image(png)
Out[22]:

Run sddsanalyzebeam to check the beam parameters:

In [23]:
beam_analyzed = 'results/beam_analyzed.sdds'
!sddsprocess $sdds -pipe=out -filter=col,p,330,1000 | sddsanalyzebeam -pipe=in $beam_analyzed
In [24]:
!sddsquery $beam_analyzed
file results/beam_analyzed.sdds is in SDDS protocol version 1
data is little-endian binary

56 columns of data:
NAME            UNITS           SYMBOL          FORMAT          TYPE    FIELD  DESCRIPTION
                                                                        LENGTH
ElementName     NULL            NULL            NULL            string  0       NULL
ex              m               $ge$r$bx$n      NULL            double  0       NULL
enx             m               $ge$r$bnx$n     NULL            double  0       NULL
betax           m               $gb$r$bx$n      NULL            double  0       NULL
alphax          NULL            $ga$r$bx$n      NULL            double  0       NULL
etax            m               $gc$r$bx$n      NULL            double  0       NULL
etaxp           NULL            $gc$r$bx$n$a'$n NULL            double  0       NULL
ey              m               $ge$r$by$n      NULL            double  0       NULL
eny             m               $ge$r$bny$n     NULL            double  0       NULL
betay           m               $gb$r$by$n      NULL            double  0       NULL
alphay          NULL            $ga$r$by$n      NULL            double  0       NULL
etay            m               $gc$r$by$n      NULL            double  0       NULL
etayp           NULL            $gc$r$by$n$a'$n NULL            double  0       NULL
Sx              m               $gs$r$bx$n      NULL            double  0       NULL
Sxp             NULL            $gs$r$bx'$n     NULL            double  0       NULL
Sy              m               $gs$r$by$n      NULL            double  0       NULL
Syp             NULL            $gs$r$by'$n     NULL            double  0       NULL
St              s               $gs$r$bt$n      NULL            double  0       NULL
Sdelta          NULL            $gs$bd$n$r      NULL            double  0       NULL
pAverage        NULL            <p>             NULL            double  0       NULL
el              s               $ge$r$bl$n      NULL            double  0       NULL
ecx             m               $ge$r$bcx$n     NULL            double  0       NULL
ecnx            m               $ge$r$bcnx$n    NULL            double  0       NULL
betacx          m               $gb$r$bcx$n     NULL            double  0       NULL
alphacx         NULL            $ga$r$bcx$n     NULL            double  0       NULL
ecy             m               $ge$r$bcy$n     NULL            double  0       NULL
ecny            m               $ge$r$bcny$n    NULL            double  0       NULL
betacy          m               $gb$r$bcy$n     NULL            double  0       NULL
alphacy         NULL            $ga$r$bcy$n     NULL            double  0       NULL
Cx              m               NULL            NULL            double  0       NULL
s11             m$a2$n          NULL            NULL            double  0       NULL
Cxp             NULL            NULL            NULL            double  0       NULL
s12             m               NULL            NULL            double  0       NULL
s22             NULL            NULL            NULL            double  0       NULL
Cy              m               NULL            NULL            double  0       NULL
s13             m$a2$n          NULL            NULL            double  0       NULL
s23             m               NULL            NULL            double  0       NULL
s33             m$a2$n          NULL            NULL            double  0       NULL
Cyp             NULL            NULL            NULL            double  0       NULL
s14             m               NULL            NULL            double  0       NULL
s24             NULL            NULL            NULL            double  0       NULL
s34             m               NULL            NULL            double  0       NULL
s44             NULL            NULL            NULL            double  0       NULL
Ct              s               NULL            NULL            double  0       NULL
s15             s m             NULL            NULL            double  0       NULL
s25             s               NULL            NULL            double  0       NULL
s35             s m             NULL            NULL            double  0       NULL
s45             s               NULL            NULL            double  0       NULL
s55             s$a2$n          NULL            NULL            double  0       NULL
Cdelta          NULL            NULL            NULL            double  0       NULL
s16             m               NULL            NULL            double  0       NULL
s26             NULL            NULL            NULL            double  0       NULL
s36             m               NULL            NULL            double  0       NULL
s46             NULL            NULL            NULL            double  0       NULL
s56             s               NULL            NULL            double  0       NULL
s66             NULL            NULL            NULL            double  0       NULL

1 parameters:
NAME                UNITS               SYMBOL              TYPE                DESCRIPTION
canonical           NULL                NULL                long                NULL
In [25]:
items = np.array([
    # name in file   symbol                   factor   units
    ['enx',        '\\epsilon_{nx}',         1.0e6,   'mm \\cdot mrad'],
    ['betax',      '\\beta_x',               1.0,     'm'             ],
    ['alphax',     '\\alpha_x',              1.0,     ''              ],
    ['Sx',         '\\sigma_x',              1.0e3,   'mm'            ],
    ['Sxp',        "\\sigma_{x'}",           1.0e3,   'mrad'          ],
    ['eny',        '\\epsilon_{ny}',         1.0e6,   'mm \\cdot mrad'],
    ['betay',      '\\beta_y',               1.0,     'm'             ],
    ['alphay',     '\\alpha_y',              1.0,     ''              ],
#   ['Sy',         '\\sigma_y',              1.0e3,   'mm'            ],
#   ['Syp',        "\\sigma_{y'}",           1.0e3,   'mrad'          ],
    ['St',         '\\sigma_t',              1e12,    'ps'            ],
    ['St',         '\\sigma_z',              3e11,    'mm'            ],
    ['Sdelta',     '\\sigma_{\\Delta p/p}',  100.0,   '\\%'           ],
    ['pAverage',   'p_{average}',            0.511,   'MeV/c'         ],
#   ['Charge',     'Q',                      1.0e12,  'pC'            ],
])

names = items[:,0]
cols_str = "-col=" + ",".join(names)
cols_str
Out[25]:
'-col=enx,betax,alphax,Sx,Sxp,eny,betay,alphay,St,St,Sdelta,pAverage'
In [26]:
out = !sdds2stream $beam_analyzed $cols_str -pipe=out
values = out[0].split()
values = np.array(values)
values = values.astype(np.float)
values = dict(zip(names, values))
In [27]:
latex_str = r"\begin{aligned}"

for name,symbol,factor,units in items:
    value = values[name]*factor.astype(float)
    latex_str = latex_str + r"%s &= %.3f~\rm{%s} \\" % (symbol, value, units)

latex_str = latex_str + r"\end{aligned}"
In [28]:
from IPython.display import Latex
In [29]:
Latex(latex_str)
Out[29]:
\begin{aligned}\epsilon_{nx} &= 5410.954~\rm{mm \cdot mrad} \\\beta_x &= 1.216~\rm{m} \\\alpha_x &= 0.011~\rm{} \\\sigma_x &= 4.121~\rm{mm} \\\sigma_{x'} &= 3.389~\rm{mrad} \\\epsilon_{ny} &= 5328.430~\rm{mm \cdot mrad} \\\beta_y &= 1.204~\rm{m} \\\alpha_y &= 0.016~\rm{} \\\sigma_t &= 23.101~\rm{ps} \\\sigma_z &= 6.930~\rm{mm} \\\sigma_{\Delta p/p} &= 5.082~\rm{\%} \\p_{average} &= 197.977~\rm{MeV/c} \\\end{aligned}