From 07b397b1742288b813453dfcfef902bf1a7e742b Mon Sep 17 00:00:00 2001 From: dahlend Date: Thu, 25 Apr 2024 12:28:33 -0700 Subject: [PATCH 1/5] update naif ids --- src/neospy_core/src/spice/naif_ids.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/neospy_core/src/spice/naif_ids.rs b/src/neospy_core/src/spice/naif_ids.rs index 4047f80..eeb37fe 100644 --- a/src/neospy_core/src/spice/naif_ids.rs +++ b/src/neospy_core/src/spice/naif_ids.rs @@ -4287,6 +4287,8 @@ pub const NAIF_IDS: &[(&str, isize)] = &[ ("482P", 1003980), ("P/2005 XR132", 1003981), ("C/2019 G2", 1003982), + ("C/2019 O2", 1003983), + ("C/2021 X2", 1003984), ("ceres", 2000001), ("pallas", 2000002), ("vesta", 2000004), From 20cb2603be8e39e3c84669d0a735a6f9d004f913 Mon Sep 17 00:00:00 2001 From: dahlend Date: Thu, 25 Apr 2024 12:35:49 -0700 Subject: [PATCH 2/5] docs --- src/neospy/rust/elements.rs | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/neospy/rust/elements.rs b/src/neospy/rust/elements.rs index 68a5006..687b782 100644 --- a/src/neospy/rust/elements.rs +++ b/src/neospy/rust/elements.rs @@ -32,6 +32,28 @@ pub struct PyCometElements(pub elements::CometElements); #[pymethods] impl PyCometElements { + /// Construct a new CometElements object. + /// + /// Cometary elements are in the Ecliptic frame. + /// + /// Parameters + /// ---------- + /// desig: str + /// Designation of the object. + /// epoch: float + /// Epoch of the orbit fit in JD. + /// eccentricity: float + /// Eccentricity of the orbit. + /// inclination: float + /// Inclination of the orbit in degrees. + /// peri_dist: float + /// Perihelion Distance in au. + /// peri_arg: float + /// Argument of perihelion in degrees. + /// peri_time: float + /// Time of perihelion passage in JD. + /// lon_of_ascending: float + /// Longitude of ascending node in degrees. #[new] #[allow(clippy::too_many_arguments)] pub fn new( @@ -57,16 +79,24 @@ impl PyCometElements { }) } + /// Construct a new CometElements object from a `State`. + /// + /// Parameters + /// ---------- + /// State : + /// State Object. #[staticmethod] pub fn from_state(state: &PyState) -> Self { Self(elements::CometElements::from_state(&state.0)) } + /// Epoch of the elements in JD. #[getter] pub fn epoch(&self) -> f64 { self.0.epoch } + /// Designation of the object. #[getter] pub fn desig(&self) -> String { match &self.0.desig { @@ -80,66 +110,79 @@ impl PyCometElements { } } + /// Eccentricity of the orbit. #[getter] pub fn eccentricity(&self) -> f64 { self.0.eccentricity } + /// Inclination of the orbit in degrees. #[getter] pub fn inclination(&self) -> f64 { self.0.inclination.to_degrees() } + /// Longitude of the ascending node of the orbit in degrees. #[getter] pub fn lon_of_ascending(&self) -> f64 { self.0.lon_of_ascending.to_degrees() } + /// Perihelion time of the orbit in JD. #[getter] pub fn peri_time(&self) -> f64 { self.0.peri_time } + /// Argument of Perihelion of the orbit in degrees. #[getter] pub fn peri_arg(&self) -> f64 { self.0.peri_arg.to_degrees() } + /// Distance of Perihelion of the orbit in au. #[getter] pub fn peri_dist(&self) -> f64 { self.0.peri_dist } + /// Semi Major Axis of the orbit in au. #[getter] pub fn semi_major(&self) -> f64 { self.0.semi_major() } + /// Mean Motion of the orbit in degrees. #[getter] pub fn mean_motion(&self) -> f64 { self.0.mean_motion().to_degrees() } + /// Orbital Period in days, nan if non-elliptical. #[getter] pub fn orbital_period(&self) -> f64 { self.0.orbital_period() } + /// Convert the orbital elements into a cartesian State. #[getter] pub fn as_state(&self) -> PyResult { Ok(self.0.try_to_state()?.into()) } + /// Eccentric Anomaly in degrees. #[getter] pub fn eccentric_anomaly(&self) -> PyResult { Ok(self.0.eccentric_anomaly().map(|x| x.to_degrees())?) } + /// Mean Anomaly in degrees. #[getter] pub fn mean_anomaly(&self) -> f64 { self.0.mean_anomaly().to_degrees() } + /// True Anomaly in degrees. #[getter] pub fn true_anomaly(&self) -> PyResult { Ok(self.0.true_anomaly().map(|x| x.to_degrees())?) From 3dfaebf6bd8c33eb7003cdb7893eb08bc6ea73f5 Mon Sep 17 00:00:00 2001 From: dahlend Date: Thu, 25 Apr 2024 12:45:06 -0700 Subject: [PATCH 3/5] missing docs --- src/neospy/rust/horizons.rs | 6 ++++++ src/neospy/rust/state.rs | 8 ++++++++ src/neospy/rust/vector.rs | 3 +++ 3 files changed, 17 insertions(+) diff --git a/src/neospy/rust/horizons.rs b/src/neospy/rust/horizons.rs index b044aab..6844f22 100644 --- a/src/neospy/rust/horizons.rs +++ b/src/neospy/rust/horizons.rs @@ -42,11 +42,13 @@ impl HorizonsCovariance { ) } + /// Save the covariance matrix to a file. #[pyo3(name = "save")] pub fn py_save(&self, filename: String) -> PyResult { Ok(self.save(filename)?) } + /// Load a covariance matrix from a file. #[staticmethod] #[pyo3(name = "load")] pub fn py_load(filename: String) -> PyResult { @@ -153,6 +155,7 @@ impl HorizonsProperties { } } + /// Cometary orbital elements. #[getter] pub fn elements(&self) -> PyResult { Ok(PyCometElements(prelude::CometElements { @@ -189,6 +192,7 @@ impl HorizonsProperties { })) } + /// Convert the orbital elements of the object to a State. #[getter] pub fn state(&self) -> PyResult { self.elements()?.as_state() @@ -231,11 +235,13 @@ impl HorizonsProperties { ) } + /// Save the horizons query to a file. #[pyo3(name = "save")] pub fn py_save(&self, filename: String) -> PyResult { Ok(self.save(filename)?) } + /// Load the horizons query from a file. #[staticmethod] #[pyo3(name = "load")] pub fn py_load(filename: String) -> PyResult { diff --git a/src/neospy/rust/state.rs b/src/neospy/rust/state.rs index 27313eb..b39af68 100644 --- a/src/neospy/rust/state.rs +++ b/src/neospy/rust/state.rs @@ -54,12 +54,20 @@ impl PyState { } /// Change the coordinate frame of the object to the target frame. + /// + /// Parameters + /// ---------- + /// frame : Frame + /// New frame to change to. pub fn change_frame(&self, frame: PyFrames) -> PyResult { let mut state = self.0.clone(); state.try_change_frame(frame.into())?; Ok(Self(state)) } + /// Change the center ID of the state from the current state to the target state. + /// + /// If the desired state is not a known NAID id this will raise an exception. pub fn change_center(&self, naif_id: isize) -> PyResult { let mut state = self.0.clone(); let spk = neospy_core::prelude::get_spk_singleton() diff --git a/src/neospy/rust/vector.rs b/src/neospy/rust/vector.rs index e7cd0d5..20d8bbf 100644 --- a/src/neospy/rust/vector.rs +++ b/src/neospy/rust/vector.rs @@ -252,16 +252,19 @@ impl Vector { Self::new(new_dat.into(), target_frame) } + /// X coordinate in au. #[getter] pub fn x(&self) -> f64 { self.raw[0] } + /// Y coordinate in au. #[getter] pub fn y(&self) -> f64 { self.raw[1] } + /// Z coordinate in au. #[getter] pub fn z(&self) -> f64 { self.raw[2] From d90a3431f9d3884fdf6572150e6f6a07bad182fe Mon Sep 17 00:00:00 2001 From: dahlend Date: Thu, 25 Apr 2024 13:43:45 -0700 Subject: [PATCH 4/5] improving sphinx docs --- doc/_static/format.css | 12 --------- doc/_static/layout.html | 2 -- doc/api/api.rst | 16 ++++++++--- doc/api/constants.rst | 6 +++++ doc/api/conversion.rst | 6 +++++ doc/api/core.rst | 44 ------------------------------ doc/api/flux.rst | 2 +- doc/api/observatory.rst | 21 +++++++++++++++ doc/api/propagation.rst | 6 +++++ doc/api/spice.rst | 6 +++++ doc/api/time.rst | 7 +++++ doc/api/vector.rst | 6 +++++ doc/conf.py | 8 +----- pyproject.toml | 9 +++++-- src/neospy/neos.py | 34 +++++++++++------------ src/neospy/propagation.py | 4 +-- src/neospy/spice.py | 20 +++++++------- src/neospy/wise.py | 57 ++++++++++++++++++++++++++++++--------- src/neospy/ztf.py | 2 ++ 19 files changed, 155 insertions(+), 113 deletions(-) delete mode 100644 doc/_static/format.css delete mode 100644 doc/_static/layout.html create mode 100644 doc/api/constants.rst create mode 100644 doc/api/conversion.rst delete mode 100644 doc/api/core.rst create mode 100644 doc/api/observatory.rst create mode 100644 doc/api/propagation.rst create mode 100644 doc/api/spice.rst create mode 100644 doc/api/time.rst create mode 100644 doc/api/vector.rst diff --git a/doc/_static/format.css b/doc/_static/format.css deleted file mode 100644 index 5c5ca6a..0000000 --- a/doc/_static/format.css +++ /dev/null @@ -1,12 +0,0 @@ -.function, -.class { - border-bottom: 3px solid #d0d0d0; - padding-bottom: 10px; - padding-top: 10px; -} - -.method, -.property { - padding-bottom: 10px; - padding-top: 10px; -} \ No newline at end of file diff --git a/doc/_static/layout.html b/doc/_static/layout.html deleted file mode 100644 index 688ff10..0000000 --- a/doc/_static/layout.html +++ /dev/null @@ -1,2 +0,0 @@ -{% extends "!layout.html" %} -{% set css_files = css_files + [ "_static/format.css" ] %} \ No newline at end of file diff --git a/doc/api/api.rst b/doc/api/api.rst index 7f0b322..d86e4c3 100644 --- a/doc/api/api.rst +++ b/doc/api/api.rst @@ -1,10 +1,20 @@ API === +.. toctree:: + :maxdepth: 1 + + constants + .. toctree:: :maxdepth: 2 - core - interface + conversion flux - population \ No newline at end of file + interface + observatory + population + propagation + spice + time + vector \ No newline at end of file diff --git a/doc/api/constants.rst b/doc/api/constants.rst new file mode 100644 index 0000000..cfb1e7a --- /dev/null +++ b/doc/api/constants.rst @@ -0,0 +1,6 @@ +constants +========= + +.. automodule:: neospy.constants + :members: + :inherited-members: \ No newline at end of file diff --git a/doc/api/conversion.rst b/doc/api/conversion.rst new file mode 100644 index 0000000..269205b --- /dev/null +++ b/doc/api/conversion.rst @@ -0,0 +1,6 @@ +conversion +========== + +.. automodule:: neospy.conversion + :members: + :inherited-members: diff --git a/doc/api/core.rst b/doc/api/core.rst deleted file mode 100644 index 52d2b34..0000000 --- a/doc/api/core.rst +++ /dev/null @@ -1,44 +0,0 @@ -core -==== - -constants ---------- - -.. automodule:: neospy.constants - :members: - :inherited-members: - -conversion ----------- - -.. automodule:: neospy.conversion - :members: - :inherited-members: - -propagation ------------ - -.. automodule:: neospy.propagation - :members: - :inherited-members: - -spice ------ - -.. automodule:: neospy.spice - :members: - :inherited-members: - -time ----- - -.. automodule:: neospy.time - :members: - :inherited-members: - -vector ------- - -.. automodule:: neospy.vector - :members: - :inherited-members: diff --git a/doc/api/flux.rst b/doc/api/flux.rst index fda1671..bb9ad7c 100644 --- a/doc/api/flux.rst +++ b/doc/api/flux.rst @@ -1,4 +1,4 @@ -Flux +flux ==== shape diff --git a/doc/api/observatory.rst b/doc/api/observatory.rst new file mode 100644 index 0000000..2f1f025 --- /dev/null +++ b/doc/api/observatory.rst @@ -0,0 +1,21 @@ +observatories +============= + + +NEOS +---- +.. automodule:: neospy.neos + :members: + :inherited-members: + +WISE +---- +.. automodule:: neospy.wise + :members: + :inherited-members: + +ZTF +--- +.. automodule:: neospy.ztf + :members: + :inherited-members: diff --git a/doc/api/propagation.rst b/doc/api/propagation.rst new file mode 100644 index 0000000..2c8b9a0 --- /dev/null +++ b/doc/api/propagation.rst @@ -0,0 +1,6 @@ +propagation +=========== + +.. automodule:: neospy.propagation + :members: + :inherited-members: diff --git a/doc/api/spice.rst b/doc/api/spice.rst new file mode 100644 index 0000000..4af3c2c --- /dev/null +++ b/doc/api/spice.rst @@ -0,0 +1,6 @@ +spice +===== + +.. automodule:: neospy.spice + :members: + :inherited-members: diff --git a/doc/api/time.rst b/doc/api/time.rst new file mode 100644 index 0000000..568db4c --- /dev/null +++ b/doc/api/time.rst @@ -0,0 +1,7 @@ +Time +==== + +.. automodule:: neospy.time + :members: + :inherited-members: + diff --git a/doc/api/vector.rst b/doc/api/vector.rst new file mode 100644 index 0000000..7dfc879 --- /dev/null +++ b/doc/api/vector.rst @@ -0,0 +1,6 @@ +core +==== + +.. automodule:: neospy.vector + :members: Vector + :inherited-members: diff --git a/doc/conf.py b/doc/conf.py index cc331a0..bf4779f 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -31,7 +31,6 @@ } autoclass_content = "both" -templates_path = ["_static"] exclude_patterns = [] # Napoleon settings @@ -50,8 +49,7 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = "alabaster" -html_static_path = ["_static"] +html_theme = "sphinx_rtd_theme" # -- Sphinx gallery settings -------------------------------------------------- @@ -86,8 +84,4 @@ ("py:class", "numpy.ma.core.MaskedArray"), ("py:class", "numpy.core.records.recarray"), ("py:class", "numpy._typing._array_like._ScalarType_co"), - # Mypy support is a little flaky still, ignore these internal links: - # https://github.com/sphinx-doc/sphinx/issues/10785 - ("py:class", "VecMultiLike"), - ("py:class", "VecLike"), ] diff --git a/pyproject.toml b/pyproject.toml index 0dfed41..bb7e822 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,8 +34,13 @@ dev = ["black>=23.1.0", "autodoc", "sphinx-gallery", "mypy", - "types-requests"] -docs = ["sphinx", "autodoc", "sphinx-gallery"] + "types-requests", + ] +docs = ["sphinx", + "autodoc", + "sphinx-gallery", + "sphinx_rtd_theme", + ] # Options for pytest [tool.pytest.ini_options] diff --git a/src/neospy/neos.py b/src/neospy/neos.py index bbb9232..63bf45b 100644 --- a/src/neospy/neos.py +++ b/src/neospy/neos.py @@ -1,24 +1,24 @@ -from __future__ import annotations -import numpy as np - -# Effective wavelength of the NC1 and NC2 bands in nm. BANDS: list[float] = [4700.0, 8000.0] +"""Effective wavelength of the NC1 and NC2 bands in nm.""" FOV_WIDTH: float = 7.10 +"""Expected effective field of view width in degrees""" + FOV_HEIGHT: float = 1.68 +"""Expected effective field of view height in degrees""" -# Zero point magnitude for nc1 and nc2 ZERO_MAGS: list[float] = [170.662, 64.13] +"""Zero point magnitude for nc1 and nc2""" -COLOR_CORR = np.array( - [ # Tbb nc1 nc2 - [200.0, 1.50001, 1.17925], - [220.0, 1.38320, 1.10277], - [240.0, 1.29964, 1.05175], - [260.0, 1.23789, 1.01713], - [280.0, 1.19106, 0.99348], - [300.0, 1.15477, 0.97740], - [400.0, 1.05708, 0.95284], - [500.0, 1.01897, 0.96149], - ] -) +COLOR_CORR = [ + # Tbb nc1 nc2 + [200.0, 1.50001, 1.17925], + [220.0, 1.38320, 1.10277], + [240.0, 1.29964, 1.05175], + [260.0, 1.23789, 1.01713], + [280.0, 1.19106, 0.99348], + [300.0, 1.15477, 0.97740], + [400.0, 1.05708, 0.95284], + [500.0, 1.01897, 0.96149], +] +"""Expected color correction required for black body sources""" diff --git a/src/neospy/propagation.py b/src/neospy/propagation.py index 76f2869..764267c 100644 --- a/src/neospy/propagation.py +++ b/src/neospy/propagation.py @@ -19,9 +19,9 @@ def propagate_n_body( states: list[State], jd: float, - include_asteroids=False, + include_asteroids: bool = False, a_terms: Optional[list[Optional[tuple[float, float, float, bool]]]] = None, - suppress_errors=True, + suppress_errors: bool = True, ) -> list[State]: """ Propagate the provided :class:`~neospy.State` using N body mechanics to the diff --git a/src/neospy/spice.py b/src/neospy/spice.py index da31fde..b2eae96 100644 --- a/src/neospy/spice.py +++ b/src/neospy/spice.py @@ -63,7 +63,7 @@ def state( target: Union[str, int], jd: Union[float, Time], center: str = "Sun", - frame=Frames.Ecliptic, + frame: Frames = Frames.Ecliptic, ) -> State: """ Calculates the :class:`~neospy.State` of the target object at the @@ -174,7 +174,7 @@ def loaded_objects() -> list[tuple[str, int]]: return [(_rust.spk_get_name_from_id(o), o) for o in objects] @staticmethod - def cached_kernel_url_download(url, force_download=False): + def cached_kernel_url_download(url, force_download: bool = False): """ Download the target url into the cache folder of spice kernels. """ @@ -183,11 +183,11 @@ def cached_kernel_url_download(url, force_download=False): @staticmethod def cached_kernel_horizons_download( name, - jd_start, - jd_end, - exact_name=False, - update_cache=False, - apparition_year=None, + jd_start: Union[Time, float], + jd_end: Union[Time, float], + exact_name: bool = False, + update_cache: bool = False, + apparition_year: Optional[int] = None, ): """ Download a SPICE kernel from JPL Horizons and save it directly into the Cache. @@ -262,12 +262,12 @@ def cached_kernel_horizons_download( if not os.path.isdir(dir_path): os.makedirs(dir_path) - jd_start = jd_start.strftime("%Y-%m-%d") - jd_end = jd_end.strftime("%Y-%m-%d") + jd_s_str = jd_start.strftime("%Y-%m-%d") + jd_e_str = jd_end.strftime("%Y-%m-%d") cap = f"CAP<{apparition_year}%3B" if comet else "" response = requests.get( f"https://ssd.jpl.nasa.gov/api/horizons.api?COMMAND='DES={spk_id}%3B{cap}'" - f"&EPHEM_TYPE=SPK&START_TIME='{jd_start}'&STOP_TIME='{jd_end}'&CENTER=0", + f"&EPHEM_TYPE=SPK&START_TIME='{jd_s_str}'&STOP_TIME='{jd_e_str}'&CENTER=0", timeout=30, ) diff --git a/src/neospy/wise.py b/src/neospy/wise.py index 562787d..3db1b68 100644 --- a/src/neospy/wise.py +++ b/src/neospy/wise.py @@ -6,7 +6,7 @@ from collections import namedtuple from functools import lru_cache import tempfile -from typing import Optional +from typing import Optional, Union import requests import warnings import matplotlib.pyplot as plt # type: ignore @@ -27,6 +27,15 @@ # pylint: disable-next=import-error from ._rust import WiseCmos, FOVList # type: ignore +__all__ = [ + "MISSION_PHASES", + "mission_phase_from_jd", + "mission_phase_from_scan", + "plot_frames", + "fetch_WISE_frame", + "MissionPhase", +] + # This table contains calibrated flux correction values for the 4 different WISE bands. COLOR_CORR = np.array( @@ -386,22 +395,45 @@ def fetch_WISE_frame(scan_id, frame_num, band=3, im_type="int", cache=True): return fit -def plot_4band( +def plot_frames( scan_id, frame_num, - ra=None, - dec=None, - zoom=True, - bands=None, + ra: Optional[float | list[float]] = None, + dec: Optional[float | list[float]] = None, + zoom: Union[bool | float] = True, + bands: Optional[list[int]] = None, ): """ - Plot a 2x2 grid of images showing the W1, W2, W3, and W4 data for the scan/frame - pair, centered on the ra,dec provided + Plot up to a 2x2 grid of images showing the W1, W2, W3, and W4 data for the + (scan, frame) pair, centered on the ra, dec if provided. + + More than one RA/DEC pair may also be provided, but zooming will not work + in that case. + + Parameters + ---------- + scan_id : + The scan id of the desired frames. + frame_num : + The frame number of the desired frames. + ra : + The RA position of where to zoom/center the frames. + dec : + The RA position of where to zoom/center the frames. + zoom : + If the image should be centered and zoomed in on the provided RA/DEC. + This can also be a number, which will change the zoom level. + band : + Bands of WISE to plot, if not provided this will plot all bands for the + given mission phase. """ ecolor = [None, "blue", "green", "#ff7700", "red"] if bands is None: - bands = mission_phase_from_scan(scan_id).bands + phase = mission_phase_from_scan(scan_id) + if phase is None: + raise ValueError("Cannot identify the mission phase for this scan id") + bands = phase.bands plt.figure(dpi=120, figsize=(8, 8), facecolor="w") plt.suptitle(f"Scan: {scan_id} Frame: {frame_num}") @@ -434,10 +466,10 @@ def plot_4band( if ra is not None and dec is not None: loc = SkyCoord(ra=ra * u.degree, dec=dec * u.degree, frame="icrs") + pixloc = wcs.world_to_pixel(loc) plt.scatter( - loc.ra, - loc.dec, - transform=plt.gca().get_transform("world"), + pixloc[0], + pixloc[1], edgecolor=ecolor[band], s=100, linewidth=1, @@ -446,7 +478,6 @@ def plot_4band( if zoom and len(np.atleast_1d(ra).ravel()) > 1: warnings.warn("More than one object found in file, cannot zoom.") elif zoom: - pixloc = wcs.world_to_pixel(loc) if band == 4: # band 4's pixels are twice as big as the other three, so zoom more # to ensure the scene is the same diff --git a/src/neospy/ztf.py b/src/neospy/ztf.py index b6596f3..42d6e7c 100644 --- a/src/neospy/ztf.py +++ b/src/neospy/ztf.py @@ -1,5 +1,7 @@ from .data import cached_file_download +__all__ = ["fetch_ZTF_file"] + ZTF_IRSA_TABLES = { "ztf.ztf_current_meta_cal": "ZTF Calibration Metadata Table", "ztf.ztf_current_meta_deep": "ZTF Deep Reference Images", From 54418ee02b40a179ba4e7ea66010edd213a0b29d Mon Sep 17 00:00:00 2001 From: dahlend Date: Thu, 25 Apr 2024 13:52:33 -0700 Subject: [PATCH 5/5] docs --- src/neospy/wise.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/neospy/wise.py b/src/neospy/wise.py index 3db1b68..6ca1530 100644 --- a/src/neospy/wise.py +++ b/src/neospy/wise.py @@ -7,8 +7,8 @@ from functools import lru_cache import tempfile from typing import Optional, Union -import requests import warnings +import requests import matplotlib.pyplot as plt # type: ignore import numpy as np @@ -135,6 +135,21 @@ "source_table", ], ) +MissionPhase.__doc__ = ( + "Information about a specific mission phase. The cannonical set of these is stored" + " in the :py:class:`MISSION_PHASES` constant." +) +MissionPhase.name.__doc__ = "Name of the mission phase." +MissionPhase.jd_start.__doc__ = "JD date of the start of the mission phase." +MissionPhase.jd_end.__doc__ = "JD date of the end of the mission phase." +MissionPhase.bands.__doc__ = "WISE wavelength bands available during the phase." +MissionPhase.frame_url.__doc__ = "URL of where the frames are stored on IRSA servers." +MissionPhase.frame_meta_table.__doc__ = ( + "SQL Table on IRSA where the metadata for the frames are stored." +) +MissionPhase.source_table.__doc__ = ( + "SQL Table on IRSA where source information is stored." +) MISSION_PHASES = { "Cryo": MissionPhase( @@ -183,6 +198,7 @@ source_table="neowiser_p1bs_psd", ), } +"""Public released mission phases of WISE.""" for year in range(2015, 2023): MISSION_PHASES[f"Reactivation_{year}"] = MissionPhase(