Source code for jwst.lib.v1_calculate

"""V1 Calculation based on time and engineering database info
"""
from collections import defaultdict
import logging

from astropy.table import Table

from stdatamodels.jwst import datamodels as dm

from . import set_telescope_pointing as stp
from . import siafdb

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

__all__ = ['v1_calculate_from_models', 'v1_calculate_over_time']


[docs] def v1_calculate_from_models(sources, siaf_path=None, **calc_wcs_from_time_kwargs): """Calculate V1 over the time period for the given models Returns a table of V1 pointings for all input models. The table has the following columns: - source (jwst.datamodels.JwstDataModel): The model - obstime (astropy.time.Time): The observation time - v1 (float, float, float): 3-tuple or ra, dec, and position angle Parameters ---------- sources : [File-like or jwst.datamodels.Datamodel[...]] The datamodels to get timings other header parameters from. siaf_path : None or file-like The path to the SIAF database. If none, the default used by the `pysiaf` package is used. See `SiafDb` for more information. calc_wcs_from_time_kwargs : dict Keyword arguments to pass to `calc_wcs_from_time` Returns ------- v1_table : astropy.table.Table Table of V1 pointing """ # Initialize structures. v1_dict = defaultdict(list) siaf = siafdb.SIAF(v2_ref=0., v3_ref=0., v3yangle=0., vparity=1.) t_pars = stp.TransformParameters(siaf=siaf, **calc_wcs_from_time_kwargs) # Calculate V1 for all sources. siaf_db = siafdb.SiafDb(siaf_path) t_pars.siaf_db = siaf_db for source in sources: with dm.open(source) as model: obsstart = model.meta.exposure.start_time obsend = model.meta.exposure.end_time guide_star_wcs = stp.WCSRef( model.meta.guidestar.gs_ra, model.meta.guidestar.gs_dec, model.meta.guidestar.gs_v3_pa_science ) t_pars.guide_star_wcs = guide_star_wcs obstimes, _, vinfos = stp.calc_wcs_over_time(obsstart, obsend, t_pars) sources = [source] * len(obstimes) v1_dict['source'] += sources v1_dict['obstime'] += obstimes v1_dict['v1'] += vinfos # Format and return. v1_table = Table(v1_dict, meta=t_pars.as_reprdict()) return v1_table
[docs] def v1_calculate_over_time(obsstart, obsend, siaf_path=None, **calc_wcs_from_time_kwargs): """Calculate V1 over the given time period Returns a table of all V1 pointings that can be retrieved from the engineering database that exist between, inclusively, the start and end times. The table has the following columns: - source (str): The string "time range" - obstime (astropy.time.Time): The observation time - v1 (float, float, float): 3-tuple or ra, dec, and position angle Parameters ---------- obsstart, obsend : float The MJD start and end time to search for pointings. siaf_path : None or file-like The path to the SIAF database. If none, the default used by the `pysiaf` package is used. See `SiafDb` for more information. calc_wcs_from_time_kwargs : dict Keyword arguments to pass to `calc_wcs_from_time` Returns ------- v1_table : astropy.table.Table Table of V1 pointing """ # Initialize structures. siaf = siafdb.SIAF(v2_ref=0., v3_ref=0., v3yangle=0., vparity=1.) t_pars = stp.TransformParameters(siaf=siaf, **calc_wcs_from_time_kwargs) # Calculate V1 for all sources. siaf_db = siafdb.SiafDb(siaf_path) t_pars.siaf_db = siaf_db obstimes, _, vinfos = stp.calc_wcs_over_time(obsstart, obsend, t_pars) v1_dict = dict() v1_dict['source'] = ['time range'] * len(obstimes) v1_dict['obstime'] = obstimes v1_dict['v1'] = vinfos # Format and return. v1_table = Table(v1_dict, meta=t_pars.as_reprdict()) return v1_table
def simplify_table(v1_table): """Convert pure object-based table to ASCII/Human-friendly The tables as produced by the `v1_calculate` functions use native objects. For instance, the "obstime" column contains `astropy.time.Time` objects and "v1" is the `jwst.lib.set_telescope_pointing.WCSREF` object This routine converts such objects to strings or Python-native builtin objects. Parameters ---------- v1_table: astropy.table.Table V1 table as produced by `v1_calculate` functions. Returns ------- formatted: astropy.table.Table Reformatted table. """ source_formatted = [str(v) for v in v1_table['source']] obstime_formatted = v1_table['obstime'].isot ras, decs, pa_v3s = list(map(list, zip(*v1_table['v1']))) formatted = Table( [source_formatted, obstime_formatted, ras, decs, pa_v3s], names=('source', 'obstime', 'ra', 'dec', 'pa_v3'), meta=v1_table.meta ) return formatted