U
    e»{j$ž  ã                	   @   s<  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ 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mZmZ d dlmZ d dlm Z m!Z! dZ"edƒ�& ej#j$e"e"gd�Z%ej#j$dd�Z&W 5 Q R X ej'dd„ ƒZ(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-dd„ Z.dd „ Z/d!d"„ Z0d#d$„ Z1d%d&„ Z2d'd(„ Z3d)d*„ Z4d+d,„ Z5d-d.„ Z6d/d0„ Z7d1d2„ Z8d3d4„ Z9d5d6„ Z:d7d8„ Z;d9d:„ Z<d;d<„ Z=d=d>„ Z>d?d@„ Z?dAdB„ Z@dCdD„ ZAdEdF„ ZBdGdH„ ZCdIdJ„ ZDdKdL„ ZEdMdN„ ZFdOdP„ ZGejH IdQdRdSg¡ejH IdTdUdVejJ dVejK ejL g¡ejH IdWdXdYg¡dZd[„ ƒƒƒZMejH IdQd\d]g¡ejH Id^dUejNfdVejJ ejNfdVejL dYfg¡ejH IdWdXdYg¡d_d`„ ƒƒƒZOdadb„ ZPdcdd„ ZQdedf„ ZRdgdh„ ZSdidj„ ZTdkdl„ ZUdmdn„ ZVdodp„ ZWdqdr„ ZXdsdt„ ZYdudv„ ZZdwdx„ Z[dydz„ Z\d{d|„ Z]d}d~„ Z^ejH _d¡d€d�„ ƒZ`d‚dƒ„ Zad„d…„ Zbd†d‡„ ZcejH Idˆd‰dŠd‹dŒg¡d�dŽ„ ƒZdd�d�„ ZeejH Idˆd‰dŠd‹dŒg¡d‘d’„ ƒZfd“d”„ ZgejH Id•eeeg¡d–d—„ ƒZhejH Id•eeeg¡d˜d™„ ƒZidšd›„ Zjdœd�„ ZkdždŸ„ Zld d¡„ Zmd¢d£„ Znd¤d¥„ Zod¦d§„ Zpd¨d©„ Zqdªd«„ Zrd¬d­„ Zsd®d¯„ Ztd°d±„ Zud²d³„ ZvdS )´é    N)Úlog)Úunits)Úfits)Ú_testing)ÚCCDData)ÚInverseVarianceÚMissingDataAssociationExceptionÚStdDevUncertaintyÚVarianceUncertainty)ÚTable)ÚNumpyRNGContext)Úget_pkg_data_contentsÚget_pkg_data_filenameÚget_pkg_data_filenames)ÚAstropyWarning)ÚWCSÚFITSFixedWarningéd   é{   )Úsize)é   r   c                 C   s$   |  dt| ƒ¡ |  dt| ƒ¡ dS )zÆ
    Pytest fixture to run a test case with tilde-prefixed paths.

    In the tilde-path case, environment variables will be temporarily
    modified so that '~' resolves to the temp directory.
    ÚHOMEÚUSERPROFILEN)ZsetenvÚstr)Útmp_pathZmonkeypatchÚrequest© r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/nddata/tests/test_ccddata.pyÚhome_is_tmpdir%   s    	r   c                  C   s*   t  ¡ } dddœ}t| tjd�}||_|S )zf
    Return a CCDData object of size DEFAULT_DATA_SIZE x DEFAULT_DATA_SIZE
    with units of ADU.
    é*   znot 42)Zmy_keyZyour_key©Úunit)Ú_random_arrayÚcopyr   ÚuÚaduÚheader)ÚdataZ	fake_metaÚccdr   r   r   Úcreate_ccd_data3   s
    
r)   c                	   C   s    t  t¡� tƒ  W 5 Q R X d S ©N)ÚpytestÚraisesÚ	TypeErrorr   r   r   r   r   Útest_ccddata_empty?   s    r.   c                	   C   s,   t  t¡� tt ddg¡ƒ W 5 Q R X d S )Né   )r+   r,   Ú
ValueErrorr   ÚnpÚzerosr   r   r   r   Útest_ccddata_must_have_unitD   s    r3   c               	   C   s&   t ƒ } t t¡� d | _W 5 Q R X d S r*   )r)   r+   r,   r-   r!   ©Úccd_datar   r   r   Ú'test_ccddata_unit_cannot_be_set_to_noneI   s    r6   c                	   C   s<   t jtdd��$ tdddgdddiddid� W 5 Q R X d S )Nz#.*can't have both header and meta.*©Úmatché   r/   é   Ú )r!   Úmetar&   )r+   r,   r0   r   r   r   r   r   Ú!test_ccddata_meta_header_conflictO   s    r=   c                  C   sB   t ƒ } | jttfkst‚| jtt ks*t‚| jt t¡ks>t‚d S r*   )r)   ÚshapeÚDEFAULT_DATA_SIZEÚAssertionErrorr   Údtyper1   Úfloatr4   r   r   r   Útest_ccddata_simpleT   s    rC   c                  C   s*   t t ddg¡dd�} | jtjks&t‚d S )Nr/   Úelectronr    )r   r1   r2   r!   r$   rD   r@   ©r(   r   r   r   Ú+test_ccddata_init_with_string_electron_unit[   s    rF   c                 C   s¦   t ƒ }t |¡}t |g¡}t| d ƒ}| |¡ tj|tj	d�}|j
ttfksTt‚|jtt ksft‚t |jjtj¡s|t‚|j ¡ D ]\}}|j| |ks†t‚q†d S )Nú
afile.fitsr    )r)   r   Ú
PrimaryHDUÚHDUListr   Úwritetor   Úreadr$   rD   r>   r?   r@   r   r1   Z
issubdtyper'   rA   Zfloatingr&   Úitemsr<   )r   r5   ÚhduÚhdulistÚfilenameÚcdÚkÚvr   r   r   Útest_initialize_from_FITS`   s    

rS   c                 C   sz   t  ddg¡}t |¡}tj ¡ |jd< t| d ƒ}| 	|¡ t
 |¡}|jtjksXt‚t
j|dd�}|jtjksvt‚d S )Nr/   ÚbunitrG   Úphotonr    )r1   r2   r   rH   r$   r%   Ú	to_stringr&   r   rJ   r   rK   r!   r@   rU   )r   Úfake_imgrM   rO   r(   Úccd2r   r   r   Ú-test_initialize_from_fits_with_unit_in_headern   s    


rY   c                 C   sV   t  ddg¡}t |¡}d|jd< t| d ƒ}| |¡ t |¡}|j	t
jksRt‚d S )Nr/   ZADUrT   rG   )r1   r2   r   rH   r&   r   rJ   r   rK   r!   r$   r%   r@   )r   rW   rM   rO   r(   r   r   r   Ú,test_initialize_from_fits_with_ADU_in_header}   s    



rZ   c              	   C   sT   t  t d¡¡}d|jd< t| d ƒ}| |¡ t t	¡� t
 |¡ W 5 Q R X d S )N©r/   r/   zdefinetely-not-a-unitrT   rG   )r   rH   r1   Úonesr&   r   rJ   r+   r,   r0   r   rK   )r   rM   rO   r   r   r   Ú5test_initialize_from_fits_with_invalid_unit_in_headerˆ   s    

r]   c                 C   sT   t  t d¡¡}d|jd< t| d ƒ}| |¡ t |¡}|j	t
jt
j ksPt‚d S )Nr[   zELECTRONS/SrT   rG   )r   rH   r1   r\   r&   r   rJ   r   rK   r!   r$   rD   Úsr@   )r   rM   rO   r(   r   r   r   ÚAtest_initialize_from_fits_with_technically_invalid_but_not_really‘   s    


r_   c                 C   s€   t  d¡ dd¡}t ¡ }t |¡}t ||g¡}t| d ƒ}| |¡ t	j
|dd�}t j |j|¡ |j|j |jks|t‚d S )Né   r/   rG   r%   r    )r1   ÚarangeÚreshaper   rH   ÚImageHDUrI   r   rJ   r   rK   ÚtestingÚassert_array_equalr'   r&   r@   )r   rW   Úhdu1Úhdu2ÚhdusrO   r(   r   r   r   Ú:test_initialize_from_fits_with_data_in_different_extensionš   s    

ri   c           	      C   sÒ   t  ddg¡}t  d¡ dd¡}t ¡ }tj|ddd�}tj|ddd�}t |||g¡}t| d ƒ}| 	|¡ t
j|ddd	�}t j |j|¡ t
j|ddd	�}t j |j|¡ t
j|d
dd	�}t j |j|¡ d S )Nr/   r`   Úfirstr9   )ÚnameÚverÚsecondrG   r%   ©rM   r!   )rm   r9   )r1   r2   ra   rb   r   rH   rc   rI   r   rJ   r   rK   rd   re   r'   )	r   Z	fake_img1Z	fake_img2Zhdu0rf   rg   rh   rO   r(   r   r   r   Ú(test_initialize_from_fits_with_extension¨   s    
ro   c                  C   sD   t ƒ } | j}|  ¡ }d|d jks&t‚|d jd | ¡ ks@t‚d S )NrT   r   )r)   r!   Úto_hdur&   r@   rV   )r5   Zccd_unitrN   r   r   r   Útest_write_unit_to_hdu¼   s
    rq   c              	   C   sp   t ƒ }t| d ƒ}| |¡ t t¡� tj||jdd� W 5 Q R X t t¡� tj||jdd� W 5 Q R X d S )Nú	test.fitsT)r!   Zdo_not_scale_image_data)r!   Z
scale_back)	r)   r   Úwriter+   r,   r-   r   rK   r!   )r   r5   rO   r   r   r   Ú2test_initialize_from_FITS_bad_keyword_raises_errorÄ   s    
rt   c                 C   sB   t ƒ }t| d ƒ}| |¡ tj||jd�}tj |j	|j	¡ d S )Nrr   r    )
r)   r   rs   r   rK   r!   r1   rd   re   r'   ©r   r5   rO   Úccd_diskr   r   r   Útest_ccddata_writerÑ   s
    
rw   c              	   C   sž   t ƒ }t| d ƒ}|j|dd� t |¡�}t|ƒdks<t‚W 5 Q R X t| d ƒ}|j|dd� t |¡�*}t|ƒdks|t‚t|d tjƒs�t‚W 5 Q R X d S )Nrr   F©Zas_image_hdur9   z
test2.fitsTr/   )	r)   r   rs   r   ÚopenÚlenr@   Ú
isinstancerc   )r   r5   rO   rh   r   r   r   Útest_ccddata_writer_as_imagehduÚ   s    r|   c                  C   sJ   t ƒ } d}d| j|< | ¡ | jks&t‚| ¡ | jks8t‚|| jksFt‚d S )NZSoMeKEYé
   )r)   r<   Úlowerr@   Úupper)r5   Úkeyr   r   r   Ú#test_ccddata_meta_is_case_sensitiveè   s    
r�   c                  C   s&   t ƒ } ddi| _t| jtjƒr"t‚d S )NÚOBSERVERúEdwin Hubble)r)   r<   r{   r   ÚHeaderr@   r4   r   r   r   Ú$test_ccddata_meta_is_not_fits_headerñ   s    
r…   c                 C   s˜   t ƒ }t |¡}t d|j ¡}t |¡}| |¡ t| d ƒ}| |¡ tj	|t
jd�}tj |j|j¡ tj	|dt
jd�}tj |jd|j ¡ d S )Nr/   rG   r    r9   rn   )r)   r   rH   r'   rI   Úappendr   rJ   r   rK   r$   rD   r1   rd   re   )r   r5   rM   rg   rN   rO   rP   r   r   r   Útest_fromMEF÷   s    



r‡   c                  C   sX   t j ¡ } d| d< d| d< tt d¡| tjd�}|jd dksBt	‚|jd dksTt	‚d S )Nrƒ   ÚobserverÚ3600Úexptime©é   rŒ   ©r<   r!   r‚   ©
r   r&   r„   r   r1   r\   r$   rD   r<   r@   ©ÚhdrÚd1r   r   r   Útest_metafromheader  s    
r’   c                  C   s6   dddœ} t t d¡| tjd�}|jd dks2t‚d S )Nrƒ   i  )r‚   ZEXPTIMEr‹   r�   r‚   )r   r1   r\   r$   rD   r<   r@   )Zdicr‘   r   r   r   Útest_metafromdict  s    
r“   c                  C   s\   t j ¡ } d| d< d| d< tt d¡tjd�}| |_|jd dksFt	‚|jd dksXt	‚d S )Nrƒ   rˆ   r‰   rŠ   r‹   r    r‚   rŽ   r�   r   r   r   Útest_header2meta  s    
r”   c               	   C   s4   d} t  t¡� tt d¡| tjd� W 5 Q R X d S )Nzthis is not a valid headerr‹   r�   )r+   r,   r-   r   r1   r\   r$   r%   )r�   r   r   r   Útest_metafromstring_fail"  s    r•   c               	   C   s&   t ƒ } t t¡� d| _W 5 Q R X d S )Nr}   )r)   r+   r,   r-   Úuncertaintyr4   r   r   r   Ú)test_setting_bad_uncertainty_raises_error(  s    r—   c                  C   s>   t ƒ } d | _t t | j¡¡}| ¡ | _tj | jj	|¡ d S r*   )
r)   r–   r1   ÚsqrtÚabsr'   r#   rd   re   Úarray)r5   Zfake_uncertaintyr   r   r   Ú#test_setting_uncertainty_with_array/  s
    
r›   c               	   C   s0   t ƒ } t t¡� t ddg¡| _W 5 Q R X d S )Nr:   r`   )r)   r+   r,   r0   r1   r2   r–   r4   r   r   r   Ú1test_setting_uncertainty_wrong_shape_raises_error7  s    rœ   c                  C   sl   t ƒ } ddi| _|  ¡ }t|tjƒs(t‚| j ¡ D ]\}}|d j| |ks2t‚q2t	j
 |d j| j¡ d S )Nrˆ   rƒ   r   )r)   r<   rp   r{   r   rI   r@   rL   r&   r1   rd   re   r'   )r5   Úfits_hdulistrQ   rR   r   r   r   Útest_to_hdu=  s    
rž   c                  C   sJ   t ƒ } | jdd�}t|d tjƒs&t‚| jdd�}t|d tjƒsFt‚d S )NFrx   r   T)r)   rp   r{   r   rH   r@   rc   )r5   r�   r   r   r   Útest_to_hdu_as_imagehduG  s
    rŸ   c                  C   sD   t ƒ } |  ¡ }tj |j| j¡ |j| jks0t‚|j| jks@t‚d S r*   )	r)   r#   r1   rd   re   r'   r!   r@   r<   )r5   Zccd_copyr   r   r   Ú	test_copyO  s
    r    zoperation,affects_uncertainty)ÚmultiplyT)ÚdivideTÚoperandg       @r/   Úwith_uncertaintyTFc           
      C   s@  t ƒ }|rtt |¡ƒ|_t||ƒ}tt|ƒ}|| ƒ}||k	sBt‚t|tƒsPt‚|jd ksjt|jtƒsjt‚z
| j	}W n t
k
rŒ   | }Y nX tj |j||j|ƒ¡ |rä|rÌtj |jj||jj|ƒ¡ qòtj |jj|jj¡ n|jd ksòt‚t| tjƒ�r*|d|j d| j ƒj}	|j|	k�s<t‚n|j|jk�s<t‚d S )Nr9   )r)   r	   r1   Ú	ones_liker–   Úgetattrr@   r{   r   ÚvalueÚAttributeErrorrd   re   r'   rš   r$   ÚQuantityr!   )
r£   r¤   Ú	operationÚaffects_uncertaintyr5   ÚmethodÚ	np_methodÚresultÚop_valueZexpected_unitr   r   r   Útest_mult_div_overloadW  s@    

 ÿ

þ ÿr°   )ÚaddF)ÚsubtractFzoperand,expect_failurec           
   	   C   sb  t ƒ }|rtt |¡ƒ|_t||ƒ}tt|ƒ}|rTt |¡� || ƒ}W 5 Q R X d S || ƒ}||k	sht‚t	|t
ƒsvt‚|jd ks�t	|jtƒs�t‚z
| j}	W n tk
r²   | }	Y nX tj |j||j|	ƒ¡ |�r|rôtj |jj||jj|	ƒ¡ ntj |jj|jj¡ n|jd k�st‚t	| tjƒ�rL|j|jk�rF|j| jk�s^t‚n|j|jk�s^t‚d S r*   )r)   r	   r1   r¥   r–   r¦   r+   r,   r@   r{   r   r§   r¨   rd   re   r'   rš   r$   r©   r!   )
r£   Zexpect_failurer¤   rª   r«   r5   r¬   r­   r®   r¯   r   r   r   Útest_add_sub_overload�  sF    

 ÿ

þ ÿ"r³   c               	   C   sŠ   t ƒ } t t¡� |  d¡ W 5 Q R X t t¡� |  d¡ W 5 Q R X t t¡� |  d¡ W 5 Q R X t t¡� |  d¡ W 5 Q R X d S )NÚfive)r)   r+   r,   r-   r¡   r¢   r±   r²   r4   r   r   r   Útest_arithmetic_overload_failsË  s    rµ   c                  C   sv   t t d¡dd�} | j| d d�jd ks*t‚| j| d d�jd ksBt‚| j| d d�jd ksZt‚| j| d d�jd ksrt‚d S )N©r}   r}   r;   r    ©Zcompare_wcs)	r   r1   r\   r±   Úwcsr@   r²   r¡   r¢   rE   r   r   r   Útest_arithmetic_no_wcs_compareÚ  s
    r¹   c                  C   s¤   dd„ } t jdd�\}}tt d¡d|d�}tt d¡d|d�}t  |j|| d�j|¡ t  |j|| d�j|¡ t  |j	|| d�j|¡ t  |j
|| d�j|¡ d S )	Nc                 S   s   dS )NTr   ©Ú_Ú__r   r   r   Úreturn_trueã  s    z5test_arithmetic_with_wcs_compare.<locals>.return_truer/   ©Znaxisr¶   r;   ©r!   r¸   r·   )Ú
nd_testingZcreate_two_equal_wcsr   r1   r\   Úassert_wcs_seem_equalr±   r¸   r²   r¡   r¢   )r½   Zwcs1Zwcs2Úccd1rX   r   r   r   Ú test_arithmetic_with_wcs_compareâ  s"     ÿ ÿ ÿrÃ   c               	   C   sÈ   dd„ } t t d¡dtƒ d�}t t d¡dtƒ d�}t t¡� |j|| d� W 5 Q R X t t¡� |j|| d� W 5 Q R X t t¡� |j	|| d� W 5 Q R X t t¡� |j
|| d� W 5 Q R X d S )Nc                 S   s   dS )NFr   rº   r   r   r   Úreturn_falseö  s    z;test_arithmetic_with_wcs_compare_fail.<locals>.return_falser¶   r;   r¿   r·   )r   r1   r\   r   r+   r,   r0   r±   r²   r¡   r¢   )rÄ   rÂ   rX   r   r   r   Ú%test_arithmetic_with_wcs_compare_failõ  s    rÅ   c                  C   sŽ  t ƒ } tt | ¡ƒ| _|  ¡ }|  |¡}t|jƒdks:t	‚tj
 |jd| j ¡ tj
 |jjt d¡| jj ¡ |  |¡}t|jƒdksŒt	‚tj
 |jd| j ¡ tj
 |jjt d¡| jj ¡ |  |¡}t|jƒdksÞt	‚tj
 |j| jd ¡ t d¡t | j¡ | jj }tj
 |jj|¡ |  |¡}t|jƒdk�sBt	‚tj
 |jt | j¡¡ t d¡t | j¡ | jj }tj
 |jj|¡ d S )Nr   r/   )r)   r	   r1   r¥   r–   r#   r±   rz   r<   r@   rd   re   r'   Zassert_array_almost_equal_nulprš   r˜   r²   r¡   r™   Zassert_allcloser¢   )r5   r£   r®   Zexpected_uncertaintyr   r   r   Ú(test_arithmetic_overload_ccddata_operand  s:    
 ÿ
 ÿ
ÿ
ÿrÆ   c                  C   s*  t  dddg¡tj } t  dddg¡tj }t| ƒ}| |¡}t j |j	t  | |¡j
¡ |jt  | |¡jkspt‚| |¡}t j |j	t  | |¡j
¡ |jt  | |¡jks¬t‚| |¡}t j |j	t  | |¡j
¡ |jt  | |¡jksèt‚| |¡}t j |j	t  | |¡j
¡ |jt  | |¡jk�s&t‚d S )Nr9   r/   r:   )r1   rš   r$   ÚmÚcmr   r±   rd   Zassert_array_almost_equalr'   r§   r!   r@   r²   r¡   r¢   )ÚaÚbZccddataÚresr   r   r   Ú(test_arithmetic_overload_differing_units(  s    



rÌ   c               	   C   sz   t t d¡dd�} |  t d¡¡}tj |jdddggd ¡ t t d¡dd�} t 	t
¡� |  t d¡¡ W 5 Q R X d S )N©r:   r:   r;   r    r:   r9   r/   r%   )r   r1   r\   r±   ra   rd   re   r'   r+   r,   r0   ©r(   rË   r   r   r   Útest_arithmetic_add_with_array?  s    rÏ   c               	   C   sz   t t d¡dd�} |  t d¡¡}tj |jdddggd ¡ t t d¡dd�} t 	t
¡� |  t d¡¡ W 5 Q R X d S )	NrÍ   r;   r    r:   r9   r   éÿÿÿÿr%   )r   r1   r\   r²   ra   rd   re   r'   r+   r,   r0   rÎ   r   r   r   Ú#test_arithmetic_subtract_with_arrayI  s    rÑ   c                  C   s\   t t d¡d tjd�} |  t d¡d ¡}tj |jdddggd ¡ |j	| j	ksXt
‚d S )NrÍ   r:   r    r/   é   )r   r1   r\   r$   rÇ   r¡   rd   re   r'   r!   r@   rÎ   r   r   r   Ú#test_arithmetic_multiply_with_arrayS  s    rÓ   c                  C   sX   t t d¡tjd�} |  t d¡d ¡}tj |jdddggd ¡ |j	| j	ksTt
‚d S )NrÍ   r    r/   g      à?r:   )r   r1   r\   r$   rÇ   r¢   rd   re   r'   r!   r@   rÎ   r   r   r   Ú!test_arithmetic_divide_with_arrayZ  s    rÔ   c                 C   sŒ   t  ddg¡}t |¡}d|jd< d|jd< d|jd< t|jd ƒdksLt‚t| d ƒ}| |¡ t	j
|dd	�}|jd |jd ksˆt‚d S )
Nr/   ÚoneÚhistoryÚtwoÚthreer:   ú	temp.fitsr%   r    )r1   r2   r   rH   r&   rz   r@   r   rJ   r   rK   )r   rW   rM   Ztmp_fileZccd_readr   r   r   Ú1test_history_preserved_if_metadata_is_fits_headera  s    




rÚ   c              	   C   sb   t ƒ }t| d ƒ}| |¡ t d¡ d}t ¡ �&}tj||d�}||d jksTt	‚W 5 Q R X d S )NrÙ   ÚINFOrU   r    r   )
r)   r   rs   r   ÚsetLevelZlog_to_listr   rK   Úmessager@   )r   r5   ÚtmpfileZexplicit_unit_nameZlog_listr»   r   r   r   Ú(test_infol_logged_if_unit_in_fits_headero  s    


rß   c                 C   s°  t ƒ }t| d ƒ}tdd�}t |j¡d |j_t ddg¡|j_ddg|j_	dd	g|j_
|j d
g¡ | ¡ d j|_|jj| ¡ dd� | |¡ t|jƒ}t |¡}|jdk	s¸t‚|jj|jksÊt‚| ¡ d }t|jƒ|ksèt‚t|j|dd�}| ¡ d }| ¡ }	|	 ¡ D ]<}
|
dk�r&�q|
|jk�s6t‚|j|
 |	|
 k�st‚�q|jj jd9  _| ¡ d }|jd |jjjd k�sŽt‚|jd |jjjd k�s¬t‚dS )a$  
    Check that WCS attribute gets added to header, and that if a CCDData
    object is created from a FITS file with a header, and the WCS attribute
    is modified, then the CCDData object is turned back into an hdu, the
    WCS object overwrites the old WCS information in the header.
    rÙ   r/   r¾   gNñ¸¨±¿gNñ¸¨±?r   i¦ÿÿÿzRA---AIRzDEC--AIR)r/   r9   g     €F@F)Z	useblanksNr%   ©r¸   r!   )r;   ÚCOMMENTZHISTORYZCDELT1ZCDELT2r9   )r)   r   r   r1   rš   r>   r¸   ÚcrpixZcdeltZcrvalÚctypeZset_pvrp   r&   ÚextendÚ	to_headerrs   rz   r   rK   r@   r'   Úkeys)r   r5   rÞ   r¸   Zoriginal_header_lengthÚccd_newZccd_new_hduZccd_wcs_not_in_headerrM   Ú
wcs_headerrQ   Zccd_new_hdu_mod_wcsr   r   r   Útest_wcs_attributez  s:    




ré   c               	   C   s˜   ddl m}  t| ƒ}tdƒ}t |¡}tjtdd�� |j	 
¡ }W 5 Q R X t|ƒt|jƒ| @ rdt‚tdƒ}tjtdd�� tj|dd	�}W 5 Q R X d
S )zt
    Test, for the file included with the nddata tests, that WCS keywords are
    properly removed from header.
    r   )Ú_KEEP_THESE_KEYWORDS_IN_HEADERúdata/sip-wcs.fitsz,Some non-standard WCS keywords were excludedr7   z+../../io/fits/tests/data/o4sp040b0_raw.fitsz'unitfix' made the changeÚcountr    N)Úastropy.nddata.ccddatarê   Úsetr   r   rK   r+   Zwarnsr   r¸   rå   r<   r@   r   )rê   ÚkeepersÚ	data_filer(   rè   Z
data_file1r   r   r   Ú%test_wcs_keywords_removed_from_header·  s    
 ÿrñ   c               	   C   sh   t dƒ} ddg}t | ¡�"}|D ]}||d jks t‚q W 5 Q R X t | ¡}|D ]}||jksPt‚qPd S )Nrë   ZA_0_0ZB_0_1r   )r   r   ry   r&   r@   r   rK   )rð   Z	test_keysrM   r€   r(   r   r   r   Ú)test_wcs_SIP_coefficient_keywords_removedÎ  s    
rò   Úignorec                  C   s2  ddl m} m}m}m} t| ƒ}tddd�}|D ]ü}d|ks0d|ks0d|ks0d	|krVq0t|ƒ}tj	 
|¡}t|ƒ}	|	jd
d�}
||ƒ\}}|jd
d�}t|ƒt|ƒ| @ r®t‚|| }t|ƒ}||@ rÔ||@ rèt‚n||@ rè||@ rèt‚| ¡ D ]:\}}t|tƒ�r|
| |k�s*t‚qðtj |
| |¡ qðq0dS )zÙ
    Test, for the WCS test files, that keyword removal works as
    expected. Those cover a much broader range of WCS types than
    test_wcs_keywords_removed_from_header.

    Includes regression test for #8597
    r   )rê   Ú_CDsÚ_generate_wcs_and_update_headerÚ_PCsz../../wcs/tests/dataz*.hdr)ÚpatternÚinvalidZnonstandardZsegfaultzchandra-pixlist-wcsT)ZrelaxN)rí   rê   rô   rõ   rö   rî   r   r   r   r„   Ú
fromstringr   rå   r@   rL   r{   r   r1   rd   Zassert_almost_equal)rê   rô   rõ   rö   rï   Zwcs_headersr�   Zheader_stringr&   r¸   Zheader_from_wcsZ
new_headerZnew_wcsZnew_wcs_headerZfinal_headerZfinal_header_setrQ   rR   r   r   r   Ú+test_wcs_keyword_removal_for_wcs_test_filesë  s<    	ÿþýürú   c                 C   sl   t  d¡}tjj|dd�}t tjt d¡|d�g¡}t	| d ƒ}| 
|¡ tj|dd�}|jd ksht‚d S )	Na<  
    SIMPLE  =                    T / Fits standard
    BITPIX  =                   16 / Bits per pixel
    NAXIS   =                    2 / Number of axes
    NAXIS1  =                 1104 / Axis length
    NAXIS2  =                 4241 / Axis length
    CRVAL1  =         164.98110962 / Physical value of the reference pixel X
    CRVAL2  =          44.34089279 / Physical value of the reference pixel Y
    CRPIX1  =                -34.0 / Reference pixel in X (pixel)
    CRPIX2  =               2041.0 / Reference pixel in Y (pixel)
    CDELT1  =           0.10380000 / X Scale projected on detector (#/pix)
    CDELT2  =           0.10380000 / Y Scale projected on detector (#/pix)
    CTYPE1  = 'RA---TAN'           / Pixel coordinate system
    CTYPE2  = 'WAVELENGTH'         / Pixel coordinate system
    CUNIT1  = 'degree  '           / Units used in both CRVAL1 and CDELT1
    CUNIT2  = 'nm      '           / Units used in both CRVAL2 and CDELT2
    CD1_1   =           0.20760000 / Pixel Coordinate translation matrix
    CD1_2   =           0.00000000 / Pixel Coordinate translation matrix
    CD2_1   =           0.00000000 / Pixel Coordinate translation matrix
    CD2_2   =           0.10380000 / Pixel Coordinate translation matrix
    C2YPE1  = 'RA---TAN'           / Pixel coordinate system
    C2YPE2  = 'DEC--TAN'           / Pixel coordinate system
    C2NIT1  = 'degree  '           / Units used in both C2VAL1 and C2ELT1
    C2NIT2  = 'degree  '           / Units used in both C2VAL2 and C2ELT2
    RADECSYS= 'FK5     '           / The equatorial coordinate system
    Ú
)Úsep)i‘  iP  ©r&   rG   r%   r    )ÚtextwrapÚdedentr   r„   rù   rI   rH   r1   r\   r   rJ   r   rK   r¸   r@   )r   Zhdr_txt_example_WCSr�   ÚhdulrO   r(   r   r   r   Útest_read_wcs_not_creatable*  s    ÿ
r  c                  C   s,   t ƒ } ddi}t| |d�}|j|ks(t‚d S )NZObserverZHubblerý   )r)   r   r<   r@   )r5   rÉ   r(   r   r   r   Útest_headerR  s    r  c                  C   s2   t ƒ } tdd�}|| _|  d¡}t |j|¡ d S )Nr/   r¾   g      ð?)r)   r   r¸   r¡   rÀ   rÁ   )r5   r¸   r®   r   r   r   Útest_wcs_arithmeticY  s
    

r  rª   r¡   r¢   r±   r²   c                 C   sN   t ƒ }| ¡ }tdd�|_t|| ƒ}||ƒ}t |j|j¡ |jd ksJt‚d S ©Nr/   r¾   )r)   r#   r   r¸   r¦   rÀ   rÁ   r@   ©rª   r5   Z	ccd_data2r¬   r®   r   r   r   Útest_wcs_arithmetic_ccda  s    
r  c               	   C   sÂ   t dƒ} dd„ }t | ¡}t | ¡�}||d jƒ}W 5 Q R X t|ƒsJt‚| ¡ }||d jƒ}t|ƒslt‚|jdd�}||d jƒ}t	|ƒr’t‚|d jd dks¨t‚|d jd	 d
ks¾t‚dS )zc
    Check whether the ctypes RA---TAN-SIP and DEC--TAN-SIP survive
    a roundtrip unchanged.
    rë   c                    s    dddœ}‡ fdd„|  ¡ D ƒS )NzRA---TAN-SIPzDEC--TAN-SIP)ÚCTYPE1ÚCTYPE2c                    s   g | ]\}}ˆ | |k‘qS r   r   )Ú.0rQ   rR   rý   r   r   Ú
<listcomp>v  s     zCtest_wcs_sip_handling.<locals>.check_wcs_ctypes.<locals>.<listcomp>)rL   )r&   Zexpected_wcs_ctypesr   rý   r   Úcheck_wcs_ctypess  s    
z/test_wcs_sip_handling.<locals>.check_wcs_ctypesr   F)Z	wcs_relaxr  zRA---TANr  zDEC--TANN)
r   r   rK   r   ry   r&   Úallr@   rp   Úany)rð   r  Zccd_originalÚrawZ
good_ctyperç   Zccd_no_relaxr   r   r   Útest_wcs_sip_handlingl  s    
r  c                 C   sB   t ƒ }| ¡ }|jdk|_t|| ƒ}||ƒ}tj |j|j¡ d S )Nr   )r)   r#   r'   Úmaskr¦   r1   rd   Zassert_equalr  r   r   r   Útest_mask_arithmetic_ccdŽ  s    
r  c                 C   sV   t ƒ }|jdk|_t| d ƒ}| |¡ t |¡}|jd k	s@t‚tj	 
|j|j¡ d S ©Nr}   rG   )r)   r'   r  r   rs   r   rK   r@   r1   rd   re   ©r   r5   rO   Ú	ccd_afterr   r   r   Ú/test_write_read_multiextensionfits_mask_default˜  s    

r  Úuncertainty_typec                 C   sp   t ƒ }||jd ƒ|_t| d ƒ}| |¡ t |¡}|jd k	sDt‚t|jƒ|ksVt‚t	j
 |jj|jj¡ d S r  ©r)   r'   r–   r   rs   r   rK   r@   Útyper1   rd   re   rš   ©r   r  r5   rO   r  r   r   r   Ú6test_write_read_multiextensionfits_uncertainty_default£  s    

 ÿr  c                 C   sx   t ƒ }||jd ƒ|_t| d ƒ}|j|dd� tj|dd�}|jd k	sLt‚t|jƒ|ks^t‚t	j
 |jj|jj¡ d S )Nr}   rG   ZBlah)Zkey_uncertainty_typer  r  r   r   r   ÚHtest_write_read_multiextensionfits_uncertainty_different_uncertainty_key´  s     ÿr  c                 C   sh   t ƒ }|jdk|_t|jd ƒ|_t| d ƒ}|j|d d d� t |¡}|jd ksVt	‚|jd ksdt	‚d S )Nr}   rG   ©Zhdu_maskZhdu_uncertainty)
r)   r'   r  r	   r–   r   rs   r   rK   r@   r  r   r   r   Ú&test_write_read_multiextensionfits_notÇ  s    
r  c                 C   s¼   t ƒ }|jdk|_t|jd ƒ|_t| d ƒ}|j|ddd� t |¡}|jd ksVt	‚|jd ksdt	‚tj|ddd�}|jd k	s‚t	‚|jd k	s�t	‚t
j |j|j¡ t
j |jj|jj¡ d S )Nr}   rG   ZFunZNoFunr  )r)   r'   r  r	   r–   r   rs   r   rK   r@   r1   rd   re   rš   r  r   r   r   Ú3test_write_read_multiextensionfits_custom_ext_namesÓ  s     
 ÿr  c                 C   s|   d}t  ||g¡}|dk}t  |¡}t|||dd�}| ¡ }|d jd= t| d ƒ}| |¡ t |¡}t	|j
tƒsxt‚d S )Nr`   gÍÌÌÌÌÌì?r%   )r'   r  r–   r!   r/   ZUTYPEzold_ccddata_mef.fits)r1   r2   r˜   r   rp   r&   r   rJ   rK   r{   r–   r	   r@   )r   r   r'   r  Úuncertr(   rN   Ú	file_namer   r   r   Ú&test_read_old_style_multiextensionfitsê  s    	


r!  c                  C   s(   t ƒ } tdd�}|| _| j|ks$t‚d S r  )r)   r   r¸   r@   )r5   r¸   r   r   r   Útest_wcs  s    
r"  c                 C   sX   t ƒ }dddg}|D ]>}t| d|› � ƒ}| |¡ t |¡}|j|jk ¡ st‚qd S )NÚfitr   Zftsztest.)r)   r   rs   r   rK   r'   r  r@   )r   r5   Zsupported_extensionsÚextÚpathZ	from_diskr   r   r   Ú+test_recognized_fits_formats_for_read_write  s    


r&  c                	   C   s*   t  t¡� tt d¡ƒj W 5 Q R X d S )Nr¶   )r+   r,   r   r	   r1   r\   Úparent_nddatar   r   r   r   Ú2test_stddevuncertainty_compat_descriptor_no_parent  s    r(  c                  C   s>   t t d¡dd�} tt d¡ƒ}| |_|j| ks4t‚d |_d S )Nr¶   r;   r    )r   r1   r\   r	   Z_parent_nddatar'  r@   )r(   r  r   r   r   Ú3test_stddevuncertainty_compat_descriptor_no_weakref  s
    r)  c                 C   s~   t t d¡ dd¡ƒ}t d¡}tjt ¡ t | ¡ ¡t 	|¡gd�}t
| d ƒ}| |¡ tj|dd�}|jjdkszt‚d S )	Nr}   rŒ   r/   r‹   )rh   ztable_image.fitsr%   r    )r   r1   r\   rb   r   rI   rH   ZTableHDUZas_arrayrc   r   rJ   r   rK   r'   r>   r@   )r   ZtblZimgr   rO   r(   r   r   r   Útest_read_returns_image*  s    
ÿ
r*  c                  C   s‚   t dd�} d| j_tt d¡| dd�}|dd…dd…f }| ¡ }t|tj	ƒsRt
‚|d jd d	ksht
‚|d jd
 d	ks~t
‚d S )Nr/   r¾   r¶   Zpixelrà   éþÿÿÿr   ZCRPIX1é   ZCRPIX2)r   r¸   râ   r   r1   r\   rp   r{   r   rI   r@   r&   )r¸   r(   Ztrimmedr   r   r   r   Útest_sliced_ccdata_to_hdu:  s    
r-  c                 C   sT   t ƒ }tj dd¡}| |¡ tj||jd�}tj	 
|j|j¡ tj |¡rPt‚d S )Nú~rr   r    )r)   Úosr%  Újoinrs   r   rK   r!   r1   rd   re   r'   Úexistsr@   )r   r5   rO   rv   r   r   r   Útest_read_write_tilde_pathsE  s    
r2  c               	   C   s`   t  ¡ } tt ¡ tj| d�}|j| k ¡ s.t‚t	j
tdd�� tt ¡ tjdd� W 5 Q R X d S )N)r!   ÚpsfúThe psf must be a numpy array.r7   Z	something©Ú_random_psfr#   r   r"   r$   r%   r3  r  r@   r+   r,   r-   ©r3  r(   r   r   r   Útest_ccddata_with_psfS  s
    r8  c               	   C   sV   t  ¡ } tt ¡ tjd�}| |_|j| k ¡ s2t‚t	j
tdd�� d|_W 5 Q R X d S )Nr    r4  r7   rŒ   r5  r7  r   r   r   Útest_psf_setter]  s    r9  c                 C   sÂ   t ƒ }t|_| d }| |¡ t |¡}tj |j	|j	¡ tj |j|j¡ | d }|j|dd� t |¡}tj |j	|j	¡ |jdksŒt
‚tj|dd�}tj |j	|j	¡ tj |j|j¡ dS )zATest that we can round-trip a CCDData with an attached PSF image.ztest_write_read_psf.fitsztest_write_read_psf_hdu.fitsZPSFOTHER)Zhdu_psfN)r)   r6  r3  rs   r   rK   r1   rd   re   r'   r@   ru   r   r   r   Útest_write_read_psfh  s    


r:  )wr/  rþ   Únumpyr1   r+   Zastropyr   r   r$   Z
astropy.ior   Zastropy.nddatar   rÀ   rí   r   Zastropy.nddata.nduncertaintyr   r   r	   r
   Zastropy.tabler   Zastropy.utilsr   Zastropy.utils.datar   r   r   Zastropy.utils.exceptionsr   Zastropy.wcsr   r   r?   ÚrandomÚnormalr"   r6  Zfixturer   r)   r.   r3   r6   r=   rC   rF   rS   rY   rZ   r]   r_   ri   ro   rq   rt   rw   r|   r�   r…   r‡   r’   r“   r”   r•   r—   r›   rœ   rž   rŸ   r    ÚmarkZparametrizeZdimensionless_unscaledrU   r%   r°   Z
UnitsErrorr³   rµ   r¹   rÃ   rÅ   rÆ   rÌ   rÏ   rÑ   rÓ   rÔ   rÚ   rß   ré   rñ   rò   Úfilterwarningsrú   r  r  r  r  r  r  r  r  r  r  r  r!  r"  r&  r(  r)  r*  r-  r2  r8  r9  r:  r   r   r   r   Ú<module>   s  

				

þþýþ(þþýþ,#

=

>(

"
	 ÿ
 ÿ

