{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Using a calibrated flow model to predict $z_{\\rm cosmo}$" ] }, { "cell_type": "code", "execution_count": 5, "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", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from h5py import File\n", "from tqdm import tqdm\n", "\n", "import csiborgtools\n", "\n", "%load_ext autoreload\n", "%autoreload 2\n", "%matplotlib inline\n", "\n", "paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def load_calibration(catalogue, simname, nsim, ksmooth):\n", " fname = f\"/mnt/extraspace/rstiskalek/csiborg_postprocessing/peculiar_velocity/flow_samples_{catalogue}_{simname}_smooth_{ksmooth}.hdf5\" # noqa\n", " keys = [\"Vext_x\", \"Vext_y\", \"Vext_z\", \"alpha\", \"beta\", \"sigma_v\"]\n", "\n", " # SN_keys = ['mag_cal', 'alpha_cal', 'beta_cal']\n", " # SN_keys = []\n", " calibration_samples = {}\n", " with File(fname, 'r') as f:\n", " for key in keys:\n", " calibration_samples[key] = f[f\"sim_{nsim}/{key}\"][:][::10]\n", "\n", " # for key in SN_keys:\n", " # calibration_samples[key] = f[f\"sim_{nsim}/{key}\"][:]\n", "\n", " return calibration_samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test running a model" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0%| | 0/19 [00:00<?, ?it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:19: reading the catalogue.\n", "10:32:19: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/mnt/users/rstiskalek/csiborgtools/csiborgtools/flow/flow_model.py:113: UserWarning: The number of radial steps is even. Skipping the first step at 0.0 because Simpson's rule requires an odd number of steps.\n", " warn(f\"The number of radial steps is even. Skipping the first \"\n", " 5%|▌ | 1/19 [00:00<00:05, 3.38it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:19: calculating the radial velocity.\n", "10:32:20: reading the catalogue.\n", "10:32:20: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 11%|█ | 2/19 [00:00<00:04, 3.43it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:20: calculating the radial velocity.\n", "10:32:20: reading the catalogue.\n", "10:32:20: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 16%|█▌ | 3/19 [00:00<00:04, 3.47it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:20: calculating the radial velocity.\n", "10:32:20: reading the catalogue.\n", "10:32:20: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 21%|██ | 4/19 [00:01<00:04, 3.44it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:20: calculating the radial velocity.\n", "10:32:20: reading the catalogue.\n", "10:32:20: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 26%|██▋ | 5/19 [00:01<00:04, 3.41it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:21: calculating the radial velocity.\n", "10:32:21: reading the catalogue.\n", "10:32:21: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 32%|███▏ | 6/19 [00:01<00:03, 3.44it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:21: calculating the radial velocity.\n", "10:32:21: reading the catalogue.\n", "10:32:21: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 37%|███▋ | 7/19 [00:02<00:03, 3.33it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:21: calculating the radial velocity.\n", "10:32:21: reading the catalogue.\n", "10:32:21: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 42%|████▏ | 8/19 [00:02<00:03, 3.31it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:22: calculating the radial velocity.\n", "10:32:22: reading the catalogue.\n", "10:32:22: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 47%|████▋ | 9/19 [00:02<00:03, 3.14it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:22: calculating the radial velocity.\n", "10:32:22: reading the catalogue.\n", "10:32:22: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 53%|█████▎ | 10/19 [00:03<00:02, 3.18it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:22: calculating the radial velocity.\n", "10:32:22: reading the catalogue.\n", "10:32:22: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 58%|█████▊ | 11/19 [00:03<00:02, 3.19it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:22: calculating the radial velocity.\n", "10:32:23: reading the catalogue.\n", "10:32:23: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 63%|██████▎ | 12/19 [00:03<00:02, 3.25it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:23: calculating the radial velocity.\n", "10:32:23: reading the catalogue.\n", "10:32:23: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 68%|██████▊ | 13/19 [00:03<00:01, 3.23it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:23: calculating the radial velocity.\n", "10:32:23: reading the catalogue.\n", "10:32:23: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 74%|███████▎ | 14/19 [00:04<00:01, 3.25it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:23: calculating the radial velocity.\n", "10:32:23: reading the catalogue.\n", "10:32:23: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 79%|███████▉ | 15/19 [00:04<00:01, 3.21it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:24: calculating the radial velocity.\n", "10:32:24: reading the catalogue.\n", "10:32:24: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 84%|████████▍ | 16/19 [00:04<00:00, 3.26it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:24: calculating the radial velocity.\n", "10:32:24: reading the catalogue.\n", "10:32:24: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 89%|████████▉ | 17/19 [00:05<00:00, 3.31it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:24: calculating the radial velocity.\n", "10:32:24: reading the catalogue.\n", "10:32:24: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 95%|█████████▍| 18/19 [00:05<00:00, 3.33it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:25: calculating the radial velocity.\n", "10:32:25: reading the catalogue.\n", "10:32:25: reading the interpolated field.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 19/19 [00:05<00:00, 3.30it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "10:32:25: calculating the radial velocity.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# fpath_data = \"/mnt/extraspace/rstiskalek/catalogs/PV_compilation_Supranta2019.hdf5\"\n", "fpath_data = \"/mnt/extraspace/rstiskalek/catalogs/PV_mock_CB2_17417_large.hdf5\"\n", "\n", "simname = \"csiborg2_main\"\n", "catalogue = \"CB2_large\"\n", "\n", "nsims = paths.get_ics(simname)[:-1]\n", "ksmooth = 1\n", "\n", "loaders = []\n", "models = []\n", "zcosmo_mean = None\n", "zobs = None\n", "\n", "for i, nsim in enumerate(tqdm(nsims)):\n", " loader = csiborgtools.flow.DataLoader(simname, i, catalogue, fpath_data, paths, ksmooth=ksmooth)\n", " calibration_samples = load_calibration(catalogue, simname, nsim, ksmooth)\n", " model = csiborgtools.flow.Observed2CosmologicalRedshift(calibration_samples, loader.rdist, loader._Omega_m)\n", "\n", " if i == 0:\n", " zcosmo_mean = loader.cat[\"zcosmo\"]\n", " zobs = loader.cat[\"zobs\"]\n", " vrad = loader.cat[\"vrad\"]\n", "\n", " loaders.append(loader)\n", " models.append(model)\n" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Stacking: 0%| | 0/19 [00:00<?, ?it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Stacking: 100%|██████████| 19/19 [00:06<00:00, 3.06it/s]\n" ] } ], "source": [ "n = 400\n", "zcosmo, pzcosmo = csiborgtools.flow.stack_pzosmo_over_realizations(\n", " n, models, loaders, \"zobs\")" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "\n", "# for i in range(len(nsims)):\n", " # mask = pzcosmo[i] > 1e-5\n", " # plt.plot(zcosmo[mask], pzcosmo[i][mask], color=\"black\", alpha=0.1)\n", "\n", "# mu = np.nanmean(pzcosmo, axis=0)\n", "mask = pzcosmo > 1e-5\n", "plt.plot(zcosmo[mask], pzcosmo[mask], color=\"black\", label=r\"$p(z_{\\rm cosmo})$\")\n", "\n", "plt.ylim(0)\n", "plt.axvline(zcosmo_mean[n], color=\"green\", label=r\"$z_{\\rm cosmo}$\")\n", "plt.axvline(zobs[n], color=\"red\", label=r\"$z_{\\rm CMB}$\")\n", "\n", "plt.xlabel(r\"$z$\")\n", "plt.ylabel(r\"$p(z)$\")\n", "plt.legend()\n", "plt.tight_layout()\n", "# plt.savefig(\"../plots/zcosmo_posterior_mock_example_B.png\", dpi=450)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "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.7" } }, "nbformat": 4, "nbformat_minor": 2 }