Skip to main content

A package that provides flexible autofocus procedures for telescopes.

Project description

AstrAFocus

A Python package for automated telescope focusing.

logo image

AstrAFocus solves two problems: finding suitable sky regions for focus calibration, and performing the autofocus sweep itself. It is hardware-agnostic — connect real devices by implementing two small interface classes, or use the built-in simulators for development and testing.

Documentation

Installation

pip install astrafocus

Or from source using uv:

git clone https://github.com/dgegen/astrafocus.git
cd astrafocus
uv sync

For development (includes linting, docs, and test dependencies):

uv sync --group dev --group docs --group test

Optional extras:

pip install "astrafocus[alpaca]"       # ASCOM Alpaca device support (alpyca)
pip install "astrafocus[visualization]" # matplotlib, IPython, notebook
pip install "astrafocus[extended]"     # scikit-learn for additional estimators

Quick start

from astrafocus.interface.simulation import CabaretDeviceSimulator
from astrafocus.autofocuser import AnalyticResponseAutofocuser
from astrafocus.star_size_focus_measure_operators import HFRStarFocusMeasure

simulator = CabaretDeviceSimulator(current_position=11_000, allowed_range=(9_000, 13_000))

autofocuser = AnalyticResponseAutofocuser(
    autofocus_device_manager=simulator,
    exposure_time=3.0,
    focus_measure_operator=HFRStarFocusMeasure,
    n_steps=(20, 10),
)
autofocuser.run()
print(f"Best focus position: {autofocuser.best_focus_position}")

See the Getting Started notebook for a full walkthrough, or explorations/speculoos_main.py for a more complete real-world example.

Key components

Autofocus

  • AnalyticResponseAutofocuser — sweeps the focuser through a range of positions, measures focus quality, and fits an analytic curve (e.g. parabola) to locate the optimum.
  • NonParametricResponseAutofocuser — same sweep strategy, but uses a non-parametric smoother (LOWESS, spline, or RBF) instead of an analytic fit. Works with any focus measure operator.
  • FocusMeasureOperatorRegistry — 13 built-in operators: star-size estimators (hfr, gauss) and image-sharpness metrics (fft, tenengrad, laplacian, brenner, …).

Sky targeting

  • ZenithNeighbourhoodQuery — queries a Gaia-2MASS catalogue (local SQLite or remote) to find a region near zenith with a suitable density of stars for focus calibration.

Hardware interface

Connect real hardware by implementing two classes:

  • CameraInterface — one method: perform_exposure(texp).
  • FocuserInterface — one method: move_focuser_to_position(position).

Wrap them in AutofocusDeviceManager and pass it to any autofocuser. For hardware-free development and testing, use the built-in CabaretDeviceSimulator (synthetic images) or ObservationBasedDeviceSimulator (replay from FITS files).

The Gaia-2MASS Local Catalogue

The sky-targeting component requires a local Gaia-2MASS catalogue, available at ppp-one/gaia-tmass-sqlite.

Citation

If you use AstraFocus in your research, please cite it. A DOI is minted via Zenodo for each release. Use the Cite this repository button on GitHub for an up-to-date citation in your preferred format.

May your stars align and your focus be as sharp as a caffeinated owl spotting its prey!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

astrafocus-0.1.3.tar.gz (831.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

astrafocus-0.1.3-py3-none-any.whl (76.3 kB view details)

Uploaded Python 3

File details

Details for the file astrafocus-0.1.3.tar.gz.

File metadata

  • Download URL: astrafocus-0.1.3.tar.gz
  • Upload date:
  • Size: 831.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for astrafocus-0.1.3.tar.gz
Algorithm Hash digest
SHA256 74f296426abdf6b3070e12d774878d05d7d881c4023398754e1e44e280b9257f
MD5 f706ad6123feed4bab735402d517cca4
BLAKE2b-256 d9480ea322a6ddb2b41d5c47b13aeaab3c9a00077e157c1e9b643cafc1621c64

See more details on using hashes here.

Provenance

The following attestation bundles were made for astrafocus-0.1.3.tar.gz:

Publisher: python-publish-to-pypi.yml on dgegen/astrafocus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astrafocus-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: astrafocus-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 76.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for astrafocus-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 6aebd75cd60e87a85c1fda05100ea7728150da03a47f11c9e28feefaf0cb6d74
MD5 51dc6ac961c488ee0b6810bbeffc9367
BLAKE2b-256 25ff20d0cebf719036e3015e87417405e97eb93fff20f5f5d14a8737661201f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for astrafocus-0.1.3-py3-none-any.whl:

Publisher: python-publish-to-pypi.yml on dgegen/astrafocus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page