U
    f»{jWM  ã                   @   sŒ  d dl mZ d dlZd dlZd dlmZmZm	Z	 d dl
mZmZmZmZmZ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 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( d d
l)m*Z*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ej4dd�Z4e 5e4d¡Z6e 5e6ddd¡Z7e 5e4ddd¡Z8e 5e4ddd¡Z9e 5e6ddd¡Z:ej; <d ¡Z=dd„ Z>ej?dd„ ƒZ@dd„ ZAdd„ ZBej?d d!„ ƒZCej?d"d#„ ƒZDd$d%„ ZEe0d&ƒd'd(„ ƒZFejG Hd)d*d+d,g¡ej?d-d.„ ƒƒZId/d0„ ZJejG Hd1ejKejLd2f¡ejG Hd3d4¡ejG Hd5d6¡d7d8„ ƒƒƒZMe1ƒ ej?d9d:„ ƒƒZNd;d<„ ZOe1ƒ e2ƒ ejGjPej?d=d>„ ƒƒƒƒZQej?ejG Hd?d@¡ejG HdAdB¡dCdD„ ƒƒƒZRdS )Eé    N)Úassert_array_equalÚassert_allcloseÚassert_equal)Úread_surfaceÚwrite_surfaceÚdecimate_surfaceÚ
pick_typesÚdig_mri_distancesÚget_montage_volume_labels)Úmake_dig_montage)Úget_mni_fiducials)Útesting)Ú	read_info)ÚFIFF)Ú_compute_nearestÚ_tessellate_sphereÚfast_cross_3dÚget_head_surfÚread_curvatureÚget_meg_helmet_surfÚ_normal_orthÚ_read_patchÚ_marching_cubesÚ_voxel_neighborsÚwarp_montage_volumeÚ_project_onto_surfaceÚ_get_ico_surface)Ú
_get_transÚcompute_volume_registrationÚapply_trans)Úcatch_loggingÚobject_diffÚrequires_freesurferÚrequires_nibabelÚrequires_dipyÚ_record_warningsF)ÚdownloadÚsubjectsÚsampleÚbemz!sample-1280-1280-1280-bem-sol.fifZMEGzsample_audvis_trunc-trans.fifzsample_audvis_trunc_raw.fifÚ	fsaverageÚmrizT1.mgzc               
   C   sn  t  t  t¡dd¡} t  | ddd¡}t  | dddd¡}t  | dddd	¡}t  | ddd
¡}t  | ddd¡}t|ƒd }t|ƒ}| ¡ }t|dd�D ]&}	d|d |	 d< tj	|d |	 d< q�t|ƒddft|ƒddft|ƒddft|ƒddf|ddf|ddffD ]l\}
}}t
ƒ �}t|
|dd�}W 5 Q R X | ¡ }||k�s<t‚tt|d ƒ|ƒ tt|d ƒt|d ƒƒ qüdS ) zTest loading helmet surfaces.z..ÚioZtestsÚdataztest_raw.fifZkitztest_bin_raw.fifZbtizexported4D_linux_raw.fifztest_ctf_raw.fifzsample-audvis-raw-trans.txtr   T)Zmegi'  ZchsZ	coil_typei0  Z306mé–   ZKITZMagnesiV  ZCTFéf   ÚunknownZ
ARTEMIS123)ÚverboseÚrrÚnnN)ÚopÚjoinÚdirnameÚ__file__r   r   Úcopyr   r   ZFIFFV_COIL_ARTEMIS123_GRADr    r   ÚgetvalueÚAssertionErrorr   Úlen)Úbase_dirÚ	fname_rawZfname_kit_rawZfname_bti_rawZfname_ctf_rawÚfname_transZtransZnew_infoZartemis_infoÚpickÚinfoÚnÚnameÚlogZhelmet© rD   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_surface.pyÚtest_helmet*   s@    ÿÿ
ÿÿûrF   c                  C   sL   t dtd�} t ddtd�}t| d ƒt|d ƒk s6t‚tjtt dtd� dS )zTest loading the head surface.r(   )Úsubjects_dirÚheadr2   N)ÚsubjectrG   )r   rG   r;   r:   ÚpytestÚraisesÚ	TypeError)Zsurf_1Zsurf_2rD   rD   rE   Ú	test_headK   s    
ÿrM   c                  C   sn   t  dd¡} t  dd¡}t | |¡}t| |ƒ}t||ƒ t| dd…tjf |d ƒ}t||dd…df ƒ dS )z)Test cross product with lots of elements.i † é   é   Nr   )ÚrngZrandÚnpÚcrossr   r   Znewaxis)ÚxÚyÚzÚzzrD   rD   rE   Útest_fast_cross_3dU   s    

rW   c            	      C   s8  t  dd¡} | t tj| d dd�¡dd…df  } t  tjdtjd�¡dd… }| | }t| |d	d
�}t| |dd
�}t| |dd
�}t	||ƒ t	||ƒ t	||ƒ t| |d	dd�}t| |ddd�}t| |ddd�}t	|d |ƒ t	|d t 
|¡ƒ tt|ƒt|ƒƒ t|||ƒD ] \}}}t	||ƒ t	||ƒ �qdS )zTest nearest neighbor searches.éô  rN   é   rO   ©ZaxisN©Údtypeé   ZBallTree)ÚmethodZcKDTreeZcdistT)r^   Zreturn_distsr   )rP   ZrandnrQ   ÚsqrtÚsumZpermutationZarangeZint64r   r   Z
zeros_liker   r;   Úzip)	rS   Znn_truerT   Znn1Znn2Znn3Znnn1Znnn2Znnn3rD   rD   rE   Útest_compute_nearesta   s&    (



rb   c              
   C   s6  t | ƒ}t tdddd¡}t tdddd¡}||fD ]â}tƒ � t|dd	�\}}}W 5 Q R X tt |d
¡|||dd� tƒ �  tt |d
¡dd	�\}}	}
W 5 Q R X t||ƒ t||	ƒ tt	||
ƒdƒ ||krÐq4tt |d¡||ddd� tt |d¡dd	�\}}	t||ƒ t||	ƒ q4t tdddd¡}t
|ƒ dS )z:Test reading and writing of Freesurfer surface mesh files.r'   ZbertÚsurfzlh.inflated.nofixr(   r)   zinner_skull.surfT)Zread_metadataÚtmp)Zvolume_infoÚ	overwriteÚ ztmp.objNFr*   zrh.cortex.patch.flat)Ústrr4   r5   Ú	data_pathr%   r   r   r   r   r!   r   )Ztmp_pathÚtempdirZ
fname_quadZ	fname_triÚfnameZptsZtriZvol_infoZc_ptsZc_triZ
c_vol_infoZfname_patchrD   rD   rE   Útest_io_surface{   sL    ÿÿÿÿ

ÿÿ

    ÿrk   c                  C   sl   t  tdddd¡} t  tdddd¡}t| ƒ}t|ƒd }t|ƒt|ƒksLt‚t |dk|dk¡ 	¡ sht‚dS )	zTest reading curvature data.r'   r*   rc   zlh.curvzlh.inflatedr   rO   N)
r4   r5   rh   r   r   r;   r:   rQ   Ú
logical_orÚall)Z
fname_curvZ
fname_surfZbin_curvr2   rD   rD   rE   Útest_read_curv    s    ÿrn   c               	   C   s  t  d¡ t dddgdddgdd	d
gdddgg¡} t dddgdddgdddgdddgg¡}dD ]2}t| ||ƒ\}}|d sŒt|ƒ|ksbndsbt‚qbt jtdd�� t| |t|ƒd ƒ W 5 Q R X d}t dddgdddgdddgdd|gg¡}t  tt| ||¡ dS )z#Test triangular surface decimation.Úpyvistagæ9dûw|¿g¢¤Ïý‹º¿g@pðà‚Çš?gcÄ‘I>}¿gL5qz0Œº¿gÿÃ†<¼Æš?gˆªë’i|¿gJ‰Ñ1ïŠº¿g‡óxs�š?gÉñ\B²>}¿g3 Ð8?‹º¿g©ÄÐEžš?r   rO   rY   rN   )é   rN   rY   zexceeds number of original©Úmatché   N)	rJ   ÚimportorskiprQ   Úarrayr   r;   r:   rK   Ú
ValueError)ZpointsÚtrisÚn_triÚ_Z	this_trisZnirvanarD   rD   rE   Útest_decimate_surface_vtk¬   s    
ý* *rz   Zmris_spherec               
   C   s–   t dƒ\} }t| ƒdkst‚t|ƒdks,t‚dD ]`\}}tƒ �}t| ||ddd�\}}W 5 Q R X | ¡ }d|kstt‚||ks€t‚t|ƒ|ks0t‚q0d	S )
zTest sphere mode of decimation.rN   éB   é€   ))Zicor]   )Úocté    ZsphereT)r^   r1   Z
FreesurferN)r   r;   r:   r    r   r9   )r2   rw   Úkindrx   rC   ry   Ztris_newrD   rD   rE   Útest_decimate_surface_sphere¾   s         ÿr€   z+dig_kinds, exclude, count, bounds, outliers)ÚautoFéH   ©çü©ñÒMbP?çü©ñÒMb`?r   )©ZeegÚextraZcardinalZhpiFé’   )r…   gú~j¼t“h?rO   )r†   Té‹   rƒ   r   c                 C   sn   t tƒ}t|tdt| |d�}|j|fks,t‚|d t |¡  k rN|d k sTn t‚t 	|dk¡|ksjt‚dS )z*Test the trans obtained by coregistration.r(   )Ú	dig_kindsZexclude_frontalr   rO   g¸…ëQ¸ž?N)
r   r=   r	   r>   rG   Úshaper:   rQ   Úmeanr`   )rŠ   ÚexcludeÚcountZboundsZoutliersr@   ÚdistsrD   rD   rE   Útest_dig_mri_distancesÎ   s    
 ÿ(r�   c                  C   s2   t  d¡} | D ]}t|ƒ}t|d |dd� qdS )zTest _normal_orth.rN   rY   gê-�™—q=)ÚatolN)rQ   Úeyer   r   )Znnsr3   ZorirD   rD   rE   Útest_normal_orthÞ   s    
r“   r\   z>i4Úvalue)rO   é   Úsmooth)r   gÍÌÌÌÌÌì?c           	   	   C   sÎ  t  d¡ tjd| d�}||dd…dd…dd…f< |g}t|||d�}t|ƒdksVt‚|d \}}|rjd	nd
}t|jdd�dddg|d� t|jdd�dddgƒ d|dd…dd…dd…f< t|||dd�d \}}tj	j
|t dddg¡ dd� ¡ dk�st‚t jtdd�� t|dgƒ W 5 Q R X t jtdd�� t|dggƒ W 5 Q R X t jtdd�� t|dgƒ W 5 Q R X t jtdd�� t|dgdd� W 5 Q R X t jtdd�� t|d dgƒ W 5 Q R X dS )z*Test creating surfaces via marching cubes.ro   )é2   r—   r—   r[   r]   é   )r–   rO   r   g{®Gáz„?g•Ö&è.>rZ   il9  ©ÚrtoliŠ‹ i¡� i|Y é   é   rY   )r–   Zfill_hole_sizeé   rp   z1D array-likerq   Úfooç      ð?zmust be between 0z3D dataN)rJ   rt   rQ   Úzerosr   r;   r:   r   r`   ÚlinalgÚnormru   ÚminrK   rL   rv   )	r\   r”   r–   r-   ÚlevelÚoutZvertsZ	trianglesrš   rD   rD   rE   Útest_marching_cubesç   s6    
ÿÿ.r¦   c               	   C   s@  t  dddgdddgddd	gg¡} ttd
ddg| d ƒƒ}t|dd�}t|dtddd�\}}|dgdgdgdœksvt‚d|ks‚t‚d|ksŽt‚t j 	|d d¡ t j 	|d d¡ t
jtdd�� t|dtdd� W 5 Q R X t|dd�}t
jtdd�� t|dtdd� W 5 Q R X t
jtdd�� t|dtd d!� W 5 Q R X d"S )#z7Test finding ROI labels near montage channel locations.ç|û)Dvh!ÀçtT Ü×ÿ1@ç‘çÀ“’—$@çH Vf,Àç·6}%³3@ç�Æ™%(@çËUâð5Àç„Ùã	­û5@çÏUÊ�_ƒ*@Ú1Ú2Ú3éè  r+   )Úcoord_framer(   ÚasegrO   )rµ   ÚdistÚUnknownzLeft-Cerebral-Cortex)r°   r±   r²   )gº¹¹¹¹¹é?gÏ?g”“““““Ó?rŸ   )ç        r¸   r¸   rŸ   z%`aseg` file path must end with "aseg"rq   rž   )rµ   rH   úCoordinate frame not supportedzbetween 0 and 10é   )r¶   N)rQ   ru   Údictra   r   r
   rG   r:   r   Zassert_almost_equalrJ   rK   ÚRuntimeErrorrv   )Ú	ch_coordsÚch_posÚmontageÚlabelsÚcolorsZfail_montagerD   rD   rE   Útest_get_montage_volume_labels
  sT    þ    ÿ

ÿþ ÿÿÿ   ÿrÂ   c                  C   s¸   t  t jt  ddd¡gd Ž ¡} dt jj| dd� }tdd„ t  t  |d	k¡¡jD ƒƒ}t	t  d
ddg¡t  |j
d ¡d d  |d	dd�}| |¡tƒ ks t‚| |¡tƒ ks´t‚dS )z;Test finding points above a threshold near a seed location.éÿÿÿÿrO   ée   rN   r   rZ   c                 S   s   g | ]}t |ƒ‘qS rD   )Útuple)Ú.0ZcoordrD   rD   rE   Ú
<listcomp>0  s     z(test_voxel_neighbors.<locals>.<listcomp>gffffffî?g333333Ó¿g333333ã?g      à?rY   F)ÚthreshZuse_relativeN)rQ   ru   ZmeshgridZlinspacer¡   r¢   ÚsetÚwhereÚTr   r‹   Ú
differencer:   )ÚlocsÚimageZtrue_volumeÚvolumerD   rD   rE   Útest_voxel_neighbors,  s     ÿ&  þrÐ   c                
   C   sp  ddl } |  t tddd¡¡}|  t tddd¡¡}tdddd�}t|||d	d	d	gdd
�\}}t dddgdddgdddgg¡}tt	dddg|d ƒƒ}t
dtƒ\}}	}
t||d |	d |
d dd�}t |j¡}ttj |j ¡ ¡|ƒ}| ¡  t¡D ]J\}}}d||d |d …|d |d …|d |d …f< d||||f< qø|  ||j¡}t dddgdddgdddgg¡}tt	dddg|d ƒƒ}t
dtƒ\}}	}
t||d |	d |
d dd�}t||||dtdd�\}}}t dd d!gd"d#d$gd%d&d'gg¡}t|jƒD ],\}}tj |d ||  ¡d(k �st‚�qttdt|ƒd ƒƒD ]X\}}t t t |j ¡|k¡¡j!}| ¡ | |k�s‚t‚| ¡ | d) |k�sFt‚�qFt d*d+d,gd-d.d/gd0d1d2gg¡}tt|j"ƒƒD ]H}tj t t t |j ¡|d k¡¡j#dd3�||  ¡d4k �sÐt‚�qÐt$j%t&d5d6�� t||||dd7d8� W 5 Q R X t$j%t&d9d6�� t||||d:td;� W 5 Q R X |  ||j¡}t$j%t'd<d6�� t||||dtd=� W 5 Q R X | (¡ }|jD ]}d>|d?< �qÀt$j%t'd@d6�� t||||dtd=� W 5 Q R X | (¡ }| )t	dAdBdCg|d ƒ¡ t||d |	d |
d dd�}t$j*t+dDd6�� t|||ddtd=� W 5 Q R X dS )EzBTest warping an montage based on intracranial electrode positions.r   Nr(   r+   z	brain.mgzr*   é
   )ÚtranslationZrigidZsdrrN   )ÚzoomsZniterZpipeliner§   r¨   r©   rª   r«   r¬   r­   r®   r¯   r°   r±   r²   r³   Úr)ÚlpaÚnasionÚrpar´   rX   rO   rY   g®Gáz®ï?)Úsubjects_dir_fromrÈ   g;ßO�—n‚¿g�gª/dØU¿gL7‰A`å ¿g(:ÜXš�¿g=�n7ÚT?gÜ!¤2 ¿gºI+‡–¿g®â…[Ûgg?gX9´Èv¾Ÿ¿g¸…ëQ¸Ž?rs   g—÷Ýó`@g.K�Z?d@gà’±¨õ^@gƒõâ8Žãa@ghŽ´mÛöc@gD¤èyžg_@g�²ç:FÑb@g|èHO-Ìc@gMkp®cÔ_@rZ   é   z `thresh` must be between 0 and 1rq   g      &@)rÈ   zsubject folder is incorrectrž   )Zsubject_fromrØ   znot aligned to Freesurfer)rØ   éc   r´   r¹   Ú4Ú5Ú6znot assigned),ZnibabelÚloadr4   r5   rG   r»   r   rQ   ru   ra   r   r   r    r‹   r   r¡   ÚinvÚheaderZget_vox2ras_tkrÚroundZastypeÚintZNifti1ImageZaffiner   Ú	enumerateÚdigr¢   r:   Úranger;   rÊ   ZdataobjrË   Zch_namesrŒ   rJ   rK   rv   r¼   r8   ÚupdateZwarnsÚRuntimeWarning) ZnibZsubject_brainZtemplate_brainrÓ   Z
reg_affineZ	sdr_morphr½   r¾   rÕ   rÖ   r×   r¿   ZCT_dataZch_coords_voxrS   rT   rU   ZCTZmontage_warpedZ
image_fromZimage_toZground_truth_warpedÚiÚdÚidxÚcontactZvoxelsZground_truth_warped_voxelsZCT_unalignedZbad_montageZch_pos_doubledZdoubled_montagerD   rD   rE   Útest_warp_montage_volume9  s   ÿÿ  ý
þ ÿ ÿ2þ ÿ     þþÿÿþÿ ÿÿÿþ     ÿ    þ þ
 þ   þ  ÿrì   Úret_nn)FTr^   )ZaccurateZnearestc           
      C   s0  t j d¡jdd�}|dt jj|dd�dd…df  9 }tdƒ}t|d	 ƒd
ksTt‚t	t jj|d	 dd�ddd� t
||d|| d�^}}}|d }t	t jj|dd�ddd� |r¾t|ƒdksÆndsÆt‚td|ƒD ]Z\}}t	t jj|dd�dd|› d| › �d� t j|| dd�}	t	|	dd|› d| › �d� qÐdS )z&Test _project_onto_surface (gh-10930).r   )rÑ   rN   )ÚsizerY   rO   rZ   NrN   r2   i‚  rŸ   r„   r™   T)Zproject_rrsZ	return_nnr^   g       @gñhãˆµøä>)r2   r3   gš™™™™™©?z not unit vectors for )r‘   Úerr_msgz# not in same direction as locs for )rQ   ÚrandomZdefault_rngÚnormalr¡   r¢   r   r;   r:   r   r   ra   r`   )
r^   rí   rÍ   rc   ÚweightsZtri_idxr¥   r   ÚcompÚcosrD   rD   rE   Útest_project_onto_surface�  s:    $    ÿ  þ  þrõ   )SÚos.pathÚpathr4   rJ   ÚnumpyrQ   Znumpy.testingr   r   r   Zmner   r   r   r   r	   r
   Zmne.channelsr   Z	mne.coregr   Zmne.datasetsr   Zmne.ior   Zmne.io.constantsr   Zmne.surfacer   r   r   r   r   r   r   r   r   r   r   r   r   Zmne.transformsr   r   r   Z	mne.utilsr    r!   r"   r#   r$   r%   rh   r5   rG   rj   r>   r=   Zfname_t1rð   ZRandomStaterP   rF   Zrequires_testing_datarM   rW   rb   rk   rn   rz   r€   ÚmarkZparametrizer�   r“   Zfloat64Zuint16r¦   rÂ   rÐ   Zslowtestrì   rõ   rD   rD   rD   rE   Ú<module>   sx    < 
ÿ
ÿ!
	
$

ý
	  `