Source code for lenstronomy.GalKin.velocity_util

__author__ = "sibirrer"

import numpy as np

from lenstronomy.Util.package_util import exporter

export, __all__ = exporter()


[docs] @export def hyp_2F1(a, b, c, z): """ http://docs.sympy.org/0.7.1/modules/mpmath/functions/hypergeometric.html """ import mpmath as mp return mp.hyp2f1(a, b, c, z)
[docs] @export def displace_PSF_gaussian(x, y, FWHM): """ :param x: x-coord (arc sec) :param y: y-coord (arc sec) :param FWHM: psf size (arc sec) :return: x', y' random displaced according to psf """ sigma = FWHM / (2 * np.sqrt(2 * np.log(2))) sigma_one_direction = sigma x_ = x + np.random.normal() * sigma_one_direction y_ = y + np.random.normal() * sigma_one_direction return x_, y_
[docs] @export def moffat_r(r, alpha, beta): """Moffat profile. :param r: radial coordinate :param alpha: Moffat parameter :param beta: exponent :return: Moffat profile """ return 2.0 * (beta - 1) / alpha**2 * (1 + (r / alpha) ** 2) ** (-beta)
[docs] @export def moffat_fwhm_alpha(FWHM, beta): """Computes alpha parameter from FWHM and beta for a Moffat profile. :param FWHM: full width at half maximum :param beta: beta parameter of Moffat profile :return: alpha parameter of Moffat profile """ return FWHM / (2 * np.sqrt(2 ** (1.0 / beta) - 1))
[docs] @export def draw_moffat_r(FWHM, beta): """ :param FWHM: full width at half maximum :param beta: Moffat beta parameter :return: draw from radial Moffat distribution """ alpha = moffat_fwhm_alpha(FWHM, beta) y = draw_cdf_Y(beta) # equation B3 in Berge et al. paper X = alpha * np.sqrt((y - 1)) return X
[docs] @export def displace_PSF_moffat(x, y, FWHM, beta): """ :param x: x-coordinate of light ray :param y: y-coordinate of light ray :param FWHM: full width at half maximum :param beta: Moffat beta parameter :return: displaced ray by PSF """ X = draw_moffat_r(FWHM, beta) dx, dy = draw_xy(X) return x + dx, y + dy
[docs] @export def draw_cdf_Y(beta): """Draw c.d.f for Moffat function according to Berge et al. Ufig paper, equation B2 cdf(Y) = 1-Y**(1-beta) :return: """ x = np.random.uniform(0, 1) return (1 - x) ** (1.0 / (1 - beta))
[docs] @export def project2d_random(r): """Draws a random projection from radius r in 2d and 1d. :param r: 3d radius :return: R, x, y """ size = len(np.atleast_1d(r)) if size == 1: size = None u1 = np.random.uniform(0, 1, size=size) u2 = np.random.uniform(0, 1, size=size) eta = np.arccos(2 * u1 - 1) - np.pi / 2 phi = 2 * np.pi * u2 x = r * np.cos(eta) * np.cos(phi) y = r * np.cos(eta) * np.sin(phi) # z = r * np.sin(l) R = np.sqrt(x**2 + y**2) return R, x, y
[docs] @export def draw_xy(R): """ :param R: projected radius :return: """ phi = np.random.uniform(0, 2 * np.pi) x = R * np.cos(phi) y = R * np.sin(phi) return x, y
[docs] @export def draw_hernquist(a): """ :param a: 0.551*r_eff :return: realisation of radius of Hernquist luminosity weighting in 3d """ P = np.random.uniform() # draws uniform between [0,1) r = ( a * np.sqrt(P) * (np.sqrt(P) + 1) / (1 - P) ) # solves analytically to r from P(r) return r