·
██ · ██ ██ ██ ██
██▒░ ██▒░ ██▒░ · ██▒░ ✧ ██▒░
██▒░ ▒▒░ ██▒░ ██▒░ ████████ ██████ ▒▒░
██▒░ · · ██▒░ ██▒░ ████████▒░ ██████▒░
████████ · ██ ██████████ ██████████ ██▒▒▒▒██▒░ ▒▒▒▒▒██ ██
████████▒░ ██▒░ ██████████▒░ ██████████▒░ ██▒░ ██▒░ ██▒░ ██▒░
██ ██ ██▒░ ▒▒▒██▒▒▒▒▒░ ▒▒▒██▒▒▒▒▒░· ██▒░ ▒▒░ ████████▒░ ██▒░
██ ██▒░ ██▒░ ██▒░ ██▒░ ██▒░ ████████▒░ ██▒░
██ ██▒░ ██▒░ ██▒░ ██▒░ · ██▒░ ██ ██▒░ ██▒░
██ ██▒░ ██▒░ ██▒░ ██▒░ ██▒░ ██ ██▒░ ██▒░
████████ ▒▒░ ██▒░ ████ ████ ██▒░ ██ ▒████████▒░ ██▒░
████████▒░ ██▒░ ████▒░ ████▒░· ██▒░ ██▒░ ████████▒░ ██▒░
▒▒▒▒▒▒▒▒░ ▒▒░ ▒▒▒▒░ ▒▒▒▒░ ▒▒░ ▒▒░ ·▒▒▒▒▒▒▒▒░ ▒▒░
· ·
bittr.ai
tess-vetter
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.mdandtess_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:
btv fpp-prepareto stage light curves/runtime artifacts and emit a manifest.btv fpp --prepare-manifest ...(orbtv 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-manifestonbtv fppuses the same prepared-manifest compute path asbtv fpp-run.- prepared-manifest mode now fails fast on missing staged artifacts by default (
--require-prepared). - use
--allow-missing-preparedonly 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 primitivessrc/tess_vetter/pixel/: pixel-level and WCS-aware diagnosticssrc/tess_vetter/recovery/,src/tess_vetter/transit/,src/tess_vetter/activity/: domain modulessrc/tess_vetter/platform/io/,src/tess_vetter/platform/catalogs/: optional I/O and catalog helperssrc/tess_vetter/ext/triceratops_plus_vendor/: vendored TRICERATOPS+ (seeTHIRD_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
SIGALRMwhich may not work on all platforms.
- Cache file locking uses
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.
Metadata
Release files for tess-vetter 0.3.20
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tess_vetter-0.3.20.tar.gz | 28.1 MB | With provenance | Details for tess_vetter-0.3.20.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| tess_vetter-0.3.20-py3-none-any.whl | Python 3 | none | any | Details for tess_vetter-0.3.20-py3-none-any.whl |
Total release size: 29.4 MB
Release files / tess_vetter-0.3.20.tar.gz
| Download URL | tess_vetter-0.3.20.tar.gz |
|---|---|
| Size | 28.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4f5ecf3403312c3bd1081ca7601d6a704f5b0ff900ca20462c61b15fa74e3288
|
|
BLAKE2b-256 checksum How to use checksums |
acc612974bc4b50faa57ba895c245f6407cfe009fbe8a2f068d1ca3e7bb75426
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Mar 7, 2026.
Transparency logRelease files / tess_vetter-0.3.20-py3-none-any.whl
| Download URL | tess_vetter-0.3.20-py3-none-any.whl |
|---|---|
| Size | 1.4 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a50f76c6b8eabf3da9213bcf18bcc98f9f9e43406883a077fdce30e043b3e400
|
|
BLAKE2b-256 checksum How to use checksums |
7dedee00028c4264faa2ba82244fd22ec240d05ac89e93a9e4b429ae9e2102b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Mar 7, 2026.
Transparency logSecurity for tess-vetter 0.3.20
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for tess_vetter-0.3.20.tar.gz
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 Mar 7, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.