Source code for astrafocus

from astrafocus.autofocuser import AnalyticResponseAutofocuser, NonParametricResponseAutofocuser
from astrafocus.extremum_estimators import ExtremumEstimatorRegistry
from astrafocus.focus_measure_operators import (
    AbsoluteGradientFocusMeasure,
    AutoCorrelationFocusMeasure,
    BrennerFocusMeasure,
    FFTFocusMeasureTan2022,
    FFTPhaseMagnitudeProductFocusMeasure,
    FFTPowerFocusMeasure,
    LaplacianFocusMeasure,
    NormalizedVarianceFocusMeasure,
    SquaredGradientFocusMeasure,
    TenengradFocusMeasure,
    VarianceOfLaplacianFocusMeasure,
)
from astrafocus.focus_measure_scan import FocusMeasureScan
from astrafocus.star_size_focus_measure_operators import (
    GaussianStarFocusMeasure,
    HFRStarFocusMeasure,
)
from astrafocus.utils.logger import get_logger

logger = get_logger()

__all__ = [
    "AnalyticResponseAutofocuser",
    "NonParametricResponseAutofocuser",
    "FocusMeasureOperatorRegistry",
    "ExtremumEstimatorRegistry",
    "FocusMeasureScan",
]


[docs] class FocusMeasureOperatorRegistry: """Registry mapping string keys to focus measure operator classes. Examples -------- >>> from astrafocus import FocusMeasureOperatorRegistry >>> FocusMeasureOperatorRegistry.list() # doctest: +ELLIPSIS ['hfr', ..., 'auto_correlation'] >>> FocusMeasureOperatorRegistry.from_name("fft") <class 'astrafocus.focus_measure_operators.FFTFocusMeasureTan2022'> """ _operators = { "hfr": HFRStarFocusMeasure, "gauss": GaussianStarFocusMeasure, "fft": FFTFocusMeasureTan2022, "fft_power": FFTPowerFocusMeasure, "fft_phase_magnitude_product": FFTPhaseMagnitudeProductFocusMeasure, "normalized_variance": NormalizedVarianceFocusMeasure, "brenner": BrennerFocusMeasure, "tenengrad": TenengradFocusMeasure, "laplacian": LaplacianFocusMeasure, "variance_laplacian": VarianceOfLaplacianFocusMeasure, "absolute_gradient": AbsoluteGradientFocusMeasure, "squared_gradient": SquaredGradientFocusMeasure, "auto_correlation": AutoCorrelationFocusMeasure, }
[docs] @classmethod def get(cls, key: str, default=HFRStarFocusMeasure): """Get a focus measure operator class by fuzzy matching the key. Returns hfr if not found.""" return cls._operators.get(key, default)
[docs] @classmethod def from_name(cls, key: str): """Get a focus measure operator class by fuzzy matching the key. Returns hfr if not found.""" key = key.lower().replace("-", "_").replace(" ", "_") # Exact match if key in cls._operators: return cls._operators[key] # Fuzzy match words = key.split("_") for name, operator in cls._operators.items(): if any(word in name for word in words): return operator logger.warning(f"Focus measure operator '{key}' not found. Using 'hfr' instead.") return cls._operators["hfr"]
[docs] @classmethod def list(cls): """List all available focus measure operators.""" return list(cls._operators.keys())