TWS: Traveling Wave Structure¶
TWS are defined by special fieldmaps
In [1]:
Copied!
# Useful for debugging
%load_ext autoreload
%autoreload 2
# Useful for debugging
%load_ext autoreload
%autoreload 2
In [2]:
Copied!
%pylab --no-import-all inline
%config InlineBackend.figure_format = 'retina'
%pylab --no-import-all inline
%config InlineBackend.figure_format = 'retina'
%pylab is deprecated, use %matplotlib inline and import the required libraries. Populating the interactive namespace from numpy and matplotlib
In [3]:
Copied!
from astra import Astra, AstraGenerator
from astra.fieldmaps import expand_tws_fmap
import os
from astra import Astra, AstraGenerator
from astra.fieldmaps import expand_tws_fmap
import os
In [4]:
Copied!
# Input template file
ASTRA_IN = '../templates/tws/astra.in'
GENERATOR_IN = '../templates/tws/generator.in'
# Input template file
ASTRA_IN = '../templates/tws/astra.in'
GENERATOR_IN = '../templates/tws/generator.in'
In [5]:
Copied!
G = AstraGenerator(GENERATOR_IN)
G.run()
P0 = G.output['particles']
G = AstraGenerator(GENERATOR_IN)
G.run()
P0 = G.output['particles']
In [6]:
Copied!
# Make an Astra object
A = Astra(input_file=ASTRA_IN, initial_particles = P0, verbose=True)
# Turn off space charge for this example
A.input['charge']['lspch'] = False
# This has a TWS cavity
A.input['cavity']
# Make an Astra object
A = Astra(input_file=ASTRA_IN, initial_particles = P0, verbose=True)
# Turn off space charge for this example
A.input['charge']['lspch'] = False
# This has a TWS cavity
A.input['cavity']
Configured to run in: /var/folders/2f/l5_mybzs30j4qqvyj98w1_nw0000gn/T/tmp1xvos8w4
Out[6]:
{'lefield': True,
'file_efield(1)': '/Users/chrisonian/Code/GitHub/lume-astra/docs/examples/templates/tws/sonde_ideal_SF_100.dat',
'nue(1)': 2.99855,
'maxe(1)': 80,
'phi(1)': 0,
'c_pos(1)': 0,
'c_smooth(1)': 0,
'file_efield(2)': '/Users/chrisonian/Code/GitHub/lume-astra/docs/examples/templates/tws/tws.dat',
'nue(2)': 2.99855,
'maxe(2)': 14,
'phi(2)': 0,
'c_pos(2)': 1.528,
'c_smooth(2)': 0,
'c_numb(2)': 135}
In [7]:
Copied!
# This is the fieldmap
A.load_fieldmaps()
fmap = A.fieldmap['tws.dat']
# Attributes
fmap['attrs']
# This is the fieldmap
A.load_fieldmaps()
fmap = A.fieldmap['tws.dat']
# Attributes
fmap['attrs']
Loading fieldmap file /Users/chrisonian/Code/GitHub/lume-astra/docs/examples/templates/tws/sonde_ideal_SF_100.dat Loading fieldmap file /Users/chrisonian/Code/GitHub/lume-astra/docs/examples/templates/tws/tws.dat Loading fieldmap file /Users/chrisonian/Code/GitHub/lume-astra/docs/examples/templates/tws/B3CV_23cm_sstilt.dat
Out[7]:
{'type': 'astra_tws', 'z1': 0.0463882, 'z2': 0.146368, 'n': 1, 'm': 3}
In [8]:
Copied!
# Actual data
fmap['data'].shape
# Actual data
fmap['data'].shape
Out[8]:
(101, 2)
In [9]:
Copied!
# This expands the data for 6 cells
zfull, Ezfull = expand_tws_fmap(fmap, 6)
plt.plot(zfull, Ezfull)
# This expands the data for 6 cells
zfull, Ezfull = expand_tws_fmap(fmap, 6)
plt.plot(zfull, Ezfull)
Out[9]:
[<matplotlib.lines.Line2D at 0x12e7dfac0>]
In [10]:
Copied!
# Run
A.run()
# Run
A.run()
Initial particles written to /var/folders/2f/l5_mybzs30j4qqvyj98w1_nw0000gn/T/tmp1xvos8w4/astra.particles
3 fieldmaps written to /var/folders/2f/l5_mybzs30j4qqvyj98w1_nw0000gn/T/tmp1xvos8w4
--------------------------------------------------------------------------
Astra- A space charge tracking algorithm
Version 4.0 - macOS 64bit - Apple Silicon
DESY, Hamburg 2022
Wed Aug 2 08:48:56
Parameter file is: astra.in
TEST - LINAC - LIL
Initialize element settings:
neglecting space charge forces
--------------------------------------------------------------------------
Cavity:
Reading cavity field data from: sonde_ideal_SF_100.dat
Cavity Frequency f = 2.999 GHz
maximum gradient 80.00 MV/m
at 5.4000E-02 m
estimated average gradient 27.46 MV/m
nominal phase 0.000 deg
Reading cavity field data from: tws.dat
Cavity Frequency f = 2.999 GHz
beta = 1 traveling wave structure
TW Cell Length 3.3327E-02 m
Number of Cells 135
Phase Advance/Cell 120.0 deg
TW Section starts at 1.528 m
TW Section ends at 6.120 m
Max E-field 14.00 MV/m
at 1.675 m
nominal phase 0.000 deg
--------------------------------------------------------------------------
Solenoid:
Reading solenoid field data from: B3CV_23cm_sstilt.dat
maximum |Bz| field 0.2500 T
at 0.2040 m
integral Bz squared 8.0805E-03 T^2m
--------------------------------------------------------------------------
1000 particles from file astra.particles
Cathode located at: z = 0.000 m
Particles taken into account N = 1000
total charge Q = -1.000 nC
horizontal beam position x = 1.0140E-04 mm
vertical beam position y = 7.4847E-05 mm
longitudinal beam position z = 0.000 m
horizontal beam size sig x = 0.5185 mm
vertical beam size sig y = 0.5156 mm
longitudinal beam size sig z = 0.000 mm
total emission time t = 1.2621E-02 ns
rms emission time sig t = 1.9926E-03 ns
average kinetic energy E = 9.9997E-04 MeV
energy spread dE = 3.8783E-03 keV
average momentum P = 3.1984E-02 MeV/c
transverse beam emittance eps x = 18.69 pi mrad mm
correlated divergence cor x = -3.2908E-02 mrad
transverse beam emittance eps y = 18.61 pi mrad mm
correlated divergence cor y = 2.3856E-02 mrad
longitudinal beam emittance eps z = 0.000 pi keV mm
correlated energy spread cor z = 0.000 keV
emittance ratio eps y/eps x = 1.004
WARNING: Bz is not zero at the cathode,
estimated emittance contribution:
eps x = 2.8776E-02 pi mrad mm
eps y = 2.8458E-02 pi mrad mm
--------------------------------------------------------------------------
Start auto phasing:
Scan cavity number : 1
6 unstable trajectories out of 50
Scan cavity number : 2
0 unstable trajectories out of 50
Cavity phasing completed:
Cavity number Energy gain [MeV] at Phase [deg]
1 5.380 46.221
2 46.34 306.08
--------------------------------------------------------------------------
on axis tracking of the reference particle:
initial position z = 0.000 m
x = 1.0140E-04 mm
y = 7.4847E-05 mm
initial momentum p = 1.6038E-02 MeV/c
global phase shift phi = 0.000 deg
time step for integration dt = 1.000 ps
--------------------------------------------------------------------------
Online element settings:
--------------------------------------------------------------------------
particle reaches position z = 6.200 m
time of flight is t = 20.73 ns
final momentum p = 52.23 MeV/c
final phase (cavity 1) phi_end = 101.2 deg
--------------------------------------------------------------------------
off axis tracking of the reference particle:
initial position z = 0.000 m
x = 0.5186 mm
y = 0.5157 mm
final position x = 1.831 mm
y = -2.459 mm
divergence px/pz = 0.3674 mrad
py/pz = -0.4938 mrad
--------------------------------------------------------------------------
tracking of 1000 particles:
tracking will stop at z = 6.200 m
final checkpoint at z = 6.200 m
total number of iteration steps: 22023
**********************************************************************
Particles taken into account N = 1000
total charge Q = -1.000 nC
horizontal beam position x = 6.3567E-04 mm
vertical beam position y = -8.9888E-04 mm
longitudinal beam position z = 6.200 m
horizontal beam size sig x = 2.534 mm
vertical beam size sig y = 2.533 mm
longitudinal beam size sig z = 0.5271 mm
average kinetic energy E = 51.69 MeV
energy spread dE = 40.76 keV
average momentum P = 52.20 MeV/c
transverse beam emittance eps x = 18.69 pi mrad mm
correlated divergence cor x = 0.5528 mrad
transverse beam emittance eps y = 18.72 pi mrad mm
correlated divergence cor y = 0.5524 mrad
longitudinal beam emittance eps z = 21.00 pi keV mm
correlated energy spread cor z = 8.603 keV
emittance ratio eps y/eps x = 0.9983
Particle Statistics:
Total number of particles on stack = 1000
Electrons (total) = 1000
particles at the cathode = 0
active particles = 1000
passive particles (lost out of bunch) = 0
probe particles = 6
backward traveling particles = 0
particles lost with z<Zmin = 0
particles lost due to cathode field = 0
particles lost on aperture = 0
Tracking ended with 1 warning(s)
**********************************************************************
Emittance information saved to file : astra.Xemit.001
Emittance information saved to file : astra.Yemit.001
Emittance information saved to file : astra.Zemit.001
Lost & found saved to file : astra.LandF.001
Phase-space distributions logged in : astra.Log.001
**********************************************************************
finished simulation Wed Aug 2 08:49:03 2023
elapsed time : 7.0 seconds
execution time : 7.0 seconds
system time : 0.1 seconds
Goodbye.
--------------------------------------------------------------------------
loading 32 particle files
[20.0, 41.0, 61.0, 82.0, 102.0, 120.0, 123.0, 143.0, 164.0, 184.0, 205.0, 225.0, 246.0, 266.0, 286.0, 307.0, 327.0, 348.0, 368.0, 389.0, 409.0, 430.0, 450.0, 471.0, 491.0, 511.0, 532.0, 552.0, 573.0, 593.0, 614.0, 620.0]
{'start_time': 1690991336.888692, 'run_script': '/Users/chrisonian/Code/Astra/bin/Astra astra.in', 'run_time': 7.116514205932617}
In [11]:
Copied!
A.plot(y=['sigma_x', 'sigma_y'], y2='mean_kinetic_energy', xlim=(0,8), figsize=(16,9))
A.plot(y=['sigma_x', 'sigma_y'], y2='mean_kinetic_energy', xlim=(0,8), figsize=(16,9))
In [12]:
Copied!
P = A.particles[-1]
P.plot('x', 'px')
P.plot('z', 'pz')
P = A.particles[-1]
P.plot('x', 'px')
P.plot('z', 'pz')