
    HR-eT                         d dl Zd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZmZmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d
dlmZ  G d de          ZdS )    N)EarthLocation)fits)GLOBAL_TIME_INFOis_time_column_keywordtime_to_fits)ColumnQTableTable)Time	TimeDelta)BARYCENTRIC_SCALES)FITS_DEPRECATED_SCALES)AstropyUserWarning   )FitsTestCasec                      e Zd Zd Zd Zej                            dee	f          d             Z
ej                            ddddgf          ej                            dd	          d
                         Zej                            dee	f          d             Zej                            dee	f          d             Zej                            dee	f          d             Zej                            dee	f          d             Zej                            dee	f          d             Zej                            dee	f          d             Zej                            dee	f          d             Zej                            dee	f          d             Zej                            dee	f          d             ZdS )TestFitsTimec                     t          j        ddg          | _        t          j        ddgddgddggg          | _        d S )Nz1999-01-01T00:00:00.123456789z2010-01-01T00:00:00r            )nparraytimetime_3dselfs    Clib/python3.11/site-packages/astropy/io/fits/tests/test_fitstime.pysetup_classzTestFitsTime.setup_class   sE    H=?TUVV	x1a&1a&1a&!9 :;;    c                 x    t          d          du sJ t          d          du sJ t          d          du sJ d S )NTRPOSFTIMESYSTRPOS12T)r   r   s    r   test_is_time_column_keywordz(TestFitsTime.test_is_time_column_keyword   sW    %g..%7777 &i00E9999 &i00D888888r    table_typesc           	          |            }t          | j        dd          |d<   t          | j        dd          |d<   t          ddgdd	gd	d
gd          |d         _        t	          j        t          d          5  t          |          \  }}ddd           n# 1 swxY w Y   |d         |d         j        j        	                    d          k    
                                sJ |d         |d         j        j        	                    d          k    
                                sJ |d         |d         j        j        	                    d          k    
                                sJ t	          j        t          d          5  |                    |                     d          dd           ddd           n# 1 swxY w Y   t          j        |                     d          d          }|                    dd          J t	          j        t          d          5  |                    |                     d          dd          }ddd           n# 1 swxY w Y   |d         j        |d         j        k    
                                sJ |d         j        |d         j        k    sJ t          ddd          |d         _        t          ddd          |d         _        t	          j        t(                    5 }t          |          \  }}dt+          |j                  v sJ 	 ddd           n# 1 swxY w Y   d|d         _        t	          j        t          d          5 }t          |          \  }}ddd           n# 1 swxY w Y   t/          |          dk    sJ t          ddd          |d         _        t          |          \  }}t0          D ]}|                    dt5          |d         |                     t	          j        t          d           5 }t          |          \  }}ddd           n# 1 swxY w Y   t/          |          dk    sJ  |            }t          ddgdd	gd	d
gggddgdd	gd	d
gggddgdd	gd	d
gggd          }	t          | j        d!|	"          |d<   t          |          \  }}|d         |d         j        j        	                    d          k    
                                sJ |d         |d         j        j        	                    d          k    
                                sJ |d         |d         j        j        	                    d          k    
                                sJ |                    |                     d          dd           |                    |                     d          dd          }|d         j        |d         j        k    
                                sJ t          | j        t          dgggdgggd	gggd          #          |d<   t          |          \  }}|d         |d         j        j        	                    d          k    sJ |d         |d         j        j        	                    d          k    sJ |d         |d         j        j        	                    d          k    sJ |                    |                     d          dd           |                    |                     d          dd          }|d         j        |d         j        k    sJ dS )$zk
        Test all the unusual conditions for locations of ``Time``
        columns in a ``Table``.
        isotutcformatscaleattbg      ?g       @g      @g      @MmunitNTime Column "b" has no specified location, but global Time Position is presentmatchNOBSGEO-XmOBSGEO-YOBSGEO-Z	time.fitsr   Tr+   	overwriter   TRPOS2zTime column reference position "TRPOSn" is not specified. The default value for it is "TOPOCENTER", and the observatory position has been specified.r+   astropy_nativer   r   r   z/Multiple Time Columns with different geocentricz+Earth Location "TOPOCENTER" for Time Columnjd)r+   location)rA   )r   r   r   rA   pytestwarnsr   r   xto_valueallyzwritetempr   	getheadergetreadraises
ValueErrorstrvaluelenr   replace_columngetattrr   )
r   r&   ttablehdrtmerrwr,   rA   s
             r   test_time_to_fits_locz"TestFitsTime.test_time_to_fits_loc%   s
	    KMMdie<<<#did;;;# (c
S#Jc
QUVVV#\G
 
 
 	) 	)
 &aJE3	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) j!QsV_%6%?%?S%?%I%IINNPPPPPj!QsV_%6%?%?S%?%I%IINNPPPPPj!QsV_%6%?%?S%?%I%IINNPPPPP\G
 
 
 	K 	K
 GGDIIk**6TGJJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K nTYY{33Q77wwx&&...\N
 
 
 	 	 !!		+&&vd "  B	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 3 AcFO388:::::#w1S6?2222 (1a00#'1a00#]:&& 	W#%aJE3DCIVVVVV	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W
 #\@
 
 
 	) %aJE3	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 1vv{{{{ (1a00#!!__
s ( 	 	ES'!C&%"8"8999"C   - )!__
s	- - - - - - - - - - - - - - -
 q66Q;;;;; KMM Cj3*sCj12Cj3*sCj12Cj3*sCj12	
 
 
 dl4(CCC#!!__
sj!QsV_%6%?%?S%?%I%IINNPPPPPj!QsV_%6%?%?S%?%I%IINNPPPPPj!QsV_%6%?%?S%?%I%IINNPPPPP			+&&vFFFIIk""6$  
 
 3 AcFO388::::: I"cUG9wiC5'NNN
 
 
#
 "!__
s:!C&/"3"<"<#"<"F"FFFFF:!C&/"3"<"<#"<"F"FFFFF:!C&/"3"<"<#"<"F"FFFFF			+&&vFFFIIk""6$  
 
 #w1S6?222222sl   >BB!$B!,GGG-,I%%I),I)+MMM:NN N5QQ	Q	maskFTserialize_method)jd1_jd2formatted_valuec           	         t          t          j                            | j        |                    }t          t          j                            ddgddggt          j        |d                    d          }|j        |j        cxu r|d	uu sn J t          ||gd
dg          }|                    | 	                    d          dd|           t          j
        | 	                    d          dd          }|d	urTt          j        |d
         j        |j        k              sJ t          j        |d         j        |j        k              sJ |dk    rxt          |d
         t                     rt          j        |d
         |k              sJ t          |d         t                     rt          j        |d         |k              sJ dS t          |d
         t                    r#t          j        |d
         |j        k              sJ t          |d         t                    r#t          j        |d         |j        k              sJ dS )zO
        Test the data returned by ``time_to_fits`` for masked values.
        )r\   r   r   r   r   )r   r   cxcsecr+   Fr-   r/   )namesr:   r   T)r+   r<   r]   r>   r^   N)r   r   maMaskedArrayr   broadcast_tomaskedr	   rI   rJ   rM   rF   r\   
isinstancer   rQ   )r   r]   r\   r-   r/   rU   rX   s          r   "test_time_to_fits_serialize_methodz/TestFitsTime.test_time_to_fits_serialize_method   sE    ""494"8899E1v1v.R_T65R5RSS
 
 
 x18::::E(9::::::Aq6#s,,,	IIk""-	 	 	
 	
 	
 [;//tTTTu6"S',!&0111116"S',!&011111y((bgt,,E311E1EEEEbgt,,E311E1EEEEEE bgv..M26"S'QW:L3M3MMMMbgv..M26"S'QW:L3M3MMMMMMr    c                     |            }t          | j        ddt          dddd                    |d	<   t          d
dgdd          |d<   |d	         j        j        j        |d	         j        j        j        |d	         j        j        j        d}t          j	        t          d          5  t          |          \  }}ddd           n# 1 swxY w Y   t          j                    D ]G\  }}||         |d         k    sJ |j        |         |d
         k    sJ |                    |           H|                                D ](\  }}||         |k    sJ |                    |           )|j        d         }|D ]G}	||	         d         ||	         j                                        k    sJ ||	         d         dk    sJ H|d	         d         dk    sJ |d         d         J t'          |          dk    sJ dS )zL
        Test the header and metadata returned by ``time_to_fits``.
        r(   r)   隧@ 9> r7   r1   r+   r,   rA   r-   r   r   ra   r.   r*   r/   )r6   r8   r9   r3   r4   Nr   __coordinate_columns__
coord_type
coord_unitdtime_ref_pos
TOPOCENTER)r   r   r   rA   rD   rQ   rG   rH   rB   rC   r   r   r   itemscommentsremovemetar,   upperrR   )
r   r&   rU   ideal_col_hdrrV   rW   keyrQ   
coord_infocolnames
             r   test_time_to_fits_headerz%TestFitsTime.test_time_to_fits_header   s   
 KMMI"8WgCHHH	
 
 
# q!fXT:::# #)/#)/#)/
 
 \G
 
 
 	) 	)
 &aJE3	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) +022 	 	JCs8uQx''''<$a0000JJsOOOO'--// 	 	JCs8u$$$$JJsOOOO Z 89
! 	< 	<Gg&|4'
8H8N8N8P8PPPPPg&|4;;;;;#~.,>>>>#~.6663xx1}}}}}}s   .CCCc                     |            }t          | j        dd          |d<   d|j        d<   d|j        d<   |                    |                     d	          d
d           |                    |                     d	          d
d          }t          |j        d         t                     sJ |j        d         j        |j        d         k    sJ |j        d         j        d
k    sJ |j        d         j	        dk    sJ t          |j        d         t                     sJ |j        d         j        |j        d         k    sJ |j        d         j        dk    sJ |j        d         j	        dk    sJ d|j        d<   |                    |                     d	          d
d           |                    |                     d	          d
d          }t          |j        d         t                     sJ |j        d         j        |j        d         k    sJ |j        d         j	        dk    sJ t          |j        d         t                     sJ |j        d         j        |j        d         k    sJ |j        d         j	        t          |j        d                  k    sJ d|d         j        j        d
<   |                    |                     d	          d
d           |                    |                     d	          d
          }t          |j        d         t                     rJ |j        d         |j        d         k    sJ t          |j        d         t                     rJ |j        d         |j        d         k    sJ |d         |d         j        k                                    sJ dS )zn
        Test that the relevant global time metadata is read into
        ``Table.meta`` as ``Time``.
        r(   r)   r*   r-   z1999-01-01T00:00:00DATEi^  zMJD-OBSr:   r   Tr;   r>   mjdETr#   r_   rb   N)r   r   rx   rI   rJ   rM   rh   rQ   r+   r,   r   infor]   rF   )r   r&   rU   rX   s       r   test_fits_to_time_metaz#TestFitsTime.test_fits_to_time_meta   s    KMMdie<<<#.v!y 	
		+&&vFFFIIk""6$  
 

 "'&/400000wv$v6666wv%////wv$---- "'),d33333wy!'16)+<<<<<wy!(E1111wy!'50000 !y			+&&vFFFIIk""6$  
 

 "'&/400000wv$v6666wv$---- "'),d33333wy!'16)+<<<<<wy!'+A!&BS+TTTTT 0A#$V,			+&&vFFFdii44VDD bgfot44444wv!&.0000 bgi0$77777wy!QVI%6666631S6<',,.......r    c                 T    |            }t          | j        ddt          dddd                    |d	<   t          |          \  }}|d
         |d	         j        j                            d          k    sJ |d         |d	         j        j                            d          k    sJ |d         |d	         j        j                            d          k    sJ |	                    | 
                    d          dd           |                    | 
                    d          dd          }|d	         j        |d	         j        k                                    sJ |d	         j        j        j        |d	         j        j                            d          k    sJ |d	         j        j        j        |d	         j        j                            d          k    sJ |d	         j        j        j        |d	         j        j                            d          k    sJ dS )z
        Test that ``location`` specified by using any valid unit
        (length/angle) in ``Time`` columns gets stored in FITS
        as ITRS Cartesian coordinates (X, Y, Z), each in m.
        Test that it round-trips through FITS.
        r(   r)   r   r   r   kmr1   rn   r-   r6   r7   r8   r9   r:   r   Tr;   r>   N)r   r   r   r   rA   rD   rE   rG   rH   rI   rJ   rM   rF   rQ   )r   r&   rU   rV   rW   rX   s         r   test_time_loc_unitzTestFitsTime.test_time_loc_unit4  s    KMMI"1a666	
 
 
# "!__
s :!C&/"3"<"<#"<"F"FFFFF:!C&/"3"<"<#"<"F"FFFFF:!C&/"3"<"<#"<"F"FFFFF			+&&vFFFIIk""6$  
 

 3 AcFO388:::::#w!'1S6?+<+E+E3+E+O+OOOOO#w!'1S6?+<+E+E3+E+O+OOOOO#w!'1S6?+<+E+E3+E+O+OOOOOOOr    c                     |            }t          | j        dd          |d<   ddg|d<   dd	g|d
<   |                    d           |                    d           |                    |                     d          dd           |                    |                     d          dd          }t          |d         t                     sJ t          |j                  dk    sJ t          |j                  dk    sJ dD ]L}t          ||         j	        j                  dk    sJ t          ||         j	        j                  dk    sJ MdS )zg
        Ensure that fits_to_time works correctly if the time column is also
        an index.
        r(   r)   r*   r-   r   r   r/   r   r   cr:   r   Tr;   r>   r   )r-   r/   N)
r   r   	add_indexrI   rJ   rM   rh   rR   indicesr   )r   r&   rU   rX   names        r   test_fits_to_time_indexz$TestFitsTime.test_fits_to_time_indexV  sl    KMMdie<<<#Q#Q# 	
C	C 	
		+&&vFFFIIk""6$  
 
 "S'4(((((
 19~~""""2:!#### 	3 	3Dqw|+,,1111r$x},--22222	3 	3r    c                    |                      d          }t          j        t          d          5  |                    |d          }ddd           n# 1 swxY w Y   t          |d         t                    sJ |d         j        dk    sJ |d         j        d	k    sJ |                    |          }t          |j	        d
         d	|j	        d         
                                          }t          |d                   }||z   |d         k                                    sJ dD ]}t          ||         t                    rJ  dS )a  
        Test that FITS table with time columns (standard compliant)
        can be read by io.fits as a table with Time columns.
        This tests the following:

        1. The special-case where a column has the name 'TIME' and a
           time unit
        2. Time from Epoch (Reference time) is appropriately converted.
        3. Coordinate columns (corresponding to coordinate keywords in the header)
           other than time, that is, spatial coordinates, are not mistaken
           to be time.
        zchandra_time.fitsz5Time column "time" reference position will be ignoredr4   Tr?   Nr   r.   r   MJDREFr#   r*   )chipxchipydetxdetyrD   rG   )datarB   rC   r   rM   rh   r   r,   r+   rx   lowerr   rF   )r   r&   filenamerX   
non_nativeref_time
delta_timer}   s           r   test_io_time_read_fitsz#TestFitsTime.test_io_time_read_fitsw  s    99011\N
 
 
 	A 	A !!(4!@@B		A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A "V*d+++++&z4''''&z E)))) %%h//
 OH%/),2244
 
 

 z&122
:%F388::::: D 	5 	5G!"W+t444444	5 	5s   AAAc                    t          j        dddd| j                  }t           j                            |g          }|                    |                     d          d           |                    |                     d          d	          }t          |d         t                    sJ |d         j
        d
k    sJ |d         j        dk    sJ |d         | j        k                                    sJ dS )zP
        Test that ISO-8601 Datetime String Columns are read correctly.
        datetimeA29TCG	GEOCENTERr   r+   rp   rs   r   r:   Tr<   r   tcgr   N)r   r   r   BinTableHDUfrom_columnswritetorJ   rM   rh   r   r,   r+   rF   )r   r&   r   bhdurX   s        r   test_io_time_read_fits_datetimez,TestFitsTime.test_io_time_read_fits_datetime  s     K$)
 
 
 ,,aS11TYY{++t<<<dii44TJJ"Z.$/////*~#u,,,,*~$....:$)+002222222r    c                 f   t          j        dddd| j                  }g d}t           j                            |gt          j        |                    }|                    |                     d          d	
           |                    |                     d          d	          }t          |d         t                    sJ |d         j        j        j        dk    sJ |d         j        j        j        dk    sJ |d         j        j        j        dk    sJ g d}t           j                            |gt          j        |                    }|                    |                     d          d	
           |                    |                     d          d	          }t          |d         t                    sJ |d         j        j        j        dk    sJ |d         j        j        j        dk    sJ t%          j        |d         j        j        j        ddd          sJ dS )z{
        Test that geocentric/geodetic observatory position is read
        properly, as and when it is specified.
        r   r   TTrt   r   ))r6   rk   )r8   rl   )r9   rm   headerr:   Tr   r   rk   rl   rm   )zOBSGEO-Lr   )zOBSGEO-Br   )zOBSGEO-Hr   r   g&.>)rtolatolN)r   r   r   r   r   Headerr   rJ   rM   rh   r   rA   rD   rQ   rG   rH   lonlatr   iscloseheight)r   r&   r   cardsr   rX   s         r   test_io_time_read_fits_locationz,TestFitsTime.test_io_time_read_fits_location  s"    K%)
 
 
 WVV ,,aSU9K9K,LLTYY{++t<<<dii44TJJ"Z.$/////*~&(.(::::*~&(.'9999*~&(.'9999 DCC ,,aSU9K9K,LLTYY{++t<<<dii44TJJ"Z.$/////*~&*0A5555*~&*0A5555z"Z.18>PTUUUUUUUUr    c           	         t          j        ddg          }t          j        dddddd|          }g d	}t          j                            |gt          j        |          
          }|                    |                     d          d           t          j
        t          d          5 }|                    |                     d          d          }ddd           n# 1 swxY w Y   t          |          dk    sJ t          |d         t                    sJ |d         j        dk    sJ |d         j        dk    sJ |d         j        |k                                    sJ t          j        ddg          }t          j        dddddd|          }t          j                            |g          }|                    |                     d          d           |                    |                     d          d          }t          |d         t                    sJ |d         j        dk    sJ |d         j        dk    sJ |d         j        |k                                    sJ dS )z
        Test handling of 'GPS' and 'LOCAL' time scales which are
        recognized by the FITS standard but are not native to astropy.
        i%i%gps_timeDsGPSrt   )r   r+   r2   rp   rq   rs   r   r   r   r:   Tr   z&FITS recognized time scale value "GPS"r4   r   Nr   gpstair   
local_timerr   LOCALRELOCATABLEr   local)r   r   r   r   r   r   r   r   rJ   rB   rC   r   rM   rR   rh   r   r+   r,   rQ   rF   )	r   r&   r   r   r   r   rZ   rX   r   s	            r   test_io_time_read_fits_scalez)TestFitsTime.test_io_time_read_fits_scale  s    8Y	233K%
 
 
 DCC,,aSU9K9K,LLTYY{++t<<<\&N
 
 
 	O!!$))K"8"8!NNB	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 1vv{{{{"Z.$/////*~$----*~#u,,,,:$05577777 Xq!f%%
K&
 
 
 ,,aS11TYY{++t<<<dii44TJJ"\*D11111,&%////,%0000< &*499;;;;;;;s   /+C&&C*-C*c                    t          j        dddd| j                  }t           j                            |g          }|                    |                     d          d           t          j        t          d	
          5 }|
                    |                     d          d           ddd           n# 1 swxY w Y   t          |          dk    sJ t          j        ddd| j                  }t           j                            |g          }|                    |                     d          d           |
                    |                     d          d           dS )zC
        Test warnings for time column reference position.
        r   r   r   rt   r   r:   Tr   z.observatory position is not properly specifiedr4   r   Nr   )r   r+   rp   r   )r   r   r   r   r   r   rJ   rB   rC   r   rM   rR   )r   r&   r   r   rZ   s        r   (test_io_time_read_fits_location_warningsz5TestFitsTime.test_io_time_read_fits_location_warnings  s    K%)
 
 
 ,,aS11TYY{++t<<<\B
 
 
 	J TYY{33DIII		J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J
 1vv{{{{ KZ$diXXX,,aS11TYY{++t<<<;//EEEEEs   +B;;B?B?N)__name__
__module____qualname__r   r%   rB   markparametrizer
   r	   r[   ri   r~   r   r   r   r   r   r   r   r    r    r   r   r      s       < < <9 9 9 []UFO<<z3 z3 =<z3x [VedE]%;<<[/1OPPN N QP =<N< []UFO<<- - =<-^ []UFO<<?/ ?/ =<?/B []UFO<<P P =<PB []UFO<<3 3 =<3@ []UFO<<&5 &5 =<&5P []UFO<<3 3 =<30 []UFO<<(V (V =<(VT []UFO<<6< 6< =<6<p []UFO<<F F =<F F Fr    r   )numpyr   rB   astropy.coordinatesr   
astropy.ior   astropy.io.fits.fitstimer   r   r   astropy.tabler   r	   r
   astropy.timer   r   astropy.time.corer   astropy.time.formatsr   astropy.utils.exceptionsr   conftestr   r   r   r    r   <module>r      s:        - - - - - -               
 0 / / / / / / / / / ( ( ( ( ( ( ( ( 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 " " " " " "fF fF fF fF fF< fF fF fF fF fFr    