"""Common 21 cm conversions.Provides conversions between observing co-ordinates and cosmological co-ordinates."""importnumpyasnpfromastropyimportconstantsascnstfromastropyimportunitsasunfromastropy.cosmologyimportFLRW,Planck15fromastropy.cosmology.unitsimportlittlehfromtypingimportUnionfrom.importunitsastp# The frequency of the 21cm line emission.f21=1.42040575177*un.GHz
[docs]@un.quantity_inputdeff2z(fq:tp.Frequency)->float:""" Convert frequency to redshift for 21 cm line. Parameters ---------- fq : float or astropy.Quantity If float, it is interpreted as being in GHz. Returns ------- dimensionless astropy.Quantity : The redshift """returnfloat(f21/fq-1)
[docs]@un.quantity_inputdefz2f(z:Union[float,np.array])->un.Quantity[un.GHz]:""" Convert redshift to z=0 frequency for 21 cm line. Parameters ---------- z Redshift Returns ------- astropy.Quantity : the frequency """returnf21/(1+z)
[docs]defdL_dth(z:Union[float,np.array],cosmo:FLRW=Planck15,approximate=False,)->un.Quantity[un.Mpc/un.rad/littleh]:""" Return the factor to convert radians to transverse distance at redshift z. Parameters ---------- z : float The redshift Returns ------- astropy.Quantity : the factor (in Mpc/h/radian) which converts from an angle to a transverse distance. Notes ----- From Furlanetto et al. (2006) """ifapproximate:return((1.9*(1.0/un.arcmin)*((1+z)/10.0)**0.2).to(1/un.rad)*un.Mpc/littleh)else:returncosmo.h*cosmo.comoving_transverse_distance(z)/un.rad/littleh
[docs]defdL_df(z:Union[float,np.array],cosmo:FLRW=Planck15,approximate=False,)->un.Quantity[un.Mpc/un.MHz/littleh]:""" Get the factor to convert bandwidth to line-of-sight distance in Mpc/h. Parameters ---------- z : float The redshift """ifapproximate:return((1.7/0.1)*((1+z)/10.0)**0.5*(cosmo.Om0/0.15)**-0.5*un.Mpc/littleh/un.MHz)else:return(cosmo.h*cnst.c*(1+z)/(z2f(z)*cosmo.H(z)*littleh)).to("Mpc/(MHz*littleh)")
[docs]defdk_du(z:Union[float,np.array],cosmo:FLRW=Planck15,approximate=False,)->un.Quantity[littleh/un.Mpc]:""" Get factor converting bl length in wavelengths to h/Mpc. Parameters ---------- z : float redshift Notes ----- Valid for u >> 1 """# from du = 1/dth, which derives from du = d(sin(th)) using the small-angle approxreturn2*np.pi/dL_dth(z,cosmo,approximate=approximate)/un.rad
[docs]defdk_deta(z:Union[float,np.array],cosmo:FLRW=Planck15,approximate=False,)->un.Quantity[un.MHz*littleh/un.Mpc]:""" Get gactor converting inverse frequency to inverse distance. Parameters ---------- z: float Redshift """return2*np.pi/dL_df(z,cosmo,approximate=approximate)
[docs]defX2Y(z:Union[float,np.array],cosmo:FLRW=Planck15,approximate=False,)->un.Quantity[un.Mpc**3/littleh**3/un.steradian/un.MHz]:""" Obtain the conversion factor between observing co-ordinates and cosmological volume. Parameters ---------- z: float Redshift cosmo: astropy.cosmology.FLRW instance A cosmology. Returns ------- astropy.Quantity: the conversion factor. Units are Mpc^3/h^3 / (sr MHz). """returndL_dth(z,cosmo,approximate=approximate)**2*dL_df(z,cosmo,approximate=approximate)