Metadata-Version: 2.1
Name: oem
Version: 0.3.1
Summary: Python Orbit Ephemeris Message (OEM) tools
Home-page: https://github.com/bradsease/oem
Author: Brad Sease
Author-email: bradsease@gmail.com
License: UNKNOWN
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.0
Description-Content-Type: text/markdown

# Python Orbit Ephemeris Message tools
Python tools for working with Orbit Ephemeris Messages (OEMs).


## Development Status

[![GitHub Release](https://img.shields.io/github/v/release/bradsease/oem)](https://github.com/bradsease/oem/releases) [![GitHub](https://img.shields.io/github/license/bradsease/oem)](https://github.com/bradsease/oem/blob/master/LICENSE)

[![GitHub last commit](https://img.shields.io/github/last-commit/bradsease/oem)](https://github.com/bradsease/oem) [![Pipeline Status](https://gitlab.com/bradsease/oem/badges/master/pipeline.svg)](https://gitlab.com/bradsease/oem/pipelines) [![Coverage Status](https://coveralls.io/repos/github/bradsease/oem/badge.svg?branch=HEAD)](https://coveralls.io/github/bradsease/oem?branch=HEAD) [![Documentation Status](https://readthedocs.org/projects/oem/badge/?version=latest)](https://oem.readthedocs.io/en/latest/?badge=latest)


## Installation
The `oem` package is available through `pip`.
```
pip install oem
```

## Usage
The `OrbitEphemerisMessage` class is the primary interface for OEM Files.
```python
from oem import OrbitEphemerisMessage

ephemeris = OrbitEphemerisMessage.open("input_file.oem")
```
Each OEM is made up of one or more segments of state and optional covariance data. The `OrbitEphemerisMessage` class provides iterables for both.
```python
for segment in ephemeris:
    for state in segment:
        print(state.epoch, state.position, state.velocity, state.acceleration)

    for covariance in segment.covariances:
        print(covariance.epoch, covariance.matrix)
```
All vectors and matrices are numpy arrays.

It is also possible to retrieve a complete list of states and covariances through the `.states` and `.covariances` properties. These attributes streamline interaction with single-segment ephemerides.
```python
for state in ephemeris.states:
    print(state.epoch, state.position, state.velocity)
for covariance in ephemeris.covariances:
    print(covariance.epoch, covariance.matrix)
```

To sample a state at an arbitrary epoch, simply call the ephemeris with an astropy Time object

```python
epoch = Time("2020-01-01T00:00:00", scale="utc")
sampled_state = ephemeris(epoch)
```

Note that this type of sampling is only supported if the time system of the target ephemeris is supported by astropy Time objects. The `.steps` method of both `OrbitEphemerisMessage` and `EphemerisSegment` objects enables iterable, equal-time sampling of ephemeris data. The following example samples an OEM at a 60-second interval.

```python
for state in oem.steps(60)
    pass
```

The above example works for both single- and multi-segment OEMs, however the step sizes may vary at the boundary of the segments. To get consistent step sizes with multiple segments, use the segment interface directly.

```python
for segment in oem:
    for state in segment.steps(60):
        pass
```

The `OrbitEphemerisMessage` facilitates writing of OEMs. To save an already-open OEM, use `.save_as`:
```python
ephemeris.save_as("output.oem", file_format="xml")
```
To convert an ephemeris from one type to another, use the `.convert` class method.
```python
OrbitEphemerisMessage.convert("input_file.oem", "output_file.oem", "kvn")
```


## Reference Standards

This implementation follows the CCSDS recommended standards for Orbit Data Messages.

[1] *Orbit Data Messages*, CCSDS 502.0-B-2, 2012. Available: https://public.ccsds.org/Pubs/502x0b2c1.pdf

[2] *XML Specification for Navigation Data Messages*, CCSDS 505.0-B-1, 2010. Available: https://public.ccsds.org/Pubs/505x0b1.pdf


