{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Adding DM-Baryon Relative Velocities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook shows how to include the effect of the DM-baryon relative velocities, and\n", "the EOS2021 parameters.\n", "\n", "Based on Muñoz+21 (https://arxiv.org/abs/2110.13919). See \n", "https://drive.google.com/drive/folders/1-50AO-i3arCnfHc22YWXJacs4u-xsPL6?usp=sharing for \n", "the large (1.5Gpc) AllGalaxies simulation with the same parameters.\n", "Note that this notebook has been updated to use 21cmFASTv4, while EOS2021 was run with\n", "21cmFASTv3. The results will be slightly different due to various small fixes and \n", "improvements in v4, but the basic physics is still the same.\n", "\n", "It is recommended to do the other tutorials first." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-03-14T21:18:49.274149Z", "start_time": "2020-03-14T21:18:39.580491Z" } }, "outputs": [], "source": [ "import matplotlib\n", "import numpy as np\n", "\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "from matplotlib import colormaps\n", "import py21cmfast as p21c\n", "from py21cmfast import plotting\n", "from tempfile import mkdtemp\n", "\n", "random_seed = 1605\n", "\n", "EoR_colour = matplotlib.colors.LinearSegmentedColormap.from_list(\n", " \"mycmap\",\n", " [\n", " (0, \"white\"),\n", " (0.33, \"yellow\"),\n", " (0.5, \"orange\"),\n", " (0.68, \"red\"),\n", " (0.83333, \"black\"),\n", " (0.9, \"blue\"),\n", " (1, \"cyan\"),\n", " ],\n", ")\n", "colormaps.register(cmap=EoR_colour)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fiducial and lightcones" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's fix the initial condition for this tutorial." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-03-14T21:18:50.491836Z", "start_time": "2020-03-14T21:18:49.277655Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/jed/miniconda3/envs/21cmfast/lib/python3.13/site-packages/attr/_make.py:2893: UserWarning: Resolution is likely too low for accurate evolved density fields\n", " It Is recommendedthat you either increase the resolution (DIM/BOX_LEN) orset the EVOLVE_DENSITY_LINEARLY flag to 1\n", " v(inst, attr, value)\n" ] } ], "source": [ "output_dir = mkdtemp()\n", "\n", "inputs = p21c.InputParameters.from_template(\n", " 'Munoz21', random_seed=911, \n", " node_redshifts=p21c.get_logspaced_redshifts(\n", " min_redshift=5, max_redshift=35.0, z_step_factor=1.06\n", " )\n", ").evolve_input_structs(\n", " HII_DIM=64,\n", " DIM=172,\n", " BOX_LEN=200,\n", " \n", ")\n", "\n", "initial_conditions = p21c.compute_initial_conditions(\n", " inputs=inputs,\n", " cache=p21c.OutputCache(output_dir),\n", ")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(inputs.node_redshifts)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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7COpw1H7muNAUpd3JhMmTMDChQvx9ttvo1u3bvusO2TIEADAxo0bD0fXEiIvLw8nnHACNm7ciJKSEoRCIdTX18fVSbWx37JlC5YsWYL/+q//2me9VBzvPeO4r/ldUlJiExtHIhHs3Lmz06/DnoXEli1bsHjx4v2mwx4yZAgikQi++uqrw9PBBDj22GPRtWvX2LxI5fEGgHfeeQcbNmzY73wHDu94a8++RJ4jJSUl4j2w5zty8DhqFxPpkrrcsixMmDABL730Et566y307t17v7+zfv16AEBpaekh7l3iNDc3Y9OmTSgtLcXgwYPhdrvjxn7Dhg2oqqpKqbGfM2cOioqKcMEFF+yzXiqOd+/evVFSUhI3xo2NjVizZk1sjMvLy1FfX49169bF6rz11lswTTO2QOoM9iwkvvzySyxZsgQFBQX7/Z3169fD4XDYXiN0Jt988w3q6upi8yJVx3sPs2fPxuDBgzFw4MD91j0c472/Z18iz5Hy8nJ88skncYu4PYvTk08++ZD1/aikkwWgncrzzz9veb1ea+7cudbnn39u3XzzzVZeXl6c8rezueWWWyy/328tXbrUqq6ujn1aW1sty7KsjRs3WtOmTbPWrl1rbd682Xr55ZetY4891ho6dGin9vvOO++0li5dam3evNlasWKFNXz4cKtr167Wtm3bLMuyrJ/+9KdWjx49rLfeestau3atVV5ebpWXl3dqn/cmGo1aPXr0sO6555648lQa76amJuvDDz+0PvzwQwuA9eijj1offvhhzPUwffp0Ky8vz3r55Zetjz/+2Lrkkkus3r17W21tbbE2Ro0aZQ0aNMhas2aN9e6771p9+vSxxowZ02n9DoVC1sUXX2x169bNWr9+fdyc36O+X7lypTVjxgxr/fr11qZNm6w///nPVmFhoXXttdd2Wr+bmpqsn/3sZ9aqVauszZs3W0uWLLFOPfVUq0+fPlYgEIi1kWrjvYeGhgYrMzPTmjVrlu33O2u89/fss6z9P0cikYjVr18/a8SIEdb69eutRYsWWYWFhdaUKVMOad+PRo7qxYRlWdbvfvc7q0ePHpbH47G+//3vW6tXr+7sLsUBQPzMmTPHsizLqqqqsoYOHWrl5+dbXq/XOv7446277rrLamho6NR+X3HFFVZpaanl8XisY445xrriiiusjRs3xr5va2uzbr31VqtL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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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YAD+53/+B2PHjoXb7cavfvWrsL/ug8EgbrzxRlx22WW4+eabMXXqVAwfPhz/8R//gV/96ldKe4sWLcI333yDSZMmISUlBR9//DFCoRAGDRp00v1KSUlBZWUlbDbbt+p9+eWXePzxx3H11VdjyZIlePvtt/HRRx8BAC688EJMmjQJ06dPx1NPPYX+/ftj9+7dMJlMmDp16knbJghC9CInFoLwHVi+fDmeeeYZ/M///A+SkpJgNpvxP//zP/j888/x3HPPaX/vpZdeQmNjI0aPHo2bbroJd999d1go5//7f/8PBw8exAsvvAAAyMnJwYsvvojf/e532LJli9Ke0+nEu+++i+9973s466yz8Pzzz+Nvf/sbhg4d+p3653Q6ta9fjnLvvfdi/fr1GDVqFP74xz/iqaeewmWXXdbx/TvvvINx48bhhhtuwJAhQ/DrX/8awWDwO9klCEL0YjIMw+huIwRBOL288soruOeee+Byub5TO4WFhbjnnnu+c1rwWbNmweVy4f333/9O7QiC0P3IiYUgnKE0NTUhISEB9913X7fZ8PnnnyMhIQGvvfZat9kgCEJkER8LQTgDmT59Os4//3wAOOmokUgwduzYjqiZhISEbrNDEITIIa9CBEEQBEGIGPIqRBAEQRCEiCEbC0EQBEEQIoZsLARBEARBiBiysRAEQRAEIWLIxkIQBEEQhIghGwtBEARBECKGbCwEQRAEQYgYsrEQBEEQBCFiyMZCEARBEISI8f8DJCJEOIB7OSAAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plotting.coeval_sliceplot(initial_conditions, \"lowres_vcb\")\n", "plotting.coeval_sliceplot(initial_conditions, \"lowres_density\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's run a 'fiducial' model and see its lightcones\n", "\n", "Note that the reference model has `F_STAR7_MINI` ~ `F_STAR10`and `F_ESC7_MINI` ~ 1%, \n", "as low, but conservative fiducial. Also we take `L_X_MINI=L_X` out of simplicity \n", "(and ignorance)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-03-14T21:22:09.380149Z", "start_time": "2020-03-14T21:18:50.496755Z" } }, "outputs": [], "source": [ "# the lightcones we want to plot later together with their color maps and min/max\n", "lightcone_quantities = (\n", " \"brightness_temp\",\n", " \"spin_temperature\",\n", " \"neutral_fraction\",\n", " \"cumulative_recombinations\",\n", " \"z_reion\",\n", " \"ionisation_rate_G12\",\n", " \"J_21_LW\",\n", " \"density\",\n", ")\n", "cmaps = [\n", " EoR_colour,\n", " \"Reds\",\n", " \"magma\",\n", " \"magma\",\n", " \"magma\",\n", " \"cubehelix\",\n", " \"cubehelix\",\n", " \"viridis\",\n", "]\n", "vmins = [-150, 1e1, 0, 0, 5, 0, 0, -1]\n", "vmaxs = [30, 1e3, 1, 2, 9, 1, 10, 1]\n", "\n", "\n", "inputs_no_vcb = inputs.evolve_input_structs(A_VCB=0)\n", "\n", "# the flag FIX_VCB_AVG side-steps the relative-velocity ICs, and instead fixes all velocities to some average value.\n", "# It gets the background right but it's missing VAOs and 21cm power at large scales\n", "inputs_vavg = inputs.evolve_input_structs(FIX_VCB_AVG=True)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[6]\u001b[39m\u001b[32m, line 8\u001b[39m\n\u001b[32m 1\u001b[39m lcn = p21c.RectilinearLightconer.with_equal_cdist_slices(\n\u001b[32m 2\u001b[39m min_redshift=\u001b[32m5.0\u001b[39m,\n\u001b[32m 3\u001b[39m max_redshift=\u001b[32m35.0\u001b[39m,\n\u001b[32m 4\u001b[39m quantities=lightcone_quantities,\n\u001b[32m 5\u001b[39m resolution=inputs.simulation_options.cell_size,\n\u001b[32m 6\u001b[39m )\n\u001b[32m----> \u001b[39m\u001b[32m8\u001b[39m _, _, _, lightcone_fid_vcb = \u001b[43mp21c\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun_lightcone\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 9\u001b[39m \u001b[43m \u001b[49m\u001b[43mlightconer\u001b[49m\u001b[43m=\u001b[49m\u001b[43mlcn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 10\u001b[39m \u001b[43m \u001b[49m\u001b[43minitial_conditions\u001b[49m\u001b[43m=\u001b[49m\u001b[43minitial_conditions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 11\u001b[39m \u001b[43m \u001b[49m\u001b[43mglobal_quantities\u001b[49m\u001b[43m=\u001b[49m\u001b[43mlightcone_quantities\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 12\u001b[39m \u001b[43m \u001b[49m\u001b[43mcache\u001b[49m\u001b[43m=\u001b[49m\u001b[43mp21c\u001b[49m\u001b[43m.\u001b[49m\u001b[43mOutputCache\u001b[49m\u001b[43m(\u001b[49m\u001b[43moutput_dir\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 13\u001b[39m \u001b[43m \u001b[49m\u001b[43mwrite\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 14\u001b[39m \u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/drivers/lightcone.py:631\u001b[39m, in \u001b[36mrun_lightcone\u001b[39m\u001b[34m(**kwargs)\u001b[39m\n\u001b[32m 630\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[34mrun_lightcone\u001b[39m(**kwargs): \u001b[38;5;66;03m# noqa: D103\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m631\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mexhaust\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgenerate_lightcone\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/drivers/__init__.py:23\u001b[39m, in \u001b[36mexhaust\u001b[39m\u001b[34m(generator)\u001b[39m\n\u001b[32m 21\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[34mexhaust\u001b[39m(generator: Generator):\n\u001b[32m 22\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Exhaust a generator without keeping more than one return value in memory.\"\"\"\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m23\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdeque\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgenerator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmaxlen\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m)\u001b[49m[\u001b[32m0\u001b[39m]\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/drivers/_param_config.py:492\u001b[39m, in \u001b[36mhigh_level_func.__call__\u001b[39m\u001b[34m(self, **kwargs)\u001b[39m\n\u001b[32m 488\u001b[39m kwargs[\u001b[33m\"\u001b[39m\u001b[33minputs\u001b[39m\u001b[33m\"\u001b[39m] = inputs\n\u001b[32m 490\u001b[39m \u001b[38;5;28mself\u001b[39m.check_consistency(kwargs, outputs)\n\u001b[32m--> \u001b[39m\u001b[32m492\u001b[39m \u001b[38;5;28;01myield from\u001b[39;00m \u001b[38;5;28mself\u001b[39m._func(**kwargs)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/drivers/lightcone.py:613\u001b[39m, in \u001b[36mgenerate_lightcone\u001b[39m\u001b[34m(lightconer, inputs, global_quantities, initial_conditions, cleanup, write, cache, regenerate, always_purge, lightcone_filename)\u001b[39m\n\u001b[32m 597\u001b[39m iokw = {\u001b[33m\"\u001b[39m\u001b[33mcache\u001b[39m\u001b[33m\"\u001b[39m: cache, \u001b[33m\"\u001b[39m\u001b[33mregenerate\u001b[39m\u001b[33m\"\u001b[39m: regenerate}\n\u001b[32m 599\u001b[39m (\n\u001b[32m 600\u001b[39m initial_conditions,\n\u001b[32m 601\u001b[39m perturbed_fields,\n\u001b[32m (...)\u001b[39m\u001b[32m 610\u001b[39m **iokw,\n\u001b[32m 611\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m613\u001b[39m \u001b[38;5;28;01myield from\u001b[39;00m _run_lightcone_from_perturbed_fields(\n\u001b[32m 614\u001b[39m initial_conditions=initial_conditions,\n\u001b[32m 615\u001b[39m perturbed_fields=perturbed_fields,\n\u001b[32m 616\u001b[39m lightconer=lightconer,\n\u001b[32m 617\u001b[39m inputs=inputs,\n\u001b[32m 618\u001b[39m regenerate=regenerate,\n\u001b[32m 619\u001b[39m pt_halos=pt_halos,\n\u001b[32m 620\u001b[39m photon_nonconservation_data=photon_nonconservation_data,\n\u001b[32m 621\u001b[39m global_quantities=global_quantities,\n\u001b[32m 622\u001b[39m cache=cache,\n\u001b[32m 623\u001b[39m write=write,\n\u001b[32m 624\u001b[39m cleanup=cleanup,\n\u001b[32m 625\u001b[39m always_purge=always_purge,\n\u001b[32m 626\u001b[39m lightcone_filename=lightcone_filename,\n\u001b[32m 627\u001b[39m )\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/drivers/lightcone.py:449\u001b[39m, in \u001b[36m_run_lightcone_from_perturbed_fields\u001b[39m\u001b[34m(initial_conditions, perturbed_fields, lightconer, inputs, photon_nonconservation_data, pt_halos, regenerate, global_quantities, cache, cleanup, write, always_purge, lightcone_filename)\u001b[39m\n\u001b[32m 446\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m lightcone_filename \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m Path(lightcone_filename).exists():\n\u001b[32m 447\u001b[39m lightcone.save(lightcone_filename)\n\u001b[32m--> \u001b[39m\u001b[32m449\u001b[39m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43miz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcoeval\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43menumerate\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[32m 450\u001b[39m \u001b[43m \u001b[49m\u001b[43m_redshift_loop_generator\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 451\u001b[39m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m=\u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 452\u001b[39m \u001b[43m \u001b[49m\u001b[43minitial_conditions\u001b[49m\u001b[43m=\u001b[49m\u001b[43minitial_conditions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 453\u001b[39m \u001b[43m \u001b[49m\u001b[43mall_redshifts\u001b[49m\u001b[43m=\u001b[49m\u001b[43mscrollz\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 454\u001b[39m \u001b[43m \u001b[49m\u001b[43mperturbed_field\u001b[49m\u001b[43m=\u001b[49m\u001b[43mperturbed_fields\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 455\u001b[39m \u001b[43m \u001b[49m\u001b[43mpt_halos\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpt_halos\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 456\u001b[39m \u001b[43m \u001b[49m\u001b[43mwrite\u001b[49m\u001b[43m=\u001b[49m\u001b[43mwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 457\u001b[39m \u001b[43m \u001b[49m\u001b[43mcleanup\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcleanup\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 458\u001b[39m \u001b[43m \u001b[49m\u001b[43malways_purge\u001b[49m\u001b[43m=\u001b[49m\u001b[43malways_purge\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 459\u001b[39m \u001b[43m \u001b[49m\u001b[43mphoton_nonconservation_data\u001b[49m\u001b[43m=\u001b[49m\u001b[43mphoton_nonconservation_data\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 460\u001b[39m \u001b[43m \u001b[49m\u001b[43mstart_idx\u001b[49m\u001b[43m=\u001b[49m\u001b[43mlightcone\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_last_completed_node\u001b[49m\u001b[43m \u001b[49m\u001b[43m+\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 461\u001b[39m \u001b[43m \u001b[49m\u001b[43minit_coeval\u001b[49m\u001b[43m=\u001b[49m\u001b[43mprev_coeval\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 462\u001b[39m \u001b[43m \u001b[49m\u001b[43miokw\u001b[49m\u001b[43m=\u001b[49m\u001b[43miokw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 463\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 464\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 465\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Save mean/global quantities\u001b[39;49;00m\n\u001b[32m 466\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mquantity\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mglobal_quantities\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 467\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mquantity\u001b[49m\u001b[43m \u001b[49m\u001b[43m==\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mlog10_mturn_acg\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/drivers/coeval.py:587\u001b[39m, in \u001b[36m_redshift_loop_generator\u001b[39m\u001b[34m(inputs, initial_conditions, all_redshifts, perturbed_field, pt_halos, write, iokw, cleanup, always_purge, photon_nonconservation_data, start_idx, init_coeval)\u001b[39m\n\u001b[32m 576\u001b[39m xrs = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 578\u001b[39m this_spin_temp = sf.compute_spin_temperature(\n\u001b[32m 579\u001b[39m previous_spin_temp=\u001b[38;5;28mgetattr\u001b[39m(prev_coeval, \u001b[33m\"\u001b[39m\u001b[33mts_box\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[32m 580\u001b[39m perturbed_field=this_perturbed_field,\n\u001b[32m (...)\u001b[39m\u001b[32m 584\u001b[39m cleanup=(cleanup \u001b[38;5;129;01mand\u001b[39;00m z == all_redshifts[-\u001b[32m1\u001b[39m]),\n\u001b[32m 585\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m587\u001b[39m this_ionized_box = \u001b[43msf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcompute_ionization_field\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 588\u001b[39m \u001b[43m \u001b[49m\u001b[43mprevious_ionized_box\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mprev_coeval\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mionized_box\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 589\u001b[39m \u001b[43m \u001b[49m\u001b[43mperturbed_field\u001b[49m\u001b[43m=\u001b[49m\u001b[43mthis_perturbed_field\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 590\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# perturb field *not* interpolated here.\u001b[39;49;00m\n\u001b[32m 591\u001b[39m \u001b[43m \u001b[49m\u001b[43mprevious_perturbed_field\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mprev_coeval\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mperturbed_field\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 592\u001b[39m \u001b[43m \u001b[49m\u001b[43mhalobox\u001b[49m\u001b[43m=\u001b[49m\u001b[43mthis_halobox\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 593\u001b[39m \u001b[43m \u001b[49m\u001b[43mspin_temp\u001b[49m\u001b[43m=\u001b[49m\u001b[43mthis_spin_temp\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 594\u001b[39m \u001b[43m \u001b[49m\u001b[43mwrite\u001b[49m\u001b[43m=\u001b[49m\u001b[43mwrite\u001b[49m\u001b[43m.\u001b[49m\u001b[43mionized_box\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 595\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 596\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 598\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m prev_coeval \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 599\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m contextlib.suppress(\u001b[38;5;167;01mOSError\u001b[39;00m):\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/drivers/_param_config.py:465\u001b[39m, in \u001b[36msingle_field_func.__call__\u001b[39m\u001b[34m(self, **kwargs)\u001b[39m\n\u001b[32m 463\u001b[39m \u001b[38;5;28mself\u001b[39m._broadcast_inputs(inputs)\n\u001b[32m 464\u001b[39m \u001b[38;5;28mself\u001b[39m._make_wisdoms(inputs)\n\u001b[32m--> \u001b[39m\u001b[32m465\u001b[39m out = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_func\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 466\u001b[39m \u001b[38;5;28mself\u001b[39m._handle_write_to_cache(cache, write, out)\n\u001b[32m 468\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m out\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/drivers/single_field.py:671\u001b[39m, in \u001b[36mcompute_ionization_field\u001b[39m\u001b[34m(perturbed_field, initial_conditions, inputs, previous_perturbed_field, previous_ionized_box, spin_temp, halobox)\u001b[39m\n\u001b[32m 668\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mNo spin temperature box given but USE_TS_FLUCT=True\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 670\u001b[39m \u001b[38;5;66;03m# Run the C Code\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m671\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbox\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 672\u001b[39m \u001b[43m \u001b[49m\u001b[43mperturbed_field\u001b[49m\u001b[43m=\u001b[49m\u001b[43mperturbed_field\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 673\u001b[39m \u001b[43m \u001b[49m\u001b[43mprev_perturbed_field\u001b[49m\u001b[43m=\u001b[49m\u001b[43mprevious_perturbed_field\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 674\u001b[39m \u001b[43m \u001b[49m\u001b[43mprev_ionize_box\u001b[49m\u001b[43m=\u001b[49m\u001b[43mprevious_ionized_box\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 675\u001b[39m \u001b[43m \u001b[49m\u001b[43mspin_temp\u001b[49m\u001b[43m=\u001b[49m\u001b[43mspin_temp\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 676\u001b[39m \u001b[43m \u001b[49m\u001b[43mhalobox\u001b[49m\u001b[43m=\u001b[49m\u001b[43mhalobox\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 677\u001b[39m \u001b[43m \u001b[49m\u001b[43mics\u001b[49m\u001b[43m=\u001b[49m\u001b[43minitial_conditions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 678\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/wrapper/outputs.py:1335\u001b[39m, in \u001b[36mIonizedBox.compute\u001b[39m\u001b[34m(self, perturbed_field, prev_perturbed_field, prev_ionize_box, spin_temp, halobox, ics, allow_already_computed)\u001b[39m\n\u001b[32m 1323\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[34mcompute\u001b[39m(\n\u001b[32m 1324\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 1325\u001b[39m *,\n\u001b[32m (...)\u001b[39m\u001b[32m 1332\u001b[39m allow_already_computed: \u001b[38;5;28mbool\u001b[39m = \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[32m 1333\u001b[39m ):\n\u001b[32m 1334\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Compute the function.\"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1335\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_compute\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1336\u001b[39m \u001b[43m \u001b[49m\u001b[43mallow_already_computed\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1337\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mredshift\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1338\u001b[39m \u001b[43m \u001b[49m\u001b[43mprev_perturbed_field\u001b[49m\u001b[43m.\u001b[49m\u001b[43mredshift\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1339\u001b[39m \u001b[43m \u001b[49m\u001b[43mperturbed_field\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1340\u001b[39m \u001b[43m \u001b[49m\u001b[43mprev_perturbed_field\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1341\u001b[39m \u001b[43m \u001b[49m\u001b[43mprev_ionize_box\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1342\u001b[39m \u001b[43m \u001b[49m\u001b[43mspin_temp\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1343\u001b[39m \u001b[43m \u001b[49m\u001b[43mhalobox\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1344\u001b[39m \u001b[43m \u001b[49m\u001b[43mics\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1345\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/21cmfast/lib/python3.13/site-packages/py21cmfast/wrapper/outputs.py:471\u001b[39m, in \u001b[36mOutputStruct._compute\u001b[39m\u001b[34m(self, allow_already_computed, *args)\u001b[39m\n\u001b[32m 469\u001b[39m \u001b[38;5;66;03m# Perform the C computation\u001b[39;00m\n\u001b[32m 470\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m471\u001b[39m exitcode = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_c_compute_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcstruct\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 472\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 473\u001b[39m logger.error(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mArguments to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m._c_compute_function.\u001b[34m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00minputs\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n", "\u001b[31mKeyboardInterrupt\u001b[39m: " ] } ], "source": [ "lcn = p21c.RectilinearLightconer.with_equal_cdist_slices(\n", " min_redshift=min(inputs.node_redshifts),\n", " max_redshift=max(inputs.node_redshifts),\n", " quantities=lightcone_quantities,\n", " resolution=inputs.simulation_options.cell_size,\n", ")\n", "\n", "_, _, _, lightcone_fid_vcb = p21c.run_lightcone(\n", " lightconer=lcn, \n", " initial_conditions=initial_conditions,\n", " global_quantities=lightcone_quantities,\n", " cache=p21c.OutputCache(output_dir),\n", " write=True,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig, axs = plt.subplots(\n", " len(lightcone_quantities), 1, figsize=(20, 10)\n", ")\n", "for ii, lightcone_quantity in enumerate(lightcone_quantities):\n", " axs[ii].imshow(\n", " lightcone_fid_vcb.lightcones[lightcone_quantity][1],\n", " vmin=vmins[ii],\n", " vmax=vmaxs[ii],\n", " cmap=cmaps[ii],\n", " )\n", " axs[ii].text(\n", " 1,\n", " 0.05,\n", " lightcone_quantity,\n", " horizontalalignment=\"right\",\n", " verticalalignment=\"bottom\",\n", " transform=axs[ii].transAxes,\n", " color=\"red\",\n", " backgroundcolor=\"white\",\n", " fontsize=15,\n", " )\n", " axs[ii].xaxis.set_tick_params(labelsize=10)\n", " axs[ii].yaxis.set_tick_params(labelsize=0)\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.01)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# also run one without velocities and with fixed vcb=vavg (for comparison)\n", "lightcone_fid_novcb = p21c.run_lightcone(\n", " lightconer=lcn, \n", " inputs=inputs_no_vcb,\n", " initial_conditions=initial_conditions,\n", " global_quantities=lightcone_quantities,\n", " cache=p21c.OutputCache(output_dir),\n", " write=True,\n", ")\n", "\n", "lightcone_fid_vcbavg = p21c.run_lightcone(\n", " lightconer=lcn, \n", " inputs=inputs_vavg,\n", " initial_conditions=initial_conditions,\n", " global_quantities=lightcone_quantities,\n", " cache=p21c.OutputCache(output_dir),\n", " write=True,\n", ")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# plus run one with only atomic-cooling galaxies but same otherwise\n", "inputs_acg = inputs.evolve_input_structs(USE_MINI_HALOS=False)\n", "lightcone_fid_acg = p21c.run_lightcone(\n", " lightconer=lcn, \n", " inputs=inputs_acg,\n", " initial_conditions=initial_conditions,\n", " global_quantities=lightcone_quantities,\n", " cache=p21c.OutputCache(output_dir),\n", " write=True,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# compare vcb and novcb\n", "\n", "fig, axs = plt.subplots(2, 1, figsize=(20, 6))\n", "\n", "axs[0].imshow(\n", " lightcone_fid_vcb.brightness_temp[1], vmin=vmins[0], vmax=vmaxs[0], cmap=cmaps[0]\n", ")\n", "axs[1].imshow(\n", " lightcone_fid_novcb.brightness_temp[1], vmin=vmins[0], vmax=vmaxs[0], cmap=cmaps[0]\n", ")\n", "axs[0].text(\n", " 1,\n", " 0.05,\n", " \"vcb\",\n", " horizontalalignment=\"right\",\n", " verticalalignment=\"bottom\",\n", " transform=axs[0].transAxes,\n", " color=\"red\",\n", " backgroundcolor=\"white\",\n", " fontsize=15,\n", ")\n", "axs[1].text(\n", " 1,\n", " 0.05,\n", " \"novcb\",\n", " horizontalalignment=\"right\",\n", " verticalalignment=\"bottom\",\n", " transform=axs[1].transAxes,\n", " color=\"red\",\n", " backgroundcolor=\"white\",\n", " fontsize=15,\n", ")\n", "# axs[0].xaxis.set_tick_params(labelsize=10)\n", "# axs[1].yaxis.set_tick_params(labelsize=0)\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.01)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# plot tau\n", "\n", "tau_vcb = tau_novcb = tau_NOMINI = np.array([])\n", "for il, lightcone in enumerate(\n", " [lightcone_fid_vcb, lightcone_fid_novcb, lightcone_fid_acg]\n", "):\n", " z_e = np.array([])\n", " tau_e = np.array([])\n", " for i in range(len(lightcone.node_redshifts) - 1):\n", " tauz = p21c.compute_tau(\n", " redshifts=lightcone.node_redshifts[-1 : -2 - i : -1],\n", " global_xHI=lightcone.global_xHI[-1 : -2 - i : -1],\n", " )\n", " tau_e = np.append(tau_e, tauz)\n", " z_e = np.append(z_e, lightcone.node_redshifts[-2 - i])\n", "\n", " # add lower zs where we manually set xH=1\n", " zlow = np.linspace(lightcone.node_redshifts[-1] - 0.1, 0.1, 14)\n", " for zl in zlow:\n", " tauz = p21c.compute_tau(\n", " redshifts=np.array([zl]), global_xHI=np.array([lightcone.global_xHI[-1]])\n", " )\n", " tau_e = np.append([tauz], tau_e)\n", " z_e = np.append([zl], z_e)\n", "\n", " if il == 0:\n", " tau_vcb = tau_e\n", " elif il == 1:\n", " tau_novcb = tau_e\n", " else:\n", " tau_NOMINI = tau_e\n", "\n", "\n", "linestyles = [\"-\", \"-.\", \":\"]\n", "colors = [\"black\", \"gray\", \"#377eb8\"]\n", "lws = [3, 1, 2]\n", "\n", "fig, axs = plt.subplots(1, 1, sharex=True, figsize=(8, 4))\n", "\n", "kk = 0\n", "axs.plot(\n", " z_e, tau_vcb, label=\"vcb\", color=colors[kk], linestyle=linestyles[kk], lw=lws[kk]\n", ")\n", "kk = 1\n", "axs.plot(\n", " z_e,\n", " tau_novcb,\n", " label=\"no vcb\",\n", " color=colors[kk],\n", " linestyle=linestyles[kk],\n", " lw=lws[kk],\n", ")\n", "kk = 2\n", "axs.plot(\n", " z_e,\n", " tau_NOMINI,\n", " label=\"no MINI\",\n", " color=colors[kk],\n", " linestyle=linestyles[kk],\n", " lw=lws[kk],\n", ")\n", "\n", "axs.set_ylim(0.0, 0.1)\n", "axs.set_xlabel(\"redshift\", fontsize=15)\n", "axs.xaxis.set_tick_params(labelsize=15)\n", "\n", "axs.set_xlim(0.0, 20.0)\n", "axs.set_ylabel(\"$\\\\tau$\", fontsize=15)\n", "axs.yaxis.set_tick_params(labelsize=15)\n", "\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.0, wspace=0.0)\n", "\n", "tauPmin = 0.0561 - 0.0071\n", "tauPmax = 0.0561 + 0.0071\n", "axs.axhspan(tauPmin, tauPmax, alpha=0.34, color=\"black\")\n", "axs.grid()\n", "\n", "# Planck2020: tau=0.0561±0.0071" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# check that the tau z=15-30 is below 0.02 as Planck requires\n", "tau_vcb[-1] - tau_vcb[55]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "linestyles = [\"-\", \"-.\", \":\"]\n", "colors = [\"black\", \"gray\", \"#377eb8\"]\n", "lws = [3, 1, 2]\n", "labels = [\"vcb\", \"no vcb\", \"no MINI\"]\n", "\n", "fig, axs = plt.subplots(1, 1, sharex=True, figsize=(8, 4))\n", "\n", "for kk, lightcone in enumerate(\n", " [lightcone_fid_vcb, lightcone_fid_novcb, lightcone_fid_acg]\n", "):\n", " axs.plot(\n", " lightcone.node_redshifts,\n", " lightcone.global_xHI,\n", " label=labels[kk],\n", " color=colors[kk],\n", " linestyle=linestyles[kk],\n", " lw=lws[kk],\n", " )\n", "\n", "axs.set_ylim(0.0, 1.0)\n", "axs.set_xlabel(\"redshift\", fontsize=15)\n", "axs.xaxis.set_tick_params(labelsize=15)\n", "\n", "axs.set_xlim(5.0, 20.0)\n", "axs.set_ylabel(\"$x_{HI}$\", fontsize=15)\n", "axs.yaxis.set_tick_params(labelsize=15)\n", "\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.0, wspace=0.0)\n", "\n", "axs.grid()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "runcache = p21c.RunCache.from_inputs(inputs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# choose a redshift to print coeval slices and see if there are VAOs. Usually best then T21~T21min/2\n", "zz = zlist21[40]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# We plot a coeval box, but we compare the vcb case against the vcb=vavg, since the no velocity (vcb=0) case has a background evolution that is too different.\n", "coeval_fid_vcb = runcache.get_coeval_at_z(inputs.node_redshifts)\n", "p21c.run_coeval(\n", " redshift=zz,\n", " init_box=initial_conditions,\n", " flag_options=flag_options_fid,\n", " astro_params=astro_params_vcb,\n", " random_seed=random_seed,\n", " direc=output_dir,\n", " write=True, # , regenerate=True\n", ")\n", "\n", "coeval_fid_vcbavg = p21c.run_coeval(\n", " redshift=zz,\n", " init_box=initial_conditions,\n", " flag_options=flag_options_fid_vavg,\n", " astro_params=astro_params_vcb,\n", " random_seed=random_seed,\n", " direc=output_dir,\n", " write=True, # , regenerate=True\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "T21slice_vcb = coeval_fid_vcb.brightness_temp\n", "T21avg_vcb = np.mean(T21slice_vcb)\n", "dT21slice_vcb = T21slice_vcb - T21avg_vcb\n", "\n", "T21slice_novcb = coeval_fid_vcbavg.brightness_temp\n", "T21avg_novcb = np.mean(T21slice_novcb)\n", "dT21slice_novcb = T21slice_novcb - T21avg_novcb\n", "\n", "\n", "sigma21 = np.sqrt(np.var(dT21slice_vcb))\n", "\n", "T21maxplot = 3.0 * sigma21\n", "T21minplot = -2.0 * sigma21\n", "\n", "\n", "origin = \"lower\"\n", "extend = \"both\"\n", "\n", "origin = None\n", "extend = \"neither\"\n", "\n", "xx = np.linspace(0, BOX_LEN, HII_DIM, endpoint=False)\n", "yy = xx\n", "\n", "\n", "indexv = 0\n", "\n", "fig, ax = plt.subplots(\n", " 2,\n", " 2,\n", " constrained_layout=True,\n", " figsize=(10, 8),\n", " sharex=\"col\",\n", " sharey=\"row\",\n", " gridspec_kw={\"hspace\": 0, \"wspace\": 0},\n", ")\n", "\n", "cs0 = ax[0, 0].contourf(\n", " xx,\n", " yy,\n", " dT21slice_novcb[indexv],\n", " extend=extend,\n", " origin=origin,\n", " vmin=T21minplot,\n", " vmax=T21maxplot,\n", " cmap=\"bwr\",\n", ")\n", "fig.colorbar(cs0, ax=ax[0, 0], shrink=0.9, location=\"left\")\n", "cs1 = ax[0, 1].contourf(\n", " xx,\n", " yy,\n", " dT21slice_vcb[indexv],\n", " extend=extend,\n", " origin=origin,\n", " vmin=T21minplot,\n", " vmax=T21maxplot,\n", " cmap=\"bwr\",\n", ")\n", "fig.colorbar(cs1, ax=ax[0, 1], shrink=0.9)\n", "\n", "\n", "deltaslice = initial_conditions.lowres_density\n", "deltaavg = np.mean(deltaslice)\n", "ddeltaslice = deltaslice - deltaavg\n", "\n", "vcbslice = initial_conditions.lowres_vcb\n", "vcbavg = np.mean(vcbslice)\n", "dvcbslice = vcbslice\n", "\n", "\n", "csd = ax[1, 0].contourf(xx, yy, ddeltaslice[indexv])\n", "fig.colorbar(csd, ax=ax[1, 0], shrink=0.9, location=\"left\")\n", "csv = ax[1, 1].contourf(xx, yy, dvcbslice[indexv])\n", "fig.colorbar(csv, ax=ax[1, 1], shrink=0.9, extend=extend)\n", "plt.show()\n", "\n", "plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "global_quantities = (\n", " \"brightness_temp\",\n", " \"spin_temperature\",\n", " \"neutral_fraction\",\n", " \"cumulative_recombinations\",\n", " \"z_reion\",\n", " \"ionisation_rate_G12\",\n", " \"J_21_LW\",\n", " \"density\",\n", ")\n", "# choose some to plot...\n", "plot_quantities = (\n", " \"brightness_temp\",\n", " \"spin_temperature\",\n", " \"neutral_fraction\",\n", " \"cumulative_recombinations\",\n", " \"ionisation_rate_G12\",\n", " \"J_21_LW\",\n", ")\n", "ymins = [-120, 1e1, 0, 0, 0, 0]\n", "ymaxs = [30, 1e3, 1, 1, 1, 5]\n", "linestyles = [\"-\", \"-\", \":\", \"-.\", \"-.\", \":\"]\n", "colors = [\"gray\", \"black\", \"#e41a1c\", \"#377eb8\", \"#e41a1c\", \"#377eb8\"]\n", "lws = [2, 2, 2, 2]\n", "\n", "textss = [\"vcb\", \"MCGs\"]\n", "factorss = [\n", " [0, 1],\n", "] * len(textss)\n", "labelss = [\n", " [\"NO\", \"reference\"],\n", "] * len(textss)\n", "\n", "\n", "fig, axss = plt.subplots(\n", " len(plot_quantities),\n", " len(labelss),\n", " sharex=True,\n", " figsize=(4 * len(labelss), 2 * len(plot_quantities)),\n", ")\n", "\n", "for pp, texts in enumerate(textss):\n", " labels = labelss[pp]\n", " factors = factorss[pp]\n", " axs = axss[:, pp]\n", " for kk, label in enumerate(labels):\n", " factor = factors[kk]\n", "\n", " if kk == 0:\n", " lightcone = lightcone_fid_acg if pp == 0 else lightcone_fid_novcb\n", " else:\n", " lightcone = lightcone_fid_vcb\n", "\n", " freqs = 1420.4 / (np.array(lightcone.node_redshifts) + 1.0)\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs[jj].plot(\n", " freqs,\n", " getattr(\n", " lightcone, \"global_{}\".format(global_quantity.replace(\"_box\", \"\"))\n", " ),\n", " color=colors[kk],\n", " linestyle=linestyles[kk],\n", " label=labels[kk],\n", " lw=lws[kk],\n", " )\n", "\n", " axs[0].text(\n", " 0.01,\n", " 0.99,\n", " texts,\n", " horizontalalignment=\"right\",\n", " verticalalignment=\"bottom\",\n", " transform=axs[0].transAxes,\n", " fontsize=15,\n", " )\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs[jj].set_ylim(ymins[jj], ymaxs[jj])\n", " axs[-1].set_xlabel(\"Frequency/MHz\", fontsize=15)\n", " axs[-1].xaxis.set_tick_params(labelsize=15)\n", "\n", " axs[0].set_xlim(1420.4 / (35 + 1.0), 1420.4 / (5.5 + 1.0))\n", " zlabels = np.array([6, 7, 8, 10, 13, 18, 25, 35])\n", " ax2 = axs[0].twiny()\n", " ax2.set_xlim(axs[0].get_xlim())\n", " ax2.set_xticks(1420.4 / (zlabels + 1.0))\n", " ax2.set_xticklabels(zlabels.astype(str))\n", " ax2.set_xlabel(\"redshift\", fontsize=15)\n", " ax2.xaxis.set_tick_params(labelsize=15)\n", " ax2.grid(False)\n", "\n", " if pp == 0:\n", " axs[0].legend(\n", " loc=\"lower right\", ncol=2, fontsize=13, fancybox=True, frameon=True\n", " )\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs[jj].set_ylabel(\n", " \"global_{}\".format(global_quantity.replace(\"_box\", \"\")), fontsize=15\n", " )\n", " axs[jj].yaxis.set_tick_params(labelsize=15)\n", " else:\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs[jj].set_ylabel(\n", " \"global_{}\".format(global_quantity.replace(\"_box\", \"\")), fontsize=0\n", " )\n", " axs[jj].yaxis.set_tick_params(labelsize=0)\n", "\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.0, wspace=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Varying parameters" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "let's vary the parameters that describe mini-halos and see the impact to the global signal.\n", "Warning: It may take a while to run all these boxes!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We keep other parameters fixed and vary one of following by a factor of 1/3 and 3:\n", "\n", " F_STAR7_MINI\n", " F_ESC7_MINI\n", " L_X_MINI\n", " A_LW\n", " \n", "We also have a NOmini model where mini-halos are not included" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# defining those color, linstyle, blabla\n", "linestyles = [\"-\", \"-\", \":\", \"-.\", \"-.\", \":\"]\n", "colors = [\"gray\", \"black\", \"#e41a1c\", \"#377eb8\", \"#e41a1c\", \"#377eb8\"]\n", "lws = [1, 3, 2, 2, 2, 2]\n", "\n", "textss = [\n", " \"varying \" + r\"$f_{*,7}^{\\rm mol}$\",\n", " \"varying \" + r\"$f_{\\rm esc}^{\\rm mol}$\",\n", " \"varying \" + r\"$L_{\\rm x}^{\\rm mol}$\",\n", " \"varying \" + r\"$A_{\\rm LW}$\",\n", "]\n", "factorss = [\n", " [0, 1, 0.33, 3.0],\n", "] * len(textss)\n", "labelss = [\n", " [\"No Velocity\", \"Fiducial\", \"/3\", \"x3\"],\n", "] * len(textss)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2020-03-14T21:28:24.543996Z", "start_time": "2020-03-14T21:28:24.540228Z" }, "scrolled": true }, "outputs": [], "source": [ "global_quantities = (\n", " \"brightness_temp\",\n", " \"spin_temperature\",\n", " \"neutral_fraction\",\n", " \"cumulative_recombinations\",\n", " \"z_reion\",\n", " \"ionisation_rate_G12\",\n", " \"J_21_LW\",\n", " \"density\",\n", ")\n", "# choose some to plot...\n", "plot_quantities = (\n", " \"brightness_temp\",\n", " \"spin_temperature\",\n", " \"neutral_fraction\",\n", " \"cumulative_recombinations\",\n", " \"ionisation_rate_G12\",\n", " \"J_21_LW\",\n", ")\n", "ymins = [-120, 1e1, 0, 0, 0, 0]\n", "ymaxs = [30, 1e3, 1, 1, 1, 10]\n", "\n", "fig, axss = plt.subplots(\n", " len(plot_quantities),\n", " len(labelss),\n", " sharex=True,\n", " figsize=(4 * len(labelss), 2 * len(global_quantities)),\n", ")\n", "\n", "for pp, texts in enumerate(textss):\n", " labels = labelss[pp]\n", " factors = factorss[pp]\n", " axs = axss[:, pp]\n", " for kk, label in enumerate(labels):\n", " flag_options = flag_options_fid.copy()\n", " astro_params = astro_params_vcb.copy()\n", " factor = factors[kk]\n", " if label == \"No Velocity\":\n", " lightcone = lightcone_fid_novcb\n", " elif label == \"Fiducial\":\n", " lightcone = lightcone_fid_vcb\n", " else:\n", " if pp == 0:\n", " astro_params.update(\n", " {\n", " \"F_STAR7_MINI\": astro_params_vcb[\"F_STAR7_MINI\"]\n", " + np.log10(factor)\n", " }\n", " )\n", " elif pp == 1:\n", " astro_params.update(\n", " {\"F_ESC7_MINI\": astro_params_vcb[\"F_ESC7_MINI\"] + np.log10(factor)}\n", " )\n", " elif pp == 2:\n", " astro_params.update(\n", " {\"L_X_MINI\": astro_params_vcb[\"L_X_MINI\"] + np.log10(factor)}\n", " )\n", " elif pp == 3:\n", " astro_params.update({\"A_LW\": astro_params_vcb[\"A_LW\"] * factor})\n", " else:\n", " pass\n", "\n", " lightcone = p21c.run_lightcone(\n", " redshift=ZMIN,\n", " init_box=initial_conditions,\n", " flag_options=flag_options_fid,\n", " astro_params=astro_params,\n", " global_quantities=global_quantities,\n", " random_seed=random_seed,\n", " direc=output_dir,\n", " )\n", "\n", " freqs = 1420.4 / (np.array(lightcone.node_redshifts) + 1.0)\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs[jj].plot(\n", " freqs,\n", " getattr(\n", " lightcone, \"global_{}\".format(global_quantity.replace(\"_box\", \"\"))\n", " ),\n", " color=colors[kk],\n", " linestyle=linestyles[kk],\n", " label=labels[kk],\n", " lw=lws[kk],\n", " )\n", "\n", " axs[0].text(\n", " 0.01,\n", " 0.99,\n", " texts,\n", " horizontalalignment=\"left\",\n", " verticalalignment=\"top\",\n", " transform=axs[0].transAxes,\n", " fontsize=15,\n", " )\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs[jj].set_ylim(ymins[jj], ymaxs[jj])\n", " axs[-1].set_xlabel(\"Frequency/MHz\", fontsize=15)\n", " axs[-1].xaxis.set_tick_params(labelsize=15)\n", "\n", " axs[0].set_xlim(1420.4 / (35 + 1.0), 1420.4 / (5.5 + 1.0))\n", " zlabels = np.array([6, 7, 8, 10, 13, 18, 25, 35])\n", " ax2 = axs[0].twiny()\n", " ax2.set_xlim(axs[0].get_xlim())\n", " ax2.set_xticks(1420.4 / (zlabels + 1.0))\n", " ax2.set_xticklabels(zlabels.astype(str))\n", " ax2.set_xlabel(\"redshift\", fontsize=15)\n", " ax2.xaxis.set_tick_params(labelsize=15)\n", " ax2.grid(False)\n", "\n", " if pp == 0:\n", " axs[0].legend(\n", " loc=\"lower right\", ncol=2, fontsize=13, fancybox=True, frameon=True\n", " )\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs[jj].set_ylabel(\n", " \"global_{}\".format(global_quantity.replace(\"_box\", \"\")), fontsize=15\n", " )\n", " axs[jj].yaxis.set_tick_params(labelsize=15)\n", " else:\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs[jj].set_ylabel(\n", " \"global_{}\".format(global_quantity.replace(\"_box\", \"\")), fontsize=0\n", " )\n", " axs[jj].yaxis.set_tick_params(labelsize=0)\n", "\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.0, wspace=0.0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2020-03-14T23:04:29.138653Z", "start_time": "2020-03-14T23:04:28.772417Z" } }, "outputs": [], "source": [ "# define functions to calculate PS, following py21cmmc\n", "from powerbox.tools import get_power\n", "\n", "\n", "def compute_power(\n", " box,\n", " length,\n", " n_psbins,\n", " log_bins=True,\n", " ignore_kperp_zero=True,\n", " ignore_kpar_zero=False,\n", " ignore_k_zero=False,\n", "):\n", " # Determine the weighting function required from ignoring k's.\n", " k_weights = np.ones(box.shape, dtype=int)\n", " n0 = k_weights.shape[0]\n", " n1 = k_weights.shape[-1]\n", "\n", " if ignore_kperp_zero:\n", " k_weights[n0 // 2, n0 // 2, :] = 0\n", " if ignore_kpar_zero:\n", " k_weights[:, :, n1 // 2] = 0\n", " if ignore_k_zero:\n", " k_weights[n0 // 2, n0 // 2, n1 // 2] = 0\n", "\n", " res = get_power(\n", " box,\n", " boxlength=length,\n", " bins=n_psbins,\n", " bin_ave=False,\n", " get_variance=False,\n", " log_bins=log_bins,\n", " k_weights=k_weights,\n", " )\n", "\n", " res = list(res)\n", " k = res[1]\n", " if log_bins:\n", " k = np.exp((np.log(k[1:]) + np.log(k[:-1])) / 2)\n", " else:\n", " k = (k[1:] + k[:-1]) / 2\n", "\n", " res[1] = k\n", " return res\n", "\n", "\n", "def powerspectra(\n", " brightness_temp, n_psbins=50, nchunks=10, min_k=0.1, max_k=1.0, logk=True\n", "):\n", " data = []\n", " chunk_indices = list(\n", " range(\n", " 0,\n", " brightness_temp.n_slices,\n", " round(brightness_temp.n_slices / nchunks),\n", " )\n", " )\n", "\n", " if len(chunk_indices) > nchunks:\n", " chunk_indices = chunk_indices[:-1]\n", " chunk_indices.append(brightness_temp.n_slices)\n", "\n", " for i in range(nchunks):\n", " start = chunk_indices[i]\n", " end = chunk_indices[i + 1]\n", " chunklen = (end - start) * brightness_temp.cell_size\n", "\n", " power, k = compute_power(\n", " brightness_temp.brightness_temp[:, :, start:end],\n", " (BOX_LEN, BOX_LEN, chunklen),\n", " n_psbins,\n", " log_bins=logk,\n", " )\n", " data.append({\"k\": k, \"delta\": power * k**3 / (2 * np.pi**2)})\n", " return data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# do 5 chunks but only plot 1 - 4, the 0th has no power for minihalo models where xH=0\n", "nchunks = 4\n", "k_fundamental = 2 * np.pi / BOX_LEN\n", "k_max = k_fundamental * HII_DIM\n", "Nk = np.floor(HII_DIM / 1).astype(int)\n", "\n", "fig, axss = plt.subplots(\n", " nchunks,\n", " len(labelss),\n", " sharex=True,\n", " sharey=True,\n", " figsize=(4 * len(labelss), 3 * (nchunks)),\n", " subplot_kw={\"xscale\": \"log\", \"yscale\": \"log\"},\n", ")\n", "\n", "for pp, texts in enumerate(textss):\n", " labels = labelss[pp]\n", " factors = factorss[pp]\n", " axs = axss[:, pp]\n", " for kk, label in enumerate(labels):\n", " flag_options = flag_options_fid.copy()\n", " astro_params = astro_params_vcb.copy()\n", " factor = factors[kk]\n", " if label == \"No Velocity\":\n", " lightcone = lightcone_fid_novcb\n", " elif label == \"Fiducial\":\n", " lightcone = lightcone_fid_vcb\n", " else:\n", " if pp == 0:\n", " astro_params.update(\n", " {\n", " \"F_STAR7_MINI\": astro_params_vcb[\"F_STAR7_MINI\"]\n", " + np.log10(factor)\n", " }\n", " )\n", " elif pp == 1:\n", " astro_params.update(\n", " {\"F_ESC7_MINI\": astro_params_vcb[\"F_ESC7_MINI\"] + np.log10(factor)}\n", " )\n", " elif pp == 2:\n", " astro_params.update(\n", " {\"L_X_MINI\": astro_params_vcb[\"L_X_MINI\"] + np.log10(factor)}\n", " )\n", " elif pp == 3:\n", " astro_params.update(\n", " {\"A_LW\": astro_params_vcb[\"A_LW\"] + np.log10(factor)}\n", " )\n", " else:\n", " pass\n", "\n", " lightcone = p21c.run_lightcone(\n", " redshift=ZMIN,\n", " init_box=initial_conditions,\n", " flag_options=flag_options_fid,\n", " astro_params=astro_params,\n", " global_quantities=global_quantities,\n", " random_seed=random_seed,\n", " direc=output_dir,\n", " )\n", "\n", " PS = powerspectra(lightcone, min_k=k_fundamental, max_k=k_max)\n", "\n", " for ii in range(nchunks):\n", " axs[ii].plot(\n", " PS[ii + 1][\"k\"],\n", " PS[ii + 1][\"delta\"],\n", " color=colors[kk],\n", " linestyle=linestyles[kk],\n", " label=labels[kk],\n", " lw=lws[kk],\n", " )\n", "\n", " if pp == len(textss) - 1 and kk == 0:\n", " axs[ii].text(\n", " 0.99,\n", " 0.01,\n", " \"Chunk-%02d\" % (ii + 1),\n", " horizontalalignment=\"right\",\n", " verticalalignment=\"bottom\",\n", " transform=axs[ii].transAxes,\n", " fontsize=15,\n", " )\n", "\n", " axs[0].text(\n", " 0.01,\n", " 0.99,\n", " texts,\n", " horizontalalignment=\"left\",\n", " verticalalignment=\"top\",\n", " transform=axs[0].transAxes,\n", " fontsize=15,\n", " )\n", "\n", " axs[-1].set_xlabel(\"$k$ [Mpc$^{-3}$]\", fontsize=15)\n", " axs[-1].xaxis.set_tick_params(labelsize=15)\n", "\n", " if pp == 0:\n", " for ii in range(nchunks):\n", " axs[ii].set_ylim(2e-1, 2e2)\n", " axs[ii].set_ylabel(\"$k^3 P$\", fontsize=15)\n", " axs[ii].yaxis.set_tick_params(labelsize=15)\n", " else:\n", " for ii in range(nchunks - 1):\n", " axs[ii].set_ylim(2e-1, 2e2)\n", " axs[ii].set_ylabel(\"$k^3 P$\", fontsize=0)\n", " axs[ii].yaxis.set_tick_params(labelsize=0)\n", "\n", "axss[0, 0].legend(loc=\"lower left\", ncol=2, fontsize=13, fancybox=True, frameon=True)\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.0, wspace=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that I've run these simulations in parallel before this tutorial. With these setup, each took ~6h to finish. Here, running means read the cached outputs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## global properties -- optical depth" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# defining those color, linstyle, blabla\n", "linestyles = [\"-\", \"-\", \":\", \"-.\", \"-.\", \":\"]\n", "colors = [\"gray\", \"black\", \"#e41a1c\", \"#377eb8\", \"#e41a1c\", \"#377eb8\"]\n", "lws = [1, 3, 2, 2, 2, 2]\n", "\n", "textss_tau = [\n", " \"varying \" + r\"$f_{*,7}^{\\rm mol}$\",\n", " \"varying \" + r\"$f_{\\rm esc}^{\\rm mol}$\",\n", " \"varying \" + r\"$A_{\\rm LW}$\",\n", "]\n", "\n", "factorss_tau = [\n", " [0, 1, 0.33, 3.0],\n", "] * len(textss_tau)\n", "labelss_tau = [\n", " [\"No Velocity\", \"Fiducial\", \"/3\", \"x3\"],\n", "] * len(textss_tau)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2020-03-14T23:03:40.364465Z", "start_time": "2020-03-14T23:03:38.244179Z" }, "scrolled": true }, "outputs": [], "source": [ "plot_quantities = [\"tau_e\"]\n", "ymins = [0]\n", "ymaxs = [0.2]\n", "\n", "\n", "fig, axss_tau = plt.subplots(\n", " len(plot_quantities),\n", " len(labelss_tau),\n", " sharex=True,\n", " figsize=(4 * len(labelss_tau), 3 * len(plot_quantities)),\n", ")\n", "\n", "\n", "for pp, texts in enumerate(textss_tau):\n", " labels = labelss_tau[pp]\n", " factors = factorss_tau[pp]\n", " axs = axss_tau[pp]\n", " for kk, label in enumerate(labels):\n", " flag_options = flag_options_fid.copy()\n", " astro_params = astro_params_vcb.copy()\n", " factor = factors[kk]\n", " if label == \"No Velocity\":\n", " lightcone = lightcone_fid_novcb\n", " elif label == \"Fiducial\":\n", " lightcone = lightcone_fid_vcb\n", " else:\n", " if pp == 0:\n", " astro_params.update(\n", " {\n", " \"F_STAR7_MINI\": astro_params_vcb[\"F_STAR7_MINI\"]\n", " + np.log10(factor)\n", " }\n", " )\n", " elif pp == 1:\n", " astro_params.update(\n", " {\"F_ESC7_MINI\": astro_params_vcb[\"F_ESC7_MINI\"] + np.log10(factor)}\n", " )\n", " elif pp == 2:\n", " astro_params.update({\"A_LW\": astro_params_vcb[\"A_LW\"] * factor})\n", " else:\n", " pass\n", "\n", " lightcone = p21c.run_lightcone(\n", " redshift=ZMIN,\n", " init_box=initial_conditions,\n", " flag_options=flag_options_fid,\n", " astro_params=astro_params,\n", " global_quantities=global_quantities,\n", " random_seed=random_seed,\n", " direc=output_dir,\n", " )\n", "\n", " z_e = np.array([])\n", " tau_e = np.array([])\n", " for i in range(len(lightcone.node_redshifts) - 1):\n", " tauz = p21c.compute_tau(\n", " redshifts=lightcone.node_redshifts[-1 : -2 - i : -1],\n", " global_xHI=lightcone.global_xHI[-1 : -2 - i : -1],\n", " )\n", " tau_e = np.append(tau_e, tauz)\n", " z_e = np.append(z_e, lightcone.node_redshifts[-2 - i])\n", " # print(i,lightcone.node_redshifts[i],tauz)\n", "\n", " # add lower zs where we manually set xH=1\n", " zlow = np.linspace(lightcone.node_redshifts[-1] - 0.1, 0.1, 14)\n", " for zl in zlow:\n", " tauz = p21c.compute_tau(\n", " redshifts=np.array([zl]),\n", " global_xHI=np.array([lightcone.global_xHI[-1]]),\n", " )\n", " tau_e = np.append([tauz], tau_e)\n", " z_e = np.append([zl], z_e)\n", "\n", " # freqs = 1420.4 / (np.array(lightcone.node_redshifts) + 1.)\n", " for jj, global_quantity in enumerate(plot_quantities):\n", " axs.plot(\n", " z_e,\n", " tau_e,\n", " color=colors[kk],\n", " linestyle=linestyles[kk],\n", " label=labels[kk],\n", " lw=lws[kk],\n", " )\n", "\n", " axs.text(\n", " 0.01,\n", " 0.99,\n", " texts,\n", " horizontalalignment=\"left\",\n", " verticalalignment=\"top\",\n", " transform=axs.transAxes,\n", " fontsize=15,\n", " )\n", " axs.set_ylim(ymins[0], ymaxs[0])\n", " axs.set_xlabel(\"redshift\", fontsize=15)\n", " axs.xaxis.set_tick_params(labelsize=15)\n", "\n", " axs.set_xlim(0.0, 20.0)\n", "\n", " if pp == 0:\n", " for ii in range(nchunks):\n", " axs.set_ylabel(\"$\\\\tau$\", fontsize=15)\n", " axs.yaxis.set_tick_params(labelsize=15)\n", " else:\n", " for ii in range(nchunks - 1):\n", " axs.yaxis.set_tick_params(labelsize=0)\n", "\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.0, wspace=0.0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 21-cm power spectra" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2020-03-15T00:04:49.728969Z", "start_time": "2020-03-15T00:04:47.792544Z" } }, "outputs": [], "source": [ "# do 5 chunks but only plot 1 - 4, the 0th has no power for minihalo models where xH=0\n", "nchunks = 4\n", "\n", "fig, axss = plt.subplots(\n", " nchunks,\n", " len(labelss),\n", " sharex=True,\n", " sharey=True,\n", " figsize=(4 * len(labelss), 3 * (nchunks)),\n", " subplot_kw={\"xscale\": \"log\", \"yscale\": \"log\"},\n", ")\n", "\n", "for pp, texts in enumerate(textss):\n", " labels = labelss[pp]\n", " factors = factorss[pp]\n", " axs = axss[:, pp]\n", " for kk, label in enumerate(labels):\n", " factor = factors[kk]\n", "\n", " lightcone = lightcone_fid_vcbavg if kk == 0 else lightcone_fid_vcb\n", "\n", " PS = powerspectra(lightcone, min_k=k_fundamental, max_k=k_max)\n", " for ii in range(nchunks):\n", " axs[ii].plot(\n", " PS[ii + 1][\"k\"],\n", " PS[ii + 1][\"delta\"],\n", " color=colors[kk],\n", " linestyle=linestyles[kk],\n", " label=labels[kk],\n", " lw=lws[kk],\n", " )\n", "\n", " if pp == len(textss) - 1 and kk == 0:\n", " axs[ii].text(\n", " 0.99,\n", " 0.01,\n", " \"Chunk-%02d\" % (ii + 1),\n", " horizontalalignment=\"right\",\n", " verticalalignment=\"bottom\",\n", " transform=axs[ii].transAxes,\n", " fontsize=15,\n", " )\n", "\n", " axs[0].text(\n", " 0.01,\n", " 0.99,\n", " texts,\n", " horizontalalignment=\"left\",\n", " verticalalignment=\"top\",\n", " transform=axs[0].transAxes,\n", " fontsize=15,\n", " )\n", "\n", " axs[-1].set_xlabel(\"$k$ [Mpc$^{-3}$]\", fontsize=15)\n", " axs[-1].xaxis.set_tick_params(labelsize=15)\n", "\n", " if pp == 0:\n", " for ii in range(nchunks):\n", " axs[ii].set_ylim(2e-1, 2e2)\n", " axs[ii].set_ylabel(\"$k^3 P$\", fontsize=15)\n", " axs[ii].yaxis.set_tick_params(labelsize=15)\n", " else:\n", " for ii in range(nchunks - 1):\n", " axs[ii].set_ylim(2e-1, 2e2)\n", " axs[ii].set_ylabel(\"$k^3 P$\", fontsize=0)\n", " axs[ii].yaxis.set_tick_params(labelsize=0)\n", "\n", "axss[0, 0].legend(loc=\"lower left\", ncol=2, fontsize=13, fancybox=True, frameon=True)\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.0, wspace=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "nchunks = 5\n", "\n", "textss = [\"vcb\", \"vcb\"]\n", "factorss = [\n", " [0, 1],\n", "] * len(textss)\n", "labelss = [\n", " [\"Regular\", \"Avg\"],\n", "] * len(textss)\n", "\n", "k_fundamental = 2 * np.pi / BOX_LEN\n", "k_max = k_fundamental * HII_DIM\n", "Nk = np.floor(HII_DIM / 1).astype(int)\n", "\n", "PSv = powerspectra(lightcone_fid_vcb, min_k=k_fundamental, max_k=k_max)\n", "PSvavg = powerspectra(lightcone_fid_vcbavg, min_k=k_fundamental, max_k=k_max)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "klist = PSv[0][\"k\"]\n", "P21diff = [\n", " (PSv[i][\"delta\"] - PSvavg[i][\"delta\"]) / PSvavg[i][\"delta\"] for i in range(nchunks)\n", "]\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "fig, axss = plt.subplots(\n", " nchunks,\n", " 1,\n", " sharex=True,\n", " sharey=True,\n", " figsize=(2 * len(labelss), 3 * (nchunks)),\n", " subplot_kw={\"xscale\": \"linear\", \"yscale\": \"linear\"},\n", ")\n", "\n", "for ii in range(nchunks):\n", " axss[ii].plot(klist, P21diff[ii])\n", "\n", "plt.xscale(\"log\")\n", "axss[0].legend(loc=\"lower left\", ncol=2, fontsize=13, fancybox=True, frameon=True)\n", "plt.tight_layout()\n", "fig.subplots_adjust(hspace=0.0, wspace=0.0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.0" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }