U
    f»{j#!  ã                   @   s”  d dl mZ d dlZd dlZd dlmZmZ d dl	Z	d dl	m
Z
mZmZmZmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZmZ d dlmZ ejdd	�Ze ed
¡Ze ed
ddd¡Z e ed
ddd¡Z!e eddd¡Z"ej# $d ¡Z%ej&dd„ ƒZ'ej&eƒ dd„ ƒƒZ(ej&dd„ ƒZ)ej&dd„ ƒZ*eƒ ej&dd„ ƒƒZ+dd„ Z,ej&eƒ ej- .dde e /e	j0¡dd¡g¡d d!„ ƒƒƒZ1ej&d"d#„ ƒZ2dS )$é    N)Úassert_allcloseÚassert_array_equal)Úvertex_to_mniÚhead_to_mniÚread_talxfmÚread_freesurfer_lutÚget_volume_labels_from_aseg)Útesting)Ú_get_mgz_headerÚ_check_subject_dirÚread_ltaÚ_estimate_talxfm_rigid)Úapply_transÚ
_get_transÚrot_to_quatÚ_angle_between_quats)Úrequires_nibabelF)ÚdownloadZsubjectsÚsampleÚmrizT1.mgzzaseg.mgzZMEGzsample_audvis_trunc-trans.fifc                	   C   s2   t dtƒ tjtdd�� t dtƒ W 5 Q R X dS )z;Test checking for a Freesurfer recon-all subject directory.r   zsubject folder is incorrect©ÚmatchZfooN)r   Úsubjects_dirÚpytestÚraisesÚ
ValueErrorÚ	data_path© r   r   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_freesurfer.pyÚtest_check_subject_dir   s    
r   c                  C   s^   ddl } ttƒ}|  t¡j}t| ¡ |d ƒ t| ¡ |d ƒ t| ¡ t	j
 |d ¡ƒ dS )zTest MGZ header reading.r   NZdimsZvox2ras_tkrZvox2ras)Únibabelr
   Ú	fname_mriÚloadÚheaderr   Zget_data_shapeZget_vox2ras_tkrZget_ras2voxÚnpÚlinalgÚinv)r    r#   Zmri_hdrr   r   r   Útest_mgz_header#   s    r'   c                  C   sb   ddddg} t  dddgdd	d
gdddgdddgg¡}ddddg}t| |dtƒ}t||dd� dS )z/Test conversion of vertices to MNI coordinates.i`Š iÄ  iL iùy g®GáznNÀg\�Âõ(\&Àg…ëQ¸…	Àg{®Gá:BÀgìQ¸…KWÀgáz®GáÀg      CÀg
×£p=
I@g¸…ëQ8%ÀgR¸…ë‘G@g…ëQ¸ @g×£p=
wG@r   é   r   ç      ð?©ZatolN)r$   Úarrayr   r   r   )ÚverticesÚcoordsÚhemisÚcoords_2r   r   r   Útest_vertex_to_mni/   s     ÿr0   c                  C   s¨   t  dddgdddgdddgdd	dgg¡d
 } tdtƒ}t|d | ƒd
 }ttdddd�\}}t  dddgdddgdddgdddgg¡}t|d|tƒ}t||dd� dS ) z4Test conversion of aseg vertices to MNI coordinates.g…ëQ¸…6@g{®Gáz&@g¸…ëQ¸1@g×£p=
×@g®Gáz”5@gš™™™™0@g{®Gá:6@g=
×£p=5@g¸…ëQ¸ @g     @�@r   Ztransr   ÚheadF)Ú
allow_noneguø÷[3à‘?gI2å"BL›?g�®Ø�Í ?g…w¹ˆïÄ„?gÓÍ�™?gxIqD­¥?gÐá­5Œ‘?gðë4�6§™?g(µrHÍ¥?gOyðê‡ž‘?gØ zïûyŸ?g”1>Ì^¶£?g      $@r*   N)	r$   r+   r   r   r   r   Útrans_fnamer   r   )r-   ZxfmZ
coords_MNIZ
mri_head_tÚ_Zcoo_right_amygdalaZcoords_MNI_2r   r   r   Útest_head_to_mni<   s$     ÿÿ
ýÿr5   c                    sr   d}d}t  dd|¡}t  dd|¡}t|||tƒ}tjj‰ |  tjd‡ fdd„¡ t|||tƒ}t||d	d
� dS )z;Test equivalence of vert_to_mni for nibabel and freesurfer.éè  r   r   i † r(   Ú_read_mri_infoc                     s   ˆ | ddi|—ŽS )NZuse_nibabelTr   )ÚargsÚkwargs©Zread_mrir   r   Ú<lambda>_   ó    z/test_vertex_to_mni_fs_nibabel.<locals>.<lambda>gš™™™™™¹?r*   N)	ÚrngÚrandintr   r   ÚmneZ_freesurferr7   Úsetattrr   )ZmonkeypatchZn_checkÚsubjectr,   r.   r-   r/   r   r:   r   Útest_vertex_to_mni_fs_nibabelS   s     
þrB   c                 C   sp   t t | d¡dƒ�}| d¡ W 5 Q R X ttt | d¡ƒt ddddgdd	d
dgddddgddddgg¡ƒ dS )z6Test reading a Freesurfer linear transform array file.ztest.ltaÚwa–  type      = 0 # LINEAR_VOX_TO_VOX
                     nxforms   = 1
                     mean      = 0.0000 0.0000 0.0000
                     sigma     = 1.0000
                     1 4 4
                     0.99221027 -0.05494503  0.11180324 -3.84350586
                     0.05233596  0.99828744 0.02614108 -9.77523804
                     -0.11304809 -0.02008611 0.99338663 15.25457001
                     0 0 0 1
                     src volume info
                     valid = 1  # volume info valid
                     filename = tmp.mgz
                     volume = 256 256 256
                     voxelsize = 1 1 1
                     xras   = -1 0 0
                     yras   = 0 0 -1
                     zras   = 0 1 0
                     cras   = -1.19374 -3.31686 3.25835
                     dst volume info
                     valid = 1  # volume info valid
                     filename = tmp.mgz
                     volume = 256 256 256
                     voxelsize = 1 1 1
                     xras   = -1 0 0
                     yras   = 0 0 -1
                     zras   = 0 1 0
                     cras   = -1.19374 -3.31686 3.25835)gvøŒÀ/Àï?g— ÛEÁ!¬¿gâc#Ÿ¼?g�y €¿Àg¦£5iÇËª?g�×Y€øñï?g•}º.ºÄš?g�Ô ìŒ#Àg%Þl9¸ð¼¿g³&7t‘”¿gâFÂÒÉï?gü W‚.@g        r)   N)ÚopenÚopÚjoinÚwriter   r   r$   r+   )Útmp_pathÚfidr   r   r   Útest_read_ltae   s    


ýþrJ   ÚfnameÚdatazFreeSurferColorLUT.txtc              	   C   sæ  t | ƒ\}}t|ƒ d¡dks"t‚t|ƒt|ƒ  kr>dksDn t‚ttdd�\}}t|tƒsbt‚t|tƒspt‚| d¡dks‚t‚|D ]"}t|tj	ƒsšt‚|j
dks†t‚q†t|ƒt|ƒ  krÆdksÌn t‚tjtdd	�� ttd|d
� W 5 Q R X tt|d�}||k�st‚| dk	�rdS |d } dd„ dD ƒ}t dt|ƒd ¡}	dd„ |	D ƒ}t| dƒ�L}
t||	|ƒD ]8\}}}d dd„ |D ƒ¡}d|||f }|
 |¡ �qlW 5 Q R X t | ƒ\}}t|ƒt|ƒ  k�rðt|ƒ  k�rðt|	ƒk�sön t‚t||	|ƒD ]X\}}}||k�st‚||k�s(t‚t|| dd… |dd… ƒ || |k�st‚�qt| dƒ�T}
t||	|ƒD ]@\}}}d dd„ |dd… D ƒ¡}d|||f }|
 |¡ �qtW 5 Q R X tjtdd	�� t | ƒ W 5 Q R X dS )z Test reading volume label names.z
Brain-Stemr(   iò  T)Úreturn_colors©é   é.   zmust be Falser   )rM   Ú	atlas_ids)rQ   Nzlong.txtc                 S   s   g | ]}d | ‘qS )z0Anterior_Cingulate_and_Medial_Prefrontal_Cortex-r   )Ú.0Zhemir   r   r   Ú
<listcomp>©   s   ÿz,test_read_freesurfer_lut.<locals>.<listcomp>)ZlhZrhc                 S   s   g | ]}|fd  ‘qS rN   r   )rR   Úid_r   r   r   rS   ¬   s     rC   ú c                 s   s   | ]}d | V  qdS ©z%3dNr   ©rR   Úxr   r   r   Ú	<genexpr>¯   s     z+test_read_freesurfer_lut.<locals>.<genexpr>z%d    %s %s
é   c                 s   s   | ]}d | V  qdS rV   r   rW   r   r   r   rY   »   s     Ú	formatted)r   ÚlistÚcountÚAssertionErrorÚlenr   Ú
aseg_fnameÚ
isinstancer$   ZndarrayÚshaper   r   r   ZarangerD   ÚziprF   rG   r   ÚRuntimeError)rK   rH   rQ   ÚcolorsZlabel_namesZlabel_colorsÚcZlabel_names_2ÚnamesZidsrI   ÚnamerT   ÚcolorZ	out_colorÚlineZlutZ
got_colorsr   r   r   Útest_read_freesurfer_lut‹   sh    " ÿ
"  ÿ ÿ
ÿ:rk   c                  C   sÌ   t dtd�} t| t d¡dd� t dtd�} ttjj| dd…dd…f d	d
�ddd� dtj | dd…df ¡ }d|  k r†dk sŒn t‚t t	t
| dd…dd…f ƒƒ¡}d|  k rÂdk sÈn t‚dS )z0Test that talxfm_rigid gives reasonable results.Z	fsaverage)r   rO   g�íµ ÷Æ°>r*   r   NrZ   r(   )Zaxisr)   r6   é   éF   é   é   )r   r   r   r$   Úeyer%   Znormr^   Zrad2degr   r   )ZrigidÚmoveÚangr   r   r   Útest_talxfm_rigidÂ   s    *"rs   )3Úos.pathÚpathrE   Únumpyr$   r   Znumpy.testingr   r   r?   r   r   r   r   r   Zmne.datasetsr	   Zmne._freesurferr
   r   r   r   Zmne.transformsr   r   r   r   Z	mne.utilsr   r   rF   r   r!   r`   r3   ÚrandomZRandomStater=   Zrequires_testing_datar   r'   r0   r5   rB   rJ   ÚmarkZparametrizeÚdirnameÚ__file__rk   rs   r   r   r   r   Ú<module>   sN   
ÿ



&þ1