API / Code Reference
Python package for simulating light-pulse atom interferometers.
Submodules
aisim.atoms module
Classes and functions related to the atomic cloud.
- class aisim.atoms.AtomicEnsemble(phase_space_vectors, state_kets=[1, 0], time=0, weights=None)
Bases:
object
Represents an atomic ensemble consisting of n atoms.
Each atom is is defined by its phase space vector (x0, y0, z0, vx, vy, vz) at time t=0. From this phase space vector the position at later times can be calculated. Optionally, weights can be added for each atom in the ensemble. Slicing along the axis of the n atoms is supported.
- Parameters:
phase_space_vectors (ndarray) – n × 6 dimensional array representing the phase space vectors (x0, y0, z0, vx, vy, vz) of the atoms in an atomic ensemble
state_kets (m × 1 or n × m x 1 array or list, optional) – vector(s) representing the m internal degrees of freedom of the atoms. If the list or array is one-dimensional, all atoms are initialized in the same internal state. Alternatively, each atom can be initialized with a different state vector by passing an array of state vectors for every atom. E.g. to initialize all atoms in the ground state of a two-level system, pass [1, 0] which is the default.
time (float, optional) – the initial time (default 0) when the phase space and state vectors are initialized
weights (1darray , optional) – Optional weights for each of the n atoms in the ensemble
- phase_space_vectors
n × 6 dimensional array representing the phase space vectors (x0, y0, z0, vx, vy, vz) of the atoms in an atomic ensemble
- Type:
ndarray
- position
- velocity
- state_kets
- state_bras
- density_matrices
- density_matrix
- calc_position(t)
Calculate the positions (x, y, z) of the atoms after propagation.
- Parameters:
t (float) – time when the positions should be calculated
- Returns:
pos – n × 3 dimensional array of the positions (x, y, z)
- Return type:
array
- property density_matrices
Density matrix of the m level system of the n atoms.
These are pure states.
- Type:
(n × m x m) array
- property density_matrix
Density matrix of the ensemble’s m level system.
- Type:
(m x m) array
- fidelity(rho_target)
Calculate fidelity of ensemble’s density matrix and target matrix [1].
- Parameters:
rho_target (array) – target density matrix as m x m array
- Returns:
fidelity – fidelity of AtomicEnsemble’s compared to target density matrix
- Return type:
float
References
[1] https://en.wikipedia.org/wiki/Fidelity_of_quantum_states
- property position
Positions (x, y, z) of the atoms in the ensemble.
- Type:
(n × 3) array
- property state_bras
The bra vectors of the m level system.
- Type:
(n × 1 x m) array
- property state_kets
The ket vectors of the m level system.
- Type:
(n × m x 1) array
- state_occupation(state)
Calculate the state population of each atom in the ensemble.
- Parameters:
state (int or list_like) – Specifies which state population should be calculated. E.g. the excited state of a two-level system can be calculated by passing either 1 or [0, 1].
- Returns:
occupation – n dimensional array of the state population of each of the n atom
- Return type:
array
- property time
Time changes when propagating the atomic ensemble.
- Type:
float
- property velocity
Velocities of the atoms in the ensemble.
- Type:
array
- aisim.atoms.combine_grids(pos, vel)
Combine a position and velocity grid into an array of phase space vectors.
The resulting array contains (x, y, z, vx, vy, vz).
- Parameters:
pos (n, m × 3 array) – position and velocity grids as generated by make_grid
vel (n, m × 3 array) – position and velocity grids as generated by make_grid
- Returns:
phase_space_vectors
- Return type:
n * m × 1 array
- aisim.atoms.combine_weights(pos_weights, vel_weights)
Combine the weights of a position and velocity grid.
Complements _combine_grids.
- Parameters:
pos_weights (n × 1 array) – weights of a position and velocity grids.
vel_weights (n × 1 array) – weights of a position and velocity grids.
- aisim.atoms.create_ensemble_from_grids(pos_params, vel_params, **kwargs)
Create an atomic ensemble from evenly spaced position and velocity grids.
The resulting position and velocity grids are evenly spaced on polar coordinates.
- Parameters:
pos_params (dict) – Dictionary containing the parameters determining the position and velocity distributions of the atomic ensemble. They each have to contain the arguments described in the docstring of make_grid, i.e. std_rho, std_z (required), n_rho, n_theta, n_z, m_std_rho, m_std_z, weight, optional.
vel_params (dict) – Dictionary containing the parameters determining the position and velocity distributions of the atomic ensemble. They each have to contain the arguments described in the docstring of make_grid, i.e. std_rho, std_z (required), n_rho, n_theta, n_z, m_std_rho, m_std_z, weight, optional.
**kwargs – Optional keyworded arguments passed to AtomicEnsemble
- Returns:
ensemble – Atomic ensemble contains all possible combinations of the position and velocity grid as phase space vectors. They vectors are weighted according to the combined (multiplied) weights of the respective position and velocity distributions according to the weight arguments in pos_params and vel_params
- Return type:
- aisim.atoms.create_random_ensemble_from_gaussian_distribution(pos_params, vel_params, n_samples, seed=None, **kwargs)
Random atomic ensemble from normal position and velocity distributions.
- Parameters:
pos_params (dict) – Dictionary containing the parameters determining the position and velocity distributions of the atomic ensemble. Entries for position space are ‘mean_x’, ‘std_x’ ,’mean_y’, ‘std_y’, ‘mean_z’, ‘std_z’. Entries for velocity space are ‘mean_vx’,’std_vx’, ‘mean_vy’, ‘std_vy’,’mean_vz’, ‘std_vz’.
vel_params (dict) – Dictionary containing the parameters determining the position and velocity distributions of the atomic ensemble. Entries for position space are ‘mean_x’, ‘std_x’ ,’mean_y’, ‘std_y’, ‘mean_z’, ‘std_z’. Entries for velocity space are ‘mean_vx’,’std_vx’, ‘mean_vy’, ‘std_vy’,’mean_vz’, ‘std_vz’.
n_samples (float) – number of random samples
seed (int or 1-d array_like, optional) – Set the seed of the random number generator to get predictable samples. If set, this number is passed to numpy.random.seed.
**kwargs – Optional keyworded arguments passed to AtomicEnsemble
- Returns:
ensemble – Atomic ensemble containing the generated phase space vectors.
- Return type:
- aisim.atoms.make_grid(std_rho, std_z, n_rho=20, n_theta=36, n_z=1, m_std_rho=3, m_std_z=0)
Evenly spaced grid of positions (or velocities) and weights.
Each of these positions (or velocities) are evenly spaced in polar coordinates and weighted according to a gaussian distribution.
- Parameters:
std_rho (float) – 1/e radius of the position or velocity distribution.
std_sigma (float) – 1/e radius of the position or velocity distribution.
n_rho (int) – number of grid points per standard deviation along rho and z direction and total number of points along theta, respectively
n_theta (int) – number of grid points per standard deviation along rho and z direction and total number of points along theta, respectively
n_z (int) – number of grid points per standard deviation along rho and z direction and total number of points along theta, respectively
m_std_rho (int) – number of standard deviations for the rho and z distribution
m_std_z (int) – number of standard deviations for the rho and z distribution
- Returns:
grid (n × 3 array) – Grid of n vectors in carthesian coordinates (x, y, z). In polar coordinates, the grid has this form: [[dRho, 0, -m_std_z*sigma_z/2] [dRho, dTheta, …] [dRho , 2*dTheta, …] [… , …, 0] [dRho , <2*pi, …] [2*dRho , 0, …] [2*dRho , dTheta, …] [… , …, … [m_std_rho*sigma_rho , <2*pi, +m_std_z*sigma_z/2]]
weights (1 × n array) – weights for each vector in the grid
aisim.beam module
Classes and functions related to the interferometry lasers.
- class aisim.beam.IntensityProfile(r_beam, center_rabi_freq)
Bases:
object
Class that defines a intensity profile.
- Parameters:
r_beam (float) – beam radius in m
center_rabi_freq (float) – Rabi frequency at center of intensity profile
- r_beam
beam radius in m
- Type:
float
- center_rabi_freq
Rabi frequency at center of intensity profile
- Type:
float
- get_rabi_freq(pos)
Rabi frequency at a position of a Gaussian beam.
- Parameters:
pos ((n × 2) array or (n × 3) array) – positions of the n atoms in two or three dimensions (x, y, [z]).
- Returns:
rabi_freqs – the Rabi frequencies for the n positions
- Return type:
array
- class aisim.beam.Wavefront(r_beam, coeff)
Bases:
object
Class that defines a wavefront.
- Parameters:
r_beam (float) – beam radius in m
coeff (list) – list of 36 Zernike coefficients in multiples of the wavelength
- r_beam
beam radius in m
- Type:
float
- coeff
list of 36 Zernike coefficients in multiples of the wavelength
- Type:
list
- get_value(pos)
Get the wavefront at a position.
- Parameters:
pos (n × 3 array) – array of position vectors (x, y, z) where the wavefront is probed
- Returns:
wf – The value of the wavefront at the positions
- Return type:
nd array
- plot(ax=None)
Plot the wavefront.
- Parameters:
ax (Axis , optional) – If axis is provided, they will be used for the plot. if not provided, a new plot will automatically be created.
- plot_coeff(ax=None)
Plot the coefficients as a bar chart.
- Parameters:
ax (Axis , optional) – If axis is provided, they will be used for the plot. if not provided, a new plot will automatically be created.
- classmethod zern_iso(rho, theta, coeff, r_beam)
Calculate the sum of the first 36 Zernike polynomials.
Based on ISO24157:2008.
- Parameters:
rho (float or array of float) – Polar coordinates of the position where the sum of Zernike polynomials should be calculated.
theta (float or array of float) – Polar coordinates of the position where the sum of Zernike polynomials should be calculated.
coeff (array) – first 36 Zernike coefficients
r_beam (float) – radius of the wavefront
- Returns:
values – value(s) of the wavefront at the probed position
- Return type:
float or array of float
- class aisim.beam.Wavevectors(k1=8055366, k2=-8055366)
Bases:
object
Class that defines the wave vectors of the two Ramen beams.
- Parameters:
k1 (float) – 1D wave vectors (wavenumber) in z-direction of the two Raman beams in rad/m, defaults to 2*pi/780e-9
k2 (float) – 1D wave vectors (wavenumber) in z-direction of the two Raman beams in rad/m, defaults to 2*pi/780e-9
- k1, k2
1D wave vectors (wavenumber) in z-direction of the two Raman beams in rad/m
- Type:
float
- doppler_shift(atoms)
Calculate the Doppler shifts for an atomic ensemble.
- Parameters:
atoms (AtomicEnsemble) – an atomic enemble with a finite velocity in the z direction
- Returns:
dopler_shift – Doppler shift of each atom in the ensemble in rad/s
- Return type:
1d array
aisim.convert module
Functions to convert various quantities.
- aisim.convert.cart2pol(cart)
Convert vectors in cartesian coordinates to polar coordinates.
- Parameters:
cart (n × 3 array) – array of n vectors in cartesian coordinates (x, y, z)
- Returns:
pol – array of n vectors in polar coordinates (rho, theta, z)
- Return type:
n × 3 array
- aisim.convert.kb = 1.3806488e-23
Boltzmann constant in J/K.
- aisim.convert.mass = {'Rb87': 1.443161e-25}
Atomic mass in kg.
- aisim.convert.phase_to_grav(phase, T, keff)
Convert a phase shift to gravitational acceleration.
Takes the phase shift measured in a Mach Zehnder atom interferometer and converts it to the corresponding gravtional accleration.
- Parameters:
phase (float) – Interferometer phase
T (float) – interferometer time
keff (float) – effective wavenumber
- Returns:
gravitational acceleration in m/s²
- Return type:
float
- aisim.convert.pol2cart(pol)
Convert vectors in polar coordinates to cartesian coordinates.
- Parameters:
pol (n × 3 array) – array of n vectors in polar coordinates (rho, theta, z)
- Returns:
cart – array of n vectors in cartesian coordinates (x, y, z)
- Return type:
n × 3 array
- aisim.convert.temp(sigma_v, species='Rb87')
Calculate the temperature of an atomic cloud from its velocity spread.
- Parameters:
sigma_v (float) – velocity spread (1 sigma) in meters per second
species (str) – the atomic species, has to be a key in mass
- Returns:
temp – temperature of the cloud in Kelvin
- Return type:
float
- Raises:
ValueError – If negative velocity spread is passed
- aisim.convert.vel_from_temp(temp, species='Rb87')
Calculate the velocity spread (1 sigma) from the temperature of the cloud.
- Parameters:
temp (float) – temperature of the cloud in Kelvin
species (str) – the atomic species, has to be a key in mass
- Returns:
vel – velocity spread (1 sigma)
- Return type:
float
- Raises:
ValueError – If negative temperature is passed
aisim.det module
Classes and functions related to the detection system.
- class aisim.det.Detector(t_det, **kwargs)
Bases:
object
A generic detection zone.
This is only a template without functionality. Deriving classes have to implement _detected_idx.
- Parameters:
t_det (float) – time of the detection
**kwargs – Additional arguments used by classes that inherit from this class. All keyworded arguments are stored as attribues.
- t_det
time of the detection
- Type:
float
- \*\* kwargs
all keyworded arguments that are passed upon creation
- detected_atoms(atoms)
Determine wheter a position is within the detection zone.
Returns a new AtomicEnsemble object containing only the detected phase space vectors.
- Parameters:
atoms (AtomicEnsemble) – the atomic ensemble
- Returns:
detected_atoms – atomic ensemble containing only phase space vectors that are eventually detected
- Return type:
- class aisim.det.PolarDetector(t_det, **kwargs)
Bases:
Detector
A spherical detection zone.
All atoms within a circle with the specified radius within the x-y plane will be detected.
- Parameters:
t_det (float) – time of the detection
r_det – radius of the spherical detection zone
- t_det
time of the detection
- Type:
float
- \*\* kwargs
all keyworded arguments that are passed upon creation
- class aisim.det.SphericalDetector(t_det, **kwargs)
Bases:
Detector
A spherical detection zone.
All atoms within a sphere of the specified radius will be detected.
- Parameters:
t_det (float) – time of the detection
r_det – radius of the spherical detection zone
- t_det
time of the detection
- Type:
float
- \*\* kwargs
all keyworded arguments that are passed upon creation
aisim.prop module
Classes to propagate atomic ensembles.
- class aisim.prop.FreePropagator(time_delta, **kwargs)
Bases:
Propagator
Propagator implementing free propagation without light-matter interaction.
- Parameters:
time_delta (float) – time that should be propagated
- class aisim.prop.Propagator(time_delta, **kwargs)
Bases:
object
A generic propagator.
This is just a template class without an implemented propagation matrix.
- Parameters:
time_delta (float) – time that should be propagated
**kwargs – Additional arguments used by classes that inherit from this class. All keyworded arguments are stored as attribues.
- propagate(atoms)
Propagate an atomic ensemble.
- Parameters:
atoms (AtomicEnsemble) – atomic ensemble that should be is propagated
- class aisim.prop.SpatialSuperpositionTransitionPropagator(time_delta, intensity_profile, n_pulses, n_pulse, wave_vectors=None, wf=None, phase_scan=0)
Bases:
TwoLevelTransitionPropagator
An effective Raman two-level system.
It is implemented as a time propagator as defined in [1]. In addition to class TwoLevelTransitionPropagator, this adds spatial superpositions in z-direction that occour at each pulse.
- Parameters:
time_delta (float) – length of pulse
intensity_profile (IntensityProfile) – Intensity profile of the interferometry lasers
wave_vectors (Wavevectors) – wave vectors of the two Raman beams for calculation of Doppler shifts
wf (Wavefront , optional) – wavefront aberrations of the interferometry beam
phase_scan (float) – effective phase for fringe scans
n_pulses (int) – overall number of intended light pulses in symmetric atom interferometry sequence. Each pulse adds two spatial eigenstates.
n_pulse (int) – number of light pulse of symmetric atom-interferometry sequence.
References
[1] Young, B. C., Kasevich, M., & Chu, S. (1997). Precision atom interferometry with light pulses. In P. R. Berman (Ed.), Atom Interferometry (pp. 363–406). Academic Press. https://doi.org/10.1016/B978-012092460-8/50010-2
- class aisim.prop.TwoLevelTransitionPropagator(time_delta, intensity_profile, wave_vectors=None, wf=None, phase_scan=0)
Bases:
Propagator
A time propagator of an effective Raman two-level system.
- Parameters:
time_delta (float) – length of pulse
intensity_profile (IntensityProfile) – Intensity profile of the interferometry lasers
wave_vectors (Wavevectors) – wave vectors of the two Raman beams for calculation of Doppler shifts
wf (Wavefront , optional) – wavefront aberrations of the interferometry beam
phase_scan (float) – effective phase for fringe scans
Notes
The propagator is for example defined in [1].
References
[1] Young, B. C., Kasevich, M., & Chu, S. (1997). Precision atom interferometry with light pulses. In P. R. Berman (Ed.), Atom Interferometry (pp. 363–406). Academic Press. https://doi.org/10.1016/B978-012092460-8/50010-2