{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Compare galactic power simulations via galactic and local CS"
   ]
  },
  {
   "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=\"<b>LST</b>\", tickprefix=\"<b>\", ticksuffix=\"</b>\", dtick=2),\n",
    "    yaxis=dict(\n",
    "        title=\"<b>frequency [MHz]</b>\",\n",
    "        tickprefix=\"<b>\",\n",
    "        ticksuffix=\"</b>\",\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=\"<b>\",\n",
    "            ticksuffix=\"</b>\",\n",
    "            title=dict(text=\"<b>Power [pW]</b>\", 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 = range(24)\n",
    "freq_Mhz_range = range(30, 81, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Known impedance and HW response\n",
    "hw_file_path = \"./antenna_setup_files/HardwareProfileList_realistic.xml\"\n",
    "hw_dict = read_hw_file(hw_file_path, interp_args={'fill_value': 'extrapolate'})\n",
    "lst_range = range(24)\n",
    "freq_Mhz_range = range(30, 81, 1)\n",
    "impedance_func = hw_dict[\"IImpedance\"][\"antenna_EW\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Calculate power via galactic CS"
   ]
  },
  {
   "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",
    "    impedance_func=impedance_func,\n",
    ")\n",
    "\n",
    "power_via_galactic_cs_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_via_galactic_cs_DF.T * 1e12, width=600, aspect=\"cube\", color_continuous_scale=\"jet\"\n",
    ")\n",
    "fig.update_layout(**layout_settings)\n",
    "fig.update_layout(\n",
    "    title=\"<b>Simulated power dataset via galactic CS</b>\",\n",
    "    coloraxis=dict(\n",
    "        cmin=0,  # Minimum color value\n",
    "        cmax=0.1,  # Maximum color value\n",
    "    )\n",
    ")\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Calculate power via local CS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "nside_transform = 128\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",
    "    # perform calculations in the local cs\n",
    "    transform_hpmaps2_local_cs=True,\n",
    "    nside_transform=nside_transform,\n",
    ")\n",
    "\n",
    "power_via_local_cs_DF = integrate_spectral_density(\n",
    "    power_density_DF, integrated_MHz_bands=power_density_DF.columns\n",
    ")\n",
    "\n",
    "# power_via_local_cs_DF.to_csv('./power_via_local_CS_{}nside.csv'.format(nside_transform))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig = px.imshow(\n",
    "    power_via_local_cs_DF.T * 1e12, width=600, aspect=\"cube\", color_continuous_scale=\"jet\"\n",
    ")\n",
    "fig.update_layout(**layout_settings)\n",
    "fig.update_layout(\n",
    "    title=\"<b>Simulated power dataset via local CS</b>\",\n",
    "    coloraxis=dict(\n",
    "        cmin=0,  # Minimum color value\n",
    "        cmax=0.1,  # Maximum color value\n",
    "    )\n",
    ")\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Compare"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig = px.imshow(\n",
    "    (power_via_galactic_cs_DF/power_via_local_cs_DF.values).T -1, width=650, aspect=\"cube\", color_continuous_scale=\"jet\"\n",
    ")\n",
    "fig.update_layout(**layout_settings)\n",
    "fig.update_layout(\n",
    "    title=\"<b>Power calculation comparison</b>\",\n",
    "    coloraxis=dict(\n",
    "        colorbar=dict(title=dict(text=\"<b>(<sup>via galactic CS</sup>/<sub>via local CS</sub>)-1</b>\", side=\"right\",  font=dict(size=30))),\n",
    "        cmin=None,\n",
    "        cmax=None,   \n",
    "    )\n",
    ")\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# maximal difference\n",
    "(np.abs(power_via_galactic_cs_DF/power_via_local_cs_DF.values-1)).values.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# average difference\n",
    "(power_via_galactic_cs_DF/power_via_local_cs_DF.values-1).values.mean()"
   ]
  }
 ],
 "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.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
  },
  "vscode": {
   "interpreter": {
    "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}