{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import os, sys\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import scipy.stats as stats\n", "import corner\n", "import lenstronomy.Util.param_util as param_util\n", "from baobab import bnn_priors\n", "from baobab.configs import BaobabConfig, tdlmc_cov_config, gamma_cov_config\n", "%matplotlib inline\n", "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Visualizing the input prior PDF in the CovBNNPrior and the resulting samples\n", "__Author:__ Ji Won Park\n", " \n", "__Created:__ 8/30/19\n", " \n", "__Last run:__ 9/05/19\n", "\n", "__Goals:__\n", "Plot the (marginal) distributions of the parameters sampled from the covariate BNN prior, in which parameters take a multivariate (log)normal distribution.\n", "\n", "__Before running this notebook:__\n", "Generate some data. At the root of the `baobab` repo, run:\n", "```\n", "generate baobab/configs/tdlmc_cov_config.py --n_data 1000\n", "```\n", "This generates 1000 samples using `CovBNNPrior` at the location this notebook expects." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# TODO add description" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cfg_path = tdlmc_cov_config.__file__\n", "#cfg_path = os.path.join('..', '..', 'time_delay_lens_modeling_challenge', 'data', 'baobab_configs', 'train_tdlmc_diagonal_config.py')\n", "cfg = BaobabConfig.from_file(cfg_path)\n", "#out_data_dir = os.path.join('..', '..', 'time_delay_lens_modeling_challenge', cfg.out_dir)\n", "out_data_dir = os.path.join('..', cfg.out_dir)\n", "print(out_data_dir)\n", "meta = pd.read_csv(os.path.join(out_data_dir, 'metadata.csv'), index_col=None)\n", "bnn_prior = getattr(bnn_priors, cfg.bnn_prior_class)(cfg.bnn_omega, cfg.components)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the parameters available. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sorted(meta.columns.values)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Add shear and ellipticity modulus and angle\n", "if 'external_shear_gamma_ext' in meta.columns.values:\n", " gamma_ext = meta['external_shear_gamma_ext'].values\n", " psi_ext = meta['external_shear_psi_ext'].values\n", " gamma1, gamma2 = param_util.phi_gamma_ellipticity(psi_ext, gamma_ext)\n", " meta['external_shear_gamma1'] = gamma1\n", " meta['external_shear_gamma2'] = gamma2\n", "else:\n", " gamma1 = meta['external_shear_gamma1'].values\n", " gamma2 = meta['external_shear_gamma2'].values\n", " psi_ext, gamma_ext = param_util.ellipticity2phi_gamma(gamma1, gamma2)\n", " meta['external_shear_gamma_ext'] = gamma_ext\n", " meta['external_shear_psi_ext'] = psi_ext\n", "for comp in cfg.components:\n", " if comp in ['lens_mass', 'src_light', 'lens_light']:\n", " if '{:s}_e1'.format(comp) in meta.columns.values:\n", " e1 = meta['{:s}_e1'.format(comp)].values\n", " e2 = meta['{:s}_e2'.format(comp)].values\n", " phi, q = param_util.ellipticity2phi_q(e1, e2)\n", " meta['{:s}_q'.format(comp)] = q\n", " meta['{:s}_phi'.format(comp)] = phi\n", " else:\n", " q = meta['{:s}_q'.format(comp)].values\n", " phi = meta['{:s}_phi'.format(comp)].values\n", " e1, e2 = param_util.phi_q2_ellipticity(phi, q)\n", " meta['{:s}_e1'.format(comp)] = e1\n", " meta['{:s}_e2'.format(comp)] = e2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Add source gal positional offset\n", "meta['src_pos_offset'] = np.sqrt(meta['src_light_center_x']**2.0 + meta['src_light_center_y']**2.0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def plot_prior_samples(eval_at, component, param, unit):\n", " param_key = '{:s}_{:s}'.format(component, param)\n", " if param_key == 'src_light_pos_offset_x':\n", " hyperparams = cfg.bnn_omega['src_light']['center_x']\n", " elif param_key == 'src_light_pos_offset_y':\n", " hyperparams = cfg.bnn_omega['src_light']['center_y']\n", " elif (param_key == 'src_light_center_x') or (param_key == 'src_light_center_y'):\n", " raise NotImplementedError(\"Use `plot_derived_quantities` instead.\")\n", " elif (component, param) in bnn_prior.params_to_exclude:\n", " raise NotImplementedError(\"This parameter wasn't sampled independently. Please use `plot_derived_quantities` instead.\")\n", " else:\n", " hyperparams = cfg.bnn_omega[component][param].copy()\n", " pdf_eval = bnn_prior.eval_param_pdf(eval_at, hyperparams)\n", " plt.plot(eval_at, pdf_eval, 'r-', lw=2, alpha=0.6, label='PDF')\n", " binning = np.linspace(eval_at[0], eval_at[-1], 50)\n", " plt.hist(meta[param_key], bins=binning, edgecolor='k', density=True, align='mid', label='sampled')\n", " print(hyperparams)\n", " plt.xlabel(\"{:s} ({:s})\".format(param_key, unit))\n", " plt.ylabel(\"density\")\n", " plt.legend()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def plot_derived_quantities(param_key, unit, binning=None):\n", " binning = 30 if binning is None else binning\n", " _ = plt.hist(meta[param_key], bins=binning, edgecolor='k', density=True, align='mid', label='sampled')\n", " plt.xlabel(\"{:s} ({:s})\".format(param_key, unit))\n", " plt.ylabel(\"density\")\n", " plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lens mass params" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(0.5, 1.5, 100), 'lens_mass', 'theta_E', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-0.04, 0.04, 100), 'lens_mass', 'center_x', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-0.04, 0.04, 100), 'lens_mass', 'center_y', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('lens_mass_gamma', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-1.0, 1.0, 100), 'lens_mass', 'e1', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-1.0, 1.0, 100), 'lens_mass', 'e2', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('lens_mass_q', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('lens_mass_phi', 'rad')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## External shear params" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(0, 1.0, 100), 'external_shear', 'gamma_ext', 'no unit')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-0.5*np.pi, 0.5*np.pi, 100), 'external_shear', 'psi_ext', 'rad')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('external_shear_gamma1', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('external_shear_gamma2', 'dimensionless')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lens light params" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('lens_light_magnitude', 'mag')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('lens_light_n_sersic', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(0.0, 2.0, 100), 'lens_light', 'R_sersic', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-1.0, 1.0, 100), 'lens_light', 'e1', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-1.0, 1.0, 100), 'lens_light', 'e2', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('lens_light_q', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('lens_light_phi', 'rad')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Source light params" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('src_light_magnitude', 'mag')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(0.0, 6.0, 100), 'src_light', 'n_sersic', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(0.0, 2.0, 100), 'src_light', 'R_sersic', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-1, 1, 100), 'src_light', 'pos_offset_x', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-1, 1, 100), 'src_light', 'pos_offset_y', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('src_light_center_x', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('src_light_center_y', 'arcsec')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-1.0, 1.0, 100), 'src_light', 'e1', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_prior_samples(np.linspace(-1.0, 1.0, 100), 'src_light', 'e2', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('src_light_q', 'dimensionless')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('src_light_phi', 'rad')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## AGN light params" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('agn_light_magnitude', 'mag')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Total magnification" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_derived_quantities('total_magnification', 'dimensionless', binning=np.linspace(0, 300, 30))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pairwise distributions" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def plot_pairwise_dist(df, cols, fig=None):\n", " n_params = len(cols)\n", " plot = corner.corner(meta[cols],\n", " color='tab:blue', \n", " smooth=1.0, \n", " labels=cols,\n", " show_titles=True,\n", " fill_contours=True,\n", " levels=[0.68, 0.95, 0.997],\n", " fig=fig,\n", " range=[0.99]*n_params,\n", " hist_kwargs=dict(density=True, ))\n", " return plot" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cols = ['src_pos_offset', 'total_magnification',\n", " 'external_shear_gamma_ext', 'external_shear_psi_ext',\n", " 'lens_mass_q', 'lens_mass_theta_E',\n", " 'src_light_q', ]\n", "_ = plot_pairwise_dist(meta, cols)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cols = ['lens_mass_gamma', 'lens_light_n_sersic' ]\n", "_ = plot_pairwise_dist(meta, cols)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python (baobab)", "language": "python", "name": "baobab" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 2 }