Source code for jwst.lib.pointing_summary

"""
Pointing Summary.

Review contents of a set of given models for pointing information.
Compare the calculated V1 and REFPOINT pointing with the proposed
TARGET pointing.

Examples
--------
>>> from stdatamodels.jwst.datamodels import ImageModel
>>> im = ImageModel()
>>> im.meta.target.ra = 90.75541666666666
>>> im.meta.target.dec = -66.56055555555554
>>> im.meta.pointing.ra_v1 = 91.08142004561715
>>> im.meta.pointing.dec_v1 = -66.60547868904696
>>> im.meta.wcsinfo.ra_ref = 90.70377653291781
>>> im.meta.wcsinfo.dec_ref = -66.59540223936895
>>> calc_pointing_deltas(im)
Delta(target=<SkyCoord (ICRS): (ra, dec) in deg
    (90.75541667, -66.56055556)>, v1=<SkyCoord (ICRS): (ra, dec) in deg
    (91.08142005, -66.60547869)>, refpoint=<SkyCoord (ICRS): (ra, dec) in deg
    (90.70377653, -66.59540224)>, delta_v1=<Angle 0.13712727 deg>, delta_refpoint=<Angle 0.04044315 deg>)

>>> t = calc_deltas([im])
>>> print(t.columns)
<TableColumns names=('exposure','target','v1','refpoint','delta_v1','delta_refpoint')>
>>> delta_v1 = t["delta_v1"][0]
>>> "%.13f" % delta_v1
'0.1371272716401'
>>> delta_refpoint = t["delta_refpoint"][0]
>>> "%.13f" % delta_refpoint
'0.0404431476150'
"""  # noqa: E501

import logging
from collections import defaultdict, namedtuple

import astropy.units as u
import stdatamodels.jwst.datamodels as dm
from astropy.coordinates import SkyCoord
from astropy.table import Table

logger = logging.getLogger(__name__)

__all__ = ["Delta", "calc_pointing_deltas", "calc_deltas"]

# Basic delta structure
Delta = namedtuple("Delta", "target, v1, refpoint, delta_v1, delta_refpoint")


[docs] def calc_pointing_deltas(model): """ Calculate pointing deltas. Parameters ---------- model : `~stdatamodels.jwst.datamodels.JwstDataModel` The model to check pointing information in. Returns ------- delta : Delta A `~collections.namedtuple` with the following keys. If for some reason a value could not be determined, `None` is given. - 'target': `~astropy.coordinates.SkyCoord` of the target. - 'v1': `~astropy.coordinates.SkyCoord` of V1. - 'refpoint': `~astropy.coordinates.SkyCoord` of the reference point. - 'delta_v1': Difference between V1 and proposed TARGET. - 'delta_refpoint': Difference between reference pixel pointing and TARGET. """ # Retrieve the info from the model target = SkyCoord(model.meta.target.ra * u.degree, model.meta.target.dec * u.degree) v1 = SkyCoord(model.meta.pointing.ra_v1 * u.degree, model.meta.pointing.dec_v1 * u.degree) refpoint = SkyCoord(model.meta.wcsinfo.ra_ref * u.degree, model.meta.wcsinfo.dec_ref * u.degree) # Calculate separations delta = Delta( target=target, v1=v1, refpoint=refpoint, delta_v1=target.separation(v1), delta_refpoint=target.separation(refpoint), ) return delta
[docs] def calc_deltas(exposures, extra_meta=None): """ Create table of pointing deltas. Parameters ---------- exposures : [file-like[,...]] or [DataModel[,...]] List of file-like objects or `~stdatamodels.jwst.datamodels.JwstDataModel` to retrieve pointing information from. extra_meta : [str[,...]] or None List of model meta attributes to add to the table. Returns ------- deltas : `astropy.table.Table` Table of results with the following columns: - exposure: The exposure the pointing information is from. - target: `~astropy.coordinates.SkyCoord` of the proposed target. - v1: `~astropy.coordinates.SkyCoord` of v1. - refpoint: `~astropy.coordinates.SkyCoord` of the reference point. - delta_v1: target - V1 separation. - delta_refpoint: target - refpoint separation. """ # Initialize structures targets = [] v1s = [] refpoints = [] delta_v1s = [] delta_refpoints = [] extra_meta_values = defaultdict(list) extra_meta = extra_meta if extra_meta is not None else [] # Calculate deltas for all input. for exposure in exposures: with dm.open(exposure) as model: delta = calc_pointing_deltas(model) logger.info( "%s: delta v1=%s delta refpoint=%s", model, delta.delta_v1, delta.delta_refpoint ) targets.append(delta.target) v1s.append(delta.v1) refpoints.append(delta.refpoint) delta_v1s.append(delta.delta_v1.degree) delta_refpoints.append(delta.delta_refpoint.degree) for meta in extra_meta: extra_meta_values[meta].append(model[meta]) # Places results into a Table. deltas_dict = { "exposure": exposures, "target": targets, "v1": v1s, "refpoint": refpoints, "delta_v1": delta_v1s, "delta_refpoint": delta_refpoints, } deltas_dict.update(extra_meta_values) deltas = Table(deltas_dict) return deltas