ska_tdb

Access the Chandra Telemetry Database

The ska_tdb package provides a convenient mechanism to retrieve all data in the Chandra ODB Telemetry Database (TDB) tables. The default values correspond to the latest definitions available in the CSV (text) dump of the TDB. Versions going back to P004 are also accessible (see TDB version).

A description of the tables is availble in the TDB table definitions section.

Usage

The TDB table entries can be accessed via the module-level variables tables and msids. The msids variable is the main workhorse for ska_tdb, while the tables variable is needed for tables that do not have an MSID column.

Msids

The msids variable allows access to all information related to a particular MSID. It behaves like a Python dict where you use the MSID name (case-insenstive) as the key. Once you have a particular MSID selected you can then retrieve all table entries related to that MSID by accessing attributes corresponding to the TDB table name.

Examples:

>>> from ska_tdb import msids
>>> msids.<TAB>  # See available attributes

This returns the following, where all the TDB tables with MSID data begin with capital “T” and columns from the tmsrment table are available as lower case attributes:

msids.Tcntr                        msids.calibration_type        msids.limit_switch_msid
msids.Tlmt                         msids.counter_msid            msids.low_raw_count
msids.Tloc                         msids.data_type               msids.msid
msids.Tmsrment                     msids.description             msids.owner_id
msids.Tpc                          msids.ehs_header_flag         msids.prop
msids.Tpp                          msids.eng_unit                msids.range_msid
msids.Tsc                          msids.es_default_set_num      msids.technical_name
msids.Tsmpl                        msids.es_switch_msid          msids.total_length
msids.calibration_default_set_num  msids.high_raw_count
msids.calibration_switch_msid      msids.limit_default_set_num

If you examine any of those attributes for the msids variable you get the results for all MSIDS.

Now select a particular MSID and see that it has the same attributes:

>>> tephin = msids['tephin']
>>> tephin.<TAB>  # See available attributes
tephin.Tcntr                        tephin.calibration_type             tephin.limit_default_set_num
tephin.Tlmt                         tephin.counter_msid                 tephin.limit_switch_msid
tephin.Tloc                         tephin.data_type                    tephin.low_raw_count
tephin.Tmsrment                     tephin.description                  tephin.msid
tephin.Tpc                          tephin.ehs_header_flag              tephin.owner_id
tephin.Tpp                          tephin.eng_unit                     tephin.prop
tephin.Tsc                          tephin.es_default_set_num           tephin.range_msid
tephin.Tsmpl                        tephin.es_switch_msid               tephin.technical_name
tephin.calibration_default_set_num  tephin.find                         tephin.total_length
tephin.calibration_switch_msid      tephin.high_raw_count

Finally look at the attributes:

>>> tephin.Tmsrment  # MSID definition (description, tech name etc)
('TEPHIN', 'EPHIN SENSOR HOUSING TEMP', 'IUNS', 'PP', 'DEGF', 0, 255, 8,
 'N', '0', '0', '0', 1, '0', 1, '0', 0, 'THM', 'LR/15/PA/2', 'U')
>>> tephin.Tpp  # Calibration point pair values
array([('TEPHIN', 1, 15, 232, -51.90456), ('TEPHIN', 1, 9, 110, 47.0923),
       ('TEPHIN', 1, 14, 223, -38.30814),
       ('TEPHIN', 1, 13, 214, -27.81212),
       ('TEPHIN', 1, 12, 203, -17.23066), ('TEPHIN', 1, 11, 190, -6.5357),
       ('TEPHIN', 1, 10, 172, 6.45808), ('TEPHIN', 1, 16, 255, -103.49045),
       ('TEPHIN', 1, 1, 0, 215.03), ('TEPHIN', 1, 7, 76, 72.95052),
       ('TEPHIN', 1, 6, 64, 84.09784), ('TEPHIN', 1, 5, 54, 94.86368),
       ('TEPHIN', 1, 4, 46, 104.89), ('TEPHIN', 1, 3, 38, 116.7678),
       ('TEPHIN', 1, 2, 28, 135.846), ('TEPHIN', 1, 8, 91, 60.77076)],
      dtype=[('MSID', '|S14'), ('CALIBRATION_SET_NUM', '<i8'), ('SEQUENCE_NUM', '<i8'),
             ('RAW_COUNT', '<i8'), ('ENG_UNIT_VALUE', '<f8')])
>>> tephin.Tsc  # No state codes so it returns None
>>> tephin.technical_name
'EPHIN SENSOR HOUSING TEMP'
>>> tephin.data_type
'IUNS'

Finding MSIDs

With the msids object you can search the TDB for MSIDs of interest:

>>> msids.find('teph')

This applies the specified search expression to the MSID name, description, and technical description.

This returns a list of MsidView objects:

[<MsidView msid="TEPHIN" technical_name="EPHIN SENSOR HOUSING TEMP">,
 <MsidView msid="TEPHTRP1" technical_name="HTR ENA/DIS: EIA/RCTU-EP/PSU1 PRI (CH0)">,
 <MsidView msid="TEPHTRP2" technical_name="HTR ENA/DIS: EIA/RCTU-EP/PSU1 PRI (CH1)">,
 <MsidView msid="TEPHTRR1" technical_name="HTR ENA/DIS: EIA/RCTU-EP/PSU1 RDNT (CH0)">,
 <MsidView msid="TEPHTRR2" technical_name="HTR ENA/DIS: EIA/RCTU-EP/PSU1 RDNT (CH1)">]

The search value can be any valid Python regular expression, for instance pea1 followed by at least one character followed by temperature::a

>>> msids.find('pea1.+temperature')

If required you can dig deeper, for instance:

>>> tephs = msids.find('teph')
>>> for x in tephs:
...     print(x.msid, x.description, x.data_type)
('TEPHIN', 'LR/15/PA/2', 'IUNS')
('TEPHTRP1', 'EP/3/SD/0 ISATS MOM BEIA0W01 BIT 3 EIA/RCTU-EP PRI HTR ON/OFF (CH0)', 'IDIS')
('TEPHTRP2', 'EP/3/SD/1 ISATS MOM BEIA1W01 BIT 3 EIA/RCTU-EP PRI HTR ON/OFF (CH1)', 'IDIS')
('TEPHTRR1', 'EP/3/SD/0 ISATS MOM BEIA0W09 BIT 3 EIA/RCTU-EP RDNT HTR ON/OFF (CH0)', 'IDIS')
('TEPHTRR2', 'EP/3/SD/1 ISATS MOM BEIA1W09 BIT 3 EIA/RCTU-EP RDNT HTR ON/OFF (CH1)', 'IDIS')

Finally, you can provide multiple match arguments. This then returns the logical-and result of running the find() call for each argument individually.

>>> msids.find('aca', 'filter')
[<MsidView msid="AOACIDPX" technical_name="ACA DATA PROCESSING DEFECTIVE PIXEL FILTER ENAB/DISA">,
 <MsidView msid="AOACIIRS" technical_name="ACA DATA PROCESSING IONIZING RADIATION FILTER ENAB/DISA">,
 <MsidView msid="AOACIMSS" technical_name="ACA DATA PROCESSING MULTIPLE STARS FILTER ENAB/DISA">,
 <MsidView msid="AOACISPX" technical_name="ACA DATA PROCESSING SATURATED PIXEL FILTER ENAB/DISA">]

Tables

The tables variable allows direct access to TDB tables. This variable is a special dict object that returns a TableView object when you ask for a TDB table such as tmsrment (MSID descriptions) or tsc (MSID state codes).

After you import the tables variable you can ask for the names of all available tables:

from ska_tdb import tables
tables.keys()  # show all available tables

You then select a table with the table name (which must be lower case):

>>> tmsrment = tables['tmsrment']

With this table selected you can show the table, show all columns for that table, or get the values for a particular column:

>>> tmsrment  # show the table
  ... <SNIP> ...
>>> tmsrment.colnames  # column names for this table
('MSID', 'TECHNICAL_NAME', 'DATA_TYPE', 'CALIBRATION_TYPE', 'ENG_UNIT', 'LOW_RAW_COUNT',
'HIGH_RAW_COUNT', 'TOTAL_LENGTH', 'PROP', 'COUNTER_MSID', 'RANGE_MSID', 'CALIBRATION_SWITCH_MSID',
'CALIBRATION_DEFAULT_SET_NUM', 'LIMIT_SWITCH_MSID', 'LIMIT_DEFAULT_SET_NUM', 'ES_SWITCH_MSID',
'ES_DEFAULT_SET_NUM', 'OWNER_ID', 'DESCRIPTION', 'EHS_HEADER_FLAG')
>>> tmsrment['technical_name']
array(['OFFLINE SCIENCE DATA FOR ACIS 1 OF 2',
       'OFFLINE SCIENCE DATA FOR ACIS ADDITIONAL', 'CAMERA BODY TEMP. A',
       ..., 'RCS-2 thruster valve 01 temperature (OBC reading)',
       'RCS-2 thruster valve 02 temperature (OBC reading)',
       'ACIS High Radiation Flag'],
      dtype='|S59')

For tables that have an MSID column you can filter on the MSID to see only entries for that MSID. The MSID names are case-insensitive.

>>> tmsrment['tephin']  # only TEPHIN entries
('TEPHIN', 'EPHIN SENSOR HOUSING TEMP', 'IUNS', 'PP', 'DEGF', 0, 255, 8, 'N',
'0', '0', '0', 1, '0', 1, '0', 0, 'THM', 'LR/15/PA/2', 'U')
>>> tables['tsc']['aoattqt4']  # State codes for AOATTQT4
array([], dtype=[('MSID', '|S15'), ('CALIBRATION_SET_NUM', '<i8'), ('SEQUENCE_NUM', '<i8'),
('LOW_RAW_COUNT', '<i8'), ('HIGH_RAW_COUNT', '<i8'), ('STATE_CODE', '|S4')])
>>> tables['tpp']['TEPHIN']  # Point pair for TEPHIN
array([('TEPHIN', 1, 15, 232, -51.90456), ('TEPHIN', 1, 9, 110, 47.0923),
       ('TEPHIN', 1, 14, 223, -38.30814),
       ('TEPHIN', 1, 13, 214, -27.81212),
       ('TEPHIN', 1, 12, 203, -17.23066), ('TEPHIN', 1, 11, 190, -6.5357),
       ('TEPHIN', 1, 10, 172, 6.45808), ('TEPHIN', 1, 16, 255, -103.49045),
       ('TEPHIN', 1, 1, 0, 215.03), ('TEPHIN', 1, 7, 76, 72.95052),
       ('TEPHIN', 1, 6, 64, 84.09784), ('TEPHIN', 1, 5, 54, 94.86368),
       ('TEPHIN', 1, 4, 46, 104.89), ('TEPHIN', 1, 3, 38, 116.7678),
       ('TEPHIN', 1, 2, 28, 135.846), ('TEPHIN', 1, 8, 91, 60.77076)],
      dtype=[('MSID', '|S14'), ('CALIBRATION_SET_NUM', '<i8'), ('SEQUENCE_NUM', '<i8'),
             ('RAW_COUNT', '<i8'), ('ENG_UNIT_VALUE', '<f8')])

TDB version

P010 is the default version of the TDB that is accessed. To change this, specify the new version as an integer, e.g. 8 for version P008. In this example we roll back time to P008 when the TEPHIN database limits were much lower:

>>> msids['tephin'].Tlmt
('TEPHIN', 1, 10.0, 150.0, 5.0, 999.0, 0, 5, 'A')

>>> import ska_tdb
>>> ska_tdb.set_tdb_version(8)

>>> msids['tephin'].Tlmt
('TEPHIN', 1, 10.0, 81.0, 5.0, 86.0, 0, 5, 'A')

API Documentation

TDB table definitions

tcntr

Column

Type

MSID

string(8)

STREAM_NUMBER

int

INIT_VALUE

int

END_VALUE

int

WRAP_AROUND_FLAG

string(1)

DIR

string(1)

DELTA

int

COUNTER_TYPE

string(3)

tes

Column

Type

MSID

string(15)

ES_SET_NUM

int

EXPECTED_STATE

string(4)

TOLER

int

EM_ALL_SAMP_FLAG

string(1)

tlmt

Column

Type

MSID

string(14)

LIMIT_SET_NUM

int

CAUTION_LOW

float

CAUTION_HIGH

float

WARNING_LOW

float

WARNING_HIGH

float

DELTA

int

TOLER

int

EM_ALL_SAMP_FLAG

string(1)

tloc

Column

Type

MSID

string(15)

STREAM_NUMBER

int

SYLLABLE_NUMBER

int

START_MINOR_FRAME

int

START_WORD

int

START_BIT

int

LENGTH

int

tmsrment

Column

Type

MSID

string(15)

TECHNICAL_NAME

string(59)

DATA_TYPE

string(4)

CALIBRATION_TYPE

string(2)

ENG_UNIT

string(7)

LOW_RAW_COUNT

int

HIGH_RAW_COUNT

int

TOTAL_LENGTH

int

PROP

string(1)

COUNTER_MSID

string(8)

RANGE_MSID

string(8)

CALIBRATION_SWITCH_MSID

string(8)

CALIBRATION_DEFAULT_SET_NUM

int

LIMIT_SWITCH_MSID

string(8)

LIMIT_DEFAULT_SET_NUM

int

ES_SWITCH_MSID

string(7)

ES_DEFAULT_SET_NUM

int

OWNER_ID

string(4)

DESCRIPTION

string(240)

EHS_HEADER_FLAG

string(1)

towner

Column

Type

OWNER_ID

string(4)

DESCRIPTION

string(53)

tpc

Column

Type

MSID

string(9)

CALIBRATION_SET_NUM

int

ENG_UNIT_LOW

float

ENG_UNIT_HIGH

float

DEG

int

COEF0

float

COEF1

float

COEF2

float

COEF3

float

COEF4

float

COEF5

float

COEF6

float

COEF7

float

COEF8

float

COEF9

float

tpp

Column

Type

MSID

string(14)

CALIBRATION_SET_NUM

int

SEQUENCE_NUM

int

RAW_COUNT

int

ENG_UNIT_VALUE

float

tsc

Column

Type

MSID

string(15)

CALIBRATION_SET_NUM

int

SEQUENCE_NUM

int

LOW_RAW_COUNT

int

HIGH_RAW_COUNT

int

STATE_CODE

string(4)

tsmpl

Column

Type

MSID

string(15)

STREAM_NUMBER

int

PAR_COMP

string(2)

SAMPLE_PER_GROUP

int

GROUP_SAMPLE_OFSET

int

SAMPLE_COMP

string(1)

SAMPLE_RATE

int

OFSET

int

START_COUNTER_VALUE

int

COUNTER_OFSET

int

LOW_RANGE

int

HIGH_RANGE

int

STATE_CODE

string(4)

CONTEXT_PACKET_ID

int

CONTEXT_LVT_LOCATION

int

tstream

Column

Type

STREAM_NUMBER

int

STREAM_TYPE

string(1)

STREAM_ID

string(4)

STREAM_FORMAT_ID

string(3)

PROTOCOL

int

STREAM_PRIORITY

int

STREAM_PROP

string(1)

STREAM_OWNER_ID

string(4)

STREAM_DESCRIPTION

string(38)

ttdm

Column

Type

TDM_ID

string(4)

FORMAT_ID_MSID

string(8)

TIME_MSID

string(1)

SYNC_PATTERN

string(6)

SYNC_PATTERN_MSID

string(7)

SYNC_LENGTH

int

ttdm_fmt

Column

Type

TDM_ID

string(4)

TDM_FORMAT_ID

string(3)

FORMAT

int

BITS_PER_WORD

int

WORDS_PER_MINOR_FRAME

int

MINOR_FRAMES_PER_MAJOR_FRAME

int

DATA_CYCLE

int

MAJOR_FRAME_PERIOD

float

ENCAP_STREAM_NUMBER

int

ENCAP_BOUNDARY

string(1)

ENCAP_FRAME_PER_PACKET

int