From 88d2c0ff67eb2534e6407b18a1f455a9228b941f Mon Sep 17 00:00:00 2001 From: JamesAmato <116766236+JamesAmato@users.noreply.github.com> Date: Fri, 28 Feb 2025 16:09:51 -0600 Subject: [PATCH 1/2] fix: enable apply_delens=True in CMBLensed --- CHANGES.rst | 1 + change_minimal_213_ONLY.ipynb | 199 ++++++++++++++++++++++++++++++++++ src/pysm3/models/cmb.py | 3 +- tests/test_cmb.py | 25 +++++ 4 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 change_minimal_213_ONLY.ipynb diff --git a/CHANGES.rst b/CHANGES.rst index 22382392..5ba22bdd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,6 +7,7 @@ - Updated `pixell` from 0.17.3 to 0.26.0 https://github.com/galsci/pysm/pull/183 - Initial implementation of a point source catalog component emission https://github.com/galsci/pysm/pull/187 - Switch the build system to Hatch https://github.com/galsci/pysm/pull/189 +- Fix bug in `CMBLensed` preventing use of `apply_delens=True` 3.4.0 (2023-12-11) ================== diff --git a/change_minimal_213_ONLY.ipynb b/change_minimal_213_ONLY.ipynb new file mode 100644 index 00000000..9e8ed475 --- /dev/null +++ b/change_minimal_213_ONLY.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# For clarity, this addresses Issue 213 only" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import healpy as hp\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pysm3.units as u\n", + "from pysm3.models.cmb import CMBMap\n", + "from pysm3.models.cmb import CMBLensed as CMBLensedOriginal" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Issue 213" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When running CMBLensed with `apply_delens=True`, there is a ValueError." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "operands could not be broadcast together with shapes (2201,) (2,) \n" + ] + } + ], + "source": [ + "try:\n", + " will_crash = CMBLensedOriginal(\n", + " nside=128,\n", + " cmb_spectra=\"demo_powerspectra/c1_ps_l01.dat\",\n", + " # max_nside=None,\n", + " # cmb_seed=0,\n", + " apply_delens=True,\n", + " delensing_ells=\"demo_powerspectra/c1_delensing_ells.dat\",\n", + " # map_dist=None,\n", + " )\n", + "except ValueError as e:\n", + " print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Resolution" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At line (43), adding `unpack=True`, resolves this:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Revised, minimal changes to the __init__ method are all that is needed\n", + "\n", + "class CMBLensedRevised(CMBMap):\n", + " # intherit from CMBMap so we get the `get_emission` method\n", + " def __init__(\n", + " self,\n", + " nside,\n", + " cmb_spectra,\n", + " max_nside=None,\n", + " cmb_seed=None,\n", + " apply_delens=False,\n", + " delensing_ells=None,\n", + " map_dist=None,\n", + " ):\n", + " \"\"\"Lensed CMB\n", + "\n", + " Takes an input unlensed CMB and lensing spectrum from CAMB and uses\n", + " Taylens to apply lensing, it optionally simulates delensing by\n", + " suppressing the lensing power at specific scales with the user\n", + " provided `delensing_ells`.\n", + "\n", + " Parameters\n", + " ----------\n", + "\n", + " cmb_spectra : path\n", + " Input text file from CAMB, spectra unlensed\n", + " cmb_seed : int\n", + " Numpy random seed for synfast, set to None for a random seed\n", + " apply_delens : bool\n", + " If true, simulate delensing with taylens\n", + " delensing_ells : path\n", + " Space delimited file with ells in the first columns and suppression\n", + " factor (1 for no suppression) in the second column\n", + " \"\"\"\n", + " try:\n", + " super().__init__(nside=nside, max_nside=max_nside, map_dist=map_dist)\n", + " except ValueError:\n", + " pass # suppress exception about not providing any input map\n", + " self.cmb_spectra = self.read_txt(cmb_spectra, unpack=True)\n", + " self.cmb_seed = cmb_seed\n", + " self.apply_delens = apply_delens\n", + " self.delensing_ells = (\n", + " None if delensing_ells is None else self.read_txt(delensing_ells, \n", + " unpack=True)\n", + " )\n", + "\n", + " self.map = u.Quantity(self.run_taylens(), unit=u.uK_CMB, copy=False)\n", + "\n", + "\n", + " def run_taylens(self):\n", + " pass\n", + "\n", + "CMBLensedRevised.run_taylens = CMBLensedOriginal.run_taylens" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Successful run.\n" + ] + } + ], + "source": [ + "try:\n", + " will_run = CMBLensedRevised(\n", + " nside=128,\n", + " cmb_spectra=\"demo_powerspectra/c1_ps.dat\",\n", + " # max_nside=None,\n", + " # cmb_seed=0,\n", + " apply_delens=True,\n", + " delensing_ells=\"demo_powerspectra/c1_delensing_ells.dat\",\n", + " # map_dist=None,\n", + " )\n", + " print(\"Successful run.\")\n", + "except ValueError as e:\n", + " print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because the `c1` delensing ells are a no-op (it is a column of 1's), no change is seen when applying delensing_ells. I do not know enough about the method to evaluate success or failure. When addressing Issue 212, it needs to account for this as well." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cmb-ml2", + "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.9.21" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/pysm3/models/cmb.py b/src/pysm3/models/cmb.py index 6709ea50..8c63ea31 100644 --- a/src/pysm3/models/cmb.py +++ b/src/pysm3/models/cmb.py @@ -276,7 +276,8 @@ def __init__( self.cmb_seed = cmb_seed self.apply_delens = apply_delens self.delensing_ells = ( - None if delensing_ells is None else self.read_txt(delensing_ells) + None if delensing_ells is None else self.read_txt(delensing_ells, + unpack=True) ) self.map = u.Quantity(self.run_taylens(), unit=u.uK_CMB, copy=False) diff --git a/tests/test_cmb.py b/tests/test_cmb.py index e4f1242f..7ec04fcb 100644 --- a/tests/test_cmb.py +++ b/tests/test_cmb.py @@ -72,3 +72,28 @@ def test_cmb_lensed(model_tag, freq): assert_quantity_allclose( expected_output, model.get_emission(freq * u.GHz), rtol=1e-5 ) + + +def test_cmb_lensed_apply_delens(): + # Addressing issue #213; CMBLensed model was raising a ValueError when + # apply_delens=True + + try: + model = pysm3.models.CMBLensed( + nside=64, + cmb_spectra='pysm_2/camb_lenspotentialCls.dat', + apply_delens=False, + delensing_ells='pysm_2/delens_ells.txt' + ) + except ValueError: + pytest.fail(f"Unexpected ValueError without apply_delens=True") + + try: + model = pysm3.models.CMBLensed( + nside=64, + cmb_spectra='pysm_2/camb_lenspotentialCls.dat', + apply_delens=True, + delensing_ells='pysm_2/delens_ells.txt' + ) + except ValueError: + pytest.fail(f"ValueError raised when applying delensing") From 507547c4c3f89396be725bef7ae2c37060aa1ca7 Mon Sep 17 00:00:00 2001 From: JamesAmato <116766236+JamesAmato@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:37:00 -0600 Subject: [PATCH 2/2] updated spectra filenames --- change_minimal_213_ONLY.ipynb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/change_minimal_213_ONLY.ipynb b/change_minimal_213_ONLY.ipynb index 9e8ed475..668acb45 100644 --- a/change_minimal_213_ONLY.ipynb +++ b/change_minimal_213_ONLY.ipynb @@ -13,9 +13,7 @@ "metadata": {}, "outputs": [], "source": [ - "import healpy as hp\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", + "import pysm3\n", "import pysm3.units as u\n", "from pysm3.models.cmb import CMBMap\n", "from pysm3.models.cmb import CMBLensed as CMBLensedOriginal" @@ -44,7 +42,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "operands could not be broadcast together with shapes (2201,) (2,) \n" + "operands could not be broadcast together with shapes (2199,) (2,) \n" ] } ], @@ -52,11 +50,11 @@ "try:\n", " will_crash = CMBLensedOriginal(\n", " nside=128,\n", - " cmb_spectra=\"demo_powerspectra/c1_ps_l01.dat\",\n", + " cmb_spectra='pysm_2/camb_lenspotentialCls.dat',\n", " # max_nside=None,\n", " # cmb_seed=0,\n", " apply_delens=True,\n", - " delensing_ells=\"demo_powerspectra/c1_delensing_ells.dat\",\n", + " delensing_ells='pysm_2/delens_ells.txt',\n", " # map_dist=None,\n", " )\n", "except ValueError as e:\n", @@ -155,11 +153,11 @@ "try:\n", " will_run = CMBLensedRevised(\n", " nside=128,\n", - " cmb_spectra=\"demo_powerspectra/c1_ps.dat\",\n", + " cmb_spectra='pysm_2/camb_lenspotentialCls.dat',\n", " # max_nside=None,\n", " # cmb_seed=0,\n", " apply_delens=True,\n", - " delensing_ells=\"demo_powerspectra/c1_delensing_ells.dat\",\n", + " delensing_ells='pysm_2/delens_ells.txt',\n", " # map_dist=None,\n", " )\n", " print(\"Successful run.\")\n",