U
    e»{jz0  ã                   @   s®  d dl mZ d dlmZmZ d dlZd dlZd dl	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ ej ddd	d
ddejdd…dd…f dddgdddggdddgdddggfddddgddddgddddggddddgdddd gd!d"d#d$gggd%d&d'd(gd)d*d+d,gd-d.d/d0ggd1d2d3d4gd5d6d7d8gd9d:d;d<gggfg¡d=d>„ ƒZej dd?d@dAdddgdddggdddgdddggfddddgddddgddddggddddgdddd gd!d"d#d$gggd%d&d'd(gd)d*d+d,gd-d.d/d0ggd1d2d3d4gd5d6d7d8gd9d:d;d<gggfg¡dBdC„ ƒZdDdE„ ZdFdG„ ZdHdI„ ZdJdK„ ZdLdM„ ZdNdO„ ZdPdQdRdSdTdUgZ ej dVe ¡dWdX„ ƒZ!dYdZ„ Z"d[d\„ Z#d]d^„ Z$d_d`„ Z%dadb„ Z&dcdd„ Z'dedf„ Z(dgdh„ Z)dS )ié    N)ÚcosÚsin)Úassert_allclose)ÚmodelsÚ	rotations)Úassert_quantity_allclose)ÚwcsÚinp©r   r   )i   ç�Âõ(\�4À)g     FŸÀç33333óF@©r   éZ   )r   é¦ÿÿÿé   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é0   c                 C   sÂ   t  ¡ }ddg}||j _ddg|j _d}t ¡ }t |d |d |¡}t |d |d |¡}||B }||jB }| 	| d | d d¡}	| 
|	d |	d d¡}
t|| Ž |	dd	� t||	Ž |
dd	� d S )
Ng¯ƒ90oOi@gX¡Lj–G@zRA---TANzDEC--TANé´   r   r   çê-�™—q=©Zatol)r   ZWCSÚcrvalÚctyper   ZPix2Sky_TANÚRotateNative2CelestialÚRotateCelestial2NativeÚinverseZwcs_pix2worldZwcs_world2pixr   )r	   ÚwrC   ZlonpoleÚtanÚn2cÚc2nÚmZminvÚradecZxy© rN   úd/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_rotations.pyÚtest_against_wcslib   s    
rP   )gñhãˆµøä>g-Cëâ6?)r7   r   )g     €5@r   c                 C   sZ   d\}}}t  |||¡}t  |||¡}t|j|| Ž Ž | dd� t|j|| Ž Ž | dd� d S )N)r9   r:   r;   g‚vIhÂ%<=rB   )r   rE   rF   r   rG   )r	   ÚlonÚlatÚlon_polerJ   rK   rN   rN   rO   Útest_roundtrip_sky_rotation;   s
    
rT   c                  C   s4   t  ddd¡} | ddƒ\}}t|dƒ t|dƒ d S )Nr   r   r   é¶   )r   rE   r   )rJ   ÚalphaÚdeltarN   rN   rO   Útest_native_celestial_lat90V   s    
rX   c                  C   s4   t jdd�} | ddƒ\}}t||gddgdd� d S ©Nr   ©Úangler   r   ç»½×Ùß|Û=rB   )r   Ú
Rotation2Dr   ©ÚmodelÚxÚyrN   rN   rO   Útest_Rotation2D]   s    rb   c                  C   sR   t jdtj d�} | dtj dtj ƒ\}}t||gddgtj dtj d� d S rY   )r   r]   ÚuÚdegZarcsecr   r^   rN   rN   rO   Útest_Rotation2D_quantityc   s    re   c                  C   s:   t jdd�} | j| ddƒŽ \}}t||gddgdd� d S )Ng¶ä „Gm@rZ   r   r   r\   rB   )r   r]   rG   r   r^   rN   rN   rO   Útest_Rotation2D_inversei   s    rf   c               	   C   sÞ   t jdtj d�} t ddg¡}t dddg¡}d}tjt|d�� |  	||| j
¡ W 5 Q R X tjt|d�� |  	||| j
¡ W 5 Q R X t ddg¡}t ddg¡}d}tjtj|d�� |  	|tj || j
¡ W 5 Q R X d S )	Nr   rZ   r   r   r   ú,Expected input arrays to have the same shape©Úmatchz"x and y must have compatible units)r   r]   rc   rd   ÚnpÚarrayÚpytestÚraisesÚ
ValueErrorÚevaluater[   Z
UnitsErrorrL   )r_   r`   ra   ÚMESSAGErN   rN   rO   Útest_Rotation2D_errorso   s    rq   c                  C   s~   d} d}d}d}d}t  dddd¡}t||Ž |d	d
� t  dddd¡}t||Ž |d	d
� t  dddd¡}t|| Ž |d	d
� d S )Nr
   )r   r   r   )r@   r   )r   r   r   r   ÚzxzrA   rB   ÚzyzÚyzy)r   ÚEulerAngleRotationr   )r`   ra   ÚzZnegxZnegyr_   rN   rN   rO   Útest_euler_angle_rotations„   s    rw   rr   rs   rt   ÚyxyÚxyxÚxzxÚ
axes_orderc                 C   s2  t  d¡}t  d¡}t  d¡}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}	t  || || |	  | |	 || |  || g|| || |	  || | ||	  | | g||	 || |gg¡t  || | ||	  | | || |	  || g||	 || |  || || |	  || g| | ||	 |gg¡t  || | ||	  | | || || |	  g|| |||	 g| |	 || |  || || || |	  gg¡t  || || |	  || ||	 || |  g||	 || | g| | || |	  || || | ||	  gg¡t  |||	 || g|| || || |	  | |	 || |  g| | || || |	  || | ||	  gg¡t  || | ||	 g|| || | ||	  | | || |	  g|| ||	 || |  || || |	  gg¡dœ}
t |||g| ¡}t|j|
|  ƒ dS )zg
    Tests against all Euler sequences.
    The rotation matrices definitions come from Wikipedia.
    gffffff7@gffffff(@r1   )rr   rs   rt   rx   ry   rz   N)	rj   Údeg2radr   r   rk   r   Ú_create_matrixr   ÚT)r{   ÚphiÚthetaÚpsiÚc1Úc2Úc3Ús1Ús2Zs3ZmatricesZmatrN   rN   rO   Útest_euler_angles™   s`    


..ýÿ.,ýÿ..ýÿ,.ýÿ..ýÿ.,ýÿÜ,r‡   c                  C   s|   dd„ } d}d}d}d}d}t  d¡}t  d¡}|| ||| g}d}	t t  |¡tj |	¡}
| |
||ƒ}t||d	d
� dS )z²
    A sanity test - when V2_REF = 0 and V3_REF = 0,
    for V2, V3 close to the origin
    ROLL_REF should be approximately PA_V3 .

    (Test taken from JWST SIAF report.)
    c                 S   s¼   | d t  |¡ | d t  |¡   t  |¡ | d t  |¡  }| d | d  | d | d   t  |¡ | d | d  | d	 | d   t  |¡  }t  t  ||¡¡}|d
k r¸|d7 }|S )N)r   r   )r   r   )r   r   r
   )r   r   )r   r   )r   r   )r   r   )r   r   r   ih  )rj   r   r   Zrad2degZarctan2)ÚmatrixÚv2Úv3ÚXÚYZnew_rollrN   rN   rO   Ú_roll_angle_from_matrixã   s    (ÿþ(þz1test_rotation_3d.<locals>._roll_angle_from_matrixé¥   é6   r   r4   gå3�²4¦Æ>Úzyxyzgü©ñÒMbP?rB   N)rj   r|   r   r}   rc   rd   r   )r�   Úra_refÚdec_refÚv2_refÚv3_refZpa_v3r‰   rŠ   ÚanglesÚaxesÚMZ
roll_anglerN   rN   rO   Útest_rotation_3dÚ   s    	

r˜   c                  C   s´   d} d}d}d}d}d}d}d}t  || |||  g¡}d	}	tj||	d
�}
t ||¡\}}}|
|||ƒ\}}}t |||¡}t||dd� tj||	d
�}
|
||ƒ}t||dd� dS )zh
    Test taken from JWST INS report - converts
    JWST telescope (V2, V3) coordinates to RA, DEC.
    rŽ   r�   g“M=û_èÁ¿gkSÞ‹‡ª¶¿r4   éÒ   iµÿÿÿ)gî
­Þ2ÈZ@g7åg]ýAÀr�   ©r{   r\   rB   N)rj   rk   r   ÚRotationSequence3DZspherical2cartesianZcartesian2sphericalr   ZSphericalRotationSequence)r‘   r’   r“   r”   Zr0r‰   rŠ   Zexpected_ra_decr•   r–   Zv2sr`   ra   rv   Úx1Úy1Zz1rM   rN   rN   rO   Útest_spherical_rotation   s$    
rž   c               
   C   sl  t jtdd�� tjt ¡ dd� W 5 Q R X d} t jt| d�� tjdddd	gd
d� W 5 Q R X tjdddgd
d�}d} t jt| d��< | t 	dddg¡t 	ddg¡t 	ddg¡dddg¡ W 5 Q R X t jt| d��< | t 	ddg¡t 	dddg¡t 	ddg¡dddg¡ W 5 Q R X t jt| d��< | t 	ddg¡t 	ddg¡t 	dddg¡dddg¡ W 5 Q R X d S )Nú.Unrecognized axis label .* should be one of .*rh   Úabcrš   z8The number of angles 4 should match the number of axes 3r   r   r   r   Úzyxrg   )
rl   rm   rn   r   r›   ÚmkÚ	MagicMockro   rj   rk   )rp   r_   rN   rN   rO   Útest_RotationSequence3D_errors  s>     ÿ    ÿ   ÿ   ÿr¤   c                  C   s>   t jdddgdd�} t| jjjdddgƒ | jjd	ks:t‚d S )
Nr   r   r   r¡   rš   éýÿÿÿéþÿÿÿéÿÿÿÿÚxyz)r   r›   r   rG   r•   Úvaluer{   ÚAssertionError©r_   rN   rN   rO   Útest_RotationSequence3D_inverse8  s    r¬   c               	   C   s  d} t jt| d��$ tjt ¡ t ¡ t ¡ dd� W 5 Q R X t jtdd��$ tjt ¡ t ¡ t ¡ dd� W 5 Q R X d} t jt| d�� tjdtj	 d	d
dd� W 5 Q R X t jt| d�� tjdd	tj	 d
dd� W 5 Q R X t jt| d�� tjdd	d
tj	 dd� W 5 Q R X d S )NzDExpected axes_order to be a character sequence of length 3, got xyzxrh   Zxyzxrš   rŸ   r    ú=All parameters should be of the same type - float or Quantityr   r   r   r¨   )
rl   rm   Ú	TypeErrorr   ru   r¢   r£   rn   rc   rL   ©rp   rN   rN   rO   Útest_EulerAngleRotation_errors?  s2       ÿ ÿ   ÿ""r°   c                  C   sN   t  dddd¡} t| jjdƒ t| jjdƒ t| jjdƒ | jjdksJt‚d S )	Nr   r   r   r¨   r¥   r¦   r§   r¡   )	r   ru   r   rG   r   r€   r�   r{   rª   r«   rN   rN   rO   Útest_EulerAngleRotation_inverseY  s
    r±   c               	   C   s’   d} t jt| d�� t dtj dd¡ W 5 Q R X t jt| d�� t ddtj d¡ W 5 Q R X t jt| d�� t dddtj ¡ W 5 Q R X d S )Nr­   rh   r   r   r   )rl   rm   r®   r   Ú_SkyRotationrc   rL   r¯   rN   rN   rO   Útest__SkyRotation_errorsb  s    r³   c            	      C   s¬   t  ddd¡} t ¡ }t ¡ }t ¡ }t ¡ }t ¡ }d}t ¡ }tjjt jdd||fd��F}d|f|  |||||¡ks|t‚|j	t 
| |||||d	¡gksžt‚W 5 Q R X d S )
Nr   r   r   r   ro   T)ZautospecZreturn_valueim  rr   )r   r²   r¢   r£   ÚpatchÚobjectZ_EulerRotationÚ	_evaluaterª   Zcall_args_listÚcall)	r_   r   r€   rQ   rR   rS   rV   rW   ZmkEvalrN   rN   rO   Útest__SkyRotation__evaluatem  s&       ÿÿr¸   )*Zunittest.mockZmockr¢   Úmathr   r   Únumpyrj   rl   Znumpy.testingr   Zastropy.unitsZunitsrc   Zastropy.modelingr   r   Zastropy.tests.helperr   Zastropy.wcsr   ÚmarkZparametrizeZmgridrP   rT   rX   rb   re   rf   rq   rw   Zeuler_axes_orderr‡   r˜   rž   r¤   r¬   r°   r±   r³   r¸   rN   rN   rN   rO   Ú<module>   sx   &  þ  þûøþ
&  þ  þûûþ

@&	