a
    ߙfbFS                     @   s,  d dl mZ d dlZd dlZd dlmZmZ d dlm	Z	 d dl
mZmZmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
l
mZ g dZg dZeddeddeddeddeddeddgZ dZ!g dZ"ej#ej#fej$ej$fdej#fej#dfdej$ fej$ dfgZ%dd Z&d d! Z'ej()d"e"d#d$ Z*d%d& Z+d'd( Z,d)d* Z-ej()d+e%d,d- Z.d.d/ Z/d0d1 Z0d2d3 Z1d4d5 Z2d6d7 Z3d8d9 Z4d:d; Z5d<d= Z6ej()d>g d?d@dA Z7dBdC Z8dDdE Z9dFdG Z:dHdI Z;dJdK Z<ej()dLe=eedMdN Z>G dOdP dPZ?dS )Q    )VersionN)assert_allcloseassert_array_equal)assert_quantity_allclose)extract_array	add_arraysubpixel_indicesoverlap_slicesNoOverlapErrorPartialOverlapErrorCutout2D)WCSSip)proj_plane_pixel_area)SkyCoord)units)CCDData))
ףp=
%@(\@){Gz@q=
ף)@)GzT?@Q?@)q=
ףp?Gz?)33333s4@=
ףp=(@)QE@Qk8@))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   c                  C   sL   t t} tddd W d   n1 s,0    Y  dt| jv sHJ dS )z>Overlap from arrays with different number of dim is undefined.)r"   r%   r)   r#   r!   r   r   Nthe same number of dimensionspytestraises
ValueErrorr	   strvaluee r5   >lib/python3.9/site-packages/astropy/nddata/tests/test_utils.pytest_slices_different_dim%   s    *r7   c                  C   sL   t t} tddd W d   n1 s,0    Y  dt| jv sHJ dS )z&Position must have same dim as arrays.)r"   r%   r*   )r   r   r   Nr,   r-   r3   r5   r5   r6   test_slices_pos_different_dim,   s    *r8   posc                 C   s:   t t tdd|  W d   n1 s,0    Y  dS )zAIf there is no overlap between arrays, an error should be raised.r%   r%   r!   r!   N)r.   r/   r
   r	   )r9   r5   r5   r6   test_slices_no_overlap3   s    r<   c               	   C   s   t ddd} | tdddftdddffks0J t dddd	d
} | tdddftdddffksdJ dD ]R}tt"}t dd|fdd
} W d   n1 s0    Y  dt|jv shJ qhdS )z1Compute a slice for partially overlapping arrays.r%   r   r   r   r!   Nr#   r   partialmode)r   r"   strictzArrays overlap only partially.)r	   slicer.   r/   r   r1   r2   )Ztempr9   r4   r5   r5   r6   test_slices_partial_overlap:   s    $$0rE   c                  C   s  t ddddd\} }| d j| d j  kr4dks:n J | d j| d j  krZdks`n J |d j|d j  krdksn J |d j|d j  krdksn J t ddd	dd\} }| d j| d j  krd
ksn J | d j| d j  kr
dksn J |d j|d j  kr4dks:n J |d j|d j  kr^dksdn J t ddd\} }| d j| d j  krdksn J | d j| d j  krdksn J |d j|d j  krdksn J |d j|d j  krdksn J t ddd\} }| d j| d j  krPdksVn J | d j| d j  krzdksn J |d j|d j  krdksn J |d j|d j  krdksn J dS )z:
    Test overlap_slices when extracting along edges.
    
   rG   r   r   r#   r#   rC   rA   r   r#   r   )   rJ      rG   r+   r:   r%   N)r	   startstop)Zslc_lgZslc_smr5   r5   r6   test_slices_edgesH   s(    &&&&&**********rN   c                  C   sP   t t } tddddd W d   n1 s00    Y  dt| jv sLJ dS )z+Call overlap_slices with non-existing mode.r=   r>   r?   fullrA   NzMode can be onlyr-   r3   r5   r5   r6   test_slices_overlap_wrong_modeg   s    .rP   positionc                 C   s:   t t tdd|  W d   n1 s,0    Y  dS )zT
    A ValueError should be raised if position contains a non-finite
    value.
    )rK   rK   rH   N)r.   r/   r0   r	   )rQ   r5   r5   r6   test_slices_nonfinite_positionn   s    rR   c            
      C   s   t d} d}g d}|D ]$\}}t| ||fdd}t|| qd}d}d}|gd	 |g }	t||	D ]&\}}t| ||fdd
d}t|| qfdS )b
    Test overlap_slices (via extract_array) for rounding with an
    even-shaped extraction.
    rG   r!   ))ףp=
?r*   )      ?r*   )jt?r*   )ףp=
?r*   )       @r*   )Gz @r!   r   )Q@r[   )      @r[   )5^I@r[   )Q@r[   )      @r[   )Gz@r$   r@   rA   gGzgRQg      g\(\߿g{Gzr   )r   )r   r#   r)   rc   rB   
fill_valueNnparanger   r   zip
datashapeZpositions_expectedr9   ZexpoutZ	positionsZexp1Zexp2expectedr5   r5   r6   &test_extract_array_even_shape_roundingy   s    
ro   c            
      C   s   t d} d}g d}|D ]$\}}t| ||fdd}t|| qd}d}d}|gd	 |gd
  }	t||	D ]&\}}t| ||fddd}t|| qjdS )rS   rG   r>   ))rU   r   r#   r!   )rV   rp   )rW   r#   r!   r   )rX   rq   )rY   rq   )rZ   rq   )r\   rq   )r]   rq   )r^   r!   r   r"   )r_   rr   )r`   rr   )ra   rr   r@   rA   rb   rc   rc   r   rc   r   r#   r   r"   rc   rd   Nrf   rj   r5   r5   r6   %test_extract_array_odd_shape_rounding   s    
ru   c                  C   sV   t t&} ttddddd W d   n1 s60    Y  dt| jksRJ dS )z*Call extract_array with non-existing mode.r"   rT   r?   rO   rA   Nz0Valid modes are 'partial', 'trim', and 'strict'.)r.   r/   r0   r   rg   rh   r1   r2   r3   r5   r5   r6   test_extract_array_wrong_mode   s    4rv   c                  C   s   t tt dddddt ddgks.J dD ]4} t tt dd| ft | d | gks2J q2t tt d	dd
t jdt dt jgksJ dS )[Extract 1 d arrays.

    All dimensions are treated the same, so we can test in 1 dim.
    r"   rT   r?   rc   re   r   rq   r#         @r"   r   N)rg   allr   rh   arrayinfir5   r5   r6   test_extract_array_1d_even   s    
r   c               
   C   s  t tt dddddt g dks.J t tt dddddt g dks\J d	D ]:} t tt dd| ft | d
 | | d
 gks`J q`t tt dddddt g dksJ t d}t|dd}|d dksJ t |d
 sJ |j|jksJ dS )a  Extract 1 d arrays.

    All dimensions are treated the same, so we can test in 1 dim.
    The first few lines test the most error-prone part: Extraction of an
    array on the boundaries.
    Additional tests (e.g. dtype of return array) are done for the last
    case only.
    r"   r>   r&   rc   rx   rs   r?   rt   r*   r#   )r!   r   rc   ry   rz   r   r   N)rg   r{   r   rh   r|   Zisnandtype)r   Zarrayin	extractedr5   r5   r6   test_extract_array_1d_odd   s0    	



r   c                   C   s`   t tt dddddt g dks.J t tt dddddt g dks\J dS )	z(In 1d, shape can be int instead of tupler"   r   r   rc   rx   rs   r&   Nrg   r{   r   rh   r|   r5   r5   r5   r6   test_extract_array_1d   s    
r   c                  C   sB   t dddD ].} t tt dd| t g dksJ qdS )zinteger is at bin centergGz@gQ@皙?r%   r   rr   N)rg   rh   r{   r   r|   )ar5   r5   r6   test_extract_Array_float   s    r   c               	   C   s   t tt dddddt dgks,J dD ]8} t tt dd| fddt | d | gks0J q0t tt d	dd
ddt dgksJ dS )rw   r"   rT   r?   trimrA   r   rq   r#   ry   rz   r   Nr   r~   r5   r5   r6   test_extract_array_1d_trim   s     


r   rB   )r@   r   rC   c                 C   sN   t d}t d}||ddddf< t|dd| d}t ||ksJJ dS )zq
    Test extract_array utility function.

    Test by extracting an array of ones out of an array of zeros.
       r   r:   r   rJ   rA   N)rg   zerosonesr   r{   )rB   large_test_arraysmall_test_arrayZextracted_arrayr5   r5   r6   test_extract_array_easy   s    

r   c                  C   s   t jdtd} t ddD ]&}t| d|ddd\}}|d	ksJ qtg d
g dD ].\}}t| d|fddd\}}||fksTJ qTtt dddD ].\}}t| d|fddd\}}||fksJ qdS )zCheck that the return position is calculated correctly.

    The result will differ by mode. All test here are done in 1d because it's
    easier to construct correct test cases.
    r%   r   r&   r)   r   r@   T)rB   Zreturn_position)r#   )rU   g)\(?r   )g\(\?gRQ?r#   rT   rC   )r&   r   r#   r#   r#   r#   r#   r>   r   N)rg   rh   floatr   ri   )r   r   r   Znew_posrn   r5   r5   r6   test_extract_array_return_pos  s"    




r   c                  C   sd   t tjt dkr`d} tjt| d, ttjdtdddtj	d W d    n1 sV0    Y  d S )	Nz1.20z9fill_value cannot be set to np.nan if the input array has)matchrF   r   r:   rI   rx   )
r   rg   __version__r.   r/   r0   r   r   intnan)msgr5   r5   r6    test_extract_array_nan_fillvalue'  s    r   c                  C   sZ   t d} t d}|  }|ddddf  |7  < t| |d}t ||ksVJ dS )zi
    Test add_array utility function.

    Test by adding an array of ones out of an array of zeros.
    r   r:   r   rJ   Nrg   r   r   copyr   r{   r   r   Zlarge_test_array_refZadded_arrayr5   r5   r6   test_add_array_odd_shape/  s    

r   c                  C   sj   t d} t d}|  }|ddddf  |ddddf 7  < t| |d}t ||ksfJ dS )l
    Test add_array_2D utility function.

    Test by adding an array of ones out of an array of zeros.
    r   )r"   r"   r   r!   r"   r+   Nr   r   r5   r5   r6   test_add_array_even_shape>  s    

,r   c                  C   sF   t d} t d}|  }||7 }t| |d}t ||ksBJ dS )r   r   r:   Nr   r   r5   r5   r6   test_add_array_equal_shapeM  s    

r   rQ   Zsubpixel_indexc                 C   s   t t| t|ksJ dS )z
    Test subpixel_indices utility function.

    Test by asserting that the function returns correct results for
    given test values.
    N)rg   r{   r   subsamplingr   r5   r5   r6   test_subpixel_indices\  s    	r   c                   @   s   e Z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 Z
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" Zd#d$ Zd%S )&TestCutout2Dc                 C   sH  t ddd| _tddd| _tdd}t jd	 }d
}|t | | t 	| g|t 	| |t | gg|j
_ddg|j
_| jjtj| jjtjg|j
_ddg|j
_|| _
| }ddg|j
_t g dg dg dg dg dg}t g dg dg dg dg dg}t||d d |j
j|_|j
  || _d S )Ng      4@r%   r"   z13h11m29.96s -01d19m18.7sZicrs)framer!   )Znaxisr`   g2.Z >zRA---TANzDEC--TANr   zRA---TAN-SIPzDEC--TAN-SIP)r   r   gc)Şl>gA=gNqL)r   g>gǢ%=g{p8b=        )g2g=gaR"=r   r   )gW.2LgdV>OY!c=r   r   r   )gTSr   r   r   r   )r   r   gbYza>g@U]g=ri=)r   g	!g&Y=g$-r   )g
o+>guM/g<CHr   r   )g>䔍Y=g3--/=r   r   r   )g3;6dr   r   r   r   )rg   rh   Zreshaperk   r   rQ   r   ZpiZcosZsinwcsZcdZctyperaZto_valueuZdegdeccrvalcrpixdeepcopyr|   r   Zsipsetsipwcs)selfr   ZrhoZscaler   r   br5   r5   r6   setup_classi  sF    


zTestCutout2D.setup_classc                 C   s<  ddt j ddt j dt j fddt j fdg}|D ] }d}t| j||}|jjdks\J |jd dksnJ |jdks|J |jdksJ |j|ksJ t	|j
d	 |jd
ksJ |jdksJ |jd
ksJ |jdksJ |jdksJ |jdksJ |jtddtddfksJ |jtddtddfks4J q4d S )Nr   rH   r`   )g333333@gffffff
@)g @gffffff?rI   rG   r+   )g?g?)rY   rY   )      ?r   )r#   r   r   )r    r    r#   r"   r   )r   pixelZpixr   rk   rl   Zorigin_originalZorigin_cutoutZinput_position_originalr   Zinput_position_cutoutZposition_originalZposition_cutoutcenter_originalcenter_cutoutZbbox_originalZbbox_cutoutslices_originalrD   slices_cutout)r   ZsizessizerQ   cr5   r5   r6   test_cutout  s(    *
 zTestCutout2D.test_cutoutc                 C   s<   t t t| jdd W d    n1 s.0    Y  d S )Nr;   )r#   r#   r#   )r.   r/   r0   r   rk   r   r5   r5   r6   test_size_length  s    zTestCutout2D.test_size_lengthc              	   C   sZ   dt j ddt j ffD ]<}tt t| jd| W d    q1 sJ0    Y  qd S )Nr   r;   )r   cmKr.   r/   r0   r   rk   )r   r   r5   r5   r6   test_size_units  s    zTestCutout2D.test_size_unitsc                 C   s   dt j dt j t j  }t| jd|}|jjdks8J |jd dksJJ |jtddtddfkshJ |jtd	d
td	d
fksJ dS )z4
        Check size in derived pixel units.
        g333333?r   r;   rH   r+   r%   r#   r"   r   r   N)	r   arcsecr   r   rk   rl   r   rD   r   )r   r   r   r5   r5   r6   test_size_pixel  s    zTestCutout2D.test_size_pixelc                 C   s|   t | jddtj | jd}|jjdks*J |jd dks<J |jtddtddfksZJ |jtdd	tdd	fksxJ d S )
Nr;   r   r   r+   r%   r#   r   r   r!   )	r   rk   r   r   r   rl   r   rD   r   r   r   r5   r5   r6   test_size_angle  s
    zTestCutout2D.test_size_anglec                 C   sF   t t( t| jdddtj f W d    n1 s80    Y  d S )Nr;   r   )r.   r/   r0   r   rk   r   r   r   r5   r5   r6   test_size_angle_without_wcs  s    z(TestCutout2D.test_size_angle_without_wcsc                 C   st   t | jdddd}|jjdks"J |jd dks4J |jtddtddfksRJ |jtddtddfkspJ d S )Nr+   rH   r   rA   r;   r   r!   r   rk   rl   r   rD   r   r   r5   r5   r6   test_cutout_trim_overlap  s
    z%TestCutout2D.test_cutout_trim_overlapc                 C   st   t | jdddd}|jjdks"J |jd dks4J |jtddtddfksRJ |jtdd	tdd	fkspJ d S )
Nr+   rH   r@   rA   rI   r   r!   r#   r   r   r   r5   r5   r6   test_cutout_partial_overlap  s
    z(TestCutout2D.test_cutout_partial_overlapc                 C   sP   d}t | jddd|d}|jjdks(J |jd dks:J |jd |ksLJ d S )Nrc   r+   rH   r@   rd   rI   r   )r   rk   rl   )r   re   r   r5   r5   r6   &test_cutout_partial_overlap_fill_value  s    z3TestCutout2D.test_cutout_partial_overlap_fill_valuec                 C   s   t | j}t|dd}d}d}||j|< ||}|d d d }|| |ksRJ t | j}t| jdddd}||j|< || |ksJ d S )Nr[   rH   r+   g      Y@r&   T)r   )rg   r   rk   r   to_original_position)r   rk   r   xyr2   Zxy_origZyxZc2r5   r5   r6   	test_copy  s    


zTestCutout2D.test_copyc                 C   s4   d}t | j|d}d}|||}t|| d S )Nr;   rH   r+   )r   rk   Zto_cutout_positionr   r   )r   rQ   r   r   resultr5   r5   r6   test_to_from_large  s
    zTestCutout2D.test_to_from_largec                 C   s>   t t  t| j| jd W d    n1 s00    Y  d S )NrH   )r.   r/   r0   r   rk   rQ   r   r5   r5   r6   test_skycoord_without_wcs  s    z&TestCutout2D.test_skycoord_without_wcsc                 C   sr   t | j| jd| jd}| j|jd |jd | j}| j|jd |jd |j}t|j|j t|j	|j	 d S )NrH   r   r#   r   
r   rk   rQ   r   
from_pixelr   r   r   r   r   r   r   skycoord_originalskycoord_cutoutr5   r5   r6   test_skycoord  s    zTestCutout2D.test_skycoordc                 C   st   t | j| jd| jdd}| j|jd |jd | j}| j|jd |jd |j}t|j|j t|j	|j	 d S )NrH   r@   r   rB   r#   r   r   r   r5   r5   r6   test_skycoord_partial  s    z"TestCutout2D.test_skycoord_partialc                 C   s:   d}d}t | j| j||f| jd}|jj||fks6J d S )Nr!   r   r   )r   rk   rQ   r   Zarray_shape)r   ZxsizeZysizer   r5   r5   r6   test_naxis_update  s    zTestCutout2D.test_naxis_updatec                 C   s   t | jdd| jddj}tt|}t|jg |jj	dR  |jj
dd| d t|jg |jj	dR  |jj
dd| d d S )	Nr+   rH   r@   r   r#   r   gư>)ZrtolZatol)r   rk   r   r   rg   Zsqrtr   r   Zwcs_pix2worldr   r   Zall_pix2world)r   wZpscaler5   r5   r6   test_crpix_maps_to_crval  s    z%TestCutout2D.test_crpix_maps_to_crvalc                 C   s|   t | j| jdd}t|| jd}| j|jd |jd | j}| j|jd |jd |j}t|j	|j	 t|j
|j
 d S )NZadu)rk   r   ZunitrH   r#   r   )r   rk   r   r   rQ   r   r   r   r   r   r   )r   Zccdr   r   r   r5   r5   r6    test_cutout_with_nddata_as_input  s    z-TestCutout2D.test_cutout_with_nddata_as_inputN)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r5   r5   r6   r   h  s$   #
r   )@Zpackaging.versionr   r.   Znumpyrg   Znumpy.testingr   r   Zastropy.tests.helperr   Zastropy.nddatar   r   r   r	   r
   r   r   Zastropy.wcsr   r   Zastropy.wcs.utilsr   Zastropy.coordinatesr   Zastropyr   r   r   Ztest_positionsZtest_position_indicesrD   Ztest_slicesr   Ztest_pos_badr   r}   Ztest_nonfinite_positionsr7   r8   ZmarkZparametrizer<   rE   rN   rP   rR   ro   ru   rv   r   r   r   r   r   r   r   r   r   r   r   ri   r   r   r5   r5   r5   r6   <module>   sd   $





