#! /usr/bin/env python
"""Module for dealing with JWST DMS Engineering Database mnemonics.
This module provides ``jwql`` with convenience classes and functions
to retrieve and manipulate mnemonics from the JWST DMS EDB. It uses
the `edb_interface` module to interface the EDB directly.
Authors
-------
- Johannes Sahlmann
Use
---
This module can be imported and used with
::
from jwql.edb.engineering_database import get_mnemonic
get_mnemonic(mnemonic_identifier, start_time, end_time)
Required arguments:
``mnemonic_identifier`` - String representation of a mnemonic name.
``start_time`` - astropy.time.Time instance
``end_time`` - astropy.time.Time instance
Notes
-----
There are three possibilities for MAST authentication:
1. A valid MAST authentication token is present in the local
``jwql`` configuration file (config.json).
2. The MAST_API_TOKEN environment variable is set to a valid
MAST authentication token.
3. The user has logged into the ``jwql`` web app, in which
case they are authenticated via auth.mast.
When querying mnemonic values, the underlying MAST service returns
data that include the datapoint preceding the requested start time
and the datapoint that follows the requested end time.
"""
from collections import OrderedDict
from astropy.time import Time
from bokeh.embed import components
from bokeh.plotting import figure
import numpy as np
from jwql.utils.credentials import get_mast_token
from jwedb.edb_interface import query_single_mnemonic, query_mnemonic_info
[docs]class EdbMnemonic:
"""Class to hold and manipulate results of DMS EngDB queries."""
def __init__(self, mnemonic_identifier, start_time, end_time, data, meta, info):
"""Populate attributes.
Parameters
----------
mnemonic_identifier : str
Telemetry mnemonic identifier
start_time : astropy.time.Time instance
Start time
end_time : astropy.time.Time instance
End time
data : astropy.table.Table
Table representation of the returned data.
meta : dict
Additional information returned by the query
info : dict
Auxiliary information on the mnemonic (description,
category, unit)
"""
self.mnemonic_identifier = mnemonic_identifier
self.requested_start_time = start_time
self.requested_end_time = end_time
self.data = data
self.data_start_time = Time(np.min(np.array(self.data['MJD'])), format='mjd')
self.data_end_time = Time(np.max(np.array(self.data['MJD'])), format='mjd')
self.meta = meta
self.info = info
def __str__(self):
"""Return string describing the instance."""
return 'EdbMnemonic {} with {} records between {} and {}'.format(
self.mnemonic_identifier, len(self.data), self.data_start_time.isot,
self.data_end_time.isot)
[docs] def interpolate(self, times, **kwargs):
"""Interpolate value at specified times."""
raise NotImplementedError
[docs] def bokeh_plot(self):
"""Make basic bokeh plot showing value as a function of time.
Returns
-------
[div, script] : list
List containing the div and js representations of figure.
"""
abscissa = Time(self.data['MJD'], format='mjd').datetime
ordinate = self.data['euvalue']
p1 = figure(tools='pan,box_zoom,reset,wheel_zoom,save', x_axis_type='datetime',
title=self.mnemonic_identifier, x_axis_label='Time',
y_axis_label='Value ({})'.format(self.info['unit']))
p1.line(abscissa, ordinate, line_width=1, line_color='blue', line_dash='dashed')
p1.circle(abscissa, ordinate, color='blue')
script, div = components(p1)
return [div, script]
[docs]def get_mnemonic(mnemonic_identifier, start_time, end_time):
"""Execute query and return a EdbMnemonic instance.
The underlying MAST service returns data that include the
datapoint preceding the requested start time and the datapoint
that follows the requested end time.
Parameters
----------
mnemonic_identifier : str
Telemetry mnemonic identifiers, e.g. 'SA_ZFGOUTFOV'
start_time : astropy.time.Time instance
Start time
end_time : astropy.time.Time instance
End time
Returns
-------
mnemonic : instance of EdbMnemonic
EdbMnemonic object containing query results
"""
mast_token = get_mast_token()
data, meta, info = query_single_mnemonic(mnemonic_identifier, start_time, end_time,
token=mast_token)
# create and return instance
mnemonic = EdbMnemonic(mnemonic_identifier, start_time, end_time, data, meta, info)
return mnemonic
[docs]def get_mnemonics(mnemonics, start_time, end_time):
"""Query DMS EDB with a list of mnemonics and a time interval.
Parameters
----------
mnemonics : list or numpy.ndarray
Telemetry mnemonic identifiers, e.g. ['SA_ZFGOUTFOV',
'IMIR_HK_ICE_SEC_VOLT4']
start_time : astropy.time.Time instance
Start time
end_time : astropy.time.Time instance
End time
Returns
-------
mnemonic_dict : dict
Dictionary. keys are the queried mnemonics, values are
instances of EdbMnemonic
"""
if not isinstance(mnemonics, (list, np.ndarray)):
raise RuntimeError('Please provide a list/array of mnemonic_identifiers')
mnemonic_dict = OrderedDict()
for mnemonic_identifier in mnemonics:
# fill in dictionary
mnemonic_dict[mnemonic_identifier] = get_mnemonic(mnemonic_identifier, start_time, end_time)
return mnemonic_dict
[docs]def get_mnemonic_info(mnemonic_identifier):
"""Return the mnemonic description.
Parameters
----------
mnemonic_identifier : str
Telemetry mnemonic identifier, e.g. ``SA_ZFGOUTFOV``
Returns
-------
info : dict
Object that contains the returned data
"""
mast_token = get_mast_token()
return query_mnemonic_info(mnemonic_identifier, token=mast_token)