Optics-matching example - Comparing to Bmad¶
Note: this tracks positrons.
In [1]:
Copied!
import numpy as np
from pmd_beamphysics import single_particle
from pmd_beamphysics.units import mec2
from pytao import Tao
import impact.z as IZ
from impact.tests.z.conftest import bmad_files
from impact.z.interfaces.bmad import plot_impactz_and_tao_stats, track_tao
import numpy as np
from pmd_beamphysics import single_particle
from pmd_beamphysics.units import mec2
from pytao import Tao
import impact.z as IZ
from impact.tests.z.conftest import bmad_files
from impact.z.interfaces.bmad import plot_impactz_and_tao_stats, track_tao
Initial Particles¶
In [2]:
Copied!
energy = 10e6
pz = np.sqrt(energy**2 - mec2**2)
P0 = single_particle(x=0.0, pz=pz)
energy = 10e6
pz = np.sqrt(energy**2 - mec2**2)
P0 = single_particle(x=0.0, pz=pz)
In [3]:
Copied!
tao = Tao(lattice_file=bmad_files / "optics_matching.bmad", plot="mpl")
tao.plot("beta", include_layout=False)
tao = Tao(lattice_file=bmad_files / "optics_matching.bmad", plot="mpl")
tao.plot("beta", include_layout=False)
In [4]:
Copied!
# Match species
species = tao.branch1(ix_branch=0, ix_uni=1)["param_particle"].lower()
P0.species = species
species
# Match species
species = tao.branch1(ix_branch=0, ix_uni=1)["param_particle"].lower()
P0.species = species
species
Out[4]:
'positron'
In [5]:
Copied!
Ptao = track_tao(tao, P0)
Ptao = track_tao(tao, P0)
Impact-Z¶
In [6]:
Copied!
I = IZ.ImpactZ.from_tao(tao, initial_particles=P0)
I.input
I = IZ.ImpactZ.from_tao(tao, initial_particles=P0)
I.input
Out[6]:
ImpactZInput(
initial_particles=<ParticleGroup with 1 particles at 0x7f6beca84ad0>,
seed=-1,
n_particle=1,
nx=64,
ny=64,
nz=64,
distribution=IZ.DistributionType.read,
particle_list=[1],
charge_over_mass_list=[1.956951180916719e-06],
twiss_beta_x=5.0,
twiss_beta_y=5.0,
average_current=0.0,
reference_kinetic_energy=9489001.04931,
reference_particle_mass=510998.95069,
reference_particle_charge=1.0,
reference_frequency=1300000000.0,
lattice=[
ToggleSpaceCharge(),
WriteFull(name='initial_particles', file_id=100),
Drift(
name='P1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 2},
length=1.0,
steps=1,
map_steps=1
),
Dipole(
name='B1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 3},
length=0.2,
steps=11,
map_steps=11,
angle=0.174532925199433,
e2=0.174532925199433
),
Drift(
name='P2#1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 4},
length=0.25,
steps=1,
map_steps=1
),
Quadrupole(
name='P2\\Q1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 5},
length=0.1,
steps=1,
map_steps=1,
file_id=-1.0,
radius=0.03
),
Drift(
name='P2#2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 6},
length=0.3,
steps=1,
map_steps=1
),
Quadrupole(
name='P2\\Q2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 7},
length=0.1,
steps=1,
map_steps=1,
file_id=-1.0,
radius=0.03
),
Drift(
name='P2#3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 8},
length=0.25,
steps=1,
map_steps=1
),
Dipole(
name='B2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 9},
length=0.2,
steps=11,
map_steps=11,
angle=-0.174532925199433,
e1=-0.174532925199433
),
Drift(
name='P3#1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 10},
length=0.25,
steps=1,
map_steps=1
),
Quadrupole(
name='P3\\Q3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 11},
length=0.1,
steps=1,
map_steps=1,
file_id=-1.0,
radius=0.03
),
Drift(
name='P3#2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 12},
length=0.3,
steps=1,
map_steps=1
),
Quadrupole(
name='P3\\Q4',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 13},
length=0.1,
steps=1,
map_steps=1,
file_id=-1.0,
radius=0.03
),
Drift(
name='P3#3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 14},
length=0.25,
steps=1,
map_steps=1
),
Dipole(
name='B3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 15},
length=0.2,
steps=11,
map_steps=11,
angle=-0.174532925199433,
e2=-0.174532925199433
),
Drift(
name='P4#1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 16},
length=0.25,
steps=1,
map_steps=1
),
Quadrupole(
name='P4\\Q5',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 17},
length=0.1,
steps=1,
map_steps=1,
file_id=-1.0,
radius=0.03
),
Drift(
name='P4#2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 18},
length=0.3,
steps=1,
map_steps=1
),
Quadrupole(
name='P4\\Q6',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 19},
length=0.1,
steps=1,
map_steps=1,
file_id=-1.0,
radius=0.03
),
Drift(
name='P4#3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 20},
length=0.25,
steps=1,
map_steps=1
),
Dipole(
name='B4',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 21},
length=0.2,
steps=11,
map_steps=11,
angle=0.174532925199433,
e1=0.174532925199433
),
Drift(
name='P5',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 22},
length=1.0,
steps=1,
map_steps=1
),
WriteFull(name='WRITE_MAR.END', metadata={'bmad_id': 23}, file_id=200),
WriteFull(name='final_particles', file_id=101)
]
)
Including defaults
ImpactZInput(
initial_particles=<ParticleGroup with 1 particles at 0x7f6beca84ad0>,
ncpu_y=1,
ncpu_z=1,
gpu=IZ.GPUFlag.disabled,
seed=-1,
n_particle=1,
integrator_type=IZ.IntegratorType.linear_map,
err=1,
diagnostic_type=IZ.DiagnosticType.extended,
nx=64,
ny=64,
nz=64,
boundary_type=IZ.BoundaryType.trans_open_longi_open,
radius_x=0.0,
radius_y=0.0,
z_period_size=0.0,
distribution=IZ.DistributionType.read,
restart=0,
subcycle=0,
nbunch=1,
particle_list=[1],
current_list=[0.0],
charge_over_mass_list=[1.956951180916719e-06],
twiss_alpha_x=0.0,
twiss_beta_x=5.0,
twiss_norm_emit_x=1e-06,
twiss_mismatch_x=1.0,
twiss_mismatch_px=1.0,
twiss_offset_x=0.0,
twiss_offset_px=0.0,
twiss_alpha_y=0.0,
twiss_beta_y=5.0,
twiss_norm_emit_y=1e-06,
twiss_mismatch_y=1.0,
twiss_mismatch_py=1.0,
twiss_offset_y=0.0,
twiss_offset_py=0.0,
twiss_alpha_z=1e-09,
twiss_beta_z=1.0,
twiss_norm_emit_z=1e-06,
twiss_mismatch_z=1.0,
twiss_mismatch_e_z=1.0,
twiss_offset_phase_z=0.0,
twiss_offset_energy_z=0.0,
average_current=0.0,
reference_kinetic_energy=9489001.04931,
reference_particle_mass=510998.95069,
reference_particle_charge=1.0,
reference_frequency=1300000000.0,
initial_phase_ref=0.0,
lattice=[
ToggleSpaceCharge(
name='',
metadata={},
length=0.0,
steps=0,
map_steps=0,
type_id=-14,
unused=0.0,
enable=False
),
WriteFull(
name='initial_particles',
metadata={},
length=0.0,
steps=0,
file_id=100,
type_id=-2,
unused_2=0.0,
sample_frequency=0
),
Drift(
name='P1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 2},
length=1.0,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Dipole(
name='B1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 3},
length=0.2,
steps=11,
map_steps=11,
type_id=4,
angle=0.174532925199433,
k1=0.0,
input_switch=0.0,
hgap=0.0,
e1=0.0,
e2=0.174532925199433,
entrance_curvature=0.0,
exit_curvature=0.0,
fint=0.0,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=0.0
),
Drift(
name='P2#1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 4},
length=0.25,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Quadrupole(
name='P2\\Q1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 5},
length=0.1,
steps=1,
map_steps=1,
type_id=1,
k1=0.0,
file_id=-1.0,
radius=0.03,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=-0.0
),
Drift(
name='P2#2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 6},
length=0.3,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Quadrupole(
name='P2\\Q2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 7},
length=0.1,
steps=1,
map_steps=1,
type_id=1,
k1=0.0,
file_id=-1.0,
radius=0.03,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=-0.0
),
Drift(
name='P2#3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 8},
length=0.25,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Dipole(
name='B2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 9},
length=0.2,
steps=11,
map_steps=11,
type_id=4,
angle=-0.174532925199433,
k1=0.0,
input_switch=0.0,
hgap=0.0,
e1=-0.174532925199433,
e2=0.0,
entrance_curvature=0.0,
exit_curvature=0.0,
fint=0.0,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=0.0
),
Drift(
name='P3#1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 10},
length=0.25,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Quadrupole(
name='P3\\Q3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 11},
length=0.1,
steps=1,
map_steps=1,
type_id=1,
k1=0.0,
file_id=-1.0,
radius=0.03,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=-0.0
),
Drift(
name='P3#2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 12},
length=0.3,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Quadrupole(
name='P3\\Q4',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 13},
length=0.1,
steps=1,
map_steps=1,
type_id=1,
k1=0.0,
file_id=-1.0,
radius=0.03,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=-0.0
),
Drift(
name='P3#3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 14},
length=0.25,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Dipole(
name='B3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 15},
length=0.2,
steps=11,
map_steps=11,
type_id=4,
angle=-0.174532925199433,
k1=0.0,
input_switch=0.0,
hgap=0.0,
e1=0.0,
e2=-0.174532925199433,
entrance_curvature=0.0,
exit_curvature=0.0,
fint=0.0,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=0.0
),
Drift(
name='P4#1',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 16},
length=0.25,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Quadrupole(
name='P4\\Q5',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 17},
length=0.1,
steps=1,
map_steps=1,
type_id=1,
k1=0.0,
file_id=-1.0,
radius=0.03,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=-0.0
),
Drift(
name='P4#2',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 18},
length=0.3,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Quadrupole(
name='P4\\Q6',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 19},
length=0.1,
steps=1,
map_steps=1,
type_id=1,
k1=0.0,
file_id=-1.0,
radius=0.03,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=-0.0
),
Drift(
name='P4#3',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 20},
length=0.25,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
Dipole(
name='B4',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 21},
length=0.2,
steps=11,
map_steps=11,
type_id=4,
angle=0.174532925199433,
k1=0.0,
input_switch=0.0,
hgap=0.0,
e1=0.174532925199433,
e2=0.0,
entrance_curvature=0.0,
exit_curvature=0.0,
fint=0.0,
misalignment_error_x=0.0,
misalignment_error_y=0.0,
rotation_error_x=0.0,
rotation_error_y=0.0,
rotation_error_z=0.0
),
Drift(
name='P5',
metadata={'bmad_csr': False, 'bmad_sc': False, 'bmad_id': 22},
length=1.0,
steps=1,
map_steps=1,
type_id=0,
radius=1.0
),
WriteFull(
name='WRITE_MAR.END',
metadata={'bmad_id': 23},
length=0.0,
steps=0,
file_id=200,
type_id=-2,
unused_2=0.0,
sample_frequency=0
),
WriteFull(
name='final_particles',
metadata={},
length=0.0,
steps=0,
file_id=101,
type_id=-2,
unused_2=0.0,
sample_frequency=0
)
],
filename=None,
verbose=False
)
In [7]:
Copied!
output = I.run()
output = I.run()
Detected species: positron
Detected species: positron
Detected species: positron
In [8]:
Copied!
P = I.output.particles["final_particles"]
P = I.output.particles["final_particles"]
In [9]:
Copied!
I.plot("mean_x", include_labels=True)
I.plot("mean_x", include_labels=True)
Compare¶
In [10]:
Copied!
plot_impactz_and_tao_stats(I, tao)
plot_impactz_and_tao_stats(I, tao)
In [11]:
Copied!
Ptao.data
Ptao.data
Out[11]:
{'x': array([-2.15006253e-17]), 'px': array([-1.6709192e-10]), 'y': array([0.]), 'py': array([0.]), 'z': array([0]), 'pz': array([9986935.46952186]), 't': array([1.93720262e-08]), 'status': array([1], dtype=int32), 'weight': array([1.]), 'species': np.str_('positron')}
In [12]:
Copied!
P.data
P.data
Out[12]:
{'x': array([-5.88205302e-31]), 'px': array([-2.0914523e-24]), 'y': array([0.]), 'py': array([0.]), 'z': array([0.]), 'pz': array([9986935.46952185]), 't': array([1.93720262e-08]), 'status': array([1.]), 'weight': array([1.e-20]), 'id': array([1]), 'species': np.str_('positron')}