
    IR-e                        d dl Z d dlZd dlmZ d dlmZ d dlZd dlZd dlm	Z	m
Z
mZm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 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$ d dl%m&Z&  ee&j'                  Z(d Z) G d d          Z* G d d          Z+d Z,ej-        .                    d          d             Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d  Z8d! Z9d" Z:d# Z;d$ Z<d% Z=d& Z>d' Z?ej-        .                    d(          d)             Z@ej-        .                    d(          d*             ZAd+ ZBd, ZC	 	 	 	 	 	 	 	 djd2ZDd3 ZEd4 ZFd5 ZGd6 ZHej-        .                    d(          d7             ZId8 ZJd9 ZKd: ZLd; ZMd< ZNd= ZOd> ZPd? ZQd@ ZRdA ZSej-        T                    e&j'        d          dBk     dCD          dE             ZUdF ZVdG ZWdH ZXdI ZYej-        T                    e&j'        d          dBk     dCD          dJ             ZZdK Z[dL Z\dM Z]dN Z^dO Z_dP Z`dQ ZadR ZbdS ZcdT ZddU ZedV ZfdW ZgdX ZhdY ZidZ Zjd[ Zkej-        .                    d\          d]             Zld^ Zm G d_ d`          Znda Zodb Zpdc Zqdd Zrej-        T                    e( ede          k     dfD          dg             Zsej-        T                    e( ede          k     dfD          dh             Ztdi ZudS )k    N)nullcontext)datetime)assert_allcloseassert_array_almost_equalassert_array_almost_equal_nulpassert_array_equal)Version)units)wcs)SkyCoord)fits)Cutout2D)assert_quantity_allclose)get_pkg_data_contentsget_pkg_data_filenameget_pkg_data_filenames)AstropyDeprecationWarningAstropyUserWarningAstropyWarning)NumpyRNGContext)_wcsc                      t           t          d          k    r9t           t          d          k     r!t          j        t          j        d          } nt                      } | S )N7.17.3zF'datfix' made the change 'Set DATE-REF to '1858-11-17' from MJD-REF'\.match)_WCSLIB_VERr	   pytestwarnsr   FITSFixedWarningr   )ctxs    :lib/python3.11/site-packages/astropy/wcs/tests/test_wcs.pyctx_for_v71_dateref_warningsr#   )   sV    genn$$wu~~)E)El 
 
 
 mmJ    c                        e Zd Zd Zd Zd ZdS )TestMapsc                 L    t          t          dd                    | _        d S )Nz	data/maps*.hdrpatternlistr   
_file_listselfs    r"   setup_methodzTestMaps.setup_method8   s#    5k7SSSTTr$   c                 ~    d}t          | j                  |k    s"J dt          | j                   d|             d S )N   0test_spectra has wrong number data files: found , expected  lenr-   r/   n_data_filess     r"   test_consistencyzTestMaps.test_consistency<   sZ     4?##|333)s4??S?S ) )&) ) 43333r$   c                    | j         D ]}t          j                            |          }t	          t          j                            dd|          d          }t          j        |          }|                    ddggd          }t          |ddggd	           |
                    ddggd          }t          |ddggd
	           d S )Ndatamapsbinaryencodinga      g     q@g     P)decimalr   )r-   ospathbasenamer   joinr   WCSwcs_pix2worldr   wcs_world2pix)r/   filenameheaderwcsobjworldpixs         r"   	test_mapszTestMaps.test_mapsI   s     	B 	BH w''11H*VVX66  F WV__F((2r(Q77E%eufo->JJJJ&&'8!<<C%cRH:qAAAAA	B 	Br$   N)__name__
__module____qualname__r0   r9   rO    r$   r"   r&   r&   7   sI        U U U
 
 
B B B B Br$   r&   c                        e Zd Zd Zd Zd ZdS )TestSpectrac                 L    t          t          dd                    | _        d S )Nzdata/spectrar(   r)   r+   r.   s    r"   r0   zTestSpectra.setup_method[   s#    5ngVVVWWr$   c                 ~    d}t          | j                  |k    s"J dt          | j                   d|             d S )N   r3   r4   r5   r7   s     r"   r9   zTestSpectra.test_consistency^   sZ     4?##|333)s4??S?S ) )&) ) 43333r$   c                    | j         D ]}t          j                            |          }t	          t          j                            dd|          d          }t          t          d          k    r!t          j	        t          j        d          }nt                      }|5  t          j        |          }d d d            n# 1 swxY w Y   t          |          dk    sJ d S )	Nr;   spectrar=   r>   7.4zG'datfix' made the change 'Set MJD-OBS to 53925\.853472 from DATE-OBS'\.r   	   )r-   rC   rD   rE   r   rF   r   r	   r   r   r   r    r   find_all_wcsr6   )r/   rJ   rK   r!   all_wcss        r"   test_spectrazTestSpectra.test_spectrak   s'    	% 	%H w''11H*VY99H  F genn,,l((   "mm 3 3*6223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 w<<1$$$$$-	% 	%s   "CC	
C	N)rP   rQ   rR   r0   r9   r_   rS   r$   r"   rU   rU   Z   sD        X X X
 
 
% % % % %r$   rU   c                     t          dd          } t          j        t          j                  5  t          j        t          j                  5 }t          j        | d           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          d          t          cxk    rt          d          k     rCn n@t          |          d	k    sJ d
t          |                                j                  v sJ nt          |          dk    sJ t          |d         j                  }d|v rd|v rd|v sJ dt          |d         j                  v rdt          |d         j                  v sJ dS )z
    From github issue #36
    data/nonstandard_units.hdrr=   r>   dhs)translate_unitsNr[   7.6   z#'datfix' made the change 'Success'.   r   unitfixHzzM/Szplane anglerA   m/s)r   r   raisesr   InvalidTransformErrorr   r    rG   r	   r   r6   strpopmessage)rK   w
first_wmsgs      r"   
test_fixesrq      s    ##?(SSSF	s0	1	1 / /6<4 4 /	
..../ / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
 u~~5555wu~~555551vv{{{{4AEEGGO8L8LLLLLL1vv{{{{QqT\""J
""tz'9'9ez>Q>Q>Q>QC!----%3qt|;L;L2L2L2L2L2L2Ls5   B	A2&B	2A6	6B	9A6	:B		BBzignore:PV2_2c                     t          dd          } t          j        |           }t          j        t          j        |                    ddggd                              sJ t          j        t          j        |                    ddggd                              sJ t          j        t          j        |                    ddggd                              rJ d	S )
z 
    From github issue #107
    zdata/outside_sky.hdrr=   r>   g      Y@g     @@r   g      i@g     @@N)r   r   rG   npallisnanrH   anyrK   ro   s     r"   test_outside_skyrx      s    
 ##9HMMMFA6"(1??UEN+;Q??@@AAAAA6"(1??UEN+;Q??@@AAAAAvbhq0@/A1EEFFGGGGGGGr$   c                  2   t          d          } t          j        t          j                  5 }t          j        |           }ddd           n# 1 swxY w Y   t          d          t          cxk    rt          d          k     rn nt          |          dk    sJ nt          |          dk    sJ d}t          j
        |          t          j        d|f          z  j        }|                    |dd	
          }|                    |d         |d         dd	
           t          j        ddgddgg          }t          j        |j        j        |d          sJ t          j        ddgddgddgg          }t          j        ||dd          sJ dS )z!
    From github issue #1463
    zdata/sip2.fitsNr[   rd   rf   rA   re   r   T)ra_dec_order.r   .rA   g@'G^0?g$+.?gxƠ3.?g\a0:0yE>)atol<CLi@tG@gdLi@g*cչG@gW,Li@gB6G@g|=)r~   rtol)r   r   r   r   r    rG   r	   r   r6   rs   arangeonesTrH   arrayallclosepc)rJ   caught_warningswwnpixelsresultanswers          r"   test_pix2worldr      s    %%566H	c*	+	+  WX	               u~~5555wu~~55555?##q(((((?##q((((	AillRWaV__,/Ffad;;F VF^VF^QTJJJ X
J/*k1JKLLF;rvy&v666666X;';':&	
 F ;vvFAAAAAAAAs   AAAc                      t          d          } t          j        t          j                  5  t          j        |            d d d            d S # 1 swxY w Y   d S )Ndata/sip.fits)r   r   r   r   r    rG   )	fits_names    r"   test_load_fits_pathr      s    %o66I	c*	+	+  	                 s   AAAc                     t                      5  t          j        i           } ddd           n# 1 swxY w Y   |                     ddd          \  }}t	          |dd           t	          |dd           ddddddd	d
ddd
}t
          t          d          k    rd|d<   t
          t          d          k    r&t          j        t          j        j	        d          }nt                      }|5  t          j        |          } ddd           n# 1 swxY w Y   |                     ddd          \  }}t	          |dd           t	          |dd           dS )zB
    Test that WCS can be initialized with a dict-like object
    Ng     D@       @rA   
   GLON-CARGLAT-CARdegg      D@        皙皙?)
CTYPE1CTYPE2CUNIT1CUNIT2CRPIX1CRPIX2CRVAL1CRVAL2CDELT1CDELT2r   z
1858-11-17DATEREFr[   zA'datfix' made the change 'Set MJDREF to 0\.000000 from DATEREF'\.r   r   g      $g      4@)r#   r   rG   rI   r   r   r	   r   r   r    r   )ro   xpyphdrr!   s        r"   test_dict_initr      s    
&	'	'  GBKK               __T3**FB"2tR000"2sB///  C genn$$%Igenn$$lG$V
 
 

 mm	  GCLL               __T3**FB"2ub111"2tR00000s   044/DDDc                  L   t          j                    } t          d          5  t          j                            dd          }t          j        t                    5  | 	                    |d           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )
    Issue #444
    [d   rf   rA   )originN)
r   rG   r   rs   randomrandr   rj   	TypeErrorrH   )ro   r;   s     r"   test_extra_kwargr   	  s    			A		#	# , ,y~~c1%%]9%% 	, 	,OODO+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,, , , , , , , , , , , , , , , , , ,s5   :BB5BB	BB		BB Bc                     t          j        d          } t          d          5  t          j                            dd          }|                     |d          }|j        dk    sJ |                     |d         |d         |d	         d          }t          |          dk    sJ 	 d
d
d
           d
S # 1 swxY w Y   d
S )r   re   naxisr   r   rA   )r   re   r{   r|   ).rf   N)	r   rG   r   rs   r   r   rH   shaper6   )ro   r;   r   s      r"   test_3d_shapesr     s     	aA		#	#    y~~c1%%q))|x''''ftF|T&\1MM6{{a                                   s   BB66B:=B:c                  |   t          j        d          } t          j                            d          }t          j                            d          }|                     ||d          \  }}|j        dk    sJ |j        dk    sJ |                     ||d          \  }}|j        dk    sJ |j        dk    sJ d S Nrf   r   rf   re      rA   )r   rG   rs   r   rH   r   rI   )ro   xyxwywr   r   s          r"   test_preserve_shaper   !  s    aA
	##A
	##A__Q1%%FB8y    8y    __Q1%%FB8y    8y      r$   c                      t          j        d          } t          j                            d          }d}|                     ||d          \  }}|j        dk    sJ |j        dk    sJ d S r   )r   rG   rs   r   rI   r   )ro   r   r   r   r   s        r"   test_broadcastingr   2  ss    aA
	##A	A__Q1%%FB8y    8y      r$   c                     t          j        d          } t          j                            d          }t          j                            d          }d}t	          j        t          |          5  |                     ||d          \  }}d d d            n# 1 swxY w Y   t	          j        t          |          5  |                     ||d          \  }}d d d            n# 1 swxY w Y   t          j        d          } t          j                            d          }|                     |d          }|j	        dk    sJ t          j                            d	          }|                     |d          \  }|j	        d	k    sJ d S )
Nrf   r   r   )re   rf   r   z5Coordinate arrays are not broadcastable to each otherr   rA   )*   rA   )r   )
r   rG   rs   r   r   rj   
ValueErrorrH   rI   r   )ro   r   r   MESSAGEr   r   r   r   s           r"   test_shape_mismatchr   >  s   aA
	##A
	##AFG	z	1	1	1 * *Aq))B* * * * * * * * * * * * * * * 
z	1	1	1 * *Aq))B* * * * * * * * * * * * * * *
 	aA
	!!A	
A		B8w
	AOOAq!!ER8us$   1BBB>C%%C),C)c                     d} t          j        d          }t          j                            d          }t	          j        t          |           5  |                    |d           ddd           n# 1 swxY w Y   t          j                            d          }t	          j        t          |           5  |                    |d           ddd           dS # 1 swxY w Y   dS )	zIssue #1395zCWhen providing two arguments, the array must be of shape [(]N, 2[)]rf   r   )rf   re   r   rA   N)rf   rA   )r   rG   rs   r   r   rj   r   rH   )r   ro   xys      r"   test_invalid_shaper   X  sP   TGaA			&	!	!B	z	1	1	1  	A               
		&	!	!B	z	1	1	1  	A                 s$   A55A9<A9:CC"%C"c                     t          dd          } t          d          t          cxk    rt          d          k     rn nd}nd}t          d          D ]}t	          j        t          j                  5 }t          j        |            d d d            n# 1 swxY w Y   t          |          |k    sJ |d d         D ]}d	t          |j                  v sJ d S )
Ndata/defunct_keywords.hdrr=   r>   r[   rd      r   rf   PCi_ja)r   r	   r   ranger   r   r   r    rG   r6   rl   rn   )rK   n_warn_ro   items        r"   #test_warning_about_defunct_keywordsr   g  s5   "#>RRRFu~~5555wu~~55555 1XX 1 1\#.// 	1GFOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 1vvbqbE 	1 	1Ds4<0000000	11 1s   5BB	B	c                      t          dd          } t          j        t          j                  5  t          j        |            d d d            d S # 1 swxY w Y   d S )Nr   r=   r>   )r   r   r   r   r    rG   rK   s    r"   -test_warning_about_defunct_keywords_exceptionr   y  s    "#>RRRF	c*	+	+                   s   AAAc                  "   d} t           t          d          k    r| dz  } nt           t          d          k    r| dz  } | dz  } d                    |           }t          j                    }t
          j                            |                                	                                          }d|v r|d= d|v r|d= t
          j                            |	                                          }t          |          t          |          k    sJ d S )	N)zPWCSAXES =                    2 / Number of coordinate axes                      zPCRPIX1  =                  0.0 / Pixel coordinate of reference point            zPCRPIX2  =                  0.0 / Pixel coordinate of reference point            zPCDELT1  =                  1.0 / Coordinate increment at reference point        zPCDELT2  =                  1.0 / Coordinate increment at reference point        zPCRVAL1  =                  0.0 / Coordinate value at reference point            zPCRVAL2  =                  0.0 / Coordinate value at reference point            zPLATPOLE =                 90.0 / [deg] Native latitude of celestial pole        r   )zPMJDREF  =                  0.0 / [d] MJD of fiducial time                       r   )zPDATEREF = '1858-11-17'         / ISO-8601 fiducial time                         zPMJDREFI =                  0.0 / [d] MJD of fiducial time, integer part         zPMJDREFF =                  0.0 / [d] MJD of fiducial time, fractional part      )END COMMENT)r   r	   rF   r   rG   r   Header
fromstringto_header_stringstripdict)hdrstrheader_stringro   h0h1s        r"   test_to_header_stringr     s   	F genn$$ 
 	

 
	&	& 
 	
 hFGGFOOM		A			 2 2 4 4 : : < <	=	=BByM	RxxrF			 3 3 5 5	6	6B88tBxxr$   c                     t           t          d          k    rdnd} t           t          d          k     rd} nt           t          d          k     rd} nd} t          j                    }|                                }|                                }t          |t          j                  sJ t          |d         t          j	                  sJ ||d         j
        |  d          k    sJ d S )Nr         r   r\   r   )r   r	   r   rG   	to_headerto_fits
isinstancer   HDUList
PrimaryHDUrK   )nrecro   r   wfitss       r"   test_to_fitsr     s    ..22ADWU^^##	wu~~	%	%		AKKMMMIIKKEeT\*****eAh00000E!HOTEFF3333333r$   c                  p   t          d          } t          j        t          j                  5  t          j        |           }d d d            n# 1 swxY w Y   t          j        t          d          5 }|                                 d d d            n# 1 swxY w Y   t          |          dk    sJ d S )Nr   A_ORDERr   rA   )	r   r   r   r   r    rG   r   r   r6   )r   r   ro   s      r"   test_to_header_warningr     s   %o66I	c*	+	+  GI              	nI	6	6	6 !	              q66Q;;;;;;s#   AAA5BBBc                  \   t          j                    } |                                 }| j         j        |vsJ d| j         j                                        z   |vsJ d|vsJ d}|                     |          }||vsJ d|vsJ d| j         j                                        z   |vsJ d S )Nr   Pkey)r   rG   r   altr   )ro   rK   wkeys      r"   test_no_comments_in_headerr     s    		A[[]]F59F""""quy(((6666F""""D[[T[""FvF""""quy(((666666r$   c                     t          t          d                    5 } |                                 }ddd           n# 1 swxY w Y   t          j        t
          j                  5  t          j        t
          j                  5  t          j	        |d           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zD
    Causes a double free without a recent fix in wcslib_wrap.C
    zdata/too_many_pv.hdrNFfix)
openr   readr   rj   r   rk   r   r    r]   )fdrK   s     r"   test_find_all_wcs_crashr    sq    
#$:;;	<	<               
 
s0	1	1 , ,6<@T3U3U , ,U++++, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,sE   >AA'CB)C)B-	-C0B-	1CCCignorec                     t          j        t          d                    } t          d t	          |                                           D                       }t          t          d          k    rd}nnt          t          d          k    rd}nSt          t          d          k    rd}n8t          t          d	          k    rd
}nt          t          d          k    rd}nd}t          t          |                    5 }|	                                }d d d            n# 1 swxY w Y   t          d |D                       |k    sJ d S )Ndata/validate.fitsc                 6    h | ]}|                                 S rS   r   .0r   s     r"   	<setcomp>z test_validate.<locals>.<setcomp>       HHH!''))HHHr$   rd   zdata/validate.7.6.txtr[   zdata/validate.7.4.txtz6.0zdata/validate.6.txtz5.13zdata/validate.5.13.txtz5.0zdata/validate.5.0.txtzdata/validate.txtc                 6    h | ]}|                                 S rS   r  r  s     r"   r	  z test_validate.<locals>.<setcomp>  s     ,,,17799,,,r$   )
r   validater   sortedrepr
splitlinesr   r	   r   	readlines)resultsresults_txtrJ   r   liness        r"   test_validater    sj   l01EFFGGGHHT']]-E-E-G-GHHHIIKgenn$$*		&	&*		&	&(		'	'+		&	&*&	#H--	.	. "              ,,e,,,--<<<<<<s   ?D  D$'D$c                      t          j        t          d                    } t          d t	          |                                           D                       }|g dk    sJ d S )Nzdata/tab-time-last-axis.fitsc                 6    h | ]}|                                 S rS   r  r  s     r"   r	  z(test_validate_wcs_tab.<locals>.<setcomp>  r
  r$   )r   zHDU 0 (PRIMARY):zHDU 1 (WCS-TABLE):z
No issues.zWCS key ' ':)r   r  r   r  r  r  )r  r  s     r"   test_validate_wcs_tabr    sy    l01OPPQQGHHT']]-E-E-G-GHHHIIK         r$   c                      t          j        t                    5  t          j        t          d                    } d d d            n# 1 swxY w Y   dt          |           v sJ d S )Nzdata/2wcses.hdrzWCS key 'A':)r   r   r   r   r  r   rl   )r  s    r"   test_validate_with_2_wcsesr    s    	(	)	) I I,45FGGHHI I I I I I I I I I I I I I I S\\))))))s   "AAAc                  D   t          j        d          } ddg| j         _        ddg| j         _        ddg| j         _        t          j        ddgd	d
gg          | j         _        ddg| _        ddg| j         _	        t          j        g dg dg dg dg dg          }t          j        g dg dg dg dg dg          }t          j
        ||d d | j         j                  | _        | j                                          t          j        t           j                            |                     }t!           | j        g | j         j        dR  | j         j        dd|z             t!           | j        g | j         j        dR  | j         j        dd|z             d S )Nrf   r   gzGio@g
ףp=L@rA   i  gr%>g]/M?gZQf?g=zhqܾi  RA---TAN-SIPDEC--TAN-SIP)r   r   gc)Şl>gA=gNqL)r   g>gǢ%=g{p8b=r   )g2g=gaR"=r   r   )gW.2LgdV>OY!c=r   r   r   )gTSr   r   r   r   )r   r   gbYza>g@U]g=ri=)r   g	!g&Y=g$-r   )g
o+>guM/g<CHr   r   )g>䔍Y=g3--/=r   r   r   )g3;6dr   r   r   r   r   gư>r   r~   )r   rG   crvalcdeltcrpixrs   r   r   _naxisctypeSipsipsetsqrtutilsproj_plane_pixel_arear   rH   all_pix2world)twcsabpscales       r"   test_crpix_maps_to_crvalr.    s   7De_DHNVDHN3ZDHN(VV,vw.?@AADHK,DK$n5DHN
CCCDDDGGG<<<111	
	 	A 	CCCFFFHHH;;;111	
	 	A wq!T488DHHLLNNNWSY44T::;;F .DHN.A...F]	    .DHN.A...F]	     r$   -C6?a  F   Tc           
      	   | t          d          } d}t          j                            |           st	          d| dd          t          j        |           }t          j        ||         j	        |          }	|
                                 ~|	j        j        }
|
j        d         }t          d|
z                      t                              }t          d	|
z                      t                              }t!          j        d
 t!          j        t'          t(          ||           D                       d         }t+          d          5  t           j                            ||          }ddd           n# 1 swxY w Y   d|
dz  dz  z  }|
d|z  z
  |dz
  |z  z   }t!          j        ||d          }|	                    ||          }	 t5          j                    }|	                    ||||||          }t5          j                    }nF# t          j        j        $ r.}t5          j                    }d}|j        |j        j        d         }t?          d| d           t?          d|j                    t?          d|j         |j                  d           t?          dt!          j!        t           j"        #                    |j         |j                 d                                t?          dt!          j!        t           j"        #                    |j$        |j                 d                     d           nt?          d           d}|j%        `|j%        j        d         }t?          d| d           t?          d|j%                    t?          d|j         |j%                  d           nt?          d           t?          d|j         j        d         |z
  |z
   d           t?          d |j                     t?          d!|j$         d           t?          d"|j&        d          d#||z
   d           |d}~ww xY wt!          j'        t!          j(        t!          j)        ||z
  d          d                    }t!          j!        |          }t!          j*        |          }t?          d$|d%d&|d%d'||z
   d           |d(|z  k     sJ dS ))z6Test all_world2pix, iterative inverse of all_pix2worldNzdata/j94f05bgq_flt.fits)SCIrA   zInput file 'sz$' to 'test_all_world2pix' not found.r   g      ?g      ?c                 6    g | ]}|                                 S rS   )flattenr  is     r"   
<listcomp>z&test_all_world2pix.<locals>.<listcomp>\  s     KKKKKKr$   r   rf         ?r         ?rA   )axis)	toleranceadaptivemaxiterdetect_divergencez
There are z diverging solutions.z Indices of diverging solutions:
zDiverging solutions:

z(Mean radius of the diverging solutions: z*Mean accuracy of the diverging solutions: z!There are no diverging solutions.z slowly converging solutions.z(Indices of slowly converging solutions:
zSlowly converging solutions:
z*There are no slowly converging solutions.
z converged solutions.zBest solutions (all points):
z
Accuracy:
z;
Finished running 'test_all_world2pix' with errors.
ERROR: z
Run time: z5
Finished running 'test_all_world2pix'.
Mean error = ez  (Max error = z)
Run time: r   )+r   rC   rD   isfileOSErrorr   r   r   rG   rK   closer   r   r,   astypeintrs   dstackmeshgridmapr   r   r   r   appendr)  r   nowall_world2pixNoConvergence	divergentprintbest_solutionmeanlinalgnormaccuracy	slow_convargsr&  sumpoweramax)fnameextr=  r   random_nptsr>  r?  r@  hro   r   ncoordnaxesi_lnaxesi_uimg_pixrnd_pixmwidthtest_pix	all_worldruntime_beginall_pixruntime_endrB  ndivnslowerrorsmeanerrmaxerrs                               r"   test_all_world2pixro  :  s    }%&?@@7>>%   TRURRRRSSS	%A#q!!AGGIII	EKE[^F
 X%--c2233HX%--c2233H iKKbk3uh+I+IJKKK 	G
 
	#	# 6 6)..f556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 %#+/"FcFl"fqjG%;;G y'222H&11I2  /// " 
 
 lnn7  % % %lnn;";$Q'D:t:::;;;CakCCDDDK1?1;+GKKKLLLTGBINN1?1;+GaNPPQQT T   QGBINN1:ak+BNKKLLQ Q Q   
 5666;"K%a(ECuCCCDDDKakKKLLLS1?1;3OSSSTTTT?@@@W.q1D85@WWW	
 	
 	
 	@q@@AAA*AJ***+++MfQiM M-8=-HM M M	
 	
 	
 K%T WRVBHWx%7;;!DDDEEFgfooGWV__F		5?	5 	528?	5 	5 =0	5 	5 	5   C)O######s,   !E==FFAH Q*H)QQc                      t          dd          } t          j        t          j                  5  t          j        |           }ddd           n# 1 swxY w Y   |                    ddd           dS )z`
    Test parsing of WCS parameters with redundant SIP and SCAMP distortion
    parameters.
    r  r=   r>   Nr   )r   r   r   r   r    rG   r)  rw   s     r"   $test_scamp_sip_distortion_parametersrq    s    
 ##7(KKKF	c*	+	+  GFOO               OOAq!s   AAAc                      t          dd          } t          j        t          j                  5  t          j        | d           ddd           dS # 1 swxY w Y   dS )z!
    From github issue #1854
    ra   r=   r>   Fr   N)r   r   rj   r   rk   rG   r   s    r"   test_fixes2rs    s     ##?(SSSF	s0	1	1 # #E""""# # # # # # # # # # # # # # # # # #s   AAAc                      t          dd          } t          j        |           }|j        j        d         dk    sJ dS )z!
    From github issue #1918
    zdata/unit.hdrr=   r>   rf   ri   N)r   r   rG   cunitrw   s     r"   test_unit_normalizationrv    sB     #?XFFFFA5;q>U""""""r$   c                    dddddddddd	d
dd}t          j        |          }| dz  }|                    |           t          |          5 }|                                }ddd           n# 1 swxY w Y   t          |          dk    sJ |d         dk    sJ d|d         v sJ |                    |dd           t          |          5 }|                                }ddd           n# 1 swxY w Y   t          |          dk    sJ |d         dk    sJ d|d         v sJ t          j        t                    5  |                    |d           ddd           n# 1 swxY w Y   |d= |d= t          j        |          }t          j	        t                    5  |                    |           ddd           dS # 1 swxY w Y   dS )z!
    From github issue #1912
    zRA---ZPNr   ggy\tgCs@zDEC--ZPNgW[ʧ@g(D!TE@r:  g     k@      )r   CRUNIT1r   r   r   CRUNIT2r   r   PV2_1PV2_3NAXIS1NAXIS2ztest.txtNr   rf   zICRS
zcolor=greenre   FK5red)coordsyscolorzFK5
z	color=redFOO)r  r~  r  )r   rG   footprint_to_filer   r  r6   r   rj   r   r   r   )tmp_pathr   ro   testfilefr  s         r"   test_footprint_to_filer    s    ## C 	A*$H!!!	h 1               u::????8xE!H$$$$5>>>	h 1               u::????8w%(""""	z	"	" 6 6	Hu5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 	HHA	(	)	) & &	H%%%& & & & & & & & & & & & & & & & & &sH   A..A25A2C00C47C4E''E+.E+%GGGc                      t          j                    } d| d<   d| d<   t          j        dgg|           }t          j        |g          }t	          j        |           dS )z!
    From github issue #2053
    ICRSRADESYSAr:  r|  r   r   N)r   r   r   r   r   r  )r^  hduhdulists      r"   test_validate_faulty_wcsr    s`    
 	AAjMAgJ
/A3%
*
*
*ClC5!!GLr$   c                     t          dd          } t          j                            |           }|d= d|d<   d|d<   d|d	<   d|d
<   t	          j        t          j                  5  t	          j        t          j	                  5  t          j
        |d          }|                    ddggd           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nzdata/invalid_header.hdrr=   r>   zPV?_*n   PV1_1PV1_2ir|  PV2_2F)_do_setg     @g     @r   )r   r   r   r   r   rj   r   rk   r   r    rG   r)  )rK   r   ro   s      r"   test_error_messager    se   "#<xPPPF +
 
 
(
(CGCLCLCLCL	s0	1	1 1 1\#.// 	1 	1U+++AOOeU^,a000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s6   &C0C5CC	CC		CC Cc                  h   t          dd          } t          j        |           }|                    ddd          \  }}t	          j        |          sJ t	          j        |          sJ |                    ddd          \  }}t	          j        |          rJ t	          j        |          rJ d S )Nzdata/zpn-hole.hdrr=   r>   r  r   )r   r   rG   rH   rs   ru   )rK   ro   radecs       r"   test_out_of_boundsr  !  s    "#6JJJFAooc3**GB8B<<8C==ooaA&&GBx||x}}r$   c                  J   t          d          } t          j        t          j                  5  t          j        |           }d}t          j        ddgddgddgd	d
gg          }|                    |          }t          ||           d d d            d S # 1 swxY w Y   d S )Nr     i  gLi@g ,kG@gOh Wi@gү yG@g>H^i@g9֤_KG@gWi@g)$ӀG@)axes
r   r   r   r   r    rG   rs   r   calc_footprintr   r   ro   r  ref	footprints        r"   test_calc_footprint_1r  1  s     11D	c*	+	+ ( (GDMMh{+{+{+{+	
 
 $$$$//		3'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   ABBBc                  L   t          d          } t          j        t          j                  5  t          j        |           }d}t          j        ddgddgddgd	d
gg          }|                    |d          }t          ||           ddd           dS # 1 swxY w Y   dS )z'Test calc_footprint without distortion.r   r  r   r   gԧWi@gLm@uG@gci@g9}BaG@gKYXi@gȅڡ'G@F)r  	undistortNr  r  s        r"   test_calc_footprint_2r  C  s     11D	c*	+	+ ( (GDMMh{+k*{+{+	
 
 $$$%$@@		3'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   ABB Bc                     t          j                    } ddg| j         _        ddg| j         _        ddg| j         _        d}t          j        ddgdd	gd
d	gd
dgg          }|                     |dd          }t          ||           dS )z-Test calc_footprint with corner of the pixel.r   r   g      ?g      @r   r   )rf   r   g      r;  gfffff~v@F)r  r  centerN)	r   rG   r"  r   r  rs   r   r  r   )ro   r  r  r  s       r"   test_calc_footprint_3r  V  s    		Az*AEK*AEK+AEKD
(S$K#seS\E4=I
J
JC  deE JJIIs#####r$   c                  @   t          dd          } t          j        |           }|                    ddd          \  }}t	          d|d           t	          d|d           |                    ||d          \  }}t	          d|d           t	          d|d           d S )Ndata/irac_sip.hdrr=   r>      r   H   MbP?)r   r   rG   sip_pix2focr   sip_foc2pix)rK   ro   x0y0x1y1s         r"   test_sipr  c  s    "#6JJJFA]]3Q''FBBD!!!BD!!!]]2r1%%FBCT"""CT"""""r$   c                     t          dd          } t          j                            |           } d| d<   |                     dd|                     d          	           t          j        | d
          }|j        d
k    sJ d S )Nr  r=   r>   re   NAXISNAXIS3@   r  )afterrf   r   )	r   r   r   r   r%  indexr   rG   r   rw   s     r"   test_sub_3d_with_sipr  s  s~    "#6JJJF[##F++FF7O
JJx6<<#9#9J:::a   A7a<<<<<<r$   c                    t          dd          }t          j        t          j                  5  t          j        |          }|                                 |                                 }d|j        v sJ 	 ddd           n# 1 swxY w Y   t          dd          }t          j        |          }|                                 |                                 }d|j        v sJ dS )z%
    Just make sure that it runs
    zdata/spectra/orion-freq-1.hdrr=   r>   zWCS KeywordsNzdata/3d_cd.hdr)	r   r   r   r   r    rG   printwcs
readouterrout)capsysr^  ro   captureds       r"   test_printwcsr  }  s    	=QQQA	c*	+	+ . .GAJJ	

$$&&-----	. . . . . . . . . . . . . . .
 	.BBBA

AJJLLL  ""HX\))))))s   ABB	B	c                      d} t          j        |           }t          j                            |          } t          j        |           }|                    ddd          \  }}t          j	        |          rt          j	        |          sJ d S )Na  
SIMPLE  =                    T / conforms to FITS standard
BITPIX  =                    8 / array data type
WCSAXES =                    2 / no comment
CTYPE1  = 'RA---TAN' / TAN (gnomic) projection
CTYPE2  = 'DEC--TAN' / TAN (gnomic) projection
EQUINOX =               2000.0 / Equatorial coordinates definition (yr)
LONPOLE =                180.0 / no comment
LATPOLE =                  0.0 / no comment
CRVAL1  =        16.0531567459 / RA  of reference point
CRVAL2  =        23.1148929108 / DEC of reference point
CRPIX1  =                 2129 / X reference pixel
CRPIX2  =                 1417 / Y reference pixel
CUNIT1  = 'deg     ' / X pixel scale units
CUNIT2  = 'deg     ' / Y pixel scale units
CD1_1   =    -0.00912247310646 / Transformation matrix
CD1_2   =    -0.00250608809647 / no comment
CD2_1   =     0.00250608809647 / no comment
CD2_2   =    -0.00912247310646 / no comment
IMAGEW  =                 4256 / Image width,  in pixels.
IMAGEH  =                 2832 / Image height, in pixels.
       ir   )
ioStringIOr   r   fromtextfiler   rG   rI   rs   ru   )rK   r  ro   r   r   s        r"   test_invalid_sphericalr    s|    F. 	FA[%%a((FA??3Q''DAq8A;;&28A;;&&&&&r$   c                     d} t          j        d          }t          j        t          |                     d                    5  t          |           ddd           n# 1 swxY w Y    G d dt           j                  } |d          }t          j        t          |                     d                    5  t          |           ddd           dS # 1 swxY w Y   dS )	zRegression test for #3066z'{}' object is not iterablerf   r   rG   r   Nc                       e Zd ZdS )!test_no_iteration.<locals>.NewWCSN)rP   rQ   rR   rS   r$   r"   NewWCSr    s        r$   r  )r   rG   r   rj   r   formatiter)r   ro   r  s      r"   test_no_iterationr    sg   +GaA	yu(=(=	>	>	>  Q                      	QA	yx(@(@	A	A	A  Q                 s$   A""A&)A&?CC #C 5z'TPV only works with wcslib 5.x or later)reasonc                     t          t          j                            dd          d          } t          t          j                            dd          d          }t	          j        t          j                  5  t          j        |           }t          j        |          }t          |
                    |j        j        gd          |
                    |j        j        gd                     t          j        |                                          }t          j        |                                          }t          |
                    |j        j        gd          |
                    |j        j        gd                     t          |
                    |j        j        gd          |
                    |j        j        gd                     t          |
                    |j        j        gd          |
                    |j        j        gd                     d d d            d S # 1 swxY w Y   d S )Nr;   siponly.hdrr=   r>   tpvonly.hdrrA   )r   rC   rD   rF   r   r   r   r    rG   r   r)  r   r   )
sip_header
tpv_headerw_sipw_tpvw_sip2w_tpv2s         r"   test_sip_tpv_agreementr    s?    '
V]++h  J '
V]++h  J 
c*	+	+ 
 

##
##! 1155 1155	
 	
 	

 **++**++! 1155  %)/!2A66	
 	
 	
 	" 1155  %)/!2A66	
 	
 	
 	"  %)/!2A66  %)/!2A66	
 	
 	
)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   =F-H77H;>H;c                     t           j                            t          t          j                            dd          d                    } t           j                            t          t          j                            dd          d                    }|                     |           d| d<   d| d	<   t          j	        t          j        d
          5  t          j        |           }d d d            n# 1 swxY w Y   |j        J d S )Nr;   r  r=   r>   r  r  r   r  r   zURemoved redundant SCAMP distortion parameters because SIP parameters are also presentr   r   r   r   r   rC   rD   rF   updater   r   r   r    rG   r$  r  r  r  s      r"   test_tpv_ctype_sipr    s:   ''bgll6=AAHUUU J ''bgll6=AAHUUU J j!!!)Jx)Jx	2
 
 
 $ $
 
##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 9        C99C= C=c                     t           j                            t          t          j                            dd          d                    } t           j                            t          t          j                            dd          d                    }|                     |           d| d<   d| d	<   t          j	        t          j        d
          5  t          j        |           }d d d            n# 1 swxY w Y   |j        J d S )Nr;   r  r=   r>   r  zRA---TPVr   zDEC--TPVr   z^Removed redundant SIP distortion parameters because CTYPE explicitly specifies TPV distortionsr   r  r  s      r"   test_tpv_ctype_tpvr    s:   ''bgll6=AAHUUU J ''bgll6=AAHUUU J j!!!%Jx%Jx	=
 
 
 $ $
 
##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 9r  c                     t           j                            t          t          j                            dd          d                    } t           j                            t          t          j                            dd          d                    }|                     |           d| d<   d| d	<   t          j	        t          j        d
          5  t          j        |           }d d d            n# 1 swxY w Y   |j        J d S )Nr;   r  r=   r>   r  RA---TANr   DEC--TANr   zZRemoved redundant SIP distortion parameters because SCAMP' PV distortions are also presentr   r  r  s      r"   test_tpv_ctype_tanr    s:   ''bgll6=AAHUUU J ''bgll6=AAHUUU J j!!!%Jx%Jx	9
 
 
 $ $
 
##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 9r  c                     i ddddddddd	dd
ddddddddddddddddddddddddddd} t          j        |           }|j        J |j                                         g dk    sJ t	          j        |                    | d
         | d         d           | d         | d         g          sJ d S )!NSIMPLETBITPIXir  rf   r~  ry  r  r   g      @r   r   g{Gz?r   r         ^@r         =@r   zRA---CAR-SIPr   zDEC--CAR-SIPr  r  PV1_0r:  r   gMb@?)A_2_0B_ORDERB_2_0))rA   rA   r  )rA   rf   r  )rA   r   r:  rA   )r   rG   r$  get_pvrs   r   r)  )header_dictro   s     r"   test_car_sip_with_pvr  $  s   $# 	 	$	
 	$ 	% 	% 	$ 	$ 	% 	$ 	. 	. 	 	  	!" 	1#$ )  K. 	A55<<>>GGGGGGG;	H-{8/DaHH	X	H 56      r$   c                     t          t          j                            dd          d          } t	          j        t          j                  5  t          j        |           }|	                    g dg dd          \  }}|d         |d         k    r|d         |d	         k    sJ |d         |d         k    r|d         |d	         k    sJ 	 d d d            d S # 1 swxY w Y   d S )
Nr;   r  r=   r>   r   r   r  r   ir  r   rA   rf   )
r   rC   rD   rF   r   r   r   r    rG   rH   )r  r  r  r  s       r"   test_tpv_copyr  I  s+    '
V]++h  J 
c*	+	+ 5 5
##%%mmm^^^QGGC!u1~~"Q%2a5....1vQCFc!f$4$4$4$4$45 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s   A?CC"Cc                  4   t          d          } t          j        |           5 }t          j        |d         j        |          }t          |                                ddgt          j	        z             t          |
                                dt          j	        t          j	        z  z             |                    g dg dd           |                    g dg dd           |j        |_        |j        |_        |j        |_        |j        |_        |j        |_        |j        j        |j        _        |j        j        |j        _        |j        j        |j        _        |j        j        |j        _        |j        j        d	k    sJ |j        j        d	k    sJ |j        j        dk    sJ |j        j        dk    sJ t5          |j        j        d
dg           t          j        |d         j        |           d d d            d S # 1 swxY w Y   d S )Ndata/dist_lookup.fits.gzrA   g|g
>go:O>g>=r  r  r   r   g      @g      @)r   r   r   r   rG   rK   r   proj_plane_pixel_scalesur   r(  
p4_pix2focdet2imcpdis1cpdis2det2im1det2im2r$  r  r   r  r;   a_orderb_orderap_orderbp_orderr   )rD   r  ro   s      r"   test_hst_wcsr  [  s"    !;<<D	4 $,G GGAJ%w// 	!%%''..)IAE)Q	
 	
 	
 	!##%%~'G	
 	
 	
 	
]]]NNNA666	22288I	I	u}!!!!u}!!!!u~""""u~""""15;(8999
!7+++I$, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $,s   GHHHc                     t          d          } t          j        |           }t          j        |d         j        |          }|                                d         j        }|                                 t          |d         j	                  t          |d         j	                  z   }d |D             }g d}t          |          t          |          k    sJ |D ]\  }}}	||         ||	fk    sJ d S )Nr  rA   r   zCPDIS*zDP*c                      i | ]\  }}}|||fS rS   rS   r  kvcs       r"   
<dictcomp>z'test_cpdis_comments.<locals>.<dictcomp>  $    111WQ1q1a&111r$   )
)CPDIS1LOOKUPPrior distortion function type)z
DP1.EXTVERr:  $Version number of WCSDVARR extension)z	DP1.NAXESr   1Number of independent variables in CPDIS function)z
DP1.AXIS.1r:  3Axis number of the 1st variable in a CPDIS function)z
DP1.AXIS.2r   3Axis number of the 2nd variable in a CPDIS function)CPDIS2r  r  )z
DP2.EXTVERr   r  )z	DP2.NAXESr   r  )z
DP2.AXIS.1r:  r  )z
DP2.AXIS.2r   r  )r   r   r   r   rG   rK   r   rE  r,   cardsr6   )
rD   r  ro   r   wcscardswcsdictrefcardsr  r  r  s
             r"   test_cpdis_commentsr    s     !;<<D	$A!QA
))++a.
CGGIIICM'((4E
0@+A+AAH11111G  H w<<3x==(((( $ $1aqzaV#####$ $r$   c                  $   t          d          } t          j        |           }t          j        t
          j                  5  t          j        |d         j        |          }d d d            n# 1 swxY w Y   |	                                 t          |                                d         j        d         j                  }d |D             }g d}t          |          t          |          k    sJ |D ]\  }}}||         ||fk    sJ d S )Nzdata/ie6d07ujq_wcs.fitsr   zD2IM*c                      i | ]\  }}}|||fS rS   rS   r  s       r"   r  z&test_d2im_comments.<locals>.<dictcomp>  r  r$   )
)D2IMDIS1r  !Detector to image correction type)zD2IM1.EXTVERr:  r  )zD2IM1.NAXESr   0Number of independent variables in D2IM function)zD2IM1.AXIS.1r:  2Axis number of the 1st variable in a D2IM function)zD2IM1.AXIS.2r   2Axis number of the 2nd variable in a D2IM function)D2IMDIS2r  r!  )zD2IM2.EXTVERr   r  )zD2IM2.NAXESr   r"  )zD2IM2.AXIS.1r:  r#  )zD2IM2.AXIS.2r   r$  )r   r   r   r   r   r   r    rG   rK   rE  r,   r   r  r6   )	rD   r  ro   r  r  r  r  r  r  s	            r"   test_d2im_commentsr&    sK    !:;;D	$A	c*	+	+ $ $GAaDK##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $GGIIIAIIKKN)'2899H11111G  H  w<<3x==(((( $ $1aqzaV#####$ $s   !A//A36A3c                  L    t          d          } t          j        |            d S )Ndata/sip-broken.hdr)r   r   rG   )r   s    r"   test_sip_brokenr)    s#       5
6
6CGCLLLLLr$   c                     t          j        d          } g d| j         _        g d| j         _        g d| j         _        | j                                          |                                 }t          d          D ]J}|d|dz             | j         j        |         k    sJ |d|dz             | j         j        |         k    sJ Kd	S )
L
    Regression test for https://github.com/astropy/astropy/issues/4612
    re   r   2   r-    XdHBr  r  g    חAr  r  FREQCRVALrA   CDELTN)r   rG   r  r  r"  r%  r   r   ro   rK   iis      r"   test_no_truncate_crvalr6    s     	aA)))AEK###AEK222AEKEIIKKK[[]]FAhh ; ;&b1f&&'15;r?::::&b1f&&'15;r?:::::; ;r$   c                     t          j        d          } g d| j         _        g d| j         _        g d| j         _        g d| j         _        g d| j         _        d| j         _        | j                                          | 	                                }t          d          D ]J}|d	|d
z             | j         j        |         k    sJ |d|d
z             | j         j        |         k    sJ KdS )r+  re   r   r,  )h㈵>r8  g     j@)zRA---SINzDEC--SINr1  )r   r   rh   )rA   rA   rA   g   R=KBr2  rA   r3  N)r   rG   r  r  r"  ru  r   restfrqr%  r   r   r4  s      r"   test_no_truncate_crval_try2r:    s     	aA)))AEK###AEK222AEK&&&AEK))AEKAEMEIIKKK[[]]FAhh ; ;&b1f&&'15;r?::::&b1f&&'15;r?:::::; ;r$   c                     t          j        d          } ddg| j         _        ddg| j         _        ddg| j         _        | j                                          |                                 }|d         | j         j        d         k    sJ |d	         | j         j        d
         k    sJ |                     t           j                  }|d         | j         j        d         k    sJ |d	         | j         j        d
         k    sJ dS )zL
    Regression test for https://github.com/astropy/astropy/issues/5162
    rf   r   g{nI@r  r  r  r   r   r   rA   relaxN)r   rG   r  r  r"  r%  r   
WCSHDO_P17)ro   rK   s     r"   test_no_truncate_crval_p17r?    s     	aA&(;<AEK,AEKz*AEKEIIKKK[[]]F(qu{1~----(qu{1~----[[s~[..F(qu{1~----(qu{1~------r$   c                  @   t          j        d          } g d| j         _        g d| j         _        g d| j         _        | j                                          t          j        |                                           }| j                             |j                    dS )z
    Regression test for https://github.com/astropy/astropy/issues/4612

    This one uses WCS.wcs.compare and some slightly different values
    re   r   )giJn@r-  r.  r/  r0  N)r   rG   r  r  r"  r%  r   compare)ro   w2s     r"   test_no_truncate_using_comparerC     s     	aA888AEK###AEK222AEKEIIKKK			BEMM"&r$   c                  T   t          d          } t          j        |           5 }t          j        t
          j                  5  t          j        |d                   }t          j        |d         j                  }|j        	                    |j                  sJ t          j        |d                   }t          j        |d         j                  }|j        	                    |j                  sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zj
    Passing ImageHDU or PrimaryHDU and comparing it with
    wcs initialized from header. For #4493.
    r  r   rA   N)
r   r   r   r   r   r   r    rG   rK   rA  )rD   r  wcs_hdu
wcs_headers       r"   test_passing_ImageHDUrG    sz   
 !!566D	4 7G\#.// 	7 	7ggaj))G!233J;&&z~66666ggaj))G!233J;&&z~666666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	77 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s6   DB5D9DD			DD		DD!$D!c                  `   t          d          } t                      }|5  t          j        |           }ddd           n# 1 swxY w Y   t	          j        t                    5  |                    d          }ddd           n# 1 swxY w Y   |5  t          j        |          }ddd           n# 1 swxY w Y   t          d |j        j	        D                       sJ |                    d          }d|vsJ |5  t          j        |          }ddd           n# 1 swxY w Y   t          d |j        j	        D                       sJ t	          j        t                    5  |                    d	          }ddd           n# 1 swxY w Y   d|vsJ |5  t          j        |d	          }ddd           n# 1 swxY w Y   t          d
 |j        j	        D                       sJ t	          j        t                    5  |                    d	          }ddd           n# 1 swxY w Y   |5  t          j        |          }ddd           n# 1 swxY w Y   t          d |j        j	        D                       sJ |                    d          }|5  t          j        |          }ddd           n# 1 swxY w Y   t          d |j        j	        D                       sJ d|v sJ |j
        J |5  t          j        |           }ddd           n# 1 swxY w Y   ddg|j        _	        |                    d          }|5  t          j        |          }ddd           n# 1 swxY w Y   t          d |j        j	        D                       sJ dS )z
    Test for #4814
    r(  Nr<  c              3   B   K   | ]}|                     d            V  dS z-SIPNendswithr  ctyps     r"   	<genexpr>z(test_inconsistent_sip.<locals>.<genexpr>,  1      DDT4==(((DDDDDDr$   FA_0_2c              3   B   K   | ]}|                     d            V  dS rJ  rK  rM  s     r"   rO  z(test_inconsistent_sip.<locals>.<genexpr>2  rP  r$   Cr   c              3   B   K   | ]}|                     d            V  dS rJ  rK  rM  s     r"   rO  z(test_inconsistent_sip.<locals>.<genexpr>9  rP  r$    c              3   B   K   | ]}|                     d            V  dS rJ  rK  rM  s     r"   rO  z(test_inconsistent_sip.<locals>.<genexpr>?  rP  r$   Tc              3   @   K   | ]}|                     d           V  dS rJ  rK  rM  s     r"   rO  z(test_inconsistent_sip.<locals>.<genexpr>E  .      @@t}}V$$@@@@@@r$   r  r  c              3   @   K   | ]}|                     d           V  dS rJ  rK  rM  s     r"   rO  z(test_inconsistent_sip.<locals>.<genexpr>S  rX  r$   )r   r#   r   rG   r   r   r   r   rt   r"  r$  )r   r!   ro   newhdrwnews        r"   test_inconsistent_sipr\    sL      5
6
6C
&
(
(C	  GCLL              	n	%	% ) )4(() ) ) ) ) ) ) ) ) ) ) ) ) ) ) 
  wv              DDTX^DDDDDDDD[[u[%%F&    	  wv              DDTX^DDDDDDDD	n	%	% & &%%& & & & & & & & & & & & & & &&    	 ( (wv3'''( ( ( ( ( ( ( ( ( ( ( ( ( ( (DDTX^DDDDDDDD	n	%	% & &%%& & & & & & & & & & & & & & & 
  wv              DDTX^DDDDDDDD [[t[$$F	  wv              @@@@@@@@@@f8
 
  GCLL              z*AEK[[t[$$F	  wv              @@@@@@@@@@@@s   AAA%BBBB66B:=B:D%%D),D).FFF$GGGH33H7:H7 I!!I%(I%)K

KKL,,L03L0M>>NNc                  J   t          j        d          } ddg| j         _        ddg| j         _        ddg| j         _        ddg| j         _        | j                             d	d	           |                     d
dd          \  }}t          |d           t          |d           dS )zTest for #4957rf   r   zRA---CARzDEC--CARr   iZ   rA   Fi,  r   iLiN)	r   rG   r"  r  r  r   bounds_checkrH   r   )ro   r  r  s      r"   test_bounds_checkr`  V  s    aAz*AEKr(AEK)AEKa&AEKEue$$$ooc1a((GBBCr$   c                  \   t          j        d          } ddg| j         _        ddg| j         _        ddg| j         _        ddg| _        | j        dk    sJ | j        dk    sJ d	| _        | j        d
dgk    sJ d| _        | j        ddgk    sJ | j        dk    sJ d | _        | j        J d S )Nrf   r   rA   r   r    )r  rb  )rb  r  )c   ;   rc  rd  )-      rf  re  )rf  re  )	r   rG   r  r  r   r!  pixel_shapearray_shapepixel_boundsro   s    r"   
test_naxisrk  c  s    aAa&AEK*AEKa&AEKc{AH=K''''=K''''AM8BxAM8Bx=H$$$$AM>!!!!!r$   c                     t          j        t          d                    5 } t          j        t
          j                  5  t          j        | d         j                  }ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   |	                    dd          }|	                    d          }d	|d
<   d|d<   |
                    |           t                      5  t          j        |d          }ddd           n# 1 swxY w Y   |j        j        t          j        d	dg          k                                    sJ dS )z
    Test that when creating a WCS object using a key, CTYPE with
    that key is looked at and not the primary CTYPE.
    fix for #5443.
    r   r   NTA)r=  r   Fr<  zRA---SIN-SIPCTYPE1AzDEC--SIN-SIPCTYPE2Ar   )r   r   r   r   r   r   r    rG   rK   r   r  r#   r"  rs   r   rt   )r  ro   r   h2s       r"   test_sip_with_altkeyrq  w  s    
(99	:	: %a\#.// 	% 	%!$$A	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%% % % % % % % % % % % % % % % 
4S	)	)B	
5	!	!B"ByM"ByMIIbMMM	%	'	' ! !GBC   ! ! ! ! ! ! ! ! ! ! ! ! ! ! !EK28^^$DEEEJJLLLLLLLsG   B A-!B-A1	1B4A1	5BBB)DDDc                     t          d          } t          j        t                    5  t	          j        |           }ddd           n# 1 swxY w Y   |                                }t          |t          j	                  sJ t          |d         t          j
                  sJ t          |d         t          j                  sJ dS )z5
    Test to_fits() with LookupTable distortion.
    zdata/dist.fitsNr   rA   )r   r   r   r   r   rG   r   r   r   r   r   ImageHDU)r   ro   r   s      r"   test_to_fits_1rt    s     &&677I	/	0	0  GI              IIKKEeT\*****eAh00000eAh.......s   A

AAc                  <   t          d          } t          j                            |           }|d= |d= t	          j        |d          }t          |j        t          j                  sJ |j        j	        d         dk    sJ |j        j	        d         d	k    sJ d
S )z*
    Test sip reading with extra key.
    r(  r   r   rm  )rK   r   r   rx  rA   i  N)
r   r   r   fromfiler   rG   r   r$  r#  r   )hdr_namerK   ro   s      r"   test_keyedsiprx    s     %%:;;H[!!(++Fxxv3'''AaeSW%%%%%5;q>T!!!!5;q>T!!!!!!r$   c                  $   t          j        t          d                    5 } t          j        t
          j                  5  t          j        | d         j                  }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j
        d          }t          ||                    |d                     t          ||                    |d                     g dgf}|                    g dgd          }t          |d         |d                    t          |d         |d                    |                    g dgd          }t          |d         |d                    t          |d         |d                    d S )Nr   r   r   rf   rA   )r   r   r   r   r   r   r    rG   rK   rs   zerosr   r)  rM  )r  ro   inpr   s       r"   test_zero_size_inputr}    s   	(99	:	: %a\#.// 	% 	%!$$A	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%% % % % % % % % % % % % % % % (6

CsAOOC33444sAOOC33444
qc'C__R!a((Fs1vvay)))s1vvay)))__R!a((Fs1vvay)))s1vvay)))))s5   B A-!B-A1	1B4A1	5BBBc                  d   t          j        d          } |                     dd          }t          |t	          j        d          g           |d         j        dk    sJ |                     dgd          }t          |t	          j        dg          g           |d         j        dk    sJ dS )	z
    Issue #7845
    rA   r   rf   r   r   rS   )rA   N)r   rG   r)  r   rs   r   r   )rL   r   s     r"   test_scalar_inputsr    s     W1F!!!Q''Fv///!9?b    !!1#q))Fv#0111!9?d""""""r$   z'ignore:.*invalid value encountered in.*c                     d} t           j                            |                                 d          } t	          j        |           }|                    t          ddd                    }|sJ |                    t          ddd                    }|rJ |                    t          ddd                    }|rJ d	S )
z/
    Test WCS.footprint_contains(skycoord)
    ah  
WCSAXES =                    2 / Number of coordinate axes
CRPIX1  =               1045.0 / Pixel coordinate of reference point
CRPIX2  =               1001.0 / Pixel coordinate of reference point
PC1_1   =    -0.00556448550786 / Coordinate transformation matrix element
PC1_2   =   -0.001042120133257 / Coordinate transformation matrix element
PC2_1   =    0.001181477028705 / Coordinate transformation matrix element
PC2_2   =   -0.005590809742987 / Coordinate transformation matrix element
CDELT1  =                  1.0 / [deg] Coordinate increment at reference point
CDELT2  =                  1.0 / [deg] Coordinate increment at reference point
CUNIT1  = 'deg'                / Units of coordinate increment and value
CUNIT2  = 'deg'                / Units of coordinate increment and value
CTYPE1  = 'RA---TAN'           / TAN (gnomonic) projection + SIP distortions
CTYPE2  = 'DEC--TAN'           / TAN (gnomonic) projection + SIP distortions
CRVAL1  =      250.34971683647 / [deg] Coordinate value at reference point
CRVAL2  =      2.2808772582495 / [deg] Coordinate value at reference point
LONPOLE =                180.0 / [deg] Native longitude of celestial pole
LATPOLE =      2.2808772582495 / [deg] Native latitude of celestial pole
RADESYS = 'ICRS'               / Equatorial coordinate system
MJD-OBS =      58612.339199259 / [d] MJD of observation matching DATE-OBS
DATE-OBS= '2019-05-09T08:08:26.816Z' / ISO-8601 observation date matching MJD-OB
NAXIS   =                    2 / NAXIS
NAXIS1  =                 2136 / length of first array dimension
NAXIS2  =                 2078 / length of second array dimension
    rA     rf   r   )unit      N)r   r   r   r   r   rG   footprint_containsr   )rK   test_wcshasCoords      r"   test_footprint_containsr    s    F4 [##FLLNND99FwvH**8C+G+G+GHHHOOO**8C+G+G+GHHH**8B+F+F+FGGHr$   c                     t          j        d          } t          j        d          }t          j        d          }t          j        d          }ddg| j         _        ddg|j         _        ddg|j         _        ddg|j         _        | j         j        | j         j        k    sJ | j         j        | j         j        k    rJ | j         j        |j         j        k    sJ | j         j        |j         j        k    rJ | j         j        |j         j        k    rJ | j         j        |j         j        k    sJ | j         j        |j         j        k    rJ | j         j        |j         j        k    sJ | j         j        g dk    rJ | j         j        g dk    sJ | j         j        g dk    rJ | j         j        g dk    sJ t          j        t
                    5  | j         j        |j         j        k      d d d            d S # 1 swxY w Y   d S )Nrf   r   r   ri   zkm/hrA   rf   re   )r+  r,  r  )r   rG   ru  r   rj   r   )w1rB  w3w4s       r"   
test_cunitr    s6   	q			B	q			B	q			B	q			B5>BFLF#BFL5>BFL5>BFL 6<26<''''v|rv|++++6<26<''''v|rv|++++ v|rv|++++6<26<''''v|rv|++++6<26<''''v|yyy((((6<999$$$$v|....6<???****	y	!	! $ $
rv|##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   G>>HHc                        e Zd Zd Zd Zd ZdS )TestWcsWithTimec                 j   t           t          d          k    rt          d          }nt          d          }t          j                            |          | _        t          j        t          j
                  5  t          j        | j        d          | _        d d d            d S # 1 swxY w Y   d S )Nr   z#data/header_with_time_wcslib71.fitszdata/header_with_time.fitsrm  r   )r   r	   r   r   r   rv  rK   r   r   r   r    rG   ro   )r/   r[  s     r"   r0   zTestWcsWithTime.setup_method  s    '%..(()*OPPEE)*FGGEk**511\#.// 	3 	3WT[c222DF	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s   :!B((B,/B,c           	           fd j         d         D             } fd j         d         D             } fd j         d         D             } fd j         d         D             } fd	 j         d
         D             }t           j        j        j                  |k    sJ t
          t          d          k    rdnd}t           j        j        j                  ddd|gk    sJ t           j        j        j	        |           t           j        j        j
        |           t           j        j        j        |           t           j        j        j                  |k    sJ  j        j        }|dk    sJ t          j        ||ft          j                  }t#          dd          D ]v}	t#          dd          D ]c}
|	|
k    r. j                             d|	 d|
 dd          ||	dz
  |
dz
  f<   6 j                             d|	 d|
 dd          ||	dz
  |
dz
  f<   dwt           j        j        j        |           g d}|D ];}t)           j        j        |           j                             |d          k    sJ <g d}|D ]}|                                dk    rK j                             dt          j                   j                             dt          j                  g}n% j                             |t          j                  }t          t)           j        j        |          |           dS )z8Make sure Wcsprm is populated correctly from the header.c                 *    g | ]}j         |         S rS   r   r  valr/   s     r"   r9  z7TestWcsWithTime.test_keywods2wcsprm.<locals>.<listcomp>'       CCCcS!CCCr$   zCTYPE*c                 *    g | ]}j         |         S rS   r   r  s     r"   r9  z7TestWcsWithTime.test_keywods2wcsprm.<locals>.<listcomp>(  r  r$   zCRVAL*c                 *    g | ]}j         |         S rS   r   r  s     r"   r9  z7TestWcsWithTime.test_keywods2wcsprm.<locals>.<listcomp>)  r  r$   zCRPIX*c                 *    g | ]}j         |         S rS   r   r  s     r"   r9  z7TestWcsWithTime.test_keywods2wcsprm.<locals>.<listcomp>*  r  r$   zCDELT*c                 *    g | ]}j         |         S rS   r   r  s     r"   r9  z7TestWcsWithTime.test_keywods2wcsprm.<locals>.<listcomp>+  r  r$   zCUNIT*z7.9i  r   i  i  i  r   )dtyperA   r   PCr   rm  )
timesystrefpostrefdirplephemtimeunitdaterefdateobsdatebegdateavgdateendr   )mjdrefmjdobsmjdbegmjdendjepochbepochtstarttstopxposuretimsyertimrdertimedeltimepixrtimeoffstelapseczphscperiMJDREFMJDREFIAMJDREFFAN)rK   r,   ro   r   r"  r   r	   
axis_typesr   r  r   r  ru  r   rs   r{  float64r   getr   getattruppernan)r/   r"  r  r   r  ru  time_axis_coder   r   r8  j	char_keysr   num_keyshdrvs   `              r"   test_keywods2wcsprmz#TestWcsWithTime.test_keywods2wcsprm$  sf    DCCCT[-BCCCCCCCT[-BCCCCCCCT[-BCCCCCCCT[-BCCCCCCCT[-BCCCDFJ$%%....!,!>!>ADFJ)**tT4.PPPPP
(%000
(%000
(%000DFJ$%%....zzzzXuenBJ777q! 	I 	IA1a[[ I I66'+{}A}}}}}a'H'HBq1ua!e|$$'+{}A}}}}}a'H'HBq1ua!e|$$	I
 	
r***
 
 
	  	H 	HC46:s++t{sB/G/GGGGGG
 
 
(  	< 	<Cyy{{h&&KOOJ77KOOJ77
 {sBF33GDFJ44d;;;;	< 	<r$   c                     t           | j        j        g | j        j        j        dR  | j        j        j                   d S )NrA   )r   ro   r)  r   r   r  r.   s    r"   test_transformszTestWcsWithTime.test_transformsl  sA    ,,Bdfj.>BBBBDFJDTUUUUUr$   N)rP   rQ   rR   r0   r  r  rS   r$   r"   r  r    sJ        3 3 3F< F< F<PV V V V Vr$   r  c                  x   t          j        d          } d| j         _        d| j         _        d| j         _        d| j         _        g d}g d}g d}|                     |||d	          \  }}}t          |g d
           t          |t          j	        ddg           t          |t          j	        ddg           d S )Nre   r   )VELO_LSRr   r   )ir   r   )rA   i     )g?g      g      ?)r  r1  )r  r   r1  r   )r  rX   g     Xf@g     0f@g     <g     ;)
r   rG   r"  r  r   r  rH   r   rs   r  )ro   pxpypzwxwywzs          r"   test_invalid_coordinate_maskingr  p  s     	aA4AEKAEKAEK$AEK	B	B	BRQ//JBB B&&&B/000B/00000r$   c                     t          j        d          } t          j        t          d          5  |                                  d d d            n# 1 swxY w Y   t          |                                 d           d S )Nre   r   z(Pixel area is defined only for 2D pixelsr   rA   )r   rG   r   rj   r   r(  r   r  rj  s    r"   test_no_pixel_arear    s    aA 
z)S	T	T	T " "	!!!" " " " " " " " " " " " " " " Q6688!<<<<<s   AAAc                 L   t          d          }t          j        d          }t          j        d          }t          j        |          5 }t          j        t          j                  5  t          j	        |d         j
                  }ddd           n# 1 swxY w Y   t          |d         j        |||          }ddd           n# 1 swxY w Y   t          t          d          k     rt          j        t          d	          5  t          j	        |                                          }ddd           n# 1 swxY w Y   t          j        t          d	          5  t          j	        |j                                                  }ddd           n# 1 swxY w Y   t          t          d
          k    rt          j        d           nQt          j	        |                                          }t          j	        |j                                                  }|                    dd                              |                    dd                    dt(          j        z  k     sJ  |j        |                      |j        |           dt(          j        z  k     sJ  |j        |                      |j        |dz             dt(          j        z  k     sJ | dz  }	t          j        |	|j        |j                                                   t          j        |	          5 }t          j	        |d         j
                  }
ddd           n# 1 swxY w Y    |j        |                      |
j        |dz             dt(          j        z  k     sJ dS )z
    Test that plate distortion model is correctly described by `wcs.to_header()`
    and preserved when creating a Cutout2D from the image, writing it to FITS,
    and reading it back from the file.
    z"data/dss.14.29.56-62.41.05.fits.gz)r-  r-  )r1  r1  r   N)positionsizer   r[   z,WCS contains a TPD distortion model in CQDISr   r   z4TPD coefficients incomplete with WCSLIB >= 7.1 < 7.4r  rf   zcutout.fits)r   rs   r   r   r   r   r   r   r    rG   rK   r   r;   r   r	   r   r   xfailpixel_to_world
separationr  maswritetor   )r  rD   censizr  ro   cutw0r  cutfilerB  s              r"   test_distortion_headerr    s    !!EFFD
(8

C
(8

C	4 GG\#.// 	+ 	+
)**A	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+wqz3AFFFG G G G G G G G G G G G G G G WU^^##\"P
 
 
 	/ 	/ ++--..B	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ \"P
 
 
 	5 	5 113344B	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 '%..((LOPPPWQ''))**WSW--//00Aq!!,,R->->q!-D-DEEQRQVVVVV1S!,,->R->-DEEQRQVVVVV 	#))*;"*;cAg*GHH
15.	 	 	 	 &GL#(CG$5$5$7$7888	7		 (wWWQZ&''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 	#))*;"*;cAg*GHH
15.	 	 	 	 	 	sl   C+ BCB	CB	!CCC
'D==EE#,FF"F2 MM"%M"c                  |   t          d          } t          j                            |           }t	          j        t          j                  5  t          j        |ddgddg          }ddd           n# 1 swxY w Y   |j	        dk    sJ t          |j        j                  d	d
gk    sJ t          j        |j        j        ddg          sJ t          j        |j        j        ddgddgg          sJ t          j        |j        j        ddg          sJ t          j        |j        j        d          sJ dS )zS
    Test selection of a specific pixel list WCS using ``colsel``. See #11412.
    zdata/chandra-pixlist-wcs.hdrimagepixelr      )keyselcolselNrf   r  r  g6-l@g}gMrA   r   g>B!g>B!?g     f@)r   r   r   r  r   r   r   r    rG   r   r,   r"  rs   r   r  r   r  lonpole)hdr_filer   ro   s      r"   test_pixlist_wcs_colselr    s    %%CDDH
+
"
"8
,
,C	c*	+	+ E EGC' 2B8DDDE E E E E E E E E E E E E E E7a<<<<Z 88888;qu{_o$FGGGGG;qux1a&1a&!122222;qu{%9;N$OPPPPP;qu}e,,,,,,,s   A55A9<A9z7.8z8TIME axis extraction only works with wcslib 7.8 or laterc                     t          j        d          } g d| j         _        | j                                          t	          |                     t           j        g          j         j                  dgk    sJ |                     g dgd          d         |                     t           j        g                              dggd          d         k    sJ d S )	Nre   r   r  r  TIMEr  r  r   rz  r   r   )r   rG   r"  r%  r,   subWCSSUB_TIMErH   rj  s    r"   test_time_axis_selectionr    s    
 	aA222AEKEIIKKKs'((,233x????	Q''-55#/"##11A3%;;DA	B 	B 	B 	B 	B 	Br$   c                  j   t          j        d          } g d| j         _        | j                                          | j        sJ |                     t           j        g          j        sJ |                     g dgd          d         | j	                            dggd          d         k    sJ d S )Nre   r   r  r  r   rz  r  )
r   rG   r"  r%  has_temporalr  r  is_temporalrH   temporalrj  s    r"   test_temporalr    s    
 	aA222AEKEIIKKK>55#/"##////	Q''-:##aSE1--d3	4 	4 	4 	4 	4 	4r$   c                     t          j        d          } g d| j         _        g d| j         _        g d| j         _        g dg dg dg| j         _        g d	| j         _        | j                                          g d
}t          d |D                       }| 	                    |          }t          j        g d          }||         }|                     |gd          d         }|                    |gd          d         }t          j        ||         |dd          sJ t          j        |                     |gd          d         |dd          sJ d S )Nre   r   r0  )g     @@@g     0@r:  )gQ@g33333Rr:  )g>g'eRC>r   )gTqs*gh㈵>r   )r   r   r:  )r:  r:  r:  )re   rf   rA   c              3       K   | ]	}|d z
  V  
dS )rA   NrS   r7  s     r"   rO  z3test_swapaxes_same_val_roundtrip.<locals>.<genexpr>  s&      11q1u111111r$   )re   r      r   r}   r  )r   rG   r"  r   r  r   r  r%  r,   r  rs   r   rH   r   rI   )ro   
axes_orderaxes_order0wsimcoordimcoordsval_refval_swappeds           r"    test_swapaxes_same_val_roundtripr    si   aA222AEK###AEK%%%AEK''')A)A)A???SAEH!//AEKEIIKKKJ11j11111K	
z		Bhyyy!!G{#Hoowi++A.G""H:q11!4K ;w{+[qtLLLLLL ;qy!44Q7qtTTTTTTTTr$   )Nr   r/  r   r0  Fr1  T)vr  rC   
contextlibr   r   numpyrs   r   numpy.testingr   r   r   r   packaging.versionr	   astropyr
   r  r   astropy.coordinatesr   
astropy.ior   astropy.nddatar   astropy.tests.helperr   astropy.utils.datar   r   r   astropy.utils.exceptionsr   r   r   astropy.utils.miscr   astropy.wcsr   __version__r   r#   r&   rU   rq   markfilterwarningsrx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r.  ro  rq  rs  rv  r  r  r  r  r  r  r  r  r  r  r  r  skipifr  r  r  r  r  r  r  r  r&  r)  r6  r:  r?  rC  rG  r\  r`  rk  rq  rt  rx  r}  r  r  r  r  r  r  r  r  r  r  r  rS   r$   r"   <module>r     s-   
			 				 " " " " " "                       & % % % % %             ( ( ( ( ( (       # # # # # # 9 9 9 9 9 9         
         
 / . . . . .      gd&''   B  B  B  B  B  B  B  BF(% (% (% (% (% (% (% (%VM M M. O,,	H 	H -,	H(B (B (BV  ,1 ,1 ,1^, , ,
  
  
 ! ! !"	! 	! 	!  4  1 1 1$  )  )  ) X4 4 4"  
7 
7 
7
, 
, 
, H%%= = &%=( H%%	 	 &%	* * *, , ,` 	r$ r$ r$ r$j	 	 	# # ## # #/& /& /&j H%%  &%1 1 1    ( ( ($( ( (&
$ 
$ 
$# # #   * * *"' ' '@  $ Q#&O   
 
 
D! ! !*  *  *" " "J Q#&O   5 5 5', ', ',T$ $ $<$ $ $@  ; ; ; ; ; ;&. . .$  7 7 7 4A 4A 4An
 
 
" " "(M M M(
/ 
/ 
/" " "* * *&# # # EFF) ) GF)X!$ !$ !$HSV SV SV SV SV SV SV SVl1 1 18= = =3 3 3l- - -  ''%.. E    	  ''%.. E   	 		 	U U U U Ur$   