Source code for stsynphot.config

# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""``stsynphot`` configurable items.

The default configuration heavily depends on STScI TRDS structure
but it can be easily re-configured as the user wishes via
`astropy.config`.

``PYSYN_CDBS`` must be a defined system environment variable for
directories to be configured properly. It also overwrites
``synphot`` configurable items.

"""
# STDLIB
import os

# THIRD-PARTY
import numpy as np
from astropy import log
from astropy.config import ConfigNamespace, ConfigItem

# SYNPHOT
from synphot.config import Conf as synconf
from synphot.utils import generate_wavelengths

__all__ = ['conf', 'getref', 'showref', 'overwrite_synphot_config']


class Conf(ConfigNamespace):
    """Configuration parameters."""

    # Set up default wavelength
    _wave, _wave_str = generate_wavelengths(
        minwave=500, maxwave=26000, num=10000, delta=None, log=True,
        wave_unit='angstrom')

    # Root directory
    rootdir = ConfigItem(
        os.environ.get('PYSYN_CDBS', '/grp/redcat/trds'),
        'TRDS data root directory')

    # Graph, optical component, and thermal component tables
    graphtable = ConfigItem('mtab$*_tmg.fits', 'Graph table')
    comptable = ConfigItem('mtab$*_tmc.fits', 'Component table')
    thermtable = ConfigItem('mtab$*_tmt.fits', 'Thermal table')

    # Default wavelength in Angstrom and its description
    waveset_array = ConfigItem(
        _wave.value.tolist(),
        'Default wavelength set in Angstrom', 'float_list')
    waveset = ConfigItem(_wave_str, 'Default wavelength set description')

    # Telescope primary mirror collecting area in cm^2
    area = ConfigItem(45238.93416, 'Telescope collecting area in cm^2')

    # Common filter name
    clear_filter = ConfigItem('clear', 'Name for a clear filter')

    # Wavelength catalog file
    wavecatfile = ConfigItem(
        'synphot$wavecats/wavecat.dat', 'Wavelength catalog file')

    # Detector parameters file
    detectorfile = ConfigItem(
        'synphot$detectors.dat', 'Detector parameters file')

    # IRAF shortcuts file for stsynphot.stio.irafconvert()
    irafshortcutfile = ConfigItem(
        'synphot$irafshortcuts.txt',
        'col1=shortcut_name col2=relpath_to_rootdir, has header.')

    # Clean up
    del _wave
    del _wave_str


def _get_synphot_cfgitems():
    """Iterator for ``synphot`` configuration items."""
    for c in synconf.__dict__.values():
        if isinstance(c, ConfigItem):
            yield c


[docs] def overwrite_synphot_config(root): """Silently overwrite ``synphot`` configurable items to point to given root directory. Parameters ---------- root : str Root directory name. """ subdir_keys = ['calspec', 'extinction', 'nonhst'] # Need this for Windows support if root.startswith(('http', 'ftp')): sep = '/' else: sep = os.sep # Can be / or \ for cfgitem in _get_synphot_cfgitems(): path, fname = os.path.split(cfgitem()) i = np.where(list(map(path.__contains__, subdir_keys)))[0] if len(i) == 0: continue subdir = subdir_keys[i[0]] if subdir == 'nonhst': cfgval = sep.join([root, 'comp', subdir, fname]) else: cfgval = sep.join([root, subdir, fname]) cfgitem.set(cfgval)
conf = Conf() # Override SYNPHOT configuration overwrite_synphot_config(conf.rootdir) def _get_ref_cfgitems(): """Iterator for configuration items to be displayed.""" from stsynphot.stio import get_latest_file, irafconvert for cfgitem, do_conv in ( (Conf.graphtable, True), (Conf.comptable, True), (Conf.thermtable, True), (Conf.area, False), (Conf.waveset, False)): val = cfgitem() if do_conv: val = get_latest_file(irafconvert(val)) yield cfgitem.name, val
[docs] def getref(): """Return current values of select configurable items as a dictionary. Returns ------- refdict : dict """ return dict([x for x in _get_ref_cfgitems()])
[docs] def showref(): # pragma: no cover """Show the values of select configurable items.""" info_str = '\n' for x in _get_ref_cfgitems(): info_str += f'{x[0]:10s}: {x[1]}\n' log.info(info_str)