Source code for species.data.isochrone_data.iso_saumon2008

from pathlib import Path

import h5py
import numpy as np
import pooch

from typeguard import typechecked

from species.core import constants
from species.util.data_util import extract_tarfile


[docs] @typechecked def add_saumon2008(database: h5py._hl.files.File, input_path: str) -> None: """ Function for adding the Saumon & Marley (2008) isochrone data to the database. Parameters ---------- database : h5py._hl.files.File Database. input_path : str Folder where the data is located. Returns ------- NoneType None """ url = "https://home.strw.leidenuniv.nl/~stolker/species/BD_evolution.tgz" iso_tag = "Saumon & Marley (2008)" iso_size = "800 kB" data_folder = Path(input_path) / "saumon_marley_2008" if not data_folder.exists(): data_folder.mkdir() input_file = url.rsplit("/", maxsplit=1)[-1] data_file = Path(input_path) / input_file if not data_file.exists(): print() pooch.retrieve( url=url, known_hash="fb64793b74a4503f13b9b1daa7d04e9594e9ba6f87353a0dbb50b73257961c88", fname=input_file, path=input_path, progressbar=True, ) print(f"\nUnpacking {iso_tag} isochrones ({iso_size})...", end="", flush=True) extract_tarfile(str(data_file), str(data_folder)) print(" [DONE]") iso_files = [ "nc_solar_age", "nc-0.3_age", "nc+0.3_age", "f2_solar_age", "hybrid_solar_age", ] labels = [ "Cloudless [M/H] = 0.0", "Cloudless [M/H] = -0.3", "Cloudless [M/H] = +0.3", "Cloudy f_sed = 2", "Hybrid (cloudless / f_sed = 2)", ] db_tags = [ "saumon2008-nc_solar", "saumon2008-nc_-0.3", "saumon2008-nc_+0.3", "saumon2008-f2_solar", "saumon2008-hybrid_solar", ] for iso_idx, iso_item in enumerate(iso_files): iso_path = Path(data_folder) / iso_item iso_data = [] with open(str(iso_path), encoding="utf-8") as open_file: for i, line in enumerate(open_file): if i == 0 or " " not in line.strip(): continue # age(Gyr) M/Msun log(L/Lsun) Teff(K) log(g) R/Rsun param = list(filter(None, line.strip().split(" "))) param = list(map(float, param)) param[0] = 1e3 * param[0] # (Gyr) -> (Myr) param[1] = ( param[1] * constants.M_SUN / constants.M_JUP ) # (Msun) -> (Mjup) param[5] = ( param[5] * constants.R_SUN / constants.R_JUP ) # (Rsun) -> (Rjup) iso_data.append( [param[0], param[1], param[2], param[3], param[4], param[5]] ) print( f"\nAdding isochrones: {iso_tag} {labels[iso_idx]}...", end="", flush=True ) iso_data = np.array(iso_data) dset = database.create_dataset( f"isochrones/{db_tags[iso_idx]}/age", data=iso_data[:, 0] ) # (Myr) database.create_dataset( f"isochrones/{db_tags[iso_idx]}/mass", data=iso_data[:, 1] ) # (Mjup) database.create_dataset( f"isochrones/{db_tags[iso_idx]}/log_lum", data=iso_data[:, 2] ) # log(L/Lsun) database.create_dataset( f"isochrones/{db_tags[iso_idx]}/teff", data=iso_data[:, 3] ) # (K) database.create_dataset( f"isochrones/{db_tags[iso_idx]}/log_g", data=iso_data[:, 4] ) # log(g) database.create_dataset( f"isochrones/{db_tags[iso_idx]}/radius", data=iso_data[:, 5] ) # (Rjup) dset.attrs["model"] = "saumon2008" print(" [DONE]") print(f"Database tag: {db_tags[iso_idx]}")