Source code for n_const.obsparams

__all__ = ["obsfile_parser", "ObsParams"]

import importlib
import os
import re
from pathlib import Path
from typing import Dict, Any

from astropy.coordinates import Angle
from astropy.units.quantity import Quantity
from tomlkit.toml_file import TOMLFile

from .data_format import DataClass


[docs]def obsfile_parser(path: os.PathLike) -> Dict[str, Any]: """Observation parameters from alpaca style .obs file. Parameters ---------- path Path to the .obs file. Examples -------- >>> obsfile_parser('test/horizon.obs') {'offset_Az': 0, ..., 'script': '200GHz/line_otf_car_rsky.alp'} """ with open(os.path.abspath(path)) as f: content = f.read() content = re.sub(r"[\t ]*?#.*?\n", r"\n", content) # Remove tabs and comment sections. content = re.sub(r"(\n.*?);(.*?)\n", r'\1="\2"\n', content) # Make format of ``script`` parameter the same as others. # Get filename. file_name = Path(path).stem # build and execute the module spec = importlib.util.spec_from_loader(file_name, loader=None) pymodule = importlib.util.module_from_spec(spec) exec(content, pymodule.__dict__) ret = {k: v for k, v in pymodule.__dict__.items() if not k.startswith("__")} return ret
[docs]class ObsParams(DataClass): """Parse observation parameters.""" def __init__(self, **kwargs): """Make Quantity. Parameters given as toml-array are converted into ``Quantity`` objects. """ kwargs = self._make_quantity(kwargs) super().__init__(**kwargs)
[docs] @classmethod def from_file(cls, path: os.PathLike): """Parse toml file. Parameters ---------- path Path to the parameter file. Notes ----- All parameters declared in the toml file will be parsed. Table names are ignored. """ _params = TOMLFile(path).read() params = {} for subdict in _params.values(): params.update({k: v for k, v in subdict.items()}) return cls(**params)
@staticmethod def _make_quantity(parameters: Dict[str, Any]): parsed = {} for name, value in parameters.items(): if value == {}: pass elif name.isupper(): parsed[name] = value elif name.islower(): parsed[name] = Quantity(value) else: parsed[name] = Angle(value) return parsed