U
    f»{jÜ—  ã                	   @   sP  d dl mZ d dlmZ d dlZd dlZd dlZd dl	m
Z
mZmZmZ d dlmZ d dl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 d dlm Z  d dl!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-m.Z.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 ej5dd�Z5e 6e5d¡Z7e 6e5dddd¡Z8e 6e5dddd¡Z9e 6e7ddd¡Z:e 6e7ddd¡Z;e 6e5dddd¡Z<e 6e5dddd¡Z=e 6e5dddd¡Z>e 6e5dddd¡Z?e 6e7ddd¡Z@e 6e7ddd¡ZAe 6e5dddd¡ZBe 6e5ddd ¡ZCe 6e5ddd!¡ZDe 6e EeF¡d"d#d$d%¡ZGe 6eGd&¡ZHe 6eGd'¡ZIejJ Kd ¡ZLejMejN Od(d)d*d+g¡d,d-„ ƒƒZPd`d/d0„ZQd1d2„ ZRejMd3d4„ ƒZSejNjTejMd5d6„ ƒƒZUejMe%d7d8„ ƒƒZVe"ƒ ejNjTejMd9d:„ ƒƒƒZWejMe%d;d<„ ƒƒZXejN Yd=¡ejNjTejMd>d?„ ƒƒƒZZd@dA„ Z[ejNjTejMdBdC„ ƒƒZ\ejMe%ejNjTejN Yd=¡ejN OdDdEdFg¡dGdH„ ƒƒƒƒƒZ]ejMdIdJ„ ƒZ^ejNjTejMdKdL„ ƒƒZ_ejMe"ƒ ejN OdMdN¡dOdP„ ƒƒƒZ`ejMe"ƒ dQdR„ ƒƒZaejN Yd=¡ejNjTejMe"ƒ dSdT„ ƒƒƒƒZbejMe"ƒ dUdV„ ƒƒZcejMdWdX„ ƒZdejN Yd=¡ejNjTejMdYdZ„ ƒƒƒZeejMejN Od[e@dEd\feBdEd]fe;d d fg¡d^d_„ ƒƒZfdS )aé    N)Úcopytree)Úassert_array_equalÚassert_allcloseÚassert_equalÚassert_array_less)Útesting)Úread_source_spacesÚwrite_source_spacesÚsetup_source_spaceÚsetup_volume_source_spaceÚadd_source_space_distancesÚread_bem_surfacesÚmorph_source_spacesÚSourceEstimateÚmake_sphere_modelÚcompute_source_morphÚ
pick_typesÚread_bem_solutionÚread_freesurfer_lutÚ
read_trans)Ú_get_img_fdata)Úrequires_nibabelÚrun_subprocessÚ_record_warningsÚrequires_mneÚcheck_version)Ú_accumulate_normalsÚ_triangle_neighbors)Ú_get_src_type)Úget_volume_labels_from_srcÚ_compare_source_spacesÚget_decimated_surfacesÚcompute_distance_to_sensors)Ú_picks_to_idx)ÚFIFFF)ÚdownloadÚsubjectsÚsampleÚmriúT1.mgzúaseg.mgzÚbemzsample-oct-6-src.fifzsample-volume-7mm-src.fifzsample-1280-bem.fifzsample-1280-bem-sol.fifzsample-1280-1280-1280-bem.fifz!sample-1280-1280-1280-bem-sol.fifÚ	fsaverageúfsaverage-ico-5-src.fifzsample-fsaverage-ico-5-src.fifzsample-oct-4-src.fifZMEGz)sample_audvis_trunc-meg-eeg-oct-4-fwd.fifzsample_audvis_trunc-trans.fifz..ÚioZtestsÚdatazsmall-src.fif.gzztest-ave.fifzpicks, limits)Zmeg)g{®Gáz”?ç      Ð?)N©g{®Gáz„?r0   )Úeegr1   c              	   C   sª  t tƒ}t t¡}|d }ttƒ}t| tƒr`t	ƒ }d|| < | dkrJd|d< t
|f|ddi—Ž}n| }tt||ddd	�ƒ}|d
 d d |d d< |d
 d d |d d< |d
 d d |d d< |d
 d d |d d< |d d |d d  }	t||||d�}
|
j|	|fk�st‚|d d |
 ¡ k�s.t‚t|d |
ƒ t|
|d ƒ t|d
 ||dd�}t|
|dd� | dk�r¦d|d< tjtdd�� t||||ƒ W 5 Q R X dS )z;Test computation of distances between vertices and sensors.ÚinfoTr2   NZ
dev_head_tÚexclude© r/   )r4   Úsrcr   Úinuseé   Únuse)r3   ÚpicksÚtransé   )r6   r3   r:   r;   çñhãˆµøä>)ÚrtolzTransform between meg<->head©Úmatch)r   Ú	fname_srcÚmneZread_forward_solutionÚ	fname_fwdr   Útrans_fnameÚ
isinstanceÚstrÚdictr   Úlenr#   r"   ÚshapeÚAssertionErrorÚminr   r   ÚpytestÚraisesÚ
ValueError)r:   Zlimitsr6   Zfwdr3   r;   ÚkwargsZ	use_picksZn_picksZn_vertsZdepthsZdepths2r5   r5   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_source_space.pyÚ test_compute_distance_to_sensorsB   sF    

ÿ
 ÿ
ÿrQ   Tc                 C   s2   t tƒ}| r.|D ]}d |d< d |d< d |d< q|S )NÚnearestÚnearest_distÚpinfo)r   Úfname_small)Úremover6   Úsr5   r5   rP   Ú_read_small_srcw   s    
rX   c              
   C   sN  t dd�}t ƒ }t|dd� tdd„ |D ƒƒs2t‚tdd„ |D ƒƒsHt‚tdd„ |D ƒƒs^t‚|  ¡ �8}| tjd	d
¡ tj	t
dd�� t|ƒ W 5 Q R X W 5 Q R X t||dƒ t ƒ }|  ¡ �:}| tdd¡ tjtdd�� t|dd� W 5 Q R X W 5 Q R X tddƒ�rJ| ¡ }|D ]}dD ]}d||< �q�qt|dd� t||dƒ dS )z'Test adding patch info to source space.F)rV   r=   ©Ú
dist_limitc                 s   s   | ]}|d  dkV  qdS )rR   Nr5   ©Ú.0rW   r5   r5   rP   Ú	<genexpr>‰   s     z&test_add_patch_info.<locals>.<genexpr>c                 s   s   | ]}|d  dkV  qdS )rS   Nr5   r[   r5   r5   rP   r]   Š   s     c                 s   s   | ]}|d  dkV  qdS )rT   Nr5   r[   r5   r5   rP   r]   ‹   s     Z_DIST_WARN_LIMITr8   zComputing distances for 258r?   ÚapproxÚ__version__z1.0zrequired to calculate patch r   Úscipyz1.3)ÚdistrZ   N)rX   r   ÚallrJ   ÚcontextÚsetattrrB   Zsource_spacerL   ÚwarnsÚRuntimeWarningr    r`   rM   ÚRuntimeErrorr   Úcopy)Úmonkeypatchr6   Úsrc_newÚmZ
src_nodistrW   Úkeyr5   r5   rP   Útest_add_patch_info�   s.    


 rm   c           
      C   sn  t tƒ}t tƒ}|d d= |d d= d}|d d d|…  ¡ |d d< |d d d|…  ¡ |d d< | d }t|dd	� t||ƒ t |ƒ}t||ƒD ]Ð\}}t|d
 t dgtj	¡ƒ t|d
 t dgtj	¡ƒ |d }|d }d|j
|j
dk< | ¡  t |j
dk ¡dk�st‚|| d|d |d  … dd…d|d |d  …f }	tt |	j
¡|	j
ddd� q˜dS )z8Test adding distances to source space with a dist_limit.r   ra   r8   éÈ   ÚvertnoNútemp-src.fifçyé&1¬|?rY   rZ   çyé&1¬|¿i�  ç�íµ ÷Æ°>©r>   Úatol)r   Úfnamerh   r   r	   Úzipr   ÚnpÚarrayÚfloat32r/   Úeliminate_zerosÚsumrJ   r   Ú
zeros_like)
Útmp_pathr6   rj   Ún_doÚout_nameÚsoÚsnÚdoÚdnÚdr5   r5   rP   Ú'test_add_source_space_distances_limited¥   s*    

  
8r†   c              	   C   sÊ  t tƒ}t tƒ}|d d= |d d= d}|d d d|…  ¡ |d d< |d d d|…  ¡ |d d< | d }d}|| dks„t‚tjtd	d
�� t|dd� W 5 Q R X t||d� t||ƒ t |ƒ}t	||ƒD ]ò\}}|d d|… }t
|d t dgtj¡ƒ t
|d t tjgtj¡ƒ |d }	|d }
tƒ }|	|
fD ]<}d|j|jdk< || dd…|f }| ¡  | |¡ �q>t |d jdk ¡dk�sšt‚|d |d  }tt |j¡|jddd� qÒdS )z&Test adding distances to source space.r   ra   r8   é   ro   Nrp   é   znon-negativer?   éÿÿÿÿrY   )Ún_jobsrZ   rr   rq   é
   g•Ö&è.>rt   )r   rv   rh   rJ   rL   rM   rN   r   r	   rw   r   rx   ry   rz   ÚinfÚlistr/   r{   Úappendr|   r   r}   )r~   r6   rj   r   r€   rŠ   r�   r‚   Úvrƒ   r„   Zdsr…   r5   r5   rP   Útest_add_source_space_distancesÆ   s<    

  
r�   c           	   	   C   sð  t tƒ}|d d }| d }| d }t t|ƒtj|d d | |d d | f ¡ tddd	|d
|gƒ t |ƒ}t|d d | |d d | d�}t|d�}|j	dks®t
‚t||dd� t|d d | |d d ddd� t|d d | |d d ddd� t||dd� t |ƒ}t||ƒ tjtdd�� td|td� W 5 Q R X t|ƒ d¡d t|ƒ d¡d k�svt
‚dt|ƒk�sˆt
‚|j	dk�s˜t
‚t|dƒdk�s¬t
‚tjtdd��, ttddtdƒggdddggd�d� W 5 Q R X dS )z=Test setting up (and reading/writing) discrete source spaces.r   ro   rp   ztemp-pos.txtÚrrÚnnÚmne_volume_source_spacez--metersz--posú--src©r‘   r’   )ÚposÚdiscreter^   ©Úmodegü©ñÒMbP?rs   rt   T©Ú	overwritezCannot create interpolationr?   r'   )r–   r(   ú~z kBNZfiniterŒ   r8   )r   rv   rx   ZsavetxtrF   Úc_r   rG   r   ÚkindrJ   r    r   r	   rL   rM   rN   Ú	fname_mriÚreprÚsplitr   rg   Úfloat)	r~   r6   r�   Ú	temp_nameZtemp_posZsrc_cZpos_dictrj   Zsrc_c2r5   r5   rP   Útest_discrete_source_spaceò   sJ    2   ÿ$
 ÿ ÿ
*ÿr¤   c           
   	   C   s&  t tƒ}| d }tttjd�}|d  d9  < ttƒ}ttƒ}t	|tt
|tdfddddd|fƒD ]Z\}}tdd||td�}t||d	d
� d|d d< t||dd� ~t |ƒ}t||dd� q`tjtdd�� tddttd� W 5 Q R X tj|d d d< tjtdd�� td|ttd� W 5 Q R X |d dd… |d< tjtdd�� td|ttd� W 5 Q R X ~t|ƒt|ƒk�sxt‚dt|ƒk�sŠt‚|jdk�sšt‚tddddd�}	td d!d"�}td |	d"�}t||d#d� tjtd$d�� tdd%� W 5 Q R X tdd&�}	tjtd'd�� t|	d%� W 5 Q R X dS )(z%Test setting up volume source spaces.rp   )Zs_idr‘   g     @�@Nr'   ç      @)r–   r+   ÚsurfaceÚsubjects_dirTrš   r   Úsubject_his_idr^   r˜   zsurface file.*not existr?   Úfoo)r¦   r(   r§   Zsurfsr‰   Úcoord_framez"BEM is not in MRI coord.* got head)r+   r(   r§   z"Could not get inner skul.*from BEMz MBÚvolume)ç        r¬   r¬   gš™™™™™¹?)gÍÌÌÌÌÌì?ç      ð?)g…ëQ¸Õ?r­   )Zr0Úhead_radiusZrelative_radiiZsigmasr‹   ©r¬   r¬   r¬   g
×£p=
·?)r–   ÚsphereÚexactzsphere, if str)r°   )r®   z!be spherical with multiple layers)r   Ú	fname_volr   Ú	fname_bemr$   ZFIFFV_BEM_SURF_ID_BRAINr   Úfname_bem_3_solÚfname_bem_solrw   Úfname_bem_3r   r§   r	   r    rL   rM   ÚIOErrorrŸ   ZFIFFV_COORD_HEADrN   r    rJ   rž   r   )
r~   r6   r£   ZsurfZbem_solr+   Zthis_bemZ	this_surfrj   r°   r5   r5   rP   Útest_volume_source_space  s|    þ   þ   ÿ   ÿ   ÿ ÿ
r¸   c              	   C   sˆ  | d }t dddd|dtgƒ t|ƒ}d}tdd	tt|d
�}t|d d ƒdksTt‚t|ƒdksdt‚t|ƒdkstt‚t |d d |d d ¡}d|d d |d d |  < |d d  	¡ dksÆt‚|d d | |d d< t|d d ƒdksöt‚t|d d ƒ|d d< |d d dk�s$t‚t
||dd� dt|ƒk�sDt‚~~tjttdd	ddgttd� t dddd|gƒ t tt|¡ dS )z+Test setting up other volume source spaces.rp   r“   z--gridz7.0r”   z--mrir¯   Nr¥   )r–   r(   r§   r°   r   ro   iI  r8   r7   r9   r^   r˜   zvolume, shaper'   r­   )r–   r°   r(   r§   )r   rŸ   r   r   r§   rH   rJ   rx   Zin1dr|   r    r    rL   rM   rN   )r~   r£   r6   r°   rj   Z	good_maskr5   r5   rP   Útest_other_volume_source_spacesR  sR       ýþ þ  þr¹   é<   c                  C   sÒ   t tƒd } dd„ t| d ƒD ƒ| d< t| d ƒD ]R}| d | }| d |d   |¡ | d |d   |¡ | d |d	   |¡ q2d
d„ | d D ƒ| d< t| d | d ƒ}tdd„ t|| d ƒD ƒƒsÎt‚dS )z9Test efficient vertex neighboring triangles for surfaces.r   c                 S   s   g | ]
}t ƒ ‘qS r5   )r�   )r\   Ú_r5   r5   rP   Ú
<listcomp>†  s     z+test_triangle_neighbors.<locals>.<listcomp>rx   Úneighbor_triÚntriÚtrisr8   rˆ   c                 S   s   g | ]}t  |t¡‘qS r5   )rx   ry   Úint)r\   Únbr5   r5   rP   r¼   Œ  s     c                 s   s   | ]\}}t  ||¡V  qd S )N)rx   Zarray_equal)r\   Znt1Znt2r5   r5   rP   r]   �  s   ÿz*test_triangle_neighbors.<locals>.<genexpr>N)r   rv   ÚrangerŽ   r   rb   rw   rJ   )ÚthisÚpÚvertsr½   r5   r5   rP   Útest_triangle_neighbors€  s    ÿrÆ   c                  C   sî   t dƒ} t dƒ}t |d¡| d   t ¡}tj||d |d f }t |d¡}t|| ||d�}t |d df¡|d< t|d	 ƒD ]<}|d
 | }|d |dd…f  |d |dd…f 7  < q€t	|d
 |d |d ƒ}t
||d ddd� dS )z0Test efficient normal accumulation for surfaces.g     ˆAg     ˆAr8   rˆ   é   )r¿   rx   r¾   Útri_nnrx   r’   r¾   r¿   NrÈ   gH¯¼šò×z>rt   )rÀ   ÚrngZrandÚastyperx   r�   rG   ÚzerosrÂ   r   r   )Zn_ptsZn_trisr¿   rÈ   rÃ   rÄ   rÅ   r’   r5   r5   rP   Útest_accumulate_normals“  s    .rÌ   c              
   C   sŠ  t  tdddd¡}dD ].}tjtdd�� td|d	td
� W 5 Q R X qdD ].}tjtdd�� td|d	td
� W 5 Q R X qJtjtdd�� tddd	td
� W 5 Q R X tjtdd�� tddd	td
� W 5 Q R X tjtdd�� tddd	td
� W 5 Q R X t|ƒ}t	ƒ � tddtd	d�}W 5 Q R X t
||dd� t|ƒ d¡d t|ƒ d¡d k�sZt‚t|ƒ d¡dk�srt‚t|d d t d¡ƒ t|d d t d¡ƒ ttƒ}| d }t	ƒ �$ tddtd	d�}t||dd � W 5 Q R X t|d d! d"ƒ t
||dd	d#� t|ƒ}t
||dd	d#� tdd$td	d�}|d d! t|d d% ƒk�sNt‚|d d! t|d d% ƒk�spt‚tjttdd&td	d� d'S )(z0Test setting up ico, oct, and all source spaces.r&   r,   r+   r-   )ÚoctZoct6ezsubdivision must be an integerr?   r'   F)ÚspacingÚadd_distr§   )Zoct0zoct-4zoct subdivision must be >= 1zico subdivision must be >= 0zico-4zmust be a string with valuesZ7emmZallsZico5)rÎ   r§   rÏ   r^   r˜   rœ   r   z	surface (rˆ   ro   é(  r8   rp   Zoct6Trš   r9   i  ©r™   rR   rb   r‘   Zico6N)ÚopÚjoinÚ	data_pathrL   rM   rN   r
   r§   r   r   r    r    r¡   rJ   Úcountr   rx   Úarangerv   r	   r   rH   rg   )r~   Z	fname_icorÎ   r6   rj   r£   r5   r5   rP   Útest_setup_source_space¬  s€    ÿ ÿ ÿ ÿ ÿ ÿ ÿ* ÿ ÿ""
  ÿr×   rÎ   rˆ   é   c              	   C   sÚ   t t td¡| d ƒ |dkr"g n
dt|ƒg}| dt| ƒ¡ | dd¡ tdg| ƒ t| d d d|  ƒ}td|d	d
�}t	||ddd� t
jtdd�� tddƒ W 5 Q R X t
jtdd�� tddƒ W 5 Q R X dS )z<Test setting up surface source spaces using a given spacing.r'   rØ   z	--spacingZSUBJECTS_DIRZSUBJECTZmne_setup_source_spacer+   zsample-%d-src.fifF)rÎ   rÏ   r^   TrÑ   zspacing must be.*got.*float.*r?   r¥   zspacing must be >= 2, got 1r8   N)r   rÒ   rÓ   r§   rF   Zsetenvr   r   r
   r    rL   rM   Ú	TypeErrorrN   )r~   rÎ   ri   Úargsr6   rj   r5   r5   rP   Útest_setup_source_space_spacingç  s    ÿrÛ   c                  C   s   t tdd�} | d d }| d d }| d d }| d d }| d d }| d d }| ¡ dksdt‚| ¡ |jd d ks~t‚| ¡ dksŽt‚| ¡ |jd d ks¨t‚| ¡ dks¸t‚| ¡ |jd d ksÒt‚| ¡ dksât‚| ¡ |jd d ksüt‚dS )	z$Test reading of source space meshes.T©Zpatch_statsr   r‘   r¿   Zuse_trisr8   N)r   rv   rK   rJ   ÚmaxrI   )r6   Z	lh_pointsZlh_facesZlh_use_facesZ	rh_pointsZrh_facesZrh_use_facesr5   r5   rP   Útest_read_source_spaces   s    rÞ   c              	   C   s†   t tdd�}| d }t||ƒ t |dd�}t||ƒ | d }tjtdd�� t||ƒ W 5 Q R X tjtdd�� t |ƒ W 5 Q R X dS )z*Test reading and writing of source spaces.FrÜ   ztmp-src.fifztest-bad-name.fif.gzz-src.fifr?   N)r   rv   r	   r    rL   re   rf   )r~   Zsrc0Z
temp_fnameZsrc1Zsrc_badnamer5   r5   rP   Útest_write_source_space  s    

rß   Úpass_ids)TFc              	   C   s  d}t ƒ \}}d}tƒ }tjtdd�� td|||td� W 5 Q R X tjtdd�� tdd|td	� W 5 Q R X |}tjtd
d�� tdd|td� W 5 Q R X |r®||| i}n|}td|dtd�}	t||	d d ƒ |	d d dksèt	‚| d }
t
|
|	ƒ t|
ƒ}t|	|dd� dS )z1Test generating a source space from volume label.r*   úLeft-Cerebellum-Cortexz!mri must be None if pos is a dictr?   r'   )r–   Úvolume_labelr(   r§   zMust use a \*aseg.mgz filer)   )r(   râ   r§   z"'Left-Cerebral' not found.*Did youzLeft-Cerebral)râ   r(   r§   F)râ   Úadd_interpolatorr§   r   Úseg_namer9   i”  rp   r^   r˜   N)r   rG   rL   rM   rN   r   r§   rg   r   rJ   r	   r   r    )r~   rà   Z
aseg_shortZ	atlas_idsr»   râ   r–   r(   Zuse_volume_labelr6   r€   Úsrc_from_filer5   r5   rP   Útest_source_space_from_label(  sT    
   þ  þ  þ  þ
ræ   c           
      C   s  | \}}}|  d¡}|  d¡}|| d dks2t‚|| d dksFt‚ttƒ}t|d d t t dd	„ |D ƒ¡¡ƒ t|ƒD ]"\}}t	|d d
 |d
 dd� q~t
jtdd��& t|d d ddt|ddtd�}	W 5 Q R X t|	ƒdksìt‚dt|	ƒksüt‚t|d d |	d d ƒ dS )z3Test that we produce exclusive and complete labels.zLeft-Cerebral-White-MatterzLeft-Cerebral-Cortexr9   ió  ih  r   ro   c                 S   s   g | ]}|d  ‘qS ©ro   r5   r[   r5   r5   rP   r¼   h  s     z8test_source_space_exclusive_complete.<locals>.<listcomp>r‘   rs   )ru   zFound no usable.*Left-vessel.*r?   r¨   r¥   r*   TF)r+   râ   Zsingle_volumerã   r§   r8   z(Unknown+Left-Cerebral-White-Matter+Left-N)ÚindexrJ   r   r²   r   rx   ÚsortÚconcatenateÚ	enumerater   rL   re   rf   r   r³   r§   rH   r    )
Zsrc_volume_labelsr6   Úvolume_labelsr»   ÚiiZjjZsrc_fullÚsirW   Z
src_singler5   r5   rP   Ú$test_source_space_exclusive_completeY  s2    


ÿ
     ýrï   c               	   C   s  dddg} t tƒ}tdtdt| td�}|jdks4t‚|jdksBt‚||7 }|jd	ksXt‚|jdksft‚|d
d… jdks|t‚|dd
… jdks’t‚|d
d
… jd	ks¨t‚tj	t
dd�� |d
d
d…  W 5 Q R X t|dtƒ}|d j}d| dd¡ }t||d d ƒ t|d d dƒ d
S )z/Test reading volumes from a mixed source space.zLeft-Amygdalaú
Brain-StemzRight-Amygdalar'   g      @)r(   r–   r+   râ   r§   r¦   r«   ÚmixedNrˆ   zInvalid source spacer?   r   zLeft-z-lhÚ rä   ÚtypeÚvol)r   rv   r   Ú
aseg_fnamer³   r§   rž   rJ   rL   rM   rg   r   ÚnameÚreplacer   )Z
labels_volr6   Zvol_srcZ
volume_srcrâ   r5   r5   rP   Útest_read_volume_from_srcv  s4    þü
rø   c              	   C   sš  ddl }tj d¡}ddg}tdddtd	�}tdt|d tdd
�}| ddd¡d }t 	|j
¡}d|dd…df< ||dœ}tdt|dd�}	|jdks˜t‚|jdks¦t‚|	jdks´t‚|| |	 }
|
jdksÎt‚|jdksÜt‚|jdksêt‚|	jdksøt‚t|
ƒdk�s
t‚| d }|
 |¡ t|ƒ}t|
|dd� t|
ƒ d¡d t|ƒ d¡d k�s\t‚t|
jdƒ t dd„ |
D ƒ¡}|tjk ¡ �s�t‚| d }tjtdd �� |j|dd!� W 5 Q R X |	 ¡ }d"|d d#< tjtd$d �� |
|  W 5 Q R X ~| d% }tjt|
j|dd!� |	 ¡ }d&|d d'< |
| }tjtd(d �� |j|dd!� W 5 Q R X | d) }d*D ]˜}|d+f|| d,f|	| d+ffD ]r\}
}|
j|d|d-d.� t| t|ƒ¡ƒ}|  t!¡ "¡ }t"d/d0„ |
D ƒƒ}|d-k�rä||7 }||k�s†t|
ƒ‚�q†�qd| d1 }| t¡}|j#}|dd2…dd2…f  d39  < | $|j%|¡}| |t|ƒ¡ t&jd|d4dtd5�}|| }
tj't(d6d �� |
j|d7d-d8� W 5 Q R X dS )9zTest combining source spaces.r   Nrˆ   rð   zRight-Hippocampusr'   Zoct3F)rÏ   r§   )r§   râ   r(   rã   é   )é   rÇ   g{®Gázt?r8   r‰   r•   Úerror)r§   r–   Úverboser¦   r«   r—   rñ   é   rp   r^   r˜   rœ   c                 S   s   g | ]}|d  ‘qS )rª   r5   r[   r5   r5   rP   r¼   Î  s     z.test_combine_source_spaces.<locals>.<listcomp>ztemp-image.mgzzat least one volumer?   )rü   Úkittyró   zInvalid valueztemp-image.pngr‹   rª   zmust be in head coordinateszimg.nii)FÚsparseTiÁ  iˆj  T)Zuse_lutÚmri_resolutionr›   c                 s   s   | ]}|d  V  qdS )r9   Nr5   r[   r5   r5   rP   r]   ÷  s     z-test_combine_source_spaces.<locals>.<genexpr>r*   rÇ   gffffffæ?rá   )r(   râ   rã   r§   z2 surf vertices lay outsiderÿ   )r   r›   ))Znibabelrx   ÚrandomÚRandomStater
   r§   r   rõ   ÚrandintrË   rI   rž   rJ   rH   Úsaver   r    r    r¡   r   ry   r$   ZFIFFV_COORD_MRIrb   rL   rM   rN   Zexport_volumerh   r   ÚloadrF   rÊ   Úboolr|   ZaffineZMGHImageZdataobjrB   re   rf   )r~   ZnibrÉ   rì   Zsrfrô   r‘   r’   r–   Zdiscr6   Zsrc_out_namerå   Zcoord_framesZimage_fnameZdisc2Zbad_image_fnameZdisc3Zsrc_mixed_coordZ	fname_imgr   ÚupZimg_dataZn_srcZn_wantZ	temp_asegZaseg_imgZaseg_affineZnew_asegZlh_cerebr5   r5   rP   Útest_combine_source_spacesž  s®    ÿ þ
 ÿ
*ÿ

þ  þ

   þr  c                  C   s0   t tƒ} t tƒ}t| dtd�}t||dd� dS )zTest morphing of source spaces.r'   ©r§   r^   r˜   N)r   Úfname_fsÚfname_morphr   r§   r    )r6   Ú	src_morphZsrc_morph_pyr5   r5   rP   Útest_morph_source_spaces  s    ÿr  c               	   C   s@  t  dd¡} d\}}ttƒ}t| dd„ |D ƒ||dƒ}tdd„ |D ƒƒ}t|d	td
�}tdd„ |D ƒƒ}||kstt‚t	|dd	dd„ |D ƒdtdd� 
|¡}|jjd |ks®t‚dd„ |jD ƒ}	tt |j|	d  |j|	d  g¡dd„ t|j|	ƒD ƒ||d	ƒ}|j|td
�}
tjtdd�� t	|d	|
jdtd�}W 5 Q R X tjtdd�� | 
|¡ W 5 Q R X tjtdd��  t	|d	|
jdtd� 
|¡}W 5 Q R X t|
j|jƒ tdƒD ]}t|
j| |j| ƒ �q¨t |
jdd…df |jdd…df ¡d }|dk�st|ƒ‚| ¡ }|d d dd… \}}|d d | |d d |< |j|td
�}
tdƒD ]}t|
j| |j| ƒ �qVt |
jdd…df |jdd…df ¡d }|dk�s²t|ƒ‚d|_tjt|j|dtd� d	|_|d d= tjt|j|td
� d|d d< tjt|j|dtd� d	|d d< ttƒ}tjt |j|td
� dS ) z>Test returning a morphed source space to the original subject.iP  r8   )r   r­   c                 S   s   g | ]}|d  ‘qS rç   r5   r[   r5   r5   rP   r¼     s     z4test_morphed_source_space_return.<locals>.<listcomp>r,   c                 s   s   | ]}t |d  ƒV  qdS ©ro   N©rH   r[   r5   r5   rP   r]      s     z3test_morphed_source_space_return.<locals>.<genexpr>r'   r	  c                 s   s   | ]}t |d  ƒV  qdS r  r  r[   r5   r5   rP   r]   %  s     c                 S   s   g | ]}|d  ‘qS rç   r5   r[   r5   r5   rP   r¼   +  s     F)rÎ   Úsmoothr§   Úwarnr   c              
   S   s6   g | ].}t  t t  t|ƒ¡¡d t|ƒd … ¡‘qS )Nr‹   )rx   ré   rÉ   ZpermutationrÖ   rH   )r\   r�   r5   r5   rP   r¼   1  s   ÿc                 S   s   g | ]\}}|| ‘qS r5   r5   )r\   r�   Úkr5   r5   rP   r¼   6  s     zvertices not includedr?   )Úsubject_fromrÎ   r  r§   zvertices do not match)r6   r  rÎ   r  r§   rˆ   N)r   r8   g®Gáz®ï?ro   r‘   )Zsubject_origr§   r¨   r©   )!rÉ   Zrandnr   r
  r   r|   r   r§   rJ   r   Úapplyr/   rI   Zverticesrx   rê   Zlh_dataZrh_datarw   Zto_original_srcrL   re   rf   rM   rN   r   ÚsubjectrÂ   r   Zcorrcoefrh   rv   rg   )r/   ZtminZtstepZsrc_fsZstc_fsZ
n_verts_fsr  Zn_verts_sampleZ	stc_morphZkeepsZstc_morph_returnZmorphZstc_morph_morphrí   ZcorrZsrc_fs2Zvert1Zvert2r6   r5   r5   rP   Ú test_morphed_source_space_return  sä      ÿÿ    ýýÿÿ  ü ÿ  ý  ýý
ÿÿÿ ÿ
ÿÿÿ
  ÿ

 ÿ
  ÿ
 ÿr  z
src, n, nvrÐ   i  c                 C   st   t | ƒ}t|ƒ|kst‚|dkr$dS |D ]F}t|ƒddhks@t‚t|d ƒ|ksTt‚tt |d ¡t |¡ƒ q(dS )zTest get_decimated_surfaces.r   Nr‘   r¿   )r!   rH   rJ   Úsetr   rx   ÚuniquerÖ   )r6   ÚnÚnvZsurfacesrW   r5   r5   rP   Útest_get_decimated_surfacesy  s    r  )T)gÚos.pathÚpathrÒ   Úshutilr   rL   r`   Únumpyrx   Znumpy.testingr   r   r   r   Zmne.datasetsr   rB   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Z	mne.fixesr   Z	mne.utilsr   r   r   r   r   Zmne.surfacer   r   Zmne.source_estimater   Zmne.source_spacer   r    r!   r"   Zmne.io.pickr#   Zmne.io.constantsr$   rÔ   rÓ   r§   rŸ   rõ   rv   r²   r³   rµ   r¶   r´   r
  r  rA   rC   rD   ÚdirnameÚ__file__Úbase_dirrU   Z	fname_aver  r  rÉ   Zrequires_testing_dataÚmarkZparametrizerQ   rX   rm   r†   Zslowtestr�   r¤   r¸   r¹   ÚtimeoutrÆ   rÌ   r×   rÛ   rÞ   rß   ræ   rï   rø   r  r  r  r  r5   r5   r5   rP   Ú<module>   s  @
ÿÿÿÿÿ
ÿ    ÿ   ÿ
ÿý/

$
 *)2,
9

.
$k
	
a  ÿ