{ "cells": [ { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n" ] } ], "source": [ "# Copyright (C) 2024 Richard Stiskalek\n", "# This program is free software; you can redistribute it and/or modify it\n", "# under the terms of the GNU General Public License as published by the\n", "# Free Software Foundation; either version 3 of the License, or (at your\n", "# option) any later version.\n", "#\n", "# This program is distributed in the hope that it will be useful, but\n", "# WITHOUT ANY WARRANTY; without even the implied warranty of\n", "# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n", "# Public License for more details.\n", "#\n", "# You should have received a copy of the GNU General Public License along\n", "# with this program; if not, write to the Free Software Foundation, Inc.,\n", "# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n", "from os.path import exists\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from corner import corner\n", "from getdist import plots\n", "from astropy.coordinates import angular_separation\n", "import scienceplots\n", "from os.path import exists\n", "import seaborn as sns\n", "import matplotlib as mpl\n", "\n", "\n", "from reconstruction_comparison import *\n", "\n", "%load_ext autoreload\n", "%autoreload 2\n", "%matplotlib inline\n", "\n", "paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)\n", "fdir = \"/mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quick checks" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fname = paths.flow_validation(\n", " fdir, \"Carrick2015\", \"2MTF\", inference_method=\"mike\",\n", " sample_alpha=True, sample_beta=None,\n", " zcmb_max=0.05)\n", "\n", "\n", "get_gof(\"neg_lnZ_harmonic\", fname)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "catalogue = \"CF4_TFR_i\"\n", "simname = \"Carrick2015\"\n", "zcmb_max=0.05\n", "sample_beta = None\n", "sample_alpha = True\n", "\n", "fname_bayes = paths.flow_validation(\n", " fdir, simname, catalogue, inference_method=\"bayes\",\n", " sample_alpha=sample_alpha, sample_beta=sample_beta,\n", " zcmb_max=zcmb_max)\n", "\n", "fname_mike = paths.flow_validation(\n", " fdir, simname, catalogue, inference_method=\"mike\",\n", " sample_alpha=sample_alpha, sample_beta=sample_beta,\n", " zcmb_max=zcmb_max)\n", "\n", "\n", "X = []\n", "labels = [\"Full posterior\", \"Delta posterior\"]\n", "for i, fname in enumerate([fname_bayes, fname_mike]):\n", " samples = get_samples(fname)\n", " if i == 1:\n", " print(samples.keys())\n", "\n", " X.append(samples_to_getdist(samples, labels[i]))\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "params = [f\"a_{catalogue}\", f\"b_{catalogue}\", f\"c_{catalogue}\", f\"e_mu_{catalogue}\",\n", " \"Vmag\", \"l\", \"b\", \"sigma_v\", \"beta\", f\"alpha_{catalogue}\"]\n", "# params = [\"beta\", f\"a_{catalogue}\", f\"b_{catalogue}\", f\"e_mu_{catalogue}\"]\n", "# params = [\"Vmag\", \"l\", \"b\", \"sigma_v\", \"beta\", f\"mag_cal_{catalogue}\", f\"alpha_cal_{catalogue}\", f\"beta_cal_{catalogue}\", f\"e_mu_{catalogue}\"]\n", "\n", "\n", "g = plots.get_subplot_plotter()\n", "g.settings.figure_legend_frame = False\n", "g.settings.alpha_filled_add = 0.75\n", "\n", "g.triangle_plot(X, params=params, filled=True, legend_loc='upper right')\n", "plt.gcf().suptitle(catalogue_to_pretty(catalogue), y=1.025)\n", "plt.gcf().tight_layout()\n", "# plt.gcf().savefig(f\"../../plots/method_comparison_{simname}_{catalogue}.png\", dpi=500, bbox_inches='tight')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# catalogue = [\"LOSS\", \"Foundation\"]\n", "catalogue = \"CF4_TFR_i\"\n", "simname = \"IndranilVoid_exp\"\n", "zcmb_max = 0.05\n", "sample_alpha = False\n", "\n", "fname = paths.flow_validation(\n", " fdir, simname, catalogue, inference_method=\"mike\",\n", " sample_mag_dipole=True,\n", " sample_beta=False,\n", " sample_alpha=sample_alpha, zcmb_max=zcmb_max)\n", "\n", "\n", "samples = get_samples(fname, convert_Vext_to_galactic=True)\n", "\n", "samples, labels, keys = samples_for_corner(samples)\n", "fig = corner(samples, labels=labels, show_titles=True,\n", " title_kwargs={\"fontsize\": 12}, smooth=1)\n", "# fig.savefig(\"../../plots/test.png\", dpi=250)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Paper plots" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0. LOS velocity example" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fpath = \"/mnt/extraspace/rstiskalek/catalogs/PV/CF4/CF4_TF-distances.hdf5\"\n", "\n", "loader_carrick = csiborgtools.flow.DataLoader(\"Carrick2015\", [0], \"CF4_TFR_i\", fpath, paths, ksmooth=0, )\n", "loader_lilow = csiborgtools.flow.DataLoader(\"Lilow2024\", [0], \"CF4_TFR_i\", fpath, paths, ksmooth=0, )\n", "loader_cb2 = csiborgtools.flow.DataLoader(\"csiborg2_main\", [i for i in range(20)], \"CF4_TFR_i\", fpath, paths, ksmooth=0, )\n", "loader_cb2X = csiborgtools.flow.DataLoader(\"csiborg2X\", [i for i in range(20)], \"CF4_TFR_i\", fpath, paths, ksmooth=0, )\n", "loader_CF4 = csiborgtools.flow.DataLoader(\"CF4\", [i for i in range(20)], \"CF4_TFR_i\", fpath, paths, ksmooth=0, )\n", "loader_CLONES = csiborgtools.flow.DataLoader(\"CLONES\", [0], \"CF4_TFR_i\", fpath, paths, ksmooth=0, )\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "angdist = angular_separation(\n", " np.deg2rad(loader_carrick.cat[\"RA\"]), np.deg2rad(loader_carrick.cat[\"DEC\"]),\n", " np.deg2rad(csiborgtools.clusters[\"Virgo\"].spherical_pos[1]),\n", " np.deg2rad(csiborgtools.clusters[\"Virgo\"].spherical_pos[2]))\n", "k = np.argmin(angdist)\n", "print([loader_carrick.cat[\"RA\"][k], loader_carrick.cat[\"DEC\"][k]])\n", "print(csiborgtools.clusters[\"Virgo\"].spherical_pos[1:])\n", "print(csiborgtools.clusters[\"Virgo\"].spherical_pos[0])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "loaders = [loader_carrick, loader_lilow, loader_CF4, loader_cb2, loader_cb2X, loader_CLONES]\n", "simnames = [\"Carrick2015\", \"Lilow2024\", \"CF4\", \"csiborg2_main\", \"csiborg2X\", \"CLONES\"]\n", "\n", "\n", "with plt.style.context(\"science\"):\n", " plt.rcParams.update({'font.size': 9})\n", " plt.figure()\n", " cols = plt.rcParams['axes.prop_cycle'].by_key()['color']\n", "\n", " for i, (simname, loader) in enumerate(zip(simnames, loaders)):\n", " r = loader.rdist\n", " vrad = loader.los_radial_velocity[:, k, :]\n", "\n", " if simname == \"Carrick2015\":\n", " vrad *= 0.43\n", "\n", " if len(vrad) > 1:\n", " ylow, yhigh = np.percentile(vrad, [16, 84], axis=0)\n", " plt.fill_between(r, ylow, yhigh, alpha=0.66, color=cols[i],\n", " label=simname_to_pretty(simname))\n", " else:\n", " plt.plot(r, vrad[0], label=simname_to_pretty(simname), c=cols[i])\n", "\n", " plt.xlabel(r\"$r ~ [\\mathrm{Mpc} / h]$\")\n", " plt.ylabel(r\"$V_{\\rm rad} ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", "\n", " plt.xlim(0, 90)\n", " plt.ylim(-1000, 1000)\n", " plt.legend(ncols=2, fontsize=\"small\")\n", " plt.axvline(12.045, zorder=0, c=\"k\", ls=\"--\", alpha=0.75)\n", "\n", " plt.tight_layout()\n", " plt.savefig(\"../../plots/LOS_example.pdf\", dpi=450, bbox_inches='tight')\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Evidence comparison" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_LOSS_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:02:52\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_LOSS_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:17:56\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_LOSS_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:24:10\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_LOSS_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:41:00\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_LOSS_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:14:53\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_LOSS_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:52:52\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_LOSS_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:33:52\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_LOSS_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:03:00\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_LOSS_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:18:10\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_LOSS_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:25:22\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_LOSS_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:43:31\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_LOSS_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:17:10\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_LOSS_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:55:20\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_LOSS_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:36:10\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_Foundation_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:03:54\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_Foundation_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:18:31\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_Foundation_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:25:04\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_Foundation_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:46:23\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_Foundation_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:20:13\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_Foundation_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:58:23\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_Foundation_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:38:10\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_Foundation_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:04:09\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_Foundation_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:18:53\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_Foundation_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:25:46\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_Foundation_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:56:16\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_Foundation_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:23:54\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_Foundation_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:01:40\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_Foundation_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:40:28\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_2MTF_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:04:48\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_2MTF_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:18:55\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_2MTF_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:33:12\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_2MTF_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:58:05\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_2MTF_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:37:40\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_2MTF_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:12:23\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_2MTF_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:42:56\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_2MTF_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:05:03\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_2MTF_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:20:08\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_2MTF_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:34:48\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_2MTF_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:05:34\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_2MTF_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:40:34\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_2MTF_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:22:45\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_2MTF_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:45:29\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_SFI_gals_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:05:44\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_SFI_gals_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:20:10\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_SFI_gals_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:35:56\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_SFI_gals_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:07:34\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_SFI_gals_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:44:34\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_SFI_gals_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:27:38\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_SFI_gals_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:48:03\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_SFI_gals_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:06:41\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_SFI_gals_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:21:13\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_SFI_gals_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:38:16\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_SFI_gals_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:11:53\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_SFI_gals_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:50:18\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_SFI_gals_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:31:36\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_SFI_gals_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:50:51\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_CF4_TFR_i_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:07:54\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_CF4_TFR_i_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:22:46\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_CF4_TFR_i_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:50:31\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_CF4_TFR_i_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:26:06\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_CF4_TFR_i_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:20:55\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_CF4_TFR_i_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:59:34\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_CF4_TFR_i_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:52:35\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_CF4_TFR_i_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:09:23\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_CF4_TFR_i_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:23:08\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_CF4_TFR_i_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:09:25\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_CF4_TFR_i_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:41:38\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_CF4_TFR_i_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:20:52\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_CF4_TFR_i_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:58:36\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_CF4_TFR_i_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:55:16\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_CF4_TFR_w1_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:07:53\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_CF4_TFR_w1_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:22:52\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_CF4_TFR_w1_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:54:34\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_CF4_TFR_w1_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:27:36\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_CF4_TFR_w1_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:12:48\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_CF4_TFR_w1_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:48:05\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_CF4_TFR_w1_mike_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:53:55\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Carrick2015_CF4_TFR_w1_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:08:41\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_Lilow2024_CF4_TFR_w1_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:23:09\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2_main_CF4_TFR_w1_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 11:58:58\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_csiborg2X_CF4_TFR_w1_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 12:30:30\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_manticore_2MPP_N128_DES_V1_CF4_TFR_w1_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:17:33\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CF4_CF4_TFR_w1_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:50:41\n", "File: /mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/samples_CLONES_CF4_TFR_w1_mike_smooth_1_zcmb_max_0.05_sample_alpha.hdf5\n", "Last modified: 26/09/2024 13:55:53\n" ] } ], "source": [ "zcmb_max = 0.05\n", "\n", "sims = [\"Carrick2015\", \"Lilow2024\", \"csiborg2_main\", \"csiborg2X\", \"manticore_2MPP_N128_DES_V1\", \"CF4\", \"CLONES\"]\n", "catalogues = [\"LOSS\", \"Foundation\", \"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "\n", "y_BIC = np.full((len(catalogues), 2, len(sims)), np.nan)\n", "y_lnZ = np.full_like(y_BIC, np.nan)\n", "\n", "for i, catalogue in enumerate(catalogues):\n", " for j in [0, 1]:\n", " for k, simname in enumerate(sims):\n", " fname = paths.flow_validation(\n", " fdir, simname, catalogue, inference_method=\"mike\",\n", " sample_alpha=simname != \"IndranilVoid_exp\",\n", " zcmb_max=zcmb_max, smooth=j)\n", "\n", " # y_BIC[i, j] = get_gof(\"BIC\", fname)z\n", " y_lnZ[i, j, k] = - get_gof(\"neg_lnZ_harmonic\", fname) / np.log(10)\n", "\n", " y_lnZ[i, j] -= y_lnZ[i, j].min()" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cmap = mpl.colormaps.get_cmap(\"coolwarm\")\n", "\n", "def make_colours(y, n, k):\n", " sorted_indices = np.argsort(y[n, k])[::-1] # Sort in descending order\n", " # Initialize colors to gray\n", " colors = ['olivedrab'] * len(y[n, k])\n", "\n", " # Assign specific colors to top 3 values\n", " if len(sorted_indices) >= 1:\n", " colors[sorted_indices[0]] = '#FFD700' # Highest value gets gold\n", " if len(sorted_indices) >= 2:\n", " colors[sorted_indices[1]] = '#C0C0C0' # Second highest gets silver\n", " if len(sorted_indices) >= 3:\n", " colors[sorted_indices[2]] = \"#CD7F32\" # Third highest gets bronze\n", " return colors\n", "\n", "def plot_bars_with_varying_width(ax, x, y, colors, bar_width, reduced_width, reduced_alpha):\n", " sorted_indices = np.argsort(y)[::-1]\n", " \n", " for i, height in enumerate(y):\n", " if i in sorted_indices[:3]: # Top 3 bars\n", " ax.bar(x[i], height, color=colors[i], width=bar_width)\n", " else: # Non-top 3 bars\n", " ax.bar(x[i], height, color=colors[i], width=reduced_width, alpha=reduced_alpha)\n", "\n", "\n", "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", " figwidth = 8.3\n", " fig, axs = plt.subplots(2, 3, figsize=(figwidth, 0.55 * figwidth))\n", " fig.subplots_adjust(hspace=0, wspace=0)\n", "\n", " x = np.arange(len(sims))\n", " y = y_lnZ\n", " bar_width = 0.6 # Adjust the width of the bars if necessary\n", "\n", " for n in range(len(catalogues)):\n", " i, j = n // 3, n % 3\n", " ax = axs[i, j]\n", "\n", " ax.text(0.025, 1.075, catalogue_to_pretty(catalogues[n]), # Moved slightly higher to 1.05\n", " transform=ax.transAxes,\n", " verticalalignment='center', horizontalalignment='left',\n", " bbox=dict(facecolor='white', alpha=0.85, edgecolor='none', pad=3), # Add padding to the box\n", " zorder=5 # Ensure the text is drawn on top of other elements\n", " )\n", " # norm = mpl.colors.Normalize(vmin=np.min(y[n, 0]), vmax=np.max(y[n, 0]))\n", " # colors = [mpl.colors.to_hex(cmap(norm(v))) for v in y[n, 0]] # Convert colors to hex for the palette\n", " colors = make_colours(y, n, 0)\n", " plot_bars_with_varying_width(ax, x, y[n, 0], colors, bar_width, 0.75 * bar_width, 0.6)\n", "\n", " # Right y-axis seaborn scatter plot\n", " colors = make_colours(y, n, 1)\n", " ax_right = ax.twinx() # Create a twin y-axis\n", " ax_right.scatter(x, y[n, 1], c=colors, s=50, zorder=1, edgecolors=\"k\")\n", "\n", " if i in [0, 1] and j == 2:\n", " ax_right.set_ylabel(r\"$\\Delta \\log_{10} \\mathcal{Z} ~ (\\mathrm{smoothed})$\")\n", " ax_right.tick_params(axis='y', which='minor', length=0)\n", "\n", "\n", " for i in range(3):\n", " axs[1, i].set_xticks(\n", " np.arange(len(sims)),\n", " [simname_to_pretty(sim) for sim in sims], rotation=66,)\n", " axs[0, i].set_xticks([], [])\n", "\n", " for i in range(2):\n", " for j in range(3):\n", " axs[i, j].set_xlim(-0.75, len(sims) - 0.25)\n", "\n", " axs[i, j].tick_params(axis='x', which='major', top=False)\n", " axs[i, j].tick_params(axis='x', which='minor', top=False, length=0)\n", " axs[i, j].tick_params(axis='y', which='minor', length=0)\n", "\n", " axs[i, 0].set_ylabel(r\"$\\Delta \\log_{10} \\mathcal{Z}$\")\n", "\n", " fig.tight_layout()\n", " fig.savefig(f\"../../plots/lnZ_comparison.pdf\", dpi=500, bbox_inches='tight')\n", " fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Dependence of the evidence on smoothing scale" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "zcmb_max = 0.05\n", "\n", "ksmooth = [0, 1, 2, 3, 4]\n", "scales = [0, 2, 4, 6, 8]\n", "sims = [\"Carrick2015\", \"csiborg2_main\"]\n", "catalogues = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_i\"]\n", "\n", "y = np.full((len(sims), len(catalogues), len(ksmooth)), np.nan)\n", "for i, simname in enumerate(sims):\n", " for j, catalogue in enumerate(catalogues):\n", " for n, k in enumerate(ksmooth):\n", " fname = paths.flow_validation(\n", " fdir, simname, catalogue, inference_method=\"mike\",\n", " sample_alpha=True, smooth=k,\n", " zcmb_max=zcmb_max)\n", " if not exists(fname):\n", " raise FileNotFoundError(fname)\n", "\n", " y[i, j, n] = get_gof(\"neg_lnZ_harmonic\", fname)\n", "\n", " y[i, j, :] -= y[i, j, :].min()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for i, simname in enumerate(sims):\n", " for j, catalogue in enumerate(catalogues):\n", " print(simname, catalogue, y[i, j, -1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", " cols = plt.rcParams['axes.prop_cycle'].by_key()['color']\n", " plt.figure()\n", "\n", " ls = [\"-\", \"--\", \"-.\", \":\"]\n", " for i, simname in enumerate(sims):\n", " for j, catalogue in enumerate(catalogues):\n", " plt.plot(scales, y[i, j], marker='o', ms=2.5, ls=ls[i],\n", " label=catalogue_to_pretty(catalogue) if i == 0 else None, c=cols[j],)\n", "\n", " plt.xlabel(r\"$R_{\\rm smooth} ~ [\\mathrm{Mpc} / h]$\")\n", " plt.ylabel(r\"$-\\Delta \\ln \\mathcal{Z}$\")\n", " plt.xlim(0)\n", " plt.ylim(0)\n", " plt.legend()\n", "\n", " plt.tight_layout()\n", " plt.savefig(\"../../plots/smoothing_comparison.pdf\", dpi=450)\n", " plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. External flow consistency" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sims = [\"Carrick2015\", \"Lilow2024\", \"csiborg2_main\", \"csiborg2X\", \"CF4\", \"CLONES\"]\n", "# sims = [\"Carrick2015\", \"Lilow2024\", \"CF4\", \"csiborg2_main\", \"csiborg2X\"]\n", "# cats = [[\"LOSS\", \"Foundation\"], \"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "cats = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "# cats = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_not2MTForSFI_i\"]\n", "\n", "X = {}\n", "\n", "for sim in sims:\n", " for cat in cats:\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"bayes\",\n", " sample_alpha=True, zcmb_max=0.05)\n", "\n", " if not exists(fname):\n", " raise FileNotFoundError(fname)\n", "\n", " with File(fname, 'r') as f:\n", " X[f\"{sim}_{cat}\"] = np.linalg.norm(f[f\"samples/Vext\"][...], axis=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fname = paths.flow_validation(\n", " fdir, \"CF4\", \"CF4_TFR_i\", inference_method=\"bayes\",\n", " sample_alpha=True, zcmb_max=0.05)\n", "\n", "with File(fname, 'r') as f:\n", " x = f[\"samples/Vext\"][...]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", "\n", "\n", " fig, axs = plt.subplots(2, 2, figsize=(3.5, 2.65 * 1.25))\n", " fig.subplots_adjust(hspace=0, wspace=0)\n", "\n", " for k, cat in enumerate(cats):\n", " i, j = k // 2, k % 2\n", " ax = axs[i, j]\n", "\n", " for sim in sims:\n", " sns.kdeplot(X[f\"{sim}_{cat}\"], fill=True, bw_adjust=0.75, ax=ax,\n", " label=simname_to_pretty(sim) if i == 0 else None)\n", "\n", " ax.text(0.725, 0.85, catalogue_to_pretty(cat),\n", " transform=ax.transAxes, fontsize=\"small\",\n", " verticalalignment='center', horizontalalignment='center',\n", " bbox=dict(facecolor='white', alpha=0.5, edgecolor='none'))\n", "\n", " ax.set_ylabel(None)\n", " ax.set_yticklabels([])\n", " ax.set_xlim(0)\n", "\n", " handles, labels = axs[0, 0].get_legend_handles_labels()\n", " fig.legend(handles, labels, loc='upper center', bbox_to_anchor=(0.5, 1.1),\n", " ncol=3)\n", "\n", " for i in range(2):\n", " axs[-1, i].set_xlabel(r\"$|\\mathbf{V}_{\\rm ext}| ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", " axs[i, 0].set_ylabel(\"Normalised PDF\")\n", "\n", " fig.tight_layout()\n", " fig.savefig(f\"../../plots/Vext_comparison.pdf\", dpi=450)\n", " fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. What $\\beta$ is preferred by the data? " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sims = [\"Lilow2024\", \"csiborg2_main\", \"csiborg2X\", \"CF4\", \"CLONES\"]\n", "cats = [\"LOSS\", \"Foundation\", \"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "# cats = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_not2MTForSFI_i\"]\n", "\n", "X = {}\n", "for sim in sims:\n", " for cat in cats:\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"bayes\",\n", " sample_alpha=True, zcmb_max=0.05, sample_beta=True)\n", "\n", " if not exists(fname):\n", " raise FileNotFoundError(fname)\n", "\n", " with File(fname, 'r') as f:\n", " X[f\"{sim}_{cat}\"] = f[f\"samples/beta\"][...]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", "\n", "\n", " fig, axs = plt.subplots(3, 2, figsize=(3.5, 2.65 * 1.8))\n", " fig.subplots_adjust(hspace=0, wspace=0)\n", "\n", " for k, cat in enumerate(cats):\n", " i, j = k // 2, k % 2\n", " ax = axs[i, j]\n", "\n", " for sim in sims:\n", " sns.kdeplot(X[f\"{sim}_{cat}\"], fill=True, bw_adjust=0.75, ax=ax,\n", " label=simname_to_pretty(sim) if i == 0 else None)\n", "\n", " ax.text(0.1, 0.85, catalogue_to_pretty(cat),\n", " transform=ax.transAxes, fontsize=\"small\",\n", " verticalalignment='center', horizontalalignment='left',\n", " bbox=dict(facecolor='white', alpha=0.5, edgecolor='k')\n", " )\n", "\n", " ax.axvline(1, c=\"k\", ls=\"--\", alpha=0.75)\n", " ax.set_ylabel(None)\n", " ax.set_yticklabels([])\n", "\n", " handles, labels = axs[0, 0].get_legend_handles_labels()\n", " fig.legend(handles, labels, loc='upper center', bbox_to_anchor=(0.5, 1.075),\n", " ncol=3)\n", "\n", " # for i in range(3):\n", " for j in range(2):\n", " axs[-1, j].set_xlabel(r\"$\\beta$\")\n", "\n", " for i in range(3):\n", " axs[i, 0].set_ylabel(\"Normalised PDF\")\n", "\n", " fig.tight_layout()\n", " fig.savefig(f\"../../plots/beta_comparison.pdf\", dpi=450)\n", " fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### What $\\sigma_v$ is preferred by the data?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sims = [\"Carrick2015\", \"Lilow2024\", \"csiborg2_main\", \"csiborg2X\", \"CF4\", \"CLONES\"]\n", "cats = [\"LOSS\", \"Foundation\", \"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "# cats = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_not2MTForSFI_i\"]\n", "\n", "X = {}\n", "for sim in sims:\n", " for cat in cats:\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"bayes\",\n", " sample_alpha=True, zcmb_max=0.05)\n", "\n", " if not exists(fname):\n", " raise FileNotFoundError(fname)\n", "\n", " with File(fname, 'r') as f:\n", " X[f\"{sim}_{cat}\"] = f[f\"samples/sigma_v\"][...]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", "\n", "\n", " fig, axs = plt.subplots(3, 2, figsize=(3.5, 2.65 * 1.8))\n", " fig.subplots_adjust(hspace=0, wspace=0)\n", "\n", " for k, cat in enumerate(cats):\n", " i, j = k // 2, k % 2\n", " ax = axs[i, j]\n", "\n", " for sim in sims:\n", " sns.kdeplot(X[f\"{sim}_{cat}\"], fill=True, bw_adjust=0.75, ax=ax,\n", " label=simname_to_pretty(sim) if i == 0 else None)\n", "\n", " ax.text(0.9, 0.85, catalogue_to_pretty(cat),\n", " transform=ax.transAxes, fontsize=\"small\",\n", " verticalalignment='center', horizontalalignment='right',\n", " # bbox=dict(facecolor='white', alpha=0.5, edgecolor='k')\n", " )\n", "\n", " ax.set_ylabel(None)\n", " ax.set_yticklabels([])\n", "\n", " xmin = ax.get_xlim()[0]\n", " if xmin < 0:\n", " ax.set_xlim(0)\n", "\n", " handles, labels = axs[0, 0].get_legend_handles_labels()\n", " fig.legend(handles, labels, loc='upper center', bbox_to_anchor=(0.5, 1.075),\n", " ncol=3)\n", "\n", " # for i in range(3):\n", " for j in range(2):\n", " axs[-1, j].set_xlabel(r\"$\\sigma_v ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", "\n", " for i in range(3):\n", " axs[i, 0].set_ylabel(\"Normalised PDF\")\n", "\n", " fig.tight_layout()\n", " fig.savefig(f\"../../plots/sigmav_comparison.pdf\", dpi=450)\n", " fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. Bulk flow in the simulation rest frame " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sims = [\"Carrick2015\", \"Lilow2024\", \"csiborg2_main\", \"csiborg2X\", \"manticore_2MPP_N128_DES_V1\", \"CLONES\", \"CF4\"]\n", "\n", "\n", "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", " cols = plt.rcParams['axes.prop_cycle'].by_key()['color']\n", "\n", " plt.figure()\n", " for i, sim in enumerate(sims):\n", " r, B = get_bulkflow_simulation(sim, convert_to_galactic=True)\n", " B = B[..., 0]\n", "\n", " if sim == \"Carrick2015\":\n", " B *= 0.43\n", "\n", " if sim in [\"Carrick2015\", \"Lilow2024\", \"CLONES\"]:\n", " plt.plot(r, B[0], label=simname_to_pretty(sim), color=cols[i])\n", " else:\n", " ylow, yhigh = np.percentile(B, [16, 84], axis=0)\n", " plt.fill_between(r, ylow, yhigh, alpha=0.5,\n", " label=simname_to_pretty(sim), color=cols[i])\n", "\n", " plt.xlabel(r\"$R ~ [\\mathrm{Mpc} / h]$\")\n", " plt.ylabel(r\"$|\\mathbf{B}_{\\rm sim}| ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", " plt.xlim(5, 200)\n", " plt.legend(ncols=2)\n", "\n", " plt.tight_layout()\n", " plt.savefig(\"../../plots/bulkflow_simulations_restframe.pdf\", dpi=450)\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6. Bulk flow in the CMB frame" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sims = [\"Carrick2015\", \"Lilow2024\", \"csiborg2_main\", \"csiborg2X\", \"CLONES\", \"CF4\"]\n", "# cats = [[\"LOSS\", \"Foundation\"], \"2MTF\", \"SFI_gals\", \"CF4_TFR_i\"]\n", "cats = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "\n", "\n", "data = {}\n", "for sim in sims:\n", " for cat in cats:\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"bayes\",\n", " sample_alpha=True, zcmb_max=0.05)\n", " data[f\"{sim}_{cat}\"] = get_bulkflow(fname, sim)\n", "\n", "def get_ax_centre(ax):\n", " # Get the bounding box of the specific axis in relative figure coordinates\n", " bbox = ax.get_position()\n", "\n", " # Extract the position and size of the axis\n", " x0, y0, width, height = bbox.x0, bbox.y0, bbox.width, bbox.height\n", "\n", " # Calculate the center of the axis\n", " center_x = x0 + width / 2\n", " center_y = y0 + height / 2\n", " return center_x, center_y" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", " nrows = len(sims)\n", " ncols = 3\n", "\n", " figwidth = 8.3\n", " fig, axs = plt.subplots(nrows, ncols, figsize=(figwidth, 1.15 * figwidth), sharex=True, )\n", " fig.subplots_adjust(hspace=0, wspace=0)\n", " cols = plt.rcParams['axes.prop_cycle'].by_key()['color']\n", " # fig.suptitle(f\"Calibrated against {catalogue}\")\n", "\n", " for i, sim in enumerate(sims):\n", " for j, catalogue in enumerate(cats):\n", " r, B = data[f\"{sim}_{catalogue}\"]\n", " c = cols[j]\n", " for n in range(3):\n", " ylow, ymed, yhigh = np.percentile(B[..., n], [16, 50, 84], axis=-1)\n", " axs[i, n].fill_between(\n", " r, ylow, yhigh, alpha=0.5, color=c, edgecolor=c,\n", " label=catalogue_to_pretty(catalogue) if i == 1 else None)\n", "\n", "\n", " # CMB-LG velocity\n", " kwargs = {\"color\": \"mediumblue\", \"alpha\": 0.5, \"zorder\": 10}\n", " for n in range(len(sims)):\n", " axs[n, 0].fill_between([r.min(), 15.], [627 - 22, 627 - 22], [627 + 22, 627 + 22], label=\"CMB-LG\" if n == 0 else None, **kwargs)\n", " axs[n, 1].fill_between([r.min(), 15.], [276 - 3, 276 - 3], [276 + 3, 276 + 3], **kwargs)\n", " axs[n, 2].fill_between([r.min(), 15.], [30 - 3, 30 - 3], [30 + 3, 30 + 3], **kwargs)\n", "\n", " # LCDM expectation\n", " Rs,mean,std,mode,p05,p16,p84,p95 = np.load(\"/mnt/users/rstiskalek/csiborgtools/data/BulkFlowPlot.npy\")\n", " m = Rs < 175\n", " kwargs = {\"color\": \"black\", \"zorder\": 0, \"alpha\": 0.25}\n", " for n in range(len(sims)):\n", " axs[n, 0].fill_between(\n", " Rs[m], p16[m], p84[m],\n", " label=r\"$\\Lambda\\mathrm{CDM}$\" if n == 0 else None, **kwargs)\n", "\n", " for n in range(3):\n", " axs[-1, n].set_xlabel(r\"$R ~ [\\mathrm{Mpc} / h]$\")\n", "\n", " for n in range(len(sims)):\n", " axs[n, 0].set_ylabel(r\"$|\\mathbf{B}| ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", " axs[n, 1].set_ylabel(r\"$\\ell ~ [\\mathrm{deg}]$\")\n", " axs[n, 2].set_ylabel(r\"$b ~ [\\mathrm{deg}]$\")\n", "\n", " for i, sim in enumerate(sims):\n", " ax = axs[i, -1].twinx()\n", " ax.set_ylabel(simname_to_pretty(sim), rotation=270, labelpad=7.5)\n", " ax.set_yticklabels([])\n", "\n", " # Watkins numbers\n", " # for n in range(len(sims)):\n", " # rx = 150\n", "\n", " axs[0, 0].set_xlim(r.min(), r.max())\n", "\n", " axs[0, 0].legend()\n", " handles, labels = axs[1, 0].get_legend_handles_labels() # get the labels from the first axis\n", " fig.legend(handles, labels, loc='upper center', bbox_to_anchor=(0.5, 0.975), ncol=len(cats) + 2)\n", "\n", " fig.tight_layout(rect=[0, 0, 0.95, 0.95], h_pad=0.01)\n", " fig.savefig(f\"../../plots/bulkflow_CMB.pdf\", dpi=450)\n", " fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8. Full vs Delta comparison" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "catalogue = \"CF4_TFR_i\"\n", "simname = \"csiborg2X\"\n", "zcmb_max=0.05\n", "sample_beta = True\n", "sample_alpha = True\n", "\n", "fname_bayes = paths.flow_validation(\n", " fdir, simname, catalogue, inference_method=\"bayes\",\n", " sample_alpha=sample_alpha, sample_beta=sample_beta,\n", " zcmb_max=zcmb_max)\n", "\n", "fname_mike = paths.flow_validation(\n", " fdir, simname, catalogue, inference_method=\"mike\",\n", " sample_alpha=sample_alpha, sample_beta=sample_beta,\n", " zcmb_max=zcmb_max)\n", "\n", "\n", "X = []\n", "labels = [\"Full posterior\", \"Delta posterior\"]\n", "for i, fname in enumerate([fname_bayes, fname_mike]):\n", " samples = get_samples(fname)\n", " if i == 1:\n", " print(samples.keys())\n", "\n", " X.append(samples_to_getdist(samples, labels[i]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "params = [f\"a_{catalogue}\", f\"b_{catalogue}\", f\"c_{catalogue}\", f\"e_mu_{catalogue}\",\n", " \"Vmag\", \"l\", \"b\", \"sigma_v\", \"beta\", f\"alpha_{catalogue}\"]\n", "# params = [\"beta\", f\"a_{catalogue}\", f\"b_{catalogue}\", f\"e_mu_{catalogue}\"]\n", "# params = [\"Vmag\", \"l\", \"b\", \"sigma_v\", \"beta\", f\"mag_cal_{catalogue}\", f\"alpha_cal_{catalogue}\", f\"beta_cal_{catalogue}\", f\"e_mu_{catalogue}\"]\n", "\n", "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 11})\n", " g = plots.get_subplot_plotter()\n", " g.settings.figure_legend_frame = False\n", " g.settings.alpha_filled_add = 0.75\n", " g.settings.fontsize = 12\n", "\n", " g.triangle_plot(X, params=params, filled=True, legend_loc='upper right')\n", " # plt.gcf().suptitle(catalogue_to_pretty(catalogue), y=1.025)\n", " plt.gcf().tight_layout()\n", " plt.gcf().savefig(f\"../../plots/method_comparison_{simname}_{catalogue}.pdf\", dpi=300, bbox_inches='tight')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Guilhem plots" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Manticore vs linear comparison" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "zcmb_max = 0.05\n", "\n", "sims = [\"Carrick2015\", \"csiborg2X\"]\n", "catalogues = [\"LOSS\", \"Foundation\", \"2MTF\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "\n", "y_lnZ = np.full((len(catalogues), len(sims)), np.nan)\n", "\n", "for i, catalogue in enumerate(catalogues):\n", " for j, simname in enumerate(sims):\n", " fname = paths.flow_validation(\n", " fdir, simname, catalogue, inference_method=\"mike\",\n", " sample_alpha=simname != \"IndranilVoid_exp\",\n", " zcmb_max=zcmb_max)\n", "\n", " y_lnZ[i, j] = - get_gof(\"neg_lnZ_harmonic\", fname)\n", "\n", " # y_lnZ[i] -= y_lnZ[i].min()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "bayes_factor = y_lnZ[:, 1] - y_lnZ[:, 0]\n", "\n", "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", "\n", " plt.figure()\n", "\n", " sns.barplot(x=np.arange(len(catalogues)), y=bayes_factor / np.log(10), color=\"#21456D\")\n", " plt.xticks(\n", " np.arange(len(catalogues)),\n", " [catalogue_to_pretty(cat) for cat in catalogues],\n", " rotation=35, fontsize=\"small\", minor=False)\n", " plt.ylabel(r\"$\\log \\left(\\mathcal{Z}_{\\rm Manticore} / \\mathcal{Z}_{\\rm linear}\\right)$\")\n", " plt.tick_params(axis='x', which='both', bottom=False, top=False)\n", "\n", " plt.tight_layout()\n", " plt.savefig(\"../../plots/manticore_vs_carrick.png\", dpi=450)\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## All possible things" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dipole magnitude" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cats = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "sim = \"IndranilVoid_gauss\"\n", "\n", "X = []\n", "for cat in cats:\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"mike\",\n", " sample_mag_dipole=False,\n", " sample_alpha=False, zcmb_max=0.05)\n", " \n", " if not exists(fname):\n", " raise FileNotFoundError(fname)\n", "\n", " samples = get_samples(fname, convert_Vext_to_galactic=False)\n", "\n", " # keys = list(samples.keys())\n", " # for key in keys:\n", " # if cat in key:\n", " # value = samples.pop(key)\n", " # samples[key.replace(f\"_{cat}\",'')] = value\n", " \n", " samples = samples_to_getdist(samples, catalogue_to_pretty(cat))\n", " X.append(samples)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# params = [\"Vmag\", \"l\", \"b\", \"a_dipole_mag\", \"a_dipole_l\", \"a_dipole_b\"]\n", "params = [\"Vx\", \"Vy\", \"Vz\"]\n", "# params = [\"Vmag\", \"l\", \"b\"]\n", "\n", "with plt.style.context('science'):\n", " g = plots.get_subplot_plotter()\n", " g.settings.figure_legend_frame = False\n", " g.settings.alpha_filled_add = 0.75\n", "\n", " g.triangle_plot(X, params=params, filled=True, legend_loc='upper right')\n", " # plt.gcf().suptitle(catalogue_to_pretty(cat), y=1.025)\n", " plt.gcf().tight_layout()\n", " plt.gcf().savefig(f\"../../plots/vext_{sim}.png\", dpi=500, bbox_inches='tight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Flow | catalogue" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "catalogues = [\"LOSS\", \"Foundation\", \"Pantheon+\", \"2MTF\", \"SFI_gals\"]\n", "sims = [\"Carrick2015\", \"csiborg2_main\", \"csiborg2X\"]\n", "params = [\"Vmag\", \"beta\", \"sigma_v\"]\n", "\n", "for catalogue in catalogues:\n", " X = [samples_to_getdist(get_samples(sim, catalogue), sim)\n", " for sim in sims]\n", "\n", " g = plots.get_subplot_plotter()\n", " g.settings.figure_legend_frame = False\n", " g.settings.alpha_filled_add = 0.75\n", "\n", " g.triangle_plot(X, params=params, filled=True, legend_loc='upper right')\n", " plt.gcf().suptitle(f'{catalogue}', y=1.025)\n", " plt.gcf().tight_layout()\n", " plt.gcf().savefig(f\"../../plots/calibration_{catalogue}.png\", dpi=500, bbox_inches='tight')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Flow | simulation" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "catalogues = [\"Pantheon+\", \"2MTF\", \"SFI_gals\"]\n", "sims = [\"Carrick2015\", \"csiborg2_main\", \"csiborg2X\"]\n", "params = [\"Vmag\", \"l\", \"b\", \"beta\", \"sigma_v\"]\n", "\n", "for sim in sims:\n", " X = [samples_to_getdist(get_samples(sim, catalogue), sim, catalogue)\n", " for catalogue in catalogues]\n", "\n", " g = plots.get_subplot_plotter()\n", " g.settings.figure_legend_frame = False\n", " g.settings.alpha_filled_add = 0.75\n", "\n", " g.triangle_plot(X, params=params, filled=True, legend_loc='upper right')\n", " plt.gcf().suptitle(f'{sim}', y=1.025)\n", " plt.gcf().tight_layout()\n", " plt.gcf().savefig(f\"../../plots/calibration_{sim}.png\", dpi=500, bbox_inches='tight')\n", " plt.gcf().show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Stacking vs marginalising CB boxes\n", "\n", "#### $V_{\\rm ext}$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sim = \"csiborg2X\"\n", "catalogue = \"2MTF\"\n", "key = \"Vext\"\n", "\n", "X = [get_samples(sim, catalogue, nsim=nsim, convert_Vext_to_galactic=False)[key] for nsim in range(20)]\n", "Xmarg = get_samples(sim, catalogue, convert_Vext_to_galactic=False)[key]\n", "\n", "\n", "fig, axs = plt.subplots(1, 3, figsize=(15, 5), sharey=True)\n", "fig.suptitle(f\"{simname_to_pretty(sim)}, {catalogue}\")\n", "fig.subplots_adjust(wspace=0.0, hspace=0)\n", "\n", "for i in range(3):\n", " for n in range(20):\n", " axs[i].hist(X[n][:, i], bins=\"auto\", alpha=0.25, histtype='step',\n", " color='black', linewidth=0.5, density=1, zorder=0,\n", " label=\"Individual box\" if (n == 0 and i == 0) else None)\n", "\n", "axs[i].hist(np.hstack([X[n][:, i] for n in range(20)]), bins=\"auto\",\n", " histtype='step', color='blue', density=1,\n", " label=\"Stacked individual boxes\" if i == 0 else None)\n", "axs[i].hist(Xmarg[:, i], bins=\"auto\", histtype='step', color='red',\n", " density=1, label=\"Marginalised boxes\" if i == 0 else None)\n", " \n", "axs[0].legend(fontsize=\"small\", loc='upper left', frameon=False)\n", "\n", "axs[0].set_xlabel(r\"$V_{\\mathrm{ext}, x} ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", "axs[1].set_xlabel(r\"$V_{\\mathrm{ext}, y} ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", "axs[2].set_xlabel(r\"$V_{\\mathrm{ext}, z} ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", "axs[0].set_ylabel(\"Normalized PDF\")\n", "fig.tight_layout()\n", "fig.savefig(f\"../../plots/consistency_{sim}_{catalogue}_{key}.png\", dpi=450)\n", "fig.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### $\\beta$ and others" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sim = \"csiborg2_main\"\n", "catalogue = \"Pantheon+\"\n", "key = \"alpha\"\n", "\n", "X = [get_samples(sim, catalogue, nsim=nsim, convert_Vext_to_galactic=False)[key] for nsim in range(20)]\n", "Xmarg = get_samples(sim, catalogue, convert_Vext_to_galactic=False)[key]\n", "\n", "\n", "plt.figure()\n", "plt.title(f\"{simname_to_pretty(sim)}, {catalogue}\")\n", "for n in range(20):\n", " plt.hist(X[n], bins=\"auto\", alpha=0.25, histtype='step',\n", " color='black', linewidth=0.5, density=1, zorder=0,\n", " label=\"Individual box\" if n == 0 else None)\n", "\n", "plt.hist(np.hstack([X[n] for n in range(20)]), bins=\"auto\",\n", " histtype='step', color='blue', density=1,\n", " label=\"Stacked individual boxes\")\n", "plt.hist(Xmarg, bins=\"auto\", histtype='step', color='red',\n", " density=1, label=\"Marginalised boxes\")\n", "\n", "plt.legend(fontsize=\"small\", frameon=False, loc='upper left', ncols=3)\n", "plt.xlabel(names_to_latex([key], True)[0])\n", "plt.ylabel(\"Normalized PDF\")\n", "\n", "plt.tight_layout()\n", "plt.savefig(f\"../../plots/consistency_{sim}_{catalogue}_{key}.png\", dpi=450)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### SN/TFR Calibration consistency" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# catalogues = [\"LOSS\", \"Foundation\", \"Pantheon+\", \"2MTF\", \"SFI_gals\"]\n", "catalogues = [\"Pantheon+\"]\n", "sims = [\"Carrick2015\", \"csiborg2_main\", \"csiborg2X\"]\n", "\n", "for catalogue in catalogues:\n", " X = [samples_to_getdist(get_samples(sim, catalogue), sim)\n", " for sim in sims]\n", "\n", " if \"Pantheon+\" in catalogue or catalogue in [\"Foundation\", \"LOSS\"]:\n", " params = [\"alpha_cal\", \"beta_cal\", \"mag_cal\", \"e_mu\"]\n", " else:\n", " params = [\"aTF\", \"bTF\", \"e_mu\"]\n", "\n", " g = plots.get_subplot_plotter()\n", " g.settings.figure_legend_frame = False\n", " g.settings.alpha_filled_add = 0.75\n", "\n", " g.triangle_plot(X, params=params, filled=True, legend_loc='upper right')\n", " plt.gcf().suptitle(f'{catalogue}', y=1.025)\n", " plt.gcf().tight_layout()\n", " # plt.gcf().savefig(f\"../../plots/calibration_{catalogue}.png\", dpi=500, bbox_inches='tight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### $V_{\\rm ext}$ comparison" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "catalogues = [\"LOSS\"]\n", "# sims = [\"Carrick2015\", \"csiborg2_main\", \"csiborg2X\"]\n", "sims = [\"Carrick2015\"]\n", "params = [\"Vmag\", \"l\", \"b\"]\n", "\n", "for sim in sims:\n", " X = [samples_to_getdist(get_samples(sim, catalogue), sim, catalogue)\n", " for catalogue in catalogues]\n", "\n", " g = plots.get_subplot_plotter()\n", " g.settings.figure_legend_frame = False\n", " g.settings.alpha_filled_add = 0.75\n", "\n", " g.triangle_plot(X, params=params, filled=True, legend_loc='upper right')\n", " plt.gcf().suptitle(f'{simname_to_pretty(sim)}', y=1.025)\n", " plt.gcf().tight_layout()\n", " # plt.gcf().savefig(f\"../../plots/calibration_{sim}.png\", dpi=500, bbox_inches='tight')\n", " plt.gcf().show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bulk flow in the simulation rest frame" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sims = [\"Carrick2015\", \"csiborg1\", \"csiborg2_main\", \"csiborg2X\"]\n", "convert_to_galactic = False\n", "\n", "fig, axs = plt.subplots(1, 3, figsize=(15, 5))\n", "cols = plt.rcParams['axes.prop_cycle'].by_key()['color']\n", "\n", "for i, sim in enumerate(sims):\n", " r, B = get_bulkflow_simulation(sim, convert_to_galactic=convert_to_galactic)\n", " if sim == \"Carrick2015\":\n", " if convert_to_galactic:\n", " B[..., 0] *= 0.43\n", " else:\n", " B *= 0.43\n", "\n", " for n in range(3):\n", " ylow, ymed, yhigh = np.percentile(B[..., n], [16, 50, 84], axis=0)\n", " axs[n].fill_between(r, ylow, yhigh, color=cols[i], alpha=0.5, label=simname_to_pretty(sim) if n == 0 else None)\n", "\n", "axs[0].legend()\n", "if convert_to_galactic:\n", " axs[0].set_ylabel(r\"$B ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", " axs[1].set_ylabel(r\"$\\ell_B ~ [\\degree]$\")\n", " axs[2].set_ylabel(r\"$b_B ~ [\\degree]$\")\n", "else:\n", " axs[0].set_ylabel(r\"$B_{x} ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", " axs[1].set_ylabel(r\"$B_{y} ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", " axs[2].set_ylabel(r\"$B_{z} ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", "\n", "for n in range(3):\n", " axs[n].set_xlabel(r\"$R ~ [\\mathrm{Mpc}]$\")\n", "\n", "\n", "fig.tight_layout()\n", "fig.savefig(\"../../plots/bulkflow_simulations_restframe.png\", dpi=450)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bulk flow in the CMB rest frame" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sim = \"csiborg2_main\"\n", "catalogues = [\"Pantheon+\", \"2MTF\", \"SFI_gals\"]\n", "\n", "\n", "fig, axs = plt.subplots(1, 3, figsize=(15, 5), sharex=True)\n", "cols = plt.rcParams['axes.prop_cycle'].by_key()['color']\n", "# fig.suptitle(f\"Calibrated against {catalogue}\")\n", "\n", "for i, catalogue in enumerate(catalogues):\n", " r, B = get_bulkflow(sim, catalogue, sample_beta=True, convert_to_galactic=True,\n", " weight_simulations=True, downsample=3)\n", " c = cols[i]\n", " for n in range(3):\n", " ylow, ymed, yhigh = np.percentile(B[..., n], [16, 50, 84], axis=-1)\n", " axs[n].plot(r, ymed, color=c)\n", " axs[n].fill_between(r, ylow, yhigh, alpha=0.5, color=c, label=catalogue)\n", "\n", "\n", "# CMB-LG velocity\n", "axs[0].fill_between([r.min(), 10.], [627 - 22, 627 - 22], [627 + 22, 627 + 22], color='black', alpha=0.5, zorder=0.5, label=\"CMB-LG\", hatch=\"x\")\n", "axs[1].fill_between([r.min(), 10.], [276 - 3, 276 - 3], [276 + 3, 276 + 3], color='black', alpha=0.5, zorder=0.5, hatch=\"x\")\n", "axs[2].fill_between([r.min(), 10.], [30 - 3, 30 - 3], [30 + 3, 30 + 3], color='black', alpha=0.5, zorder=0.5, hatch=\"x\")\n", "\n", "# LCDM expectation\n", "Rs,mean,std,mode,p05,p16,p84,p95 = np.load(\"/mnt/users/rstiskalek/csiborgtools/data/BulkFlowPlot.npy\")\n", "m = Rs < 175\n", "axs[0].plot(Rs[m], mode[m], color=\"violet\", zorder=0)\n", "axs[0].fill_between(Rs[m], p16[m], p84[m], alpha=0.25, color=\"violet\",\n", " zorder=0, hatch='//', label=r\"$\\Lambda\\mathrm{CDM}$\")\n", "\n", "for n in range(3):\n", " axs[n].set_xlabel(r\"$r ~ [\\mathrm{Mpc} / h]$\")\n", "\n", "axs[0].legend()\n", "axs[0].set_ylabel(r\"$B ~ [\\mathrm{km} / \\mathrm{s}]$\")\n", "axs[1].set_ylabel(r\"$\\ell_B ~ [\\mathrm{deg}]$\")\n", "axs[2].set_ylabel(r\"$b_B ~ [\\mathrm{deg}]$\")\n", "\n", "axs[0].set_xlim(r.min(), r.max())\n", "\n", "fig.tight_layout()\n", "fig.savefig(f\"../../plots/bulkflow_{sim}_{catalogue}.png\", dpi=450)\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Smoothing scale dependence" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "simname = \"Carrick2015\"\n", "catalogue = \"Pantheon+\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Goodness-of-fit" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "scales = [0, 4, 8, 16, 32]\n", "\n", "y = np.asarray([get_gof(\"BIC\", simname, catalogue, ksmooth=i)\n", " for i in range(len(scales))])\n", "ymin = y.min()\n", "\n", "y -= ymin\n", "y_CF4 = get_gof(\"BIC\", \"CF4\", catalogue) - ymin\n", "y_CF4gp = get_gof(\"BIC\", \"CF4gp\", catalogue) - ymin\n", "\n", "plt.figure()\n", "plt.axhline(y[0], color='blue', label=\"Carrick+2015, no smoothing\")\n", "plt.plot(scales[1:], y[1:], marker=\"o\", label=\"Carrick+2015, smoothed\")\n", "\n", "plt.axhline(y_CF4, color='red', label=\"CF4, no smoothing\")\n", "\n", "plt.xlabel(r\"$R_{\\rm smooth} ~ [\\mathrm{Mpc}]$\")\n", "plt.ylabel(r\"$\\Delta \\mathrm{BIC}$\")\n", "plt.legend(ncols=1)\n", "\n", "plt.tight_layout()\n", "plt.savefig(\"../../plots/test_smooth.png\", dpi=450)\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sim = \"Carrick2015\"\n", "catalogue = \"Pantheon+\"\n", "\n", "\n", "X = [samples_to_getdist(get_samples(sim, catalogue, ksmooth=ksmooth), ksmooth)\n", " for ksmooth in [0, 1, 2]]\n", "\n", "params = [\"Vmag\", \"l\", \"b\", \"sigma_v\", \"beta\"]\n", "# if \"Pantheon+\" in catalogue or catalogue in [\"Foundation\", \"LOSS\"]:\n", "# params += [\"alpha_cal\", \"beta_cal\", \"mag_cal\", \"e_mu\"]\n", "# else:\n", "# params += [\"aTF\", \"bTF\", \"e_mu\"]\n", "\n", "\n", "\n", "g = plots.get_subplot_plotter()\n", "g.settings.figure_legend_frame = False\n", "g.settings.alpha_filled_add = 0.75\n", "\n", "g.triangle_plot(X, params=params, filled=True, legend_loc='upper right')\n", "plt.gcf().suptitle(f'{catalogue}', y=1.025)\n", "plt.gcf().tight_layout()\n", "plt.gcf().savefig(f\"../../plots/calibration_{catalogue}.png\", dpi=500, bbox_inches='tight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Void testing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Evidence comparison" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "zcmb_max = 0.05\n", "\n", "sims = [\"no_field\", \"IndranilVoid_exp\"]\n", "cats = [\"LOSS\", \"Foundation\", \"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "\n", "neglnZ = {}\n", "kfound = []\n", "for sim in sims:\n", " for cat in cats:\n", " sample_alpha = sim not in [\"IndranilVoid_exp\", \"no_field\"]\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"mike\",\n", " sample_alpha=sample_alpha, zcmb_max=zcmb_max)\n", " \n", "\n", " neglnZ[f\"{sim}_{cat}\"] = get_gof(\"neg_lnZ_harmonic\", fname)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "simA = sims[0]\n", "simB = sims[1]\n", "\n", "print(f\"lnZ_({simA}) - lnZ_({simB})\\n\")\n", "for cat in cats:\n", " lnZ_A = - neglnZ[f\"{simA}_{cat}\"]\n", " lnZ_B = - neglnZ[f\"{simB}_{cat}\"]\n", " print(f\"{cat:15s} {lnZ_A - lnZ_B:.1f}\")\n", "\n", "\n", "print(f\"\\n(Positive -> preference for {simA})\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Goodness-of-fit comparison" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "zcmb_max = 0.05\n", "no_Vext = True\n", "\n", "sims = [\"IndranilVoid_exp\", \"IndranilVoid_gauss\", \"IndranilVoid_mb\"]\n", "cats = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "\n", "neglnZ = {}\n", "kfound = {}\n", "for sim in sims:\n", " for cat in cats:\n", " kfound[f\"{sim}_{cat}\"] = []\n", " for ksim in range(500):\n", " sample_alpha = False\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"mike\", nsim=ksim,\n", " sample_alpha=sample_alpha, zcmb_max=zcmb_max,\n", " sample_beta=True,\n", " no_Vext=no_Vext, verbose_print=False)\n", "\n", " if not exists(fname):\n", " continue\n", "\n", " kfound[f\"{sim}_{cat}\"].append(ksim)\n", " neglnZ[f\"{sim}_{cat}_{ksim}\"] = get_gof(\"neg_lnZ_harmonic\", fname)\n", "\n", "\n", "neglnZ_no_field = {}\n", "neglnZ_dipole = {}\n", "sim = \"no_field\"\n", "for cat in cats:\n", " sample_alpha = False\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"mike\",\n", " sample_alpha=sample_alpha, zcmb_max=zcmb_max,\n", " no_Vext=True, verbose_print=False)\n", "\n", " if not exists(fname):\n", " continue\n", "\n", " neglnZ_no_field[f\"{cat}\"] = get_gof(\"neg_lnZ_harmonic\", fname)\n", "\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"mike\",\n", " sample_alpha=sample_alpha, zcmb_max=zcmb_max,\n", " no_Vext=None, verbose_print=False)\n", "\n", " if not exists(fname):\n", " continue\n", "\n", " neglnZ_dipole[f\"{cat}\"] = get_gof(\"neg_lnZ_harmonic\", fname)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", "\n", " figwidth = 8.3 \n", " fig, axs = plt.subplots(2, 2, figsize=(figwidth, 0.65 * figwidth))\n", "\n", " for n, cat in enumerate(cats):\n", " i, j = n // 2, n % 2\n", " ax = axs[i, j]\n", "\n", " for sim in sims:\n", " x = kfound[f\"{sim}_{cat}\"]\n", " y = [neglnZ[f\"{sim}_{cat}_{ksim}\"] / np.log(10) for ksim in x]\n", " x = np.array(x) * 0.674\n", " ax.plot(x, y, label=simname_to_pretty(sim))\n", " \n", " # if no_Vext is None:\n", " # y_no_field = neglnZ_no_field[cat] / np.log(10)\n", " # if cat != \"CF4_TFR_w1\":\n", " # ax.axhline(y_no_field, color=\"black\", ls=\"--\", label=\"No peculiar velocity\")\n", " y_no_field = neglnZ_no_field[cat] / np.log(10)\n", " ax.axhline(y_no_field, color=\"black\", ls=\"--\", label=\"No peculiar velocity\")\n", "\n", " y_dipole = neglnZ_dipole[cat] / np.log(10)\n", " ax.axhline(y_dipole, color=\"black\", ls=\":\", label=\"Constant dipole\")\n", "\n", " ax.text(0.5, 0.9, catalogue_to_pretty(cat),\n", " transform=ax.transAxes, #fontsize=\"small\",\n", " verticalalignment='center', horizontalalignment='center',\n", " bbox=dict(facecolor='white', alpha=0.5),\n", " )\n", "\n", " if n == 0:\n", " ax.legend(fontsize=\"small\", loc=\"upper left\")\n", "\n", " ax.set_ylabel(r\"$-\\Delta \\log \\mathcal{Z}$\")\n", " ax.set_xlabel(r\"$R_{\\rm offset} ~ [\\mathrm{Mpc} / h]$\")\n", " ax.set_xlim(0)\n", "\n", " fig.tight_layout()\n", " fname = f\"../../plots/void_goodness_of_fit_observer.png\"\n", " if no_Vext:\n", " fname = fname.replace(\".png\", \"_no_Vext.png\")\n", " print(f\"Saving to `{fname}`.\")\n", " fig.savefig(fname, dpi=450)\n", " fig.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Single parameter radial dependence" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "zcmb_max = 0.05\n", "key = \"beta\"\n", "# key_label = r\"$\\sigma_v ~ [\\mathrm{km} / \\mathrm{s}]$\"\n", "# key_label = r\"$|\\mathbf{V}_{\\rm ext}| ~ [\\mathrm{km} / \\mathrm{s}]$\"\n", "key_label = r\"$\\beta$\"\n", "no_Vext = True\n", "\n", "sims = [\"IndranilVoid_exp\", \"IndranilVoid_gauss\", \"IndranilVoid_mb\"]\n", "cats = [\"2MTF\", \"SFI_gals\", \"CF4_TFR_i\", \"CF4_TFR_w1\"]\n", "\n", "data_mean = {}\n", "data_std = {}\n", "kfound = {}\n", "for sim in sims:\n", " for cat in cats:\n", " kfound[f\"{sim}_{cat}\"] = []\n", " for ksim in range(500):\n", " sample_alpha = False\n", " fname = paths.flow_validation(\n", " fdir, sim, cat, inference_method=\"mike\", nsim=ksim,\n", " sample_alpha=sample_alpha, zcmb_max=zcmb_max,\n", " sample_beta=True,\n", " no_Vext=no_Vext, verbose_print=False)\n", "\n", " if not exists(fname):\n", " continue\n", "\n", " kfound[f\"{sim}_{cat}\"].append(ksim)\n", " with File(fname, 'r') as f:\n", " x = f[f\"samples/{key}\"][...]\n", " if key == \"Vext\":\n", " x = np.linalg.norm(x, axis=-1)\n", "\n", " data_mean[f\"{sim}_{cat}_{ksim}\"] = x.mean()\n", " data_std[f\"{sim}_{cat}_{ksim}\"] = x.std()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "with plt.style.context('science'):\n", " plt.rcParams.update({'font.size': 9})\n", "\n", " figwidth = 8.3\n", " fig, axs = plt.subplots(2, 2, figsize=(figwidth, 0.65 * figwidth))\n", "\n", " for n, cat in enumerate(cats):\n", " i, j = n // 2, n % 2\n", " ax = axs[i, j]\n", "\n", " for sim in sims:\n", " x = kfound[f\"{sim}_{cat}\"]\n", " y = [data_mean[f\"{sim}_{cat}_{ksim}\"] for ksim in x]\n", " yerr = [data_std[f\"{sim}_{cat}_{ksim}\"] for ksim in x]\n", " x = np.array(x) * 0.674\n", "\n", " ax.plot(x, y, label=simname_to_pretty(sim))\n", " ax.fill_between(x, np.array(y) - np.array(yerr), np.array(y) + np.array(yerr), alpha=0.5)\n", "\n", " ax.text(0.5, 0.9, catalogue_to_pretty(cat),\n", " transform=ax.transAxes, #fontsize=\"small\",\n", " verticalalignment='center', horizontalalignment='center',\n", " bbox=dict(facecolor='white', alpha=0.5),\n", " )\n", "\n", " if n == 0:\n", " ax.legend(fontsize=\"small\", loc='upper right')\n", "\n", " ax.set_ylabel(key_label)\n", " ax.set_xlabel(r\"$R_{\\rm offset} ~ [\\mathrm{Mpc} / h]$\")\n", " ax.set_xlim(0),\n", "\n", " fig.tight_layout()\n", " fname = f\"../../plots/void_{key}_per_observer.png\"\n", " if no_Vext:\n", " fname = fname.replace(\".png\", \"_no_Vext.png\")\n", " print(f\"Saving to `{fname}`.\")\n", " fig.savefig(fname, dpi=450)\n", " fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "venv_csiborg", "language": "python", "name": "python3" }, "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.11.4" } }, "nbformat": 4, "nbformat_minor": 2 }