-
Notifications
You must be signed in to change notification settings - Fork 0
/
xirpoles_frompkell.py
113 lines (92 loc) · 3.16 KB
/
xirpoles_frompkell.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# # This script calculates the multipoles of correlation function \xi_l(r) from
# # the multipoles of power spectrum: P_l(k)
# # Mariana Jaber
# # feb 2017
import math
import numpy as np
from scipy import integrate
from pkmu_frompk import pkell
from sphbessel import *
QUAD_EPSABS = 1.49e-8
inf = np.inf
# quad = integrate.quad
def xiellu_integrand(u, r, b, f, sigmav, order):
eu = math.exp(u)
kr = r * eu
if order == 0:
jlkr = j0bess(kr)
elif order == 2:
jlkr = j2bess(kr)
elif order == 4:
jlkr = j4bess(kr)
else:
raise ValueError('Invalid order for Bessel function')
coeffu = math.exp(3 * u) / (2 * np.pi ** 2)
pkl = pkell(eu, b, f, sigmav, order)
return coeffu * pkl * jlkr
v_xiellu_integrand = np.vectorize(xiellu_integrand,
excluded=['b', 'f', 'sigmav', 'order'])
def xiellu_r(kmin, kmax, r, b, f, sigmav, order):
'''
Integral over u=ln(k)
:param kmin: min value of k range in P_lin(k)
:param kmax: max value of k range in P_lin(k)
:param r: r values for Xi(r)
:param b: bias factor
:param f: linear growth factor
:param sigmav: FoG velocity dispersion factor
:param order: L = 0, 2, 4 order for the multipole
:return: xi_l(r) with l= order
'''
umin = math.log(kmin)
umax = math.log(kmax)
if (order == 0 or order == 4):
itol = 1.
elif (order == 2):
itol = -1.
else:
raise ValueError('Invalid order for Legendre polynomial')
int, err = integrate.quad(xiellu_integrand, umin, umax,
epsabs=QUAD_EPSABS,
args=(r, b, f, sigmav, order))
return itol * int
vxiell_ru = np.vectorize(xiellu_r,
excluded=['kmin', 'kmax', 'b', 'f', 'sigmav', 'order'])
# ============ version without logarithmic integrand ==================================#
def xiell_integrand(k, r, b, f, sigmav, order):
'''
:param k: integration variable
:param r: config space coordinate
:param b: bias factor
:param f: linear growth
:param sigmav: FoG velocity dispersion
:param order: l = 0, 2
:return: (k**2/2pi**2) P_l(k)j_l(kr)
'''
kr = k * r
if order == 0:
jlkr = j0bess(kr)
elif order == 2:
jlkr = j2bess(kr)
elif order == 4:
jlkr = j4bess(kr)
else:
raise ValueError('Invalid order for Bessel function')
# jlkr = sjn(order, kr, derivative=False)
coeffk = k ** 2 / (2 * np.pi ** 2)
pkl = pkell(k, b, f, sigmav, order)
return coeffk * pkl * jlkr
def xiell_r(kmin, kmax, r, b, f, sigmav, order):
if (order == 0 or order == 4):
itol = 1.
elif (order == 2):
itol = -1.
else:
raise ValueError('Invalid order for Legendre polynomial')
int, err = integrate.quad(xiell_integrand, kmin, kmax,
epsabs=QUAD_EPSABS,
args=(r, b, f, sigmav, order))
return itol * int
vxiell_r = np.vectorize(xiell_r,
excluded=['kmin', 'kmax', 'b', 'f', 'sigmav', 'order'])
# =================================================================================== #