An optimized transit-fitting algorithm to search for periodic transits of small planets
Motivation
We present a new method to detect planetary transits from time-series photometry, the Transit Least Squares (TLS) algorithm. While the commonly used Box Least Squares (BLS, Kovács et al. 2002) algorithm searches for rectangular signals in stellar light curves, TLS searches for transit-like features with stellar limb-darkening and including the effects of planetary ingress and egress. Moreover, TLS analyses the entire, unbinned data of the phase-folded light curve. These improvements yield a ~10 % higher detection efficiency (and similar false alarm rates) compared to BLS. The higher detection efficiency of our freely available Python implementation comes at the cost of higher computational load, which we partly compensate by applying an optimized period sampling and transit duration sampling, constrained to the physically plausible range. A typical Kepler K2 light curve, worth of 90 d of observations at a cadence of 30 min, can be searched with TLS in about half a second on a standard laptop computer (after a one-time JIT compilation of a few seconds) — as fast as BLS.
What's new in TLS 2.0
- 30–60x faster than TLS 1.33 on warm benchmarks, with unchanged detection rates: a rewritten numba kernel stack evaluates the same statistic using algebraic correlations, prefix sums and validated approximations. The default backend is validated against the exact statistic on hundreds of injection-recovery cases; the
backend="fused"backend is exact up to rounding and bit-identical to the original algorithm. - 18 bug fixes, 10 of which change results (among them: a weighted final T0 fit, a correct out-of-transit noise estimate for the SNR, honest reporting when no transit is fit, and honouring user-supplied stellar limits and template parameters). The duration-limit mass pairing reported by Talens et al. (2026) is fixed.
- Own limb-darkened transit model — batman is no longer a runtime dependency (it remains an optional dependency for the test suite).
- Opt-in analytic SDE background detrending:
power(SDE_detrend="hybrid")(see the documentation). - Pluggable search backends (
power(backend=...)), modern packaging (pyproject.toml), and a golden test set that freezes all result fields.
See the changelog for the full list of changes.
Installation
TLS can be installed conveniently using: pip install transitleastsquares
If you have multiple versions of Python and pip on your machine, try: pip3 install transitleastsquares
The latest version can be pulled from github:
git clone https://github.com/hippke/tls.git
cd tls
pip install .
For an editable (development) install, use pip install -e . instead of the last line.
Dependencies: Python 3.9+ (tested up to 3.14), NumPy (>= 1.22), numba, tqdm, optional: astroquery (for LD and stellar density priors from Kepler K1, K2, and TESS), batman-package (only needed to run the test suite).
If you have trouble installing, please open an issue.
Getting started
Here is a terminal recording of a real TLS 2.0 search: 231,000 trial periods on 8 CPU cores in about 6 seconds (3 years of simulated photometry of a solar-type star with an Earth-like planet). For more examples, have a look at the tutorials and the documentation.
Attribution
Please cite Hippke & Heller (2019, A&A 623, A39) if you find this code useful in your research. The BibTeX entry for the paper is:
@ARTICLE{2019A&A...623A..39H,
author = {{Hippke}, Michael and {Heller}, Ren{\'e}},
title = "{Optimized transit detection algorithm to search for periodic transits of small planets}",
journal = {\aap},
year = "2019",
month = "Mar",
volume = {623},
eid = {A39},
pages = {A39},
doi = {10.1051/0004-6361/201834672},
archivePrefix = {arXiv},
eprint = {1901.02015},
primaryClass = {astro-ph.EP},
adsurl = {https://ui.adsabs.harvard.edu/\#abs/2019A&A...623A..39H},
adsnote = {Provided by the SAO/NASA Astrophysics Data System}
}
Contributing Code, Bugfixes, or Feedback
We welcome and encourage contributions. If you have any trouble, open an issue.
Copyright 2019-2026 Michael Hippke & René Heller.
Metadata
Release files for transitleastsquares 2.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| transitleastsquares-2.0.1.tar.gz | 125.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| transitleastsquares-2.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 224.1 kB
Release files / transitleastsquares-2.0.1.tar.gz
| Download URL | transitleastsquares-2.0.1.tar.gz |
|---|---|
| Size | 125.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
45cd198bc1cd4a321ba163a95fe6e629f7cd02cf498b53ece8b507a84645b6a8
|
|
BLAKE2b-256 checksum How to use checksums |
70866881bce233a86692e2ba26e30ca67d298bd24b332e8265a8687c84f0c1f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.2
|
Release files / transitleastsquares-2.0.1-py3-none-any.whl
| Download URL | transitleastsquares-2.0.1-py3-none-any.whl |
|---|---|
| Size | 99.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
99cb8b4e990474690c49f39d413a47559127f79e039f800a6b8cc50dd9188b3e
|
|
BLAKE2b-256 checksum How to use checksums |
c76287bd76dabcebb4ebc515fe285b93e3ddf5bda75717cc1a05bcb874c4e257
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.2
|