This tutorial walks you through installing PyNeats and running your first climate impact computation.
- Python 3.11+
- uv (recommended package manager)
- BADA data — EUROCONTROL aircraft performance coefficients (required for full pipeline)
- Weather data — DWD ICON or ERA5 meteorological data in Zarr format
git clone https://github.com/eurocontrol-asu/PyNeats.git
cd PyNeats
make installThis runs uv sync and installs external dependencies (PyBADA, open-airclim).
make test-unitUnit tests run without external data.
PyNeats requires two external data sources:
| Data | Format | Source |
|---|---|---|
| BADA coefficients | Directory | EUROCONTROL (licensed) |
| Weather | Zarr store | DWD ICON or ERA5 |
Set the paths as environment variables or pass them as CLI arguments:
export BADA_PATH=/path/to/bada/data
export WEATHER_PATH=/path/to/weather/zarrProcess a fleet of flights from a JSON file:
uv run python examples/fleet_computation_from_json.py \
--json-file tests/data/golden/fleet_5_flights_input.json \
--weather-path $WEATHER_PATH \
--bada-path $BADA_PATH \
--njobs 4The pipeline executes these steps sequentially for each flight:
- Parse — Extract 4D trajectory from input data
- Interpolate — Resample to 60-second intervals
- Weather — Intersect trajectory with meteorological fields
- Performance — Compute fuel flow and thrust via BADA
- Emissions — Calculate emission indices (NOₓ, nvPM, etc.)
- Climate functions — Estimate climate forcing (CoCiP, aCCFs)
- Climate metrics — Convert to GWP / CO₂-equivalent
By default PyNeats uses NeatsTrajectoryParser (registered as "neats") for
NEATS JSON format. For OpenSky ADS-B data, use OpenSkyParser (registered as
"adsb"). Both implement the TrajectoryParser protocol (an interface,
not an instantiable class) and are selected by name via the step registry:
from pyneats.core.steps_registry import build
from pyneats.steps.parsing.protocol import TrajectoryParser
# Default — returns a NeatsTrajectoryParser instance
parser = build(TrajectoryParser, "neats")
# OpenSky ADS-B — returns an OpenSkyParser instance
parser = build(TrajectoryParser, "adsb")build(Protocol, name, **params) looks up the registered implementation and
instantiates it with the given parameters. Any class decorated with
@register(TrajectoryParser, "<name>") is interchangeable — see
Extending Steps to plug in a custom
parser.
# Unit tests only (no external data required)
make test-unit
# Full test suite
make test BADA_PATH=/path/to/bada WEATHER_PATH=/path/to/weather
# Fast (no coverage)
make test-fast BADA_PATH=/path/to/bada- Usage guide — Processing flights from DataFrames, building weather caches
- Architecture — System design and module overview
- Example scripts — Runnable example scripts reference
- Input format — JSON input schema
- Output format —
runner.resultsschema - Glossary — Domain terms (aCCF, CoCiP, EAGWP, …)