from EXOSIMS.Prototypes.StarCatalog import StarCatalog
import pandas
import numpy as np
import astropy.units as u
from astropy.coordinates import SkyCoord
from EXOSIMS.util.get_dirs import get_downloads_dir
import os
from urllib.request import urlretrieve
import tarfile
[docs]
class HPIC(StarCatalog):
"""Habitable Worlds Observatory Preliminary Input Catalog
Args:
**specs:
:ref:`sec:inputspec`
"""
def __init__(self, **specs):
downloadsdir = get_downloads_dir()
localfile = os.path.join(downloadsdir, "HPIC", "full_HPIC.txt")
if not os.path.exists(localfile):
url = "https://zenodo.org/records/17178761/files/HPIC_1.1.tar.gz"
tgzpath = os.path.join(downloadsdir, "HPIC_1.1.tar.gz")
# check if file might have been downloaded but not unarchived:
if not os.path.exists(tgzpath):
print("Downloading HPIC")
_ = urlretrieve(url, tgzpath)
assert os.path.exists(tgzpath), "HPIC download failed."
with tarfile.open(tgzpath, "r:gz") as f:
f.extractall(path=downloadsdir)
assert os.path.exists(localfile), "Could not find HPIC file on disk."
data = pandas.read_csv(localfile, delimiter="|")
StarCatalog.__init__(self, ntargs=len(data), **specs)
atts_mapping = {
"Name": ("star_name", None),
"Spec": ("st_spectype", None),
"parx": ("sy_plx", u.mas),
"dist": ("sy_dist", u.pc),
"Umag": ("sy_ujmag", None),
"Bmag": ("sy_bmag", None),
"Vmag": ("sy_vmag", None),
"Rmag": ("sy_rcmag", None),
"Imag": ("sy_icmag", None),
"Jmag": ("sy_jmag", None),
"Hmag": ("sy_hmag", None),
"Kmag": ("sy_kmag", None),
"Tmag": ("sy_tmag", None),
"Gmag": ("sy_gaiamag", None),
"Bpmag": ("sy_bpmag", None),
"Rpmag": ("sy_rpmag", None),
"Teff": ("st_teff", u.K),
"mass": ("st_mass", u.solMass),
"age": ("st_age", u.Gyr),
"metallicity": ("st_met", None),
"logg": ("st_logg", None),
}
for att in atts_mapping:
if atts_mapping[att][1] is None:
tmp = data[atts_mapping[att][0]].values
if tmp.dtype.name in ("object", "str"):
# A pandas StringArray, like Spec, has dtype "str" but can
# contain float nan for missing values which mess up things
# downstream.
# Convert to numpy array first, then force type to string
tmp = np.array(tmp, dtype=object)
tmp[pandas.isna(tmp)] = ""
tmp = tmp.astype(str)
setattr(self, att, tmp)
else:
setattr(
self, att, data[atts_mapping[att][0]].values * atts_mapping[att][1]
)
# fill in remaining values
self.BV = self.Bmag - self.Vmag
self.L = 10 ** (data["st_lum"].values)
self.BC = -2.5 * self.L - 26.832 - self.Vmag
self.MV = self.Vmag - 5 * (np.log10(self.dist.to("pc").value) - 1)
self.diameter = np.arctan(2 * data["st_rad"].values * u.Rsun / (self.dist)).to(
u.mas
)
self.coords = SkyCoord(
ra=data["ra"].values * u.deg,
dec=data["dec"].values * u.deg,
distance=self.dist,
)
self.hasKnownPlanet = data["sy_planets_flag"].values == 1
self.Binary_Cut = data["wds_sep"].values < 10
self.data = data
# add available catalog attributes
self.catalog_atts += [
"Tmag",
"Gmag",
"Bpmag",
"Rpmag",
"Teff",
"diameter",
"mass",
"metallicity",
"logg",
]