U
    f»{jìT  ã                   @   sÊ  d dl Z d dlmZ d dlZd dlZd dlmZm	Z	m
Z
mZ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mZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9 ej:d	d
�Z:e ;e:ddd¡Z<e ;e:ddd¡Z=e ;e:d¡Z>e ;e>ddd¡Z?e ;e @eA¡dddd¡ZBe ;eBd¡ZCe ;eBd¡ZDe ;eBd¡ZEe ;eBd¡ZFdd„ ZGejHdd„ ƒZIejHdd „ ƒZJd!d"„ ZKd#d$„ ZLd%d&„ ZMd'd(„ ZNd)d*„ ZOd+d,„ ZPd-d.„ ZQd/d0„ ZRd1d2„ ZSd3d4„ ZTejHd5d6„ ƒZUd7d8„ ZVd9d:„ ZWd;d<„ ZXejHejY Zd=d>¡d?d@„ ƒƒZ[e \¡ dAdB„ ƒZ]dRdEdF„Z^ejY ZdGdHdIg¡ejY ZdJdK¡dLdM„ ƒƒZ_dNdO„ Z`e8ƒ e9ƒ ejYjaejHdPdQ„ ƒƒƒƒZbdS )Sé    N)Úassert_array_equalÚassert_equalÚassert_allcloseÚassert_array_lessÚassert_almost_equal)Útesting)Ú_get_img_fdata)Ú
read_transÚwrite_trans)Ú	read_info)Úinvert_transformÚ
_get_transÚrotationÚ
rotation3dÚrotation_anglesÚ_find_transÚcombine_transformsÚapply_transÚtranslationÚget_ras_to_neuromag_transÚ_pol_to_cartÚquat_to_rotÚrot_to_quatÚ_angle_between_quatsÚ_find_vector_rotationÚ_sph_to_cartÚ_cart_to_sphÚ_topo_to_sphÚ_average_quatsÚ_SphericalSurfaceWarpÚrotation3d_align_z_axisÚ_read_fs_xfmÚ_write_fs_xfmÚ
_quat_realÚ_fit_matched_pointsÚ_quat_to_eulerÚ_euler_to_quatÚ_quat_to_affineÚ_compute_r2Ú_validate_pipeline)Úrequires_nibabelÚrequires_dipyF)ÚdownloadZMEGÚsamplezsample_audvis_trunc-trans.fifzsample_audvis_trunc_raw-eve.fifÚsubjectsÚ	fsaverageÚmrizT1.mgzz..ÚioÚtestsÚdatazsample-audvis-raw-trans.txtztest_raw.fifztest_ctf_raw.fifztest_chpi_raw_sss.fifc                  C   sò   t jddt j ddd�} t  dt jd¡dd	… }t  t jd| |d
d�¡}d|_t|jd dƒ t|jƒ}| 	¡ }|d9 }|dd…df  d7  < t
ƒ }dt|ƒks¦t‚| |ddd… |ddd… ¡ dt|ƒksÖt‚| |¡}t||dd� dS )zTest TPS warping.ç        é   é   F)Zendpointr   é   é   éÿÿÿÿZij)Zindexing)é   r9   éÈ   Nzno r:   Zoct5gü©ñÒMbP?©Úatol)ÚnpZlinspaceÚpiÚarrayZmeshgridÚshaper   r   ÚTÚcopyÚSphericalSurfaceWarpÚreprÚAssertionErrorÚfitZ	transformr   )ÚazZpolÚsphÚsourceZdestinationZwarpZdestination_est© rK   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_transforms.pyÚtest_tps0   s    
 
rM   c                  C   s2   t tƒ} t| ƒ} ttƒd }| j|dd�s.t‚dS )z-Test converting '-trans.txt' to '-trans.fif'.r   çñhãˆµøä>r<   N)r	   Úfnamer   r   Úfname_transÚ__eq__rF   )ÚtransZtrans_2rK   rK   rL   Útest_get_transD   s    rS   c              	   C   s¶   t | ƒ}t t |d¡¡ tjttd|d� t	t
ƒ}t |dd¡}| |¡ |td|d�ks`t‚t	|ƒ}||kstt‚t tt	t¡ t |d¡}tjtdd�� t||ƒ W 5 Q R X dS )z(Test reading and writing of trans files.r-   )Úsubjects_dirztest-trans.fifztrans-test-bad-name.fifz
-trans.fif©ÚmatchN)ÚstrÚosÚmkdirÚopÚjoinÚpytestÚraisesÚRuntimeErrorr   r	   rO   ÚsaverF   ÚIOErrorÚ	fname_eveZwarnsÚRuntimeWarningr
   )Útmp_pathÚtempdirZtrans0Zfname1Ztrans1Zfname2rK   rK   rL   Útest_io_transM   s    
re   c                  C   sâ   t j d¡} dddg}dddg}dddg}dddg}|  ddd¡}t  |||||f¡}|  dt j dt j d¡\}}}	}
}}t  t|
||ƒt|||	ƒ¡}t	||ƒ}|d	d
… \}}}t
|||ƒ}t	||ƒ}d}t||d|d� d	S )z8Test the coordinate transformation from ras to neuromag.r   r8   r9   gš™™™™™é?)r:   r:   éþÿÿÿr5   é   Nr:   zNeuromag transformation failedg�íµ ÷Æ°>)r=   Úerr_msg)r>   ÚrandomÚRandomStateÚuniformZvstackr?   Údotr   r   r   r   r   )ÚrngZanteriorÚleftÚrightÚupZrand_ptsZptsÚrxZryZrzZtxÚtyÚtzrR   Zpts_changedZnasZlpaZrpaZ	hsp_transZpts_restoredÚerrrK   rK   rL   Útest_get_ras_to_neuromag_transe   s    



&

ru   c                 C   s:   t  | |¡}t  ||¡}t  ||¡}t  || ¡}|||fS ©úConvert using old function.)r>   ÚhypotZarctan2)ÚxÚyÚzZhypotxyÚrZelevrH   rK   rK   rL   Ú_cartesian_to_sphere~   s
    r}   c                 C   sB   |t  |¡ }|t  |¡ }|t  | ¡ }|t  | ¡ }|||fS rv   )r>   ÚsinÚcos)ÚthetaÚphir|   r{   Zrcos_phiry   rz   rK   rK   rL   Ú_sphere_to_cartesian‡   s
    r‚   c                  C   sN  ddt jd   } }}| t  |¡ }| t  |¡ }|t  |¡ }|t  |¡ }tt  | ||gg¡ƒd }t||||fdd� t|| ddfdd� t j d¡}| 	dd¡}	ttt
|	ƒƒ|	d	d� |	D ]†}t
|t j ƒ}
t|
ƒ}t  t|Ž ¡}t|Ž }t jd |d
  |d
< t|
d |ddd
g dd� t|d |dd� t|d |dd� qÂdS )z-Test conversion between sphere and cartesian.g      &@r4   ç       @r   çH¯¼šò×z>r<   é
   r:   rN   r8   r5   N)r>   r?   r   r~   r   r@   r   ri   rj   Úrandnr   Únewaxisr}   r‚   )r|   r€   r�   r{   Zrsin_phiry   rz   Úcoordrm   ZcoordsrI   ZcartZsph_oldZcart_oldrK   rK   rL   Útest_sph_to_cart�   s(    r‰   c                 C   s$   |t  | ¡ }|t  | ¡ }||fS )z)Transform polar coordinates to cartesian.)r>   r   r~   )r€   r|   ry   rz   rK   rK   rL   Ú_polar_to_cartesian«   s    rŠ   c                  C   sÌ   d} t j}| t  |¡ }| t  |¡ }tt  | |gg¡ƒd }t|||fdd� t|ddd� t|t|| ƒdd� t j 	d¡}| 
d¡} | d¡dt j  }t  | |f¡j}tdd	„ |D ƒt|ƒdd� d
S )z7Test helper transform function from polar to cartesian.r8   r   r„   r<   )r9   r   r…   r5   c                 S   s   g | ]}t |d  |d ƒ‘qS )r8   r   )rŠ   )Ú.0ÚprK   rK   rL   Ú
<listcomp>Â   s     z+test_polar_to_cartesian.<locals>.<listcomp>N)r>   r?   r   r~   r   r@   r   rŠ   ri   rj   r†   ÚrandrB   )r|   r€   ry   rz   rˆ   rm   ZpolarrK   rK   rL   Útest_polar_to_cartesian²   s     
 ÿr�   c                 C   s   d| d }|  }||fS )rw   ç      à?é´   rK   )r€   ÚradiusÚsph_phiÚ	sph_thetarK   rK   rL   Ú_topo_to_phi_thetaÆ   s    r•   c                  C   s~  t j d¡} |  d¡d }|  d¡}d|d< d|d< tt  ||g¡jƒ}t|ƒ}|dd…ddgf ddg |dd…ddgf< tt	||ƒƒD ]î\}\}}t
||ƒ\}}	|dkrÀtt
||ƒd	d
gƒ |	d t j }
|d t j }t|| d|
t jd | gdd� t  |¡}t|
||ƒ\}}}| ||g}|dk�rft  dt  d¡d dg¡}|t  d¡ }t||dd� t||| dd� qŠdS )zTest topo to sphere conversion.r   r…   ih  é   ç      Ð?Nr8   r9   é-   iâÿÿÿg     €f@ç      ð?rƒ   r„   r<   r�   r:   r5   )r>   ri   rj   rŽ   r   r@   rB   r   Ú	enumerateÚzipr•   r   r?   Z	ones_liker‚   Úsqrt)rm   ZanglesZradiirI   ÚnewÚiiÚangler’   r“   r”   ZazimuthZ	elevationr|   ry   rz   r{   ÚposÚexpectedrK   rK   rL   Útest_topo_to_sphÍ   s2    
,ÿ

r¢   c            	      C   sˆ   ddt jddfg} | D ]l}|\}}}t|||ƒ}t|||ƒ}t||dd…dd…f ƒ t|ƒ}t||dd� t|ƒ}t||dd� qdS )	zBTest conversion between rotation angles and transformation matrix.)r   r   r8   )r�   r�   r�   r   g      ø¿Nr:   r7   )ÚactualZdesiredÚdecimal)r>   r?   r   r   r   r   r   )	r2   Úrotry   rz   r{   ÚmZm4ÚbackZback4rK   rK   rL   Útest_rotationë   s    
r¨   c               	   C   sÜ   dddgdddgdddgdddgdddgg} dddgdddgdddggdddgdddgdd	dggdddgdddgd	ddggdddgdd	dgddd	ggd
ddgdddgdddggg}t || ƒD ]\}}t|t|ƒdd� q¼dS )zTest rotation3d_align_z_axis.r   r8   r9   g ,¥üÞè¿gá< ùæã¿gÙíÔØ5ŒÌ?r™   r4   ç      ð¿gL‘¶ÐAá?gø;”±mØ¿g*ª~¥óáå?g ,¥üÞè?gá< ùæã?r„   r<   N)r›   r   r    )Zinp_zsZexp_resÚresr{   rK   rK   rL   Útest_rotation3d_align_z_axisù   s     ÿþür«   c               	   C   s~   t tƒ} t| ƒ}t| || d | d ƒ t tt| || d | d ¡ t tt| || d | d ¡ t tt| | | d | d ¡ dS )zTest combining transforms.ÚfromÚtoN)r	   rO   r   r   r\   r]   r^   )rR   ÚinvrK   rK   rL   Útest_combine  s     ÿ ÿ ÿr¯   c            
      C   sü  t  d¡g} tttfD ]*}| t|ƒd d dd…dd…f g7 } q| t  dddgddd	gdd	d
gg¡g7 } | t  ddd	gdddgd	dd
gg¡g7 } | t  dddgdd
d	gdd	dgg¡g7 } | D ]P}t|tt	|ƒƒddd� |t j
t j
dd…dd…f }t|tt	|ƒƒddd� q¾tdƒD ]b}tdƒD ]R}t  d¡}t  d¡}d||< d||< ||k�r\t jnd}tt||ƒ|dd� �q$�qt  dddgdddgdddgg¡}ttt	|ƒt  d¡ƒt jƒ t  dddgdddgdddgg¡}	ttt	|	ƒt  d¡ƒt jƒ dS )zTest quaternion calculations.r:   Z
dev_head_trR   NguùÞø=þï¿göÛÏ+/“¿gý¬*âh‚¿g)Iðé^ä?g¶Q®¾ôè?gÜº¼µ#ä¿rN   ©Úrtolr=   r™   r4   r<   r9   r   r8   r©   )r>   ÚeyeÚtest_fif_fnameÚ	ctf_fnameÚhp_fif_fnamer   r@   r   r   r   r‡   ÚrangeZzerosr?   r   )
ZrotsrO   r¥   rž   ZjjÚaÚbr¡   Zy_180Zh_180_attitude_90rK   rK   rL   Útest_quaternions  s`    (ý
ý
ý
 ÿ ÿ

"
ÿÿ"
ÿÿr¹   c                  C   s|   t  dddg¡} t  dddg¡}t| |ƒ}t|dddgdddgdddggƒ t|ƒ}tt  d¡ƒ}tt||ƒt jd ƒ dS )	z Test basic rotation matrix math.r™   r4   r   r9   r8   r:   rƒ   N)	r>   r@   r   r   r   r²   r   r   r?   )ry   rz   r¥   Zquat_1Zquat_2rK   rK   rL   Útest_vector_rotationH  s    
ÿrº   c               	   C   sª  dt  d¡ } t  d| | gd| | gd| dgdd| g| ddggt¡}|d |d dddgdddgdddgg}t|ƒD ]&\}}tt|d	|d
 … ƒ|dd� qr|d
  d9  < t|d	d… ƒ\}}t||dd� t|ƒD ]&\}}tt|d	|d
 … ƒ|dd� qÔd}| | dggtt  	d¡ƒ }t  
|||f¡D ]d}	t jt|	ƒddd��r*|d
7 }t|	|	 ƒ}
t|
ddd� tt  |	|	 f¡ƒ\}}t||dd� �q*|dt|ƒ k�s¦t‚d	S )zTest averaging of quaternions.r™   rƒ   r   g�È¢Ó<é?g3�E§yâ?g7ÑK%¸å?gB{À!6´¹?gïCˆø¸ã?Nr8   r„   r<   r9   r5   r:   r4   é   )r>   rœ   r@   Úfloatrš   r   r   r   Úlistr²   ZconcatenateÚiscloser#   r   ÚlenrF   )Zsq2Úquatsr¡   ZlimÚexZrot_0Zrot_1ÚcountÚextrasÚquatrŸ   rK   rK   rL   Útest_average_quatsT  s@    üüü  rÅ   Úsubject)r/   r-   c           
   	   C   s\  t  td| ddd¡}t|ƒ\}}| dkr<t|t d¡dd� |d	ksHt‚t|ƒ}t  |d
¡}t	|||ƒ t|ƒ\}}||ks€t‚t||ddd� tj
 d¡ dd¡|dd…< t	||dƒ t|ƒ\}}|dksÐt‚t||ddd� t|dƒ�}	|	 d¡ W 5 Q R X tjtdd�� t|ƒ W 5 Q R X t	||dd… dƒ tjtdd�� t|ƒ W 5 Q R X dS )z2Test reading and writing of Freesurfer transforms.r.   r0   Ú
transformsztalairach.xfmr/   r»   rN   r<   zMNI Transform Filezout.xfmr°   r   r:   NZfooÚwzFailed to findrU   r5   zCould not find)rZ   r[   Ú	data_pathr!   r   r>   r²   rF   rW   r"   ri   rj   r†   ÚopenÚwriter\   r]   Ú
ValueError)
rÆ   rc   rO   ZxfmÚkindrd   Z	fname_outZxfm_readZ	kind_readZfidrK   rK   rL   Útest_fs_xfmy  s2    ÿrÎ   c                  C   sB   t j d¡ dd¡} d| dd…df< | dt jj| ddd�  } | S )	zMake some unit quats.r   é   r:   Nr5   r8   T)ZaxisZkeepdims)r>   ri   rj   r†   ÚlinalgÚnorm)rÀ   rK   rK   rL   rÀ   ™  s    rÀ   rN   r„   c                 C   sÈ  d}dt j_zt jj| |||dd�}W 5 dt j_X t| |||d�\}	}
t|ƒdt|ƒ ks^t‚t|d d… ƒ}|dd… }t	 
t|	d d… |ƒ¡}t	j |	dd … | ¡}d|  kr¾|k sÈn td	ƒ‚d|  krÜ|k sæn td
ƒ‚|�r|d }t|
||dd� t|	ƒ}|d d…d d…f  |
9  < |d k�r<t	 d¡n|}t	j |d d …t	jf t|| ƒ | ¡}t j dd|f|¡}t	j |d d …t	jf t|| ƒ | ¡}|dk�rÀ||d k �sÀt‚|	|
fS )NTFÚparams)ÚweightsÚscaleÚout)rÔ   rg   r:   r   rŸ   ÚdistrÔ   )r±   rh   r8   ç›+¡†›„=g      ø?)ÚmneZcoregZ_ALLOW_ANALITICALZfit_matched_pointsr$   r¿   ÚintrF   r&   r>   Úrad2degr   rÐ   rÑ   r   r'   Úonesr‡   r   Z_trans_from_params)rŒ   ry   rÓ   Údo_scaleÚangtolÚdtolÚstolZ__tracebackhide__rÒ   Zquat_anZscale_anZq_coZtranslate_corŸ   rÖ   Zscale_corR   Zerr_anZerr_corK   rK   rL   Ú_check_fit_matched_points¢  sF        ÿ

ÿÿ
rà   Úscalingr—   r8   rÜ   )TFc                 C   s>  |dkr|sdS t j d¡}| dd¡}| d¡}t| ƒD �]ü\}}|t  t|ƒ|j¡j | }dD ]‚}	|	r”|d  d7  < t  t	|ƒ¡}
d|
d< nd}
t
|||
|d	�\}}t||d
d� t|dd… |dd� t|dd… |dd� qdd }}dD �]@}|�s2d}
d}|dk�r"d}d\}}}nd}d\}}}nFt  t	|ƒ¡}
d|
d< |df}|df}|dk�rnd\}}}n
d\}}}t
|||
||||d�\}}t j|dd… |d
d��r°t‚t j|dd… |d
d��rÎt‚t  t|dd… |ƒ¡}t|d |ƒ t||d ƒ t j |dd… | ¡}t|d |ƒ t||d ƒ qôq:dS )z4Test analytical least-squares matched point fitting.r8   Nr   r…   r:   )FT)r   r5   éd   )rÓ   rÜ   rN   )r±   r×   r<   )rÏ   r6   )rÏ   é_   )r8   é   r:   )rÏ   éi   )r6   rä   r:   r‘   )r‘   éF   r:   )é2   ræ   r:   )rÓ   rÜ   rÝ   rÞ   rß   )r>   ri   rj   r†   rš   rl   r   rB   rÛ   r¿   rà   r   ZallcloserF   rÚ   r   r   rÐ   rÑ   )rÀ   rá   rÜ   rm   Zfror   ZqirÄ   r­   Z	corruptedrÓ   ZestZ	scale_estrŸ   rÖ   ZweightedZdist_boundsZangle_boundsrÝ   rÞ   rß   rK   rK   rL   Útest_fit_matched_pointsÄ  sp    

   ÿ




     þ
rè   c                 C   sL   t | ƒ}t|ƒ}t| |dd� t| ƒ}t dd„ |D ƒ¡}t||dd� dS )zTest euler transformations.r×   r<   c                 S   s$   g | ]}t |Ž d d…d d…f ‘qS )Nr:   )r   )r‹   ÚerK   rK   rL   r�     s     ztest_euler.<locals>.<listcomp>N)r%   r&   r   r   r>   r@   )rÀ   ZeulerZquats_2Zquat_rotZ	euler_rotrK   rK   rL   Ú
test_euler   s    rê   c               	   C   sz  ddl } ddlm} |  t¡}t d¡}d|d< || ¡ | ¡ |j|jtj	 
|¡d�}tdd	ƒD ]f\}}tjj|||dd
gd�\}}t||dd� tjj|||||d�}	tt|	ƒt|ƒƒ}
d|
k s`t‚q`tjtdd�� tjj||||dd� W 5 Q R X tdd
ƒD ].}t d|¡D ]}t|ƒ tt|ƒƒ �q�qtjtdd�� tdƒ W 5 Q R X tjtdd�� tdƒ W 5 Q R X dS )zTest volume registration.r   N)Úresampler»   r…   )r   r:   )ZmovingZstaticZmoving_affineZstatic_affineZbetween_affine)Zrigids)r   Úsdr)r4   z1%rÏ   )ÚpipelineZzoomsZniterg{®Gáz„?r<   )Úcvalgš™™™™ùX@rî   rU   Úbadr8   )r   ZrigidÚaffinerì   z"Steps in pipeline are out of order)rì   rð   z(Steps in pipeline should not be repeated)rð   rð   )ZnibabelZ
dipy.alignrë   ÚloadÚfname_t1r>   r²   Z	get_fdatarð   rÐ   r®   r›   rØ   rÇ   Zcompute_volume_registrationr   Zapply_volume_registrationr(   r   rF   r\   r]   rÌ   r¶   Ú	itertoolsÚcombinationsr)   r½   )Znibrë   ZT1rð   ZT1_resampledrí   rî   Z
reg_affineZ	sdr_morphZ
T1_alignedÚr2Zpipeline_lenrK   rK   rL   Útest_volume_registration
  sd    


ü    ÿ
    ÿ    ÿ ÿÿrö   )rN   rN   r„   )crX   Úos.pathÚpathrZ   r\   Únumpyr>   Znumpy.testingr   r   r   r   r   ró   rØ   Zmne.datasetsr   Z	mne.fixesr   r	   r
   Zmne.ior   Zmne.transformsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rD   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Z	mne.utilsr*   r+   rÉ   r[   rO   ra   rT   rò   ÚdirnameÚ__file__Úbase_dirrP   r³   r´   rµ   rM   Zrequires_testing_datarS   re   ru   r}   r‚   r‰   rŠ   r�   r•   r¢   r¨   r«   r¯   r¹   rº   rÅ   ÚmarkZparametrizerÎ   ZfixturerÀ   rà   rè   rê   Zslowteströ   rK   rK   rK   rL   Ú<module>   s|   €
ÿ

		
.%
	     ÿ
":
