#!/usr/local/bin/python# encoding: utf-8"""*Convert distances between measurement scales*Author: David Young"""from__future__importdivisionfrombuiltinsimportrangefrombuiltinsimportobjectfrompast.utilsimportold_divimportsysimportosimportmathos.environ['TERM']='vt100'
[docs]classconverter(object):""" *A converter to switch distance between various units of measurement* **Key Arguments** - ``log`` -- logger - ``settings`` -- the settings dictionary **Usage** To instantiate a ``converter`` object: ```python from astrocalc.distances import converter c = converter(log=log) ``` """# Initialisationdef__init__(self,log,settings=False,):self.log=loglog.debug("instansiating a new 'converter' object")self.settings=settings# xt-self-arg-tmpx# Initial ActionsreturnNone
[docs]defdistance_to_redshift(self,mpc):"""*Convert a distance from MPC to redshift* The code works by iteratively converting a redshift to a distance, correcting itself and honing in on the true answer (within a certain precision) **Key Arguments** - ``mpc`` -- distance in MPC (assumes a luminousity distance). **Return** - ``redshift`` .. todo:: - replace convert_mpc_to_redshift in all code **Usage** ```python from astrocalc.distances import converter c = converter(log=log) z = c.distance_to_redshift( mpc=500 ) print(z) # OUTPUT: 0.108 ``` """self.log.debug('starting the ``distance_to_redshift`` method')lowerLimit=0.upperLimit=30.redshift=upperLimit-lowerLimitdistGuess=float(self.redshift_to_distance(redshift)['dl_mpc'])distDiff=mpc-distGuesswhilemath.fabs(distDiff)>0.0001:ifdistGuess<mpc:lowerLimit=redshiftredshift=lowerLimit+(upperLimit-lowerLimit)/2.distGuess=float(self.redshift_to_distance(redshift)['dl_mpc'])elifdistGuess>mpc:upperLimit=redshiftredshift=lowerLimit+(upperLimit-lowerLimit)/2.distGuess=float(self.redshift_to_distance(redshift)['dl_mpc'])distDiff=mpc-distGuessredshift=float("%5.4f"%(redshift,))self.log.debug('completed the ``distance_to_redshift`` method')returnredshift
[docs]defredshift_to_distance(self,z,WM=0.3,WV=0.7,H0=70.0):"""*convert redshift to various distance measurements* **Key Arguments** - ``z`` -- redshift measurement. - ``WM`` -- Omega_matter. Default *0.3* - ``WV`` -- Omega_vacuum. Default *0.7* - ``H0`` -- Hubble constant. (km s-1 Mpc-1) Default *70.0* **Return** - ``results`` -- result dictionary including - ``dcmr_mpc`` -- co-moving radius distance - ``da_mpc`` -- angular distance - ``da_scale`` -- angular distance scale - ``dl_mpc`` -- luminosity distance (usually use this one) - ``dmod`` -- distance modulus (determined from luminosity distance) .. todo:: - replace convert_redshift_to_distance in all other code **Usage** ```python from astrocalc.distances import converter c = converter(log=log) dists = c.redshift_to_distance( z=0.343 ) print("Distance Modulus: " + str(dists["dmod"]) + " mag") print("Luminousity Distance: " + str(dists["dl_mpc"]) + " Mpc") print("Angular Size Scale: " + str(dists["da_scale"]) + " kpc/arcsec") print("Angular Size Distance: " + str(dists["da_mpc"]) + " Mpc") print("Comoving Radial Distance: " + str(dists["dcmr_mpc"]) + " Mpc") # OUTPUT : # Distance Modulus: 41.27 mag # Luminousity Distance: 1795.16 Mpc # Angular Size Scale: 4.85 kpc/arcsec # Angular Size Distance: 999.76 Mpc # Comoving Radial Distance: 1339.68 Mpc from astrocalc.distances import converter c = converter(log=log) dists = c.redshift_to_distance( z=0.343, WM=0.286, WV=0.714, H0=69.6 ) print("Distance Modulus: " + str(dists["dmod"]) + " mag") print("Luminousity Distance: " + str(dists["dl_mpc"]) + " Mpc") print("Angular Size Scale: " + str(dists["da_scale"]) + " kpc/arcsec") print("Angular Size Distance: " + str(dists["da_mpc"]) + " Mpc") print("Comoving Radial Distance: " + str(dists["dcmr_mpc"]) + " Mpc") # OUTPUT : # Distance Modulus: 41.29 mag # Luminousity Distance: 1811.71 Mpc # Angular Size Scale: 4.89 kpc/arcsec # Angular Size Distance: 1008.97 Mpc # Comoving Radial Distance: 1352.03 Mpc ``` """self.log.debug('starting the ``redshift_to_distance`` method')# VARIABLEh=H0/100.0WR=old_div(4.165E-5,(h*h))# Omega_radiationWK=1.0-WM-WV-WR# Omega_curvature = 1 - Omega(Total)c=299792.458# speed of light (km/s)# Arbitrarily set the values of these variables to zero just so we can# define them.DCMR=0.0# comoving radial distance in units of c/H0DCMR_Mpc=0.0# comoving radial distance in units of MpcDA=0.0# angular size distance in units of c/H0DA_Mpc=0.0# angular size distance in units of Mpc# scale at angular size distance in units of Kpc / arcsecDA_scale=0.0DL=0.0# luminosity distance in units of c/H0DL_Mpc=0.0# luminosity distance in units of Mpc# Distance modulus determined from luminosity distanceDMOD=0.0a=0.0# 1/(1+z), the scale factor of the Universeaz=1.0/(1.0+z)# 1/(1+z), for the given redshift# Compute the integral over a=1/(1+z) from az to 1 in n stepsn=1000foriinrange(n):a=az+old_div((1.0-az)*(i+0.5),n)adot=math.sqrt(WK+(old_div(WM,a))+(old_div(WR,(math.pow(a,2))))+(WV*math.pow(a,2)))DCMR=DCMR+1.0/(a*adot)# comoving radial distance in units of c/H0DCMR=old_div((1.0-az)*DCMR,n)# comoving radial distance in units of MpcDCMR_Mpc=(old_div(c,H0))*DCMR# Tangental comoving radial distancex=math.sqrt(abs(WK))*DCMRifx>0.1:ifWK>0.0:ratio=old_div(0.5*(math.exp(x)-math.exp(-x)),x)else:ratio=old_div(math.sin(x),x)else:y=math.pow(x,2)ifWK<0.0:y=-yratio=1+y/6.0+math.pow(y,2)/120.0DA=az*ratio*DCMR# angular size distance in units of c/H0DA_Mpc=(old_div(c,H0))*DA# angular size distance in units of Mpc# scale at angular size distance in units of Kpc / arcsecDA_scale=DA_Mpc/206.264806DL=old_div(DA,math.pow(az,2))# luminosity distance in units of c/H0DL_Mpc=(old_div(c,H0))*DL# luminosity distance in units of Mpc# Distance modulus determined from luminosity distanceDMOD=5*math.log10(DL_Mpc*1e6)-5# FIXING PRECISIONS# PRECISION TESTprecision=len(repr(z).split(".")[-1])DCMR_Mpc="%0.*f"%(precision,DCMR_Mpc)DA_Mpc="%0.*f"%(precision,DA_Mpc)DA_scale="%0.*f"%(precision,DA_scale)DL_Mpc="%0.*f"%(precision,DL_Mpc)DMOD="%0.*f"%(precision,DMOD)z="%0.*f"%(precision,z)results= \
{"dcmr_mpc":float(DCMR_Mpc),"da_mpc":float(DA_Mpc),"da_scale":float(DA_scale),"dl_mpc":float(DL_Mpc),"dmod":float(DMOD),"z":float(z)}self.log.debug('completed the ``redshift_to_distance`` method')returnresults
# use the tab-trigger below for new method# xt-class-method