Latest finding
A candidate super-Earth around G 249-11
Six years of TESS data, searched star by star, turned up one signal that holds up: a 5.307-day transit on G 249-11, an M4.5 dwarf 29 parsecs away. If it is a planet, it is about 1.6 times the size of Earth. The light curves from other years recover it on their own, and it passes every vetting test, but it is not yet confirmed.
The problem
An Earth dims the Sun by 84 parts per million
That is the signal. Starspots change a star's brightness by thousands of ppm, the spacecraft adds its own drifts, and two stars eclipsing each other make dips that look almost exactly like a planet. Finding real planets means pulling a tiny, strictly periodic dip out of that noise, then proving it isn't one of the impostors.
How it works
Six steps from raw photons to a verdict
Each step is its own Python module and its own page here, with the maths, the design decisions and figures from real pipeline runs.
Download & clean
Fetch every 2-minute TESS sector, drop flagged cadences, clip only the outliers that can't be transits.
data.py 02Detrend
A robust sliding filter removes starspots and drifts while leaving transits intact.
detrend.py 03Search
Box Least Squares tries millions of period, phase and duration combinations and keeps what beats the noise.
search.py 04Fit
A physical transit model sampled with MCMC turns a dip into a planet radius, orbit and uncertainties.
fit.py 05Vet
Seven tests hunt for the fingerprints of eclipsing binaries, starspots and instrumental artifacts.
vet.py 06Injection–recovery
Thousands of fake planets measure what the search can and cannot see.
inject.pyFor one TIC target, transit-hunter run --tic <ID> downloads every SPOC 2-minute sector,
cleans and detrends the photometry, runs an iterative Box Least Squares search, fits each
detection with a batman transit model sampled by emcee, applies nine vetting tests
(eight on the light curve, one on the target pixels), and writes a report folder of figures
plus a JSON summary.
| page | contents |
|---|---|
| Findings | what six years of batch searches found, including the candidate around G 249-11 |
| Methods | every processing step, with the reasoning behind the defaults |
| Validation | recovery of confirmed TESS planets; false-alarm calibration; end-to-end synthetic test |
| Completeness | injection–recovery tests over a period × radius grid |
| Candidate verdicts | vetting of TESS Objects of Interest that are still planet candidates |
| Limitations | what the pipeline does not do, and where its numbers should not be trusted |
Status of the results
| analysis | needs | status |
|---|---|---|
| False-alarm calibration (synthetic noise) | offline (synthetic data) | done |
| End-to-end benchmark on synthetic systems | offline (synthetic data) | done |
| Injection–recovery on a synthetic light curve | offline (synthetic data) | done |
| Validation on confirmed TESS planets | MAST + Exoplanet Archive | done |
| Vetting of TOI planet candidates | MAST + Exoplanet Archive | done |
| Injection–recovery on a real TESS light curve | MAST + Exoplanet Archive | done |
| Vetting checked against resolved TOIs | MAST + Exoplanet Archive | done |
| False alarms on real stars without planets | MAST + Exoplanet Archive | done |
The analyses of real TESS data used SPOC 2-minute light curves from MAST (every available sector for the validation and the candidate verdicts; the sectors named with each of the other analyses) and reference values from the NASA Exoplanet Archive at the time they were run. The result tables, figures, and summary numbers on these pages are copied from results/ by scripts/update_docs.py, not typed by hand.
</div> </section>
The road to a discovery
From a dip to a planet
TESS has flagged over eight thousand objects of interest, and most are still unresolved. This pipeline is built to be a credible independent vetter, and its batch search has produced a first candidate worth following up.
Read the roadmap- Thousands of light curves
- BLS detections
- Pass light-curve vetting
- Pass pixel-level vetting
- Follow-up and publication
- Confirmed planet
Reproduce it
Every number on this site comes from a script
Tables and figures are copied from results/ by scripts/update_docs.py, never typed by hand.
pip install -e ".[dev]"
pytest # offline test suite (synthetic data)
# offline analyses (synthetic data)
python scripts/calibrate_false_alarms.py # noise-only false-alarm calibration
python scripts/benchmark_search_scaling.py # search cost vs amount of data
python scripts/run_synthetic_benchmark.py # end-to-end test with known truth
python scripts/run_injection_recovery.py --synthetic --out results/injection_synthetic
# analyses of real TESS data (need MAST + NASA Exoplanet Archive access)
python scripts/validate_known_planets.py
python scripts/vet_toi_candidates.py
python scripts/run_injection_recovery.py --tic <TIC> --mask-known --out results/injection_tic<TIC>
python scripts/update_docs.py # copy the new numbers into these pages
python scripts/make_site_figures.py # redraw the explanatory figures