Transit Hunter

NASA TESS · exoplanet transit pipeline

Finding planets in
the light of other stars

An open pipeline that finds, fits and vets transiting exoplanets in NASA TESS light curves, with every step explained and every number measured.

$ transit-hunter run --tic 261136679
A planet crossing its star blocks (Rp/R*)² of the light. TESS measures that dip every two minutes.
10/ 10
confirmed planets recovered around 5 TESS stars, from a sub-day hot Jupiter to a planet smaller than Earth
real TESS data · validation
3.4%
median difference between the fitted and published radius ratio Rp/R* of the recovered planets
real TESS data · validation
2/ 5
unresolved TOI candidates pass the vetting outright, 2 more with a caveat; 1 looks like a false positive
real TESS data · candidate verdicts
80.6%
of 2048 planets injected into a real 2-sector light curve found by the search
real TESS data · injection–recovery
8/ 15
TOIs that the follow-up team found to be false positives are flagged by the vetting; 0 of 15 confirmed planets are wrongly flagged
real TESS data · resolved TOIs
2/ 100
real stars without known planets or TOIs give a detection; 2 of them survive the vetting as a planet candidate
real TESS data · false alarms
6/ 6
simulated planets recovered end to end, including a compact three-planet system
synthetic benchmark
0.002%
worst period error; radii within 8 % of the truth
synthetic benchmark
71.7%
of 2048 injected planets (0.7–8 R⊕) found by the search
injection–recovery
1/ 450
false alarms in single-sector light curves that contain only noise
false-alarm calibration

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.

G 249-11 photometry folded at 5.3074 days: the same 3,000 ppm dip in sector 19 (2019), sectors 59-60 (2022-23) and the QLP full-frame light curves of sectors 73 and 86 (2023-24), each with the same transit model, and the 13 individual 2-minute transits
The same transit in every epoch from 2019 to 2024, with one model fitted to the 2-minute data (orange), and each 2-minute transit on its own.
Read the findings

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.

Transit depth versus planet radius for M, K, G and F host stars; smaller stars give deeper transits
Small stars are the best place to look for small planets. Depth scales as (Rp/R*)², so an Earth-sized planet around a red dwarf makes a dip about seven times deeper than around the Sun.

Could TESS see it?

Move the sliders to estimate the signal-to-noise of a planet the pipeline would stack.

transit depth
duration
transits in data
S/N (need ≥ 7)

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.

For 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
  1. Thousands of light curves
  2. BLS detections
  3. Pass light-curve vetting
  4. Pass pixel-level vetting
  5. Follow-up and publication
  6. 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