aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron LI <aly@aaronly.me>2017-08-30 11:36:48 +0800
committerAaron LI <aly@aaronly.me>2017-08-30 11:36:48 +0800
commit524c0993f4f57ad158dc6dae481cae3ab09d7a2c (patch)
treeb1a2bcf8efd1acb403e5337317611f75ad553b23
parentfea0272a343ec700505654c6d042538d0db590f9 (diff)
downloadfg21sim-524c0993f4f57ad158dc6dae481cae3ab09d7a2c.tar.bz2
utils: Add analyze.py with function "countsdist_integrate()"
-rw-r--r--fg21sim/utils/analyze.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/fg21sim/utils/analyze.py b/fg21sim/utils/analyze.py
new file mode 100644
index 0000000..f8137e9
--- /dev/null
+++ b/fg21sim/utils/analyze.py
@@ -0,0 +1,66 @@
+# Copyright (c) 2017 Weitian LI <weitian@aaronly.me>
+# MIT license
+
+"""
+Utilities to help analyze the simulation results.
+"""
+
+import logging
+
+import numpy as np
+
+
+logger = logging.getLogger(__name__)
+
+
+def inverse_cumsum(x):
+ """
+ Do cumulative sum reversely.
+
+ Credit: https://stackoverflow.com/a/28617608/4856091
+ """
+ x = np.asarray(x)
+ return x[::-1].cumsum()[::-1]
+
+
+def countdist_integrated(x, nbin, log=True):
+ """
+ Calculate the integrated counts distribution (i.e., luminosity
+ function), representing the counts (number of objects) with a
+ greater value.
+
+ Parameters
+ ----------
+ x : list[float]
+ Array of quantities of every object/source.
+ nbin : int
+ Number of bins to calculate the counts distribution.
+ log : bool, optional
+ Whether to take logarithm on the ``x`` quantities to determine
+ the bin edges?
+ Default: True
+
+ Returns
+ -------
+ counts : 1D `~numpy.ndarray`
+ The integrated counts for each bin, of length ``nbin``.
+ bins : 1D `~numpy.ndarray`
+ The central positions of every bin, of length ``nbin``.
+ binedges : 1D `~numpy.ndarray`
+ The edge positions of every bin, of length ``nbin+1``.
+ """
+ x = np.asarray(x)
+ if log is True:
+ x = np.log(x)
+
+ binedges = np.linspace(x.min(), x.max(), num=nbin+1)
+ bins = (binedges[1:] + binedges[:-1]) / 2
+ counts, __ = np.histogram(x, bins=binedges)
+ # Convert to the integrated counts distribution
+ counts = inverse_cumsum(counts)
+
+ if log is True:
+ bins = np.exp(bins)
+ binedges = np.exp(binedges)
+
+ return (counts, bins, binedges)