
    IR-e$                        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          5  ej#        $                    e"e"g          Z%ej#        $                    d          Z&ddd           n# 1 swxY w Y   ej'        d             Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d  Z7d! Z8d" Z9d# Z:d$ Z;d% Z<d& Z=d' Z>d( Z?d) Z@d* ZAd+ ZBd, ZCd- ZDd. ZEd/ ZFd0 ZGejH        I                    d1d2d3g          ejH        I                    d4d5d6ejJ        z  d6ejK        z  ejL        z  g          ejH        I                    d7d8d9g          d:                                     ZMejH        I                    d1d;d<g          ejH        I                    d=d5ejN        fd6ejJ        z  ejN        fd6ejL        z  d9fg          ejH        I                    d7d8d9g          d>                                     ZOd? ZPd@ ZQdA ZRdB ZSdC ZTdD ZUdE ZVdF ZWdG ZXdH ZYdI ZZdJ Z[dK Z\dL Z]dM Z^ejH        _                    dN          dO             Z`dP ZadQ ZbdR ZcejH        I                    dSg dT          dU             ZddV ZeejH        I                    dSg dT          dW             ZfdX ZgejH        I                    dYeeeg          dZ             ZhejH        I                    dYeeeg          d[             Zid\ Zjd] Zkd^ Zld_ Zmd` Znda Zodb Zpdc Zqdd Zrde Zsdf Ztdg Zudh ZvdS )i    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FITSFixedWarningd   {   )size)   r   c                     |                     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)setenvstr)tmp_pathmonkeypatchrequests      Alib/python3.11/site-packages/astropy/nddata/tests/test_ccddata.pyhome_is_tmpdirr!   %   sB     vs8}}---}c(mm44444    c                      t                                           } ddd}t          | t          j                  }||_        |S )zf
    Return a CCDData object of size DEFAULT_DATA_SIZE x DEFAULT_DATA_SIZE
    with units of ADU.
    *   znot 42)my_keyyour_keyunit)_random_arraycopyr   uaduheader)data	fake_metaccds      r    create_ccd_datar1   3   sB    
 D844I
$QU
#
#
#CCJJr"   c                      t          j        t                    5  t                       d d d            d S # 1 swxY w Y   d S N)pytestraises	TypeErrorr    r"   r    test_ccddata_emptyr8   ?   s    	y	!	!  			                 s   6::c                      t          j        t                    5  t          t	          j        ddg                     d d d            d S # 1 swxY w Y   d S )N   )r4   r5   
ValueErrorr   npzerosr7   r"   r    test_ccddata_must_have_unitr>   D   s    	z	"	" " "!Q  !!!" " " " " " " " " " " " " " " " " "s   $AAAc                      t                      } t          j        t                    5  d | _        d d d            d S # 1 swxY w Y   d S r3   )r1   r4   r5   r6   r(   ccd_datas    r    'test_ccddata_unit_cannot_be_set_to_nonerB   I   s      H	y	!	!                      =AAc                      t          j        t          d          5  t          g ddddiddi           d d d            d S # 1 swxY w Y   d S )Nz#.*can't have both header and meta.*match   r:       rH   r:   )r(   metar-   )r4   r5   r;   r   r7   r"   r    !test_ccddata_meta_header_conflictrL   O   s    	z)N	O	O	O @ @			!QA????@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @s   AA
Ac                      t                      } | j        t          t          fk    sJ | j        t          t          z  k    sJ | j        t          j        t                    k    sJ d S r3   )r1   shapeDEFAULT_DATA_SIZEr   dtyper<   floatr@   s    r    test_ccddata_simplerR   T   sb      H>/1BCCCCC=-0AAAAAA>RXe__,,,,,,r"   c                  z    t          t          j        ddg          d          } | j        t          j        u sJ d S )Nr:   electronr'   )r   r<   r=   r(   r+   rT   r0   s    r    +test_ccddata_init_with_string_electron_unitrV   [   s=    
"(Aq6""
4
4
4C8qz!!!!!!r"   c                 "   t                      }t          j        |          }t          j        |g          }t	          | dz            }|                    |           t          j        |t          j	                  }|j
        t          t          fk    sJ |j        t          t          z  k    sJ t          j        |j        j        t          j                  sJ |j                                        D ]\  }}|j        |         |k    sJ d S )N
afile.fitsr'   )r1   r   
PrimaryHDUHDUListr   writetor   readr+   rT   rN   rO   r   r<   
issubdtyper.   rP   floatingr-   itemsrK   )r   rA   hduhdulistfilenamecdkvs           r    test_initialize_from_FITSrf   `   s      H
/(
#
#ClC5!!G8l*++HOOH	hQZ	0	0	0B8)+<=====7'*;;;;;;=44444
  ""  1wqzQ r"   c                    t          j        ddg          }t          j        |          }t          j                                        |j        d<   t          | dz            }|	                    |           t          j        |          }|j        t          j        u sJ t          j        |d          }|j        t          j        u sJ d S )Nr:   bunitrX   photonr'   )r<   r=   r   rY   r+   r,   	to_stringr-   r   r[   r   r\   r(   ri   )r   fake_imgr`   rb   r0   ccd2s         r    -test_initialize_from_fits_with_unit_in_headerrm   n   s    xAH
/(
#
#C%//++CJw8l*++HKK
,x
 
 C8qu <x000D9      r"   c                    t          j        ddg          }t          j        |          }d|j        d<   t          | dz            }|                    |           t          j        |          }|j	        t          j        u sJ d S )Nr:   ADUrh   rX   )r<   r=   r   rY   r-   r   r[   r   r\   r(   r+   r,   )r   rk   r`   rb   r0   s        r    ,test_initialize_from_fits_with_ADU_in_headerrp   }   s~    xAH
/(
#
#CCJw8l*++HKK
,x
 
 C8qur"   c                 @   t          j        t          j        d                    }d|j        d<   t          | dz            }|                    |           t          j        t                    5  t          j        |           d d d            d S # 1 swxY w Y   d S )Nr:   r:   zdefinetely-not-a-unitrh   rX   )r   rY   r<   onesr-   r   r[   r4   r5   r;   r   r\   )r   r`   rb   s      r    5test_initialize_from_fits_with_invalid_unit_in_headerrt      s    
/"'&//
*
*C1CJw8l*++HKK	z	"	"  X                 s   1BBBc                 $   t          j        t          j        d                    }d|j        d<   t          | dz            }|                    |           t          j        |          }|j	        t          j        t          j        z  k    sJ d S )Nrr   zELECTRONS/Srh   rX   )r   rY   r<   rs   r-   r   r[   r   r\   r(   r+   rT   s)r   r`   rb   r0   s       r    Atest_initialize_from_fits_with_technically_invalid_but_not_reallyrw      sz    
/"'&//
*
*C'CJw8l*++HKK
,x
 
 C8qzAC'''''''r"   c                    t          j        d                              dd          }t          j                    }t          j        |          }t          j        ||g          }t          | dz            }|                    |           t          j
        |d          }t           j                            |j        |           |j        |j        z   |j        k    sJ d S )N   r:   rX   r,   r'   )r<   arangereshaper   rY   ImageHDUrZ   r   r[   r   r\   testingassert_array_equalr.   r-   )r   rk   hdu1hdu2hdusrb   r0   s          r    :test_initialize_from_fits_with_data_in_different_extensionr      s    y||##Aq))H?D=""D<t%%D8l*++HLL
,xe
,
,
,CJ!!#(H555;$
222222r"   c                    t          j        ddg          }t          j        d                              dd          }t	          j                    }t	          j        |dd          }t	          j        |dd          }t	          j        |||g          }t          | dz            }|	                    |           t          j        |dd	          }t           j                            |j        |           t          j        |dd	          }t           j                            |j        |           t          j        |d
d	          }t           j                            |j        |           d S )Nr:   ry   firstrH   )nameversecondrX   r,   r`   r(   )r   rH   )r<   r=   rz   r{   r   rY   r|   rZ   r   r[   r   r\   r}   r~   r.   )	r   	fake_img1	fake_img2hdu0r   r   r   rb   r0   s	            r    (test_initialize_from_fits_with_extensionr      s;   !Q  I	!$$Q**I?D=a888D=q999D<tT*++D8l*++HLL
,xQU
3
3
3CJ!!#(I666
,xXE
:
:
:CJ!!#(I666
,x]
?
?
?CJ!!#(I66666r"   c                      t                      } | j        }|                                 }d|d         j        v sJ |d         j        d         |                                k    sJ d S )Nrh   r   )r1   r(   to_hdur-   rj   )rA   ccd_unitra   s      r    test_write_unit_to_hdur      sj      H}HooGgaj'''''1:W%););)=)=======r"   c                    t                      }t          | dz            }|                    |           t          j        t
                    5  t          j        ||j        d           d d d            n# 1 swxY w Y   t          j        t
                    5  t          j        ||j        d           d d d            d S # 1 swxY w Y   d S )N	test.fitsT)r(   do_not_scale_image_data)r(   
scale_back)	r1   r   writer4   r5   r6   r   r\   r(   )r   rA   rb   s      r    2test_initialize_from_FITS_bad_keyword_raises_errorr      sc      H8k)**HNN8	y	!	! Q QXHM4PPPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q	y	!	! D DXHMdCCCCD D D D D D D D D D D D D D D D D Ds$   A88A<?A<CC
C
c                     t                      }t          | dz            }|                    |           t          j        ||j                  }t          j                            |j	        |j	                   d S )Nr   r'   )
r1   r   r   r   r\   r(   r<   r}   r~   r.   r   rA   rb   ccd_disks       r    test_ccddata_writerr      si      H8k)**HNN8|H8=999HJ!!(-?????r"   c                    t                      }t          | dz            }|                    |d           t          j        |          5 }t          |          dk    sJ 	 d d d            n# 1 swxY w Y   t          | dz            }|                    |d           t          j        |          5 }t          |          dk    sJ t          |d         t          j                  sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   Fas_image_hdurH   z
test2.fitsTr:   )r1   r   r   r   openlen
isinstancer|   )r   rA   rb   r   s       r    test_ccddata_writer_as_imagehdur      sy     H8k)**HNN8%N000	8		 4yyA~~~~~               8l*++HNN8$N///	8		 24yyA~~~~$q'4=1111112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s$   A//A36A378C==DDc                      t                      } d}d| j        |<   |                                | j        vsJ |                                | j        vsJ || j        v sJ d S )NSoMeKEY
   )r1   rK   lowerupper)rA   keys     r    #test_ccddata_meta_is_case_sensitiver      sm      H
CHM#99;;hm++++99;;hm++++(-r"   c                  v    t                      } ddi| _        t          | j        t          j                  rJ d S )NOBSERVEREdwin Hubble)r1   rK   r   r   Headerr@   s    r    $test_ccddata_meta_is_not_fits_headerr      s9      H0HM(-5555555r"   c                 R   t                      }t          j        |          }t          j        d|j        z            }t          j        |          }|                    |           t          | dz            }|                    |           t          j	        |t          j                  }t          j                            |j        |j                   t          j	        |dt          j                  }t          j                            |j        d|j        z             d S )Nr:   rX   r'   rH   r   )r1   r   rY   r.   rZ   appendr   r[   r   r\   r+   rT   r<   r}   r~   )r   rA   r`   r   ra   rb   rc   s          r    test_fromMEFr      s      H
/(
#
#C?1x},--Dl3GNN48l*++HOOH	hQZ	0	0	0BJ!!"'8=999	hAAJ	7	7	7BJ!!"'1x}+<=====r"   c                      t           j                                        } d| d<   d| d<   t          t	          j        d          | t          j                  }|j        d         dk    sJ |j        d         dk    sJ d S )Nr   observer3600exptime   r   rK   r(   r   	r   r-   r   r   r<   rs   r+   rT   rK   hdrd1s     r    test_metafromheaderr     s{    
+



C$C
OC	N	s	<	<	<B7:.00009Z N222222r"   c                      ddd} t          t          j        d          | t          j                  }|j        d         dk    sJ d S )Nr   i  )r   EXPTIMEr   r   r   )r   r<   rs   r+   rT   rK   )dicr   s     r    test_metafromdictr     sK    %$
7
7C	s	<	<	<B7:.000000r"   c                  
   t           j                                        } d| d<   d| d<   t          t	          j        d          t          j                  }| |_        |j        d         dk    sJ |j        d         dk    sJ d S )Nr   r   r   r   r   r'   r   r   r   s     r    test_header2metar     s    
+



C$C
OC	N	qz	2	2	2BBI7:.00009Z N222222r"   c                      d} t          j        t                    5  t          t	          j        d          | t          j                   d d d            d S # 1 swxY w Y   d S )Nzthis is not a valid headerr   r   )r4   r5   r6   r   r<   rs   r+   r,   )r   s    r    test_metafromstring_failr   "  s    
&C	y	!	! 7 7c66667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s   /AAAc                      t                      } t          j        t                    5  d| _        d d d            d S # 1 swxY w Y   d S )Nr   )r1   r4   r5   r6   uncertaintyr@   s    r    )test_setting_bad_uncertainty_raises_errorr   (  s      H	y	!	! " "!" " " " " " " " " " " " " " " " " "rC   c                     t                      } d | _        t          j        t          j        | j                            }|                                | _        t          j                            | j        j	        |           d S r3   )
r1   r   r<   sqrtabsr.   r*   r}   r~   array)rA   fake_uncertaintys     r    #test_setting_uncertainty_with_arrayr   /  sj      HHwrvhm4455+0022HJ!!("6"<>NOOOOOr"   c                      t                      } t          j        t                    5  t	          j        ddg          | _        d d d            d S # 1 swxY w Y   d S )NrI   ry   )r1   r4   r5   r;   r<   r=   r   r@   s    r    1test_setting_uncertainty_wrong_shape_raises_errorr   7  s      H	z	"	" 0 0!xA//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   AAAc                  d   t                      } ddi| _        |                                 }t          |t          j                  sJ | j                                        D ]\  }}|d         j        |         |k    sJ t          j	        
                    |d         j        | j                   d S )Nr   r   r   )r1   rK   r   r   r   rZ   r_   r-   r<   r}   r~   r.   )rA   fits_hdulistrd   re   s       r    test_to_hdur   =  s      H0HM??$$LlDL11111##%% . .1A%a(A-----J!!,q/"6FFFFFr"   c                     t                      } |                     d          }t          |d         t          j                  sJ |                     d          }t          |d         t          j                  sJ d S )NFr   r   T)r1   r   r   r   rY   r|   )rA   r   s     r    test_to_hdu_as_imagehdur   G  sq      H???66Ll1ot77777???55Ll1ot}5555555r"   c                      t                      } |                                 }t          j                            |j        | j                   |j        | j        k    sJ |j        | j        k    sJ d S r3   )r1   r*   r<   r}   r~   r.   r(   rK   )rA   ccd_copys     r    	test_copyr   O  sf      H}}HJ!!(-???=HM))))=HM))))))r"   zoperation,affects_uncertainty)multiplyT)divideToperandg       @r:   with_uncertaintyTFc                    t                      }|r&t          t          j        |                    |_        t          ||          }t          t          |          } ||           }||usJ t          |t                    sJ |j        t          |j        t                    sJ 	 | j        }n# t          $ r | }Y nw xY wt          j
                            |j         ||j        |                     |rv|r?t          j
                            |j        j         ||j        j        |                     n>t          j
                            |j        j        |j        j                   n	|j        J t          | t          j                  r0 |d|j        z  d| j        z            j        }	|j        |	k    sJ d S |j        |j        k    sJ d S )NrH   )r1   r
   r<   	ones_liker   getattrr   r   valueAttributeErrorr}   r~   r.   r   r+   Quantityr(   )
r   r   	operationaffects_uncertaintyrA   method	np_methodresultop_valueexpected_units
             r    test_mult_div_overloadr   W  s   "   H I0h1G1GHHXy))FI&&IVG__F!!!!fg&&&&&%-* *%%%=    J!!&+yy/Q/QRRR * 	J))"(	(.4h??   
 J))"((*>*D    !)))'1:&& , "	!hm"3Q5EFFK{m++++++{hm++++++s   (B0 0B?>B?)addF)subtractFzoperand,expect_failurec                    t                      }|r&t          t          j        |                    |_        t          ||          }t          t          |          }|r9t          j        |          5   ||           }d d d            n# 1 swxY w Y   d S  ||           }||usJ t          |t                    sJ |j        t          |j        t                    sJ 	 | j
        }	n# t          $ r | }	Y nw xY wt          j                            |j         ||j        |	                     |rv|r?t          j                            |j        j         ||j        j        |	                     n>t          j                            |j        j        |j        j                   n	|j        J t          | t           j                  r$|j        |j        k    r|j        | j        k    sJ d S |j        |j        k    sJ d S r3   )r1   r
   r<   r   r   r   r4   r5   r   r   r   r   r}   r~   r.   r   r+   r   r(   )
r   expect_failurer   r   r   rA   r   r   r   r   s
             r    test_add_sub_overloadr     sn   &   H I0h1G1GHHXy))FI&&I !]>** 	% 	%VG__F	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%!!!!fg&&&&&%-* *%%%=    J!!&+yy/Q/QRRR * 	J))"(	(.4h??   
 J))"((*>*D    !)))'1:&& ,{hm++w|0K0K0K0K0K0K{hm++++++s$   2B

BB#C+ +C:9C:c                  T   t                      } t          j        t                    5  |                     d           d d d            n# 1 swxY w Y   t          j        t                    5  |                     d           d d d            n# 1 swxY w Y   t          j        t                    5  |                     d           d d d            n# 1 swxY w Y   t          j        t                    5  |                     d           d d d            d S # 1 swxY w Y   d S )Nfive)r1   r4   r5   r6   r   r   r   r   r@   s    r    test_arithmetic_overload_failsr     s     H	y	!	! " "&!!!" " " " " " " " " " " " " " " 
y	!	!                                  
y	!	!  V               
y	!	! " "&!!!" " " " " " " " " " " " " " " " " "sG   A

AA.BBB4CCC:DD!$D!c                  <   t          t          j        d          d          } |                     | d           j        J |                     | d           j        J |                     | d           j        J |                     | d           j        J d S )Nr   r   rJ   r'   compare_wcs)r   r<   rs   r   wcsr   r   r   rU   s    r    test_arithmetic_no_wcs_comparer     s    
"'(##"
-
-
-C773D7))-555<<<..2:::<<<..2:::::ct:,,088888r"   c                  D   d } t          j        d          \  }}t          t          j        d          d|          }t          t          j        d          d|          }t          j        |                    ||           j        |           t          j        |                    ||           j        |           t          j        |	                    ||           j        |           t          j        |
                    ||           j        |           d S )Nc                     dS )NTr7   ___s     r    return_truez5test_arithmetic_with_wcs_compare.<locals>.return_true  s    tr"   r:   naxisr   rJ   r(   r   r   )
nd_testingcreate_two_equal_wcsr   r<   rs   assert_wcs_seem_equalr   r   r   r   r   )r   wcs1wcs2ccd1rl   s        r     test_arithmetic_with_wcs_comparer    s"      0q999JD$278$$24888D278$$24888D$TXXdX%L%L%PRVWWW$d448$   $d448$   $Dk226    r"   c                     d } t          t          j        d          dt                                }t          t          j        d          dt                                }t	          j        t                    5  |                    ||            d d d            n# 1 swxY w Y   t	          j        t                    5  |                    ||            d d d            n# 1 swxY w Y   t	          j        t                    5  |	                    ||            d d d            n# 1 swxY w Y   t	          j        t                    5  |
                    ||            d d d            d S # 1 swxY w Y   d S )Nc                     dS )NFr7   r   s     r    return_falsez;test_arithmetic_with_wcs_compare_fail.<locals>.return_false  s    ur"   r   rJ   r   r   )r   r<   rs   r   r4   r5   r;   r   r   r   r   )r
  r  rl   s      r    %test_arithmetic_with_wcs_compare_failr    sR      278$$2355999D278$$2355999D	z	"	" 1 1<0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1	z	"	" 6 6d5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6	z	"	" 6 6d5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6	z	"	" 4 4Dl3334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4sH   =B!!B%(B%C))C-0C-D11D58D5E::E>E>c                  L   t                      } t          t          j        |                     | _        |                                 }|                     |          }t          |j                  dk    sJ t          j	        
                    |j        d| j        z             t          j	                            |j        j        t          j        d          | j        j        z             |                     |          }t          |j                  dk    sJ t          j	        
                    |j        d| j        z             t          j	                            |j        j        t          j        d          | j        j        z             |                     |          }t          |j                  dk    sJ t          j	        
                    |j        | j        dz             t          j        d          t          j        | j                  z  | j        j        z  }t          j	                            |j        j        |           |                     |          }t          |j                  dk    sJ t          j	        
                    |j        t          j        | j                             t          j        d          t          j        | j                  z  | j        j        z  }t          j	                            |j        j        |           d S )Nr   r:   )r1   r
   r<   r   r   r*   r   r   rK   r}   r~   r.   assert_array_almost_equal_nulpr   r   r   r   r   assert_allcloser   )rA   r   r   expected_uncertaintys       r    (test_arithmetic_overload_ccddata_operandr    s     H,R\(-C-CDDHmmooG\\'""Fv{q    J!!&+q8=/@AAAJ-- "'!**x/C/I"I   w''Fv{q    J!!&+q8=/@AAAJ-- "'!**x/C/I"I   w''Fv{q    J!!&+x}a/?@@@


RVHM***X-A-GG  Jv179MNNN__W%%Fv{q    J!!&+r|HM/J/JKKK


RVHM***X-A-GG  Jv179MNNNNNr"   c                  h   t          j        g d          t          j        z  } t          j        g d          t          j        z  }t          |           }|                    |          }t           j                            |j	        t          j        | |          j
                   |j        t          j        | |          j        k    sJ |                    |          }t           j                            |j	        t          j        | |          j
                   |j        t          j        | |          j        k    sJ |                    |          }t           j                            |j	        t          j        | |          j
                   |j        t          j        | |          j        k    sJ |                    |          }t           j                            |j	        t          j        | |          j
                   |j        t          j        | |          j        k    sJ d S )NrG   )r<   r   r+   mcmr   r   r}   assert_array_almost_equalr.   r   r(   r   r   r   )abccddataress       r    (test_arithmetic_overload_differing_unitsr  (  s   
ac!A
ad"AajjG ++a..CJ((26!Q<<3EFFF8rva||(((((


1

CJ((2;q!3D3D3JKKK8r{1a((-----


1

CJ((2;q!3D3D3JKKK8r{1a((-----
..

CJ((29Q??3HIII8ryA+++++++r"   c                     t          t          j        d          d          } |                     t          j        d                    }t          j                            |j        g dgdz             t          t          j        d          d          } t          j	        t                    5  |                     t          j        d                     d d d            d S # 1 swxY w Y   d S )NrI   rI   rJ   r'   rI   rG   r,   )r   r<   rs   r   rz   r}   r~   r.   r4   r5   r;   r0   r  s     r    test_arithmetic_add_with_arrayr  ?  s   
"'&//
+
+
+C
''")A,,

CJ!!#(YYYK!O<<<
"'&//
.
.
.C	z	"	"  	!                    2(C''C+.C+c                     t          t          j        d          d          } |                     t          j        d                    }t          j                            |j        g dgdz             t          t          j        d          d          } t          j	        t                    5  |                     t          j        d                     d d d            d S # 1 swxY w Y   d S )Nr  rJ   r'   rI   )rH   r   r,   )r   r<   rs   r   rz   r}   r~   r.   r4   r5   r;   r  s     r    #test_arithmetic_subtract_with_arrayr!  I  s   
"'&//
+
+
+C
,,ry||
$
$CJ!!#(ZZZL1,<===
"'&//
.
.
.C	z	"	" # #RYq\\"""# # # # # # # # # # # # # # # # # #r  c                  4   t          t          j        d          dz  t          j                  } |                     t          j        d          dz            }t          j                            |j        g dgdz             |j	        | j	        k    sJ d S )Nr  rI   r'   r:   )   r#  r#  )
r   r<   rs   r+   r  r   r}   r~   r.   r(   r  s     r    #test_arithmetic_multiply_with_arrayr$  S  s    
"'&//A%AC
0
0
0C
,,rwv*
+
+CJ!!#(YYYK!O<<<8sxr"   c                  .   t          t          j        d          t          j                  } |                     t          j        d          dz            }t          j                            |j        g dgdz             |j	        | j	        k    sJ d S )Nr  r'   r:   )      ?r&  r&  rI   )
r   r<   rs   r+   r  r   r}   r~   r.   r(   r  s     r    !test_arithmetic_divide_with_arrayr'  Z  s}    
"'&//
,
,
,C
**RWV__q(
)
)CJ!!#(___,=,ABBB8sxr"   c                    t          j        ddg          }t          j        |          }d|j        d<   d|j        d<   d|j        d<   t          |j        d                   dk    sJ t          | dz            }|                    |           t          j	        |d	          }|j        d         |j        d         k    sJ d S )
Nr:   onehistorytwothreerI   	temp.fitsr,   r'   )
r<   r=   r   rY   r-   r   r   r[   r   r\   )r   rk   r`   tmp_fileccd_reads        r    1test_history_preserved_if_metadata_is_fits_headerr0  a  s    xAH
/(
#
#C!CJy!CJy#CJysz)$%%****8k)**HKK|H5111H?9%I)>>>>>>>r"   c                 D   t                      }t          | dz            }|                    |           t          j        d           d}t          j                    5 }t          j        ||          }||d         j        v sJ 	 d d d            d S # 1 swxY w Y   d S )Nr-  INFOri   r'   r   )	r1   r   r   r   setLevellog_to_listr   r\   message)r   rA   tmpfileexplicit_unit_namelog_listr   s         r    (test_infol_logged_if_unit_in_fits_headerr9  o  s      H([())GNN7L!			 9hL'9:::!Xa[%8888889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9s   (BBBc                 8   t                      }t          | dz            }t          d          }t          j        |j                  dz  |j        _        t          j        ddg          |j        _        ddg|j        _	        dd	g|j        _
        |j                            d
g           |                                d         j        |_        |j                            |                                d           |                    |           t#          |j                  }t%          j        |          }|j        J |j        j        |j        k    sJ |                                d         }t#          |j                  |k    sJ t%          |j        |d          }|                                d         }|                                }	|	                                D ]+}
|
dv r|
|j        vsJ |j        |
         |	|
         k    sJ ,|j        j        xj        dz  c_        |                                d         }|j        d         |j        j        j        d         k    sJ |j        d         |j        j        j        d         k    sJ 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   izRA---AIRzDEC--AIR)r:   rH   g     F@F)	useblanksNr,   r   r(   )rJ   COMMENTHISTORYCDELT1CDELT2rH   )r1   r   r   r<   r   rN   r   crpixcdeltcrvalctypeset_pvr   r-   extend	to_headerr   r   r   r\   r.   keys)r   rA   r6  r   original_header_lengthccd_newccd_new_hduccd_wcs_not_in_headerr`   
wcs_headerrd   ccd_new_hdu_mod_wcss               r    test_wcs_attributerO  z  sp      H([())G
A,,,CHX^,,q0CGMHi233CGMHCGM,CGMGNNL>"""oo''*1HOO3==??e<<<NN7 !11l7##G;""";?cg%%%% ..""1%K{!""&<<<<< $HMsGGG

&
&
(
(
+CJ__ . . ***-44444z!}
1----- KOQ!..**1-%h/7;?3H3KKKKK%h/7;?3H3KKKKKKKr"   c                     ddl m}  t          |           }t          d          }t	          j        |          }t          j        t          d          5  |j	        
                                }ddd           n# 1 swxY w Y   t          |          t          |j                  |z
  z  rJ t          d          }t          j        t          d          5  t	          j        |d	
          }ddd           dS # 1 swxY w Y   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 excludedrE   Nz+../../io/fits/tests/data/o4sp040b0_raw.fitsz'unitfix' made the changecountr'   )astropy.nddata.ccddatarQ  setr   r   r\   r4   warnsr   r   rG  rK   r   )rQ  keepers	data_filer0   rM  
data_file1s         r    %test_wcs_keywords_removed_from_headerrZ    s   
 FEEEEE011G%&9::I
,y
!
!C	M
 
 
 ) ) W&&((
) ) ) ) ) ) ) ) ) ) ) ) ) ) ) J#ch--'"99::: ''TUUJ	&.J	K	K	K 5 5l:G4445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s$   A::A>A>C<<D D c                      t          d          } ddg}t          j        |           5 }|D ]}||d         j        v sJ 	 d d d            n# 1 swxY w Y   t	          j        |           }|D ]}||j        vsJ d S )NrR  A_0_0B_0_1r   )r   r   r   r-   r   r\   )rX  	test_keysr`   r   r0   s        r    )test_wcs_SIP_coefficient_keywords_removedr_    s     &&9::I'"I 
9		 ( 	( 	(C#a&-'''''	(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ,y
!
!C  % %#*$$$$$% %s   AAAignorec                     ddl m} m}m}m} t          |           }t          dd          }|D ]@}d|v sd|v sd|v sd	|v rt          |          }t          j	        
                    |          }t          |          }	|	                    d
          }
 ||          \  }}|                    d
          }t          |          t          |          |z
  z  rJ ||z   }t          |          }||z  r||z  rJ n||z  r||z  rJ |                                D ]O\  }}t          |t                    r|
|         |k    sJ )t           j                            |
|         |           PBd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   )rQ  _CDs_generate_wcs_and_update_header_PCsz../../wcs/tests/dataz*.hdr)patterninvalidnonstandardsegfaultzchandra-pixlist-wcsT)relaxN)rT  rQ  rb  rc  rd  rU  r   r   r   r   
fromstringr   rG  r_   r   r   r<   r}   assert_almost_equal)rQ  rb  rc  rd  rW  wcs_headersr   header_stringr-   r   header_from_wcs
new_headernew_wcsnew_wcs_headerfinal_headerfinal_header_setrd   re   s                     r    +test_wcs_keyword_removal_for_wcs_test_filesrt    s               011G()?QQQK )F )F ##S  $++-c22''66-  --d-33==fEE
G ***66 
OOc.&9&9G&CCDDD "N2|,,"" 	1//0000$$ 	1//000 #((** 	F 	FDAq!S!! F&q)Q.....
..q/A1EEEE		FK)F )Fr"   c                 r   t          j        d          }t          j                            |d          }t          j        t          j        t          j        d          |          g          }t          | dz            }|
                    |           t          j        |d          }|j        J 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-   rX   r,   r'   )textwrapdedentr   r   rj  rZ   rY   r<   rs   r   r[   r   r\   r   )r   hdr_txt_example_WCSr   hdulrb   r0   s         r    test_read_wcs_not_creatabler}  *  s    "/	 8 +
 
 !4$
 
?
?C<)>)>sKKKLMMD8l*++HLL ,xe
,
,
,C7?????r"   c                  f    t                      } ddi}t          | |          }|j        |k    sJ d S )NObserverHubblerx  )r1   r   rK   )rA   r  r0   s      r    test_headerr  R  s<      H	XA
(1
%
%
%C8q======r"   c                      t                      } t          d          }|| _        |                     d          }t	          j        |j        |           d S )Nr:   r   g      ?)r1   r   r   r   r  r  )rA   r   r   s      r    test_wcs_arithmeticr  Y  sO      H
A,,,CHLs##F$VZ55555r"   r   )r   r   r   r   c                     t                      }|                                }t          d          |_        t	          ||           } ||          }t          j        |j        |j                   |j        J d S Nr:   r   )r1   r*   r   r   r   r  r  r   rA   	ccd_data2r   r   s        r    test_wcs_arithmetic_ccdr  a  sr      HIQ<<<HLXy))FVIF$VZ>>>=     r"   c                  L   t          d          } d }t          j        |           }t          j        |           5 } ||d         j                  }ddd           n# 1 swxY w Y   t          |          sJ |                                } ||d         j                  }t          |          sJ |                    d          } ||d         j                  }t          |          rJ |d         j        d         dk    sJ |d         j        d	         d
k    sJ dS )zc
    Check whether the ctypes RA---TAN-SIP and DEC--TAN-SIP survive
    a roundtrip unchanged.
    rR  c                 N     ddd} fd|                                 D             S )NzRA---TAN-SIPzDEC--TAN-SIP)CTYPE1CTYPE2c                 .    g | ]\  }}|         |k    S r7   r7   ).0rd   re   r-   s      r    
<listcomp>zCtest_wcs_sip_handling.<locals>.check_wcs_ctypes.<locals>.<listcomp>v  s%    GGG41aq	QGGGr"   )r_   )r-   expected_wcs_ctypess   ` r    check_wcs_ctypesz/test_wcs_sip_handling.<locals>.check_wcs_ctypess  s8    )7>RRGGGG+>+D+D+F+FGGGGr"   r   NF)	wcs_relaxr  zRA---TANr  zDEC--TAN)	r   r   r\   r   r   r-   allr   any)rX  r  ccd_originalraw
good_ctyperJ  ccd_no_relaxs          r    test_wcs_sip_handlingr  l  s|   
 &&9::IH H H
 <	**L 
9		 5%%c!fm44
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5z??!!##G!!'!*"344Jz??  &&&77L!!,q/"899J:?!(+z9999?!(+z999999s   AA"%A"c                     t                      }|                                }|j        dk    |_        t	          ||           } ||          }t
          j                            |j        |j                   d S )Nr   )r1   r*   r.   maskr   r<   r}   assert_equalr  s        r    test_mask_arithmetic_ccdr    sh      HIMA%HMXy))FVIFJFK77777r"   c                    t                      }|j        dk    |_        t          | dz            }|                    |           t          j        |          }|j        J t          j        	                    |j        |j                   d S Nr   rX   )
r1   r.   r  r   r   r   r\   r<   r}   r~   r   rA   rb   	ccd_afters       r    /test_write_read_multiextensionfits_mask_defaultr    s~      HMB&HM8l*++HNN8X&&I>%%%J!!(-@@@@@r"   uncertainty_typec                 r   t                      } ||j        dz            |_        t          | dz            }|                    |           t          j        |          }|j        J t          |j                  |u sJ t          j	        
                    |j        j        |j        j                   d S r  r1   r.   r   r   r   r   r\   typer<   r}   r~   r   r   r  rA   rb   r  s        r    6test_write_read_multiextensionfits_uncertainty_defaultr    s    
   H++HMB,>??H8l*++HNN8X&&I ,,,	%&&*:::::J!!"I$9$?    r"   c                 z   t                      } ||j        dz            |_        t          | dz            }|                    |d           t          j        |d          }|j        J t          |j                  |u sJ t          j	        
                    |j        j        |j        j                   d S )Nr   rX   Blah)key_uncertainty_typer  r  s        r    Htest_write_read_multiextensionfits_uncertainty_different_uncertainty_keyr    s       H++HMB,>??H8l*++HNN8&N999XFCCCI ,,,	%&&*:::::J!!"I$9$?    r"   c                    t                      }|j        dk    |_        t          |j        dz            |_        t          | dz            }|                    |d d            t          j        |          }|j        J |j        J d S )Nr   rX   hdu_maskhdu_uncertainty)	r1   r.   r  r
   r   r   r   r   r\   r  s       r    &test_write_read_multiextensionfits_notr    s      HMB&HM,X]R-?@@H8l*++HNN8dDNAAAX&&I (((>!!!!!r"   c                 (   t                      }|j        dk    |_        t          |j        dz            |_        t          | dz            }|                    |dd           t          j        |          }|j        J |j        J t          j        |dd          }|j        J |j        J t          j
                            |j        |j                   t          j
                            |j        j        |j        j                   d S )Nr   rX   FunNoFunr  )r1   r.   r  r
   r   r   r   r   r\   r<   r}   r~   r   r  s       r    3test_write_read_multiextensionfits_custom_ext_namesr    s     HMB&HM,X]R-?@@H8l*++HNN8eWNEEE X&&I (((>!!! XwOOOI ,,,>%%%J!!(-@@@J!!"I$9$?    r"   c                    d}t          j        ||g          }|dk    }t          j        |          }t          |||d          }|                                }|d         j        d= t          | dz            }|                    |           t          j        |          }t          |j
        t                    sJ d S )Nry   g?r,   )r.   r  r   r(   r:   UTYPEzold_ccddata_mef.fits)r<   r=   r   r   r   r-   r   r[   r\   r   r   r
   )r   r   r.   r  uncertr0   ra   	file_names           r    &test_read_old_style_multiextensionfitsr    s     D8T4L!!D#:DWT]]F
t$F
G
G
GC jjllG
'"H5566IOOI
,y
!
!Cco'89999999r"   c                  f    t                      } t          d          }|| _        | j        |u sJ d S r  )r1   r   r   )rA   r   s     r    test_wcsr    s:      H
A,,,CHL<3r"   c                     t                      }g d}|D ]d}t          | d| z            }|                    |           t          j        |          }|j        |j        k                                    sJ ed S )N)fitr   ftsztest.)r1   r   r   r   r\   r.   r  )r   rA   supported_extensionsextpath	from_disks         r    +test_recognized_fits_formats_for_read_writer    s      H111# 7 78mcmm+,,tL&&	/44666666	7 7r"   c                      t          j        t                    5  t          t	          j        d                    j         d d d            d S # 1 swxY w Y   d S )Nr   )r4   r5   r	   r
   r<   rs   parent_nddatar7   r"   r    2test_stddevuncertainty_compat_descriptor_no_parentr    s    	6	7	7 ; ;"'(++,,::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;s   'AAAc                      t          t          j        d          d          } t          t          j        d                    }| |_        |j        | u sJ d |_        d S )Nr   rJ   r'   )r   r<   rs   r
   _parent_nddatar  )r0   r  s     r    3test_stddevuncertainty_compat_descriptor_no_weakrefr    sa     "'(##"
-
-
-Crwx0011FF3&&&& Fr"   c                    t          t          j        d                              dd                    }t          j        d          }t	          j        t	          j                    t	          j        |                                          t	          j	        |          g          }t          | dz            }|                    |           t          j        |d          }|j        j        dk    sJ d S )	Nr   r   r:   r   )r   ztable_image.fitsr,   r'   )r   r<   rs   r{   r   rZ   rY   TableHDUas_arrayr|   r   r[   r   r\   r.   rN   )r   tblimgr|  rb   r0   s         r    test_read_returns_imager  *  s     ##Aq))
*
*C
'&//C<os||~~!>!>c@R@RS  D 80011HLL
,xe
,
,
,C8>V######r"   c                  f   t          d          } d| j        _        t          t	          j        d          | d          }|ddddf         }|                                }t          |t          j	                  sJ |d         j
        d         d	k    sJ |d         j
        d
         d	k    sJ d S )Nr:   r   r   pixelr<  r   CRPIX1   CRPIX2)r   r   rA  r   r<   rs   r   r   r   rZ   r-   )r   r0   trimmedr|  s       r    test_sliced_ccdata_to_hdur  :  s    
A,,,CCGM
"'(##7
;
;
;C!B$"*oG>>DdDL)))))7>(#q((((7>(#q((((((r"   c                 X   t                      }t          j                            dd          }|                    |           t          j        ||j                  }t          j	        
                    |j        |j                   t          j                            |          rJ d S )N~r   r'   )r1   osr  joinr   r   r\   r(   r<   r}   r~   r.   exists)r!   rA   rb   r   s       r    test_read_write_tilde_pathsr  E  s      Hw||C--HNN8|H8=999HJ!!(-??? w~~h'''''''r"   c                     t                                           } t          t                                          t          j        |           }|j        | k                                    sJ t          j	        t          d          5  t          t                                          t          j        d           d d d            d S # 1 swxY w Y   d S )N)r(   psfThe psf must be a numpy array.rE   	something_random_psfr*   r   r)   r+   r,   r  r  r4   r5   r6   r  r0   s     r    test_ccddata_with_psfr  S  s   




C
-$$&&QU
<
<
<CGsN!!!!! 
y(H	I	I	I C C""$$15kBBBBC C C C C C C C C C C C C C C C C Cs   4CCCc                  ^   t                                           } t          t                                          t          j                  }| |_        |j        | k                                    sJ t          j	        t          d          5  d|_        d d d            d S # 1 swxY w Y   d S )Nr'   r  rE   r   r  r  s     r    test_psf_setterr  ]  s    




C
-$$&&QU
3
3
3CCGGsN!!!!! 
y(H	I	I	I                   s   B""B&)B&c                    t                      }t          |_        | dz  }|                    |           t	          j        |          }t          j                            |j	        |j	                   t          j                            |j        |j                   | dz  }|                    |d           t	          j        |          }t          j                            |j	        |j	                   |j        J t	          j        |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.fitsPSFOTHER)hdu_psfN)
r1   r  r  r   r   r\   r<   r}   r~   r.   r   s       r    test_write_read_psfr  h  s&     HHL44HNN8|H%%HJ!!(-???J!!(,=== 88HNN8ZN000|H%%HJ!!(-???<|Hj999HJ!!(-???J!!(,=====r"   )wr  ry  numpyr<   r4   astropyr   r   r+   
astropy.ior   astropy.nddatar   r  rT  r   astropy.nddata.nduncertaintyr   r	   r
   r   astropy.tabler   astropy.utilsr   astropy.utils.datar   r   r   astropy.utils.exceptionsr   astropy.wcsr   r   rO   randomnormalr)   r  fixturer!   r1   r8   r>   rB   rL   rR   rV   rf   rm   rp   rt   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   markparametrizedimensionless_unscaledri   r,   r   
UnitsErrorr   r   r   r  r  r  r  r  r!  r$  r'  r0  r9  rO  rZ  r_  filterwarningsrt  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7   r"   r    <module>r     sh   
			                         1 1 1 1 1 1 * * * * * *                   ) ) ) ) ) )         
 4 3 3 3 3 3 - - - - - - - - _S 2 2I$$+<>O*P$QQM)"""11K2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 
5 
5 
5	 	 	  
" " "
  @ @ @
- - -" " "
  ! ! !    ( ( (3 3 37 7 7(> > >
D 
D 
D@ @ @2 2 2     6 6 6> > > 3 3 31 1 13 3 37 7 7" " "P P P0 0 0G G G6 6 6* * * #  	A$$	AHqu  +dE];;%, %, <;   %,P #  	al	
Q%	%q|4	
QUE  +dE];;), ), <;   ),X" " "9 9 9  &4 4 4  O  O  OF, , ,.  # # #          ? ? ?9 9 9:L :L :Lz5 5 5.% % %: H%%;F ;F &%;F|% % %P  6 6 6 &O&O&OPP! ! QP!: : :D &O&O&OPP8 8 QP8A A A *,?Q    *,?Q    	" 	" 	"  .: : :8  	7 	7 	7; ; ;
! ! !$ $ $ ) ) )( ( (C C C  > > > > >s   ,9B11B58B5