{
"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
}