
    HR-e#                     t    d Z ddlZddlZddlmZ ddlmZ ddl	m
Z
 dgZdd	giZ G d
 dej                  ZdS )z`
This module contains the classes and utility functions for distance and
cartesian coordinates.
    N)units)AstropyWarning   )AngleDistance*scipyc                        e Zd ZdZej        ZdZddddddej	        dddddf fd	Z
ed             ZddZed	             Zed
             Zed             Z xZS )r   a
  
    A one-dimensional distance.

    This can be initialized by providing one of the following:

    * Distance ``value`` (array or float) and a ``unit``
    * |Quantity| object with dimensionality of length
    * Redshift and (optionally) a `~astropy.cosmology.Cosmology`
    * Distance modulus
    * Parallax

    Parameters
    ----------
    value : scalar or `~astropy.units.Quantity` ['length']
        The value of this distance.
    unit : `~astropy.units.UnitBase` ['length']
        The unit for this distance.
    z : float
        A redshift for this distance.  It will be converted to a distance
        by computing the luminosity distance for this redshift given the
        cosmology specified by ``cosmology``. Must be given as a keyword
        argument.
    cosmology : `~astropy.cosmology.Cosmology` or None
        A cosmology that will be used to compute the distance from ``z``.
        If `None`, the current cosmology will be used (see
        `astropy.cosmology` for details).
    distmod : float or `~astropy.units.Quantity`
        The distance modulus for this distance. Note that if ``unit`` is not
        provided, a guess will be made at the unit between AU, pc, kpc, and Mpc.
    parallax : `~astropy.units.Quantity` or `~astropy.coordinates.Angle`
        The parallax in angular units.
    dtype : `~numpy.dtype`, optional
        See `~astropy.units.Quantity`.
    copy : bool, optional
        See `~astropy.units.Quantity`.
    order : {'C', 'F', 'A'}, optional
        See `~astropy.units.Quantity`.
    subok : bool, optional
        See `~astropy.units.Quantity`.
    ndmin : int, optional
        See `~astropy.units.Quantity`.
    allow_negative : bool, optional
        Whether to allow negative distances (which are possible in some
        cosmologies).  Default: `False`.

    Raises
    ------
    `~astropy.units.UnitsError`
        If the ``unit`` is not a length unit.
    ValueError
        If value specified is less than 0 and ``allow_negative=False``.

        If ``cosmology`` is provided when ``z`` is *not* given.

        If either none or more than one of ``value``, ``z``, ``distmod``,
        or ``parallax`` were given.


    Examples
    --------
    >>> from astropy import units as u
    >>> from astropy.cosmology import WMAP5
    >>> Distance(10, u.Mpc)
    <Distance 10. Mpc>
    >>> Distance(40*u.pc, unit=u.kpc)
    <Distance 0.04 kpc>
    >>> Distance(z=0.23)                      # doctest: +FLOAT_CMP
    <Distance 1184.01657566 Mpc>
    >>> Distance(z=0.23, cosmology=WMAP5)     # doctest: +FLOAT_CMP
    <Distance 1147.78831918 Mpc>
    >>> Distance(distmod=24.47*u.mag)         # doctest: +FLOAT_CMP
    <Distance 783.42964277 kpc>
    >>> Distance(parallax=21.34*u.mas)        # doctest: +FLOAT_CMP
    <Distance 46.86035614 pc>
    TNFr   c           
         t          d ||||fD                       }|dk    rt          d          |dk    rt          d          |d}|3|ddlm} |                                }|                    |          }n|t          d          ||                     |          }|pt          j        |j	                  
                                }|d	k    rt          j        }n|d
k    rt          j        }n|dk     rt          j        }nt          j        }n||z|t          j        }|                    |t          j                              }t          j        |dk               r,|rt'          j        dt*                     nt          d          t-                                          | |||||	|
|          }|s,t          j        |j	        dk               rt          d          |S )Nc              3      K   | ]}|d uV  	d S N ).0xs     =lib/python3.11/site-packages/astropy/coordinates/distances.py	<genexpr>z#Distance.__new__.<locals>.<genexpr>v   s&      NN1$NNNNNN    r   zQnone of `value`, `z`, `distmod`, or `parallax` were given to Distance constructorr   zZmore than one of `value`, `z`, `distmod`, or `parallax` were given to Distance constructorFdefault_cosmologyzHa `cosmology` was given but `z` was not provided in Distance constructor      )equivalenciesznegative parallaxes are converted to NaN distances even when `allow_negative=True`, because negative parallaxes cannot be transformed into distances. See the discussion in this paper: https://arxiv.org/abs/1507.02105zsome parallaxes are negative, which are not interpretable as distances. See the discussion in this paper: https://arxiv.org/abs/1507.02105 . You can convert negative parallaxes to NaN distances by providing the `allow_negative=True` argument.)dtypecopyordersubokndminzWdistance must be >= 0. Use the argument `allow_negative=True` to allow negative values.)sum
ValueErrorastropy.cosmologyr   getluminosity_distance_distmod_to_pcnplog10valuemeanuMpckpcAUpcto_valueparallaxanywarningswarnr   super__new__)clsr'   unitz	cosmologydistmodr/   r   r   r   r   r   allow_negative
n_not_noner   
meanlogvaldistance	__class__s                    r   r4   zDistance.__new__g   sZ    NN7H0MNNNNN
??5   !^^@  
 = D= ??????-1133	11!44EE"3  
  &&w//E|  Xek227799
>>5DD!^^5DD"__4DD4D!|t%%d!*,,%GGEvhl## ! M< '    %H   77?? # 	
 	
  	"&!);"<"< 	B  
 r   c                 *    |                                  S )zShort for ``self.compute_z()``.)	compute_zselfs    r   r7   z
Distance.z   s     ~~r   c                     ddl m} |ddl m} |                                }|                    dd            ||j        | fi |S )a  
        The redshift for this distance assuming its physical distance is
        a luminosity distance.

        Parameters
        ----------
        cosmology : `~astropy.cosmology.Cosmology` or None
            The cosmology to assume for this calculation, or `None` to use the
            current cosmology (see `astropy.cosmology` for details).
        **atzkw
            keyword arguments for :func:`~astropy.cosmology.z_at_value`

        Returns
        -------
        z : `~astropy.units.Quantity`
            The redshift of this distance given the provided ``cosmology``.

        Warnings
        --------
        This method can be slow for large arrays.
        The redshift is determined using :func:`astropy.cosmology.z_at_value`,
        which handles vector inputs (e.g. an array of distances) by
        element-wise calling of :func:`scipy.optimize.minimize_scalar`.
        For faster results consider using an interpolation table;
        :func:`astropy.cosmology.z_at_value` provides details.

        See Also
        --------
        :func:`astropy.cosmology.z_at_value` : Find the redshift corresponding to a
            :meth:`astropy.cosmology.FLRW.luminosity_distance`.
        r   )
z_at_valueNr   ztolg|=)r!   rD   r   r"   
setdefaultr#   )rB   r8   atzkwrD   r   s        r   r@   zDistance.compute_z   ss    @ 	100000;;;;;;)--//I)))z)7GGGGGr   c                     dt          j        |                     t          j                            z  dz
  }t          j        |t          j        d          S )z4The distance modulus as a `~astropy.units.Quantity`.      @Fr   )r%   r&   r.   r)   r-   Quantitymag)rB   vals     r   r9   zDistance.distmod   sD     BHT]]1400111C7z#qu51111r   c                     t          j        |t           j                  } | d|j        dz   dz  z  t           j        d          S )N
      rI   FrJ   )r)   rK   rL   r'   r-   )r5   dms     r   r$   zDistance._distmod_to_pc  s>    ZAE""s228a<3./EBBBBr   c                 ~    t          |                     t          j        t          j                                        S )z=The parallax angle as an `~astropy.coordinates.Angle` object.)r   tor)   milliarcsecondr/   rA   s    r   r/   zDistance.parallax	  s)     TWWQ-qz||<<===r   r   )__name__
__module____qualname____doc__r)   m_equivalent_unit _include_easy_conversion_membersr%   inexactr4   propertyr7   r@   r9   classmethodr$   r/   __classcell__)r>   s   @r   r   r      s       J JX s'+$ 
jf f f f f fP     X (H (H (H (HT 2 2 X2
 C C [C > > X> > > > >r   )rX   r1   numpyr%   astropyr   r)   astropy.utils.exceptionsr   anglesr   __all____doctest_requires__SpecificTypeQuantityr   r   r   r   <module>rg      s    
            3 3 3 3 3 3      , gY' u> u> u> u> u>q% u> u> u> u> u>r   