Skip to content

Commit 48f1cf4

Browse files
Merge pull request #28 from martinkilbinger/cosmo
cosmo functions
2 parents c16b09a + 35fb262 commit 48f1cf4

3 files changed

Lines changed: 166 additions & 17 deletions

File tree

cs_util/calc.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,29 @@ def weighted_avg_and_std(values, weights, corrected=False):
4343
variance = variance * n / (n - 1)
4444

4545
return average, np.sqrt(variance)
46+
47+
48+
def transform_nan(value):
49+
"""Transform Nan.
50+
51+
Transform a ``nan`` to a very large number.
52+
53+
Parameters
54+
----------
55+
value : float
56+
input value
57+
58+
Returns
59+
-------
60+
float
61+
output value
62+
63+
"""
64+
large = 1e30
65+
66+
if np.isnan(value) or np.isinf(value):
67+
res = 1e30
68+
else:
69+
res = value
70+
71+
return res

cs_util/cosmo.py

Lines changed: 97 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,40 @@
1414
from astropy import constants
1515
from astropy import units
1616

17+
import pyccl as ccl
1718

18-
def sigma_crit(z_lens, z_source, cosmo, d_lens=None, d_source=None):
19+
20+
# Set ell_max to large value, for spline interpolation (in integral over
21+
# C_ell to get real-space correlation functions). Avoid aliasing
22+
# (oscillations)
23+
ccl.spline_params.ELL_MAX_CORR = 10_000_000
24+
25+
ccl.spline_params.N_ELL_CORR = 5_000
26+
27+
28+
def get_cosmo_default():
29+
"""Get Cosmo Default.
30+
31+
Return default cosmology.
32+
33+
Returns
34+
-------
35+
Cosmology
36+
pyccl cosmology object
37+
38+
"""
39+
cos = ccl.Cosmology(
40+
Omega_c=0.27,
41+
Omega_b=0.045,
42+
h=0.67,
43+
sigma8=0.83,
44+
n_s=0.96,
45+
)
46+
47+
return cos
48+
49+
50+
def sigma_crit(z_lens, z_source, cos, d_lens=None, d_source=None):
1951
"""Sigma Crit.
2052
2153
Critical surface mass density.
@@ -26,7 +58,7 @@ def sigma_crit(z_lens, z_source, cosmo, d_lens=None, d_source=None):
2658
lens redshift
2759
z_source : float
2860
source redshift
29-
cosmo : pyccl.core.Cosmology
61+
cos : pyccl.core.Cosmology
3062
cosmological parameters
3163
d_lens : astropy.units.Quantity, optional
3264
precomputed anguar diameter distance to lens, computed from z_lens
@@ -50,13 +82,11 @@ def sigma_crit(z_lens, z_source, cosmo, d_lens=None, d_source=None):
5082
a_lens = 1 / (1 + z_lens)
5183
a_source = 1 / (1 + z_source)
5284
if not d_lens:
53-
d_lens = cosmo.angular_diameter_distance(a_lens) * units.Mpc
85+
d_lens = cos.angular_diameter_distance(a_lens) * units.Mpc
5486
if not d_source:
55-
d_source = cosmo.angular_diameter_distance(a_source) * units.Mpc
87+
d_source = cos.angular_diameter_distance(a_source) * units.Mpc
5688

57-
d_lens_source = (
58-
cosmo.angular_diameter_distance(a_lens, a_source) * units.Mpc
59-
)
89+
d_lens_source = cos.angular_diameter_distance(a_lens, a_source) * units.Mpc
6090

6191
frac = d_source / (d_lens_source * d_lens)
6292
pref = constants.c**2 / (4 * np.pi * constants.G)
@@ -70,7 +100,7 @@ def sigma_crit_eff(
70100
z_lens,
71101
z_source_arr,
72102
nz_source_arr,
73-
cosmo,
103+
cos,
74104
d_lens=None,
75105
d_source_arr=None,
76106
):
@@ -87,7 +117,7 @@ def sigma_crit_eff(
87117
source redshifts
88118
nz_source_arr : list
89119
number of galaxies at z_source
90-
cosmo : pyccl.core.Cosmology
120+
cos : pyccl.core.Cosmology
91121
cosmological parameters
92122
d_lens : astropy.units.Quantity, optional
93123
precomputed anguar diameter distance to lens;
@@ -124,7 +154,7 @@ def sigma_crit_eff(
124154
sigma_cr = sigma_crit(
125155
z_lens,
126156
z_source_arr[idx],
127-
cosmo,
157+
cos,
128158
d_lens=d_lens,
129159
d_source=d_source_arr[idx],
130160
)
@@ -146,7 +176,7 @@ def sigma_crit_m1_eff(
146176
z_lens,
147177
z_source_arr,
148178
nz_source_arr,
149-
cosmo,
179+
cos,
150180
d_lens=None,
151181
d_source_arr=None,
152182
):
@@ -164,7 +194,7 @@ def sigma_crit_m1_eff(
164194
source redshifts
165195
nz_source_arr : list
166196
number of galaxies at z_source
167-
cosmo : pyccl.core.Cosmology
197+
cos : pyccl.core.Cosmology
168198
cosmological parameters
169199
d_lens : astropy.units.Quantity, optional
170200
precomputed anguar diameter distance to lens;
@@ -204,7 +234,7 @@ def sigma_crit_m1_eff(
204234
sigma_cr = sigma_crit(
205235
z_lens,
206236
z_source_arr[idx],
207-
cosmo,
237+
cos,
208238
d_lens=d_lens,
209239
d_source=d_source_arr[idx],
210240
)
@@ -225,3 +255,57 @@ def sigma_crit_m1_eff(
225255
sigma_cr_m1_eff = np.average(sigma_cr_m1_arr, weights=weights)
226256

227257
return sigma_cr_m1_eff * unit
258+
259+
260+
def xipm_theo(
261+
theta,
262+
cos,
263+
z,
264+
dndz,
265+
):
266+
"""Xipm Theo.
267+
268+
Return theoretical prediction of the shear two-point correlation function.
269+
270+
Parameters
271+
----------
272+
theta : list
273+
angular scales, list of type astropy.units.Quantity
274+
cos : pyccl.core.Cosmology
275+
cosmological parameters
276+
z : list
277+
redshift centers
278+
dndz : list
279+
number of galaxies for each z (arbitrary normalisation)
280+
281+
Returns
282+
-------
283+
numpy.ndarray
284+
xi_+
285+
numpy.ndarray
286+
xi_-
287+
288+
"""
289+
# Create objects to represent tracers of the weak lensing signal with this
290+
# number density (with has_intrinsic_alignment=False)
291+
lens_tr = ccl.WeakLensingTracer(cos, dndz=(z, dndz))
292+
293+
# Calculate the angular cross-spectrum of the two tracers as a function
294+
# of ell
295+
# MKDEBUG TODO: vary, use unions-shear-ustc-cea/unions_wl/defaults.py
296+
ell = np.logspace(0, np.log10(10000), 1000)
297+
cl = ccl.angular_cl(cos, lens_tr, lens_tr, ell)
298+
299+
method = "Bessel"
300+
301+
xipm = {}
302+
for corr_type in ("GG+", "GG-"):
303+
xipm[corr_type] = ccl.correlation(
304+
cos,
305+
ell,
306+
cl,
307+
theta.to("deg"),
308+
type=corr_type,
309+
)
310+
311+
return xipm["GG+"], xipm["GG-"]

cs_util/tests/test_cosmo.py

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55
"""
66

77
import os
8+
import pickle
89

10+
from numpy import testing as npt
911
import numpy as np
10-
import pyccl as ccl
1112

1213
from astropy import units
13-
14-
from numpy import testing as npt
14+
import pyccl as ccl
1515

1616
from unittest import TestCase
1717

1818
from cs_util import cosmo
1919

2020

2121
class CosmoTestCase(TestCase):
22-
"""Test case for the ``cosmo` module."""
22+
"""Test case for the ``cosmo`` module."""
2323

2424
def setUp(self):
2525
"""Set test parameter values."""
@@ -45,6 +45,20 @@ def setUp(self):
4545
1678.82870081,
4646
] * units.Mpc
4747

48+
self._cos_def = cosmo = ccl.Cosmology(
49+
Omega_c=0.27,
50+
Omega_b=0.045,
51+
h=0.67,
52+
sigma8=0.83,
53+
n_s=0.96,
54+
)
55+
56+
self._theta = [1, 10, 100] * units.arcmin
57+
self._z = np.linspace(0.2, 1.2, 50)
58+
self._nz = (self._z / 0.8) ** 2 * np.exp(-((self._z / 0.8) ** 1.5))
59+
self._xip = [1.33045991e-04, 2.13181640e-05, 2.13598131e-06]
60+
self._xim = [1.97627462e-05, 1.23127046e-05, 2.17498675e-06]
61+
4862
def tearDown(self):
4963
"""Unset test parameter values."""
5064
self._z_source = None
@@ -55,6 +69,12 @@ def tearDown(self):
5569
self._d_source = None
5670
self._d_lens = None
5771
self._ds_cosmo = None
72+
self._cos_def = None
73+
self._theta = None
74+
self._z = None
75+
self._nz = None
76+
self._xip = None
77+
self._xim = None
5878

5979
def test_sigma_crit(self):
6080
"""Test ``cs_util.cosmo.sigma_crit`` method."""
@@ -250,3 +270,22 @@ def test_sigma_crit_m1_eff(self):
250270
self._sigma_crit_value_eff_m1,
251271
decimal=3,
252272
)
273+
274+
def test_get_cosmo_default(self):
275+
"""Test ``cs_util.get_cosmo_default`` method."""
276+
277+
cos_def = cosmo.get_cosmo_default()
278+
279+
npt.assert_equal(pickle.dumps(cos_def), pickle.dumps(self._cos_def))
280+
281+
def test_xipm_theo(self):
282+
xip, xim = cosmo.xipm_theo(
283+
self._theta,
284+
self._cosmo,
285+
self._z,
286+
self._nz,
287+
)
288+
npt.assert_equal(len(xip), len(self._theta))
289+
for idx in range(len(self._theta)):
290+
npt.assert_almost_equal(xip[idx], self._xip[idx], decimal=4)
291+
npt.assert_almost_equal(xim[idx], self._xim[idx], decimal=4)

0 commit comments

Comments
 (0)