{"id":49581669,"url":"https://github.com/humancto/exohuntr","last_synced_at":"2026-05-03T20:40:00.466Z","repository":{"id":347724267,"uuid":"1195056335","full_name":"humancto/exohuntr","owner":"humancto","description":"We pointed a laptop at NASA's TESS data and found 197 exoplanet transit candidates. Rust-powered BLS detection, 10-50x faster than Python.","archived":false,"fork":false,"pushed_at":"2026-03-29T07:00:03.000Z","size":14577,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-29T09:55:45.999Z","etag":null,"topics":["astronomy","astrophysics","bls-algorithm","citizen-science","data-science","exoplanet","exoplanet-detection","kepler","lightkurve","mast","nasa","open-source","planet-hunting","python","rayon","rust","science","space","tess","transit-detection"],"latest_commit_sha":null,"homepage":"https://humancto.github.io/exohuntr","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/humancto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-29T06:42:07.000Z","updated_at":"2026-03-29T07:00:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/humancto/exohuntr","commit_stats":null,"previous_names":["humancto/exohuntr"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/humancto/exohuntr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/humancto%2Fexohuntr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/humancto%2Fexohuntr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/humancto%2Fexohuntr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/humancto%2Fexohuntr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/humancto","download_url":"https://codeload.github.com/humancto/exohuntr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/humancto%2Fexohuntr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32584646,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["astronomy","astrophysics","bls-algorithm","citizen-science","data-science","exoplanet","exoplanet-detection","kepler","lightkurve","mast","nasa","open-source","planet-hunting","python","rayon","rust","science","space","tess","transit-detection"],"created_at":"2026-05-03T20:39:59.035Z","updated_at":"2026-05-03T20:40:00.446Z","avatar_url":"https://github.com/humancto.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/validated_candidates-3-22d3ee?style=for-the-badge\u0026labelColor=0a1128\" alt=\"3 validated candidates\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/detections-197-64748b?style=for-the-badge\u0026labelColor=0a1128\" alt=\"197 detections\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/data-NASA_TESS-a78bfa?style=for-the-badge\u0026labelColor=0a1128\" alt=\"NASA TESS\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-64748b?style=for-the-badge\u0026labelColor=0a1128\" alt=\"MIT License\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eExohuntr\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eAn open-source transit detection and validation pipeline for NASA TESS data.\u003c/strong\u003e\u003cbr\u003e\n  \u003cem\u003eBLS detection in Rust, false-positive validation in Python, applied to 200 unconfirmed TESS Objects of Interest.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://humancto.github.io/exohuntr\"\u003eInteractive Results\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#validated-candidates\"\u003eValidated Candidates\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#methodology\"\u003eMethodology\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#reproducing-this-work\"\u003eReproducing This Work\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Summary\n\nExohuntr is an end-to-end exoplanet transit detection pipeline. It downloads TESS light curves from NASA's MAST archive, runs a Box-fitting Least Squares (BLS) period search ([Kovacs, Zucker \u0026 Mazeh 2002](https://ui.adsabs.harvard.edu/abs/2002A%26A...391..369K)) implemented in Rust, and validates candidate signals through a suite of false-positive tests drawn from standard community practices.\n\nApplied to 200 unconfirmed TESS Objects of Interest (TOIs), the pipeline:\n\n1. **Detected 197 transit signals** above SNR \u0026ge; 6.0\n2. **Validated all detections** with 5 false-positive tests (odd/even depth, secondary eclipse, transit morphology, period agreement, radius ratio)\n3. **Identified 17 high-confidence candidates** (planet likelihood score \u0026ge; 70)\n4. **Deep-validated the top 3** with centroid analysis, Gaia DR3 source checks, Transit Least Squares ([Hippke \u0026 Heller 2019](https://ui.adsabs.harvard.edu/abs/2019A%26A...623A..39H)), and multi-sector secondary eclipse searches\n\n**One candidate \u0026mdash; TOI 133.01 \u0026mdash; passes all deep-validation tests**, consistent with a 1.9 R\u0026#8853; super-Earth on an 8.2-day orbit.\n\n\u003e **Note:** These are existing TOIs from the TESS pipeline. This work provides independent detection and validation, not new discoveries. Confirmation requires ground-based follow-up observations.\n\n---\n\n## Validated Candidates\n\nAfter deep validation (centroid analysis, Gaia DR3 contamination check, TLS independent confirmation, multi-sector secondary eclipse search), three candidates remain as physically plausible planet signals:\n\n| Target                         | Period   | Rp (R\u0026#8853;) | TLS SDE  | Centroid | Gaia             | Sec. Eclipse     | Assessment |\n| ------------------------------ | -------- | ------------- | -------- | -------- | ---------------- | ---------------- | ---------- |\n| **TOI 133.01** / TIC 219338557 | 8.2065 d | **1.9**       | **28.4** | Pass     | Clear            | Pass             | **Strong** |\n| **TOI 155.01** / TIC 129637892 | 5.4504 d | **5.3**       | **20.1** | Pass     | Clear            | Marginal\u0026dagger; | **Strong** |\n| **TOI 210.01** / TIC 141608198 | 8.9884 d | **2.2**       | **7.1**  | Pass     | 1 faint neighbor | Pass\u0026Dagger;     | **Strong** |\n\n\u003csup\u003e\u0026dagger; Secondary eclipse depth of 0.002% is consistent with planetary thermal emission rather than eclipsing binary signatures (which produce 0.1\u0026ndash;10% depths).\u003c/sup\u003e\n\u003csup\u003e\u0026Dagger; An initial 10-sector analysis showed a marginal 3.9\u0026sigma; secondary eclipse. A follow-up analysis using all 52 available sectors (1.8M data points) yielded no detection (\u0026minus;2.8\u0026sigma;), confirming the earlier signal was noise.\u003c/sup\u003e\n\n**Pipeline validation:** TOI 125.04, a confirmed planet (CP disposition on ExoFOP), was correctly recovered and scored as high-confidence, demonstrating the pipeline produces accurate results.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"results/deep_analysis/tls_TOI_133_01.png\" width=\"800\" alt=\"TOI 133.01 — TLS periodogram and phase-folded transit\"\u003e\n  \u003cbr\u003e\n  \u003cem\u003eTOI 133.01 \u0026mdash; Transit Least Squares analysis. Left: periodogram peaking at P=8.200d (SDE=28.4). Right: phase-folded light curve showing transit.\u003c/em\u003e\n\u003c/p\u003e\n\n### Detection Overview\n\nFrom the initial BLS search of 200 TOIs:\n\n| Metric                                                  | Value                   |\n| ------------------------------------------------------- | ----------------------- |\n| Light curves analyzed                                   | 200                     |\n| Transit signals detected (SNR \u0026ge; 6.0)                 | 197                     |\n| High-confidence after 5-test validation (score \u0026ge; 70) | 17                      |\n| Deep-validated with TLS + centroid + Gaia               | **3**                   |\n| Period range                                            | 0.50 \u0026ndash; 13.94 days |\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"results/plots/candidate_overview.png\" width=\"800\" alt=\"Candidate overview — Period vs Depth, Radius Ratio, SNR distribution\"\u003e\n  \u003cbr\u003e\n  \u003cem\u003eLeft: Period vs transit depth. Center: Period vs planet/star radius ratio. Right: SNR distribution across all 197 detections.\u003c/em\u003e\n\u003c/p\u003e\n\nFull interactive results: **[humancto.github.io/exohuntr](https://humancto.github.io/exohuntr)**\n\n---\n\n## Methodology\n\n### Pipeline Architecture\n\n```\n  ┌─────────────┐    ┌──────────────┐    ┌──────────────┐    ┌──────────────┐\n  │  NASA MAST  │───\u003e│   BLS        │───\u003e│  Validation  │───\u003e│    Deep      │\n  │  (Python)   │    │   (Rust)     │    │  (Rust)      │    │  Validation  │\n  │             │    │              │    │              │    │  (Python)    │\n  │ lightkurve  │    │ 15K trial    │    │ 5 false-     │    │ Centroid     │\n  │ TESS TOIs   │    │ periods per  │    │ positive     │    │ Gaia DR3     │\n  │ from ExoFOP │    │ star, SNR    │    │ tests per    │    │ TLS          │\n  │             │    │ threshold    │    │ candidate    │    │ Multi-sector │\n  └─────────────┘    └──────────────┘    └──────────────┘    └──────────────┘\n        │                  │                   │                    │\n   data/lightcurves/  candidates.json  validation_results.json  DEEP_ANALYSIS.md\n```\n\nThe Rust engine is structured as a reusable library (`exoplanet_hunter`) with four modules and a CLI binary (`hunt`) with subcommands:\n\n```\nsrc/\n├── lib.rs           # Library root — exports all modules\n├── bls.rs           # BLS algorithm, SNR estimation, phase math, median\n├── validate.rs      # 5 false-positive tests + scoring (parallel via Rayon)\n├── crossmatch.rs    # Hash-based catalog cross-matching (O(1) lookups)\n├── io.rs            # CSV light curve parsing, file discovery\n└── main.rs          # CLI binary with search/validate/crossmatch subcommands\n```\n\n### Step 1: BLS Transit Detection\n\nThe BLS algorithm ([Kovacs, Zucker \u0026 Mazeh 2002](https://ui.adsabs.harvard.edu/abs/2002A%26A...391..369K)) searches for periodic box-shaped dips in stellar light curves:\n\n1. Generate 15,000 log-spaced trial periods (0.5\u0026ndash;20 days)\n2. Phase-fold the light curve at each trial period\n3. Divide into 200 phase bins\n4. Slide a flat-bottomed box across all phases and widths\n5. Compute the BLS power statistic; retain candidates with SNR \u0026ge; 6.0 and \u0026ge; 2 transits\n\nThe BLS engine is implemented in Rust using [Rayon](https://github.com/rayon-rs/rayon) for parallel processing across stars.\n\n### Step 2: False-Positive Validation\n\nEach detection is subjected to 5 tests, following standard community vetting practices and NASA's SPOC Data Validation pipeline ([Twicken et al. 2018](https://ui.adsabs.harvard.edu/abs/2018PASP..130f4502T)):\n\n| Test                       | Method                                 | Passing criterion                |\n| -------------------------- | -------------------------------------- | -------------------------------- |\n| **Odd/even transit depth** | Compare depths of alternating transits | Depths match within 3\u0026sigma;     |\n| **Secondary eclipse**      | Search for dip at orbital phase 0.5    | No significant dip detected      |\n| **Transit morphology**     | Measure V-shape vs U-shape             | Flat-bottomed (U-shaped) transit |\n| **Period agreement**       | Compare BLS period to TESS pipeline    | Match within 1%                  |\n| **Radius ratio**           | Compute Rp/Rs from transit depth       | Rp/Rs \u0026lt; 0.3                   |\n\nResults: 17 high-confidence (\u0026ge; 70), 114 medium (50\u0026ndash;69), 66 low (\u0026lt; 50).\n\n### Step 3: Deep Validation\n\nThe top 3 physically plausible candidates (smallest Rp) undergo additional tests:\n\n| Test                               | Reference                                                                       | Purpose                                                 |\n| ---------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------- |\n| **Centroid offset (TPF)**          | Twicken et al. 2018                                                             | Verify transit occurs on target star                    |\n| **Gaia DR3 source check**          | Furlan et al. 2017                                                              | Rule out contaminating neighbors in aperture            |\n| **Transit Least Squares**          | [Hippke \u0026 Heller 2019](https://ui.adsabs.harvard.edu/abs/2019A%26A...623A..39H) | Confirm signal with limb-darkened transit model         |\n| **Multi-sector secondary eclipse** | Shporer et al. 2017                                                             | Rule out self-luminous companion with extended baseline |\n\n---\n\n## Limitations and Caveats\n\n- **These are not new discoveries.** All targets are existing TOIs from the TESS pipeline. This work provides independent detection and validation using a separate codebase.\n- **These are not confirmed planets.** Transit detection alone cannot confirm a planet. Confirmation requires radial velocity measurements, high-resolution imaging, and/or statistical validation (e.g., [VESPA](https://ui.adsabs.harvard.edu/abs/2012ApJ...761....6M)).\n- **Rp estimates are approximate.** Planet radius depends on stellar parameters from the TESS Input Catalog, which carry uncertainties of 5\u0026ndash;20%.\n- **Most detections are likely false positives.** Of 197 signals, many with Rp/Rs \u0026gt; 1.0 are eclipsing binaries or blended sources. This is expected and normal in blind transit searches.\n- **Centroid analysis is limited.** We compute flux-weighted centroids from TPF pixel data rather than using the full SPOC centroid pipeline, which includes PRF-fitted positions.\n\n---\n\n## Next Steps\n\n### For this pipeline\n\n- [ ] Run on less-studied TESS sectors (80\u0026ndash;96) to target genuinely unsearched stars\n- [ ] Download all available sectors for TOI 210.01 (61 sectors) to resolve the marginal secondary eclipse\n- [ ] Implement proper PRF-fitted centroid analysis using Target Pixel Files\n- [ ] Add iterative BLS with signal subtraction for multi-planet system detection\n- [ ] Integrate with NASA's [EXOTIC](https://github.com/rzellem/EXOTIC) citizen science pipeline\n\n### For the validated candidates\n\n- [ ] Submit independent analysis to [ExoFOP-TESS](https://exofop.ipac.caltech.edu/tess/) as supporting observations\n- [ ] Cross-reference with community follow-up observations already on ExoFOP\n- [ ] Prepare a methodology note for [RNAAS](https://journals.aas.org/research-notes-of-the-aas/) (Research Notes of the AAS)\n\n### For broader impact\n\n- [ ] Contact the [Planet Hunters TESS](https://www.zooniverse.org/projects/nora-dot-eisner/planet-hunters-tess) team regarding complementary automated + visual survey approaches\n- [ ] Explore statistical validation frameworks (VESPA, TRICERATOPS) for the strongest candidates\n\n---\n\n## Reproducing This Work\n\n### Requirements\n\n- **Rust** 1.75+ \u0026mdash; `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`\n- **Python** 3.10+ \u0026mdash; `pip install lightkurve astroquery pandas numpy matplotlib tqdm scipy transitleastsquares`\n\n### Run the full pipeline\n\n```bash\ngit clone https://github.com/humancto/exohuntr.git\ncd exohuntr\n\n# Download unconfirmed TOI light curves from NASA MAST\npython3.11 python/download_lightcurves.py --candidates-only --limit 200 --catalog\n\n# Build and run BLS transit detection (search subcommand)\ncargo build --release\n./target/release/hunt search -i data/lightcurves -o candidates.json --snr-threshold 6.0\n\n# Validate in Rust: parallel false-positive tests on all candidates\n./target/release/hunt validate -i candidates.json -l data/lightcurves -o results/\n\n# Cross-match against known exoplanet catalog in Rust\n./target/release/hunt crossmatch -i candidates.json -c data/lightcurves/confirmed_exoplanets.csv -o results/crossmatch_results.csv\n\n# Analyze: phase-fold plots, report (Python)\npython3.11 python/analyze_candidates.py --input candidates.json --lightcurves data/lightcurves/ --crossmatch --top-n 30\n\n# Deep analysis: centroid, Gaia, TLS, multi-sector on top candidates\npython3.11 python/deep_analysis.py\n```\n\nThe original top-level flags (`hunt -i \u003cdir\u003e`) remain supported for backward compatibility.\n\nOr use `make all` to run the download/search/analyze steps automatically.\n\n### Running tests\n\n```bash\n# All tests (66 Rust + 32 Python)\nmake test\n\n# Rust only\ncargo test\n\n# Python only\npython3.11 -m pytest tests/ -v\n```\n\n### Project Structure\n\n```\nexohuntr/\n├── src/\n│   ├── lib.rs                          # Rust library root\n│   ├── bls.rs                          # BLS algorithm + SNR estimation (18 tests)\n│   ├── validate.rs                     # 5 false-positive tests + scoring (23 tests)\n│   ├── crossmatch.rs                   # Hash-based catalog matching (13 tests)\n│   ├── io.rs                           # CSV parsing + file discovery (8 tests)\n│   └── main.rs                         # CLI: search, validate, crossmatch subcommands\n├── python/\n│   ├── download_lightcurves.py         # TESS light curve download from MAST\n│   ├── analyze_candidates.py           # Phase-fold plots, cross-matching, reports\n│   ├── validate_candidates.py          # 5-test false-positive validation (Python)\n│   └── deep_analysis.py               # Centroid, Gaia, TLS, multi-sector validation\n├── tests/\n│   ├── conftest.py                     # Shared fixtures (synthetic LCs, mock catalogs)\n│   ├── test_validate_candidates.py     # Python validation tests (24 tests)\n│   └── test_analyze_candidates.py      # Python analysis tests (8 tests)\n├── results/\n│   ├── plots/                          # Phase-folded light curve plots\n│   ├── deep_analysis/                  # TLS, centroid, secondary eclipse plots\n│   ├── REPORT.md                       # Detection summary\n│   ├── VALIDATION_REPORT.md            # Scored validation results\n│   └── DEEP_ANALYSIS.md               # Deep validation milestone report\n├── docs/                               # GitHub Pages interactive results\n├── candidates.json                     # Raw BLS detection output\n├── Cargo.toml                          # Rust dependencies + dev-dependencies\n├── pytest.ini                          # Python test configuration\n└── Makefile                            # Pipeline automation + `make test`\n```\n\n---\n\n## References\n\n- Kovacs, Zucker \u0026 Mazeh (2002). [A box-fitting algorithm in the search for periodic transits](https://ui.adsabs.harvard.edu/abs/2002A%26A...391..369K). _A\u0026A_, 391, 369\u0026ndash;377.\n- Hippke \u0026 Heller (2019). [Optimized transit detection algorithm to search for periodic transits of small planets](https://ui.adsabs.harvard.edu/abs/2019A%26A...623A..39H). _A\u0026A_, 623, A39.\n- Twicken et al. (2018). [Kepler Data Validation I \u0026mdash; Architecture, Diagnostic Tests, and Data Products](https://ui.adsabs.harvard.edu/abs/2018PASP..130f4502T). _PASP_, 130, 064502.\n- Ricker et al. (2015). [Transiting Exoplanet Survey Satellite (TESS)](https://ui.adsabs.harvard.edu/abs/2015JATIS...1a4003R). _JATIS_, 1, 014003.\n- Furlan et al. (2017). [Kepler Follow-up Observation Program. II](https://ui.adsabs.harvard.edu/abs/2017AJ....153...71F). _AJ_, 153, 71.\n- [lightkurve](https://docs.lightkurve.org/) \u0026mdash; Python package for Kepler and TESS time series analysis.\n- [ExoFOP-TESS](https://exofop.ipac.caltech.edu/tess/) \u0026mdash; Community follow-up observing program for TESS.\n- [NASA Exoplanet Archive](https://exoplanetarchive.ipac.caltech.edu/) \u0026mdash; Confirmed and candidate exoplanet catalog.\n\n## License\n\nMIT\n\n---\n\n\u003cp align=\"center\"\u003e\n  Data from NASA TESS via MAST.\u003cbr\u003e\n  \u003ca href=\"https://humancto.github.io/exohuntr\"\u003eView Interactive Results\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhumancto%2Fexohuntr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhumancto%2Fexohuntr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhumancto%2Fexohuntr/lists"}