Repository overview

rms-picmaker is a SETI / PDS Ring-Moon Systems Node tool that converts binary astronomy images (PDS3-labeled, VICAR, FITS, plus a handful of common raster formats) into JPEG, PNG, BMP, GIF, or TIFF files. It ships as both a command-line tool (the picmaker console script) and an importable Python library (import picmaker).

The project is a single Python package under src/picmaker/ with a small flat module layout (no deep sub-packages except for the instruments subpackage). The CLI is a thin layer around the library: every --flag binds to a keyword argument of picmaker.pipeline.images_to_pics(), and the validation rules that gate both surfaces live in one place (PicmakerOptions).

Setting up a development environment

Clone the repository and create a virtual environment in the project root. The scripts under scripts/ and the lint / type / test configuration all expect the venv to live at ./venv:

git clone https://github.com/SETI/rms-picmaker.git
cd rms-picmaker
python -m venv venv
source venv/bin/activate          # On Windows: venv\Scripts\activate
pip install -e ".[dev]"

The [dev] extra pulls in the test runner, linters, type checker, documentation builder, and packaging audit tools used by scripts/run-all-checks.sh and CI. Once installed, a fast end-to-end check is:

bash scripts/run-all-checks.sh

Layout

rms-picmaker/
├── src/picmaker/             # Importable Python package.
│   ├── __init__.py           # Public API re-exports + __version__.
│   ├── picmaker.py           # Alternate import path; re-exports the same names as __init__.py.
│   ├── cli.py                # argparse CLI; builds option_dict; dispatches.
│   ├── pipeline.py           # process_images + images_to_pics (the pipeline).
│   ├── options.py            # PicmakerOptions dataclass + validate().
│   ├── io.py                 # Reader cascade + output-path helpers.
│   ├── enhance.py            # Intensity stretch / gamma / colormap.
│   ├── geometry.py           # Slice / crop / rotate / size / wrap / pad.
│   ├── color.py              # Per-filter tint dispatch (mission-agnostic).
│   ├── pil_utils.py          # numpy ↔ PIL bridges + write_pil.
│   ├── _filters.py           # PIL ImageFilter dispatch table.
│   ├── _rgb.py               # Wavelength → RGB lookup tables (private).
│   ├── tiff16.py             # 16-bit TIFF reader / writer (legacy).
│   ├── colornames.py         # X11 color-name lookup (legacy).
│   ├── instruments/          # Per-mission detectors + tint chains.
│   │   ├── __init__.py
│   │   ├── cassini.py        # Cassini ISS.
│   │   ├── voyager.py        # Voyager ISS.
│   │   ├── galileo.py        # Galileo SSI.
│   │   ├── hst.py            # HST (WFC3 / ACS / WFPC2 / NICMOS).
│   │   └── nh.py             # New Horizons MVIC.
│   ├── py.typed              # PEP 561 typed-package marker.
│   └── _version.py           # Auto-generated by setuptools_scm.
├── tests/                    # pytest suite (471 tests).
│   ├── conftest.py
│   ├── fixtures/             # Binary fixtures + .baseline-*.txt + expected/.
│   ├── fixture_recipes/      # Scripts that regenerate every fixture.
│   └── test_*.py
├── docs/                     # Sphinx documentation tree.
│   ├── conf.py
│   ├── index.rst
│   ├── user_guide.rst
│   ├── developer_guide.rst   # Index page for this guide.
│   ├── dev/                  # Sub-pages of the developer guide.
│   └── module.rst
├── scripts/
│   └── run-all-checks.sh     # Local lint + type + test orchestrator.
├── pyproject.toml            # Single source of truth for build + tools.
├── README.md
├── CONTRIBUTING.md
└── CODE_OF_CONDUCT.md