A Julia package for beam physics analysis using the openPMD standard.
openPMD-beamphysics is a Julia package for beam physics analysis and visualization. The package follows the openPMD standard BeamPhysics extension for data storage and exchange, making it compatible with various particle accelerator simulation codes. It provides tools for particle tracking, statistical analysis, emittance calculations, and visualization of beam dynamics.
This package is adapted from the Python implementation openPMD-beamphysics and provides native Julia performance with full compatibility with the openPMD data format.
To install the package
using Pkg
Pkg.add(url="https://github.com/ndwang/openPMD-beamphysics.jl")- Particle Group Management: Handle collections of particles with position, momentum, and metadata
- Statistical Analysis: Calculate beam parameters including emittance, Twiss parameters, and beam moments
- openPMD Compatibility: Read and write data in the openPMD standard format
- Visualization: Comprehensive plotting tools for beam analysis
using openPMD_beamphysics
# Create a simple particle group
pg = single_particle(x=1e-3, px=1e-6, y=0.0, py=0.0, z=0.0, pz=0.0)
# Calculate emittance
emit_x = norm_emit_calc(pg, ["x"])
# Calculate Twiss parameters
sigma_mat = cov(pg, "x", "px")
twiss_params = twiss_calc(sigma_mat)
# Plot beam properties
slice_plot(pg, "sigma_x", "sigma_px")ParticleGroup: Main type representing a collection of particles
norm_emit_calc(particle_group, planes): Calculate normalized emittancetwiss_calc(sigma_mat): Calculate Twiss parameters from covariance matrixtwiss_dispersion(particle_group): Calculate dispersion parametersslice_statistics(particle_group, keys...): Calculate statistics in slices
single_particle(;kwargs...): Create a single particle ParticleGroupdrift!(particle_group, distance): Drift particlessplit_particles(particle_group, n): Split particles for analysis
slice_plot(particle_group, keys...): Create slice plotsdensity_plot(particle_group, x_key, y_key): Create density plotsmarginal_plot(particle_group, keys...): Create marginal distribution plots
using openPMD_beamphysics
# Create a Gaussian beam
n_particles = 10000
x = randn(n_particles) * 1e-3 # 1 mm RMS
px = randn(n_particles) * 1e-6 # 1 μrad RMS
y = randn(n_particles) * 1e-3
py = randn(n_particles) * 1e-6
z = randn(n_particles) * 1e-2 # 1 cm RMS
pz = randn(n_particles) * 1e-3
pg = ParticleGroup(x, px, y, py, z, pz, zeros(n_particles),
ones(Int, n_particles), ones(n_particles),
Species("electron"))
# Calculate beam parameters
emit_x = norm_emit_calc(pg, ["x"])
emit_y = norm_emit_calc(pg, ["y"])
emit_4d = norm_emit_calc(pg, ["x", "y"])
println("X emittance: $(emit_x) m⋅rad")
println("Y emittance: $(emit_y) m⋅rad")
println("4D emittance: $(emit_4d) m²⋅rad²")# Calculate covariance matrix
sigma_mat = cov(pg, "x", "px")
# Get Twiss parameters
twiss = twiss_calc(sigma_mat)
println("Beta: $(twiss["beta"]) m")
println("Alpha: $(twiss["alpha"])")
println("Gamma: $(twiss["gamma"]) 1/m")# Create slice plot
p1 = slice_plot(pg, "sigma_x", "sigma_px", n_slice=20)
# Create density plot
p2 = density_plot(pg, "x", "px")
# Combine plots
plot(p1, p2, layout=(1,2), size=(800,400))- ndwang [email protected]