Source code for species.data.exo_rem

"""
Module for Exo-REM atmospheric model spectra.
"""

import os
import tarfile
import warnings
import urllib.request

import spectres
import numpy as np

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


[docs]def add_exo_rem(input_path, database, wavel_range=None, teff_range=None, spec_res=1000.): """ Function for adding the Exo-REM atmospheric models to the database. Parameters ---------- input_path : str Folder where the data is located. database : h5py._hl.files.File Database. wavel_range : tuple(float, float), None Wavelength range (um). The original wavelength points are used if set to None. teff_range : tuple(float, float), None Effective temperature range (K). All temperatures are selected if set to None. spec_res : float, None Spectral resolution. Not used if ``wavel_range`` is set to None. Returns ------- NoneType None """ if not os.path.exists(input_path): os.makedirs(input_path) data_folder = os.path.join(input_path, 'exo-rem/') if not os.path.exists(data_folder): os.makedirs(data_folder) input_file = 'exo-rem.tgz' label = '(160 MB)' url = 'https://people.phys.ethz.ch/~ipa/tstolker/exo-rem.tgz' data_file = os.path.join(data_folder, input_file) if not os.path.isfile(data_file): print(f'Downloading Exo-REM model spectra {label}...', end='', flush=True) urllib.request.urlretrieve(url, data_file) print(' [DONE]') print(f'Unpacking Exo-REM model spectra {label}...', end='', flush=True) tar = tarfile.open(data_file) tar.extractall(data_folder) tar.close() print(' [DONE]') teff = [] logg = [] feh = [] co_ratio = [] flux = [] if wavel_range is not None: wavelength = [wavel_range[0]] while wavelength[-1] <= wavel_range[1]: # From Paul Mollière: # resolution = lambda / (resolution element of the spectrograph) # R = lambda / delta_lambda / 2, because twice as many points as R to actually resolve # two features that are lambda / R apart wavelength.append(wavelength[-1] + wavelength[-1]/(2.*spec_res)) wavelength = np.asarray(wavelength[:-1]) else: wavelength = None for _, _, files in os.walk(data_folder): for filename in files: if filename[:7] == 'exorem_': file_split = filename.split('_') teff_val = float(file_split[2]) logg_val = float(file_split[4]) feh_val = float(file_split[6]) co_val = float(file_split[8]) if logg_val == 5.: continue if co_val in [0.8, 0.85]: continue if teff_range is not None: if teff_val < teff_range[0] or teff_val > teff_range[1]: continue print_message = f'Adding Exo-REM model spectra... {filename}' print(f'\r{print_message:<83}', end='') data_wavel, data_flux = np.loadtxt(os.path.join(data_folder, filename), unpack=True) teff.append(teff_val) logg.append(logg_val) feh.append(feh_val) co_ratio.append(co_val) if wavel_range is None: if wavelength is None: wavelength = np.copy(data_wavel) # (um) if np.all(np.diff(wavelength) < 0): raise ValueError('The wavelengths are not all sorted by increasing value.') flux.append(data_flux) # (W m-2 um-1) else: try: flux_resample = spectres.spectres(wavelength, data_wavel, data_flux) flux.append(flux_resample) # (W m-2 um-1) except ValueError: flux.append(np.zeros(wavelength.shape[0])) # (um) warnings.warn('The wavelength range should fall within the range of the ' 'original wavelength sampling. Storing zeros instead.') print('Grid points with the following parameters having been excluded:') print(' - log(g) = 5') print(' - C/O = 0.8') print(' - C/O = 0.85') data_sorted = data_util.sort_data(np.asarray(teff), np.asarray(logg), np.asarray(feh), np.asarray(co_ratio), None, wavelength, np.asarray(flux)) data_util.write_data('exo-rem', ['teff', 'logg', 'feh', 'co'], database, data_sorted) print_message = 'Adding Exo-REM model spectra... [DONE]' print(f'\r{print_message:<83}')