{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Galactic power simulation" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "from radiocalibrationtoolkit import *" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# some global plot settings\n", "plt.rcParams[\"axes.labelweight\"] = \"bold\"\n", "plt.rcParams[\"font.weight\"] = \"bold\"\n", "plt.rcParams[\"font.size\"] = 16\n", "plt.rcParams[\"legend.fontsize\"] = 14\n", "\n", "plt.rcParams[\"xtick.major.width\"] = 2\n", "plt.rcParams[\"ytick.major.width\"] = 2\n", "\n", "plt.rcParams[\"xtick.major.size\"] = 5\n", "plt.rcParams[\"ytick.major.size\"] = 5\n", "\n", "plt.rcParams[\"xtick.labelsize\"] = 14\n", "plt.rcParams[\"ytick.labelsize\"] = 14\n", "\n", "layout_settings = dict(\n", " xaxis=dict(title=\"LST\", tickprefix=\"\", ticksuffix=\"\", dtick=2),\n", " yaxis=dict(\n", " title=\"frequency [MHz]\",\n", " tickprefix=\"\",\n", " ticksuffix=\"\",\n", " range=(30, 80),\n", " tick0=0,\n", " dtick=10,\n", " autorange=False,\n", " ),\n", " font=dict(\n", " size=20,\n", " color=\"black\",\n", " ),\n", " coloraxis=dict(\n", " colorbar=dict(\n", " tickprefix=\"\",\n", " ticksuffix=\"\",\n", " title=dict(text=\"Power [pW]\", side=\"right\")),\n", " cmin=0,\n", " cmax=24,\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# This ensures Plotly output works in multiple places:\n", "# plotly_mimetype: VS Code notebook UI\n", "# notebook: \"Jupyter: Export to HTML\" command in VS Code\n", "# See https://plotly.com/python/renderers/#multiple-renderers\n", "import plotly.io as pio\n", "pio.renderers.default = \"plotly_mimetype+notebook\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get the Power we need to just integrate the power spectrum density over the frequency.\n", "\n", " \\begin{equation*}\n", "P_{sky}(t,f) = \\int_{f} \\mathscr{P}_{sky}(t,f) df\n", "\\end{equation*} \n", "\n", "Thus, the full equation for the Sky Power Radio Emmision is:\n", "\n", " \\begin{equation*}\n", "P_{sky}(t,f) = \\frac{k_{b}}{c^{2}} \\int_{f} f^{2} \\int_{\\Omega} T_{sky}(t,f,\\theta,\\phi) \\frac{|H(f,\\theta,\\phi)|^{2}Z_{0}}{R_{r}} df d\\Omega \n", "\\end{equation*} \n", "\n", "where $Z_0$ is the vacuum impedance, $R_r$ is the antenna impedance, $k_b$ the Boltzmann constant and $c$ is the speed of light." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "LATITUDE = -35.206667" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "antenna_inst = AntennaPattern(\n", " \"./antenna_setup_files/SALLA_EW.xml\",\n", ")\n", "galactic_map_inst = GlobalSkyModel2016(freq_unit=\"MHz\")\n", "\n", "lst_range = np.asarray(list(range(24))) + 0.5\n", "freq_Mhz_range = range(30, 81, 1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "power_density_DF = calculate_power_spectral_density(\n", " antenna_inst=antenna_inst,\n", " galactic_map_inst=galactic_map_inst,\n", " lst_range=lst_range,\n", " freq_Mhz_range=freq_Mhz_range,\n", " latitude=LATITUDE,\n", " update_antenna_conventions={\n", " \"shift_phi\": -90,\n", " \"flip_theta\": True,\n", " \"flip_phi\": False,\n", " \"in_degrees\": True,\n", " \"add_invisible_sky\": True,\n", " },\n", ")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "power_DF = integrate_spectral_density(\n", " power_density_DF, integrated_MHz_bands=power_density_DF.columns\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig = px.imshow(\n", " power_DF.T * 1e12, width=600, aspect=\"cube\", color_continuous_scale=\"jet\"\n", ")\n", "fig.update_layout(**layout_settings)\n", "fig.update_layout(\n", " title=\"Simulated power dataset at ant. level (Z=1)\",\n", ")\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Known impedance and HW response" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "hw_file_path = \"./antenna_setup_files/HardwareProfileList_realistic.xml\"\n", "hw_dict = read_hw_file(hw_file_path, interp_args={'fill_value':'extrapolate'})\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "hw_dict" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lst_range = np.asarray(list(range(24))) + 0.5\n", "freq_Mhz_range = range(30, 81, 1)\n", "impedance_func = hw_dict[\"IImpedance\"][\n", " \"antenna_EW\"\n", "]\n", "\n", "power_density_DF = calculate_power_spectral_density(\n", " antenna_inst=antenna_inst,\n", " galactic_map_inst=galactic_map_inst,\n", " lst_range=lst_range,\n", " freq_Mhz_range=freq_Mhz_range,\n", " latitude=LATITUDE,\n", " update_antenna_conventions={\n", " \"shift_phi\": -90,\n", " \"flip_theta\": True,\n", " \"flip_phi\": False,\n", " \"in_degrees\": True,\n", " \"add_invisible_sky\": True,\n", " },\n", " impedance_func=impedance_func,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "power_DF = integrate_spectral_density(power_density_DF, integrated_MHz_bands=power_density_DF.columns.values)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig = px.imshow(\n", " power_DF.T * 1e12, width=600, aspect=\"cube\", color_continuous_scale=\"jet\"\n", ")\n", "fig.update_layout(**layout_settings)\n", "fig.update_layout(\n", " title=\"Simulated power dataset at antenna level\",\n", " coloraxis=dict(\n", " colorbar=dict(\n", " title=dict(\n", " text=\"\\u03C1\",\n", " side=\"top\",\n", " )\n", " ),\n", " cmin=0, # Minimum color value\n", " cmax=0.1, # Maximum color value\n", " )\n", ")\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "hw_reponse_1 = dB2PowerAmp(\n", " hw_dict[\"RResponse\"][\"LNA\"](power_DF.columns)\n", ")\n", "hw_reponse_2 = dB2PowerAmp(\n", " hw_dict[\"RResponse\"][\"digitizer\"](power_DF.columns)\n", ")\n", "hw_reponse_3 = dB2PowerAmp(\n", " hw_dict[\"RResponse\"][\"cable_fromLNA2digitizer\"](power_DF.columns)\n", ")\n", "hw_reponse_4 = dB2PowerAmp(\n", " hw_dict[\"RResponse\"][\n", " \"impedance_matching_EW\"\n", " ](power_DF.columns)\n", ")\n", "\n", "power_in_HW_DF = power_DF.multiply(\n", " hw_reponse_1 * hw_reponse_2 * hw_reponse_3 * hw_reponse_4\n", ")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# power_in_HW_DF.to_csv('power_GSM16.csv')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig = px.imshow(\n", " power_in_HW_DF.T * 1e12, width=600, aspect=\"cube\", color_continuous_scale=\"jet\"\n", ")\n", "fig.update_layout(**layout_settings)\n", "fig.update_layout(\n", " title=\"Simulated power dataset at digitzer level\",\n", ")\n", "fig.show()\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# for just the voltage square spectral density\n", "# do not use impedance and do not integrate!\n", "\n", "lst_range = range(24)\n", "freq_Mhz_range = range(10, 125, 1)\n", "\n", "voltage2_density_DF = calculate_power_spectral_density(\n", " antenna_inst=antenna_inst,\n", " galactic_map_inst=galactic_map_inst,\n", " lst_range=lst_range,\n", " freq_Mhz_range=freq_Mhz_range,\n", " latitude=LATITUDE,\n", " update_antenna_conventions={\n", " \"shift_phi\": -90,\n", " \"flip_theta\": True,\n", " \"flip_phi\": False,\n", " \"in_degrees\": True,\n", " \"add_invisible_sky\": True,\n", " },\n", ")\n", "voltage2_density_DF.index.name = \"LST\"\n", "voltage2_density_DF.columns.name = \"freq_MHz\"\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "hw_reponse_1 = dB2PowerAmp(hw_dict[\"RResponse\"][\"LNA\"](voltage2_density_DF.columns))\n", "hw_reponse_2 = dB2PowerAmp(\n", " hw_dict[\"RResponse\"][\"digitizer\"](voltage2_density_DF.columns)\n", ")\n", "hw_reponse_3 = dB2PowerAmp(\n", " hw_dict[\"RResponse\"][\"cable_fromLNA2digitizer\"](voltage2_density_DF.columns)\n", ")\n", "hw_reponse_4 = dB2PowerAmp(\n", " hw_dict[\"RResponse\"][\"impedance_matching_EW\"](voltage2_density_DF.columns)\n", ")\n", "\n", "voltage2_density_in_HW_DF = voltage2_density_DF.multiply(\n", " hw_reponse_1 * hw_reponse_2 * hw_reponse_3 * hw_reponse_4\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# voltage2_density_DF.to_csv('./voltage2_density/voltage2_density_gsm16.csv')\n", "# voltage2_density_in_HW_DF.to_csv('./voltage2_density/voltage2_density_in_HW_gsm16.csv')" ] } ], "metadata": { "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.10.12" }, "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 }, "vscode": { "interpreter": { "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a" } } }, "nbformat": 4, "nbformat_minor": 2 }