Domain-only TESS transit detection and vetting library (array-in/array-out)
Project description
·
██ · ██ ██ ██ ██
██▒░ ██▒░ ██▒░ · ██▒░ ✧ ██▒░
██▒░ ▒▒░ ██▒░ ██▒░ ████████ ██████ ▒▒░
██▒░ · · ██▒░ ██▒░ ████████▒░ ██████▒░
████████ · ██ ██████████ ██████████ ██▒▒▒▒██▒░ ▒▒▒▒▒██ ██
████████▒░ ██▒░ ██████████▒░ ██████████▒░ ██▒░ ██▒░ ██▒░ ██▒░
██ ██ ██▒░ ▒▒▒██▒▒▒▒▒░ ▒▒▒██▒▒▒▒▒░· ██▒░ ▒▒░ ████████▒░ ██▒░
██ ██▒░ ██▒░ ██▒░ ██▒░ ██▒░ ████████▒░ ██▒░
██ ██▒░ ██▒░ ██▒░ ██▒░ · ██▒░ ██ ██▒░ ██▒░
██ ██▒░ ██▒░ ██▒░ ██▒░ ██▒░ ██ ██▒░ ██▒░
████████ ▒▒░ ██▒░ ████ ████ ██▒░ ██ ▒████████▒░ ██▒░
████████▒░ ██▒░ ████▒░ ████▒░· ██▒░ ██▒░ ████████▒░ ██▒░
▒▒▒▒▒▒▒▒░ ▒▒░ ▒▒▒▒░ ▒▒▒▒░ ▒▒░ ▒▒░ ·▒▒▒▒▒▒▒▒░ ▒▒░
· ·
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f5ecf3403312c3bd1081ca7601d6a704f5b0ff900ca20462c61b15fa74e3288
|
|
| MD5 |
7cff419f3f1d687d862f7a93e4238e4f
|
|
| BLAKE2b-256 |
acc612974bc4b50faa57ba895c245f6407cfe009fbe8a2f068d1ca3e7bb75426
|
Provenance
The following attestation bundles were made for tess_vetter-0.3.20.tar.gz:
Publisher:
release.yml on bittr-ai/tess-vetter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tess_vetter-0.3.20.tar.gz -
Subject digest:
4f5ecf3403312c3bd1081ca7601d6a704f5b0ff900ca20462c61b15fa74e3288 - Sigstore transparency entry: 1054651429
- Sigstore integration time:
-
Permalink:
bittr-ai/tess-vetter@148851a360911e0b4ddb3f7d99169e54a54a0638 -
Branch / Tag:
refs/tags/v0.3.20 - Owner: https://github.com/bittr-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@148851a360911e0b4ddb3f7d99169e54a54a0638 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a50f76c6b8eabf3da9213bcf18bcc98f9f9e43406883a077fdce30e043b3e400
|
|
| MD5 |
1c68de5c45a06b236aa83a4fc7c85f0f
|
|
| BLAKE2b-256 |
7dedee00028c4264faa2ba82244fd22ec240d05ac89e93a9e4b429ae9e2102b5
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tess_vetter-0.3.20-py3-none-any.whl -
Subject digest:
a50f76c6b8eabf3da9213bcf18bcc98f9f9e43406883a077fdce30e043b3e400 - Sigstore transparency entry: 1054651887
- Sigstore integration time:
-
Permalink:
bittr-ai/tess-vetter@148851a360911e0b4ddb3f7d99169e54a54a0638 -
Branch / Tag:
refs/tags/v0.3.20 - Owner: https://github.com/bittr-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@148851a360911e0b4ddb3f7d99169e54a54a0638 -
Trigger Event:
push
-
Statement type: