Source code for clmm.utils.ellipticity

"""General utility functions that are used in multiple modules"""
import numpy as np


[docs] def convert_shapes_to_epsilon(shape_1, shape_2, shape_definition="epsilon", kappa=0): r"""Convert shape components 1 and 2 appropriately to make them estimators of the reduced shear once averaged. The shape 1 and 2 components may correspond to ellipticities according the :math:`\epsilon`- or :math:`\chi`-definition, but also to the 1 and 2 components of the shear. See Bartelmann & Schneider 2001 for details (https://arxiv.org/pdf/astro-ph/9912508.pdf). The :math:`\epsilon`-ellipticity is a direct estimator of the reduced shear. The shear :math:`\gamma` may be converted to reduced shear :math:`g` if the convergence :math:`\kappa` is known. The conversions are given below. .. math:: \epsilon = \frac{\chi}{1+(1-|\chi|^2)^{1/2}} .. math:: g=\frac{\gamma}{1-\kappa} - If `shape_definition = 'chi'`, this function returns the corresponding `epsilon` ellipticities - If `shape_definition = 'shear'`, it returns the corresponding reduced shear, given the convergence `kappa` - If `shape_definition = 'epsilon'` or `'reduced_shear'`, it returns them as is as no conversion is needed. Parameters ---------- shape_1 : float, numpy.ndarray Input shapes or shears along principal axis (g1 or e1) shape_2 : float, numpy.ndarray Input shapes or shears along secondary axis (g2 or e2) shape_definition : str, optional Definition of the input shapes, can be ellipticities 'epsilon' or 'chi' or shears 'shear' or 'reduced_shear'. Defaut: 'epsilon' kappa : float, numpy.ndarray, optional Convergence for transforming to a reduced shear. Default is 0 Returns ------- epsilon_1 : float, numpy.ndarray Epsilon ellipticity (or reduced shear) along principal axis (epsilon1) epsilon_2 : float, numpy.ndarray Epsilon ellipticity (or reduced shear) along secondary axis (epsilon2) """ if shape_definition in ("epsilon", "reduced_shear"): epsilon_1, epsilon_2 = shape_1, shape_2 elif shape_definition == "chi": chi_to_eps_conversion = 1.0 / (1.0 + (1 - (shape_1**2 + shape_2**2)) ** 0.5) epsilon_1, epsilon_2 = ( shape_1 * chi_to_eps_conversion, shape_2 * chi_to_eps_conversion, ) elif shape_definition == "shear": epsilon_1, epsilon_2 = shape_1 / (1.0 - kappa), shape_2 / (1.0 - kappa) else: raise TypeError("Please choose epsilon, chi, shear, reduced_shear") return epsilon_1, epsilon_2
[docs] def build_ellipticities(q11, q22, q12): """Build ellipticties from second moments. See, e.g., Schneider et al. (2006) Parameters ---------- q11 : float, numpy.ndarray Second brightness moment tensor, component (1,1) q22 : float, numpy.ndarray Second brightness moment tensor, component (2,2) q12 : float, numpy.ndarray Second brightness moment tensor, component (1,2) Returns ------- chi1, chi2 : float, numpy.ndarray Ellipticities using the "chi definition" epsilon1, epsilon2 : float, numpy.ndarray Ellipticities using the "epsilon definition" """ norm_x, norm_e = q11 + q22, q11 + q22 + 2 * np.sqrt(q11 * q22 - q12 * q12) chi1, chi2 = (q11 - q22) / norm_x, 2 * q12 / norm_x epsilon1, epsilon2 = (q11 - q22) / norm_e, 2 * q12 / norm_e return chi1, chi2, epsilon1, epsilon2
[docs] def compute_lensed_ellipticity(ellipticity1_true, ellipticity2_true, shear1, shear2, convergence): r"""Compute lensed ellipticities from the intrinsic ellipticities, shear and convergence. Following Schneider et al. (2006) .. math:: \epsilon^{\text{lensed}}=\epsilon^{\text{lensed}}_1+i\epsilon^{\text{lensed}}_2= \frac{\epsilon^{\text{true}}+g}{1+g^\ast\epsilon^{\text{true}}}, where, the complex reduced shear :math:`g` is obtained from the shear :math:`\gamma=\gamma_1+i\gamma_2` and convergence :math:`\kappa` as :math:`g = \gamma/(1-\kappa)`, and the complex intrinsic ellipticity is :math:`\epsilon^{\text{ true}}=\epsilon^{\text{true}}_1+i\epsilon^{\text{true}}_2` Parameters ---------- ellipticity1_true : float, numpy.ndarray Intrinsic ellipticity of the sources along the principal axis ellipticity2_true : float, numpy.ndarray Intrinsic ellipticity of the sources along the second axis shear1 : float, numpy.ndarray Shear component (not reduced shear) along the principal axis at the source location shear2 : float, numpy.ndarray Shear component (not reduced shear) along the 45-degree axis at the source location convergence : float, numpy.ndarray Convergence at the source location Returns ------- e1, e2 : float, numpy.ndarray Lensed ellipicity along both reference axes. """ # shear (as a complex number) shear = shear1 + shear2 * 1j # intrinsic ellipticity (as a complex number) ellipticity_true = ellipticity1_true + ellipticity2_true * 1j # reduced shear reduced_shear = shear / (1.0 - convergence) # lensed ellipticity lensed_ellipticity = (ellipticity_true + reduced_shear) / ( 1.0 + reduced_shear.conjugate() * ellipticity_true ) return np.real(lensed_ellipticity), np.imag(lensed_ellipticity)