Tracking

A. Petrenko (Novosibirsk, 2019)

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

hv.extension("bokeh")
In [2]:
%opts Curve Spread [width=700 height=300 show_grid=True \
            default_tools=['box_zoom','pan','wheel_zoom','reset']]

Elegant lattice file:

Plot sdds-beam

In [3]:
w = "../Martyshkin/results/beam.sdds"
In [4]:
#!plaindata2sdds
In [5]:
png = "results/image.png"
!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[5]:
In [6]:
!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[6]:
In [7]:
with open("machine.lte", "r") as f:
    print(f.read())
w0: watch,filename="results/w0.sdds",mode=coord
w1: watch,filename="results/w1.sdds",mode=coord
w2: watch,filename="results/w2.sdds",mode=coord
w3: watch,filename="results/w3.sdds",mode=coord

MA26: MAXAMP, X_MAX=13.0e-3, Y_MAX=13.0e-3, ELLIPTICAL=1

MA20: MAXAMP, X_MAX=10.0e-3, Y_MAX=10.0e-3, ELLIPTICAL=1
MA22: MAXAMP, X_MAX=11.0e-3, Y_MAX=11.0e-3, ELLIPTICAL=1

MA30: MAXAMP, X_MAX=15.0e-3, Y_MAX=15.0e-3, ELLIPTICAL=1

MA18: MAXAMP, X_MAX=9.0e-3, Y_MAX=9.0e-3, ELLIPTICAL=1

D05:   DRIFT, L=0.08
COR1:  KICKER, L=0.04, HKICK=-0.0007, VKICK=-0.003
DCOR1: DRIFT, L=0.08

!D10:  DRIFT, L=0.20
D10:  LINE=(D05,COR1,DCOR1)

Q10:  KQUAD,  L=0.10, K1 = +19.0, N_KICKS=10
DQ10: DRIFT, L=0.05

D20:  DRIFT, L=0.05
Q20:  KQUAD,  L=0.10, K1 = -28.0, N_KICKS=10

D25:   DRIFT, L=0.08
COR2:  KICKER, L=0.04, HKICK=+0.0009, VKICK=+0.0025
DCOR2: DRIFT, L=0.08

!DQ20: DRIFT, L=0.20
DQ20: LINE=(D25,COR2,DCOR2)

RF250: RFCA, L=0.250, VOLT=5.0e6, PHASE=90, FREQ=2856e6, change_p0=1

DN200: DRIFT, L=-0.200

Q22:  KQUAD,  L=0.40, K1 = 6.5, N_KICKS=10
Q23:  KQUAD,  L=0.40, K1 =-7.1, N_KICKS=10

Q24:  KQUAD,  L=0.40, K1 = 8.0, N_KICKS=10
Q25:  KQUAD,  L=0.40, K1 =-8.4, N_KICKS=10

Q26:  KQUAD,  L=0.40, K1 = 8.0, N_KICKS=10
Q27:  KQUAD,  L=0.40, K1 =-8.0, N_KICKS=10


D30:  DRIFT, L=0.60
!Q30:  QUAD,  L=0.10, K1 =+25.8

Q30_10:  KQUAD,  L=0.10, K1 =+27, N_KICKS=10
DQ30_10: DRIFT, L=0.15
Q30_15:  KQUAD,  L=0.10, K1 =-25, N_KICKS=10


CHD10: DRIFT, L=0.11

B10: csbend,angle=-0.04,l=0.17,e1=0,e2=-0.04,&
 nonlinear=1,n_kicks=20,integration_order=4
DB10: DRIFT, L=0.10

B20: csbend,angle=0.04,l=0.17,e1=0.04,e2=0,&
 nonlinear=1,n_kicks=20,integration_order=4
DB20: DRIFT, L=0.10

B30: csbend,angle=0.04,l=0.17,e1=0,e2=0.04,&
 nonlinear=1,n_kicks=20,integration_order=4
DB30: DRIFT, L=0.10

B40: csbend,angle=-0.04,l=0.17,e1=-0.04,e2=0,&
 nonlinear=1,n_kicks=20,integration_order=4
DB40: DRIFT, L=0.11

!CHICANE: DRIFT, L=1.20
CHICANE: LINE=(CHD10,B10,DB10,B20,DB20,B30,DB30,B40,DB40)

Q30_20:  KQUAD,  L=0.10, K1 =-25, N_KICKS=10
DQ30_20: DRIFT, L=0.15
Q30_25:  KQUAD,  L=0.10, K1 =+27, N_KICKS=10

EP_SEP:  LINE=(Q30_10,DQ30_10,Q30_15,CHICANE,Q30_20,DQ30_20,Q30_25)


DQ30: DRIFT, L=0.60



Q32:  QUAD,  L=0.40, K1 =-7.7
Q33:  QUAD,  L=0.40, K1 = 7.7

Q34:  QUAD,  L=0.40, K1 =-7.7
Q35:  QUAD,  L=0.40, K1 = 7.7

Q36:  QUAD,  L=0.40, K1 =-7.7
Q37:  QUAD,  L=0.40, K1 = 7.7

D40:  DRIFT, L=0.25
Q40:  QUAD,  L=0.10, K1 =-25.8
DQ40: DRIFT, L=0.25


Q42:  QUAD,  L=0.40, K1 = 7.7
Q43:  QUAD,  L=0.40, K1 =-7.7

Q44:  QUAD,  L=0.40, K1 = 7.7
Q45:  QUAD,  L=0.40, K1 =-7.7

Q46:  QUAD,  L=0.40, K1 = 7.7
Q47:  QUAD,  L=0.40, K1 =-7.7


D50:  DRIFT, L=0.25
Q50:  QUAD,  L=0.10, K1 =+25.8
DQ50: DRIFT, L=0.25


D60:  DRIFT, L=0.25
Q60:  QUAD,  L=0.10, K1 =-17.5
DQ60: DRIFT, L=0.25

Q63:  QUAD,  L=0.40, K1 =+4.0
Q65:  QUAD,  L=0.40, K1 =-4.0
Q67:  QUAD,  L=0.40, K1 =+4.0

D70:  DRIFT, L=0.25
Q70:  QUAD,  L=0.10, K1 =-14.2
DQ70: DRIFT, L=0.25

Q73:  QUAD,  L=0.40, K1 =+4.0
Q75:  QUAD,  L=0.40, K1 =-4.0
Q77:  QUAD,  L=0.40, K1 =+4.0

D80:  DRIFT, L=0.25
Q80:  QUAD,  L=0.10, K1 =-14.2
DQ80: DRIFT, L=0.25


FODO10: LINE=(&
    MA26,D10,Q10,DQ10,&
    D20,Q20,DQ20,MA20,w1,&
          RF250,DN200,Q22,DN200,&
    RF250,RF250,DN200,Q23,DN200,&
    RF250,RF250,DN200,Q24,DN200,&
    RF250,RF250,DN200,Q25,DN200,&
    RF250,RF250,DN200,Q26,DN200,&
    RF250,RF250,DN200,Q27,DN200,&
    RF250)


RF_WITH_QUADS10: LINE=(MA20,&
          RF250,DN200,Q32,DN200,&
    RF250,RF250,DN200,Q33,DN200,&
    RF250,RF250,DN200,Q34,DN200,&
    RF250,RF250,DN200,Q35,DN200,&
    RF250,RF250,DN200,Q36,DN200,&
    RF250,RF250,DN200,Q37,DN200,&
    RF250)



RF_WITH_QUADS20: LINE=(MA20,&
          RF250,DN200,Q42,DN200,&
    RF250,RF250,DN200,Q43,DN200,&
    RF250,RF250,DN200,Q44,DN200,&
    RF250,RF250,DN200,Q45,DN200,&
    RF250,RF250,DN200,Q46,DN200,&
    RF250,RF250,DN200,Q47,DN200,&
    RF250)


Q34_2:  QUAD,  L=0.40, K1 =-7.7
Q35_2:  QUAD,  L=0.40, K1 = 6.8

Q36_2:  QUAD,  L=0.40, K1 =-5.7
Q37_2:  QUAD,  L=0.40, K1 = 5.4


RF_WITH_QUADS10_2: LINE=(MA20,&
          RF250,DN200,Q32,DN200,&
    RF250,RF250,DN200,Q33,DN200,&
    RF250,RF250,DN200,Q34_2,DN200,&
    RF250,RF250,DN200,Q35_2,DN200,&
    RF250,RF250,DN200,Q36_2,DN200,&
    RF250,RF250,DN200,Q37_2,DN200,&
    RF250)


FODO20: LINE=(&
    RF_WITH_QUADS10,&
    MA22,D40,Q40,DQ40,&
    RF_WITH_QUADS20,&
    MA22,D50,Q50,DQ50)



RF625: RFCA, L=0.625, VOLT="60e6 0.625 3.0 / *", PHASE=90, FREQ=2856e6, change_p0=1
RF875: RFCA, L=0.875, VOLT="60e6 0.875 3.0 / *", PHASE=90, FREQ=2856e6, change_p0=1

RF_WITH_QUADS30: LINE=(MA20,&
    RF625,&
     DN200,Q63,DN200,&
    RF875,&
     DN200,Q65,DN200,&
    RF875,&
     DN200,Q67,DN200,&
    RF625)

RF_WITH_QUADS40: LINE=(MA20,&
    RF625,&
     DN200,Q73,DN200,&
    RF875,&
     DN200,Q75,DN200,&
    RF875,&
     DN200,Q77,DN200,&
    RF625)

FODO30: LINE=(&
    MA18,D70,Q70,DQ70,&
    MA20,RF_WITH_QUADS40)


machine: LINE=(w0,&
      FODO10,w1,&
      MA30,D30,EP_SEP,DQ30,&
    2*FODO20,w2,&
      RF_WITH_QUADS10_2,&
      MA22,D60,Q60,DQ60,&
      MA20,RF_WITH_QUADS30,&
    15*FODO30,&
w3)

In [8]:
with open("track.ele", "r") as f:
    print(f.read())
!&transmute_elements name=*, type=*QUAD, new_type=DRIF &end

&divide_elements
    name = *
    maximum_length = 0.05
&end

&run_setup
    lattice = machine.lte
    use_beamline = machine
    p_central_mev = 198.0
    sigma = results/%s.sig
    centroid = results/%s.cen
    magnets = results/beamline.mag
!    output = results/%s.out
!    final = results/%s.fin
    default_order=2
!    default_order=1
&end

&floor_coordinates
    filename = results/xyz.sdds
    include_vertices = 0
    vertices_only = 0
    magnet_centers = 0
&end

&run_control
    n_steps = 1
&end

&sdds_beam
    input = ../Martyshkin/results/beam.sdds
&end

&track &end

Run Elegant

In [9]:
#!elegant twiss.ele
In [10]:
#!elegant track.ele
In [11]:
import subprocess
import sys

def run_cmd(cmd):
    sub_process = subprocess.Popen(cmd, shell=True,
                               stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    while sub_process.poll() is None:
        out = sub_process.stdout.read(10)
        sys.stdout.write(out)
        sys.stdout.flush()
In [12]:
run_cmd("elegant track.ele")
Running elegant at Sat May 11 22:28:01 2019

This is elegant 29.1.0, Mar  3 2016, by M. Borland, M. Carla', N. Carmignani, M. Ehrlichman, L. Emery, W. Guo, V. Sajaev, R. Soliday, Y.-P. Sun, C.-X. Wang, Y. Wang, Y. Wu, and A. Xiao.
Link date: Mar  3 2016 21:13:54, SVN revision: 22803M
statistics:    ET:     00:00:00 CP:    0.00 BIO:0 DIO:0 PF:0 MEM:0
&divide_elements
    name = *,
    type = {NULL},
    exclude = {NULL},
    divisions = 0,
    maximum_length = 5.000000000000000e-02,
    clear = 0,
&end
statistics:    ET:     00:00:00 CP:    0.00 BIO:0 DIO:0 PF:0 MEM:0
&run_setup
    lattice = machine.lte,
    use_beamline = machine,
    rootname = {NULL},
    output = {NULL},
    centroid = results/%s.cen,
    sigma = results/%s.sig,
    final = {NULL},
    acceptance = {NULL},
    losses = {NULL},
    magnets = results/beamline.mag,
    semaphore_file = {NULL},
    parameters = {NULL},
    combine_bunch_statistics = 0,
    wrap_around = 1,
    final_pass = 0,
    default_order = 2,
    concat_order = 0,
    print_statistics = 0,
    show_element_timing = 0,
    monitor_memory_usage = 0,
    random_number_seed = 987654321,
    correction_iterations = 1,
    echo_lattice = 0,
    p_central = 0.000000000000000e+00,
    p_central_mev = 1.980000000000000e+02,
    always_change_p0 = 0,
    load_balancing_on = 0,
    random_sequence_No = 1,
    expand_for = {NULL},
    tracking_updates = 1,
    search_path = {NULL},
    element_divisions = 0,
&end
Seeding random number generators
computed value for RF625.VOLT is 1.250000000000000e+07
computed value for RF875.VOLT is 1.750000000000000e+07
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
warning(1): element DN200 has negative length = -2.000000e-01
Further negative length warnings will be suppressed.
length of beamline MACHINE per pass: 8.179999999999922e+01 m
statistics:    ET:     00:00:00 CP:    0.10 BIO:0 DIO:0 PF:0 MEM:0
&floor_coordinates
    filename = results/xyz.sdds,
    X0 = 0.000000000000000e+00,
    Y0 = 0.000000000000000e+00,
    Z0 = 0.000000000000000e+00,
    theta0 = 0.000000000000000e+00,
    phi0 = 0.000000000000000e+00,
    psi0 = 0.000000000000000e+00,
    include_vertices = 0,
    vertices_only = 0,
    magnet_centers = 0,
    store_vertices = 0,
&end
statistics:    ET:     00:00:00 CP:    0.52 BIO:0 DIO:0 PF:0 MEM:0
&run_control
    n_steps = 1,
    bunch_frequency = 0.000000000000000e+00,
    n_indices = 0,
    n_passes = 1,
    n_passes_fiducial = 0,
    reset_rf_for_each_step = 1,
    first_is_fiducial = 0,
    restrict_fiducialization = 0,
    reset_scattering_seed = 0,
&end
statistics:    ET:     00:00:00 CP:    0.52 BIO:0 DIO:0 PF:0 MEM:0
&sdds_beam
    input = ../Martyshkin/results/beam.sdds,
    input_list = {NULL},
    input_type = elegant,
    selection_parameter = {NULL},
    selection_string = {NULL},
    one_random_bunch = 0,
    n_particles_per_ring = 0,
    reuse_bunch = 0,
    prebunched = -1,
    track_pages_separately = 0,
    use_bunched_mode = 0,
    sample_interval = 1,
    n_tables_to_skip = 0,
    center_transversely = 0,
    center_arrival_time = 0,
    reverse_t_sign = 0,
    sample_fraction = 1.000000000000000e+00,
    p_lower = 0.000000000000000e+00,
    p_upper = 0.000000000000000e+00,
    save_initial_coordinates = 1,
    n_duplicates = 0,
    duplicate_stagger[0] = 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, 0.000000000000000e+00, 
        0.000000000000000e+00, 0.000000000000000e+00,
&end
statistics:    ET:     00:00:00 CP:    0.52 BIO:0 DIO:0 PF:0 MEM:0
&track
    center_on_orbit = 0,
    center_momentum_also = 1,
    offset_by_orbit = 0,
    offset_momentum_also = 1,
    soft_failure = 1,
    use_linear_chromatic_matrix = 0,
    longitudinal_ring_only = 0,
    ibs_only = 0,
    stop_tracking_particle_limit = -1,
&end
tracking step 1
File ../Martyshkin/results/beam.sdds opened and checked.
Read page 1 from file
0 particle ID slots per bunch
104741 rows in page 1
File ../Martyshkin/results/beam.sdds was used up and closed.
a total of 104741 data points were read

tracking 104741 particles
11 May 19 22:28:01: This step establishes energy profile vs s (fiducial beam).
11 May 19 22:28:01: Rf phases/references reset.
79542 particles transmitted, total effort of 79542 particle-turns
90992604 multipole kicks done

Dumping centroid data...done.
Dumping sigma data...done.
Post-tracking output completed.
Tracking step completed   ET:     00:02:29 CP:  149.12 BIO:0 DIO:0 PF:0 MEM:0


Finished tracking.
End of input data encountered.
statistics:    ET:     00:02:29 CP:  149.15 BIO:0 DIO:0 PF:0 MEM:0
=====================================================================================
Thanks for using elegant.  Please cite the following reference in your publications:
  M. Borland, "elegant: A Flexible SDDS-Compliant Code for Accelerator Simulation,"
  Advanced Photon Source LS-287, September 2000.
If you use a modified version, please indicate this in all publications.
==================================================================
In [13]:
w = "results/w0.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[13]:
In [14]:
!sddsplot -device=lpng -output=$png -lay=2,2 "-title=" \
    -col=dt,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=dt,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[14]:
In [15]:
w = "results/w1.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[15]:
In [16]:
!sddsplot -device=lpng -output=$png -lay=2,2 "-title=" \
    -col=dt,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=dt,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[16]:
In [17]:
w = "results/w2.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[17]:
In [18]:
!sddsplot -device=lpng -output=$png -lay=2,2 "-title=" \
    -col=dt,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=dt,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[18]:
In [19]:
w = "results/w3.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[19]:
In [20]:
!sddsplot -device=lpng -output=$png -lay=2,2 "-title=" \
    -col=dt,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=dt,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[20]:

Now let's plot the results with holoviews

In [21]:
os.listdir("results")
Out[21]:
['beam.cen',
 'beamline.mag',
 'image.png',
 'parameters.sdds',
 'track.cen',
 'track.sig',
 'twiss.twi',
 'w0.sdds',
 'w1.sdds',
 'w2.sdds',
 'w3.sdds',
 'xyz.sdds']

Reading beamline.mag

In [22]:
out = !sdds2stream results/beamline.mag -col=ElementName,s,Profile -pipe=out
In [23]:
out[:3]
Out[23]:
['_BEGIN_ 0.000000000000000e+00 0.000000000000000e+00',
 'W0 0.000000000000000e+00 0.000000000000000e+00',
 'MA26 0.000000000000000e+00 0.000000000000000e+00']
In [24]:
print("\n".join(out[:3]))
_BEGIN_ 0.000000000000000e+00 0.000000000000000e+00
W0 0.000000000000000e+00 0.000000000000000e+00
MA26 0.000000000000000e+00 0.000000000000000e+00
In [25]:
from io import StringIO
In [26]:
DATA = StringIO("\n".join(out))
In [27]:
df = pd.read_csv(DATA, names=['ElementName', 's', 'Profile'], delim_whitespace=True)
In [28]:
df.head(3)
Out[28]:
ElementName s Profile
0 _BEGIN_ 0.0 0.0
1 W0 0.0 0.0
2 MA26 0.0 0.0
In [29]:
df.tail(3)
Out[29]:
ElementName s Profile
18855 RF625 81.79399 -3.535534e-01
18856 RF625 81.80000 -1.224647e-16
18857 W3 81.80000 0.000000e+00
In [30]:
dim_s = hv.Dimension('s', unit='m', label="s") # range=(-80,0))
In [31]:
#hv.help(hv.Curve)
In [32]:
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
Out[32]:

Reading track.sig file

In [33]:
#!sddsquery results/track.sig
In [34]:
out = !sdds2stream results/track.sig -col=ElementName,s,minimum1,maximum1,minimum3,maximum3,Sx,Sy -pipe=out
DATA = StringIO("\n".join(out))
df = pd.read_csv(DATA, names=['ElementName','s','xmin','xmax','ymin','ymax','sigma_x','sigma_y'],
                   delim_whitespace=True)
In [35]:
df.tail(3)
Out[35]:
ElementName s xmin xmax ymin ymax sigma_x sigma_y
2571 RF625 81.751923 -0.003951 0.003911 -0.006111 0.005947 0.001233 0.001555
2572 RF625 81.800000 -0.003777 0.003762 -0.006387 0.006229 0.001180 0.001618
2573 W3 81.800000 -0.003777 0.003762 -0.006387 0.006229 0.001180 0.001618
In [36]:
df['xmin'] = df['xmin']*1e3; df['xmax'] = df['xmax']*1e3 # mm
df['ymin'] = df['ymin']*1e3; df['ymax'] = df['ymax']*1e3 # mm
df['sigma_x'] = df['sigma_x']*1e3; df['sigma_y'] = df['sigma_y']*1e3 # mm
In [37]:
#df.tail(3)
In [38]:
dim_x = hv.Dimension('x', unit='mm', label="x", range=(0,None))
dim_y = hv.Dimension('y', unit='mm', label="y", range=(0,None))

%opts Curve.fx (color='red', alpha=0.7, line_width=3)
%opts Curve.fy (color='blue', alpha=0.7, line_width=3)
In [39]:
Sx = hv.Curve((df.s, df.sigma_x), label='σx', kdims=dim_s, vdims=dim_x, group='fx')
Sy = hv.Curve((df.s, df.sigma_y), label='σy', kdims=dim_s, vdims=dim_y, group='fy')
In [40]:
(Sx*Sy + mag).cols(1)
Out[40]:

Reading track.cen file

In [41]:
#!sddsquery results/track.cen
In [42]:
out = !sdds2stream results/track.cen -col=ElementName,s,Particles,pCentral,Cx,Cy -pipe=out
DATA = StringIO("\n".join(out))
df_cen = pd.read_csv(DATA, names=['ElementName','s','Particles','p','Cx','Cy'],
                   delim_whitespace=True)

df_cen['p'] = 0.511*df_cen['p'] # MeV/c
df_cen['Cx'] = 1e3*df_cen['Cx'] # mm
df_cen['Cy'] = 1e3*df_cen['Cy'] # mm
In [43]:
df_cen.tail(3)
Out[43]:
ElementName s Particles p Cx Cy
2571 RF625 81.751923 79542 1492.308360 0.004941 -0.030063
2572 RF625 81.800000 79542 1493.252039 0.006717 -0.029391
2573 W3 81.800000 79542 1493.252039 0.006717 -0.029391
In [44]:
dim_Np = hv.Dimension('Np', range=(0,None)) # range=(-80,0))

particles = hv.Curve((df_cen.s, df_cen.Particles), kdims=dim_s, vdims=dim_Np)
In [45]:
(particles + mag).cols(1)
Out[45]:

Reading twiss.sdds file

In [46]:
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_twi = pd.read_csv(DATA, names=['ElementName','s','betax','betay','alphax','alphay',
                              'etax','etay','p','xAperture','yAperture'],
                   delim_whitespace=True)
In [47]:
df_twi['xAperture'] = 1e3*df_twi['xAperture'] # mm
df_twi['yAperture'] = 1e3*df_twi['yAperture'] # mm
In [48]:
df_twi.tail(3)
Out[48]:
ElementName s betax betay alphax alphay etax etay p xAperture yAperture
2571 RF625 81.751923 1.297203 2.066396 1.303847 -1.721557 8.670151e-19 0.0 2968.770696 10.0 10.0
2572 RF625 81.800000 1.177427 2.237726 1.203810 -1.813749 8.412118e-19 0.0 2970.652379 10.0 10.0
2573 W3 81.800000 1.177427 2.237726 1.203810 -1.813749 8.412118e-19 0.0 2970.652379 10.0 10.0
In [49]:
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))
In [50]:
%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_twi.s,  df_twi.xAperture), label='Aperture', kdims=dim_s, vdims=dim_sigma, group='Aper')
Ax_pos = Ax
Ax_neg = hv.Curve((df_twi.s, -df_twi.xAperture), label='Aperture', kdims=dim_s, vdims=dim_sigma, group='Aper')
In [51]:
#Ax_pos*Ax_neg
In [52]:
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])
In [53]:
(s_p + Ax_pos*Ax_neg*Cx*Cy + mag).cols(1)
Out[53]:
In [54]:
s_Cx = hv.Curve((df_cen.s, df_cen.Cx), kdims=dim_s, vdims=dim_x, group='fx', label='x')
s_Cy = hv.Curve((df_cen.s, df_cen.Cy), kdims=dim_s, vdims=dim_x, group='fy', label='y')
In [55]:
(s_Cx*s_Cy*Ax_pos*Ax_neg + mag).cols(1)
Out[55]:

Reading xyz.sdds file

In [56]:
out = !sdds2stream results/xyz.sdds \
    -col=ElementName,s,X,Y,Z -pipe=out
DATA = StringIO("\n".join(out))
df_xyz = pd.read_csv(DATA, names=['ElementName','s','X','Y','Z'],
                   delim_whitespace=True)
In [57]:
df_xyz.tail(3)
Out[57]:
ElementName s X Y Z
2571 RF625 81.751923 1.390696e-16 0.0 81.751582
2572 RF625 81.800000 1.391530e-16 0.0 81.799659
2573 W3 81.800000 1.391530e-16 0.0 81.799659
In [58]:
df_cen['Cx'] = df_cen['Cx'] + 1e3*df_xyz['X'] # mm

df_twi['xAperture_neg'] = -df_twi['xAperture'] + 1e3*df_xyz['X'] # mm
df_twi['xAperture'] = df_twi['xAperture'] + 1e3*df_xyz['X'] # mm
In [59]:
dim_x = hv.Dimension('x', unit='mm', label="x", range=(-16,+27))
In [60]:
Cx  = hv.Spread((df_cen.s, df_cen.Cx, 2*df.sigma_x), label='x', \
               kdims=dim_s, vdims=[dim_x,dim_aper])

Ax =     hv.Curve((df_twi.s,  df_twi.xAperture), label='x Aperture', kdims=dim_s, vdims=dim_sigma, group='Aper')
Ax_pos = Ax
Ax_neg = hv.Curve((df_twi.s,  df_twi.xAperture_neg), label='x Aperture', kdims=dim_s, vdims=dim_sigma, group='Aper')
In [61]:
(s_p + Ax_pos*Ax_neg*Cx*Cy + mag).cols(1)
Out[61]: