gmat-run
Run GMAT mission scripts from Python and get results as pandas DataFrames.
What this is
gmat-run drives NASA's General Mission Analysis Tool (GMAT) from Python. You bring a working
.script; gmat-run discovers your GMAT install, loads the mission, lets you override fields from
Python with type coercion, runs it headlessly, and parses GMAT's ReportFile, ephemeris,
ContactLocator, and solver-log output into typed pandas DataFrames.
What this is not
- Not a way to build GMAT missions from scratch in Python — see
gmatpyplusfor that. - Not a
.scripttext generator — seepygmat. - Not a parallel sweep runner — see
gmat-sweep, an astro-tools project built on top.
Requirements
- Python 3.10, 3.11, or 3.12.
- A local GMAT install. gmat-run does not ship GMAT binaries — install GMAT separately from gmat.gsfc.nasa.gov.
Supported GMAT versions
| GMAT release | Status | CI |
|---|---|---|
| R2026a | Primary development target | Exercised on every PR (Ubuntu + Windows + macOS, Python 3.10/3.11/3.12) |
| R2025a | Supported | Exercised on every PR (Ubuntu + Windows + macOS, Python 3.10/3.11/3.12) |
| R2022a | Expected to work | Not exercised in CI (Python 3.9 ABI floor; see known limitations) |
Report any version-specific breakage as an issue and we'll add a CI cell for it.
Installation
pip install gmat-run
Optional extras unlock format- and feature-specific code paths. Each is named after the dependency it pulls in:
| Extra | Pulls in | Unlocks |
|---|---|---|
[spiceypy] |
spiceypy |
SPK (NASA SPICE binary) ephemeris parsing. |
[ccsds-ndm] |
ccsds-ndm |
CCSDS-OEM export via Results.write_oem. |
[astropy] |
astropy |
Leap-second-correct time-scale conversion via gmat_run.time. |
Install one or more at once:
pip install gmat-run[spiceypy]
pip install gmat-run[astropy,ccsds-ndm]
Quick start
Load a script, override a field, run the mission, and read each output GMAT wrote as a pandas DataFrame:
from gmat_run import Mission
mission = Mission.load("flyby.script")
mission["Sat.SMA"] = 7000
result = mission.run()
# ReportFile → DataFrame, with UTCGregorian / *ModJulian epoch columns
# promoted to datetime64[ns].
result.reports["ReportFile1"].plot(x="UTCGregorian", y="Sat.Earth.Altitude")
# EphemerisFile → DataFrame, dispatching on file format.
ephem = result.ephemerides["EphemerisFile1"]
# ContactLocator → DataFrame; df.attrs["report_format"] carries the variant.
contacts = result.contacts["ContactLocator1"]
# Solver → DataFrame per Target/Optimize run: iteration history, residuals,
# and a convergence flag. result.converged["DC"] is the quick yes/no.
iterations = result.solver_runs["DC"]
Mission.load discovers a local GMAT install (honouring the GMAT_ROOT environment variable
or a gmat_root= argument), bootstraps gmatpy, and parses the script into the live GMAT
object graph. Subscript access reads and writes fields against that graph with type coercion:
| Pattern | Example |
|---|---|
Resource.Field |
mission["Sat.SMA"] = 7000 |
Resource.SubResource.Field |
mission["FM.Drag.CSSISpaceWeatherFile"] = "/path/CSSI.txt" |
Variable.Value |
mission["elapsed_seconds.Value"] = 86400.0 |
mission.run() executes the mission sequence headlessly, captures GMAT's log, and returns a
Results exposing four lazy mappings — reports, ephemerides, contacts, and
solver_runs — each keyed by the GMAT resource name and parsing to a DataFrame on first
access. See Outputs below for the formats covered.
A gmat-run console script is also installed for shell-script and smoke-test use:
gmat-run run flyby.script --out results/
See the CLI reference for flags, exit codes, and sample output.
Outputs
Results exposes four mappings, each keyed by the GMAT resource name as declared in the
.script:
ReportFile→ DataFrame, withUTCGregorianand*ModJulianepoch columns promoted todatetime64[ns].EphemerisFile→ DataFrame, dispatching on file format: CCSDS-OEM and STK-TimePosVel are read out of the box; SPK (NASA SPICE binary) is read with the[spiceypy]extra installed. Code-500 (GSFC binary) is not implemented — see Known limitations.ContactLocator→ DataFrame, supporting Legacy and the five tabularReportFormatvariants.df.attrs["report_format"]carries the variant name so downstream code can branch on it without inspecting the column set.Solver→ one DataFrame perTarget/Optimizerun, parsed from the iteration log GMAT writes for eachSolver. One row per iteration, with a column perVaryvariable, the goal/constraint residuals, and astatuscolumn;df.attrs["converged"]and theResults.convergedshortcut answer the yes/no.DifferentialCorrectorandYukonare covered.
Each mapping has a sibling path accessor — report_paths, ephemeris_paths,
contact_paths, and solver_paths — mapping each resource name to the file GMAT wrote,
so you can locate an output without parsing it.
Documentation
Full docs at https://astro-tools.github.io/gmat-run/, including a getting-started guide, GMAT install instructions, a Run gmat-run in your CI cookbook page, the CLI reference, and the API reference.
Runnable example notebooks:
- Load / run / plot — load a stock GMAT sample, run it, and plot altitude over time end-to-end.
- Parameter sweep —
vary
Sat.SMAacross a range, run the same script for each, and overlay the resulting orbits. - Ground track — read an
EphemerisFilefromResults.ephemeridesand plot the spacecraft's ground track on an equirectangular world map. - Export to CCSDS-OEM —
run a stock GMAT sample that emits an STK ephemeris, convert it to a CCSDS-OEM file
with
Results.write_oem, re-parse the result, and visualise the trajectory in 3D. - Time-scale conversion —
propagate across the 2017-01-01 leap-second boundary and convert the resulting
ReportFile's epoch columns between A1, TAI, UTC, TT, and TDB with
gmat_run.timeand the parser-levelconvert_to=keyword. - Solver iterations —
target a Hohmann transfer with a
DifferentialCorrectorand read the iteration history back fromResults.solver_runs: theVaryvariables, theAchievegoal residuals, and a convergence flag.
Development
To work on gmat-run itself:
git clone https://github.com/astro-tools/gmat-run.git
cd gmat-run
uv sync --all-groups
See CONTRIBUTING.md for the full branch / PR / test workflow.
Licence
MIT. See LICENSE.
Metadata
Release files for gmat-run 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gmat_run-0.6.0.tar.gz | 1.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gmat_run-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.6 MB
Release files / gmat_run-0.6.0.tar.gz
| Download URL | gmat_run-0.6.0.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6e5777891944fa1603337185b8be8215c66875f6a2fa437202e8489558f6e378
|
|
BLAKE2b-256 checksum How to use checksums |
f5523d0bfe5e4b420435645807978825107e2d0d15882d78abe96c8c17950062
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 22, 2026.
Transparency logRelease files / gmat_run-0.6.0-py3-none-any.whl
| Download URL | gmat_run-0.6.0-py3-none-any.whl |
|---|---|
| Size | 100.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ac452ab7f3036568f32a7e6b5b094c822354b8c5d284dedb87961352d49b2c8b
|
|
BLAKE2b-256 checksum How to use checksums |
4bd85bb6a96515609ad30606709badeb16e1b761abe9041bdc2255727f06f0c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 22, 2026.
Transparency log