Source code for pysme.linelist.ges

# -*- coding: utf-8 -*-
"""
Module for handling linelist data from the VALD3 database (http://vald.astro.uu.se/).


"""
import logging
import sys

import numpy as np
import pandas as pd
from astropy.io import fits

from .linelist import LineList, LineListError

logger = logging.getLogger(__name__)


[docs] class GesError(LineListError): """Vald Data File Error"""
[docs] class GesFile(LineList): """Atomic data for a list of spectral lines.""" def __init__(self, filename, medium=None): self.filename = filename linelist = self.loads(filename) super().__init__(linelist, lineformat=self.lineformat, medium=self.medium) # Convert to desired medium if medium is not None: self.medium = medium
[docs] @staticmethod def load(filename): """ Read line data file from the VALD extract stellar service Parameters ---------- filename : str Name of the VALD linelist file to read Returns ------- vald : ValdFile Parsed vald file """ return GesFile(filename)
[docs] def loads(self, filename): logger.info("Loading GES file %s", filename) hdu = fits.open(filename) data = hdu[1].data linedata = { "species": data["name"][:, 0] + " " + data["ion"].astype(str), "atom_number": np.zeros(len(data)), "ionization": data["ion"], "wlcent": data["lambda"], "excit": data["e_low"], "gflog": data["log_gf"], "gflog_err": data["log_gf_err"], "gamrad": data["rad_damp"], "gamqst": data["stark_damp"], "gamvw": data["vdw_damp"], "lande": data["lande_mean"], "depth": data["depth"], "reference": data["lambda_ref"], "lande_lower": data["lande_low"], "lande_upper": data["lande_up"], "j_lo": data["j_low"], "e_upp": data["e_up"], "j_up": data["j_up"], "term_lower": data["label_low"], "term_upper": data["label_up"], } sort = np.argsort(linedata["wlcent"]) # We need to make sure all data is in the system defined byteorder # Otherwise pandas will not work properly for key, value in linedata.items(): if (value.dtype.byteorder == ">" and sys.byteorder == "little") or ( value.dtype.byteorder == "<" and sys.byteorder == "big" ): value = value.byteswap().newbyteorder() linedata[key] = value[sort] linelist = pd.DataFrame.from_dict(linedata) self.lineformat = "long" self.unit = "Angstrom" self._medium = "air" # self.citation_info += self.parse_references(refdata, fmt) return linelist