Photon-ALP conversion probability
Theoretical background
This page provides a little bit of background about how the mixing of photons and axion-like particles (ALPs) is calculated by gammaALPs. It draws heavily from the discussion provided in [Meyer2014].
Photons and ALPs can mix in the presence of electromagnetic fields.
In gammaALPs, this equations of motions are solved through the transfer matrix approach (see [DeAngelis2011] for
a review), which is implemented in the GammaALPTransfer
class.
It derives from the effective Lagrangian for the mixing between photons and ALPs, which can be written as [Raffelt1988]
The first term on the right hand side is given describes the photon-ALP mixing (see below) the second term is the effective Euler-Heisenberg Lagrangian that accounts for one-loop corrections of the photon propagator and the ALP mass and kinetic terms are
ALPs only couple to photons in the presence of a magnetic field component \(\mathbf{B}_\perp\) transversal to the propagation direction and only to photon polarisation states in the plane spanned by \(\mathbf{B}\) and the direction of propagation. Let \(z\) be the propagation direction so that \(\mathbf{B}_\perp = B \hat{\mathbf{y}}\), and \(A_x\), \(A_y\) the polarisation states along \(\hat{x}\) and \(\hat{y}\), respectively. Then the equations of motion for a polarised photon beam of energy $E$ propagating in a cold plasma filled with a homogeneous magnetic field read
with \(\Psi(z) = (A_x(z), A_y(z), a(z))^T\) and the mixing matrix \(\mathcal{M}_0\) (neglecting Faraday rotation),
The terms \(\Delta_{||,\perp}\) arise due to the effects of the propagation of photons in a plasma
and the QED vacuum polarisation effect,
\(\Delta_{\perp} = \Delta_\mathrm{pl} + 2\Delta_\mathrm{QED} + \Delta_\mathrm{CMB}\),
and \(\Delta_{||} = \Delta_\mathrm{pl} + 7/2\Delta_\mathrm{QED} + \Delta_\mathrm{CMB}\).
The plasma contribution depends on electron density \(n_{\mathrm{el}}\) through
the plasma frequency \(\omega_\mathrm{pl}^2 = 4\pi e^2 n_\mathrm{el} / m_e\),
\(\Delta_\mathrm{pl} = -\omega_\mathrm{pl} / (2 E)\).
The QED vacuum polarisation term reads \(\Delta_\mathrm{QED} = \alpha E / (45\pi)(B /(B_\mathrm{cr}))^2\),
with the fine-structure constant \(\alpha\), and the critical magnetic field
\(B_\mathrm{cr} = m^2_e / |e| \sim 4.4\times10^{13}`G.
The term :math:\)Delta_mathrm{CMB} = 44alpha^2 / (135 m_e^4)rho_mathrm{CMB}` accounts for
photon-photon dispersion with the cosmic microwave background (CMB),
where \(\rho_\mathrm{CMB} = (\pi^2 / 15)T^4 \sim 0.261\,\mathrm{eV}\,\mathrm{cm}^{-3}\)
is the CMB energy density [Dobrynina2015].
The kinetic term for the ALP is \(\Delta_a = -m_a^2 / (2E)\)
and photon-ALP mixing is the result of the off-diagonal elements \(\Delta_{a\gamma} = g_{a\gamma} B / 2\).
Suitable numerical values for the different \(\Delta\) terms are provided in ref. [Horns2012].
If photons are lost due to absorption, the diagonal terms \(\Delta_{||,\perp}\) get an additional imaginary
contribution that scales with the mean free path \(\Gamma\) of the photon.
The mean free path and additional terms for photon-photon dispersion \(\chi\) can be provided to
GammaALPTransfer
upon initialization.
The equations of motion lead to photon-ALP oscillations with the wave number
For an unpolarised photon beam, the problem has to be reformulated in terms of the density matrix \(\rho(z) = \Psi(z)\Psi(z)^\dagger\) that obeys the von-Neumann-like commutator equation
which is solved through \(\rho(z) = \mathcal{T}(z,0; E)\rho(0)\mathcal{T}^\dagger(z,0; E)\), with the transfer matrix \(\mathcal T\) with \(\Psi(z) = \mathcal{T}(z,0;E)\Psi(0)\) and initial condition \(\mathcal{T}(0,0;E) = 1\). In general, \(\mathbf B_\perp`lwill not be aligned along the :math:`y\) axis but will form an angle \(\psi\) with it. In this case, the solutions have to be modified with a similarity transformation and, consequently, \(\mathcal M\) and \(\mathcal T\) will depend on \(\psi\).
In practice, the code split up the the calculation into \(N\) steps along the \(z\), where it is assumed that the magnetic field is constant for each step length \(\mathrm{d}z\). For the mixing in \(N\) consecutive steps one finds that the photon survival probability of an initial polarisation \(\rho(0)\) is given by
with \(\rho_{11} = \mathrm{diag}(1,0,0), \rho_{22} = \mathrm{diag}(0,1,0)\), and
For an initially unpolarised photon beam one has \(\rho(0) = (1/2) \,\mathrm{diag}(1,1,0)\).
By providing the magnetic field, angle \(\psi\), and electron density,
(and optionally a photon mean free path and photon-photon dispersion), the codes pre-calculates all matrices
\(\mathcal{T}(z_{i+1},z_{i};\psi_{i};E)\) for each requested energy \(E\) as
4 dimensional arrays (ndarray
)
using the fill_transfer()
method.
These are then multiplied together with a matrix multiplication along the \(z\) axis.
Reference / API
- class gammaALPs.base.transfer.GammaALPTransfer(EGeV, B, psi, nel, dL, alp, Gamma=None, chi=None, Delta=None)[source]
Bases:
object
Base class to calculate the transfer Function of photon-ALP oscillations in arbitrary magnetic fields. Does not account for redshift evolution.
Units used are: magnetic field B: micro Gauss length scales: kpc electron densities: cm^-3 ALP mass: neV photon-ALP coupling: 10^-11 GeV^-1
Unit conversion is done through astropy.units module
- property B
- property Bn
- property Delta
- property EGeV
- property Gamma
- __init__(EGeV, B, psi, nel, dL, alp, Gamma=None, chi=None, Delta=None)[source]
Initialize the transfer base class
- Parameters:
EGeV (array-like) – n-dim numpy array with gamma-ray energies in GeV
B (array-like) – m-dim numpy array with magnetic field values along line of sight in micro Gauss
psi (array-like) – m-dim numpy array with angles between transversal magnetic field in photon polarization direction (along y-axis) along the line of sight. Or (k,m)-dim numpy array with angles for k B-field realizations
nel (array-like) – m-dim numpy array with electron densities in cm^-3 along the line of sight.
dL (array-like) – m-dim numpy array with distance step length traveled along line of sight in kpc. In each step length dL, magnetic field is assumed to be constant.
alp (~gammaALPs.ALP) – ~gammaALPs.ALP object with ALP parameters
Gamma (array-like or None) – (n x m)-dim array with photon absorption rate at energy E and distance L. In kpc^-1. If None, no absorption is included. Default is None.
Delta (array-like or None) – (n x m)-dim array with additional momentum difference term for 0,0 and 1,1 components of mixing matrix at energy E and distance L. In kpc^-1. If None, no additional term is included. Default is None.
chi (array-like or None) – (n x m)-dim numpy array with photon dispersion rate at energy E and distance L. If None, no dispersion is included. Default is None.
- property alp
- calc_transfer(nsim=-1, nprocess=1)[source]
Calculate Transfer matrix by performing dot product of all transfer matrices along axis of distance.
- Parameters:
nsim (int) – number of B-field realization to be used. Only works if class was initialized with multiple B-field realizations.
nprocess (int) – distibute matrix multiplication to n (if n > 1) processes using python’s multiprocessing. Testing this feature so far did not show any gain in speed, however!
- Return type:
n x 3 x 3 dim
ndarray
with transfer matrix for all energies
- calc_transfer_multi(nprocess=1)[source]
Calculate Transfer matrix by performing dot product of all transfer matrices along axis of distance. If multiple realizations for the B-field are to be calculated, parallel processing is used.
- property chi
- property dL
- fill_transfer()[source]
Calculate the transfer matrix for every domain for all requested magnetic field realizations
- Return type:
list with all transfer functions for all B-field realizations
- property nel
- property neln
- property nsim
- property psi
- property psin
- static read_environ(name, alp, filepath='./')[source]
Load a current magnetic field, psi angles, and electron density, absorption and dispersion rate from a previous configuration
- Parameters:
name (str) – name of job
alp (~gammaALPs.transer.ALP) – ~gammaALPs.transer.ALP object with ALP parameters
filepath (str) – full path to output file
m (float) – ALP mass in neV. Default in 1.
g (float) – photon-ALP couplint in 10^-11 GeV^-1. Default in 1.
log_level (str) – level for logging, either ‘debug’, ‘info’, ‘warning’ or ‘error’
- show_conv_prob_vs_r(pin, pout)[source]
Compute the conversion probability as a function of distance. Works only after you have computed the transfer matrices in each domain.
- Parameters:
pin (~numpy.ndarray) – 3 x 3 matrix with initial polarization
pout (~numpy.ndarray) – 3 x 3 matrix with final polarization
- Return type:
Conversion probability for each energy and distance
- gammaALPs.base.transfer.EminGeV(m_neV, g11, n_cm3, BmuG)[source]
Calculates the energy above which the strong mixing regime sets in. Includes momentum difference terms Delta_pl, Delta_a and Delta_ag. If input parameters are provided as arrays, they all need to have the same shape.
- Parameters:
- Returns:
Emin_GeV – minimum energy of strong mixing regime in GeV as float or array.
- Return type:
float or array-like
- gammaALPs.base.transfer.EmaxGeV(g11, BmuG)[source]
Calculates the energy below which the mixing occurs in the strong mixing regime. Includes momentum difference terms Delta_CMB, Delta_QED (without high order corrections) and Delta_ag. If input parameters are provided as arrays, they all need to have the same shape.
- Parameters:
- Returns:
Emax_GeV – maximum energy of strong mixing regime in GeV as float or array.
- Return type:
float or array-like