Skip to content

Commit e19a10f

Browse files
Merge pull request #145 from michealroberts/feature/cosmology/get_angular_diameter_distance
feat: add get_angular_diameter_distance to cosmology in celerity module
2 parents 8096651 + 4058409 commit e19a10f

File tree

2 files changed

+142
-2
lines changed

2 files changed

+142
-2
lines changed

src/celerity/cosmology.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ def get_luminosity_distance(z: float, H: Measurement = H0_PLANCK_2018) -> Measur
111111
Luminosity distance D_L(z) = (1 + z) · D_C(z), in meters.
112112
113113
Args:
114-
z: Redshift (z), must be >= 0.
115-
H: Measurement of the Hubble constant (H0) in km/s/Mpc with its associated uncertainty.
114+
z: Redshift (z), must be >= 0.
115+
H: Measurement of the Hubble constant (H0) in km/s/Mpc with its associated uncertainty.
116116
117117
Returns:
118118
Measurement: Luminosity distance in meters with its associated uncertainty.
@@ -136,3 +136,37 @@ def get_luminosity_distance(z: float, H: Measurement = H0_PLANCK_2018) -> Measur
136136

137137

138138
# **************************************************************************************
139+
140+
141+
def get_angular_diameter_distance(
142+
z: float, H: Measurement = H0_PLANCK_2018
143+
) -> Measurement:
144+
"""
145+
Angular diameter distance D_A(z) = D_C(z) / (1 + z), in meters.
146+
147+
Args:
148+
z: Redshift (z), must be >= 0.
149+
H: Measurement of the Hubble constant (H0) in km/s/Mpc with its associated uncertainty.
150+
151+
Returns:
152+
Measurement: Angular diameter distance in meters with its associated uncertainty.
153+
154+
Raises:
155+
ValueError: If z is negative.
156+
ValueError: If the Hubble constant is not positive.
157+
"""
158+
if z < 0:
159+
raise ValueError("Redshift must be non-negative.")
160+
161+
# Compute comoving distance (with its propagated uncertainty)
162+
d = get_comoving_distance(z, H)
163+
164+
return Measurement(
165+
{
166+
"value": d["value"] / (1.0 + z),
167+
"uncertainty": d.get("uncertainty", 0.0) / (1.0 + z),
168+
}
169+
)
170+
171+
172+
# **************************************************************************************

tests/test_cosmology.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from celerity.constants import H0_PLANCK_2018, H0_SH0ES_2022
1212
from celerity.cosmology import (
13+
get_angular_diameter_distance,
1314
get_comoving_distance,
1415
get_hubble_parameter,
1516
get_luminosity_distance,
@@ -259,6 +260,111 @@ def test_shoes_z1000(self):
259260
)
260261

261262

263+
# **************************************************************************************
264+
265+
266+
class TestAngularDiameterDistance(unittest.TestCase):
267+
def test_planck_z0(self):
268+
d = get_angular_diameter_distance(0.0, H0_PLANCK_2018)
269+
self.assertEqual(d["value"], 0.0)
270+
self.assertEqual(d["uncertainty"], 0.0)
271+
272+
def test_shoes_z0(self):
273+
d = get_angular_diameter_distance(0.0, H0_SH0ES_2022)
274+
self.assertEqual(d["value"], 0.0)
275+
self.assertEqual(d["uncertainty"], 0.0)
276+
277+
def test_planck_z0_1(self):
278+
d = get_angular_diameter_distance(0.1, H0_PLANCK_2018)
279+
expected_val = 1.21174e25
280+
expected_unc = 8.6e22
281+
self.assertAlmostEqual(d["value"], expected_val, delta=0.05 * expected_val)
282+
self.assertAlmostEqual(
283+
d["uncertainty"], expected_unc, delta=0.20 * expected_unc
284+
)
285+
286+
def test_planck_z1(self):
287+
d = get_angular_diameter_distance(1.0, H0_PLANCK_2018)
288+
expected_val = 5.221447e25
289+
expected_unc = 3.5475e23
290+
self.assertAlmostEqual(d["value"], expected_val, delta=0.05 * expected_val)
291+
self.assertAlmostEqual(
292+
d["uncertainty"], expected_unc, delta=0.20 * expected_unc
293+
)
294+
295+
def test_planck_z10(self):
296+
d = get_angular_diameter_distance(10.0, H0_PLANCK_2018)
297+
expected_val = 2.688876e25
298+
expected_unc = 1.8232e23
299+
self.assertAlmostEqual(d["value"], expected_val, delta=0.05 * expected_val)
300+
self.assertAlmostEqual(
301+
d["uncertainty"], expected_unc, delta=0.20 * expected_unc
302+
)
303+
304+
def test_planck_z100(self):
305+
d = get_angular_diameter_distance(100.0, H0_PLANCK_2018)
306+
expected_val = 3.901548e24
307+
expected_unc = 2.65067e22
308+
self.assertAlmostEqual(d["value"], expected_val, delta=0.05 * expected_val)
309+
self.assertAlmostEqual(
310+
d["uncertainty"], expected_unc, delta=0.20 * expected_unc
311+
)
312+
313+
def test_planck_z1000(self):
314+
d = get_angular_diameter_distance(1000.0, H0_PLANCK_2018)
315+
expected_val = 4.515514e23
316+
expected_unc = 3.06893e21
317+
self.assertAlmostEqual(d["value"], expected_val, delta=0.05 * expected_val)
318+
self.assertAlmostEqual(
319+
d["uncertainty"], expected_unc, delta=0.20 * expected_unc
320+
)
321+
322+
def test_shoes_z0_1(self):
323+
d = get_angular_diameter_distance(0.1, H0_SH0ES_2022)
324+
expected_val = 1.12402e25
325+
expected_unc = 1.634e23
326+
self.assertAlmostEqual(d["value"], expected_val, delta=0.10 * expected_val)
327+
self.assertAlmostEqual(
328+
d["uncertainty"], expected_unc, delta=0.25 * expected_unc
329+
)
330+
331+
def test_shoes_z1(self):
332+
d = get_angular_diameter_distance(1.0, H0_SH0ES_2022)
333+
expected_val = 4.842574e25
334+
expected_unc = 6.9058e23
335+
self.assertAlmostEqual(d["value"], expected_val, delta=0.10 * expected_val)
336+
self.assertAlmostEqual(
337+
d["uncertainty"], expected_unc, delta=0.25 * expected_unc
338+
)
339+
340+
def test_shoes_z10(self):
341+
d = get_angular_diameter_distance(10.0, H0_SH0ES_2022)
342+
expected_val = 2.493742e25
343+
expected_unc = 3.5518e23
344+
self.assertAlmostEqual(d["value"], expected_val, delta=0.10 * expected_val)
345+
self.assertAlmostEqual(
346+
d["uncertainty"], expected_unc, delta=0.25 * expected_unc
347+
)
348+
349+
def test_shoes_z100(self):
350+
d = get_angular_diameter_distance(100.0, H0_SH0ES_2022)
351+
expected_val = 3.618497e24
352+
expected_unc = 5.15149e22
353+
self.assertAlmostEqual(d["value"], expected_val, delta=0.10 * expected_val)
354+
self.assertAlmostEqual(
355+
d["uncertainty"], expected_unc, delta=0.25 * expected_unc
356+
)
357+
358+
def test_shoes_z1000(self):
359+
d = get_angular_diameter_distance(1000.0, H0_SH0ES_2022)
360+
expected_val = 3.957134e23
361+
expected_unc = 5.63253e21
362+
self.assertAlmostEqual(d["value"], expected_val, delta=0.10 * expected_val)
363+
self.assertAlmostEqual(
364+
d["uncertainty"], expected_unc, delta=0.25 * expected_unc
365+
)
366+
367+
262368
# **************************************************************************************
263369

264370
if __name__ == "__main__":

0 commit comments

Comments
 (0)