aboutsummaryrefslogtreecommitdiffstats
path: root/rand/pointsrc_coord.py
diff options
context:
space:
mode:
Diffstat (limited to 'rand/pointsrc_coord.py')
-rw-r--r--rand/pointsrc_coord.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/rand/pointsrc_coord.py b/rand/pointsrc_coord.py
new file mode 100644
index 0000000..1da9be2
--- /dev/null
+++ b/rand/pointsrc_coord.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+#
+# Aaron LI
+# 2015/07/01
+#
+
+"""
+Generate random coordinates for point sources with respect to the r^{1/4}
+distribution.
+"""
+
+import numpy as np
+import random
+
+
+def cdf(r, N0=1.0):
+ """
+ Cumulative distribution function of the number of point sources.
+
+ r^{1/4} distribution law: de Vaucouleurs 1948
+ """
+ return N0 * r**(1.0/4.0)
+
+
+def pdf(r, N0=1.0):
+ """
+ Density function of the number of point sources.
+
+ pdf = d(pdf) / d(r)
+ """
+ if isinstance(r, np.ndarray):
+ p = np.zeros(r.shape)
+ p[r<=0.0] = 0.0
+ p[r>0.0] = 0.25 * N0 * r[r>0.0]**(-3.0/4.0)
+ else:
+ if r <= 0.0:
+ p = 0.0
+ else:
+ p = 0.25 * N0 * r**(-3.0/4.0)
+ return p
+
+
+def sampler(min, max, number=1):
+ """
+ Generate a sample of coordinates (only r) within [min, max] from
+ the above density distribution.
+
+ min, max: the minimum and maximum r values (in degree)
+ """
+ # Get the maximum value of the density function
+ M = pdf(min)
+ results = []
+ for i in range(number):
+ while True:
+ u = random.random() * M
+ y = random.random() * (max-min) + min
+ if u <= pdf(y):
+ results.append(y)
+ break
+ if len(results) == 1:
+ return results[0]
+ else:
+ return np.array(results)
+
+
+def add_angle(r):
+ """
+ Add angle for each r value to make up a coordinate of a polar coordinate.
+ """
+ coords = []
+ for ri in r:
+ theta = random.random() * 360
+ coords.append((ri, theta))
+ if len(coords) == 1:
+ return coords[0]
+ else:
+ return coords
+
+
+def to_radec(coords, xc=0, yc=0):
+ """
+ Convert the generated coordinates to (ra, dec) (unit: degree).
+
+ xc, yc: the center coordinate (ra, dec)
+ """
+ results = []
+ for r, theta in coords:
+ # FIXME: spherical algebra should be used!!!
+ dx = r * np.cos(theta*np.pi/180)
+ dy = r * np.sin(theta*np.pi/180)
+ x = xc + dx
+ y = yc + dy
+ results.append((x, y))
+ if len(results) == 1:
+ return results[0]
+ else:
+ return results
+