U
    e»{j"Ù  ã                   @   sÖ  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d„ Z)G dd„ dƒZ*G dd„ dƒZ+dd„ Z,ej- .d¡dd„ ƒZ/dd„ Z0dd„ Z1dd „ Z2d!d"„ Z3d#d$„ Z4d%d&„ Z5d'd(„ Z6d)d*„ Z7d+d,„ Z8d-d.„ Z9d/d0„ Z:d1d2„ Z;d3d4„ Z<d5d6„ Z=d7d8„ Z>d9d:„ Z?ej- .d;¡d<d=„ ƒZ@ej- .d;¡d>d?„ ƒZAd@dA„ ZBdBdC„ ZCd©dIdJ„ZDdKdL„ ZEdMdN„ ZFdOdP„ ZGdQdR„ ZHej- .d;¡dSdT„ ƒZIdUdV„ ZJdWdX„ ZKdYdZ„ ZLd[d\„ ZMd]d^„ ZNd_d`„ ZOdadb„ ZPdcdd„ ZQdedf„ ZRdgdh„ ZSej-jTe&j'd  dik djdk�dldm„ ƒZUej-jTe&j'd  dik djdk�dndo„ ƒZVdpdq„ ZWdrds„ ZXdtdu„ ZYdvdw„ ZZdxdy„ Z[dzd{„ Z\d|d}„ Z]d~d„ Z^d€d�„ Z_d‚dƒ„ Z`d„d…„ Zad†d‡„ Zbdˆd‰„ ZcdŠd‹„ ZddŒd�„ ZedŽd�„ Zfd�d‘„ Zgej- .d’¡d“d”„ ƒZhd•d–„ ZiG d—d˜„ d˜ƒZjd™dš„ Zkd›dœ„ Zld�dž„ ZmdŸd „ Znej-jTe(ed¡ƒk d¢dk�d£d¤„ ƒZoej-jTe(ed¡ƒk d¢dk�d¥d¦„ ƒZpd§d¨„ ZqdS )ªé    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                  C   s4   t tdƒkr*t tdƒk r*tjtjd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   )Úctx© r    úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/wcs/tests/test_wcs.pyÚctx_for_v71_dateref_warnings)   s    ýr"   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestMapsc                 C   s   t tddd�ƒ| _d S )Nz	data/mapsú*.hdr©Úpattern©Úlistr   Ú
_file_list©Úselfr    r    r!   Úsetup_method8   s    zTestMaps.setup_methodc                 C   s0   d}t | jƒ|ks,tdt | jƒ› d|› �ƒ‚d S )Né   ú0test_spectra has wrong number data files: found ú, expected  ©Úlenr)   ÚAssertionError©r+   Zn_data_filesr    r    r!   Útest_consistency<   s    ÿzTestMaps.test_consistencyc                 C   sŠ   | j D ]~}tj |¡}ttj dd|¡dd�}t |¡}| ddggd¡}t	|ddggdd	� | 
ddggd¡}t	|ddggd
d	� qd S )NÚdataÚmapsÚbinary©Úencodingéa   é   g     Ðq@g     �PÀ)Údecimalr   )r)   ÚosÚpathÚbasenamer   Újoinr
   ÚWCSÚwcs_pix2worldr   Úwcs_world2pix)r+   ÚfilenameÚheaderÚwcsobjZworldZpixr    r    r!   Ú	test_mapsI   s    
 ÿ
zTestMaps.test_mapsN)Ú__name__Ú
__module__Ú__qualname__r,   r4   rG   r    r    r    r!   r#   7   s   r#   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestSpectrac                 C   s   t tddd�ƒ| _d S )Nzdata/spectrar$   r%   r'   r*   r    r    r!   r,   [   s    zTestSpectra.setup_methodc                 C   s0   d}t | jƒ|ks,tdt | jƒ› d|› �ƒ‚d S )Né   r.   r/   r0   r3   r    r    r!   r4   ^   s    ÿzTestSpectra.test_consistencyc              
   C   s‚   | j D ]v}tj |¡}ttj dd|¡dd�}ttdƒkrLtj	t
jdd�}ntƒ }|� t
 |¡}W 5 Q R X t|ƒdkst‚qd S )	Nr5   Zspectrar7   r8   ú7.4zG'datfix' made the change 'Set MJD-OBS to 53925\.853472 from DATE-OBS'\.r   é	   )r)   r=   r>   r?   r   r@   r   r   r   r   r
   r   r   Úfind_all_wcsr1   r2   )r+   rD   rE   r   Zall_wcsr    r    r!   Útest_spectrak   s    
 ÿýzTestSpectra.test_spectraN)rH   rI   rJ   r,   r4   rP   r    r    r    r!   rK   Z   s   rK   c               
   C   sø   t ddd�} t tj¡�, t tj¡�}tj| dd� W 5 Q R X W 5 Q R X tdƒt	  krftdƒk r’n n(t
|ƒdkszt‚d	t| ¡ jƒks¢t‚nt
|ƒd
ks¢t‚t|d jƒ}d|krÈd|krÈd|ksÌt‚dt|d jƒkrðdt|d jƒksôt‚dS )z
    From github issue #36
    údata/nonstandard_units.hdrr7   r8   Zdhs)Ztranslate_unitsrM   ú7.6é   z#'datfix' made the change 'Success'.é   r   ZunitfixÚHzzM/Szplane angler;   úm/sN)r   r   Úraisesr
   ÚInvalidTransformErrorr   r   rA   r   r   r1   r2   ÚstrÚpopÚmessage)rE   ÚwZ
first_wmsgr    r    r!   Ú
test_fixes…   s    ÿ" r]   zignore:PV2_2c                  C   s€   t ddd�} t | ¡}t t | ddggd¡¡¡s8t‚t t | ddggd¡¡¡sZt‚t t | ddggd¡¡¡r|t‚d	S )
z 
    From github issue #107
    zdata/outside_sky.hdrr7   r8   g      Y@g     @@r   g      i@g     @�@N)	r   r
   rA   ÚnpÚallÚisnanrB   r2   Úany©rE   r\   r    r    r!   Útest_outside_skyœ   s
    
""rc   c               	   C   s  t dƒ} t tj¡�}t | ¡}W 5 Q R X tdƒt  krFtdƒk r\n nt|ƒdkslt	‚nt|ƒdkslt	‚d}t
 |¡t
 d|f¡ j}|j|ddd	�}|j|d
 |d ddd	� t
 ddgddgg¡}t
j|jj|dd�sât	‚t
 ddgddgddgg¡}t
j||ddd��st	‚dS )z!
    From github issue #1463
    zdata/sip2.fitsrM   rR   rT   r;   rS   r   T)Zra_dec_order©.r   ©.r;   gâ@'G^0?g�„ö$�+.?gxßÆ ò3.?gÙ\˜ùÌa0¿ç:Œ0âŽyE>)Úatolçì<C›�Li@ç�°tº–G@gøÉd–Li@g*ÊcÕ¹–G@gWÜ,œLi@gB6¹–G@g»½×Ùß|Û=)rg   ÚrtolN)r   r   r   r
   r   rA   r   r   r1   r2   r^   ZarangeZonesÚTrB   ÚarrayÚallcloseÚpc)rD   Zcaught_warningsZwwÚnZpixelsÚresultZanswerr    r    r!   Útest_pix2world©   s&     ýÿrq   c               	   C   s.   t dƒ} t tj¡� t | ¡ W 5 Q R X d S )Núdata/sip.fits)r   r   r   r
   r   rA   )Ú	fits_namer    r    r!   Útest_load_fits_pathÔ   s    rt   c                  C   sâ   t ƒ � t i ¡} W 5 Q R X |  ddd¡\}}t|ddƒ t|ddƒ dddddddd	d
ddœ
}ttdƒkrtd|d< ttdƒkr”tjtjj	dd�}nt
ƒ }|� t |¡} W 5 Q R X |  ddd¡\}}t|ddƒ t|ddƒ dS )zB
    Test that WCS can be initialized with a dict-like object
    g     €D@ç       @r;   é
   úGLON-CARúGLAT-CARÚdegg      D@ç        çš™™™™™¹¿çš™™™™™¹?)
ÚCTYPE1ÚCTYPE2ZCUNIT1ZCUNIT2ÚCRPIX1ÚCRPIX2ÚCRVAL1ÚCRVAL2ZCDELT1ZCDELT2r   z
1858-11-17ZDATEREFrM   zA'datfix' made the change 'Set MJDREF to 0\.000000 from DATEREF'\.r   r   g      $Àg      4@N)r"   r
   rA   rC   r   r   r   r   r   r   r   )r\   ÚxpÚypÚhdrr   r    r    r!   Útest_dict_initÚ   s:    öþr†   c               
   C   sR   t  ¡ } tdƒ�8 tj dd¡}t t¡� | j	|dd� W 5 Q R X W 5 Q R X dS )ú
    Issue #444
    éÍ[éd   rT   r;   )ÚoriginN)
r
   rA   r   r^   ÚrandomÚrandr   rW   Ú	TypeErrorrB   )r\   r5   r    r    r!   Útest_extra_kwarg	  s
    
rŽ   c               	   C   sx   t jdd�} tdƒ�Z tj dd¡}|  |d¡}|jdks>t‚|  |d |d |d	 d¡}t	|ƒdksjt‚W 5 Q R X d
S )r‡   rS   ©Únaxisrˆ   r‰   r;   )r‰   rS   rd   re   ).rT   N)
r
   rA   r   r^   r‹   rŒ   rB   Úshaper2   r1   )r\   r5   rp   r    r    r!   Útest_3d_shapes  s    
r’   c                  C   s„   t jdd�} tj d¡}tj d¡}|  ||d¡\}}|jdksDt‚|jdksRt‚|  ||d¡\}}|jdksrt‚|jdks€t‚d S ©NrT   r�   ©rT   rS   é   r;   )r
   rA   r^   r‹   rB   r‘   r2   rC   )r\   ÚxÚyÚxwÚywrƒ   r„   r    r    r!   Útest_preserve_shape!  s    rš   c                  C   sN   t jdd�} tj d¡}d}|  ||d¡\}}|jdks<t‚|jdksJt‚d S r“   )r
   rA   r^   r‹   rC   r‘   r2   )r\   r–   r—   rƒ   r„   r    r    r!   Útest_broadcasting2  s    r›   c               	   C   sÞ   t jdd�} tj d¡}tj d¡}d}tjt|d�� |  ||d¡\}}W 5 Q R X tjt|d�� |  ||d¡\}}W 5 Q R X t jdd�} tj d¡}|  |d¡}|j	dks²t
‚tj d	¡}|  |d¡\}|j	d	ksÚt
‚d S )
NrT   r�   r”   )rS   rT   r•   z5Coordinate arrays are not broadcastable to each otherr   r;   )é*   r;   )rœ   )r
   rA   r^   r‹   r   rW   Ú
ValueErrorrB   rC   r‘   r2   )r\   r–   r—   ÚMESSAGEr˜   r™   rƒ   r„   r    r    r!   Útest_shape_mismatch>  s    rŸ   c               	   C   sx   d} t jdd�}tj d¡}tjt| d�� | |d¡ W 5 Q R X tj d¡}tjt| d�� | |d¡ W 5 Q R X dS )	zIssue #1395zCWhen providing two arguments, the array must be of shape [(]N, 2[)]rT   r�   )rT   rS   r   r;   )rT   r;   N)r
   rA   r^   r‹   r   rW   r�   rB   )rž   r\   Zxyr    r    r!   Útest_invalid_shapeX  s    r    c               
   C   sž   t ddd�} tdƒt  kr(tdƒk r2n nd}nd}tdƒD ]Z}t tj¡�}t | ¡ W 5 Q R X t	|ƒ|kstt
‚|d d… D ]}d	t|jƒks€t
‚q€q>d S )
Núdata/defunct_keywords.hdrr7   r8   rM   rR   é   r•   rT   ZPCi_ja)r   r   r   Úranger   r   r
   r   rA   r1   r2   rY   r[   )rE   Zn_warnÚ_r\   Úitemr    r    r!   Ú#test_warning_about_defunct_keywordsg  s     r¦   c               	   C   s2   t ddd�} t tj¡� t | ¡ W 5 Q R X d S )Nr¡   r7   r8   )r   r   r   r
   r   rA   ©rE   r    r    r!   Ú-test_warning_about_defunct_keywords_exceptiony  s    r¨   c                  C   s    d} t tdƒkr| d7 } nt tdƒkr.| d7 } | d7 } d | ¡}t ¡ }tj | ¡  	¡ ¡}d|krj|d= d|krx|d= tj | 	¡ ¡}t
|ƒt
|ƒksœt‚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   r@   r
   rA   r   ÚHeaderÚ
fromstringÚto_header_stringÚstripÚdictr2   )ZhdrstrÚheader_stringr\   Zh0Úh1r    r    r!   Útest_to_header_string  s    

r³   c                  C   s˜   t tdƒkrdnd} t tdƒk r&d} nt tdƒk r8d} nd} t ¡ }| ¡ }| ¡ }t|tjƒsdt	‚t|d tj
ƒsxt	‚||d j|  d … ks”t	‚d S )Nr   é   é   r   rN   r   )r   r   r
   rA   Ú	to_headerÚto_fitsÚ
isinstancer   ÚHDUListr2   Ú
PrimaryHDUrE   )Znrecr\   r±   Úwfitsr    r    r!   Útest_to_fits«  s    r¼   c               	   C   s`   t dƒ} t tj¡� t | ¡}W 5 Q R X tjtdd��}| ¡  W 5 Q R X t|ƒdks\t	‚d S )Nrr   ZA_ORDERr   r;   )
r   r   r   r
   r   rA   r   r¶   r1   r2   )rs   r–   r\   r    r    r!   Útest_to_header_warning¼  s    r½   c                  C   sˆ   t  ¡ } |  ¡ }| j j|ks t‚d| j j ¡  |ks8t‚d|ksDt‚d}| j|d�}||ks`t‚d|kslt‚d| j j ¡  |ks„t‚d S )Nr«   ÚP©Úkey)r
   rA   r¶   Zaltr2   r¯   )r\   rE   Zwkeyr    r    r!   Útest_no_comments_in_headerÅ  s    rÁ   c               
   C   sb   t tdƒƒ�} |  ¡ }W 5 Q R X t tj¡�, t tj¡� tj	|dd� W 5 Q R X W 5 Q R X dS )zD
    Causes a double free without a recent fix in wcslib_wrap.C
    zdata/too_many_pv.hdrF©ZfixN)
Úopenr   Úreadr   rW   r
   rX   r   r   rO   )ÚfdrE   r    r    r!   Útest_find_all_wcs_crashÒ  s    rÆ   Úignorec               	   C   sÄ   t  tdƒ¡} tdd„ t| ƒ ¡ D ƒƒ}ttdƒkr:d}nLttdƒkrLd}n:ttdƒkr^d	}n(ttd
ƒkrpd}nttdƒkr‚d}nd}tt|ƒƒ�}| 	¡ }W 5 Q R X tdd„ |D ƒƒ|ksÀt
‚d S )Núdata/validate.fitsc                 S   s   h | ]}|  ¡ ’qS r    ©r¯   ©Ú.0r–   r    r    r!   Ú	<setcomp>ä  s     z test_validate.<locals>.<setcomp>rR   zdata/validate.7.6.txtrM   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                 S   s   h | ]}|  ¡ ’qS r    rÉ   rÊ   r    r    r!   rÌ   ó  s     )r
   Úvalidater   ÚsortedÚreprÚ
splitlinesr   r   rÃ   Ú	readlinesr2   )ÚresultsÚresults_txtrD   rÅ   Úlinesr    r    r!   Útest_validateá  s     rÕ   c                  C   sB   t  tdƒ¡} tdd„ t| ƒ ¡ D ƒƒ}|dddddgks>t‚d S )	Nzdata/tab-time-last-axis.fitsc                 S   s   h | ]}|  ¡ ’qS r    rÉ   rÊ   r    r    r!   rÌ   ù  s     z(test_validate_wcs_tab.<locals>.<setcomp>rª   zHDU 0 (PRIMARY):zHDU 1 (WCS-TABLE):z
No issues.zWCS key ' ':)r
   rÍ   r   rÎ   rÏ   rÐ   r2   )rÒ   rÓ   r    r    r!   Útest_validate_wcs_tabö  s    ûrÖ   c               	   C   s8   t  t¡� t tdƒ¡} W 5 Q R X dt| ƒks4t‚d S )Nzdata/2wcses.hdrzWCS key 'A':)r   r   r   r
   rÍ   r   rY   r2   )rÒ   r    r    r!   Útest_validate_with_2_wcses  s    r×   c                  C   sp  t jdd�} ddg| j _ddg| j _ddg| j _t ddgd	d
g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  ¡  t t j | ¡¡}t| j| j jd*žŽ | j jdd(| d)� t| j| j jd+žŽ | j jdd(| d)� d S ),NrT   r�   gáz®Gio@g
×£p=ÊL@r;   iû  gr�ñç%à>gúœ»]/M?g«ZÒQf?g=zhÄq…Ü¾iö  zRA---TAN-SIPzDEC--TAN-SIPr   gcÏ)Åžl>gAÛáŒÄ=gÂóNÕqL½g”¯—˜ù>gÇ¢%�ð¾=gÈÞ{³p8b=rz   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½g�íµ ÷Æ°>©rj   rg   )r;   )r;   )r
   rA   ÚcrvalÚcdeltÚcrpixr^   rl   rn   Ú_naxisÚctypeÚSipÚsipÚsetÚsqrtÚutilsÚproj_plane_pixel_arear   rB   Úall_pix2world)ZtwcsÚaÚbZpscaler    r    r!   Útest_crpix_maps_to_crval  sL    
ûÿ	ûÿ	
üürç   ç-Cëâ6?é¨a  Fé   Tc                 C   s\  | dkrt dƒ} d}tj | ¡s2td| d›d�ƒ‚t | ¡}t || j	|¡}	| 
¡  ~|	jj}
|
jd }td|
  t¡ƒ}td	|
  t¡ƒ}t d
d„ tjtt||ƒŽ D ƒ¡d }tdƒ� tj ||¡}W 5 Q R X d|
d d  }|
d|  |d |  }tj||dd�}|	 ||¡}z,t ¡ }|	j||||||d�}t ¡ }W �n¦ tjjk
�rì } �z€t ¡ }d}|jdk	�r|jjd }td|› d�ƒ td|j› �ƒ td|j |j › d�ƒ tdt !tj"j#|j |j dd�¡› �ƒ tdt !tj"j#|j$|j dd�¡› d�ƒ ntdƒ d}|j%dk	�rn|j%jd }td|› d�ƒ td|j%› �ƒ td|j |j% › d�ƒ ntdƒ td|j jd | | › d �ƒ td!|j › �ƒ td"|j$› d�ƒ td#|j&d › d$|| › d�ƒ |‚W 5 d}~X Y nX t 'tj(t )|| d¡dd�¡}t !|¡}t *|¡}td%|d&›d'|d&›d(|| › d�ƒ |d)| k �sXt+‚dS )*z6Test all_world2pix, iterative inverse of all_pix2worldNzdata/j94f05bgq_flt.fits)ZSCIr;   zInput file 'Úsz$' to 'test_all_world2pix' not found.r   g      Ü?g      â?c                 S   s   g | ]}|  ¡ ‘qS r    )Úflatten©rË   Úir    r    r!   Ú
<listcomp>\  s     z&test_all_world2pix.<locals>.<listcomp>rˆ   rT   ç      ð?rµ   ç      à?r;   )Z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: ru   ),r   r=   r>   ÚisfileÚOSErrorr   rÃ   r
   rA   rE   ÚcloserÛ   r‘   r(   ZastypeÚintr^   ZdstackZmeshgridÚmapr£   r   r‹   rŒ   Úappendrä   r   ÚnowÚall_world2pixZNoConvergenceZ	divergentÚprintZbest_solutionZmeanZlinalgZnormZaccuracyZ	slow_convÚargsrá   ÚsumÚpowerZamaxr2   )ÚfnameÚextrò   rŠ   Zrandom_nptsró   rô   rõ   Úhr\   rÛ   ZncoordZnaxesi_lZnaxesi_uZimg_pixZrnd_pixZmwidthZtest_pixZ	all_worldZruntime_beginZall_pixZruntime_endr÷   ZndivZnslowÚerrorsZmeanerrZmaxerrr    r    r!   Útest_all_world2pix:  s’    

ÿþ
ú"ÿ$ÿÿÿ 

ÿr  c               	   C   s@   t ddd�} t tj¡� t | ¡}W 5 Q R X | ddd¡ dS )z`
    Test parsing of WCS parameters with redundant SIP and SCAMP distortion
    parameters.
    rÈ   r7   r8   r   N)r   r   r   r
   r   rA   rä   rb   r    r    r!   Ú$test_scamp_sip_distortion_parameters¯  s    r	  c               	   C   s6   t ddd�} t tj¡� tj| dd� W 5 Q R X dS )z!
    From github issue #1854
    rQ   r7   r8   FrÂ   N)r   r   rW   r
   rX   rA   r§   r    r    r!   Útest_fixes2»  s    r
  c                  C   s.   t ddd�} t | ¡}|jjd dks*t‚dS )z!
    From github issue #1918
    zdata/unit.hdrr7   r8   rT   rV   N)r   r
   rA   Úcunitr2   rb   r    r    r!   Útest_unit_normalizationÄ  s    
r  c                 C   s@  dddddddddd	d
ddœ}t  |¡}| d }| |¡ t|ƒ�}| ¡ }W 5 Q R X t|ƒdksft‚|d dksvt‚d|d ks†t‚|j|ddd� t|ƒ�}| ¡ }W 5 Q R X t|ƒdksÂt‚|d dksÒt‚d|d ksât‚t t	¡� |j|dd� W 5 Q R X |d= |d= t  |¡}t 
t¡� | |¡ W 5 Q R X dS )z!
    From github issue #1912
    zRA---ZPNry   gËgy\ïtÀg„�çÞCés@zDEC--ZPNgW[±¿ÌÊ§@g(DÀ!TñE@rð   g     €k@é   i   )r}   ZCRUNIT1r   r�   r~   ZCRUNIT2r€   r‚   ÚPV2_1ZPV2_3ÚNAXIS1ÚNAXIS2ztest.txtr•   rT   zICRS
zcolor=greenrS   ZFK5Úred)ÚcoordsysÚcolorzFK5
z	color=redZFOO)r  r  r  N)r
   rA   Zfootprint_to_filerÃ   rÑ   r1   r2   r   rW   r�   r   r   )Útmp_pathr…   r\   ZtestfileÚfrÔ   r    r    r!   Útest_footprint_to_fileÍ  sD    ô




r  c                  C   sD   t  ¡ } d| d< d| d< t jdgg| d�}t  |g¡}t |¡ dS )z!
    From github issue #2053
    ZICRSZRADESYSArð   r  r   r§   N)r   r¬   rº   r¹   r
   rÍ   )r  ZhduÚhdulistr    r    r!   Útest_validate_faulty_wcs  s    r  c               
   C   s`   t ddd�} t tj¡�> t tj¡�& tj| dd�}| ddggd¡ W 5 Q R X W 5 Q R X d S )	Nzdata/invalid_header.hdrr7   r8   F)Z_do_setg     À€@g     ð‹@r   )	r   r   rW   r
   rX   r   r   rA   rä   rb   r    r    r!   Útest_error_message  s
    r  c                  C   sv   t ddd�} t | ¡}| ddd¡\}}t |¡s6t‚t |¡sDt‚| ddd¡\}}t |¡rdt‚t |¡rrt‚d S )Nzdata/zpn-hole.hdrr7   r8   én   r   )r   r
   rA   rB   r^   r`   r2   )rE   r\   ÚraÚdecr    r    r!   Útest_out_of_bounds  s    
r  c               	   C   sj   t dƒ} t tj¡�L t | ¡}d}t ddgddgddgd	d
gg¡}|j|d�}t	||ƒ W 5 Q R X d S )Nrr   ©éè  i  g­¤”Li@g ,k¹–G@gOhå Wi@g–Ò¯„ yG@gñý¢>H^i@g9Ö¤_K”G@gçè�Wi@gÖ)$Ó€°G@)Úaxes©
r   r   r   r
   r   rA   r^   rl   Úcalc_footprintr   ©r   r\   r   ÚrefÚ	footprintr    r    r!   Útest_calc_footprint_1,  s    
üÿr&  c               	   C   sl   t dƒ} t tj¡�N t | ¡}d}t ddgddgddgd	d
gg¡}|j|dd�}t	||ƒ W 5 Q R X dS )z'Test calc_footprint without distortion.rr   r  rh   ri   gÀÅÔ§æWi@gLÙm@uG@g²ð­ci@g9}ûBa’G@gKÃø‚YXi@gÈ…Ú¡'´G@F)r   Ú	undistortNr!  r#  r    r    r!   Útest_calc_footprint_2>  s    
üÿr(  c                  C   sp   t  ¡ } ddg| j _ddg| j _ddg| j _d}t ddgdd	gd
d	gd
dgg¡}| j|ddd�}t||ƒ dS )z-Test calc_footprint with corner of the pixel.rw   rx   g      ø?g      @r{   r|   )rT   rv   g      à¿rñ   gfffff~v@F)r   r'  ÚcenterN)	r
   rA   rÝ   rÛ   rÚ   r^   rl   r"  r   )r\   r   r$  r%  r    r    r!   Útest_calc_footprint_3Q  s    "r*  c                  C   sn   t ddd�} t | ¡}| ddd¡\}}td|dƒ td|dƒ | ||d¡\}}td|dƒ td|dƒ d S )Núdata/irac_sip.hdrr7   r8   éÈ   r   éH   çü©ñÒMbP?)r   r
   rA   Zsip_pix2focr   Zsip_foc2pix)rE   r\   Zx0Zy0Úx1Úy1r    r    r!   Útest_sip^  s    
r1  c                  C   sV   t ddd�} tj | ¡} d| d< | jdd|  d¡d	� tj| d
d�}|jd
ksRt	‚d S )Nr+  r7   r8   rS   ZNAXISZNAXIS3é@   r  )ÚafterrT   r�   )
r   r   r¬   r­   rà   Úindexr
   rA   r�   r2   rb   r    r    r!   Útest_sub_3d_with_sipn  s    r5  c              	   C   s„   t ddd�}t tj¡�. t |¡}| ¡  |  ¡ }d|jksBt	‚W 5 Q R X t ddd�}t |¡}| ¡  |  ¡ }d|jks€t	‚dS )z%
    Just make sure that it runs
    zdata/spectra/orion-freq-1.hdrr7   r8   zWCS Keywordszdata/3d_cd.hdrN)
r   r   r   r
   r   rA   ZprintwcsZ
readouterrÚoutr2   )Zcapsysr  r\   Zcapturedr    r    r!   Útest_printwcsx  s    

r7  c                  C   sR   d} t  | ¡}tj |¡} t | ¡}| ddd¡\}}t 	|¡rJt 	|¡sNt
‚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.
    éÓ   iæÿÿÿr   )ÚioÚStringIOr   r¬   Úfromtextfiler
   rA   rC   r^   r`   r2   )rE   r  r\   r–   r—   r    r    r!   Útest_invalid_spherical‰  s    

r<  c               	   C   s€   d} t jdd�}tjt|  d¡d�� t|ƒ W 5 Q R X G dd„ dt jƒ}|dd�}tjt|  d¡d�� t|ƒ W 5 Q R X dS )	zRegression test for #3066z'{}' object is not iterablerT   r�   rA   r   c                   @   s   e Zd ZdS )z!test_no_iteration.<locals>.NewWCSN)rH   rI   rJ   r    r    r    r!   ÚNewWCS²  s   r=  N)r
   rA   r   rW   r�   ÚformatÚiter)rž   r\   r=  r    r    r!   Útest_no_iteration©  s    
r@  Ú5z'TPV only works with wcslib 5.x or later)Úreasonc               	   C   s  t tj dd¡dd�} t tj dd¡dd�}t tj¡�Î t | ¡}t |¡}t	| 
|jjgd¡| 
|jjgd¡ƒ t | ¡ ¡}t | ¡ ¡}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¡ƒ W 5 Q R X d S )Nr5   zsiponly.hdrr7   r8   útpvonly.hdrr;   )r   r=   r>   r@   r   r   r
   r   rA   r   rä   rÛ   r¶   )Z
sip_headerÚ
tpv_headerZw_sipÚw_tpvZw_sip2Zw_tpv2r    r    r!   Útest_sip_tpv_agreement»  s:     ÿ ÿ

þþþþrF  c               	   C   s¢   t tj dd¡dd�} t tj¡�v t | ¡}| 	dddgdddgd¡\}}|d |d	 krl|d	 |d
 kspt
‚|d |d	 kr�|d	 |d
 ks”t
‚W 5 Q R X d S )Nr5   rC  r7   r8   r   r‰   r,  éœÿÿÿr;   rT   )r   r=   r>   r@   r   r   r
   r   rA   rB   r2   )rD  rE  r  r  r    r    r!   Útest_tpv_copyà  s     ÿ
$rH  c               	   C   s^  t dƒ} t | ¡��@}t |d j|¡}t| ¡ ddgtj	 ƒ t| 
¡ dtj	tj	  ƒ | dddgdd	dgd¡ | dddgdd	dgd¡ |j|_|j|_|j|_|j|_|j|_|jj|j_|jj|j_|jj|j_|jj|j_|jjd
ksöt‚|jjd
k�st‚|jjdk�st‚|jjdk�s,t‚t|jjddgƒ t |d j|¡ W 5 Q R X d S )Núdata/dist_lookup.fits.gzr;   g«|gÌÒ
í>g˜»o:Oí>g>¦è—‰ê=r   r‰   r,  rG  r•   g       @g      �@)r   r   rÃ   r
   rA   rE   r   Úproj_plane_pixel_scalesÚury   rã   Z
p4_pix2focZdet2imZcpdis1Zcpdis2Zdet2im1Zdet2im2rß   rÚ   rÛ   rÙ   r5   Za_orderr2   Zb_orderZap_orderZbp_orderr   )r>   r  r\   r    r    r!   Útest_hst_wcsò  s8     ÿ ÿrL  c            
   
   C   s¸   t dƒ} t | ¡}t |d j|¡}| ¡ d j}| ¡  t|d j	ƒt|d j	ƒ }dd„ |D ƒ}dd	d
dddddddg
}t
|ƒt
|ƒks�t‚|D ]\}}}	|| ||	fks”t‚q”d S )NrI  r;   r   zCPDIS*zDP*c                 S   s   i | ]\}}}|||f“qS r    r    ©rË   ÚkÚvÚcr    r    r!   Ú
<dictcomp>%  s      z'test_cpdis_comments.<locals>.<dictcomp>)ZCPDIS1ÚLOOKUPúPrior distortion function type)z
DP1.EXTVERrð   ú$Version number of WCSDVARR extension)z	DP1.NAXESru   ú1Number of independent variables in CPDIS function)z
DP1.AXIS.1rð   ú3Axis number of the 1st variable in a CPDIS function)z
DP1.AXIS.2ru   ú3Axis number of the 2nd variable in a CPDIS function)ZCPDIS2rR  rS  )z
DP2.EXTVERru   rT  )z	DP2.NAXESru   rU  )z
DP2.AXIS.1rð   rV  )z
DP2.AXIS.2ru   rW  )r   r   rÃ   r
   rA   rE   r·   rú   r(   Úcardsr1   r2   )
r>   r  r\   r…   ÚwcscardsÚwcsdictÚrefcardsrN  rO  rP  r    r    r!   Útest_cpdis_comments  s*    
ör\  c            	   
   C   s¾   t dƒ} t | ¡}t tj¡� t |d j|¡}W 5 Q R X | 	¡  t
| ¡ d jd jƒ}dd„ |D ƒ}dddd	d
dddddg
}t|ƒt|ƒks–t‚|D ]\}}}|| ||fksšt‚qšd S )Nzdata/ie6d07ujq_wcs.fitsr   zD2IM*c                 S   s   i | ]\}}}|||f“qS r    r    rM  r    r    r!   rQ  B  s      z&test_d2im_comments.<locals>.<dictcomp>)ZD2IMDIS1rR  ú!Detector to image correction type)zD2IM1.EXTVERrð   rT  )zD2IM1.NAXESru   ú0Number of independent variables in D2IM function)zD2IM1.AXIS.1rð   ú2Axis number of the 1st variable in a D2IM function)zD2IM1.AXIS.2ru   ú2Axis number of the 2nd variable in a D2IM function)ZD2IMDIS2rR  r]  )zD2IM2.EXTVERru   rT  )zD2IM2.NAXESru   r^  )zD2IM2.AXIS.1rð   r_  )zD2IM2.AXIS.2ru   r`  )r   r   rÃ   r   r   r
   r   rA   rE   rú   r(   r·   rX  r1   r2   )	r>   r  r\   rY  rZ  r[  rN  rO  rP  r    r    r!   Útest_d2im_comments:  s*    
öra  c                  C   s   t dƒ} t | ¡ d S )Núdata/sip-broken.hdr)r   r
   rA   )r…   r    r    r!   Útest_sip_brokenZ  s    rc  c                  C   sž   t jdd�} dddg| j _dddg| j _ddd	g| j _| j  ¡  |  ¡ }tdƒD ]H}|d
|d › � | j j| ksvt‚|d|d › � | j j| ksPt‚qPdS )úL
    Regression test for https://github.com/astropy/astropy/issues/4612
    rS   r�   é2   ç  Xôd¸HBr.  ç    „×—AúRA---TANúDEC--TANÚFREQÚCRVALr;   ÚCDELTN)	r
   rA   rÙ   rÚ   rÝ   rà   r¶   r£   r2   ©r\   rE   Úiir    r    r!   Útest_no_truncate_crvalb  s    
"ro  c                  C   sÂ   t jdd�} dddg| j _dddg| j _ddd	g| j _d
d
dg| j _dddg| j _d| j _| j  ¡  |  	¡ }t
dƒD ]H}|d|d › � | j j| ksšt‚|d|d › � | j j| kstt‚qtdS )rd  rS   r�   re  rf  gñhãˆµøä>g     jø@zRA---SINzDEC--SINrj  ry   rU   r;   g   R¾=KBrk  rl  N)r
   rA   rÙ   rÚ   rÝ   r  rÛ   Zrestfrqrà   r¶   r£   r2   rm  r    r    r!   Útest_no_truncate_crval_try2r  s    
"rp  c                  C   s´   t jdd�} ddg| j _ddg| j _ddg| j _| j  ¡  |  ¡ }|d | j jd ksZt‚|d	 | j jd
 ksrt‚| jt jd�}|d | j jd ks˜t‚|d	 | j jd
 ks°t‚dS )zL
    Regression test for https://github.com/astropy/astropy/issues/5162
    rT   r�   g{£›nÍI@r.  rh  ri  r�   r   r‚   r;   ©ÚrelaxN)	r
   rA   rÙ   rÚ   rÝ   rà   r¶   r2   Z
WCSHDO_P17)r\   rE   r    r    r!   Útest_no_truncate_crval_p17…  s    
rs  c                  C   s`   t jdd�} dddg| j _dddg| j _dd	d
g| j _| j  ¡  t  |  ¡ ¡}| 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
    rS   r�   gßiJÅn@re  rf  r.  rg  rh  ri  rj  N)r
   rA   rÙ   rÚ   rÝ   rà   r¶   Úcompare)r\   Úw2r    r    r!   Útest_no_truncate_using_compare—  s    
rv  c               
   C   sš   t dƒ} t | ¡�~}t tj¡�f t |d ¡}t |d j¡}|j 	|j¡sRt
‚t |d ¡}t |d j¡}|j 	|j¡s‚t
‚W 5 Q R X W 5 Q R X dS )zj
    Passing ImageHDU or PrimaryHDU and comparing it with
    wcs initialized from header. For #4493.
    rÈ   r   r;   N)r   r   rÃ   r   r   r
   r   rA   rE   rt  r2   )r>   r  Zwcs_hduZ
wcs_headerr    r    r!   Útest_passing_ImageHDU¦  s    rw  c               	   C   sV  t dƒ} tƒ }|� t | ¡}W 5 Q R X t t¡� |jdd�}W 5 Q R X |� t |¡}W 5 Q R X tdd„ |jj	D ƒƒs~t
‚|jdd�}d|ks–t
‚|� t |¡}W 5 Q R X tdd„ |jj	D ƒƒsÊt
‚t t¡� |jd	d
�}W 5 Q R X d|ksøt
‚|� tj|d	d
�}W 5 Q R X tdd„ |jj	D ƒƒ�s2t
‚t t¡� |jdd
�}W 5 Q R X |� t |¡}W 5 Q R X tdd„ |jj	D ƒƒ�sŠt
‚|jdd�}|� t |¡}W 5 Q R X tdd„ |jj	D ƒƒ�sÌt
‚d|k�sÚt
‚|jdk	�sêt
‚|� t | ¡}W 5 Q R X ddg|j_	|jdd�}|� t |¡}W 5 Q R X tdd„ |jj	D ƒƒ�sRt
‚dS )z
    Test for #4814
    rb  Nrq  c                 s   s   | ]}|  d ¡ V  qdS ©z-SIPN©Úendswith©rË   Zctypr    r    r!   Ú	<genexpr>Ã  s     z(test_inconsistent_sip.<locals>.<genexpr>FZA_0_2c                 s   s   | ]}|  d ¡ V  qdS rx  ry  r{  r    r    r!   r|  É  s     ÚCr¿   c                 s   s   | ]}|  d ¡ V  qdS rx  ry  r{  r    r    r!   r|  Ð  s     ú c                 s   s   | ]}|  d ¡ V  qdS rx  ry  r{  r    r    r!   r|  Ö  s     Tc                 s   s   | ]}|  d ¡V  qdS rx  ry  r{  r    r    r!   r|  Ü  s     rh  ri  c                 s   s   | ]}|  d ¡V  qdS rx  ry  r{  r    r    r!   r|  ê  s     )r   r"   r
   rA   r   r   r   r¶   r_   rÝ   r2   rß   )r…   r   r\   ZnewhdrZwnewr    r    r!   Útest_inconsistent_sip¶  sL    r  c                  C   st   t jd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 #4957rT   r�   zRA---CARzDEC--CARrv   i¦ÿÿÿéZ   r;   Fi,  r   iLÿÿÿiâÿÿÿN)	r
   rA   rÝ   rÚ   rÙ   rÛ   Zbounds_checkrB   r   )r\   r  r  r    r    r!   Útest_bounds_checkí  s    
r�  c                  C   s¬   t jdd�} ddg| j _ddg| j _ddg| j _ddg| _| jdksHt‚| jdksVt‚d	| _| jd
dgksnt‚d| _| jddgks†t‚| jdks”t‚d | _| j	d ks¨t‚d S )NrT   r�   r;   r|   r  éô  )r  r‚  )r‚  r  )éc   é;   rƒ  r„  )é-   é   r†  r…  )r†  r…  )
r
   rA   rÙ   rÚ   rÛ   rÜ   Zpixel_shaper2   Zarray_shapeZpixel_bounds©r\   r    r    r!   Ú
test_naxisú  s    
rˆ  c               
   C   s¸   t  tdƒ¡�.} t tj¡� t | d j¡}W 5 Q R X W 5 Q R X |j	ddd�}|j	dd�}d|d	< d
|d< | 
|¡ tƒ � tj|dd�}W 5 Q R X |jjt dd
g¡k ¡ s´t‚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.
    rr   r   TÚA)rr  rÀ   Frq  zRA---SIN-SIPZCTYPE1AzDEC--SIN-SIPZCTYPE2Ar¿   N)r   rÃ   r   r   r   r
   r   rA   rE   r¶   Úupdater"   rÝ   r^   rl   r_   r2   )r  r\   r²   Zh2r    r    r!   Útest_sip_with_altkey  s    $
r‹  c               	   C   sl   t dƒ} t t¡� t | ¡}W 5 Q R X | ¡ }t|tj	ƒs@t
‚t|d tjƒsTt
‚t|d tjƒsht
‚dS )z5
    Test to_fits() with LookupTable distortion.
    zdata/dist.fitsr   r;   N)r   r   r   r   r
   rA   r·   r¸   r   r¹   r2   rº   ZImageHDU)rs   r\   r»   r    r    r!   Útest_to_fits_1"  s    rŒ  c                  C   sl   t dƒ} tj | ¡}|d= |d= tj|dd�}t|jtjƒs@t	‚|jj
d dksTt	‚|jj
d d	ksht	‚d
S )z*
    Test sip reading with extra key.
    rb  r   r€   r‰  )rE   rÀ   r   r  r;   i  N)r   r   r¬   Úfromfiler
   rA   r¸   rß   rÞ   r2   rÛ   )Zhdr_namerE   r\   r    r    r!   Útest_keyedsip/  s    rŽ  c               
   C   sæ   t  tdƒ¡�.} t tj¡� t | d j¡}W 5 Q R X W 5 Q R X t	 
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 )Nrr   r   ©r   rT   r;   )r   rÃ   r   r   r   r
   r   rA   rE   r^   Úzerosr   rä   rÿ   )r  r\   Zinprp   r    r    r!   Útest_zero_size_input>  s    $

r‘  c                  C   st   t jdd�} |  dd¡}t|t d¡gƒ |d jdks<t‚|  dgd¡}t|t dg¡gƒ |d jdkspt‚dS )	z
    Issue #7845
    r;   r�   rT   ru   r   r    )r;   N)r
   rA   rä   r   r^   rl   r‘   r2   )rF   rp   r    r    r!   Útest_scalar_inputsQ  s    r’  z'ignore:.*invalid value encountered in.*c                  C   sx   d} t j |  ¡ d¡} t | ¡}| tdddd�¡}|s<t‚| tdddd�¡}|rXt‚| tdddd�¡}|rtt‚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
    rö   éþ   rT   ry   )Úunitéð   é   N)	r   r¬   r­   r¯   r
   rA   Zfootprint_containsr   r2   )rE   Ztest_wcsZhasCoordr    r    r!   Útest_footprint_contains`  s    
r—  c               	   C   sŒ  t jdd�} t jdd�}t jdd�}t jdd�}ddg| j _ddg|j _ddg|j _ddg|j _| j j| j jkstt‚| j j| j jkrˆt‚| j j|j jksœt‚| j j|j jkr°t‚| j j|j jkrÄt‚| j j|j jksØt‚| j j|j jkrìt‚| j j|j jk�st‚| j jdddgk�rt‚| j jdddgk�s2t‚| j jdd	d
gk�rJt‚| j jdd	d
gk�sbt‚t t¡� | j j|j jk  W 5 Q R X d S )NrT   r�   ry   rV   zkm/hr;   rS   rå   ræ   rP  )r
   rA   r  r2   r   rW   r�   )Úw1ru  Zw3Zw4r    r    r!   Ú
test_cunit�  s,    r™  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestWcsWithTimec              	   C   sZ   t tdƒkrtdƒ}ntdƒ}tj |¡| _t t	j
¡� t	j| jdd�| _W 5 Q R X d S )Nr   z#data/header_with_time_wcslib71.fitszdata/header_with_time.fitsr‰  r¿   )r   r   r   r   r¬   r�  rE   r   r   r
   r   rA   r\   )r+   r  r    r    r!   r,   ²  s    
zTestWcsWithTime.setup_methodc                    sš  ‡ fdd„ˆ j d D ƒ}‡ fdd„ˆ j d D ƒ}‡ fdd„ˆ j d D ƒ}‡ fdd„ˆ j d	 D ƒ}‡ fd
d„ˆ j d D ƒ}tˆ jjjƒ|ksŽt‚ttdƒkrždnd}tˆ jjjƒddd|gksÀt‚t	ˆ jjj
|ƒ t	ˆ jjj|ƒ t	ˆ jjj|ƒ tˆ jjjƒ|k�st‚ˆ jj}|dk�st‚tj||ftjd�}tddƒD ]|}	tddƒD ]j}
|	|
k�r†ˆ j  d|	› d|
› d�d¡||	d |
d f< n,ˆ j  d|	› d|
› d�d¡||	d |
d f< �qJ�q<t	ˆ jjj|ƒ dddddddd d!d"g
}|D ](}tˆ jj|ƒˆ j  |d#¡k�sæt‚�qæd$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4g}|D ]Z}| ¡ d5k�rnˆ j  d6tj¡ˆ j  d7tj¡g}nˆ j  |tj¡}t	tˆ jj|ƒ|ƒ �q:d8S )9z8Make sure Wcsprm is populated correctly from the header.c                    s   g | ]}ˆ j | ‘qS r    r§   ©rË   Úvalr*   r    r!   rï   ¾  s     z7TestWcsWithTime.test_keywods2wcsprm.<locals>.<listcomp>zCTYPE*c                    s   g | ]}ˆ j | ‘qS r    r§   r›  r*   r    r!   rï   ¿  s     zCRVAL*c                    s   g | ]}ˆ j | ‘qS r    r§   r›  r*   r    r!   rï   À  s     zCRPIX*c                    s   g | ]}ˆ j | ‘qS r    r§   r›  r*   r    r!   rï   Á  s     zCDELT*c                    s   g | ]}ˆ j | ‘qS r    r§   r›  r*   r    r!   rï   Â  s     zCUNIT*z7.9i   r   i˜  i™  iä  r•   )Zdtyper;   r¢   ÚPCr¤   r‰  ZtimesysZtrefposZtrefdirZplephemZtimeunitZdaterefZdateobsZdatebegZdateavgZdateendrª   ZmjdrefZmjdobsZmjdbegZmjdendZjepochZbepochZtstartZtstopZxposureZtimsyerZtimrderZtimedelZtimepixrZtimeoffsZtelapseZczphsZcperiZMJDREFZMJDREFIAZMJDREFFAN)rE   r(   r\   r
   rÝ   r2   r   r   Z
axis_typesr   rÙ   rÛ   rÚ   r  r�   r^   r�  Zfloat64r£   Úgetrn   ÚgetattrÚupperÚnan)r+   rÝ   rÙ   rÛ   rÚ   r  Ztime_axis_coder�   rn   rî   ÚjZ	char_keysrÀ   Znum_keysZhdrvr    r*   r!   Útest_keywods2wcsprm»  sv    
.4ö&ïþz#TestWcsWithTime.test_keywods2wcsprmc                 C   s&   t | jj| jjjdžŽ | jjjƒ d S )Nr;   )r;   )r   r\   rä   r
   rÛ   rÙ   r*   r    r    r!   Útest_transforms  s    zTestWcsWithTime.test_transformsN)rH   rI   rJ   r,   r£  r¤  r    r    r    r!   rš  ±  s   	Hrš  c                  C   s˜   t jdd�} d| j _d| j _d| j _d| j _dddg}dd	dg}dd	dg}|  |||d
¡\}}}t|dddgƒ t|tj	ddgƒ t|tj	ddgƒ d S )NrS   r�   )ZVELO_LSRrw   rx   )iìÿÿÿr   r   )r;   i¡  éñ   )gÍÌÌÌÌÌô?g      À¿g      À?iöÿÿÿrê   rv   r   ißÿÿÿrL   g     Xf@g     0f@g     À<Àg     €;À)
r
   rA   rÝ   rÙ   rÛ   rÚ   rB   r   r^   r¡  )r\   ZpxÚpyZpzZwxZwyZwzr    r    r!   Útest_invalid_coordinate_masking  s    	


r§  c               	   C   s@   t jdd�} tjtdd�� |  ¡  W 5 Q R X t|  ¡ dƒ d S )NrS   r�   z(Pixel area is defined only for 2D pixelsr   r;   )r
   rA   r   rW   r�   rã   r   rJ  r‡  r    r    r!   Útest_no_pixel_area#  s    r¨  c              
   C   sð  t dƒ}t d¡}t d¡}t |¡�D}t tj¡� t 	|d j
¡}W 5 Q R X t|d j|||d�}W 5 Q R X ttdƒk rætjtdd�� t 	| ¡ ¡}W 5 Q R X tjtdd�� t 	|j ¡ ¡}W 5 Q R X ttd	ƒkrät d
¡ nt 	| ¡ ¡}t 	|j ¡ ¡}| dd¡ | dd¡¡dtj k �s.t‚|j|Ž  |j|Ž ¡dtj k �sTt‚|j|Ž  |j|d Ž ¡dtj k �s~t‚| d }	t |	|j|j ¡ ¡ t |	¡�}t 	|d j
¡}
W 5 Q R X |j|Ž  |
j|d Ž ¡dtj k �sìt‚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)re  re  )rê   rê   r   )ÚpositionÚsizer
   rM   z,WCS contains a TPD distortion model in CQDISr   r   z4TPD coefficients incomplete with WCSLIB >= 7.1 < 7.4r.  rT   zcutout.fitsN)r   r^   rl   r   rÃ   r   r   r
   r   rA   rE   r   r5   r   r   r   r®   ZxfailZpixel_to_worldZ
separationrK  Zmasr2   Zwritetor¶   )r  r>   ZcenZsizr  r\   ÚcutZw0r˜  Zcutfileru  r    r    r!   Útest_distortion_header.  sH    

  ÿ ÿ*&ÿÿÿÿr¬  c               	   C   sÒ   t dƒ} tj | ¡}t tj¡� tj|ddgddgd�}W 5 Q R X |j	dksRt
‚t|jjƒdd	gksjt
‚t |jjd
dg¡s‚t
‚t |jjddgddgg¡s¢t
‚t |jjddg¡sºt
‚t |jjd¡sÎt
‚dS )zS
    Test selection of a specific pixel list WCS using ``colsel``. See #11412.
    zdata/chandra-pixlist-wcs.hdrÚimageZpixelr´   é   )ZkeyselZcolselrT   rh  ri  g¢¨Ù6-¬l@g’ƒô}ÑgMÀr;   r   g>BºÅé!¿g>BºÅé!?g     €f@N)r   r   r¬   r;  r   r   r
   r   rA   r�   r2   r(   rÝ   r^   rm   rÙ   rn   rÚ   Zlonpole)Zhdr_filer…   r\   r    r    r!   Útest_pixlist_wcs_colseld  s    " r¯  z7.8z8TIME axis extraction only works with wcslib 7.8 or laterc                  C   s‚   t jdd�} dddg| j _| j  ¡  t|  t jg¡j jƒdgksDt‚|  dddggd¡d	 |  t jg¡ dggd¡d
 ks~t‚d S ©NrS   r�   rh  ri  ZTIMEr;   rT   r   r�  )r   r   )	r
   rA   rÝ   rà   r(   ÚsubÚWCSSUB_TIMEr2   rB   r‡  r    r    r!   Útest_time_axis_selectiont  s    
 ÿÿr³  c                  C   sx   t jdd�} dddg| j _| j  ¡  | js.t‚|  t jg¡jsBt‚|  	dddggd¡d	 | j
 	dggd¡d
 kstt‚d S r°  )r
   rA   rÝ   rà   Zhas_temporalr2   r±  r²  Zis_temporalrB   Ztemporalr‡  r    r    r!   Útest_temporalƒ  s    

ÿÿr´  c                  C   s  t jdd�} dddg| j _dddg| j _d	d
dg| j _dddgdddgdddgg| j _dddg| j _| j  ¡  dddg}tdd„ |D ƒƒ}|  	|¡}t
 dddg¡}|| }|  |gd¡d }| |gd¡d }t
j|| |ddd�sêt‚t
j|  |gd¡d |ddd��st‚d S )NrS   r�   rh  ri  rj  g     @@@g     €0@rð   g…ëQ¸…@g33333RÀg—ñ¥¦¿Ø>g¢'eRCë>rz   gTäqs*é¾gñhãˆµøÔ>rT   r;   c                 s   s   | ]}|d  V  qdS )r;   Nr    rí   r    r    r!   r|  œ  s     z3test_swapaxes_same_val_roundtrip.<locals>.<genexpr>r¢   é   r   rf   rØ   )r
   rA   rÝ   rÛ   rÙ   rn   rÚ   rà   r(   r±  r^   rl   rB   rm   r2   rC   )r\   Z
axes_orderZaxes_order0ÚwsZimcoordZimcoordsZval_refZval_swappedr    r    r!   Ú test_swapaxes_same_val_roundtrip“  s      


r·  )Nr   rè   r   ré   Frê   T)rr9  r=   Ú
contextlibr   r   Únumpyr^   r   Znumpy.testingr   r   r   r   Zpackaging.versionr   Zastropyr	   rK  r
   Zastropy.coordinatesr   Z
astropy.ior   Zastropy.nddatar   Zastropy.tests.helperr   Zastropy.utils.datar   r   r   Zastropy.utils.exceptionsr   r   r   Zastropy.utils.miscr   Zastropy.wcsr   Ú__version__r   r"   r#   rK   r]   ÚmarkÚfilterwarningsrc   rq   rt   r†   rŽ   r’   rš   r›   rŸ   r    r¦   r¨   r³   r¼   r½   rÁ   rÆ   rÕ   rÖ   r×   rç   r  r	  r
  r  r  r  r  r  r&  r(  r*  r1  r5  r7  r<  r@  ZskipifrF  rH  rL  r\  ra  rc  ro  rp  rs  rv  rw  r  r�  rˆ  r‹  rŒ  rŽ  r‘  r’  r—  r™  rš  r§  r¨  r¬  r¯  r³  r´  r·  r    r    r    r!   Ú<module>   sê   
#+

+/,	



0        ø
u		5


  ÿ
" ÿ
* 7

,$V6
þ

þ
