Source code for across.tools.visibility.constraints.galactic_bulge

from typing import Literal

import astropy.units as u  # type: ignore[import-untyped]
import numpy as np
import numpy.typing as npt
from astropy.coordinates import SkyCoord  # type: ignore[import-untyped]
from astropy.time import Time  # type: ignore[import-untyped]
from pydantic import Field

from ...core.enums import ConstraintType
from ...ephemeris import Ephemeris
from .base import ConstraintABC


[docs] class GalacticBulgeConstraint(ConstraintABC): """ Constraint that avoids observing too close to the Galactic Bulge. The Galactic Bulge is a crowded region with extremely high stellar density, making it difficult to observe individual sources. This constraint ensures observations avoid this region. Parameters ---------- min_separation : float Minimum angular separation (degrees) required from the Galactic Bulge. Observations closer than this will be constrained. Methods ------- __call__(time, ephemeris, coordinate) Checks if the coordinate is too close to the Galactic Bulge. """
[docs] name: Literal[ConstraintType.GALACTIC_BULGE] = ConstraintType.GALACTIC_BULGE
[docs] short_name: Literal["Galactic Bulge"] = "Galactic Bulge"
[docs] min_separation: float = Field( default=10.0, gt=0, le=180, description="Minimum angular separation (degrees) from Galactic Bulge" )
[docs] def __call__(self, time: Time, ephemeris: Ephemeris, coordinate: SkyCoord) -> npt.NDArray[np.bool_]: """ Check if the coordinate is too close to the Galactic Bulge. Parameters ---------- time : Time The time (not used for galactic coordinates). ephemeris : Ephemeris The ephemeris (not used for galactic coordinates). coordinate : SkyCoord The coordinate to check. Returns ------- npt.NDArray[np.bool_] Boolean array where True indicates the coordinate violates the constraint (is too close to the Galactic Bulge). """ # Galactic Bulge coordinates (J2000) galactic_bulge = SkyCoord(ra="17h45m40.04s", dec="-29d00m28.1s", frame="icrs") # Calculate angular separation separation = coordinate.separation(galactic_bulge) # Record the separation in computed values self.computed_values.galactic_bulge_separation = separation # Constrain observations closer than the minimum separation in_constraint: npt.NDArray[np.bool_] = separation < (self.min_separation * u.deg) return in_constraint