U
    e»{j3»  ã                   @   sü  d dl mZ d dlZd dlZd dlmZmZ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 d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dlm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z< dd„ Z=dd„ Z>ej? @dd¡dd„ ƒZAdd„ ZBdd„ ZCdd„ ZDd d!„ ZEd"d#„ ZFd$d%„ ZGd&d'„ ZHd(d)„ ZId*d+„ ZJd,d-„ ZKd.d/„ ZLd0d1„ ZMd2d3„ ZNd4d5„ ZOd6d7„ ZPej? @d8d9¡d:d;„ ƒZQej? @d8d9¡d<d=„ ƒZRej? @d>d?d@ge SdA¡e Td?d@g¡fd?d@dBge SdC¡e Td?d@dBg¡fdDdDdDge Td?d@dBg¡e Td?d@dBg¡ff¡dEdF„ ƒZUej? @dGdHdIgdJfdHdIdKgdLfdHdKgdLff¡dMdN„ ƒZVej? @dGdHdIgdJfdHdIdKgdJfdHdKgdLff¡dOdP„ ƒZWdQdR„ ZXej? @dSe Yd?d@g¡e SdA¡e SdA¡dJfe YdDdDg¡e Td?d@g¡e SdA¡dJfe Yd?d@g¡e SdA¡ddLfe Yd?d@g¡de SdA¡dJff¡dTdU„ ƒZZej? @dVdWdXg¡dYdZ„ ƒZ[d[d\„ Z\d]d^„ Z]ej? @dVdWdXg¡d_d`„ ƒZ^ej_dadb„ ƒZ`dcdd„ Zadedf„ Zbdgdh„ Zcdidj„ Zddkdl„ Zedmdn„ Zfdodp„ Zgdqdr„ Zhdsdt„ Zidudv„ Zjdwdx„ Zkdydz„ Zld{d|„ Zmd}Znd~ZodZpej?jqe d€d��ej? @d‚endƒddLd„ejr d…ejr feodƒdAdLd†ejr d‡ejr fepdˆddLd†ejr d‡ejr fendƒddJd„ejr d…ejr fend‰ddLd„ejr d…ejr feod‰dAdLd†ejr d‡ejr fepd‰ddLd†ejr d‡ejr fend‰ddJd„ejr d…ejr fg¡dŠd‹„ ƒƒZsej?jqe d€d��dŒd�„ ƒZtej?jqe d€d��dŽd�„ ƒZuej?jvej? @d�d d ge wd‘¡e wd‘¡gg¡d’d“„ ƒƒZxej_d”d•„ ƒZyd–d—„ Zzd˜d™„ Z{dšd›„ Z|ej? @dœej}gd� dd gd� džgd‘ f¡dŸd „ ƒZ~dS )¡é    )ÚnullcontextN)Úassert_allcloseÚassert_almost_equalÚassert_equal)ÚVersion)Úunits)ÚITRSÚEarthLocationÚSkyCoord)Úfits)ÚTime)ÚQuantity)Úunbroadcast)Ú	HAS_SCIPY)Úget_pkg_data_contentsÚget_pkg_data_filename)ÚAstropyUserWarning)Ú_wcs)Ú"_pixel_to_pixel_correlation_matrixÚ"_pixel_to_world_correlation_matrixÚ_split_matrixÚadd_stokes_axis_to_wcsÚcelestial_frame_to_wcsÚcustom_frame_to_wcs_mappingsÚcustom_wcs_to_frame_mappingsÚfit_wcs_from_pointsÚis_proj_plane_distortedÚlocal_partial_pixel_derivativesÚnon_celestial_pixel_scalesÚobsgeo_to_frameÚpixel_to_pixelÚpixel_to_skycoordÚproj_plane_pixel_scalesÚskycoord_to_pixelÚwcs_to_celestial_frame)ÚWCSÚWCSSUB_LATITUDEÚWCSSUB_LONGITUDEÚFITSFixedWarningÚSip)ÚSlicedFITSWCSc                  C   sì  t dd�} t ddg¡| j_t | jjt dd¡¡ | jj}|  d¡}t |j 	¡  
¡ t dddg¡k¡snt‚|  d¡}t |j 	¡  
¡ t dddg¡k¡s t‚|  d¡}t |j 	¡  
¡ t dddg¡k¡sÒt‚|  d¡}t |j 	¡  
¡ t dddg¡k¡�st‚t dd�} || j_|  d¡}t |j 	¡  
¡ t dddg¡k¡�sLt‚|  d¡}t |j 	¡  
¡ t dddg¡k¡�s€t‚|  d¡}t |j 	¡  
¡ t dddg¡k¡�s´t‚|  d¡}t |j 	¡  
¡ t dddg¡k¡�sèt‚d S ©Né   ©Únaxisé   é   r   é   é   )r%   ÚnpÚzerosÚwcsÚpcÚfill_diagonalÚarangeZdropaxisÚallÚget_pcÚdiagonalÚarrayÚAssertionErrorÚcd)r5   r6   Zdropped© r?   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/wcs/tests/test_utils.pyÚtest_wcs_dropping0   s,    

(
(
(
*

*
*
*
rA   c               	   C   sœ  t dd�} t ddg¡| j_t | jjt dd¡¡ | jj}|  dd¡}t |j 	¡  
¡ t ddddg¡k¡srt‚|  dd¡}t |j 	¡  
¡ t ddddg¡k¡s¨t‚|  dd¡}t |j 	¡  
¡ t ddddg¡k¡sÞt‚t dd�} || j_|  dd¡}t |j 	¡  
¡ t ddddg¡k¡�s(t‚|  dd¡}t |j 	¡  
¡ t ddddg¡k¡�s`t‚|  dd¡}t |j 	¡  
¡ t ddddg¡k¡�s˜t‚d S r+   )r%   r3   r4   r5   r6   r7   r8   Zswapaxesr9   r:   r;   r<   r=   r>   )r5   r6   Zswappedr?   r?   r@   Útest_wcs_swappingL   s$    
***
,,rB   Úndim)r1   r2   c                 C   sf   t | d�}t| d ƒD ]J}t||ƒ}|jj| d ks8t‚|jj| dksLt‚|jj| dkst‚qd S )Nr-   r/   ÚSTOKES)r%   Úranger   r5   r.   r=   ÚctypeÚcname)rC   r5   ÚiiZoutwcsr?   r?   r@   Útest_add_stokesd   s    

rI   c               	   C   s:  t dd�} ddg| j_ddg| j_ddg| j_ddg| _d}|  tdd ƒtdd ƒg¡}t |jjt 	ddg¡k¡svt
‚|jddgksˆt
‚t|j|jjdžŽ |jjd	d
| d� |  tdd dƒtdd dƒg¡}t |jjt 	ddg¡k¡sìt
‚t |jjt 	ddg¡k¡�st
‚|jddgk�s"t
‚|  td d dƒtdd dƒg¡}t |jjt 	ddg¡k¡�sbt
‚|jddgk�svt
‚t t¡� |  tdƒtdƒg¡}W 5 Q R X |jddgk�s¶t
‚t t¡� |  tdƒtdƒg¡}W 5 Q R X |jddgk�söt
‚t t¡� |  tdƒtdƒg¡}W 5 Q R X |jddgk�s6t
‚d S )Nr1   r-   r/   çš™™™™™¹?éè  éô  r   ió  ç        ç�íµ ÷Æ°>©ZrtolÚatolr,   ç      ä?ç      Ð?çš™™™™™Ù?çš™™™™™É?éú   g      I@g      4@é   é2   g     €4@)r/   )r%   r5   ÚcrvalÚcdeltÚcrpixÚ_naxisÚslicer3   r9   r<   r=   r   Zwcs_pix2worldÚpytestÚwarnsr   )ÚmywcsÚpscaleÚ	slice_wcsr?   r?   r@   Ú
test_sliceo   s>    

 ü ""   rb   c                  C   s|  t dd�} ddg| j_ddg| j_ddg| j_ddg| _ddg| j_t d	d	d
ddgd	ddddgdddddgdddddgdddddgg¡}t d	d	dddgd	ddddgdddddgd d!dddgd"ddddgg¡}t	||d d | jjƒ| _
| j ¡  d}|  tdd ƒtd	d ƒg¡}t|j|jjd&žŽ |jjdd#| d$� |  tdd dƒtd	d d%ƒg¡}t|j|jjd'žŽ |jjdd#| d$� d S )(Nr1   r-   r/   rJ   rK   rL   zRA---TAN-SIPzDEC--TAN-SIPr   gcÏ)Åžl>gAÛáŒÄ=gÂóNÕqL½g”¯—˜ù>gÇ¢%�ð¾=gÈÞ{³p8b=rM   gé�Õ2�¾gùåÎöÄá=gaR¾"‹=gW.ò¹2Lð½gdV>OY!c=gT¥•ÆS½gbñ²Yzaÿ>g@¼¼ˆU]ð½gð=³”ri=g	!’‘ö†¾g¤&ûYÑ=gé£å$-½g»ˆ
o+Ý>guŽM/õ½g<�Cå½H½g>ä”�˜YÃ=g3--ëÂ”/=gÝ3;6Ød½rN   rO   r,   )r/   )r/   )r%   r5   rX   rY   rZ   r[   rF   r3   r<   r)   ÚsipÚsetr\   r   Úall_pix2world)r_   ÚaÚbr`   ra   r?   r?   r@   Útest_slice_with_sip˜   sN    

ûÿ	ûÿ	
üürh   c                  C   s@  t dd�} ddg| j_ddg| j_ddg| j_| dd d…dd d…f }t |jjt ddg¡k¡sft‚t |jjt d	d
g¡k¡s†t‚ddg| j_| dd d…dd d…f }t |jjt ddg¡k¡sÊt‚t |jjt d	d
g¡k¡sêt‚| dd d… }t |jjt ddg¡k¡�st‚t |jjt dd
g¡k¡�s<t‚d S )Nr1   r-   r/   rJ   r   r,   rQ   rR   rS   rT   g      ì?g      è?)	r%   r5   rX   rY   rZ   r3   r9   r<   r=   ©r_   ra   r?   r?   r@   Útest_slice_getitemÈ   s    
    "rj   c                  C   s.  t dd�} ddg| j_ddg| j_ddg| j_| jtdd ƒtdd ƒgdd�}t |jjt ddg¡k¡slt	‚| jtdd dƒtdd dƒgdd�}t |jjt d	d
g¡k¡s®t	‚t |jjt ddg¡k¡sÎt	‚| jtdd dƒgdd�}t |jjt d	dg¡k¡�st	‚t |jjt ddg¡k¡�s*t	‚d S )Nr1   r-   r/   rJ   r   F)Znumpy_orderr,   rR   rQ   rT   rS   )
r%   r5   rX   rY   rZ   r\   r3   r9   r<   r=   ri   r?   r?   r@   Útest_slice_fitsorderÝ   s    
 "  "rk   c               	   C   sP   t dd�} | d }t|tƒs t‚tjtdd�� | dd d d…f  W 5 Q R X d S )Nr1   r-   r   z)Slicing WCS with a step is not supported.©Úmatch)r%   Ú
isinstancer*   r=   r]   ÚraisesÚ
IndexError)r_   Úsubr?   r?   r@   Útest_slice_wcsï   s
    
rr   c                  C   sZ   t dd�} ddddg| j_| jddd	dgks0t‚ddd	dg| j_| jddd	dgksVt‚d S )
Nr,   r-   úRA---TANúDEC--TANzVOPT-LSRrD   ÚRAÚDECÚVOPT)r%   r5   rF   Úaxis_type_namesr=   rG   ©r_   r?   r?   r@   Útest_axis_namesù   s
    
rz   c                  C   sJ   t dd�} ddddg| j_| j}t|jjƒdks4t‚|jdd	gksFt‚d S )
Nr,   r-   rs   rt   rw   rD   ©rs   rt   ru   rv   )r%   r5   rF   Ú	celestialÚtupler=   rx   )r_   Úcelr?   r?   r@   Útest_celestial  s
    
r   c               	   C   s*  ddl m} m}m}m}m} tdd�}|j ¡  t	j
tdd�� t|ƒd ksPt‚W 5 Q R X tdd�}ddg|j_|j ¡  t	 
t¡� t|ƒd ks–t‚W 5 Q R X tdd�}d	d
g|j_|j ¡  t|ƒ}t||ƒsÖt‚tdd�}d	d
g|j_d|j_|j ¡  t| ¡ ƒ t|ƒ}t||ƒ�s"t‚|jtddd�k�s:t‚tdd�}d	d
g|j_d|j_|j ¡  t|ƒ}t|| ƒ�szt‚|jtddd�k�s’t‚tdd�}ddg|j_|j ¡  t|ƒ}t||ƒ�sÊt‚tdd�}ddg|j_d|j_|j ¡  t|ƒ}t||ƒ�s
t‚|jtdƒk�st‚tjddfD ]N}tdd�}d	d
g|j_d|j_||j_|j ¡  t|ƒ}t||ƒ�s*t‚�q*tdd�}d
d	g|j_|j ¡  t|ƒ}t||ƒ�s²t‚tdd�}d
dd	g|j_|j ¡  t|ƒ}t||ƒ�sìt‚tdd�}dddg|j_|j ¡  t|ƒ}t||ƒ�s&t‚d S )Nr   )ÚFK4ÚFK5ÚICRSr   ÚGalacticr1   r-   zMCould not determine celestial frame corresponding to the specified WCS objectrl   ÚXOFFSETÚYOFFSETrs   rt   ç     Ÿ@Zjyear)Úformati¾  ç     øž@ZbyearzGLON-SINzGLAT-SINúTLON-CARúTLAT-CARú2017-08-17T12:41:04.430iÃ  r‚   r2   ZVELOCITYúGLAT-CARúGLON-CAR)Ú"astropy.coordinates.builtin_framesr€   r�   r‚   r   rƒ   r%   r5   rd   r]   ro   Ú
ValueErrorr$   r=   rF   rn   ÚequinoxÚprintZ	to_headerr   ÚdateobsÚobstimer3   ÚnanÚradesys)r€   r�   r‚   r   rƒ   r_   Úframer�   r?   r?   r@   Útest_wcs_to_celestial_frame  sˆ    

ý



















r—   c                  C   sP   ddl m}  tdd�}d|j_t d¡|j_|j ¡  t	|ƒ}t
|| ƒsLt‚d S )Nr   )r‚   r2   r-   ©rs   rt   ÚFREQ©r2   r2   )rŽ   r‚   r%   r5   rF   r3   Úonesr>   rd   r$   rn   r=   )r‚   r_   r–   r?   r?   r@   Ú&test_wcs_to_celestial_frame_correlatedd  s    

rœ   c               	      s¤   t dd�} ddg| j_| j ¡  t t¡� t| ƒ W 5 Q R X G dd„ dƒ‰ ‡ fdd„}t|ƒ� t| ƒ}W 5 Q R X t	|ˆ ƒs‚t
‚t t¡� t| ƒ W 5 Q R X d S )	Nr1   r-   r„   r…   c                   @   s   e Zd ZdS )z7test_wcs_to_celestial_frame_extend.<locals>.OffsetFrameN©Ú__name__Ú
__module__Ú__qualname__r?   r?   r?   r@   ÚOffsetFramez  s   r¡   c                    s.   | j jd  d¡r*| j jd  d¡r*ˆ ƒ S d S )Nr   ZOFFSETr/   )r5   rF   Úendswith©r5   ©r¡   r?   r@   Úidentify_offset}  s    $z;test_wcs_to_celestial_frame_extend.<locals>.identify_offset)r%   r5   rF   rd   r]   ro   r�   r$   r   rn   r=   )r_   r¥   r–   r?   r¤   r@   Ú"test_wcs_to_celestial_frame_extends  s    


r¦   c            
   	   C   s.  ddl m} m}m}m}m}m}m} G dd„ d|ƒ}|ƒ }tj	t
dd�� t|ƒ W 5 Q R X |ƒ }t|ƒ}	|	j ¡  t|	jjƒdksˆt‚|	jjdks˜t‚t |	jj¡sªt‚|	jjd	ksºt‚|	jjdksÊt‚|d
d�}t|ƒ}	t|	jjƒdksðt‚|	jjdk�st‚|	jjdk�st‚| dd�}t|ƒ}	t|	jjƒdk�s<t‚|	jjdk�sNt‚|	jjdk�s`t‚|dd�}t|ƒ}	t|	jjƒdk�sˆt‚|	jjdk�sšt‚|	jjdk�s¬t‚|ƒ }t|ƒ}	t|	jjƒdk�sÐt‚|	jjdk�sât‚t |	jj¡�söt‚|ƒ }t|dd�}	t|	jjƒdk�st‚|	jjdk�s0t‚t |	jj¡�sDt‚|ƒ }t|dd�}	ddg|	j_|	j ¡  t|	jj|	jjfdƒ |tdƒd�}t|dd�}	t|	jjƒdk�s²t‚|	jjdk�sÄt‚|	jjdk�sÖt‚|ƒ }t|dd�}	t|	jjƒdk�sþt‚|	jjdk�st‚|	jjtdƒjjk�s*t‚d S ) Nr   )r€   r�   r‚   r   ÚBaseCoordinateFrameÚFK4NoETermsrƒ   c                   @   s   e Zd ZdS )z.test_celestial_frame_to_wcs.<locals>.FakeFrameNr�   r?   r?   r?   r@   Ú	FakeFrame–  s   r©   zHCould not determine WCS corresponding to the specified coordinate frame.rl   r{   r‚   é´   ZJ1987)r�   r�   r†   ZB1982r€   rˆ   zFK4-NO-E)zGLON-TANzGLAT-TANÚ ZCAR)Ú
projection©r�   rŒ   éd   iâÿÿÿ)rª   é<   z2017-08-17T12:41:04.43)r“   )r‰   rŠ   r   r‹   ZJ2000)Úastropy.coordinatesr€   r�   r‚   r   r§   r¨   rƒ   r]   ro   r�   r   r5   rd   r}   rF   r=   r•   r3   Úisnanr�   ZlonpoleZlatpolerX   r   r   r’   Úutcr   )
r€   r�   r‚   r   r§   r¨   rƒ   r©   r–   r_   r?   r?   r@   Útest_celestial_frame_to_wcsŠ  sp    $
ý




r³   c               	      s’   G dd„ dƒ‰ ˆ ƒ } t  t¡� t| ƒ W 5 Q R X d‡ fdd„	}t|ƒ� t| ƒ}W 5 Q R X t|jjƒdkspt‚t  t¡� t| ƒ W 5 Q R X d S )Nc                   @   s   e Zd ZdS )z7test_celestial_frame_to_wcs_extend.<locals>.OffsetFrameNr�   r?   r?   r?   r@   r¡   Ý  s   r¡   c                    s(   t | ˆ ƒr$tdd�}ddg|j_|S d S )Nr1   r-   r„   r…   )rn   r%   r5   rF   )r–   r¬   r5   r¤   r?   r@   r¥   å  s    

z;test_celestial_frame_to_wcs_extend.<locals>.identify_offset)r„   r…   )N)	r]   ro   r�   r   r   r}   r5   rF   r=   )r–   r¥   r_   r?   r¤   r@   Ú"test_celestial_frame_to_wcs_extendÜ  s    
r´   c                  C   sN   t dd�} ddg| j_ddg| j_tt| ƒdƒ ddg| j_tt| ƒdƒ d S )	Nr1   r-   rJ   rT   rs   rt   ©rJ   rT   çš™™™™™¹¿)r%   r5   rY   rF   r   r"   ry   r?   r?   r@   Útest_pixscale_nodropô  s    
r·   c                  C   sX   t dd�} dddg| j_dddg| j_tt| jƒd	ƒ d
ddg| j_tt| jƒd	ƒ d S )Nr2   r-   rJ   rT   r/   rs   rt   rw   rµ   r¶   )r%   r5   rY   rF   r   r"   r|   ry   r?   r?   r@   Útest_pixscale_withdropþ  s    
r¸   c                  C   s<   t dd�} ddgddgg| j_ddg| j_tt| ƒdƒ d S )	Nr1   r-   r¶   r   rT   rs   rt   rµ   )r%   r5   r>   rF   r   r"   ry   r?   r?   r@   Útest_pixscale_cd  s    
r¹   Úangle)é   é-   r¯   éK   c                 C   st   t dd�}t | ¡}d}|t |¡ | t |¡ g|t |¡ |t |¡ gg|j_ddg|j_tt	|ƒdƒ d S ©Nr1   r-   rJ   rs   rt   )rJ   rJ   )
r%   r3   ÚradiansÚcosÚsinr5   r>   rF   r   r"   ©rº   r_   ÚrhoÚscaler?   r?   r@   Útest_pixscale_cd_rotated  s    

þrÅ   c                 C   sr   t dd�}t | ¡}d}| |g|j_t |¡t |¡ gt |¡t |¡gg|j_ddg|j_t	t
|ƒdƒ d S r¾   )r%   r3   r¿   r5   rY   rÀ   rÁ   r6   rF   r   r"   rÂ   r?   r?   r@   Útest_pixscale_pc_rotated  s    

.rÆ   )rY   r6   ÚpccdrJ   rT   r1   g333333Ó?r2   r/   c                 C   s.   t t| ƒd�}| |j_||j_t|j|ƒ d S ©Nr-   )r%   Úlenr5   rY   r6   r   Zpixel_scale_matrix)rY   r6   rÇ   r_   r?   r?   r@   Útest_pixel_scale_matrix'  s    	rÊ   )rF   r~   rs   rt   Tr™   Fc                 C   s(   t t| ƒd�}| |j_|j|ks$t‚d S rÈ   )r%   rÉ   r5   rF   Zis_celestialr=   ©rF   r~   r_   r?   r?   r@   Útest_is_celestial7  s    	rÌ   c                 C   s(   t t| ƒd�}| |j_|j|ks$t‚d S rÈ   )r%   rÉ   r5   rF   Úhas_celestialr=   rË   r?   r?   r@   Útest_has_celestialF  s    	rÎ   c                  C   s8   t dd�} d| j_t d¡| j_| j ¡  | js4t‚d S )Nr2   r-   r˜   rš   )	r%   r5   rF   r3   r›   r>   rd   rÍ   r=   ry   r?   r?   r@   Útest_has_celestial_correlatedU  s
    

rÏ   )rY   r6   r>   Úcheck_warningc           	   	   C   sº   t dd�}|d k	r||j_|d k	r*||j_|r8t ¡ }ntƒ }|�}| |j_W 5 Q R X |r†|D ]&}t|j	t
ƒsrt‚dt|jƒks^t‚q^ddg|j_t|ƒ}t| tj¡t ddg¡ƒ d S )Nr1   r-   z)cdelt will be ignored since cd is presentrs   r™   rJ   rT   )r%   r5   r>   r6   r]   r^   r   rY   Ú
issubclassÚcategoryÚRuntimeWarningr=   ÚstrÚmessagerF   r   r   Úto_valueÚuÚdegr3   r<   )	rY   r6   r>   rÐ   r_   ÚctxZwarning_linesÚwZpsr?   r?   r@   Útest_noncelestial_scale_  s"    


rÛ   Úmoder9   r5   c           
      C   sä   ddl m} tddd�}t|ƒ}|dtj dtj dd	�}t||| d
�\}}t|||| d
� d¡}t	|j
j|j
jƒ t	|jj|jjƒ G dd„ d|ƒ}t|||| |d� d¡}	|	j|ks¼t‚t	|	j
j|j
jƒ t	|	jj|jjƒ d S )Nr   ©r
   údata/maps/1904-66_TAN.hdrÚbinary©ÚencodingrJ   ç     @VÀÚicrs©r–   ©rÜ   c                   @   s   e Zd ZdS )z)test_skycoord_to_pixel.<locals>.SkyCoord2Nr�   r?   r?   r?   r@   Ú	SkyCoord2–  s   ræ   )rÜ   Úcls)r°   r
   r   r%   r×   rØ   r#   r!   Útransform_tor   ÚraÚdegreeÚdecÚ	__class__r=   )
rÜ   r
   Úheaderr5   ÚrefÚxpÚypÚnewræ   Únew2r?   r?   r@   Útest_skycoord_to_pixelƒ  s    ró   c                  C   sÄ   ddl m}  tddd�}t|ƒ}| ttg¡}| dtj dtj dd	�}t	||ƒ\}}t	||ƒ\}}t
||ƒ t
||ƒ t|||ƒ d¡}	t|||ƒ d¡}
t
|	jj|
jjƒ t
|	jj|
jjƒ d S )
Nr   rÝ   rÞ   rß   rà   rJ   râ   rã   rä   )r°   r
   r   r%   rq   r&   r'   r×   rØ   r#   r   r!   rè   ré   rê   rë   )r
   rí   r5   Zwcs_swappedrî   Zxp1Zyp1Zxp2Zyp2Znew1rò   r?   r?   r@   Útest_skycoord_to_pixel_swapped   s    

rô   c               	   C   sŒ   t dd�} ddgddgg| j_ddg| j_t| ƒs6t‚dd	gd
dgg| j_t| ƒrVt‚tdƒ}t t	¡� t |ƒ} W 5 Q R X t| ƒsˆt‚d S )Nr1   r-   r¶   r   rT   rs   rt   gòì—ôœ™¹?gý”SÐ'Ñ†>g+i¤)+€>g¡Ak—™¹?údata/sip.fits)
r%   r5   r>   rF   r   r=   r   r]   r^   r(   )r5   rí   r?   r?   r@   Útest_is_proj_plane_distorted½  s    
rö   c              	   C   sœ   ddl m} tdƒ}t t¡� t|ƒ}W 5 Q R X |dtj dtj dd�}t	||| d�\}}t
|||| d� d¡}t|jj|jjƒ t|jj|jjƒ d S )	Nr   rÝ   rõ   g     Pi@g¸…ëQ˜G@rã   rä   rå   )r°   r
   r   r]   r^   r(   r%   r×   rØ   r#   r!   rè   r   ré   rê   rë   )rÜ   r
   rí   r5   rî   rï   rð   rñ   r?   r?   r@   Ú"test_skycoord_to_pixel_distortionsÏ  s    r÷   c                  C   sN   t dd�} ddg| j_dgd | j_dgd | j_dgd | j_| j ¡  | S )zv
    This WCS has an almost linear correlation between the pixel and world axes
    close to the reference pixel.
    r1   r-   zHPLN-TANzHPLT-TANg      @gü©ñÒMb`?r   )r%   r5   rF   rZ   rY   rX   rd   r£   r?   r?   r@   Úspatial_wcs_2d_small_angleã  s    

rø   c                 C   sÂ   t  t  ddg¡¡}t| ddƒ}t j t  |¡| jj¡ t jj|| jddgdd� t| ddƒ}t  	t  |¡| jj¡rzt
‚t| dddd�}t j t  |¡ddg¡ t jj|| jddgd	d� d S )
Nr/   r2   r   g»½×Ùß|Û=)rP   g     LÝ@T)Znormalize_by_worldg:Œ0âŽyE>)r3   Zlogical_notÚdiagr   Útestingr   r5   rY   ZflatÚallcloser=   )rø   Znot_diagZderivsr?   r?   r@   Útest_local_pixel_derivativesò  s       ÿrü   c                  C   sb   t dd�} d| j_| j ¡  t| jddgddggƒ t| ƒ\}}t|ddggƒ |tgks^t‚d S )Nr1   r-   r{   r/   )	r%   r5   rF   rd   r   Úaxis_correlation_matrixr   r
   r=   ©r5   ÚmatrixÚclassesr?   r?   r@   Ú0test_pixel_to_world_correlation_matrix_celestial  s    

r  c                  C   sz   t dd�} d| j_| j ¡  t| jdddgdddgdddggƒ t| ƒ\}}t|dddgdddggƒ |ttgksvt	‚d S )Nr2   r-   ©rs   r™   rt   r/   r   )
r%   r5   rF   rd   r   rý   r   r
   r   r=   rþ   r?   r?   r@   ÚAtest_pixel_to_world_correlation_matrix_spectral_cube_uncorrelated  s    

$r  c                  C   sˆ   t dd�} d| j_t d¡| j_| j ¡  t| jdddgdddgdddggƒ t	| ƒ\}}t|dddgdddggƒ |t
tgks„t‚d S )Nr2   r-   r  rš   r/   )r%   r5   rF   r3   r›   r>   rd   r   rý   r   r
   r   r=   rþ   r?   r?   r@   Ú?test_pixel_to_world_correlation_matrix_spectral_cube_correlated  s    

$r  c                  C   s\   t dd�} d| j_| j ¡  t dd�}d|j_|j ¡  t| |ƒ}t|ddgddggƒ d S )Nr1   r-   r{   ©rt   rs   r/   ©r%   r5   rF   rd   r   r   ©Úwcs_inÚwcs_outrÿ   r?   r?   r@   Ú0test_pixel_to_pixel_correlation_matrix_celestial'  s    




r
  c                  C   sh   t dd�} d| j_| j ¡  t dd�}d|j_|j ¡  t| |ƒ}t|dddgdddgdddggƒ d S )Nr2   r-   r˜   ©rt   r™   rs   r/   r   r  r  r?   r?   r@   ÚAtest_pixel_to_pixel_correlation_matrix_spectral_cube_uncorrelated4  s    




r  c                  C   sv   t dd�} d| j_| j ¡  t dd�}d|j_t d¡|j_|j ¡  t| |ƒ}t|dddgdddgdddggƒ d S )Nr2   r-   r˜   r  rš   r/   )	r%   r5   rF   rd   r3   r›   r>   r   r   r  r?   r?   r@   Ú?test_pixel_to_pixel_correlation_matrix_spectral_cube_correlatedA  s    




r  c               	   C   s  t dd�} d| j_| j ¡  t dd�}d|j_|j ¡  tjtdd�� t| |ƒ W 5 Q R X t dd�}d|j_|j ¡  tjtd	d�� t||ƒ W 5 Q R X t d
d�}d|j_ddddg|j_|j ¡  t d
d�}d|j_ddddg|j_|j ¡  tjtdd�� t||ƒ W 5 Q R X d S )Nr1   r-   r{   r2   r  z:The two WCS return a different number of world coordinatesrl   )r™   ZPIXELz6The world coordinate types of the two WCS do not matchr,   )rs   rt   ÚQ1ÚQ2rØ   zm/s)r  rs   rt   r  zHWorld coordinate order doesn't match and automatic matching is ambiguous)	r%   r5   rF   rd   r]   ro   r�   r   Úcunit)r  r	  Zwcs3Zwcs4Zwcs5r?   r?   r@   Ú/test_pixel_to_pixel_correlation_matrix_mismatchQ  s@    



 ÿ

 ÿ



ýr  c                  C   s<  G dd„ dƒ} | ƒ }||_ d|_d|_dddgdddgdddgdddgg|_ddd	d
g|_ddddifddi fdddddœfdœ|_| ƒ }||_ d|_d|_ddddgddddgddddgddddgg|_d	ddd
g|_|j|_t||ƒ}| t¡}|j	dk�st
‚t dddgdddgdddgdddgg¡}t||ƒ d S )Nc                   @   s   e Zd ZdS )zAtest_pixel_to_pixel_correlation_matrix_nonsquare.<locals>.FakeWCSNr�   r?   r?   r?   r@   ÚFakeWCS€  s   r  r2   r,   TF)Úspatré   z	ra.degree)r  rë   z
dec.degree)Úspecr   Úvalue)Útimer   z	utc.valuezastropy.coordinates.SkyCoordr?   r–   rã   zastropy.units.Wavelength©Nzastropy.time.TimeZmjdr²   )r‡   rÄ   )r  r  r  )r,   r2   r/   r   )Zlow_level_wcsZpixel_n_dimZworld_n_dimrý   Zworld_axis_object_componentsZworld_axis_object_classesr   ÚastypeÚintÚshaper=   r3   r<   r   )r  r  r	  rÿ   Úexpectedr?   r?   r@   Ú0test_pixel_to_pixel_correlation_matrix_nonsquare{  sN    üüý



üü

*r  c                   C   s,  t t dgg¡ƒdgdgfgks$t‚t t ddgddgg¡ƒddgddgfgksTt‚t t dddgdddgdddgg¡ƒddgddgfdgdgfgksšt‚t t dddgdddgdddgg¡ƒdgdgfdgdgfdgdgfgksæt‚t t dddgdddgdddgg¡ƒdddgdddgfgk�s(t‚d S )Nr/   r   r1   )r   r3   r<   r=   r?   r?   r?   r@   Útest_split_matrix¶  sP    $þÿÿù	ýÿÿø
ýÿÿ ø
ýÿÿør  c               	   C   s0  t dd�} d| j_| j ¡  t dd�}d|j_|j ¡  tjtdd�� t| |dddƒ\}}}W 5 Q R X |jd	ksvt	‚|jd	ks„t	‚|jd	ks’t	‚t
 d
dd
¡}t
 d
dd¡}t
 d
dd¡}t
j|||ddd�\}}}tjtdd�� t| ||||ƒ\}}	}
W 5 Q R X |jdk�st	‚|	jdk�s&t	‚|
jdk�s6t	‚t|ƒjdk�sJt	‚t|	ƒjdk�s^t	‚t|
ƒjdk�srt	‚tjtdd�� t|| ||	|
ƒ\}}}W 5 Q R X |jdk�s²t	‚|	jdk�sÂt	‚|
jdk�sÒt	‚t|ƒjdk�sæt	‚t|ƒjdk�sút	‚t|ƒjdk�st	‚t||ƒ t||ƒ t||ƒ d S )Nr2   r-   r  )r�   rŒ   r™   zNo observer defined on WCSrl   r/   r1   r?   é
   rV   r»   ÚijF©ZindexingÚcopy)r»   rV   r  )r»   r/   r  )rV   r/   )r%   r5   rF   rd   r]   r^   r   r    r  r=   r3   ÚlinspaceÚmeshgridr   r   )r  r	  ÚxÚyÚzZZ1ÚY1ÚX1ÚX2ÚY2ZZ2ZX3ZY3ZZ3r?   r?   r@   Útest_pixel_to_pixelá  sD    



   

r+  c                  C   sÜ   t dd�} d| j_| j ¡  t dd�}d|j_|j ¡  t| |ddƒ\}}|jdksXt‚|jdksft‚t ddd¡}t ddd¡}tj	||d	d
d�\}}t| |||ƒ\}}|jdks¸t‚|jdksÆt‚t
|ƒjdksØt‚d S )Nr1   r-   r  r­   r/   r?   r  rV   r  Fr   )rV   r  )r%   r5   rF   rd   r    r  r=   r3   r"  r#  r   )r  r	  r$  r%  r'  r(  r*  r)  r?   r?   r@   Útest_pixel_to_pixel_correlated  s     



r,  c                  C   sÐ   t dd�} d| j_d| j_| j ¡  t dd�}d|j_d|j_|j ¡  t| |dƒ}|jdksbt‚t 	dd	d¡}t| ||ƒ}|jd
ksŠt‚t 
t 	dd	d¡d¡}t| ||ƒ}|jdksºt‚t|ƒjd
ksÌt‚d S )Nr/   r-   )ZCOORD1)Únm)ZCOORD2)Úcmr?   r  rV   )r  )r,   r  )r%   r5   rF   r  rd   r    r  r=   r3   r"  Zbroadcast_tor   )r  r	  r$  r?   r?   r@   Útest_pixel_to_pixel_1d3  s"    



r/  aº  
XTENSION= 'IMAGE   '           / Image extension
BITPIX  =                  -32 / array data type
NAXIS   =                    2 / number of array dimensions
NAXIS1  =                   50
NAXIS2  =                   50
PCOUNT  =                    0 / number of parameters
GCOUNT  =                    1 / number of groups
RADESYS = 'ICRS    '
EQUINOX =               2000.0
WCSAXES =                    2
CTYPE1  = 'RA---TAN'
CTYPE2  = 'DEC--TAN'
CRVAL1  =    250.3497414839765
CRVAL2  =    2.280925599609063
CRPIX1  =               1045.0
CRPIX2  =               1001.0
CD1_1   =   -0.005564478186178
CD1_2   =   -0.001042099258152
CD2_1   =     0.00118144146585
CD2_2   =   -0.005590816683583
al  
XTENSION= 'IMAGE   '           / Image extension
BITPIX  =                  -32 / array data type
NAXIS   =                    2 / number of array dimensions
NAXIS1  =                   50
NAXIS2  =                   50
PCOUNT  =                    0 / number of parameters
GCOUNT  =                    1 / number of groups
RADESYS = 'ICRS    '
EQUINOX =               2000.0
WCSAXES =                    2
CTYPE1  = 'RA---TAN-SIP'
CTYPE2  = 'DEC--TAN-SIP'
CRVAL1  =    250.3497414839765
CRVAL2  =    2.280925599609063
CRPIX1  =               1045.0
CRPIX2  =               1001.0
CD1_1   =   -0.005564478186178
CD1_2   =   -0.001042099258152
CD2_1   =     0.00118144146585
CD2_2   =   -0.005590816683583
A_ORDER =                    2
B_ORDER =                    2
A_2_0   =    2.02451189234E-05
A_0_2   =   3.317603337918E-06
A_1_1   = 1.73456334971071E-05
B_2_0   =   3.331330003472E-06
B_0_2   = 2.04247482482589E-05
B_1_1   = 1.71476710804143E-05
AP_ORDER=                    2
BP_ORDER=                    2
AP_1_0  = 0.000904700296389636
AP_0_1  = 0.000627660715584716
AP_2_0  =  -2.023482905861E-05
AP_0_2  =  -3.332285841011E-06
AP_1_1  =  -1.731636633824E-05
BP_1_0  = 0.000627960882053211
BP_0_1  = 0.000911222886084808
BP_2_0  =  -3.343918167224E-06
BP_0_2  =  -2.041598249021E-05
BP_1_1  =  -1.711876336719E-05
A_DMAX  =    44.72893589844534
B_DMAX  =    44.62692873032506
aH  
NAXIS   =                    2 / number of array dimensions
WCSAXES =                    2 / Number of coordinate axes
CRPIX1  =               1024.5 / Pixel coordinate of reference point
CRPIX2  =               1024.5 / Pixel coordinate of reference point
CD1_1   = -1.7445934400771E-05 / Coordinate transformation matrix element
CD1_2   = -4.9826985362578E-08 / Coordinate transformation matrix element
CD2_1   = -5.0068838822312E-08 / Coordinate transformation matrix element
CD2_2   =  1.7530614610951E-05 / Coordinate transformation matrix element
CTYPE1  = 'RA---TAN'           / Right ascension, gnomonic projection
CTYPE2  = 'DEC--TAN'           / Declination, gnomonic projection
CRVAL1  =      5.8689341666667 / [deg] Coordinate value at reference point
CRVAL2  =     -71.995508583333 / [deg] Coordinate value at reference point
zrequires scipy)ÚreasonzEheader_str,crval,sip_degree,user_proj_point,exp_max_dist,exp_std_distgyw1Ko@gÒûÆ×žY?g-Cëâ6ú>g·_>Y1\Ý>gñhãˆµøÄ>g‹×ÐàÉy@g½»†Š˜v@c                 C   sò   t jj| dd�}||d< t|dd�}t ttdƒƒttdƒƒ¡\}}	| ¡ }|	 ¡ }	| 	||	¡}
|r‚|
d }|j
jj}|j
jj}nd}t||	f|
||d	�}| 	||	¡}|
 |¡}| ¡ |k sÀt‚t |¡|k sÒt‚|rî|jj||gk ¡ sît‚d S )
NÚ
©ÚsepZCRVAL1T)Zrelaxr  r   Úcenter)Ú
proj_pointÚ
sip_degree)r   ÚHeaderÚ
fromstringr%   r3   r#  ÚlistrE   ÚflattenÚpixel_to_worldÚdataÚlonrØ   Úlatr   Z
separationÚmaxr=   Zstdr5   rX   r9   )Ú
header_strrX   r6  Zuser_proj_pointZexp_max_distZexp_std_distrí   Ztrue_wcsr$  r%  Ú	world_pixr5  ÚprojlonÚprojlatÚfit_wcsZworld_pix_newÚdistsr?   r?   r@   Útest_fit_wcs_from_points¦  s0    5 
   ÿ
rF  c                  C   sà   d} t jj| dd�}t|ƒ}d\}}d\}}t| ||d  ||d  ggd¡dd	�d }d
d„ tj||| …||| …f D ƒ\}}	t| |	|d¡ddiŽ}
t||	f|
dd�}|j	j
 t¡ddgk ¡ sÎt‚|jdksÜt‚d S )NaÚ  
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.00056205870415378 / Coordinate transformation matrix element
PC1_2   =    -0.00569181083243 / Coordinate transformation matrix element
PC2_1   =   0.0056776810932466 / Coordinate transformation matrix element
PC2_2   =   0.0004208048403273 / 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'           / Right ascension, gnomonic projection
CTYPE2  = 'DEC--TAN'           / Declination, gnomonic projection
CRVAL1  =      104.57797893504 / [deg] Coordinate value at reference point
CRVAL2  =     -74.195502593322 / [deg] Coordinate value at reference point
LONPOLE =                180.0 / [deg] Native longitude of celestial pole
LATPOLE =     -74.195502593322 / [deg] Native latitude of celestial pole
TIMESYS = 'TDB'                / Time scale
TIMEUNIT= 'd'                  / Time units
DATEREF = '1858-11-17'         / ISO-8601 fiducial time
MJDREFI =                  0.0 / [d] MJD of fiducial time, integer part
MJDREFF =                  0.0 / [d] MJD of fiducial time, fractional part
DATE-OBS= '2019-03-27T03:30:13.832Z' / ISO-8601 time of observation
MJD-OBS =      58569.145993426 / [d] MJD of observation
MJD-OBS =      58569.145993426 / [d] MJD at start of observation
TSTART  =      1569.6467941661 / [d] Time elapsed since fiducial time at start
DATE-END= '2019-03-27T04:00:13.831Z' / ISO-8601 time at end of observation
MJD-END =      58569.166826748 / [d] MJD at end of observation
TSTOP   =      1569.6676274905 / [d] Time elapsed since fiducial time at end
TELAPSE =        0.02083332443 / [d] Elapsed time (start to stop)
TIMEDEL =    0.020833333333333 / [d] Time resolution
TIMEPIXR=                  0.5 / Reference position of timestamp in binned data
RADESYS = 'ICRS'               / Equatorial coordinate system
r1  r2  )rK   rK   )r  éÈ   r1   r   rØ   )Úunitc                 s   s   | ]}|  ¡ V  qd S r  )r:  )Ú.0Zarrr?   r?   r@   Ú	<genexpr>1  s     z8test_fit_wcs_from_points_CRPIX_bounds.<locals>.<genexpr>rH  r4  )r5  iL  ií  )i¯  iñ  )r   r7  r8  r%   r
   re   r3   Zmgridr   r5   rZ   r  r  r9   r=   Zpixel_shape)Zwcs_strZ
wcs_headerZffi_wcsÚyiÚxir%  r$  Zcenter_coordZypixZxpixrA  rD  r?   r?   r@   Ú%test_fit_wcs_from_points_CRPIX_bounds  s     #  ÿþ,rM  c                  C   s„   t  ddddgddddgg¡} td	d
ddgddd�}tddddd�}t| ||dd�}|jjj}|jjj}|jj	||gk 
¡ s€t‚d S )Ng‡­ò‡››@g�gÀî¶·„@gBFþhpe@gÍYKd-^@g1�ÂËªš@gô(Rkó›@gl”>õ“@gö¥éy¬m”@)gÀbhÐ«–P@g	aN336@)gæ3ÉÝÉP@g²òO™0.3@)g¸ì­ÔõnP@gKÒ�LâŠ1@)gŠUÅL‰�P@g“pc«²q1@rã   rØ   )r–   rH  g\è¤5+P@g|/¶÷F¢3@ZTAN)ÚxyÚworld_coordsr5  r¬   )r3   r<   r
   r   r<  r=  rØ   r>  r5   rX   r9   r=   )rN  rO  r5  rD  rB  rC  r?   r?   r@   Útest_issue10991:  s0    

þÿüø
   ÿ

rP  z	x_in,y_inr0   c              	   C   s†   t tjƒt dƒkr"tjtdd�}ntƒ }|� tdddddd	œƒ}W 5 Q R X | | |¡}| 	|¡\}}t
j || ¡ t
j ||¡ d
S )z@Regression test for https://github.com/astropy/astropy/pull/9609z7.4zG'datfix' made the change 'Set MJD-OBS to 57982\.528524 from DATE-OBS'\.rl   r1   r‰   rŠ   zITRS z2017-08-17T12:41:04.444)ZNAXISZCTYPE1ZCTYPE2ZRADESYSzDATE-OBSN)r   r   Ú__version__r]   r^   r(   r   r%   r;  Zworld_to_pixelr3   rú   r   )Zx_inZy_inrÙ   r5   Zcoordr$  r%  r?   r?   r@   Útest_pixel_to_world_itrsW  s&    ýûÿrR  c                   C   s   t dtj Ž S )N)g"óqPïÙTÁg¿Šc^XBÁgÅÓŸñ*AA)r	   r×   Úmr?   r?   r?   r@   Údkist_location{  s    ÿrT  c                 C   sŽ   t dƒ}tdd�}t|  tj¡ ¡ ƒdddg |j_|j	|j_
t|jj|ƒ}t|tƒsZt‚|j| jksjt‚|j| jkszt‚|j| jksŠt‚d S ©Nú2021-05-21T03:00:00r1   r-   r   )r   r%   r9  rÖ   r×   rS  Útolistr5   ÚobsgeoÚisotr’   r   rn   r   r=   r$  r%  r&  )rT  r“   r5   r–   r?   r?   r@   Útest_obsgeo_cartesian‚  s    
"
rZ  c                 C   s¬   t dƒ}|  |¡} | j}tdd�}dddg|jj|jj|jjg |j_	|j
|j_t|jj	|ƒ}t|tƒslt‚t |j| j¡s€t‚t |j| j¡s”t‚t |j| j¡s¨t‚d S rU  )r   Úget_itrsÚ	sphericalr%   r=  r  r>  Údistancer5   rX  rY  r’   r   rn   r   r=   r×   rû   r$  r%  r&  ©rT  r“   Zloc_sphr5   r–   r?   r?   r@   Útest_obsgeo_spherical�  s    

ý

r_  c                 C   s¸   t dƒ}|  |¡} | j}tdd�}ddtjg|jj|jj|j	jg |j
_|j|j
_|j
 ¡  t|j
j|ƒ}t|tƒsxt‚t |j| j¡sŒt‚t |j| j¡s t‚t |j| j¡s´t‚d S )NrV  r1   r-   r/   )r   r[  r\  r%   r3   r”   r=  r  r>  r]  r5   rX  rY  r’   rd   r   rn   r   r=   r×   rû   r$  r%  r&  r^  r?   r?   r@   Útest_obsgeo_infinite¥  s     


ý


r`  rX  é   é6   c              	   C   s$   t  t¡� t| d ƒ W 5 Q R X d S r  )r]   ro   r�   r   )rX  r?   r?   r@   Útest_obsgeo_invalid»  s    rc  )Ú
contextlibr   Únumpyr3   r]   Znumpy.testingr   r   r   Zpackaging.versionr   Zastropyr   r×   r°   r   r	   r
   Z
astropy.ior   Zastropy.timer   Zastropy.unitsr   Zastropy.utilsr   Z"astropy.utils.compat.optional_depsr   Zastropy.utils.datar   r   Zastropy.utils.exceptionsr   Zastropy.wcsr   Zastropy.wcs.utilsr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Zastropy.wcs.wcsr%   r&   r'   r(   r)   Zastropy.wcs.wcsapi.fitswcsr*   rA   rB   ÚmarkZparametrizerI   rb   rh   rj   rk   rr   rz   r   r—   rœ   r¦   r³   r´   r·   r¸   r¹   rÅ   rÆ   Úeyerù   rÊ   rÌ   rÎ   rÏ   r<   rÛ   ró   rô   rö   r÷   Zfixturerø   rü   r  r  r  r
  r  r  r  r  r  r+  r,  r/  Zheader_str_linearZheader_str_sipZheader_str_probZskipifrØ   rF  rM  rP  Zremote_datar8   rR  rT  rZ  r_  r`  r”   rc  r?   r?   r?   r@   Ú<module>   s,  L

)0
XR




 &ýþ


ýþ


ýþ

 $üþ	



*;+6!,ú	ú
ú	úÛþ1*
7
$"
(