Source code for ivis.utils.dunits
import numpy as np
from astropy import units as u
from astropy.constants import k_B
from astropy.constants import c as c_light
[docs]
def jy_per_arcsec2_to_K(I_jy_arcsec2, nu_hz_array):
"""
Convert an image/cube from Jy/arcsec^2 to brightness temperature [K],
handling per-channel frequencies. No beam needed.
"""
# Convert Jy/arcsec^2 -> W m^-2 Hz^-1 sr^-1 (treat angles as dimensionless => no leftover sr)
I_si = (I_jy_arcsec2 * u.Jy / u.arcsec**2).to(
u.W / u.m**2 / u.Hz / u.sr,
equivalencies=u.dimensionless_angles()
)
# Broadcast frequency over (H,W) if needed
nu = (np.asarray(nu_hz_array) * u.Hz)
if nu.ndim == 1:
nu = nu[:, None, None]
# Rayleigh–Jeans: T = c^2 I_nu / (2 k_B nu^2)
T = (c_light**2 / (2.0 * k_B * nu**2) * I_si).to(
u.K, equivalencies=u.dimensionless_angles()
)
return T.value
def _lambda_to_radpix(lam, cell_size):
#this function was taken from MPol/fourier
#convert cell_szie from arcsec to rad
cell_size_rad = cell_size.to(u.rad)
# lambda is equivalent to cycles per sky radian
# convert from 'cycles per sky radian' to 'radians per sky radian'
u_rad_per_rad = lam * 2 * np.pi # [radians / sky radian]
# convert from 'radians per sky radian' to 'radians per sky pixel'
# assumes pixels are square and dl and dm are interchangeable
u_rad_per_pix = u_rad_per_rad * cell_size_rad # [radians / pixel]
return u_rad_per_pix