Source code for adam_core.observers.utils

from datetime import timedelta
from zoneinfo import ZoneInfo

import numpy as np
import pyarrow as pa
import pyarrow.compute as pc
from astropy.time import Time

from ..time import Timestamp
from .observers import OBSERVATORY_PARALLAX_COEFFICIENTS


[docs] def calculate_observing_night(codes: pa.Array, times: Timestamp) -> pa.Array: """ Compute the observing night for a given set of observatory codes and times. An observing night is defined as the night during which the observation is made, in the local time of the observatory +- 12 hours. The observing night is defined as the integer MJD of the night in the local time of the observatory. Parameters ---------- codes : pyarrow.Array (N) An array of observatory codes. times : Timestamp (N) An array of times. Returns ------- observing_night : pyarrow.Array (N) An array of observing nights. """ half_day = timedelta(hours=12) observing_night = np.empty(len(times), dtype=np.int64) for code in pc.unique(codes): parallax_coefficients = OBSERVATORY_PARALLAX_COEFFICIENTS.select("code", code) if len(parallax_coefficients) == 0: raise ValueError(f"Unknown observatory code: {code}") tz = ZoneInfo(parallax_coefficients.timezone()[0]) mask = pc.equal(codes, code) times_code = times.apply_mask(mask) observing_night_code = Time( [ time + time.astimezone(tz).utcoffset() - half_day for time in times_code.to_astropy().datetime ], format="datetime", scale="utc", ) observing_night_code = observing_night_code.mjd.astype(int) observing_night[mask.to_numpy(zero_copy_only=False)] = observing_night_code return pa.array(observing_night)