
    R1i%                        d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZmZ dd	lmZ dd
lmZ ddlmZmZmZ  ed e	D              Z G d de      Z G d de      Z G d de      Z G d de      Zd Zd Zd Zy)z2An interface between JPL ephemerides and Skyfield.    N)defaultdict)OutOfRangeError)SPK)target_name_pairs   )AU_KMDAY_S)EphemerisRangeError)compute_calendar_date)VectorFunction	VectorSum_jpl_code_name_dictc              #   *   K   | ]  \  }}||f  y wN ).0targetnames      S/home/cursorai/projects/iching/venv/lib/python3.12/site-packages/skyfield/jpllib.py	<genexpr>r      s      ):~T6N):s   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)SpiceKernela  Ephemeris file in NASA .bsp format.

    A "Spacecraft and Planet Kernel" (SPK) file from NASA provides
    |xyz| coordinates for bodies in the Solar System like the Sun,
    planets, moons, and spacecraft.

    You can download a .bsp file yourself and use this class to open it,
    or use the Skyfield ``load()`` function to automatically download a
    popular ephemeris.  Once loaded, you can print this object to the
    screen to see a report on the segments that it includes:

    >>> planets = load('de421.bsp')
    >>> print(planets)
    SPICE kernel file 'de421.bsp' has 15 segments
      JD 2414864.50 - JD 2471184.50  (1899-07-28 through 2053-10-08)
          0 -> 1    SOLAR SYSTEM BARYCENTER -> MERCURY BARYCENTER
          0 -> 2    SOLAR SYSTEM BARYCENTER -> VENUS BARYCENTER
          0 -> 3    SOLAR SYSTEM BARYCENTER -> EARTH BARYCENTER
          0 -> 4    SOLAR SYSTEM BARYCENTER -> MARS BARYCENTER
          0 -> 5    SOLAR SYSTEM BARYCENTER -> JUPITER BARYCENTER
          0 -> 6    SOLAR SYSTEM BARYCENTER -> SATURN BARYCENTER
          0 -> 7    SOLAR SYSTEM BARYCENTER -> URANUS BARYCENTER
          0 -> 8    SOLAR SYSTEM BARYCENTER -> NEPTUNE BARYCENTER
          0 -> 9    SOLAR SYSTEM BARYCENTER -> PLUTO BARYCENTER
          0 -> 10   SOLAR SYSTEM BARYCENTER -> SUN
          3 -> 301  EARTH BARYCENTER -> MOON
          3 -> 399  EARTH BARYCENTER -> EARTH
          1 -> 199  MERCURY BARYCENTER -> MERCURY
          2 -> 299  VENUS BARYCENTER -> VENUS
          4 -> 499  MARS BARYCENTER -> MARS

    To retrieve the one or more vectors necessary to compute the
    position of a body relative to the Solar System barycenter, look up
    the body by its name or official SPICE identifying integer:

    >>> planets['earth']
    <VectorSum of 2 vectors:
     'de421.bsp' segment 0 SOLAR SYSTEM BARYCENTER -> 3 EARTH BARYCENTER
     'de421.bsp' segment 3 EARTH BARYCENTER -> 399 EARTH>
    >>> planets[499]
    <VectorSum of 2 vectors:
     'de421.bsp' segment 0 SOLAR SYSTEM BARYCENTER -> 4 MARS BARYCENTER
     'de421.bsp' segment 4 MARS BARYCENTER -> 499 MARS>

    The result will be a :class:`~skyfield.vectorlib.VectorFunction`
    instance that you can ask for a position at a given input time.

    c                    || _         t        j                   j                  |      | _        t	        j
                  |      | _        | j                  j                  D cg c]  }t        | |       c}| _        t        d | j                  D              j                  d | j                  D              | _        y c c}w )Nc              3   4   K   | ]  }|j                     y wr   centerr   ss     r   r   z'SpiceKernel.__init__.<locals>.<genexpr>I   s     9=a=   c              3   4   K   | ]  }|j                     y wr   r   r   s     r   r   z'SpiceKernel.__init__.<locals>.<genexpr>I   s      @:+8a=r   )pathosbasenamefilenamer   openspksegmentsSPICESegmentsetunioncodes)selfr"   r   s      r   __init__zSpiceKernel.__init__D   s    	((.88D>8<8I8IJ8I1dA.8IJ94==99?? @:+/==@: :
 Ks   B;c                 `    dj                  t        |       j                  | j                        S )Nz<{0} {1!r}>)formattype__name__r"   r-   s    r   __repr__zSpiceKernel.__repr__L   s#    ##DJ$7$7CC    c           	         | j                   j                  }dj                  | j                  t	        |            g}dj                  }d x}}|D ]  }||j
                  k7  s||j                  k7  ri|j
                  |j                  }} |t        t        |             } |t        t        |             }|j                  dj                  ||||             |j                  t        |              dj                  |      S )Nz(SPICE kernel file {0!r} has {1} segmentsz{0}-{1:02}-{2:02}z,  JD {0:.2f} - JD {1:.2f}  ({2} through {3})
)r'   r(   r0   r%   lenstart_jdend_jdr   intappend_format_segmentjoin)	r-   r(   linesformat_datestartendr   startsendss	            r   __str__zSpiceKernel.__str__O   s    88$$;&H68)00A

"cQXXoZZs$&;CJ&GH"$9#c($CDK$fUC>@LL+,  yyr5   c                     | j                   j                          | j                  dd= | j                  j	                          y)zClose this ephemeris file.N)r'   closer(   r,   clearr3   s    r   rG   zSpiceKernel.close_   s.     MM!

r5   c                 6    | j                   j                         S )a  Return the comments string of this kernel.

        The resulting string often contains embedded newlines, and is
        formatted for a human reader.

        >>> print(planets.comments())
        ; de421.bsp LOG FILE
        ;
        ; Created 2008-02-12/11:33:34.00.
        ...
        LEAPSECONDS_FILE    = naif0007.tls
        SPK_FILE            = de421.bsp
        ...

        )r'   commentsr3   s    r   rJ   zSpiceKernel.commentsh   s      xx  ""r5   c                     t        t              }t        D ](  \  }}|| j                  v s||   j	                  |       * t        |      S )a*  Return all target names that are valid with this kernel.

        >>> pprint(planets.names())
        {0: ['SOLAR_SYSTEM_BARYCENTER', 'SSB', 'SOLAR SYSTEM BARYCENTER'],
         1: ['MERCURY_BARYCENTER', 'MERCURY BARYCENTER'],
         2: ['VENUS_BARYCENTER', 'VENUS BARYCENTER'],
         3: ['EARTH_BARYCENTER',
             'EMB',
         ...

        The result is a dictionary with target code keys and name lists
        as values.  The last name in each list is the one that Skyfield
        uses when printing information about a body.

        )r   listr   r,   r<   dict)r-   dcoder   s       r   nameszSpiceKernel.namesz   sC      +JD$tzz!$t$ , Awr5   c                 Z   t        |t              r|}nA|j                         }t        j	                  |      }|t        dj                  |            || j                  vrHdj                  d | j                  D              }t        dj                  | j                  ||            |S )ao  Translate a target name into its integer code.

        >>> planets.decode('Venus')
        299

        Raises ``ValueError`` if you supply an unknown name, or
        ``KeyError`` if the target is missing from this kernel.  You can
        supply an integer code if you already have one and just want to
        check whether it is present in this kernel.

        zunknown SPICE target {0!r}z, c              3   2   K   | ]  }t        |        y wr   )_format_code_and_name)r   cs     r   r   z%SpiceKernel.decode.<locals>.<genexpr>   s     M*Q 5a 8*s   z@kernel {0!r} is missing {1!r} - the targets it supports are: {2})
isinstancer;   upper_jpl_name_code_dictget
ValueErrorr0   r,   r>   KeyErrorr%   )r-   r   rO   targetss       r   decodezSpiceKernel.decode   s     dC D::<D&**40D| !=!D!DT!JKKtzz!iiM$**MMG ?"F4==$@B B r5   c                    | j                  |      }| j                  }t        d |D              }t        t	        ||            }t        |      dk(  r|d   S |ddd   }|d   j                  }|d   j                  }t        |||      S )z@Return a vector function for computing the location of `target`.c              3   8   K   | ]  }|j                   |f  y wr   r!   )r   segments     r   r   z*SpiceKernel.__getitem__.<locals>.<genexpr>   s     NX'W^^W5Xs   r   r   N)	r\   r(   rM   tuple_centerr8   r   r   r   )r-   r   r(   segment_dictchainr   s         r   __getitem__zSpiceKernel.__getitem__   s    V$==NXNNgfl34u:?8Oddqr!!//r5   c                     t        |t              r|}n#t        j                  |j	                               }|| j
                  v S r   )rU   r;   rW   rX   rV   r,   )r-   name_or_coderO   s      r   __contains__zSpiceKernel.__contains__   s9    lC(D&**<+=+=+?@Dtzz!!r5   N)r2   
__module____qualname____doc__r.   r4   rE   rG   rJ   rP   r\   re   rh   r   r5   r   r   r      s6    /`:D  #$,40"r5   r   c                   .    e Zd Zd Zd Zed        Zd Zy)r)   c                     |j                   dk(  rt        j                  t              S |j                   dk(  rt        j                  t              S t        dj                  |j                               )N      z#SPK data type {0} not yet supported)	data_typeobject__new__ChebyshevPositionChebyshevPositionVelocityrY   r0   )cls	ephemerisspk_segments      r   rr   zSPICESegment.__new__   s^      A%>>"344  A%>>";<<> &!6!679 	9r5   c                 d    || _         |j                  | _        |j                  | _        || _        y r   )rv   r   r   rw   )r-   rv   rw   s      r   r.   zSPICESegment.__init__   s+    "!((!((&r5   c                 L    dj                  | j                  j                        S )Nz{0!r} segment)r0   rv   r"   r3   s    r   vector_namezSPICESegment.vector_name   s    %%dnn&9&9::r5   c                     | j                   }|j                  |j                        |j                  |j                        fS r   )rw   tdb_jdr9   r:   )r-   tsr   s      r   
time_rangezSPICESegment.time_range   s2    yy$bii&999r5   N)r2   ri   rj   rr   r.   propertyrz   r~   r   r5   r   r)   r)      s%    9' ; ;:r5   r)   c                       e Zd Zd Zy)rs   c                    | j                   }	 |j                  |j                  |j                        \  }}|t        z  |t        z  d d fS # t        $ r}| j                  |j                        \  }}d|j                         d d z  }d|j                         d d z  }d|d|}	|j                  }
| j                   }t        |	|||
|      }d |_
        |d }~ww xY w)Nz%04d-%02d-%02dro   z$ephemeris segment only covers dates z	 through )rw   compute_and_differentiatewholetdb_fractionr   r~   r}   tdb_calendarout_of_range_timesr
   	__cause__r   )r-   tr_   positionvelocitye
start_timeend_timer   textmasks              r   _atzChebyshevPosition._at   s    ""	!(!B!B")Hh %E!14==  		#'??144#8 J :#:#:#<Ra#@@A 8#8#8#:2A#>>AJKQOD''D&&G#D*hgNAAKG		s   )A 	CBCCNr2   ri   rj   r   r   r5   r   rs   rs      s    >r5   rs   c                       e Zd Zd Zy)rt   c                     | j                   j                  |j                  |j                        }|d d t        z  |dd  t
        z  t        z  d d fS )Nro   )rw   computer   r   r   r	   )r-   r   pvs      r   r   zChebyshevPositionVelocity._at   sJ    %%aggq~~>"1v~r!"v~5tTAAr5   Nr   r   r5   r   rt   rt      s    Br5   rt   c              #   J   K   | |v r||    }| |j                   } | |v ryyw)z<Starting with `code`, follow segments from target to center.Nr   )rO   rc   r_   s      r   rb   rb      s0     
,
t$~~ ,
s   ##c                 l    t        j                  | d       }|t        |       S dj                  | |      S )Nz{0} {1})r   rX   strr0   )rO   r   s     r   rS   rS      s6    ""4.D|4yD$''r5   c                     t        j                  | j                  d      }t        j                  | j                  d      }dj	                  | j                  | j                  ||      S )Nunknownz    {0:3} -> {1:<3}  {2} -> {3})r   rX   r   r   r0   )r_   cnametnames      r   r=   r=      sR    ##GNNI>E##GNNI>E,33u6 6r5   )rk   r#   collectionsr   jplephem.exceptionsr   jplephem.spkr   jplephem.namesr   	constantsr   r	   errorsr
   timelibr   	vectorlibr   r   r   rM   rW   rq   r   r)   rs   rt   rb   rS   r=   r   r5   r   <module>r      s    8 	 # /  , # ' * E E ):  i"& i"V:> :0> >(B B(6r5   