Skip to main content

Domain-only TESS transit detection and vetting library (array-in/array-out)

Project description

                                                                    ·                               
██    ·           ██            ██            ██                                            ██      
██▒░              ██▒░          ██▒░  ·       ██▒░                               ✧          ██▒░    
██▒░               ▒▒░          ██▒░          ██▒░        ████████          ██████           ▒▒░    
██▒░             ·          ·   ██▒░          ██▒░        ████████▒░        ██████▒░                
████████ ·        ██        ██████████    ██████████      ██▒▒▒▒██▒░         ▒▒▒▒▒██        ██      
████████▒░        ██▒░      ██████████▒░  ██████████▒░    ██▒░  ██▒░              ██▒░      ██▒░    
██      ██        ██▒░       ▒▒▒██▒▒▒▒▒░   ▒▒▒██▒▒▒▒▒░·   ██▒░   ▒▒░        ████████▒░      ██▒░    
██      ██▒░      ██▒░          ██▒░          ██▒░        ██▒░              ████████▒░      ██▒░    
██      ██▒░      ██▒░          ██▒░          ██▒░ ·      ██▒░            ██      ██▒░      ██▒░    
██      ██▒░      ██▒░          ██▒░          ██▒░        ██▒░            ██      ██▒░      ██▒░    
████████ ▒▒░      ██▒░          ████          ████        ██▒░      ██     ▒████████▒░      ██▒░    
████████▒░        ██▒░          ████▒░        ████▒░·     ██▒░      ██▒░    ████████▒░      ██▒░    
 ▒▒▒▒▒▒▒▒░         ▒▒░           ▒▒▒▒░         ▒▒▒▒░       ▒▒░       ▒▒░    ·▒▒▒▒▒▒▒▒░       ▒▒░    
                                                                                                    
     ·      ·                                                                                       
                                                                                                    
                                              bittr.ai                                              

tess-vetter

PyPI DOI

Domain-first Python library for TESS transit detection + vetting (array-in/array-out).

This package follows a "domain-first" design: array-in/array-out astronomy algorithms with optional platform helpers. The core api/, compute/, and validation/ modules are pure functions; the platform/ module provides opt-in I/O and network clients when needed.

Package structure:

  • Pure domain logic (no I/O, no network): api/, compute/, validation/, transit/, recovery/, activity/
  • Opt-in infrastructure (network clients, caching, disk I/O): platform/

The platform/ module is entirely optional and only used when explicitly imported.

What's in here

  • Vetting pipeline: default preset runs 15 checks (V01-V12, V13, V15, V11b); opt-in extended preset adds metrics-only diagnostics (V16-V21), for 21 total checks available via profiles (tess_vetter.api.vet)
  • Transit detection: TLS/LS periodograms, multi-planet search, candidate merging (tess_vetter.api.periodogram)
  • Pixel diagnostics: centroid shift, difference images, WCS-aware localization, aperture dependence (tess_vetter.api.pixel)
  • Transit recovery: detrend + stack + trapezoid fitting for active stars (tess_vetter.api.recovery)
  • FPP (optional): TRICERATOPS+ support with a vendored copy under src/tess_vetter/ext/ (tess_vetter.api.fpp)
  • Code mode (experimental): operation-catalog and MCP tooling under tess_vetter.code_mode; this surface is experimental and may change
  • Citations: many public API entry points carry machine-readable literature references (see REFERENCES.md and tess_vetter.api.references)

Installation

Requires Python 3.11–3.12.

Minimal install (basic vetting)

pip install tess-vetter

CLI entrypoints (equivalent):

  • btv ...
  • tess-vetter ...
  • python -m tess_vetter ...

Preflight your environment before demos/runs:

btv doctor --profile vet

With transit detection (TLS)

pip install 'tess-vetter[tls]'

With MCMC fitting

pip install 'tess-vetter[fit]'

With physical transit model fitting (batman)

pip install 'tess-vetter[batman]'

With advanced detrending (wotan)

pip install 'tess-vetter[wotan]'

With limb darkening coefficients (ldtk)

pip install 'tess-vetter[ldtk]'

With external vetter integration (exovetter)

pip install 'tess-vetter[exovetter]'

With false positive probability (TRICERATOPS)

pip install 'tess-vetter[triceratops]'

With Apple Silicon acceleration (MLX, macOS only)

pip install 'tess-vetter[mlx]'

Full install

pip install 'tess-vetter[all]'

Development

Using uv (recommended for this repo; uses uv.lock):

uv sync --all-extras --group dev

Using pip:

python -m pip install -e ".[all]"

License note for optional extras: The [triceratops] extra includes pytransit, which is GPL-2.0 licensed. Installing this extra changes the effective license of your environment. The [ldtk] extra is also GPL-2.0. The core package remains BSD-3-Clause.

Quickstart

The recommended import alias follows patterns from astropy (import astropy.units as u):

import tess_vetter.api as btv

Agent-first walkthroughs and CLI-first examples are in docs/quickstart.rst.

Single candidate vetting

import numpy as np
from tess_vetter.api import Candidate, Ephemeris, LightCurve, vet_candidate

lc = LightCurve(time=time, flux=flux, flux_err=flux_err)
candidate = Candidate(
    ephemeris=Ephemeris(period_days=3.5, t0_btjd=1850.0, duration_hours=2.5),
    depth_ppm=500,
)

bundle = vet_candidate(lc, candidate, network=False)

# Results are structured: status, metrics, flags, citations
for r in bundle.results:
    print(f"{r.id} ({r.name}): {r.status}")
    print(f"  metrics: {r.metrics}")
    print(f"  flags: {r.flags}")
    print(f"  citations: {r.citations}")

Batch vetting (multiple candidates, one light curve)

from tess_vetter.api import vet_many

candidates = [
    Candidate(ephemeris=Ephemeris(period_days=3.5, t0_btjd=1850.0, duration_hours=2.5)),
    Candidate(ephemeris=Ephemeris(period_days=7.0, t0_btjd=1852.0, duration_hours=3.0)),
]

bundles, summary = vet_many(lc, candidates, network=False)

# summary is a list of dicts with stable columns for sorting/filtering
for row in summary:
    print(f"P={row['period_days']:.2f}d: {row['n_ok']} ok, {row['n_skipped']} skipped")

Pipeline introspection

from tess_vetter.api import list_checks, describe_checks

# List all registered checks with their requirements
checks = list_checks()
for c in checks:
    req = c["requirements"]
    print(f"{c['id']}: {c['name']} (tier={c['tier']}, needs_network={req['needs_network']})")

# Human-readable summary
print(describe_checks())

Running a subset of checks

from tess_vetter.api import vet_candidate

# Run only LC-only checks (V01-V05)
bundle = vet_candidate(lc, candidate, checks=["V01", "V02", "V03", "V04", "V05"])

Network behavior

Catalog-backed checks are always opt-in. You must pass network=True (and provide metadata like RA/Dec and TIC ID) to enable external queries; otherwise those checks return skipped results.

CLI FPP workflow (agent-safe)

For repeatable FPP runs, use a two-step flow:

  1. btv fpp-prepare to stage light curves/runtime artifacts and emit a manifest.
  2. btv fpp --prepare-manifest ... (or btv fpp-run --prepare-manifest ...) to compute from the staged manifest.

Example:

btv fpp-prepare --toi "TOI-5807.01" --network-ok --cache-dir outputs/cache -o outputs/fpp/toi_5807.prepare.json
btv fpp --prepare-manifest outputs/fpp/toi_5807.prepare.json --no-network -o outputs/fpp/toi_5807.fast.json

Notes:

  • --prepare-manifest on btv fpp uses the same prepared-manifest compute path as btv fpp-run.
  • prepared-manifest mode now fails fast on missing staged artifacts by default (--require-prepared).
  • use --allow-missing-prepared only for debugging/recovery workflows.
  • In prepared mode, do not mix direct candidate/staging flags (for example --tic-id, --period-days, --cache-dir) with --prepare-manifest.

Citations

Many public API entry points and vetting checks include a list of literature references in their results. The full reference list lives in REFERENCES.md (and is also available programmatically via tess_vetter.api.references).

Code map

  • src/tess_vetter/api/: stable host-facing facade (recommended import surface)
  • src/tess_vetter/compute/: core array algorithms (detrending, periodograms, scoring)
  • src/tess_vetter/validation/: check implementations and aggregation primitives
  • src/tess_vetter/pixel/: pixel-level and WCS-aware diagnostics
  • src/tess_vetter/recovery/, src/tess_vetter/transit/, src/tess_vetter/activity/: domain modules
  • src/tess_vetter/platform/io/, src/tess_vetter/platform/catalogs/: optional I/O and catalog helpers
  • src/tess_vetter/ext/triceratops_plus_vendor/: vendored TRICERATOPS+ (see THIRD_PARTY_NOTICES.md)

Platform Support

  • macOS / Linux: First-class support. All features work as expected.
  • Windows: Best-effort support. Some platform-specific features may have limitations:
    • Cache file locking uses fcntl (Unix-only); graceful fallback on Windows.
    • Network timeouts use SIGALRM which may not work on all platforms.

Security

Cache files (light curves, TRICERATOPS results) use pickle serialization for performance. Ensure cache directories have appropriate permissions in shared or multi-user environments.

Development

Run development commands in the project environment with uv run:

uv run pytest
uv run ruff check .
uv run mypy src/tess_vetter

Docs

User-facing docs are built with Sphinx from docs/:

uv run sphinx-build -b html -W docs docs/_build/html

For agent onboarding, start with docs/quickstart.rst. For API usage recipes and signatures, see docs/api.rst.

Internal working notes live in working_docs/ and are not part of the stable API.

License

BSD-3-Clause. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tess_vetter-0.3.20.tar.gz (28.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tess_vetter-0.3.20-py3-none-any.whl (1.4 MB view details)

Uploaded Python 3

File details

Details for the file tess_vetter-0.3.20.tar.gz.

File metadata

  • Download URL: tess_vetter-0.3.20.tar.gz
  • Upload date:
  • Size: 28.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tess_vetter-0.3.20.tar.gz
Algorithm Hash digest
SHA256 4f5ecf3403312c3bd1081ca7601d6a704f5b0ff900ca20462c61b15fa74e3288
MD5 7cff419f3f1d687d862f7a93e4238e4f
BLAKE2b-256 acc612974bc4b50faa57ba895c245f6407cfe009fbe8a2f068d1ca3e7bb75426

See more details on using hashes here.

Provenance

The following attestation bundles were made for tess_vetter-0.3.20.tar.gz:

Publisher: release.yml on bittr-ai/tess-vetter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tess_vetter-0.3.20-py3-none-any.whl.

File metadata

  • Download URL: tess_vetter-0.3.20-py3-none-any.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tess_vetter-0.3.20-py3-none-any.whl
Algorithm Hash digest
SHA256 a50f76c6b8eabf3da9213bcf18bcc98f9f9e43406883a077fdce30e043b3e400
MD5 1c68de5c45a06b236aa83a4fc7c85f0f
BLAKE2b-256 7dedee00028c4264faa2ba82244fd22ec240d05ac89e93a9e4b429ae9e2102b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tess_vetter-0.3.20-py3-none-any.whl:

Publisher: release.yml on bittr-ai/tess-vetter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page