Source code for uranography.horizon
"""Interactive sky map in horizon (alt/az) coordinates."""
import bokeh
from .spheremap import MovingSphereMap
[docs]
class HorizonMap(MovingSphereMap):
"""Horizon map of the sky, with zenith at center. Not equal area.
Parameters
----------
plot : `bokeh.plotting.figure`, optional
Figure to which to add the map, by default None
mjd : `float`, optional
The Modified Julian Date
location: `EarthLocation` or `str`, optional
The location of the observatory, defaults to lsst.
"""
x_col = "x_hz"
y_col = "y_hz"
update_js_fnames = ("coord_utils.js", "horizon.js")
update_js_command = "updateHorizonData()"
transform_js_fnames = ("coord_utils.js", "horizon.js")
transform_js_call = "return horizonTransform()"
proj_slider_keys = ["mjd"]
default_title = "Horizon"
def _add_projection_columns(self, hpix, nside=None, projector=None):
"""Adds pre-calculated projection columns for this projection."""
coord_cols = ["ra", "decl"]
n_hpix = len(hpix.data["ra"])
corners_per_hpix = len(hpix.data["ra"][0])
corners = hpix.to_df().loc[:, ["hpid"] + coord_cols].explode(column=coord_cols, ignore_index=True)
assert len(corners) == n_hpix * corners_per_hpix
x_hz, y_hz = self.eq_to_horizon(corners["ra"].astype(float), corners["decl"].astype(float))
hpix.add(x_hz.reshape(n_hpix, corners_per_hpix).tolist(), name="x_hz")
hpix.add(y_hz.reshape(n_hpix, corners_per_hpix).tolist(), name="y_hz")
return hpix
[docs]
def set_js_update_func(self, data_source):
"""Set the javascript update functions for each slider
Parameters
----------
data_source : `bokeh.models.ColumnDataSource`
The bokeh data source to update.
"""
update_func = bokeh.models.CustomJS(
args=dict(
data_source=data_source,
center_alt_slider=90,
center_az_slider=0,
mjd_slider=self.sliders["mjd"],
lat=self.location.lat.deg,
lon=self.location.lon.deg,
),
code=self.update_js,
)
self.update_functions.append(update_func)
self.force_update_time.js_on_change("text", update_func)
for proj_slider_key in self.proj_slider_keys:
try:
self.sliders[proj_slider_key].js_on_change("value", update_func)
except KeyError:
pass
[docs]
def add_sliders(self):
"""Add sliders to the map."""
super().add_sliders()
self.sliders["mjd"] = bokeh.models.Slider(
start=self.mjd - 1,
end=self.mjd + 1,
value=self.mjd,
step=1.0 / (24 * 60),
title="MJD",
)
self.visible_slider_names.append("mjd")