Source code for MATS.linelistdata
"""
Routines to load example data locally or from web
"""
from functools import partial
from pathlib import Path
import pandas as pd
# def _attribute_getter(self, name):
# return self[name]
[docs]class LoadLineListData(object):
"""
Helper class to read in supplied LineList DataFrames
Attributes
----------
names : list
names of LineList files available
Methods
-------
__getitem__ : get file DataFrame by position/name
`self[x]` returns a copy of the linelist frame corresponding to
`self.names[x]` if `x` is an integer, otherwise returns Frame corresponding to `name = x`
"""
# _names = [
# "O2_ABand_Drouin_2017_linelist",
# "JQSRT2021_SDNGP_2015",
# "CO2_30012",
# ]
# _prefix_web = (
# "https://raw.githubusercontent.com/usnistgov/MATS/master/MATS/Linelists/"
# )
_prefix_local = Path(__file__).parent / "Linelists"
def __init__(self, paths=None):
paths_default = list(self._prefix_local.glob('*.csv'))
if paths is None:
paths = []
else:
paths = [Path(p) for p in paths]
paths = paths_default + paths
for p in paths:
if not p.exists():
raise ValueError(f'{p} does not exist')
self._paths_dict = {p.with_suffix('').name : p for p in paths}
self._cache = {}
def _ipython_key_completions_(self):
return self.names
@property
def names(self):
return list(self._paths_dict.keys())
@property
def paths(self):
return self._paths_dict
def _get_file(self, name):
if name not in self._paths_dict:
raise ValueError("file name must be in {}".format(self.names))
path = self._paths_dict[name]
if name not in self._cache:
self._cache[name] = pd.read_csv(path)
# always return a copy.
# MATS manipulates in place the linelist
return self._cache[name].copy()
def __getitem__(self, index):
if isinstance(index, int):
name = self.names[index]
elif isinstance(index, str):
name = index
else:
raise ValueError("bad index {}".format(index))
return self._get_file(name)
# Global example data loader
linelistdata = LoadLineListData()