Source code for species.data.companion_data.companion_spectra
"""
Module for getting spectra of directly imaged planets and brown dwarfs.
"""
import json
import os
import pathlib
import urllib.request
from typing import Dict, Optional, Tuple
from typeguard import typechecked
from species.util.core_util import print_section
[docs]
@typechecked
def companion_spectra(
input_path: str, comp_name: str, verbose: bool = True
) -> Optional[Dict[str, Tuple[str, Optional[str], float]]]:
"""
Function for extracting a dictionary with the spectra of
directly imaged planets and brown dwarfs. These data can
be added to the database with the
:func:`~species.data.database.Database.add_companion`
method of :class:`~species.data.database.Database`.
Parameters
----------
input_path : str
Path of the data folder.
comp_name : str
Companion name for which the spectra will be returned.
verbose : bool
Print details on the companion data that are added to
the database.
Returns
-------
dict, None
Dictionary with the spectra of ``comp_name``. A ``None``
will be returned if there are not any spectra available.
The dictionary includes the spectrum, (optional)
covariances, spectral resolution, and filename.
"""
spec_file = pathlib.Path(__file__).parent.resolve() / "companion_spectra.json"
with open(spec_file, "r", encoding="utf-8") as json_file:
comp_spec = json.load(json_file)
if comp_name in comp_spec:
if verbose:
print_section("Get companion spectra")
data_folder = os.path.join(input_path, "companion_data/")
if not os.path.exists(data_folder):
os.makedirs(data_folder)
spec_dict = {}
for key, value in comp_spec[comp_name].items():
if verbose:
print(f"Getting {key} spectrum of {comp_name}...", end="", flush=True)
spec_url = (
f"https://home.strw.leidenuniv.nl/~stolker/species/spectra/{value[0]}"
)
spec_file = os.path.join(data_folder, value[0])
if value[1] is None:
cov_file = None
else:
cov_file = os.path.join(data_folder, value[1])
if not os.path.isfile(spec_file):
urllib.request.urlretrieve(spec_url, spec_file)
spec_dict[key] = (spec_file, cov_file, value[2])
if verbose:
print(" [DONE]")
print(
f"Please cite {value[3]} when making "
"use of this spectrum in a publication"
)
else:
spec_dict = None
return spec_dict