Source code for ananke.Observer

#!/usr/bin/env python
#
# Author: Adrien CR Thob
# Copyright (C) 2022  Adrien CR Thob
#
# This file is part of the py-ananke project,
# <https://github.com/athob/py-ananke>, which is licensed
# under the GNU Affero General Public License v3.0 (AGPL-3.0).
# 
# The full copyright notice, including terms governing use, modification,
# and redistribution, is contained in the files LICENSE and COPYRIGHT,
# which can be found at the root of the source code distribution tree:
# - LICENSE <https://github.com/athob/py-ananke/blob/main/LICENSE>
# - COPYRIGHT <https://github.com/athob/py-ananke/blob/main/COPYRIGHT>
#
"""
Contains the Observer class definition

Please note that this module is private. The Observer class is
available in the main ``ananke`` namespace - use that instead.
"""
from __future__ import annotations
from typing import TYPE_CHECKING, Any, Dict
from numpy.typing import ArrayLike, NDArray
import numpy as np
from galaxia_ananke._defaults import DEFAULTS_FOR_PARFILE

from ._constants import *

if TYPE_CHECKING:
    from .Ananke import Ananke

__all__ = ['Observer']


[docs] class Observer: # TODO SkyCoord for center point: SkyCoord(u=-rSun[0], v=-rSun[1], w=-rSun[2], unit='kpc', representation_type='cartesian', frame='galactic') """ Store the observer parameters. """ _pos0 = 'rSun0' _pos1 = 'rSun1' _pos2 = 'rSun2' _pos = [_pos0,_pos1,_pos2] _default_position = np.array([DEFAULTS_FOR_PARFILE[_p] for _p in _pos]) _vel0 = 'vSun0' _vel1 = 'vSun1' _vel2 = 'vSun2' _vel = [_vel0,_vel1,_vel2] _default_velocity = np.array([DEFAULTS_FOR_PARFILE[_p] for _p in _vel]) _pha = _pos+_vel
[docs] def __init__(self, ananke: Ananke, pos3: ArrayLike = None, vel3: ArrayLike = None, **kwargs: Dict[str, Any]) -> None: """ Parameters ---------- ananke : Ananke object The Ananke object that utilizes this Observer object pos3 : array-like shape (3,) Position of the observer. Default to None vel3 : array-like shape (3,) Velocity of the observer. Default to None **kwargs Additional parameters """ self.__ananke: Ananke = ananke self.__position: NDArray = self.__prepare_position(pos3) self.__velocity: NDArray = self.__prepare_velocity(vel3) self.__parameters: Dict[str, Any] = kwargs
@classmethod def __prepare_against_default(cls, vector: ArrayLike, default: NDArray) -> NDArray: vector = np.array(len(default)*[np.nan] if vector is None else vector) vector[np.isnan(vector)] = default[np.isnan(vector)] return vector def __prepare_position(self, pos: ArrayLike) -> NDArray: return self.__prepare_against_default(pos, self._default_position) def __prepare_velocity(self, vel: ArrayLike) -> NDArray: return self.__prepare_against_default(vel, self._default_velocity) @property def ananke(self) -> Ananke: return self.__ananke @property def position(self) -> NDArray: return self.__position @property def velocity(self) -> NDArray: return self.__velocity @property def phase_space(self) -> NDArray: return np.hstack([self.position, self.velocity]) @property def to_galaxia_kwargs(self) -> Dict[str, float]: return dict(zip(self._pha, self.phase_space)) @property def parameters(self) -> Dict[str, Any]: return self.__parameters
if __name__ == '__main__': raise NotImplementedError()